ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggODlmNDZkZi4uMTYwZTc1OCAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTU2MSw4ICs1NjEsMTIgQEAKIGlmZGVmIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRQogS0JVSUxEX0NGTEFHUwkrPSAtT3MgLWZuby1jYWxsZXItc2F2ZXMKIGVsc2UKK2lmZGVmIENPTkZJR19DT01DRVJUT19DQ19PUFRJTUlaRV9PMworS0JVSUxEX0NGTEFHUwkrPSAtTzMgLWZuby1yZW9yZGVyLWJsb2NrcyAtZm5vLXRyZWUtY2ggLWZuby1jYWxsZXItc2F2ZXMKK2Vsc2UKIEtCVUlMRF9DRkxBR1MJKz0gLU8yIC1mbm8tcmVvcmRlci1ibG9ja3MgLWZuby10cmVlLWNoIC1mbm8tY2FsbGVyLXNhdmVzCiBlbmRpZgorZW5kaWYKIAogaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gvJChTUkNBUkNIKS9NYWtlZmlsZQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9LY29uZmlnIGIvYXJjaC9hcm0vS2NvbmZpZwppbmRleCA5ODdjNzJkLi40NWQ2NWM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL0tjb25maWcKQEAgLTI2Niw2ICsyNjYsMTYgQEAKIAloZWxwCiAJICBTdXBwb3J0IGZvciBBUk0ncyBJbnRlZ3JhdG9yIHBsYXRmb3JtLgogCitjb25maWcgQVJDSF9DT01DRVJUTworCWJvb2wgIk1pbmRzcGVlZCBDb21jZXJ0byIKKwlzZWxlY3QgQVJDSF9TVVBQT1JUU19NU0kKKwlzZWxlY3QgTkVFRF9NQUNIX01FTU9SWV9ICisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIE1pbmRzcGVlZCdzIENvbWNlcnRvIGRldmVsb3BtZW50IGJvYXJkcy4KKwkgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIHlvdXIga2VybmVsIHRvIHJ1biBvbiBvbmUgb2YgdGhlc2UgYm9hcmRzCisJICB0aGVuIHlvdSBtdXN0IHNheSAnWScgaGVyZS4gT3RoZXJ3aXNlIHNheSAnTicgICAgCisKIGNvbmZpZyBBUkNIX1JFQUxWSUVXCiAJYm9vbCAiQVJNIEx0ZC4gUmVhbFZpZXcgZmFtaWx5IgogCXNlbGVjdCBBUk1fQU1CQQpAQCAtMTA5OSw2ICsxMTA5LDggQEAKIAogc291cmNlICJhcmNoL2FybS9tYWNoLXc5MHg5MDAvS2NvbmZpZyIKIAorc291cmNlICJhcmNoL2FybS9tYWNoLWNvbWNlcnRvL0tjb25maWciCisKICMgRGVmaW5pdGlvbnMgdG8gbWFrZSBsaWZlIGVhc2llcgogY29uZmlnIEFSQ0hfQUNPUk4KIAlib29sCkBAIC0xNDUxLDcgKzE0NjMsNyBAQAogCWRlcGVuZHMgb24gUkVBTFZJRVdfRUJfQVJNMTFNUCB8fCBSRUFMVklFV19FQl9BOU1QIHx8IFwKIAkJIE1BQ0hfUkVBTFZJRVdfUEIxMU1QIHx8IE1BQ0hfUkVBTFZJRVdfUEJYIHx8IEFSQ0hfT01BUDQgfHwgXAogCQkgQVJDSF9FWFlOT1M0IHx8IEFSQ0hfVEVHUkEgfHwgQVJDSF9VODUwMCB8fCBBUkNIX1ZFWFBSRVNTX0NBOVg0IHx8IFwKLQkJIEFSQ0hfTVNNX1NDT1JQSU9OTVAgfHwgQVJDSF9TSE1PQklMRSB8fCBBUkNIX0hJR0hCQU5LIHx8IFNPQ19JTVg2UQorCQkgQVJDSF9NU01fU0NPUlBJT05NUCB8fCBBUkNIX1NITU9CSUxFIHx8IEFSQ0hfSElHSEJBTksgfHwgU09DX0lNWDZRIHx8IEFSQ0hfQ09NQ0VSVE8KIAlkZXBlbmRzIG9uIE1NVQogCXNlbGVjdCBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUwogCXNlbGVjdCBIQVZFX0FSTV9TQ1UgaWYgIUFSQ0hfTVNNX1NDT1JQSU9OTVAKQEAgLTE1MTUsNiArMTUyNywxMSBAQAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEFSTSBzeXN0ZW0gY29oZXJlbmN5IHVuaXQKIAorY29uZmlnIFNDVV9TUEVDVUxBVElWRV9MSU5FX0ZJTExTCisJYm9vbCAiU0NVIHNwZWN1bGF0aXZlIGxpbmUgZmlsbHMiCisJZGVwZW5kcyBvbiBIQVZFX0FSTV9TQ1UgJiYgQ0FDSEVfUEwzMTAKKwlkZWZhdWx0IG4KKwogY29uZmlnIEhBVkVfQVJNX1RXRAogCWJvb2wKIAlkZXBlbmRzIG9uIFNNUApAQCAtMTUzMiwxMCArMTU0OSwxMiBAQAogCSAgb3B0aW9uIGFsb25lIQogCiAJY29uZmlnIFZNU1BMSVRfM0cKKwkJZGVwZW5kcyBvbiAhQ09NQ0VSVE9fSFdfS0VSTkVMX1BBR0VUQUJMRQogCQlib29sICIzRy8xRyB1c2VyL2tlcm5lbCBzcGxpdCIKIAljb25maWcgVk1TUExJVF8yRwogCQlib29sICIyRy8yRyB1c2VyL2tlcm5lbCBzcGxpdCIKIAljb25maWcgVk1TUExJVF8xRworCQlkZXBlbmRzIG9uICFDT01DRVJUT19IV19LRVJORUxfUEFHRVRBQkxFCiAJCWJvb2wgIjFHLzNHIHVzZXIva2VybmVsIHNwbGl0IgogZW5kY2hvaWNlCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggZGZjZjNiMC4uYzkzZDA2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDcgQEAKIAogIyBEbyBub3QgdXNlIGFyY2gvYXJtL2RlZmNvbmZpZyAtIGl0J3MgYWx3YXlzIG91dGRhdGVkLgogIyBTZWxlY3QgYSBwbGF0Zm9ybSB0aHQgaXMga2VwdCB1cC10by1kYXRlCi1LQlVJTERfREVGQ09ORklHIDo9IHZlcnNhdGlsZV9kZWZjb25maWcKK0tCVUlMRF9ERUZDT05GSUcgOj0gYzJrcnRzbV9kZWZjb25maWcKIAogIyBkZWZpbmVzIGZpbGVuYW1lIGV4dGVuc2lvbiBkZXBlbmRpbmcgbWVtb3J5IG1hbmFnZW1lbnQgdHlwZS4KIGlmZXEgKCQoQ09ORklHX01NVSksKQpAQCAtMTM4LDYgKzEzOCwxMCBAQAogbWFjaGluZS0kKENPTkZJR19BUkNIX0JDTVJJTkcpCQk6PSBiY21yaW5nCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfQ0xQUzcxMVgpCQk6PSBjbHBzNzExeAogbWFjaGluZS0kKENPTkZJR19BUkNIX0NOUzNYWFgpCQk6PSBjbnMzeHh4CittYWNoaW5lLSQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pICAgICAgICAgOj0gY29tY2VydG8KK2lmZXEgKCQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pLHkpCit0ZXh0b2ZzLSQoQ09ORklHX1pPTkVfRE1BKSA6PSAweDA0MDA4MDAwCitlbmRpZgogbWFjaGluZS0kKENPTkZJR19BUkNIX0RBVklOQ0kpCQk6PSBkYXZpbmNpCiBtYWNoaW5lLSQoQ09ORklHX0FSQ0hfRE9WRSkJCTo9IGRvdmUKIG1hY2hpbmUtJChDT05GSUdfQVJDSF9FQlNBMTEwKQkJOj0gZWJzYTExMApAQCAtMTk5LDYgKzIwMyw4IEBACiBtYWNoaW5lLSQoQ09ORklHX01BQ0hfU1BFQVI2MDApCQk6PSBzcGVhcjZ4eAogbWFjaGluZS0kKENPTkZJR19BUkNIX1pZTlEpCQk6PSB6eW5xCiAKKworCiAjIFBsYXRmb3JtIGRpcmVjdG9yeSBuYW1lLiAgVGhpcyBsaXN0IGlzIHNvcnRlZCBhbHBoYW51bWVyaWNhbGx5CiAjIGJ5IENPTkZJR18qIG1hY3JvIG5hbWUuCiBwbGF0LSQoQ09ORklHX0FSQ0hfTVhDKQkJOj0gbXhjCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggMjFmNTZmZi4uZGEwMTEzNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQpAQCAtMzMsNiArMzMsMTEgQEAKICMKICMgQXJjaGl0ZWN0dXJlIGRlcGVuZGVuY2llcwogIworCitpZmVxICgkKENPTkZJR19BUkNIX0NPTUNFUlRPKSx5KQorT0JKUwkJKz0gaGVhZC1jb21jZXJ0by5vCitlbmRpZgorCiBpZmVxICgkKENPTkZJR19BUkNIX0FDT1JOKSx5KQogT0JKUwkJKz0gbGxfY2hhcl93ci5vIGZvbnQubwogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLWNvbWNlcnRvLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1jb21jZXJ0by5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OGY2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC1jb21jZXJ0by5TCkBAIC0wLDAgKzEsNiBAQAorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKwkuc2VjdGlvbgkiLnN0YXJ0IiwgImF4IgorCWxkcglyNyxtYWNoX3R5cGUKKworbWFjaF90eXBlOiAgICAgLndvcmQgICAgTUFDSF9UWVBFX0NPTUNFUlRPCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZ2ljLmMgYi9hcmNoL2FybS9jb21tb24vZ2ljLmMKaW5kZXggNDEwYTU0Ni4uMzk5MzAyZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2dpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9naWMuYwpAQCAtNDMsMTEgKzQzLDEyIEBACiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgogCisjaW5jbHVkZSA8bWFjaC9zZW1hLmg+CisKIHN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGlycV9jb250cm9sbGVyX2xvY2spOwogCiAvKiBBZGRyZXNzIG9mIEdJQyAwIENQVSBpbnRlcmZhY2UgKi8KIHZvaWQgX19pb21lbSAqZ2ljX2NwdV9iYXNlX2FkZHIgX19yZWFkX21vc3RseTsKLQogLyoKICAqIFN1cHBvcnRlZCBhcmNoIHNwZWNpZmljIEdJQyBpcnEgZXh0ZW5zaW9uLgogICogRGVmYXVsdCBtYWtlIHRoZW0gTlVMTC4KQEAgLTkwLDMwICs5MSw0OCBAQAogc3RhdGljIHZvaWQgZ2ljX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAl1MzIgbWFzayA9IDEgPDwgKGdpY19pcnEoZCkgJSAzMik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgoZ2ljX2lycShkKSA9PSA4NykgfHwgKGdpY19pcnEoZCkgPT0gNjYpIHx8IChnaWNfaXJxKGQpID09IDMzKSkgeworCQlyZXR1cm47CisJfQogCiAJcmF3X3NwaW5fbG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisJZmxhZ3MgPSBtc3BfbG9ja19mcnFzYXZlKCk7CiAJd3JpdGVsX3JlbGF4ZWQobWFzaywgZ2ljX2Rpc3RfYmFzZShkKSArIEdJQ19ESVNUX0VOQUJMRV9DTEVBUiArIChnaWNfaXJxKGQpIC8gMzIpICogNCk7CiAJaWYgKGdpY19hcmNoX2V4dG4uaXJxX21hc2spCiAJCWdpY19hcmNoX2V4dG4uaXJxX21hc2soZCk7CisJbXNwX3VubG9ja19mcnFyZXN0b3JlKGZsYWdzKTsKIAlyYXdfc3Bpbl91bmxvY2soJmlycV9jb250cm9sbGVyX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBnaWNfdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJdTMyIG1hc2sgPSAxIDw8IChnaWNfaXJxKGQpICUgMzIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKGdpY19pcnEoZCkgPT0gODcpIHx8IChnaWNfaXJxKGQpID09IDY2KSB8fCAoZ2ljX2lycShkKSA9PSAzMykpIHsKKwkJcmV0dXJuOworCX0KIAogCXJhd19zcGluX2xvY2soJmlycV9jb250cm9sbGVyX2xvY2spOworCWZsYWdzID0gbXNwX2xvY2tfZnJxc2F2ZSgpOwogCWlmIChnaWNfYXJjaF9leHRuLmlycV91bm1hc2spCiAJCWdpY19hcmNoX2V4dG4uaXJxX3VubWFzayhkKTsKIAl3cml0ZWxfcmVsYXhlZChtYXNrLCBnaWNfZGlzdF9iYXNlKGQpICsgR0lDX0RJU1RfRU5BQkxFX1NFVCArIChnaWNfaXJxKGQpIC8gMzIpICogNCk7CisJbXNwX3VubG9ja19mcnFyZXN0b3JlKGZsYWdzKTsKIAlyYXdfc3Bpbl91bmxvY2soJmlycV9jb250cm9sbGVyX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBnaWNfZW9pX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJaWYgKGdpY19hcmNoX2V4dG4uaXJxX2VvaSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJCXJhd19zcGluX2xvY2soJmlycV9jb250cm9sbGVyX2xvY2spOworCQlmbGFncyA9IG1zcF9sb2NrX2ZycXNhdmUoKTsKIAkJZ2ljX2FyY2hfZXh0bi5pcnFfZW9pKGQpOworCQltc3BfdW5sb2NrX2ZycXJlc3RvcmUoZmxhZ3MpOwogCQlyYXdfc3Bpbl91bmxvY2soJmlycV9jb250cm9sbGVyX2xvY2spOwogCX0KIApAQCAtMzA4LDYgKzMyNywxNCBAQAogCWZvciAoaSA9IDMyOyBpIDwgZ2ljX2lycXM7IGkgKz0gMzIpCiAJCXdyaXRlbF9yZWxheGVkKDB4ZmZmZmZmZmYsIGJhc2UgKyBHSUNfRElTVF9FTkFCTEVfQ0xFQVIgKyBpICogNCAvIDMyKTsKIAorI2lmZGVmIENPTkZJR19DT01DRVJUT19NU1AKKwkvKgorCSAqIFNldCBTUEkgaW50ZXJydXB0cyBhcmUgbm9uU2VjdXJlCisJICovCisJZm9yIChpID0gMzI7IGkgPCBnaWNfaXJxczsgaSArPSAzMikKKwkJd3JpdGVsX3JlbGF4ZWQoMHhmZmZmZmZmZiwgYmFzZSArIEdJQ19ESVNUX1NFQ1VSSVRZX0JJVCArIGkgKiA0IC8gMzIpOworI2VuZGlmICAvKiBDT05GSUdfQ09NQ0VSVE9fTVNQICovCisKIAkvKgogCSAqIFNldHVwIHRoZSBMaW51eCBJUlEgc3Vic3lzdGVtLgogCSAqLwpAQCAtMzI1LDcgKzM1MiwxNCBAQAogCQlpcnFfc2V0X2NoaXBfZGF0YShpcnEsIGdpYyk7CiAJfQogCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX01TUAorCS8qCisJICogRW5hYmxlIE5vblNlY3VyZSBpbnRlcnJ1cHRzIGluIERpc3RyaWJ1dG9yCisJICovCisJd3JpdGVsX3JlbGF4ZWQoMywgYmFzZSArIEdJQ19ESVNUX0NUUkwpOworI2Vsc2UgIC8qICFDT05GSUdfQ09NQ0VSVE9fTVNQICovCiAJd3JpdGVsX3JlbGF4ZWQoMSwgYmFzZSArIEdJQ19ESVNUX0NUUkwpOworI2VuZGlmIC8qIENPTkZJR19DT01DRVJUT19NU1AgKi8KIH0KIAogc3RhdGljIHZvaWQgX19jcHVpbml0IGdpY19jcHVfaW5pdChzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljKQpAQCAtMzQ4LDkgKzM4Miw2MiBAQAogCQl3cml0ZWxfcmVsYXhlZCgweGEwYTBhMGEwLCBkaXN0X2Jhc2UgKyBHSUNfRElTVF9QUkkgKyBpICogNCAvIDQpOwogCiAJd3JpdGVsX3JlbGF4ZWQoMHhmMCwgYmFzZSArIEdJQ19DUFVfUFJJTUFTSyk7CisKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fTVNQCisJLyoKKwkgKiBTZXQgUFBJIGFuZCBTR0kgaW50ZXJydXB0cyBhcmUgbm9uU2VjdXJlCisJICovCisJd3JpdGVsX3JlbGF4ZWQoMHhmZmZmZmZmZiwgZGlzdF9iYXNlICsgR0lDX0RJU1RfU0VDVVJJVFlfQklUKTsKKworCS8qCisJICogRW5hYmxlIE5vblNlY3VyZSBpbnRlcnJ1cHRzIGluIENQVSBpbnRlcmZhY2UsCisJICogU2VjdXJlIGludGVycnVwdHMgZ28gdG8gRklRIGxpbmUsCisJICogU2VjdXJlIHJlYWQgcmV0dXJucyB2YWxpZCBOb25TZWN1cmUgaW50ZXJydXB0IElECisJICovCisJd3JpdGVsX3JlbGF4ZWQoMHhmLCBiYXNlICsgR0lDX0NQVV9DVFJMKTsKKyNlbHNlICAvKiAhQ09ORklHX0NPTUNFUlRPX01TUCAqLwogCXdyaXRlbF9yZWxheGVkKDEsIGJhc2UgKyBHSUNfQ1BVX0NUUkwpOworI2VuZGlmIC8qIENPTkZJR19DT01DRVJUT19NU1AgKi8KIH0KIAorI2lmZGVmIENPTkZJR19DT01DRVJUT19NU1AKKworc3RhdGljIHZvaWQgX19jcHVpbml0IGdpY19jcHVfaW5pdF9pcnFfb25seShzdHJ1Y3QgZ2ljX2NoaXBfZGF0YSAqZ2ljKQoreworCXZvaWQgX19pb21lbSAqZGlzdF9iYXNlID0gZ2ljLT5kaXN0X2Jhc2U7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gZ2ljLT5jcHVfYmFzZTsKKwlpbnQgaTsKKworCS8qCisJICogRGVhbCB3aXRoIHRoZSBiYW5rZWQgUFBJIGFuZCBTR0kgaW50ZXJydXB0cyAtIGRpc2FibGUgYWxsCisJICogUFBJIGludGVycnVwdHMsIGVuc3VyZSBhbGwgU0dJIGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisJICovCisJd3JpdGVsX3JlbGF4ZWQoMHhmZmZmMDAwMCwgZGlzdF9iYXNlICsgR0lDX0RJU1RfRU5BQkxFX0NMRUFSKTsKKwl3cml0ZWxfcmVsYXhlZCgweDAwMDBmZmZmLCBkaXN0X2Jhc2UgKyBHSUNfRElTVF9FTkFCTEVfU0VUKTsKKworCS8qCisJICogU2V0IHByaW9yaXR5IG9uIFBQSSBhbmQgU0dJIGludGVycnVwdHMKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkgKz0gNCkKKwkJd3JpdGVsX3JlbGF4ZWQoMHhhMGEwYTBhMCwgZGlzdF9iYXNlICsgR0lDX0RJU1RfUFJJICsgaSAqIDQgLyA0KTsKKworCXdyaXRlbF9yZWxheGVkKDB4ZjAsIGJhc2UgKyBHSUNfQ1BVX1BSSU1BU0spOworCisJLyoKKwkgKiBTZXQgUFBJIGFuZCBTR0kgaW50ZXJydXB0cyBhcmUgbm9uU2VjdXJlCisJICovCisJd3JpdGVsX3JlbGF4ZWQoMHhmZmZmZmZmZiwgZGlzdF9iYXNlICsgR0lDX0RJU1RfU0VDVVJJVFlfQklUKTsKKworCS8qCisJICogRW5hYmxlIE5vblNlY3VyZSBpbnRlcnJ1cHRzIGluIENQVSBpbnRlcmZhY2UsCisJICogU2VjdXJlIGludGVycnVwdHMgZ28gdG8gSVJRIGxpbmUsCisJICogU2VjdXJlIHJlYWQgcmV0dXJucyB2YWxpZCBOb25TZWN1cmUgaW50ZXJydXB0IElECisJICovCisJd3JpdGVsX3JlbGF4ZWQoMHg3LCBiYXNlICsgR0lDX0NQVV9DVFJMKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19DT01DRVJUT19NU1AgKi8KKwogI2lmZGVmIENPTkZJR19DUFVfUE0KIC8qCiAgKiBTYXZlcyB0aGUgR0lDIGRpc3RyaWJ1dG9yIHJlZ2lzdGVycyBkdXJpbmcgc3VzcGVuZCBvciBpZGxlLiAgTXVzdCBiZSBjYWxsZWQKQEAgLTYyNSw3ICs3MTIsMTIgQEAKIHsKIAlCVUdfT04oZ2ljX25yID49IE1BWF9HSUNfTlIpOwogCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX01TUAorCS8qIHJ1biBhbHRlcm5hdGl2ZSBzZWNvbmRhcnlfYm9vdCBnaWMgaW5pdCAqLworCWdpY19jcHVfaW5pdF9pcnFfb25seSgmZ2ljX2RhdGFbZ2ljX25yXSk7CisjZWxzZSAgLyogIUNPTkZJR19DT01DRVJUT19NU1AgKi8KIAlnaWNfY3B1X2luaXQoJmdpY19kYXRhW2dpY19ucl0pOworI2VuZGlmICAvKiBDT05GSUdfQ09NQ0VSVE9fTVNQICovCiB9CiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC02NDUsNyArNzM3LDE2IEBACiAJZHNiKCk7CiAKIAkvKiB0aGlzIGFsd2F5cyBoYXBwZW5zIG9uIEdJQzAgKi8KKworI2lmZGVmIENPTkZJR19DT01DRVJUT19NU1AKKyNkZWZpbmUgR0lDX1NHSV9TQVRUICgxIDw8IDE1KQorCS8qCisJICogU2VuZCBTR0kgZnJvbSBTZWN1cmUgd3JpdGUgdG8gTm9uU2VjdXJlIHRhcmdldAorCSAqLworCXdyaXRlbF9yZWxheGVkKG1hcCA8PCAxNiB8IEdJQ19TR0lfU0FUVCB8IGlycSwgZ2ljX2RhdGFbMF0uZGlzdF9iYXNlICsgR0lDX0RJU1RfU09GVElOVCk7CisjZWxzZSAgLyogIUNPTkZJR19DT01DRVJUT19NU1AgKi8KIAl3cml0ZWxfcmVsYXhlZChtYXAgPDwgMTYgfCBpcnEsIGdpY19kYXRhWzBdLmRpc3RfYmFzZSArIEdJQ19ESVNUX1NPRlRJTlQpOworI2VuZGlmIC8qIENPTkZJR19DT01DRVJUT19NU1AgKi8KIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2Mya2FzaWNfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9jMmthc2ljX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWNmMzgwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY29uZmlncy9jMmthc2ljX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEwNDYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZTsgRE8gTk9UIEVESVQuCisjIExpbnV4L2FybSAzLjIuMiBLZXJuZWwgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0FSTT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQorIyBDT05GSUdfQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUPXkKK0NPTkZJR19LVElNRV9TQ0FMQVI9eQorQ09ORklHX0hBVkVfUFJPQ19DUFU9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19BUkNIX0hBU19DUFVGUkVRPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19ORUVEX0RNQV9NQVBfU1RBVEU9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfQVJNX1BBVENIX1BIWVNfVklSVD15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19IQVZFX0lSUV9XT1JLPXkKK0NPTkZJR19JUlFfV09SSz15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfQ1JPU1NfQ09NUElMRT0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTz15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9IT1NUTkFNRT0iKG5vbmUpIgorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQorIyBDT05GSUdfRkhBTkRMRSBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9HRU5FUklDX0hBUkRJUlFTPXkKKworIworIyBJUlEgc3Vic3lzdGVtCisjCitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfSEFWRV9TUEFSU0VfSVJRPXkKK0NPTkZJR19HRU5FUklDX0lSUV9TSE9XPXkKK0NPTkZJR19JUlFfRE9NQUlOPXkKKyMgQ09ORklHX1NQQVJTRV9JUlEgaXMgbm90IHNldAorCisjCisjIFJDVSBTdWJzeXN0ZW0KKyMKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKK0NPTkZJR19DR1JPVVBTPXkKKyMgQ09ORklHX0NHUk9VUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19DR1JPVVBfRlJFRVpFUiBpcyBub3Qgc2V0CitDT05GSUdfQ0dST1VQX0RFVklDRT15CitDT05GSUdfQ1BVU0VUUz15CitDT05GSUdfUFJPQ19QSURfQ1BVU0VUPXkKK0NPTkZJR19DR1JPVVBfQ1BVQUNDVD15CisjIENPTkZJR19SRVNPVVJDRV9DT1VOVEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19DR1JPVVBfUEVSRiBpcyBub3Qgc2V0CisjIENPTkZJR19DR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NHUk9VUCBpcyBub3Qgc2V0CitDT05GSUdfTkFNRVNQQUNFUz15CitDT05GSUdfVVRTX05TPXkKK0NPTkZJR19JUENfTlM9eQorQ09ORklHX1VTRVJfTlM9eQorQ09ORklHX1BJRF9OUz15CisjIENPTkZJR19TQ0hFRF9BVVRPR1JPVVAgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1JFTEFZPXkKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CisjIENPTkZJR19FWFBFUlQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKK0NPTkZJR19QRVJGX1VTRV9WTUFMTE9DPXkKKworIworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycworIworQ09ORklHX1BFUkZfRVZFTlRTPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVSRl9VU0VfVk1BTExPQyBpcyBub3Qgc2V0CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CitDT05GSUdfVFJBQ0VQT0lOVFM9eQorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKK0NPTkZJR19IQVZFX1JFR1NfQU5EX1NUQUNLX0FDQ0VTU19BUEk9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CitDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVkVSU0lPTlM9eQorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19TVE9QX01BQ0hJTkU9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCREFGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9UUllMT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAorQ09ORklHX0lOTElORV9TUElOX1VOTE9DSz15CisjIENPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfQkggaXMgbm90IHNldAorQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlE9eQorIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0s9eQorIyBDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9UUllMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLPXkKKyMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfQkggaXMgbm90IHNldAorQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CitDT05GSUdfTVVURVhfU1BJTl9PTl9PV05FUj15CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworQ09ORklHX01NVT15CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQ09NQ0VSVE89eQorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFWFBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0JDTVJJTkcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ISUdIQkFOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ05TM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0dFTUlOSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BSSU1BMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVhDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVhTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRE9WRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTFBDMzJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVzkwWDkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1RFR1JBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUElDT1hDRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01TTSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NITU9CSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzY0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TNVA2NFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzVQQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1M1UFYyMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FWFlOT1MgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1RDQ185MjYgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9VMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVTg1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OT01BRElLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfUExBVF9TUEVBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZUODUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1pZTlEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19CSUdfRU5ESUFOIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gTU1VCisjCisKKyMKKyMgQ29tY2VydG8gSW1wbGVtZW50YXRpb24gT3B0aW9ucworIworQ09ORklHX0FSQ0hfTTg2WFhYPXkKKyMgQ09ORklHX0MyS19FVk0gaXMgbm90IHNldAorQ09ORklHX0MyS19BU0lDPXkKKyMgQ09ORklHX1JUU01fQzJLIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09NQ0VSVE9fTk9SPXkKK0NPTkZJR19DT01DRVJUT19URE1fQ0xPQ0s9eQorIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKK0NPTkZJR19DT01DRVJUT19OVU1fUENJRVM9MgorQ09ORklHX0NPTUNFUlRPX0ZQPXkKK0NPTkZJR19DT01DRVJUT19VQVJUMF9TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19VQVJUMV9TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19VU0IwX1NVUFBPUlQ9eQorIyBDT05GSUdfQ09NQ0VSVE9fVVNCMV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19DT01DRVJUT19JUFNFQ19TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19TUElfU1VQUE9SVD15CitDT05GSUdfQ09NQ0VSVE9fRkFTVF9TUElfU1VQUE9SVD15CitDT05GSUdfQ09NQ0VSVE9fSTJDX1NVUFBPUlQ9eQorQ09ORklHX0NPTUNFUlRPX0RXX0RNQV9TVVBQT1JUPXkKKworIworIyBQcm9jZXNzb3IgVHlwZQorIworQ09ORklHX0NQVV9WNz15CitDT05GSUdfQ1BVXzMydjZLPXkKK0NPTkZJR19DUFVfMzJ2Nz15CitDT05GSUdfQ1BVX0FCUlRfRVY3PXkKK0NPTkZJR19DUFVfUEFCUlRfVjc9eQorQ09ORklHX0NQVV9DQUNIRV9WNz15CitDT05GSUdfQ1BVX0NBQ0hFX1ZJUFQ9eQorQ09ORklHX0NQVV9DT1BZX1Y2PXkKK0NPTkZJR19DUFVfVExCX1Y3PXkKK0NPTkZJR19DUFVfSEFTX0FTSUQ9eQorQ09ORklHX0NQVV9DUDE1PXkKK0NPTkZJR19DUFVfQ1AxNV9NTVU9eQorCisjCisjIFByb2Nlc3NvciBGZWF0dXJlcworIworQ09ORklHX0FSTV9USFVNQj15CisjIENPTkZJR19BUk1fVEhVTUJFRSBpcyBub3Qgc2V0CisjIENPTkZJR19TV1BfRU1VTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19PVVRFUl9DQUNIRT15CitDT05GSUdfT1VURVJfQ0FDSEVfU1lOQz15CitDT05GSUdfQ0FDSEVfTDJYMD15CitDT05GSUdfQ0FDSEVfUEwzMTA9eQorQ09ORklHX0FSTV9MMV9DQUNIRV9TSElGVD01CitDT05GSUdfQVJNX0RNQV9NRU1fQlVGRkVSQUJMRT15CitDT05GSUdfQ1BVX0hBU19QTVU9eQorIyBDT05GSUdfQVJNX0VSUkFUQV80MzA5NzMgaXMgbm90IHNldAorIyBDT05GSUdfQVJNX0VSUkFUQV80NTg2OTMgaXMgbm90IHNldAorIyBDT05GSUdfQVJNX0VSUkFUQV80NjAwNzUgaXMgbm90IHNldAorQ09ORklHX0FSTV9FUlJBVEFfNzQyMjMwPXkKK0NPTkZJR19BUk1fRVJSQVRBXzc0MjIzMT15CitDT05GSUdfUEwzMTBfRVJSQVRBXzU4ODM2OT15CitDT05GSUdfQVJNX0VSUkFUQV83MjA3ODk9eQorQ09ORklHX1BMMzEwX0VSUkFUQV83Mjc5MTU9eQorQ09ORklHX0FSTV9FUlJBVEFfNzQzNjIyPXkKK0NPTkZJR19BUk1fRVJSQVRBXzc1MTQ3Mj15CitDT05GSUdfUEwzMTBfRVJSQVRBXzc1Mzk3MD15CitDT05GSUdfQVJNX0VSUkFUQV83NTQzMjI9eQorIyBDT05GSUdfQVJNX0VSUkFUQV83NTQzMjcgaXMgbm90IHNldAorQ09ORklHX0FSTV9FUlJBVEFfNzY0MzY5PXkKK0NPTkZJR19QTDMxMF9FUlJBVEFfNzY5NDE5PXkKK0NPTkZJR19BUk1fR0lDPXkKKworIworIyBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfUENJX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfU01QPXkKKyMgQ09ORklHX1NNUF9PTl9VUCBpcyBub3Qgc2V0CitDT05GSUdfQVJNX0NQVV9UT1BPTE9HWT15CisjIENPTkZJR19TQ0hFRF9NQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9TTVQgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJNX1NDVT15CitDT05GSUdfSEFWRV9BUk1fVFdEPXkKK0NPTkZJR19WTVNQTElUXzNHPXkKKyMgQ09ORklHX1ZNU1BMSVRfMkcgaXMgbm90IHNldAorIyBDT05GSUdfVk1TUExJVF8xRyBpcyBub3Qgc2V0CitDT05GSUdfUEFHRV9PRkZTRVQ9MHhDMDAwMDAwMAorQ09ORklHX05SX0NQVVM9MgorIyBDT05GSUdfSE9UUExVR19DUFUgaXMgbm90IHNldAorQ09ORklHX0xPQ0FMX1RJTUVSUz15CitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX0haPTEwMAorIyBDT05GSUdfVEhVTUIyX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfQUVBQkk9eQorIyBDT05GSUdfT0FCSV9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9QRk5fVkFMSUQ9eQorIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfSFdfUEVSRl9FVkVOVFM9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CitDT05GSUdfSEFWRV9NRU1CTE9DSz15CitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisjIENPTkZJR19DT01QQUNUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19WSVJUX1RPX0JVUz15CisjIENPTkZJR19LU00gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU1BUF9NSU5fQUREUj00MDk2CisjIENPTkZJR19DTEVBTkNBQ0hFIGlzIG5vdCBzZXQKK0NPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTExCitDT05GSUdfQUxJR05NRU5UX1RSQVA9eQorIyBDT05GSUdfVUFDQ0VTU19XSVRIX01FTUNQWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUFJFQ0FURURfUEFSQU1fU1RSVUNUIGlzIG5vdCBzZXQKKworIworIyBCb290IG9wdGlvbnMKKyMKKyMgQ09ORklHX1VTRV9PRiBpcyBub3Qgc2V0CitDT05GSUdfWkJPT1RfUk9NX1RFWFQ9MHgwMDYwODAwMAorQ09ORklHX1pCT09UX1JPTV9CU1M9MAorQ09ORklHX1pCT09UX1JPTT15CitDT05GSUdfQ01ETElORT0iIgorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CisKKyMKKyMgQ1BVIFBvd2VyIE1hbmFnZW1lbnQKKyMKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9JRExFIGlzIG5vdCBzZXQKKworIworIyBGbG9hdGluZyBwb2ludCBlbXVsYXRpb24KKyMKKworIworIyBBdCBsZWFzdCBvbmUgZW11bGF0aW9uIG11c3QgYmUgc2VsZWN0ZWQKKyMKKyMgQ09ORklHX1ZGUCBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcnNwYWNlIGJpbmFyeSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BT1VUPXkKKyMgQ09ORklHX0JJTkZNVF9BT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1NVU1BFTkQgaXMgbm90IHNldAorIyBDT05GSUdfUE1fUlVOVElNRSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKKyMgQ09ORklHX0FSTV9DUFVfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVQgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfVEVTVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKyMgQ09ORklHX01URF9BRlNfUEFSVFMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT09QUyBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKKyMgQ09ORklHX01URF9DRklfQURWX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMj15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzQ9eQorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzggaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8zMiBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JMT15CitDT05GSUdfTVREX0NGSV9JMj15CisjIENPTkZJR19NVERfQ0ZJX0k0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTggaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKK0NPTkZJR19NVERfUkFNPXkKK0NPTkZJR19NVERfUk9NPXkKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CisjIENPTkZJR19NVERfUEhZU01BUF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0NHMyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgTFBERFIgZmxhc2ggbWVtb3J5IGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9MUEREUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfVUJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xJUzNMVjAyRCBpcyBub3Qgc2V0CisjIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19TQ1NJX01PRD15CisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfU1BBUlNFS01BUCBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKKyMgQ09ORklHX0tFWUJPQVJEX0FEUDU1ODggaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OSBpcyBub3Qgc2V0CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfUVQxMDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1FUMjE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9UQ0E2NDE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BWDczNTkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01QUjEyMSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CitDT05GSUdfTU9VU0VfUFMyX0FMUFM9eQorQ09ORklHX01PVVNFX1BTMl9MT0dJUFMyUFA9eQorQ09ORklHX01PVVNFX1BTMl9TWU5BUFRJQ1M9eQorQ09ORklHX01PVVNFX1BTMl9UUkFDS1BPSU5UPXkKKyMgQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QUzJfU0VOVEVMSUMgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NZTkFQVElDU19JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX0FMVEVSQV9QUzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUFMyTVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9TSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0zMgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfUlNBPXkKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX1RJTUJFUkRBTEUgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0FMVEVSQV9KVEFHVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQUxURVJBX1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX1hJTElOWF9QU19VQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hWQ19EQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfUkFNT09QUyBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKKyMgQ09ORklHX0kyQ19DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0NIQVJERVYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX01VWCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSEVMUEVSX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0kyQ19TTUJVUz15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKK0NPTkZJR19JMkNfQUxHT0JJVD1tCisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0FMR09QQ0E9bQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworQ09ORklHX0kyQ19DT01DRVJUTz15CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfUENBX1BMQVRGT1JNPW0KKyMgQ09ORklHX0kyQ19QWEFfUENJIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfU0lNVEVDPW0KKyMgQ09ORklHX0kyQ19YSUxJTlggaXMgbm90IHNldAorCisjCisjIEV4dGVybmFsIEkyQy9TTUJ1cyBhZGFwdGVyIGRyaXZlcnMKKyMKK0NPTkZJR19JMkNfUEFSUE9SVF9MSUdIVD1tCisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorQ09ORklHX1NQSV9NU1BEPXkKK0NPTkZJR19DT01DRVJUT19TUEk9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworQ09ORklHX0VFUFJPTV9BVD15CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKKworIworIyBQUFMgZ2VuZXJhdG9ycyBzdXBwb3J0CisjCisKKyMKKyMgUFRQIGNsb2NrIHN1cHBvcnQKKyMKKworIworIyBFbmFibGUgRGV2aWNlIERyaXZlcnMgLT4gUFBTIHRvIHNlZSB0aGUgUFRQIGNsb2NrIG9wdGlvbnMuCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0I9eQorIyBDT05GSUdfU1NCX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19CQ01BX1BPU1NJQkxFPXkKKworIworIyBCcm9hZGNvbSBzcGVjaWZpYyBBTUJBCisjCisjIENPTkZJR19CQ01BIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfODhQTTg2MFggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjEwNVggaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjUwN1ggaXMgbm90IHNldAorIyBDT05GSUdfVFdMNDAzMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TVE1QRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEMzNTg5WCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CisjIENPTkZJR19QTUlDX0FEUDU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX01BWDg5MjUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX01BWDg5OTcgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX01BWDg5OTggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004OTk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19BQlg1MDBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV0wxMjczX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19EUk09bQorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MPW0KKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKK0NPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQorIyBDT05GSUdfTENEX0NMQVNTX0RFVklDRSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CitDT05GSUdfQkFDS0xJR0hUX0dFTkVSSUM9eQorIyBDT05GSUdfQkFDS0xJR0hUX0FEUDg4NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0FEUDg4NzAgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ESVNQTEFZX1NVUFBPUlQ9bQorCisjCisjIERpc3BsYXkgaGFyZHdhcmUgZHJpdmVycworIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIFZpcnRpbyBkcml2ZXJzCisjCisjIENPTkZJR19WSVJUSU9fQkFMTE9PTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSVJUSU9fTU1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBTcGlubG9jayBkcml2ZXJzCisjCitDT05GSUdfSU9NTVVfU1VQUE9SVD15CisjIENPTkZJR19WSVJUX0RSSVZFUlMgaXMgbm90IHNldAorIyBDT05GSUdfUE1fREVWRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CisjIENPTkZJR19GU05PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRllfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GQU5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQUNUTCBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTNF9GUz15CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0xCisjIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9TVU1NQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1pMSUI9eQorIyBDT05GSUdfSkZGUzJfTFpPIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dGUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1FVQVNIRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19PTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BTVE9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfUFJJTlRLX1RJTUU9eQorQ09ORklHX0RFRkFVTFRfTUVTU0FHRV9MT0dMRVZFTD00CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CitDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorQ09ORklHX0ZSQU1FX1dBUk49MjA0OAorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKK0NPTkZJR19VTlVTRURfU1lNQk9MUz15CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRUNUSU9OX01JU01BVENIIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS1VQX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBUkRMT0NLVVBfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfREVURUNUX0hVTkdfVEFTSyBpcyBub3Qgc2V0CitDT05GSUdfU0NIRURfREVCVUc9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfVElNRVJfU1RBVFM9eQorIyBDT05GSUdfREVCVUdfT0JKRUNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tNRU1MRUFLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfUlRfTVVURVhfVEVTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRV9SQ1VfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQVRPTUlDX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRT15CisjIENPTkZJR19ERUJVR19TVEFDS19VU0FHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfV1JJVEVDT1VOVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfTUVNT1JZX0lOSVQ9eQorIyBDT05GSUdfREVCVUdfTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19URVNUX0xJU1RfU09SVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19OT1RJRklFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQ1JFREVOVElBTFMgaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfQk9PVF9QUklOVEtfREVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CitDT05GSUdfUkNVX0NQVV9TVEFMTF9USU1FT1VUPTYwCisjIENPTkZJR19CQUNLVFJBQ0VfU0VMRl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JMT0NLX0VYVF9ERVZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZPUkNFX1dFQUtfUEVSX0NQVSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QRVJfQ1BVX01BUFMgaXMgbm90IHNldAorIyBDT05GSUdfTEtEVE0gaXMgbm90IHNldAorIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAorQ09ORklHX05PUF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CitDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CitDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfSEFWRV9DX1JFQ09SRE1DT1VOVD15CitDT05GSUdfUklOR19CVUZGRVI9eQorQ09ORklHX0VWRU5UX1RSQUNJTkc9eQorQ09ORklHX0VWRU5UX1BPV0VSX1RSQUNJTkdfREVQUkVDQVRFRD15CitDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSPXkKK0NPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19HRU5FUklDX1RSQUNFUj15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKK0NPTkZJR19GVFJBQ0U9eQorIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CitDT05GSUdfQlJBTkNIX1BST0ZJTEVfTk9ORT15CisjIENPTkZJR19QUk9GSUxFX0FOTk9UQVRFRF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxFX0FMTF9CUkFOQ0hFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19SSU5HX0JVRkZFUl9CRU5DSE1BUksgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUT01JQzY0X1NFTEZURVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorIyBDT05GSUdfVEVTVF9LU1RSVE9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklDVF9ERVZNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQVJNX1VOV0lORCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xMIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0RNRVNHX1JFU1RSSUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfU0VDVVJJVFlfREFDPXkKK0NPTkZJR19ERUZBVUxUX1NFQ1VSSVRZPSIiCisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorQ09ORklHX0JJTkFSWV9QUklOVEY9eQorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfVDEwRElGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19JVFVfVCBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDOCBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQorIyBDT05GSUdfWFpfREVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1haX0RFQ19CQ0ogaXMgbm90IHNldAorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CisjIENPTkZJR19BVkVSQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPUkRJQyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2Mya2V2bV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2Mya2V2bV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiYTg4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYzJrZXZtX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEwNDYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZmlsZTsgRE8gTk9UIEVESVQuCisjIExpbnV4L2FybSAzLjIuMiBLZXJuZWwgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0FSTT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0FQTV9FTVVMQVRJT049eQorIyBDT05GSUdfQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQgaXMgbm90IHNldAorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUPXkKK0NPTkZJR19LVElNRV9TQ0FMQVI9eQorQ09ORklHX0hBVkVfUFJPQ19DUFU9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKK0NPTkZJR19IQVJESVJRU19TV19SRVNFTkQ9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKK0NPTkZJR19BUkNIX0hBU19DUFVGUkVRPXkKK0NPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19ORUVEX0RNQV9NQVBfU1RBVEU9eQorQ09ORklHX1ZFQ1RPUlNfQkFTRT0weGZmZmYwMDAwCitDT05GSUdfQVJNX1BBVENIX1BIWVNfVklSVD15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKK0NPTkZJR19IQVZFX0lSUV9XT1JLPXkKK0NPTkZJR19JUlFfV09SSz15CisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCitDT05GSUdfQ1JPU1NfQ09NUElMRT0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTz15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9IT1NUTkFNRT0iKG5vbmUpIgorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfU1lTVklQQ19TWVNDVEw9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjM9eQorIyBDT05GSUdfRkhBTkRMRSBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9HRU5FUklDX0hBUkRJUlFTPXkKKworIworIyBJUlEgc3Vic3lzdGVtCisjCitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfSEFWRV9TUEFSU0VfSVJRPXkKK0NPTkZJR19HRU5FUklDX0lSUV9TSE9XPXkKK0NPTkZJR19JUlFfRE9NQUlOPXkKKyMgQ09ORklHX1NQQVJTRV9JUlEgaXMgbm90IHNldAorCisjCisjIFJDVSBTdWJzeXN0ZW0KKyMKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKK0NPTkZJR19DR1JPVVBTPXkKKyMgQ09ORklHX0NHUk9VUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19DR1JPVVBfRlJFRVpFUiBpcyBub3Qgc2V0CitDT05GSUdfQ0dST1VQX0RFVklDRT15CitDT05GSUdfQ1BVU0VUUz15CitDT05GSUdfUFJPQ19QSURfQ1BVU0VUPXkKK0NPTkZJR19DR1JPVVBfQ1BVQUNDVD15CisjIENPTkZJR19SRVNPVVJDRV9DT1VOVEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19DR1JPVVBfUEVSRiBpcyBub3Qgc2V0CisjIENPTkZJR19DR1JPVVBfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NHUk9VUCBpcyBub3Qgc2V0CitDT05GSUdfTkFNRVNQQUNFUz15CitDT05GSUdfVVRTX05TPXkKK0NPTkZJR19JUENfTlM9eQorQ09ORklHX1VTRVJfTlM9eQorQ09ORklHX1BJRF9OUz15CisjIENPTkZJR19TQ0hFRF9BVVRPR1JPVVAgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURURfVjI9eQorQ09ORklHX1JFTEFZPXkKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CisjIENPTkZJR19FWFBFUlQgaXMgbm90IHNldAorQ09ORklHX1VJRDE2PXkKKyMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX1BFUkZfRVZFTlRTPXkKK0NPTkZJR19QRVJGX1VTRV9WTUFMTE9DPXkKKworIworIyBLZXJuZWwgUGVyZm9ybWFuY2UgRXZlbnRzIEFuZCBDb3VudGVycworIworQ09ORklHX1BFUkZfRVZFTlRTPXkKKyMgQ09ORklHX1BFUkZfQ09VTlRFUlMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVSRl9VU0VfVk1BTExPQyBpcyBub3Qgc2V0CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CisjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CitDT05GSUdfVFJBQ0VQT0lOVFM9eQorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKK0NPTkZJR19IQVZFX1JFR1NfQU5EX1NUQUNLX0FDQ0VTU19BUEk9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CitDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UPXkKKworIworIyBHQ09WLWJhc2VkIGtlcm5lbCBwcm9maWxpbmcKKyMKKyMgQ09ORklHX0dDT1ZfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVkVSU0lPTlM9eQorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19TVE9QX01BQ0hJTkU9eQorQ09ORklHX0JMT0NLPXkKKyMgQ09ORklHX0xCREFGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0NGUT15CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iY2ZxIgorIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9UUllMT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLX0lSUVNBVkUgaXMgbm90IHNldAorQ09ORklHX0lOTElORV9TUElOX1VOTE9DSz15CisjIENPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfQkggaXMgbm90IHNldAorQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlE9eQorIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0s9eQorIyBDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9UUllMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9XUklURV9MT0NLX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLPXkKKyMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfQkggaXMgbm90IHNldAorQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9XUklURV9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CitDT05GSUdfTVVURVhfU1BJTl9PTl9PV05FUj15CisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gVHlwZQorIworQ09ORklHX01NVT15CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfQ09NQ0VSVE89eQorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFWFBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQVQ5MSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0JDTVJJTkcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9ISUdIQkFOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ05TM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0dFTUlOSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BSSU1BMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0VCU0ExMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FUDkzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9GT09UQlJJREdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVhDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTVhTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTkVUWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0g3MjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSU9QMTNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMyWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDMzWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRE9WRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tJUktXT09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTFBDMzJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01WNzhYWDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PUklPTjVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfS1M4Njk1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVzkwWDkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1RFR1JBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUElDT1hDRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUE5YNDAwOCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BYQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01TTSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NITU9CSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUlBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0ExMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzNDMjQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzY0WFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TNVA2NFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzVQQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1M1UFYyMTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FWFlOT1MgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1RDQ185MjYgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9VMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVTg1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9OT01BRElLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfREFWSU5DSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX09NQVAgaXMgbm90IHNldAorIyBDT05GSUdfUExBVF9TUEVBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZUODUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1pZTlEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19CSUdfRU5ESUFOIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gTU1VCisjCisKKyMKKyMgQ29tY2VydG8gSW1wbGVtZW50YXRpb24gT3B0aW9ucworIworQ09ORklHX0FSQ0hfTTg2WFhYPXkKK0NPTkZJR19DMktfRVZNPXkKKyMgQ09ORklHX0MyS19BU0lDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUU01fQzJLIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09NQ0VSVE9fTk9SPXkKK0NPTkZJR19DT01DRVJUT19URE1fQ0xPQ0s9eQorIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKK0NPTkZJR19DT01DRVJUT19OVU1fUENJRVM9MgorQ09ORklHX0NPTUNFUlRPX0ZQPXkKKyMgQ09ORklHX0NPTUNFUlRPX1VBUlQwX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0NPTUNFUlRPX1VBUlQxX1NVUFBPUlQ9eQorQ09ORklHX0NPTUNFUlRPX1VTQjBfU1VQUE9SVD15CisjIENPTkZJR19DT01DRVJUT19VU0IxX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0NPTUNFUlRPX0lQU0VDX1NVUFBPUlQ9eQorQ09ORklHX0NPTUNFUlRPX1NQSV9TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19GQVNUX1NQSV9TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19JMkNfU1VQUE9SVD15CitDT05GSUdfQ09NQ0VSVE9fRFdfRE1BX1NVUFBPUlQ9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVX1Y3PXkKK0NPTkZJR19DUFVfMzJ2Nks9eQorQ09ORklHX0NQVV8zMnY3PXkKK0NPTkZJR19DUFVfQUJSVF9FVjc9eQorQ09ORklHX0NQVV9QQUJSVF9WNz15CitDT05GSUdfQ1BVX0NBQ0hFX1Y3PXkKK0NPTkZJR19DUFVfQ0FDSEVfVklQVD15CitDT05GSUdfQ1BVX0NPUFlfVjY9eQorQ09ORklHX0NQVV9UTEJfVjc9eQorQ09ORklHX0NQVV9IQVNfQVNJRD15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0FSTV9USFVNQkVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXUF9FTVVMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0JQUkVESUNUX0RJU0FCTEUgaXMgbm90IHNldAorQ09ORklHX09VVEVSX0NBQ0hFPXkKK0NPTkZJR19PVVRFUl9DQUNIRV9TWU5DPXkKK0NPTkZJR19DQUNIRV9MMlgwPXkKK0NPTkZJR19DQUNIRV9QTDMxMD15CitDT05GSUdfQVJNX0wxX0NBQ0hFX1NISUZUPTUKK0NPTkZJR19BUk1fRE1BX01FTV9CVUZGRVJBQkxFPXkKK0NPTkZJR19DUFVfSEFTX1BNVT15CisjIENPTkZJR19BUk1fRVJSQVRBXzQzMDk3MyBpcyBub3Qgc2V0CisjIENPTkZJR19BUk1fRVJSQVRBXzQ1ODY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19BUk1fRVJSQVRBXzQ2MDA3NSBpcyBub3Qgc2V0CitDT05GSUdfQVJNX0VSUkFUQV83NDIyMzA9eQorQ09ORklHX0FSTV9FUlJBVEFfNzQyMjMxPXkKK0NPTkZJR19QTDMxMF9FUlJBVEFfNTg4MzY5PXkKK0NPTkZJR19BUk1fRVJSQVRBXzcyMDc4OT15CitDT05GSUdfUEwzMTBfRVJSQVRBXzcyNzkxNT15CitDT05GSUdfQVJNX0VSUkFUQV83NDM2MjI9eQorQ09ORklHX0FSTV9FUlJBVEFfNzUxNDcyPXkKK0NPTkZJR19QTDMxMF9FUlJBVEFfNzUzOTcwPXkKK0NPTkZJR19BUk1fRVJSQVRBXzc1NDMyMj15CisjIENPTkZJR19BUk1fRVJSQVRBXzc1NDMyNyBpcyBub3Qgc2V0CitDT05GSUdfQVJNX0VSUkFUQV83NjQzNjk9eQorQ09ORklHX1BMMzEwX0VSUkFUQV83Njk0MTk9eQorQ09ORklHX0FSTV9HSUM9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKK0NPTkZJR19TTVA9eQorIyBDT05GSUdfU01QX09OX1VQIGlzIG5vdCBzZXQKK0NPTkZJR19BUk1fQ1BVX1RPUE9MT0dZPXkKKyMgQ09ORklHX1NDSEVEX01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUk1fU0NVPXkKK0NPTkZJR19IQVZFX0FSTV9UV0Q9eQorQ09ORklHX1ZNU1BMSVRfM0c9eQorIyBDT05GSUdfVk1TUExJVF8yRyBpcyBub3Qgc2V0CisjIENPTkZJR19WTVNQTElUXzFHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFX09GRlNFVD0weEMwMDAwMDAwCitDT05GSUdfTlJfQ1BVUz0yCisjIENPTkZJR19IT1RQTFVHX0NQVSBpcyBub3Qgc2V0CitDT05GSUdfTE9DQUxfVElNRVJTPXkKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCisjIENPTkZJR19USFVNQjJfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19BRUFCST15CisjIENPTkZJR19PQUJJX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX1BGTl9WQUxJRD15CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19IV19QRVJGX0VWRU5UUz15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19IQVZFX01FTUJMT0NLPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX0NPTVBBQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX1ZJUlRfVE9fQlVTPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKKyMgQ09ORklHX0NMRUFOQ0FDSEUgaXMgbm90IHNldAorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTEKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisjIENPTkZJR19VQUNDRVNTX1dJVEhfTUVNQ1BZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfREVQUkVDQVRFRF9QQVJBTV9TVFJVQ1QgaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworIyBDT05GSUdfVVNFX09GIGlzIG5vdCBzZXQKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAwNjA4MDAwCitDT05GSUdfWkJPT1RfUk9NX0JTUz0wCitDT05GSUdfWkJPT1RfUk9NPXkKK0NPTkZJR19DTURMSU5FPSIiCisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKKworIworIyBDUFUgUG93ZXIgTWFuYWdlbWVudAorIworCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lETEUgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworIyBDT05GSUdfVkZQIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucworIworIyBDT05GSUdfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9SVU5USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorIyBDT05GSUdfQVJNX0NQVV9TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorIyBDT05GSUdfREVWVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0RFVlJFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FGU19QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQVI3X1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxLREVWUz15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfU01fRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorQ09ORklHX01URF9SQU09eQorQ09ORklHX01URF9ST009eQorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPXkKKyMgQ09ORklHX01URF9QSFlTTUFQX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQ0czIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBMUEREUiBmbGFzaCBtZW1vcnkgZHJpdmVycworIworIyBDT05GSUdfTVREX0xQRERSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTElTM0xWMDJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfREVWSUNFUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX1NDU0lfTU9EPXkKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKyMgQ09ORklHX0lOUFVUX0ZGX01FTUxFU1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfUE9MTERFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9TUEFSU0VLTUFQIGlzIG5vdCBzZXQKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9BRFA1NTg5IGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9RVDEwNzAgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfUVQyMTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1RDQTY0MTYgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTUFYNzM1OSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQ1MgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTVBSMTIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9PUEVOQ09SRVMgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1RPV0FXQVkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRT15CitDT05GSUdfTU9VU0VfUFMyPXkKK0NPTkZJR19NT1VTRV9QUzJfQUxQUz15CitDT05GSUdfTU9VU0VfUFMyX0xPR0lQUzJQUD15CitDT05GSUdfTU9VU0VfUFMyX1NZTkFQVElDUz15CitDT05GSUdfTU9VU0VfUFMyX1RSQUNLUE9JTlQ9eQorIyBDT05GSUdfTU9VU0VfUFMyX0VMQU5URUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BTMl9TRU5URUxJQyBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QUzJfVE9VQ0hLSVQgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfU1lOQVBUSUNTX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fQUxURVJBX1BTMiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19QUzJNVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVMgaXMgbm90IHNldAorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX1NJTksgaXMgbm90IHNldAorQ09ORklHX0RFVktNRU09eQorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTMyCitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CisjIENPTkZJR19TRVJJQUxfODI1MF9ERVRFQ1RfSVJRIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MF9SU0E9eQorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfVElNQkVSREFMRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQUxURVJBX0pUQUdVQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9BTFRFUkFfVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfWElMSU5YX1BTX1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfSFZDX0RDQyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQU1PT1BTIGlzIG5vdCBzZXQKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19CT0FSRElORk89eQorIyBDT05GSUdfSTJDX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfTVVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19IRUxQRVJfQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1NNQlVTPXkKKworIworIyBJMkMgQWxnb3JpdGhtcworIworQ09ORklHX0kyQ19BTEdPQklUPW0KKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfQUxHT1BDQT1tCisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgSTJDIHN5c3RlbSBidXMgZHJpdmVycyAobW9zdGx5IGVtYmVkZGVkIC8gc3lzdGVtLW9uLWNoaXApCisjCitDT05GSUdfSTJDX0NPTUNFUlRPPXkKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19QQ0FfUExBVEZPUk09bQorIyBDT05GSUdfSTJDX1BYQV9QQ0kgaXMgbm90IHNldAorQ09ORklHX0kyQ19TSU1URUM9bQorIyBDT05GSUdfSTJDX1hJTElOWCBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUPW0KKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfU1BJX01TUEQ9eQorQ09ORklHX0NPTUNFUlRPX1NQST15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCitDT05GSUdfRUVQUk9NX0FUPXkKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorCisjCisjIFBQUyBzdXBwb3J0CisjCisjIENPTkZJR19QUFMgaXMgbm90IHNldAorCisjCisjIFBQUyBnZW5lcmF0b3JzIHN1cHBvcnQKKyMKKworIworIyBQVFAgY2xvY2sgc3VwcG9ydAorIworCisjCisjIEVuYWJsZSBEZXZpY2UgRHJpdmVycyAtPiBQUFMgdG8gc2VlIHRoZSBQVFAgY2xvY2sgb3B0aW9ucy4KKyMKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TU0JfUE9TU0lCTEU9eQorCisjCisjIFNvbmljcyBTaWxpY29uIEJhY2twbGFuZQorIworQ09ORklHX1NTQj15CisjIENPTkZJR19TU0JfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0JDTUFfUE9TU0lCTEU9eQorCisjCisjIEJyb2FkY29tIHNwZWNpZmljIEFNQkEKKyMKKyMgQ09ORklHX0JDTUEgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF84OFBNODYwWCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU001MDEgaXMgbm90IHNldAorIyBDT05GSUdfSFRDX1BBU0lDMyBpcyBub3Qgc2V0CisjIENPTkZJR19UUFM2MTA1WCBpcyBub3Qgc2V0CisjIENPTkZJR19UUFM2NTA3WCBpcyBub3Qgc2V0CisjIENPTkZJR19UV0w0MDMwX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NUTVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UQzM1ODlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNSUNfQURQNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfTUFYODkyNSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfTUFYODk5NyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfTUFYODk5OCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzMVhfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg5OTQgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FCWDUwMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTDEyNzNfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTUVESUFfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0RSTT1tCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9bQorIyBDT05GSUdfRkIgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CisjIENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFIGlzIG5vdCBzZXQKK0NPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPXkKK0NPTkZJR19CQUNLTElHSFRfR0VORVJJQz15CisjIENPTkZJR19CQUNLTElHSFRfQURQODg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfQURQODg3MCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0RJU1BMQVlfU1VQUE9SVD1tCisKKyMKKyMgRGlzcGxheSBoYXJkd2FyZSBkcml2ZXJzCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorIyBDT05GSUdfRE1BREVWSUNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CisKKyMKKyMgVmlydGlvIGRyaXZlcnMKKyMKKyMgQ09ORklHX1ZJUlRJT19CQUxMT09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJUlRJT19NTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIFNwaW5sb2NrIGRyaXZlcnMKKyMKK0NPTkZJR19JT01NVV9TVVBQT1JUPXkKKyMgQ09ORklHX1ZJUlRfRFJJVkVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9ERVZGUkVRIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRklMRV9MT0NLSU5HPXkKKyMgQ09ORklHX0ZTTk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWV9VU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBTk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBQ1RMIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlM0X0ZTPXkKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19TWVNDVEw9eQorQ09ORklHX1BST0NfUEFHRV9NT05JVE9SPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorQ09ORklHX01JU0NfRklMRVNZU1RFTVM9eQorIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfRlM9eQorQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTEKKyMgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CisjIENPTkZJR19KRkZTMl9MWk8gaXMgbm90IHNldAorQ09ORklHX0pGRlMyX1JUSU1FPXkKKyMgQ09ORklHX0pGRlMyX1JVQklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TUVVBU0hGUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUFNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKK0NPTkZJR19QUklOVEtfVElNRT15CitDT05GSUdfREVGQVVMVF9NRVNTQUdFX0xPR0xFVkVMPTQKK0NPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEPXkKK0NPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CitDT05GSUdfRlJBTUVfV0FSTj0yMDQ4CitDT05GSUdfTUFHSUNfU1lTUlE9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAorQ09ORklHX1VOVVNFRF9TWU1CT0xTPXkKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NFQ1RJT05fTUlTTUFUQ0ggaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CisjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NLVVBfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLIGlzIG5vdCBzZXQKK0NPTkZJR19TQ0hFRF9ERUJVRz15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKK0NPTkZJR19USU1FUl9TVEFUUz15CisjIENPTkZJR19ERUJVR19PQkpFQ1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS01FTUxFQUsgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLX0FMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST1ZFX0xPQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFX1JDVV9QT0lOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19BVE9NSUNfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFDS1RSQUNFPXkKKyMgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19XUklURUNPVU5UIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CisjIENPTkZJR19ERUJVR19MSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFU1RfTElTVF9TT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX05PVElGSUVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19DUkVERU5USUFMUyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19CT09UX1BSSU5US19ERUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfQ1BVX1NUQUxMX1RJTUVPVVQ9NjAKKyMgQ09ORklHX0JBQ0tUUkFDRV9TRUxGX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfQkxPQ0tfRVhUX0RFVlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRk9SQ0VfV0VBS19QRVJfQ1BVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFUl9DUFVfTUFQUyBpcyBub3Qgc2V0CisjIENPTkZJR19MS0RUTSBpcyBub3Qgc2V0CisjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKKyMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CitDT05GSUdfTk9QX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19IQVZFX0NfUkVDT1JETUNPVU5UPXkKK0NPTkZJR19SSU5HX0JVRkZFUj15CitDT05GSUdfRVZFTlRfVFJBQ0lORz15CitDT05GSUdfRVZFTlRfUE9XRVJfVFJBQ0lOR19ERVBSRUNBVEVEPXkKK0NPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVI9eQorQ09ORklHX1RSQUNJTkc9eQorQ09ORklHX0dFTkVSSUNfVFJBQ0VSPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQorQ09ORklHX0ZUUkFDRT15CisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19CUkFOQ0hfUFJPRklMRV9OT05FPXkKKyMgQ09ORklHX1BST0ZJTEVfQU5OT1RBVEVEX0JSQU5DSEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTEVfQUxMX0JSQU5DSEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JT19UUkFDRT15CisjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JJTkdfQlVGRkVSX0JFTkNITUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQVRPTUlDNjRfU0VMRlRFU1QgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CisjIENPTkZJR19URVNUX0tTVFJUT1ggaXMgbm90IHNldAorIyBDT05GSUdfU1RSSUNUX0RFVk1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19BUk1fVU5XSU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRE1FU0dfUkVTVFJJQ1QgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eQorQ09ORklHX0RFRkFVTFRfU0VDVVJJVFk9IiIKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkM4IGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CisjIENPTkZJR19YWl9ERUMgaXMgbm90IHNldAorIyBDT05GSUdfWFpfREVDX0JDSiBpcyBub3Qgc2V0CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKKyMgQ09ORklHX0FWRVJBR0UgaXMgbm90IHNldAorIyBDT05GSUdfQ09SRElDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvYzJrbHZfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9jMmtsdl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllM2Q5YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYzJrbHZfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTI0IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGU7IERPIE5PVCBFRElULgorIyBMaW51eC9hcm0gMy4yLjIgS2VybmVsIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19BUk09eQorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKKyMgQ09ORklHX0FSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVD15CitDT05GSUdfS1RJTUVfU0NBTEFSPXkKK0NPTkZJR19IQVZFX1BST0NfQ1BVPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfTkVFRF9ETUFfTUFQX1NUQVRFPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0FSTV9QQVRDSF9QSFlTX1ZJUlQ9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfSEFWRV9JUlFfV09SSz15CitDT05GSUdfSVJRX1dPUks9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0NST1NTX0NPTVBJTEU9IiIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk89eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk8gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSE9TVE5BTUU9Iihub25lKSIKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKKyMgQ09ORklHX0ZIQU5ETEUgaXMgbm90IHNldAorQ09ORklHX0hBVkVfR0VORVJJQ19IQVJESVJRUz15CisKKyMKKyMgSVJRIHN1YnN5c3RlbQorIworQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0hBVkVfU1BBUlNFX0lSUT15CitDT05GSUdfR0VORVJJQ19JUlFfU0hPVz15CitDT05GSUdfSVJRX0RPTUFJTj15CisjIENPTkZJR19TUEFSU0VfSVJRIGlzIG5vdCBzZXQKKworIworIyBSQ1UgU3Vic3lzdGVtCisjCitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE3CitDT05GSUdfQ0dST1VQUz15CisjIENPTkZJR19DR1JPVVBfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX0ZSRUVaRVIgaXMgbm90IHNldAorQ09ORklHX0NHUk9VUF9ERVZJQ0U9eQorQ09ORklHX0NQVVNFVFM9eQorQ09ORklHX1BST0NfUElEX0NQVVNFVD15CitDT05GSUdfQ0dST1VQX0NQVUFDQ1Q9eQorIyBDT05GSUdfUkVTT1VSQ0VfQ09VTlRFUlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX1BFUkYgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DR1JPVVAgaXMgbm90IHNldAorQ09ORklHX05BTUVTUEFDRVM9eQorQ09ORklHX1VUU19OUz15CitDT05GSUdfSVBDX05TPXkKK0NPTkZJR19VU0VSX05TPXkKK0NPTkZJR19QSURfTlM9eQorIyBDT05GSUdfU0NIRURfQVVUT0dST1VQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKK0NPTkZJR19SRUxBWT15CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRVhQRVJUIGlzIG5vdCBzZXQKK0NPTkZJR19VSUQxNj15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0FJTz15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CitDT05GSUdfUEVSRl9VU0VfVk1BTExPQz15CisKKyMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKKyMKK0NPTkZJR19QRVJGX0VWRU5UUz15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFUkZfVVNFX1ZNQUxMT0MgaXMgbm90IHNldAorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX1RSQUNFUE9JTlRTPXkKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKK0NPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15CitDT05GSUdfSEFWRV9SRUdTX0FORF9TVEFDS19BQ0NFU1NfQVBJPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVD15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFZFUlNJT05TPXkKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfU1RPUF9NQUNISU5FPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTR0xJQiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKKyMgQ09ORklHX0lOTElORV9TUElOX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0s9eQorIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLPXkKKyMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19CSCBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DSz15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorQ09ORklHX01VVEVYX1NQSU5fT05fT1dORVI9eQorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0NPTUNFUlRPPXkKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVhQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9CQ01SSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSElHSEJBTksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NOUzNYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9HRU1JTkkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QUklNQTIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RPVkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LSVJLV09PRCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xQQzMyWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NVjc4WFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01NUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tTODY5NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1c5MFg5MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9URUdSQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BJQ09YQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU00gaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSE1PQklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0M2NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzVQNjRYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1M1UEMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TNVBWMjEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVhZTk9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9UQ0NfOTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVTMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1U4NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTk9NQURJSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMQVRfU1BFQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WVDg1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9aWU5RIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfQklHX0VORElBTiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIE1NVQorIworCisjCisjIENvbWNlcnRvIEltcGxlbWVudGF0aW9uIE9wdGlvbnMKKyMKK0NPTkZJR19BUkNIX004NlhYWD15CisjIENPTkZJR19DMktfRVZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0MyS19BU0lDIGlzIG5vdCBzZXQKK0NPTkZJR19SVFNNX0MySz15CitDT05GSUdfTVREX0NPTUNFUlRPX05PUj15CitDT05GSUdfQ09NQ0VSVE9fVERNX0NMT0NLPXkKK0NPTkZJR19DT01DRVJUT19OVU1fUENJRVM9MgorQ09ORklHX0NPTUNFUlRPX0ZQPXkKKyMgQ09ORklHX0NPTUNFUlRPX1VBUlQwX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0NPTUNFUlRPX1VBUlQxX1NVUFBPUlQ9eQorQ09ORklHX0NPTUNFUlRPX1VTQjBfU1VQUE9SVD15CisjIENPTkZJR19DT01DRVJUT19VU0IxX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0NPTUNFUlRPX0lQU0VDX1NVUFBPUlQ9eQorQ09ORklHX0NPTUNFUlRPX1NQSV9TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19GQVNUX1NQSV9TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19JMkNfU1VQUE9SVD15CitDT05GSUdfQ09NQ0VSVE9fRFdfRE1BX1NVUFBPUlQ9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVX1Y3PXkKK0NPTkZJR19DUFVfMzJ2Nks9eQorQ09ORklHX0NQVV8zMnY3PXkKK0NPTkZJR19DUFVfQUJSVF9FVjc9eQorQ09ORklHX0NQVV9QQUJSVF9WNz15CitDT05GSUdfQ1BVX0NBQ0hFX1Y3PXkKK0NPTkZJR19DUFVfQ0FDSEVfVklQVD15CitDT05GSUdfQ1BVX0NPUFlfVjY9eQorQ09ORklHX0NQVV9UTEJfVjc9eQorQ09ORklHX0NQVV9IQVNfQVNJRD15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0FSTV9USFVNQkVFIGlzIG5vdCBzZXQKK0NPTkZJR19TV1BfRU1VTEFURT15CisjIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9CUFJFRElDVF9ESVNBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19PVVRFUl9DQUNIRT15CitDT05GSUdfT1VURVJfQ0FDSEVfU1lOQz15CitDT05GSUdfQ0FDSEVfTDJYMD15CitDT05GSUdfQ0FDSEVfUEwzMTA9eQorQ09ORklHX0FSTV9MMV9DQUNIRV9TSElGVD01CitDT05GSUdfQVJNX0RNQV9NRU1fQlVGRkVSQUJMRT15CitDT05GSUdfQ1BVX0hBU19QTVU9eQorIyBDT05GSUdfQVJNX0VSUkFUQV80MzA5NzMgaXMgbm90IHNldAorIyBDT05GSUdfQVJNX0VSUkFUQV80NTg2OTMgaXMgbm90IHNldAorIyBDT05GSUdfQVJNX0VSUkFUQV80NjAwNzUgaXMgbm90IHNldAorIyBDT05GSUdfQVJNX0VSUkFUQV83NDIyMzAgaXMgbm90IHNldAorIyBDT05GSUdfQVJNX0VSUkFUQV83NDIyMzEgaXMgbm90IHNldAorQ09ORklHX1BMMzEwX0VSUkFUQV81ODgzNjk9eQorQ09ORklHX0FSTV9FUlJBVEFfNzIwNzg5PXkKK0NPTkZJR19QTDMxMF9FUlJBVEFfNzI3OTE1PXkKKyMgQ09ORklHX0FSTV9FUlJBVEFfNzQzNjIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSTV9FUlJBVEFfNzUxNDcyIGlzIG5vdCBzZXQKK0NPTkZJR19QTDMxMF9FUlJBVEFfNzUzOTcwPXkKKyMgQ09ORklHX0FSTV9FUlJBVEFfNzU0MzIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSTV9FUlJBVEFfNzU0MzI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSTV9FUlJBVEFfNzY0MzY5IGlzIG5vdCBzZXQKK0NPTkZJR19QTDMxMF9FUlJBVEFfNzY5NDE5PXkKK0NPTkZJR19BUk1fR0lDPXkKKworIworIyBCdXMgc3VwcG9ydAorIworIyBDT05GSUdfUENJX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CitDT05GSUdfU01QPXkKK0NPTkZJR19TTVBfT05fVVA9eQorQ09ORklHX0FSTV9DUFVfVE9QT0xPR1k9eQorIyBDT05GSUdfU0NIRURfTUMgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfU01UIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSTV9TQ1U9eQorQ09ORklHX0hBVkVfQVJNX1RXRD15CitDT05GSUdfVk1TUExJVF8zRz15CisjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKK0NPTkZJR19OUl9DUFVTPTIKKyMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NBTF9USU1FUlM9eQorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0xMDAKKyMgQ09ORklHX1RIVU1CMl9LRVJORUwgaXMgbm90IHNldAorIyBDT05GSUdfQUVBQkkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUwgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQVJDSF9QRk5fVkFMSUQ9eQorIyBDT05GSUdfSElHSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19IV19QRVJGX0VWRU5UUyBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKK0NPTkZJR19IQVZFX01FTUJMT0NLPXkKK0NPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQ9eQorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKyMgQ09ORklHX0NPTVBBQ1RJT04gaXMgbm90IHNldAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX1ZJUlRfVE9fQlVTPXkKKyMgQ09ORklHX0tTTSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSPTQwOTYKKyMgQ09ORklHX0NMRUFOQ0FDSEUgaXMgbm90IHNldAorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTEKK0NPTkZJR19BTElHTk1FTlRfVFJBUD15CisjIENPTkZJR19VQUNDRVNTX1dJVEhfTUVNQ1BZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAorIyBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfREVQUkVDQVRFRF9QQVJBTV9TVFJVQ1QgaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworIyBDT05GSUdfVVNFX09GIGlzIG5vdCBzZXQKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0wCitDT05GSUdfWkJPT1RfUk9NX0JTUz0wCitDT05GSUdfQ01ETElORT0iIgorIyBDT05GSUdfWElQX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9fWlJFTEFERFIgaXMgbm90IHNldAorCisjCisjIENQVSBQb3dlciBNYW5hZ2VtZW50CisjCisjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCisjIENPTkZJR19GUEVfTldGUEUgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorIyBDT05GSUdfVkZQIGlzIG5vdCBzZXQKKworIworIyBVc2Vyc3BhY2UgYmluYXJ5IGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FPVVQ9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1NVU1BFTkQgaXMgbm90IHNldAorIyBDT05GSUdfUE1fUlVOVElNRSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKKyMgQ09ORklHX0FSTV9DUFVfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVQgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKKyMgQ09ORklHX0RFVlRNUEZTIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTD15CitDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKKyMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19ERVZSRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xJUzNMVjAyRCBpcyBub3Qgc2V0CisjIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19TQ1NJX01PRD15CisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfU1BBUlNFS01BUCBpcyBub3Qgc2V0CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAorIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKKyMgQ09ORklHX0tFWUJPQVJEX0FEUDU1ODggaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfQURQNTU4OSBpcyBub3Qgc2V0CitDT05GSUdfS0VZQk9BUkRfQVRLQkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfUVQxMDcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1FUMjE2MCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9UQ0E2NDE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01BWDczNTkgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTUNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01QUjEyMSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfT1BFTkNPUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NUT1dBV0FZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfTU9VU0U9eQorQ09ORklHX01PVVNFX1BTMj15CitDT05GSUdfTU9VU0VfUFMyX0FMUFM9eQorQ09ORklHX01PVVNFX1BTMl9MT0dJUFMyUFA9eQorQ09ORklHX01PVVNFX1BTMl9TWU5BUFRJQ1M9eQorQ09ORklHX01PVVNFX1BTMl9UUkFDS1BPSU5UPXkKKyMgQ09ORklHX01PVVNFX1BTMl9FTEFOVEVDSCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9QUzJfU0VOVEVMSUMgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NFUklBTCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9WU1hYWEFBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1NZTkFQVElDU19JMkMgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKK0NPTkZJR19TRVJJT19TRVJQT1JUPXkKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX0FMVEVSQV9QUzIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fUFMyTVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19VTklYOThfUFRZUz15CisjIENPTkZJR19ERVZQVFNfTVVMVElQTEVfSU5TVEFOQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9TSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZLTUVNPXkKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0zMgorQ09ORklHX1NFUklBTF84MjUwX1JVTlRJTUVfVUFSVFM9NAorQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEPXkKK0NPTkZJR19TRVJJQUxfODI1MF9NQU5ZX1BPUlRTPXkKK0NPTkZJR19TRVJJQUxfODI1MF9TSEFSRV9JUlE9eQorIyBDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfUlNBPXkKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX1RJTUJFUkRBTEUgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0FMVEVSQV9KVEFHVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfQUxURVJBX1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX1hJTElOWF9QU19VQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hWQ19EQ0MgaXMgbm90IHNldAorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfUkFNT09QUyBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKKyMgQ09ORklHX0kyQ19DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0NIQVJERVYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX01VWCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfSEVMUEVSX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0kyQ19TTUJVUz15CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKK0NPTkZJR19JMkNfQUxHT0JJVD1tCisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CitDT05GSUdfSTJDX0FMR09QQ0E9bQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1BDQV9QTEFURk9STT1tCisjIENPTkZJR19JMkNfUFhBX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1NJTVRFQz1tCisjIENPTkZJR19JMkNfWElMSU5YIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCitDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQ9bQorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKworIworIyBQUFMgc3VwcG9ydAorIworIyBDT05GSUdfUFBTIGlzIG5vdCBzZXQKKworIworIyBQUFMgZ2VuZXJhdG9ycyBzdXBwb3J0CisjCisKKyMKKyMgUFRQIGNsb2NrIHN1cHBvcnQKKyMKKworIworIyBFbmFibGUgRGV2aWNlIERyaXZlcnMgLT4gUFBTIHRvIHNlZSB0aGUgUFRQIGNsb2NrIG9wdGlvbnMuCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisjIENPTkZJR19QT1dFUl9TVVBQTFkgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKK0NPTkZJR19TU0I9eQorIyBDT05GSUdfU1NCX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19CQ01BX1BPU1NJQkxFPXkKKworIworIyBCcm9hZGNvbSBzcGVjaWZpYyBBTUJBCisjCisjIENPTkZJR19CQ01BIGlzIG5vdCBzZXQKKworIworIyBNdWx0aWZ1bmN0aW9uIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NRkRfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfODhQTTg2MFggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjEwNVggaXMgbm90IHNldAorIyBDT05GSUdfVFBTNjUwN1ggaXMgbm90IHNldAorIyBDT05GSUdfVFdMNDAzMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TVE1QRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVEMzNTg5WCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CisjIENPTkZJR19QTUlDX0FEUDU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX01BWDg5MjUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX01BWDg5OTcgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX01BWDg5OTggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzFYX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004MzUwX0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004OTk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19BQlg1MDBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV0wxMjczX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfUkVHVUxBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FRElBX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKK0NPTkZJR19EUk09bQorIyBDT05GSUdfVkdBU1RBVEUgaXMgbm90IHNldAorQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MPW0KKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKK0NPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQorIyBDT05GSUdfTENEX0NMQVNTX0RFVklDRSBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CitDT05GSUdfQkFDS0xJR0hUX0dFTkVSSUM9eQorIyBDT05GSUdfQkFDS0xJR0hUX0FEUDg4NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkFDS0xJR0hUX0FEUDg4NzAgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19ESVNQTEFZX1NVUFBPUlQ9bQorCisjCisjIERpc3BsYXkgaGFyZHdhcmUgZHJpdmVycworIworIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAorQ09ORklHX1JUQ19MSUI9eQorIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19VSU8gaXMgbm90IHNldAorCisjCisjIFZpcnRpbyBkcml2ZXJzCisjCisjIENPTkZJR19WSVJUSU9fQkFMTE9PTiBpcyBub3Qgc2V0CisjIENPTkZJR19WSVJUSU9fTU1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBTcGlubG9jayBkcml2ZXJzCisjCitDT05GSUdfSU9NTVVfU1VQUE9SVD15CisjIENPTkZJR19WSVJUX0RSSVZFUlMgaXMgbm90IHNldAorIyBDT05GSUdfUE1fREVWRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CisjIENPTkZJR19GU05PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19ETk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRllfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GQU5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQUNUTCBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTNF9GUz15CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU1lTRlM9eQorIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfRklMRVNZU1RFTVMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1BSSU5US19USU1FPXkKK0NPTkZJR19ERUZBVUxUX01FU1NBR0VfTE9HTEVWRUw9NAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTIwNDgKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfVU5VU0VEX1NZTUJPTFM9eQorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0VDVElPTl9NSVNNQVRDSCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tVUF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVEVDVF9IVU5HX1RBU0sgaXMgbm90IHNldAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorQ09ORklHX1RJTUVSX1NUQVRTPXkKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VfUkNVX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0FUT01JQ19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0U9eQorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfVEVTVF9MSVNUX1NPUlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD02MAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVSX0NQVV9NQVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKK0NPTkZJR19OT1BfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfQ19SRUNPUkRNQ09VTlQ9eQorQ09ORklHX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19FVkVOVF9UUkFDSU5HPXkKK0NPTkZJR19FVkVOVF9QT1dFUl9UUkFDSU5HX0RFUFJFQ0FURUQ9eQorQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfVFJBQ0lORz15CitDT05GSUdfR0VORVJJQ19UUkFDRVI9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CitDT05GSUdfRlRSQUNFPXkKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQorIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMRV9BTExfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUklOR19CVUZGRVJfQkVOQ0hNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE9NSUM2NF9TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFU1RfS1NUUlRPWCBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJQ1RfREVWTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTEwgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfRE1FU0dfUkVTVFJJQ1QgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9TRUNVUklUWV9EQUM9eQorQ09ORklHX0RFRkFVTFRfU0VDVVJJVFk9IiIKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0JJVFJFVkVSU0U9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19DUkM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkM4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1haX0RFQyBpcyBub3Qgc2V0CisjIENPTkZJR19YWl9ERUNfQkNKIGlzIG5vdCBzZXQKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQorQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQ9eQorIyBDT05GSUdfQVZFUkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT1JESUMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jMmttZmNuZXZtX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYzJrbWZjbmV2bV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMmJiZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYzJrbWZjbmV2bV9kZWZjb25maWcKQEAgLTAsMCArMSwxMDQ3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGU7IERPIE5PVCBFRElULgorIyBMaW51eC9hcm0gMy4yLjIgS2VybmVsIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19BUk09eQorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKKyMgQ09ORklHX0FSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVD15CitDT05GSUdfS1RJTUVfU0NBTEFSPXkKK0NPTkZJR19IQVZFX1BST0NfQ1BVPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfQVJDSF9IQVNfQ1BVRlJFUT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfTkVFRF9ETUFfTUFQX1NUQVRFPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0FSTV9QQVRDSF9QSFlTX1ZJUlQ9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfSEFWRV9JUlFfV09SSz15CitDT05GSUdfSVJRX1dPUks9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0NST1NTX0NPTVBJTEU9IiIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk89eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk8gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSE9TVE5BTUU9Iihub25lKSIKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKKyMgQ09ORklHX0ZIQU5ETEUgaXMgbm90IHNldAorQ09ORklHX0hBVkVfR0VORVJJQ19IQVJESVJRUz15CisKKyMKKyMgSVJRIHN1YnN5c3RlbQorIworQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0hBVkVfU1BBUlNFX0lSUT15CitDT05GSUdfR0VORVJJQ19JUlFfU0hPVz15CitDT05GSUdfSVJRX0RPTUFJTj15CisjIENPTkZJR19TUEFSU0VfSVJRIGlzIG5vdCBzZXQKKworIworIyBSQ1UgU3Vic3lzdGVtCisjCitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE3CitDT05GSUdfQ0dST1VQUz15CisjIENPTkZJR19DR1JPVVBfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX0ZSRUVaRVIgaXMgbm90IHNldAorQ09ORklHX0NHUk9VUF9ERVZJQ0U9eQorQ09ORklHX0NQVVNFVFM9eQorQ09ORklHX1BST0NfUElEX0NQVVNFVD15CitDT05GSUdfQ0dST1VQX0NQVUFDQ1Q9eQorIyBDT05GSUdfUkVTT1VSQ0VfQ09VTlRFUlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX1BFUkYgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DR1JPVVAgaXMgbm90IHNldAorQ09ORklHX05BTUVTUEFDRVM9eQorQ09ORklHX1VUU19OUz15CitDT05GSUdfSVBDX05TPXkKK0NPTkZJR19VU0VSX05TPXkKK0NPTkZJR19QSURfTlM9eQorIyBDT05GSUdfU0NIRURfQVVUT0dST1VQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKK0NPTkZJR19SRUxBWT15CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRVhQRVJUIGlzIG5vdCBzZXQKK0NPTkZJR19VSUQxNj15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0FJTz15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CitDT05GSUdfUEVSRl9VU0VfVk1BTExPQz15CisKKyMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKKyMKK0NPTkZJR19QRVJGX0VWRU5UUz15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFUkZfVVNFX1ZNQUxMT0MgaXMgbm90IHNldAorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX1RSQUNFUE9JTlRTPXkKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKK0NPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15CitDT05GSUdfSEFWRV9SRUdTX0FORF9TVEFDS19BQ0NFU1NfQVBJPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVD15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFZFUlNJT05TPXkKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfU1RPUF9NQUNISU5FPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTR0xJQiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKKyMgQ09ORklHX0lOTElORV9TUElOX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0s9eQorIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLPXkKKyMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19CSCBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DSz15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorQ09ORklHX01VVEVYX1NQSU5fT05fT1dORVI9eQorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0NPTUNFUlRPPXkKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVhQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9CQ01SSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSElHSEJBTksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NOUzNYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9HRU1JTkkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QUklNQTIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RPVkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LSVJLV09PRCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xQQzMyWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NVjc4WFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01NUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tTODY5NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1c5MFg5MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9URUdSQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BJQ09YQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU00gaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSE1PQklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0M2NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzVQNjRYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1M1UEMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TNVBWMjEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVhZTk9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9UQ0NfOTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVTMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1U4NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTk9NQURJSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMQVRfU1BFQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WVDg1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9aWU5RIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfQklHX0VORElBTiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIE1NVQorIworCisjCisjIENvbWNlcnRvIEltcGxlbWVudGF0aW9uIE9wdGlvbnMKKyMKK0NPTkZJR19BUkNIX004NlhYWD15CisjIENPTkZJR19DMktfRVZNIGlzIG5vdCBzZXQKK0NPTkZJR19DMktfTUZDTl9FVk09eQorIyBDT05GSUdfQzJLX0FTSUMgaXMgbm90IHNldAorIyBDT05GSUdfUlRTTV9DMksgaXMgbm90IHNldAorQ09ORklHX01URF9DT01DRVJUT19OT1I9eQorQ09ORklHX0NPTUNFUlRPX1RETV9DTE9DSz15CisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorQ09ORklHX0NPTUNFUlRPX05VTV9QQ0lFUz0yCitDT05GSUdfQ09NQ0VSVE9fRlA9eQorIyBDT05GSUdfQ09NQ0VSVE9fVUFSVDBfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQ09NQ0VSVE9fVUFSVDFfU1VQUE9SVD15CitDT05GSUdfQ09NQ0VSVE9fVVNCMF9TVVBQT1JUPXkKKyMgQ09ORklHX0NPTUNFUlRPX1VTQjFfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQ09NQ0VSVE9fSVBTRUNfU1VQUE9SVD15CitDT05GSUdfQ09NQ0VSVE9fU1BJX1NVUFBPUlQ9eQorQ09ORklHX0NPTUNFUlRPX0ZBU1RfU1BJX1NVUFBPUlQ9eQorQ09ORklHX0NPTUNFUlRPX0kyQ19TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19EV19ETUFfU1VQUE9SVD15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfVjc9eQorQ09ORklHX0NQVV8zMnY2Sz15CitDT05GSUdfQ1BVXzMydjc9eQorQ09ORklHX0NQVV9BQlJUX0VWNz15CitDT05GSUdfQ1BVX1BBQlJUX1Y3PXkKK0NPTkZJR19DUFVfQ0FDSEVfVjc9eQorQ09ORklHX0NQVV9DQUNIRV9WSVBUPXkKK0NPTkZJR19DUFVfQ09QWV9WNj15CitDT05GSUdfQ1BVX1RMQl9WNz15CitDT05GSUdfQ1BVX0hBU19BU0lEPXkKK0NPTkZJR19DUFVfQ1AxNT15CitDT05GSUdfQ1BVX0NQMTVfTU1VPXkKKworIworIyBQcm9jZXNzb3IgRmVhdHVyZXMKKyMKK0NPTkZJR19BUk1fVEhVTUI9eQorIyBDT05GSUdfQVJNX1RIVU1CRUUgaXMgbm90IHNldAorIyBDT05GSUdfU1dQX0VNVUxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0lDQUNIRV9ESVNBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9EQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfQlBSRURJQ1RfRElTQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfT1VURVJfQ0FDSEU9eQorQ09ORklHX09VVEVSX0NBQ0hFX1NZTkM9eQorQ09ORklHX0NBQ0hFX0wyWDA9eQorQ09ORklHX0NBQ0hFX1BMMzEwPXkKK0NPTkZJR19BUk1fTDFfQ0FDSEVfU0hJRlQ9NQorQ09ORklHX0FSTV9ETUFfTUVNX0JVRkZFUkFCTEU9eQorQ09ORklHX0NQVV9IQVNfUE1VPXkKKyMgQ09ORklHX0FSTV9FUlJBVEFfNDMwOTczIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSTV9FUlJBVEFfNDU4NjkzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSTV9FUlJBVEFfNDYwMDc1IGlzIG5vdCBzZXQKK0NPTkZJR19BUk1fRVJSQVRBXzc0MjIzMD15CitDT05GSUdfQVJNX0VSUkFUQV83NDIyMzE9eQorQ09ORklHX1BMMzEwX0VSUkFUQV81ODgzNjk9eQorQ09ORklHX0FSTV9FUlJBVEFfNzIwNzg5PXkKK0NPTkZJR19QTDMxMF9FUlJBVEFfNzI3OTE1PXkKK0NPTkZJR19BUk1fRVJSQVRBXzc0MzYyMj15CitDT05GSUdfQVJNX0VSUkFUQV83NTE0NzI9eQorQ09ORklHX1BMMzEwX0VSUkFUQV83NTM5NzA9eQorQ09ORklHX0FSTV9FUlJBVEFfNzU0MzIyPXkKKyMgQ09ORklHX0FSTV9FUlJBVEFfNzU0MzI3IGlzIG5vdCBzZXQKK0NPTkZJR19BUk1fRVJSQVRBXzc2NDM2OT15CitDT05GSUdfUEwzMTBfRVJSQVRBXzc2OTQxOT15CitDT05GSUdfQVJNX0dJQz15CisKKyMKKyMgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDSV9TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIEZlYXR1cmVzCisjCitDT05GSUdfVElDS19PTkVTSE9UPXkKKyMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorQ09ORklHX1NNUD15CisjIENPTkZJR19TTVBfT05fVVAgaXMgbm90IHNldAorQ09ORklHX0FSTV9DUFVfVE9QT0xPR1k9eQorIyBDT05GSUdfU0NIRURfTUMgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfU01UIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSTV9TQ1U9eQorQ09ORklHX0hBVkVfQVJNX1RXRD15CitDT05GSUdfVk1TUExJVF8zRz15CisjIENPTkZJR19WTVNQTElUXzJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZNU1BMSVRfMUcgaXMgbm90IHNldAorQ09ORklHX1BBR0VfT0ZGU0VUPTB4QzAwMDAwMDAKK0NPTkZJR19OUl9DUFVTPTIKKyMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19MT0NBTF9USU1FUlM9eQorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0xMDAKKyMgQ09ORklHX1RIVU1CMl9LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0FFQUJJPXkKKyMgQ09ORklHX09BQklfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfUEZOX1ZBTElEPXkKKyMgQ09ORklHX0hJR0hNRU0gaXMgbm90IHNldAorQ09ORklHX0hXX1BFUkZfRVZFTlRTPXkKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX0hBVkVfTUVNQkxPQ0s9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfQ09NUEFDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfVklSVF9UT19CVVM9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgorIyBDT05GSUdfQ0xFQU5DQUNIRSBpcyBub3Qgc2V0CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMQorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKyMgQ09ORklHX1VBQ0NFU1NfV0lUSF9NRU1DUFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBSRUNBVEVEX1BBUkFNX1NUUlVDVCBpcyBub3Qgc2V0CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCisjIENPTkZJR19VU0VfT0YgaXMgbm90IHNldAorQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MDA2MDgwMDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTAKK0NPTkZJR19aQk9PVF9ST009eQorQ09ORklHX0NNRExJTkU9IiIKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorCisjCisjIENQVSBQb3dlciBNYW5hZ2VtZW50CisjCisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCisjIENPTkZJR19WRlAgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQU9VVD15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CisjIENPTkZJR19BUk1fQ1BVX1NVU1BFTkQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTV9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CitDT05GSUdfTVREX1JBTT15CitDT05GSUdfTVREX1JPTT15CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorIyBDT05GSUdfTVREX1BIWVNNQVBfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DRzMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIExQRERSIGZsYXNoIG1lbW9yeSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfTFBERFIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MSVMzTFYwMkQgaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTSV9NT0Q9eQorIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1NQQVJTRUtNQVAgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CisjIENPTkZJR19LRVlCT0FSRF9BRFA1NTg4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0FEUDU1ODkgaXMgbm90IHNldAorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1FUMTA3MCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9RVDIxNjAgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfVENBNjQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQVg3MzU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01DUyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NUFIxMjEgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorQ09ORklHX01PVVNFX1BTMl9BTFBTPXkKK0NPTkZJR19NT1VTRV9QUzJfTE9HSVBTMlBQPXkKK0NPTkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKK0NPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CisjIENPTkZJR19NT1VTRV9QUzJfRUxBTlRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfUFMyX1NFTlRFTElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9TWU5BUFRJQ1NfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19BTFRFUkFfUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BTMk1VTFQgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfU0lOSyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MzIKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CitDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUz15CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX1JTQT15CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9USU1CRVJEQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9BTFRFUkFfSlRBR1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0FMVEVSQV9VQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9YSUxJTlhfUFNfVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVkNfRENDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBTU9PUFMgaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CisjIENPTkZJR19JMkNfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19NVVggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0hFTFBFUl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfU01CVVM9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9bQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorQ09ORklHX0kyQ19BTEdPUENBPW0KKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKK0NPTkZJR19JMkNfQ09NQ0VSVE89eQorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1BDQV9QTEFURk9STT1tCisjIENPTkZJR19JMkNfUFhBX1BDSSBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1NJTVRFQz1tCisjIENPTkZJR19JMkNfWElMSU5YIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCitDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQ9bQorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKK0NPTkZJR19TUElfTVNQRD15CitDT05GSUdfQ09NQ0VSVE9fU1BJPXkKKworIworIyBNaXNjZWxsYW5lb3VzIEkyQyBDaGlwIHN1cHBvcnQKKyMKK0NPTkZJR19FRVBST01fQVQ9eQorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIGdlbmVyYXRvcnMgc3VwcG9ydAorIworCisjCisjIFBUUCBjbG9jayBzdXBwb3J0CisjCisKKyMKKyMgRW5hYmxlIERldmljZSBEcml2ZXJzIC0+IFBQUyB0byBzZWUgdGhlIFBUUCBjbG9jayBvcHRpb25zLgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCPXkKKyMgQ09ORklHX1NTQl9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQkNNQV9QT1NTSUJMRT15CisKKyMKKyMgQnJvYWRjb20gc3BlY2lmaWMgQU1CQQorIworIyBDT05GSUdfQkNNQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEXzg4UE04NjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzYxMDVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzY1MDdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXTDQwMzBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU1RNUEUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDMzU4OVggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAorIyBDT05GSUdfUE1JQ19BRFA1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQVg4OTI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQVg4OTk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQVg4OTk4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODMxWF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODk5NCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAorIyBDT05GSUdfQUJYNTAwX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dMMTI3M19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRFJNPW0KKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKKyMgQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQorQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9BRFA4ODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9BRFA4ODcwIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfRElTUExBWV9TVVBQT1JUPW0KKworIworIyBEaXNwbGF5IGhhcmR3YXJlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBWaXJ0aW8gZHJpdmVycworIworIyBDT05GSUdfVklSVElPX0JBTExPT04gaXMgbm90IHNldAorIyBDT05GSUdfVklSVElPX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU3BpbmxvY2sgZHJpdmVycworIworQ09ORklHX0lPTU1VX1NVUFBPUlQ9eQorIyBDT05GSUdfVklSVF9EUklWRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX0RFVkZSRVEgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfRlNOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkFOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEFDVEwgaXMgbm90IHNldAorQ09ORklHX0FVVE9GUzRfRlM9eQorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MQorIyBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfU1VNTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKKyMgQ09ORklHX0pGRlMyX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfTE9HRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NRVUFTSEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19QU1RPUkUgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1BSSU5US19USU1FPXkKK0NPTkZJR19ERUZBVUxUX01FU1NBR0VfTE9HTEVWRUw9NAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTIwNDgKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfVU5VU0VEX1NZTUJPTFM9eQorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0VDVElPTl9NSVNNQVRDSCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tVUF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVEVDVF9IVU5HX1RBU0sgaXMgbm90IHNldAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorQ09ORklHX1RJTUVSX1NUQVRTPXkKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VfUkNVX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0FUT01JQ19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0U9eQorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfVEVTVF9MSVNUX1NPUlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD02MAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVSX0NQVV9NQVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKK0NPTkZJR19OT1BfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfQ19SRUNPUkRNQ09VTlQ9eQorQ09ORklHX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19FVkVOVF9UUkFDSU5HPXkKK0NPTkZJR19FVkVOVF9QT1dFUl9UUkFDSU5HX0RFUFJFQ0FURUQ9eQorQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfVFJBQ0lORz15CitDT05GSUdfR0VORVJJQ19UUkFDRVI9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CitDT05GSUdfRlRSQUNFPXkKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQorIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMRV9BTExfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUklOR19CVUZGRVJfQkVOQ0hNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE9NSUM2NF9TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFU1RfS1NUUlRPWCBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJQ1RfREVWTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSTV9VTldJTkQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MTCBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9ETUVTR19SRVNUUklDVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15CitDT05GSUdfREVGQVVMVF9TRUNVUklUWT0iIgorIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5BUllfUFJJTlRGPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzggaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKKyMgQ09ORklHX1haX0RFQyBpcyBub3Qgc2V0CisjIENPTkZJR19YWl9ERUNfQkNKIGlzIG5vdCBzZXQKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQorIyBDT05GSUdfQVZFUkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT1JESUMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9jMmtydHNtX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvYzJrcnRzbV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3ZjM5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvYzJrcnRzbV9kZWZjb25maWcKQEAgLTAsMCArMSwxMDM0IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZpbGU7IERPIE5PVCBFRElULgorIyBMaW51eC9hcm0gMy4yLjIgS2VybmVsIENvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19BUk09eQorQ09ORklHX1NZU19TVVBQT1JUU19BUE1fRU1VTEFUSU9OPXkKKyMgQ09ORklHX0FSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVD15CitDT05GSUdfS1RJTUVfU0NBTEFSPXkKK0NPTkZJR19IQVZFX1BST0NfQ1BVPXkKK0NPTkZJR19TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX0xPQ0tERVBfU1VQUE9SVD15CitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CitDT05GSUdfSEFSRElSUVNfU1dfUkVTRU5EPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfQVJDSF9IQVNfQ1BVRlJFUT15CitDT05GSUdfQVJDSF9IQVNfQ1BVX0lETEVfV0FJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfTkVFRF9ETUFfTUFQX1NUQVRFPXkKK0NPTkZJR19WRUNUT1JTX0JBU0U9MHhmZmZmMDAwMAorQ09ORklHX0FSTV9QQVRDSF9QSFlTX1ZJUlQ9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19ERUZDT05GSUdfTElTVD0iL2xpYi9tb2R1bGVzLyRVTkFNRV9SRUxFQVNFLy5jb25maWciCitDT05GSUdfSEFWRV9JUlFfV09SSz15CitDT05GSUdfSVJRX1dPUks9eQorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0NST1NTX0NPTVBJTEU9IiIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk89eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk8gaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSE9TVE5BTUU9Iihub25lKSIKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKKyMgQ09ORklHX0ZIQU5ETEUgaXMgbm90IHNldAorQ09ORklHX0hBVkVfR0VORVJJQ19IQVJESVJRUz15CisKKyMKKyMgSVJRIHN1YnN5c3RlbQorIworQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0hBVkVfU1BBUlNFX0lSUT15CitDT05GSUdfR0VORVJJQ19JUlFfU0hPVz15CitDT05GSUdfSVJRX0RPTUFJTj15CisjIENPTkZJR19TUEFSU0VfSVJRIGlzIG5vdCBzZXQKKworIworIyBSQ1UgU3Vic3lzdGVtCisjCitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE3CitDT05GSUdfQ0dST1VQUz15CisjIENPTkZJR19DR1JPVVBfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX0ZSRUVaRVIgaXMgbm90IHNldAorQ09ORklHX0NHUk9VUF9ERVZJQ0U9eQorQ09ORklHX0NQVVNFVFM9eQorQ09ORklHX1BST0NfUElEX0NQVVNFVD15CitDT05GSUdfQ0dST1VQX0NQVUFDQ1Q9eQorIyBDT05GSUdfUkVTT1VSQ0VfQ09VTlRFUlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX1BFUkYgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DR1JPVVAgaXMgbm90IHNldAorQ09ORklHX05BTUVTUEFDRVM9eQorQ09ORklHX1VUU19OUz15CitDT05GSUdfSVBDX05TPXkKK0NPTkZJR19VU0VSX05TPXkKK0NPTkZJR19QSURfTlM9eQorIyBDT05GSUdfU0NIRURfQVVUT0dST1VQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKK0NPTkZJR19SRUxBWT15CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX1NZU0NUTD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQorIyBDT05GSUdfRVhQRVJUIGlzIG5vdCBzZXQKK0NPTkZJR19VSUQxNj15CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0FJTz15CisjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9QRVJGX0VWRU5UUz15CitDT05GSUdfUEVSRl9VU0VfVk1BTExPQz15CisKKyMKKyMgS2VybmVsIFBlcmZvcm1hbmNlIEV2ZW50cyBBbmQgQ291bnRlcnMKKyMKK0NPTkZJR19QRVJGX0VWRU5UUz15CisjIENPTkZJR19QRVJGX0NPVU5URVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFUkZfVVNFX1ZNQUxMT0MgaXMgbm90IHNldAorQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorQ09ORklHX1RSQUNFUE9JTlRTPXkKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKKyMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKK0NPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15CitDT05GSUdfSEFWRV9SRUdTX0FORF9TVEFDS19BQ0NFU1NfQVBJPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVD15CisKKyMKKyMgR0NPVi1iYXNlZCBrZXJuZWwgcHJvZmlsaW5nCisjCisjIENPTkZJR19HQ09WX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfU0xBQklORk89eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX0JBU0VfU01BTEw9MAorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAorQ09ORklHX01PRFZFUlNJT05TPXkKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfU1RPUF9NQUNISU5FPXkKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTR0xJQiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CitDT05GSUdfSU9TQ0hFRF9ERUFETElORT15CitDT05GSUdfSU9TQ0hFRF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9DRlE9eQorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImNmcSIKKyMgQ09ORklHX0lOTElORV9TUElOX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fVFJZTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfU1BJTl9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9TUElOX0xPQ0tfQkggaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1NQSU5fTE9DS19JUlFTQVZFIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0s9eQorIyBDT05GSUdfSU5MSU5FX1NQSU5fVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfU1BJTl9VTkxPQ0tfSVJRPXkKKyMgQ09ORklHX0lOTElORV9TUElOX1VOTE9DS19JUlFSRVNUT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX1RSWUxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1JFQURfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfUkVBRF9MT0NLX0JIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOTElORV9SRUFEX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLPXkKKyMgQ09ORklHX0lOTElORV9SRUFEX1VOTE9DS19CSCBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1JFQURfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfUkVBRF9VTkxPQ0tfSVJRUkVTVE9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVFJZTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19CSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkxJTkVfV1JJVEVfTE9DS19JUlEgaXMgbm90IHNldAorIyBDT05GSUdfSU5MSU5FX1dSSVRFX0xPQ0tfSVJRU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfSU5MSU5FX1dSSVRFX1VOTE9DSz15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0JIIGlzIG5vdCBzZXQKK0NPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUT15CisjIENPTkZJR19JTkxJTkVfV1JJVEVfVU5MT0NLX0lSUVJFU1RPUkUgaXMgbm90IHNldAorQ09ORklHX01VVEVYX1NQSU5fT05fT1dORVI9eQorIyBDT05GSUdfRlJFRVpFUiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIFR5cGUKKyMKK0NPTkZJR19NTVU9eQorIyBDT05GSUdfQVJDSF9JTlRFR1JBVE9SIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0NPTUNFUlRPPXkKKyMgQ09ORklHX0FSQ0hfUkVBTFZJRVcgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVJTQVRJTEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WRVhQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9CQ01SSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSElHSEJBTksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NOUzNYWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9HRU1JTkkgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QUklNQTIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01YUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDEzWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzMlggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JT1AzM1ggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSVhQMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RPVkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9LSVJLV09PRCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xQQzMyWFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NVjc4WFgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfT1JJT041WCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX01NUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0tTODY5NSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1c5MFg5MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9URUdSQSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BJQ09YQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1BOWDQwMDggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEEgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9NU00gaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSE1PQklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TM0M2NFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfUzVQNjRYMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1M1UEMxMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TNVBWMjEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVhZTk9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0hBUksgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9UQ0NfOTI2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfVTMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1U4NTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTk9NQURJSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RBVklOQ0kgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BMQVRfU1BFQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9WVDg1MDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9aWU5RIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfQklHX0VORElBTiBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIE1NVQorIworCisjCisjIENvbWNlcnRvIEltcGxlbWVudGF0aW9uIE9wdGlvbnMKKyMKK0NPTkZJR19BUkNIX004NlhYWD15CisjIENPTkZJR19DMktfRVZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0MyS19BU0lDIGlzIG5vdCBzZXQKK0NPTkZJR19SVFNNX0MySz15CitDT05GSUdfTVREX0NPTUNFUlRPX05PUj15CitDT05GSUdfQ09NQ0VSVE9fVERNX0NMT0NLPXkKK0NPTkZJR19DT01DRVJUT19OVU1fUENJRVM9MgorQ09ORklHX0NPTUNFUlRPX0ZQPXkKKyMgQ09ORklHX0NPTUNFUlRPX1VBUlQwX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0NPTUNFUlRPX1VBUlQxX1NVUFBPUlQ9eQorQ09ORklHX0NPTUNFUlRPX1VTQjBfU1VQUE9SVD15CisjIENPTkZJR19DT01DRVJUT19VU0IxX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0NPTUNFUlRPX0lQU0VDX1NVUFBPUlQ9eQorQ09ORklHX0NPTUNFUlRPX1NQSV9TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19GQVNUX1NQSV9TVVBQT1JUPXkKK0NPTkZJR19DT01DRVJUT19JMkNfU1VQUE9SVD15CitDT05GSUdfQ09NQ0VSVE9fRFdfRE1BX1NVUFBPUlQ9eQorCisjCisjIFByb2Nlc3NvciBUeXBlCisjCitDT05GSUdfQ1BVX1Y3PXkKK0NPTkZJR19DUFVfMzJ2Nks9eQorQ09ORklHX0NQVV8zMnY3PXkKK0NPTkZJR19DUFVfQUJSVF9FVjc9eQorQ09ORklHX0NQVV9QQUJSVF9WNz15CitDT05GSUdfQ1BVX0NBQ0hFX1Y3PXkKK0NPTkZJR19DUFVfQ0FDSEVfVklQVD15CitDT05GSUdfQ1BVX0NPUFlfVjY9eQorQ09ORklHX0NQVV9UTEJfVjc9eQorQ09ORklHX0NQVV9IQVNfQVNJRD15CitDT05GSUdfQ1BVX0NQMTU9eQorQ09ORklHX0NQVV9DUDE1X01NVT15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCitDT05GSUdfQVJNX1RIVU1CPXkKKyMgQ09ORklHX0FSTV9USFVNQkVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXUF9FTVVMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9JQ0FDSEVfRElTQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRENBQ0hFX0RJU0FCTEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0JQUkVESUNUX0RJU0FCTEUgaXMgbm90IHNldAorQ09ORklHX09VVEVSX0NBQ0hFPXkKK0NPTkZJR19PVVRFUl9DQUNIRV9TWU5DPXkKK0NPTkZJR19DQUNIRV9MMlgwPXkKK0NPTkZJR19DQUNIRV9QTDMxMD15CitDT05GSUdfQVJNX0wxX0NBQ0hFX1NISUZUPTUKK0NPTkZJR19BUk1fRE1BX01FTV9CVUZGRVJBQkxFPXkKK0NPTkZJR19DUFVfSEFTX1BNVT15CisjIENPTkZJR19BUk1fRVJSQVRBXzQzMDk3MyBpcyBub3Qgc2V0CisjIENPTkZJR19BUk1fRVJSQVRBXzQ1ODY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19BUk1fRVJSQVRBXzQ2MDA3NSBpcyBub3Qgc2V0CitDT05GSUdfQVJNX0VSUkFUQV83NDIyMzA9eQorQ09ORklHX0FSTV9FUlJBVEFfNzQyMjMxPXkKK0NPTkZJR19QTDMxMF9FUlJBVEFfNTg4MzY5PXkKK0NPTkZJR19BUk1fRVJSQVRBXzcyMDc4OT15CitDT05GSUdfUEwzMTBfRVJSQVRBXzcyNzkxNT15CitDT05GSUdfQVJNX0VSUkFUQV83NDM2MjI9eQorQ09ORklHX0FSTV9FUlJBVEFfNzUxNDcyPXkKK0NPTkZJR19QTDMxMF9FUlJBVEFfNzUzOTcwPXkKK0NPTkZJR19BUk1fRVJSQVRBXzc1NDMyMj15CisjIENPTkZJR19BUk1fRVJSQVRBXzc1NDMyNyBpcyBub3Qgc2V0CitDT05GSUdfQVJNX0VSUkFUQV83NjQzNjk9eQorQ09ORklHX1BMMzEwX0VSUkFUQV83Njk0MTk9eQorQ09ORklHX0FSTV9HSUM9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19QQ0lfU1lTQ0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBGZWF0dXJlcworIworQ09ORklHX1RJQ0tfT05FU0hPVD15CisjIENPTkZJR19OT19IWiBpcyBub3Qgc2V0CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKK0NPTkZJR19TTVA9eQorIyBDT05GSUdfU01QX09OX1VQIGlzIG5vdCBzZXQKK0NPTkZJR19BUk1fQ1BVX1RPUE9MT0dZPXkKKyMgQ09ORklHX1NDSEVEX01DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1NNVCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUk1fU0NVPXkKK0NPTkZJR19IQVZFX0FSTV9UV0Q9eQorQ09ORklHX1ZNU1BMSVRfM0c9eQorIyBDT05GSUdfVk1TUExJVF8yRyBpcyBub3Qgc2V0CisjIENPTkZJR19WTVNQTElUXzFHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUdFX09GRlNFVD0weEMwMDAwMDAwCitDT05GSUdfTlJfQ1BVUz0yCisjIENPTkZJR19IT1RQTFVHX0NQVSBpcyBub3Qgc2V0CitDT05GSUdfTE9DQUxfVElNRVJTPXkKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCisjIENPTkZJR19USFVNQjJfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19BRUFCST15CisjIENPTkZJR19PQUJJX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NQQVJTRU1FTV9ERUZBVUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTCBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX1BGTl9WQUxJRD15CisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX0hBVkVfTUVNQkxPQ0s9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfQ09NUEFDVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfVklSVF9UT19CVVM9eQorIyBDT05GSUdfS1NNIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI9NDA5NgorIyBDT05GSUdfQ0xFQU5DQUNIRSBpcyBub3Qgc2V0CitDT05GSUdfRk9SQ0VfTUFYX1pPTkVPUkRFUj0xMQorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKyMgQ09ORklHX1VBQ0NFU1NfV0lUSF9NRU1DUFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBSRUNBVEVEX1BBUkFNX1NUUlVDVCBpcyBub3Qgc2V0CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCisjIENPTkZJR19VU0VfT0YgaXMgbm90IHNldAorQ09ORklHX1pCT09UX1JPTV9URVhUPTB4MDA2MDgwMDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTAKK0NPTkZJR19aQk9PVF9ST009eQorQ09ORklHX0NNRExJTkU9IiIKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorCisjCisjIENQVSBQb3dlciBNYW5hZ2VtZW50CisjCisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CisKKyMKKyMgRmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uCisjCisKKyMKKyMgQXQgbGVhc3Qgb25lIGVtdWxhdGlvbiBtdXN0IGJlIHNlbGVjdGVkCisjCisjIENPTkZJR19WRlAgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQ09SRV9EVU1QX0RFRkFVTFRfRUxGX0hFQURFUlMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfQU9VVD15CisjIENPTkZJR19CSU5GTVRfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zCisjCisjIENPTkZJR19TVVNQRU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX1JVTlRJTUUgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CisjIENPTkZJR19BUk1fQ1BVX1NVU1BFTkQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCisjIENPTkZJR19ERVZUTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfREVWUkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX1RFU1RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9SRURCT09UX1BBUlRTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ01ETElORV9QQVJUUz15CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUjdfUEFSVFMgaXMgbm90IHNldAorCisjCisjIFVzZXIgTW9kdWxlcyBBbmQgVHJhbnNsYXRpb24gTGF5ZXJzCisjCitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTEtERVZTPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19TU0ZEQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTV9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0lOVEVMRVhUPXkKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CitDT05GSUdfTVREX1JBTT15CitDT05GSUdfTVREX1JPTT15CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorIyBDT05GSUdfTVREX1BIWVNNQVBfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DRzMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIExQRERSIGZsYXNoIG1lbW9yeSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfTFBERFIgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1VCSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MSVMzTFYwMkQgaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfU0NTSV9NT0Q9eQorIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorIyBDT05GSUdfSU5QVVRfRkZfTUVNTEVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9QT0xMREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1NQQVJTRUtNQVAgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKK0NPTkZJR19JTlBVVF9NT1VTRURFVj15CitDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKK0NPTkZJR19JTlBVVF9LRVlCT0FSRD15CisjIENPTkZJR19LRVlCT0FSRF9BRFA1NTg4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0FEUDU1ODkgaXMgbm90IHNldAorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1FUMTA3MCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9RVDIxNjAgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfVENBNjQxNiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NQVg3MzU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX01DUyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9NUFIxMjEgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX09QRU5DT1JFUyBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFPXkKK0NPTkZJR19NT1VTRV9QUzI9eQorQ09ORklHX01PVVNFX1BTMl9BTFBTPXkKK0NPTkZJR19NT1VTRV9QUzJfTE9HSVBTMlBQPXkKK0NPTkZJR19NT1VTRV9QUzJfU1lOQVBUSUNTPXkKK0NPTkZJR19NT1VTRV9QUzJfVFJBQ0tQT0lOVD15CisjIENPTkZJR19NT1VTRV9QUzJfRUxBTlRFQ0ggaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfUFMyX1NFTlRFTElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9TRVJJQUwgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfVlNYWFhBQSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VTRV9TWU5BUFRJQ1NfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RBQkxFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fU0VSUE9SVD15CitDT05GSUdfU0VSSU9fTElCUFMyPXkKKyMgQ09ORklHX1NFUklPX1JBVyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19BTFRFUkFfUFMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPX1BTMk1VTFQgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfU0lOSyBpcyBub3Qgc2V0CitDT05GSUdfREVWS01FTT15CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfTlJfVUFSVFM9MzIKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CitDT05GSUdfU0VSSUFMXzgyNTBfTUFOWV9QT1JUUz15CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKKyMgQ09ORklHX1NFUklBTF84MjUwX0RFVEVDVF9JUlEgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwX1JTQT15CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9USU1CRVJEQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9BTFRFUkFfSlRBR1VBUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX0FMVEVSQV9VQVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9YSUxJTlhfUFNfVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVkNfRENDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBTU9PUFMgaXMgbm90IHNldAorQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0JPQVJESU5GTz15CisjIENPTkZJR19JMkNfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19DSEFSREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19NVVggaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0hFTFBFUl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfU01CVVM9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCitDT05GSUdfSTJDX0FMR09CSVQ9bQorIyBDT05GSUdfSTJDX0FMR09QQ0YgaXMgbm90IHNldAorQ09ORklHX0kyQ19BTEdPUENBPW0KKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19QQ0FfUExBVEZPUk09bQorIyBDT05GSUdfSTJDX1BYQV9QQ0kgaXMgbm90IHNldAorQ09ORklHX0kyQ19TSU1URUM9bQorIyBDT05GSUdfSTJDX1hJTElOWCBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUPW0KKyMgQ09ORklHX0kyQ19UQU9TX0VWTSBpcyBub3Qgc2V0CisKKyMKKyMgT3RoZXIgSTJDL1NNQnVzIGJ1cyBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BQUyBpcyBub3Qgc2V0CisKKyMKKyMgUFBTIGdlbmVyYXRvcnMgc3VwcG9ydAorIworCisjCisjIFBUUCBjbG9jayBzdXBwb3J0CisjCisKKyMKKyMgRW5hYmxlIERldmljZSBEcml2ZXJzIC0+IFBQUyB0byBzZWUgdGhlIFBUUCBjbG9jayBvcHRpb25zLgorIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCitDT05GSUdfU1NCPXkKKyMgQ09ORklHX1NTQl9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQkNNQV9QT1NTSUJMRT15CisKKyMKKyMgQnJvYWRjb20gc3BlY2lmaWMgQU1CQQorIworIyBDT05GSUdfQkNNQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEXzg4UE04NjBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzYxMDVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzY1MDdYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXTDQwMzBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfU1RNUEUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RDMzU4OVggaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1RNSU8gaXMgbm90IHNldAorIyBDT05GSUdfUE1JQ19EQTkwM1ggaXMgbm90IHNldAorIyBDT05GSUdfUE1JQ19BRFA1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQVg4OTI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQVg4OTk3IGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9NQVg4OTk4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODMxWF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODk5NCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfUENGNTA2MzMgaXMgbm90IHNldAorIyBDT05GSUdfQUJYNTAwX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dMMTI3M19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NRURJQV9TVVBQT1JUIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCitDT05GSUdfRFJNPW0KKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTD1tCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CitDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKKyMgQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldAorQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQorQ09ORklHX0JBQ0tMSUdIVF9HRU5FUklDPXkKKyMgQ09ORklHX0JBQ0tMSUdIVF9BRFA4ODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9BRFA4ODcwIGlzIG5vdCBzZXQKKworIworIyBEaXNwbGF5IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfRElTUExBWV9TVVBQT1JUPW0KKworIworIyBEaXNwbGF5IGhhcmR3YXJlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAorIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKKworIworIyBWaXJ0aW8gZHJpdmVycworIworIyBDT05GSUdfVklSVElPX0JBTExPT04gaXMgbm90IHNldAorIyBDT05GSUdfVklSVElPX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgU3BpbmxvY2sgZHJpdmVycworIworQ09ORklHX0lPTU1VX1NVUFBPUlQ9eQorIyBDT05GSUdfVklSVF9EUklWRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX0RFVkZSRVEgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CVFJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfRlNOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZX1VTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkFOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEFDVEwgaXMgbm90IHNldAorQ09ORklHX0FVVE9GUzRfRlM9eQorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX1NZU0NUTD15CitDT05GSUdfUFJPQ19QQUdFX01PTklUT1I9eQorQ09ORklHX1NZU0ZTPXkKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTUlTQ19GSUxFU1lTVEVNUz15CisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MQorIyBDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVIgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfU1VNTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKKyMgQ09ORklHX0pGRlMyX0xaTyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfTE9HRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NRVUFTSEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19QU1RPUkUgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1BSSU5US19USU1FPXkKK0NPTkZJR19ERUZBVUxUX01FU1NBR0VfTE9HTEVWRUw9NAorQ09ORklHX0VOQUJMRV9XQVJOX0RFUFJFQ0FURUQ9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKK0NPTkZJR19GUkFNRV9XQVJOPTIwNDgKK0NPTkZJR19NQUdJQ19TWVNSUT15CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CitDT05GSUdfVU5VU0VEX1NZTUJPTFM9eQorQ09ORklHX0RFQlVHX0ZTPXkKKyMgQ09ORklHX0hFQURFUlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0VDVElPTl9NSVNNQVRDSCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKKyMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQ0tVUF9ERVRFQ1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVEVDVF9IVU5HX1RBU0sgaXMgbm90IHNldAorQ09ORklHX1NDSEVEX0RFQlVHPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorQ09ORklHX1RJTUVSX1NUQVRTPXkKKyMgQ09ORklHX0RFQlVHX09CSkVDVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LTUVNTEVBSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SVF9NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUX01VVEVYX1RFU1RFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NVVRFWEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfUFJPVkVfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VfUkNVX1BPSU5URVIgaXMgbm90IHNldAorIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0FUT01JQ19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0U9eQorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CisjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1ZNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1dSSVRFQ09VTlQgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX01FTU9SWV9JTklUPXkKKyMgQ09ORklHX0RFQlVHX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfVEVTVF9MSVNUX1NPUlQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU0cgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTk9USUZJRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0NSRURFTlRJQUxTIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9QT0lOVEVSPXkKKyMgQ09ORklHX0JPT1RfUFJJTlRLX0RFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD02MAorIyBDT05GSUdfQkFDS1RSQUNFX1NFTEZfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVSX0NQVV9NQVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xLRFRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKK0NPTkZJR19OT1BfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX0hBVkVfQ19SRUNPUkRNQ09VTlQ9eQorQ09ORklHX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19FVkVOVF9UUkFDSU5HPXkKK0NPTkZJR19FVkVOVF9QT1dFUl9UUkFDSU5HX0RFUFJFQ0FURUQ9eQorQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUj15CitDT05GSUdfVFJBQ0lORz15CitDT05GSUdfR0VORVJJQ19UUkFDRVI9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CitDT05GSUdfRlRSQUNFPXkKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX0JSQU5DSF9QUk9GSUxFX05PTkU9eQorIyBDT05GSUdfUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfUFJPRklMRV9BTExfQlJBTkNIRVMgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfUklOR19CVUZGRVJfQkVOQ0hNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19BVE9NSUM2NF9TRUxGVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFU1RfS1NUUlRPWCBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJQ1RfREVWTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSTV9VTldJTkQgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19MTCBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9ETUVTR19SRVNUUklDVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1NFQ1VSSVRZX0RBQz15CitDT05GSUdfREVGQVVMVF9TRUNVUklUWT0iIgorIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5BUllfUFJJTlRGPXkKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCitDT05GSUdfQklUUkVWRVJTRT15CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzggaXMgbm90IHNldAorQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfWkxJQl9ERUZMQVRFPXkKKyMgQ09ORklHX1haX0RFQyBpcyBub3Qgc2V0CisjIENPTkZJR19YWl9ERUNfQkNKIGlzIG5vdCBzZXQKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQorIyBDT05GSUdfQVZFUkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19DT1JESUMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdG9taWMuaAppbmRleCA4Njk3NmQwLi4yOTNmYWJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMjksNiArMjksMjcgQEAKIAogI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CiAKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fWk9ORV9ETUFfTkNOQgorCitpbnQgY29tY2VydG9fYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKnYpOworaW50IGNvbWNlcnRvX2F0b21pY19jbXB4Y2hnKGF0b21pY190ICp2LCBpbnQgb2xkLCBpbnQgbmV3KTsKK3ZvaWQgY29tY2VydG9fYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgbG9uZyBtYXNrLCB1bnNpZ25lZCBsb25nICphZGRyKTsKKworCitzdHJ1Y3QgdmlydHVhbF96b25lIHsKKwl2b2lkICpzdGFydDsKKwl2b2lkICplbmQ7Cit9OworCitleHRlcm4gc3RydWN0IHZpcnR1YWxfem9uZSBhcm1fZG1hX3pvbmU7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19kbWFfem9uZV92aXJ0dWFsX2FkZHJlc3Modm9pZCAqYWRkcikKK3sKKwlyZXR1cm4gKChhZGRyIDwgYXJtX2RtYV96b25lLmVuZCkgJiYgKGFkZHIgPj0gYXJtX2RtYV96b25lLnN0YXJ0KSk7Cit9CisKKyNlbmRpZgorCiAvKgogICogQVJNdjYgVVAgYW5kIFNNUCBzYWZlIGF0b21pYyBvcHMuICBXZSB1c2UgbG9hZCBleGNsdXNpdmUgYW5kCiAgKiBzdG9yZSBleGNsdXNpdmUgdG8gZW5zdXJlIHRoYXQgdGhlc2UgYXJlIGF0b21pYy4gIFdlIG1heSBsb29wCkBAIC0zOSw2ICs2MCwxMyBAQAogCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXN1bHQ7CiAKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fWk9ORV9ETUFfTkNOQgorCWlmICh1bmxpa2VseShpc19kbWFfem9uZV92aXJ0dWFsX2FkZHJlc3ModikpKSB7CisJCWNvbWNlcnRvX2F0b21pY19hZGQoaSwgdik7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwogCV9fYXNtX18gX192b2xhdGlsZV9fKCJAIGF0b21pY19hZGRcbiIKICIxOglsZHJleAklMCwgWyUzXVxuIgogIglhZGQJJTAsICUwLCAlNFxuIgpAQCAtNTUsNiArODMsMTEgQEAKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAlpbnQgcmVzdWx0OwogCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1pPTkVfRE1BX05DTkIKKwlpZiAodW5saWtlbHkoaXNfZG1hX3pvbmVfdmlydHVhbF9hZGRyZXNzKHYpKSkKKwkJcmV0dXJuIGNvbWNlcnRvX2F0b21pY19hZGQoaSwgdik7CisjZW5kaWYKKwogCXNtcF9tYigpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIkAgYXRvbWljX2FkZF9yZXR1cm5cbiIKQEAgLTc3LDYgKzExMCwxMyBAQAogCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXN1bHQ7CiAKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fWk9ORV9ETUFfTkNOQgorCWlmICh1bmxpa2VseShpc19kbWFfem9uZV92aXJ0dWFsX2FkZHJlc3ModikpKSB7CisJCWNvbWNlcnRvX2F0b21pY19hZGQoLWksIHYpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygiQCBhdG9taWNfc3ViXG4iCiAiMToJbGRyZXgJJTAsIFslM11cbiIKICIJc3ViCSUwLCAlMCwgJTRcbiIKQEAgLTkzLDYgKzEzMywxMSBAQAogCXVuc2lnbmVkIGxvbmcgdG1wOwogCWludCByZXN1bHQ7CiAKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fWk9ORV9ETUFfTkNOQgorCWlmICh1bmxpa2VseShpc19kbWFfem9uZV92aXJ0dWFsX2FkZHJlc3ModikpKQorCQlyZXR1cm4gY29tY2VydG9fYXRvbWljX2FkZCgtaSwgdik7CisjZW5kaWYKKwogCXNtcF9tYigpOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIkAgYXRvbWljX3N1Yl9yZXR1cm5cbiIKQEAgLTExNCw2ICsxNTksMTEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG9sZHZhbCwgcmVzOwogCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1pPTkVfRE1BX05DTkIKKwlpZiAodW5saWtlbHkoaXNfZG1hX3pvbmVfdmlydHVhbF9hZGRyZXNzKHB0cikpKQorCQlyZXR1cm4gY29tY2VydG9fYXRvbWljX2NtcHhjaGcocHRyLCBvbGQsIG5ldyk7CisjZW5kaWYKKwogCXNtcF9tYigpOwogCiAJZG8gewpAQCAtMTM2LDYgKzE4NiwxMyBAQAogewogCXVuc2lnbmVkIGxvbmcgdG1wLCB0bXAyOwogCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1pPTkVfRE1BX05DTkIKKwlpZiAodW5saWtlbHkoaXNfZG1hX3pvbmVfdmlydHVhbF9hZGRyZXNzKGFkZHIpKSkgeworCQlhdG9taWNfY2xlYXJfbWFzayhtYXNrLCBhZGRyKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oIkAgYXRvbWljX2NsZWFyX21hc2tcbiIKICIxOglsZHJleAklMCwgWyUzXVxuIgogIgliaWMJJTAsICUwLCAlNFxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCAwZTljZThkLi43ZjAyYzU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMTA5LDcgKzEwOSw3IEBACiAjZGVmaW5lIEVMRl9DT1JFX0NPUFlfVEFTS19SRUdTIGR1bXBfdGFza19yZWdzCiAKICNkZWZpbmUgQ09SRV9EVU1QX1VTRV9SRUdTRVQKLSNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUJNDA5NgorI2RlZmluZSBFTEZfRVhFQ19QQUdFU0laRQkoUEFHRV9TSVpFKQogCiAvKiBUaGlzIGlzIHRoZSBsb2NhdGlvbiB0aGF0IGFuIEVUX0RZTiBwcm9ncmFtIGlzIGxvYWRlZCBpZiBleGVjJ2VkLiAgVHlwaWNhbAogICAgdXNlIG9mIHRoaXMgaXMgdG8gaW52b2tlICIuL2xkLnNvIHNvbWVwcm9nIiB0byB0ZXN0IG91dCBhIG5ldyB2ZXJzaW9uIG9mCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbnRyeS1tYWNyby1tdWx0aS5TIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZW50cnktbWFjcm8tbXVsdGkuUwppbmRleCA4OGQ2MTgxLi5mNjU0NmE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9lbnRyeS1tYWNyby1tdWx0aS5TCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VudHJ5LW1hY3JvLW11bHRpLlMKQEAgLTQsOCArNCw4IEBACiAgKiBJbnRlcnJ1cHQgaGFuZGxpbmcuICBQcmVzZXJ2ZXMgcjcsIHI4LCByOQogICovCiAJLm1hY3JvCWFyY2hfaXJxX2hhbmRsZXJfZGVmYXVsdAotCWdldF9pcnFucl9wcmVhbWJsZSByNiwgbHIKLTE6CWdldF9pcnFucl9hbmRfYmFzZSByMCwgcjIsIHI2LCBscgorCWdldF9pcnFucl9wcmVhbWJsZSByNiwgcjMsIGxyCisxOglnZXRfaXJxbnJfYW5kX2Jhc2UgcjAsIHIyLCByNiwgcjMsIGxyCiAJbW92bmUJcjEsIHNwCiAJQAogCUAgcm91dGluZSBjYWxsZWQgd2l0aCByMCA9IGlycSBudW1iZXIsIHIxID0gc3RydWN0IHB0X3JlZ3MgKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZml4bWFwLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9maXhtYXAuaAppbmRleCBiYmFlOTE5Li5hYzlmYThhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9maXhtYXAuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9maXhtYXAuaApAQCAtMTMsNyArMTMsNyBAQAogICogMHhmZmZlMDAwMCBhbmQgMHhmZmZlZmZmZi4KICAqLwogCi0jZGVmaW5lIEZJWEFERFJfU1RBUlQJCTB4ZmZmMDAwMDBVTAorI2RlZmluZSBGSVhBRERSX1NUQVJUCQkweGZmZjMwMDAwVUwKICNkZWZpbmUgRklYQUREUl9UT1AJCTB4ZmZmZTAwMDBVTAogI2RlZmluZSBGSVhBRERSX1NJWkUJCShGSVhBRERSX1RPUCAtIEZJWEFERFJfU1RBUlQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2dsdWUtcHJvYy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ2x1ZS1wcm9jLmgKaW5kZXggZTJiZTdmMS4uNmU5NDgyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ2x1ZS1wcm9jLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ2x1ZS1wcm9jLmgKQEAgLTI1Niw2ICsyNTYsNyBAQAogI2RlZmluZSBjcHVfZGNhY2hlX2NsZWFuX2FyZWEJCV9fZ2x1ZShDUFVfTkFNRSxfZGNhY2hlX2NsZWFuX2FyZWEpCiAjZGVmaW5lIGNwdV9kb19zd2l0Y2hfbW0JCV9fZ2x1ZShDUFVfTkFNRSxfc3dpdGNoX21tKQogI2RlZmluZSBjcHVfc2V0X3B0ZV9leHQJCQlfX2dsdWUoQ1BVX05BTUUsX3NldF9wdGVfZXh0KQorI2RlZmluZSBjcHVfdW5jYWNoZV9wdGVfZXh0CQlfX2dsdWUoQ1BVX05BTUUsX3VuY2FjaGVfcHRlX2V4dCkKICNkZWZpbmUgY3B1X3N1c3BlbmRfc2l6ZQkJX19nbHVlKENQVV9OQU1FLF9zdXNwZW5kX3NpemUpCiAjZGVmaW5lIGNwdV9kb19zdXNwZW5kCQkJX19nbHVlKENQVV9OQU1FLF9kb19zdXNwZW5kKQogI2RlZmluZSBjcHVfZG9fcmVzdW1lCQkJX19nbHVlKENQVV9OQU1FLF9kb19yZXN1bWUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9lbnRyeS1tYWNyby1naWMuUyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TCmluZGV4IDc0ZWJjODAuLjU2ZGFhMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2VudHJ5LW1hY3JvLWdpYy5TCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgogCiAjaWZuZGVmIEhBVkVfR0VUX0lSUU5SX1BSRUFNQkxFCi0JLm1hY3JvCWdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgdG1wCisJLm1hY3JvCWdldF9pcnFucl9wcmVhbWJsZSwgYmFzZSwgcGVuZGluZ19pbnRyLCB0bXAKIAlsZHIJXGJhc2UsID1naWNfY3B1X2Jhc2VfYWRkcgogCWxkcglcYmFzZSwgW1xiYXNlXQogCS5lbmRtCkBAIC0zMiwxNyArMzIsNjEgQEAKICAqIHZhbGlkIHJhbmdlIGZvciBhbiBJUlEgKDMwLTEwMjAgaW5jbHVzaXZlKS4KICAqLwogCi0JLm1hY3JvICBnZXRfaXJxbnJfYW5kX2Jhc2UsIGlycW5yLCBpcnFzdGF0LCBiYXNlLCB0bXAKKwkubWFjcm8gIGdldF9pcnFucl9hbmRfYmFzZSwgaXJxbnIsIGlycXN0YXQsIGJhc2UsIHBlbmRpbmdfaW50ciwgdG1wCisKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fTVNQCisJbGRyICAgICBcaXJxc3RhdCwgW1xiYXNlLCAjR0lDX0NQVV9ISUdIUFJJXQorCWJpYyAgICAgXGlycW5yLCBcaXJxc3RhdCwgIzB4MWMwMAorCWNtcCAgICAgXGlycW5yLCAjMzMKKwljbXBuZSAgIFxpcnFuciwgIzY2CisJY21wbmUgICBcaXJxbnIsICM4NworCWNtcGVxICAgXGlycW5yLCBcaXJxbnIKKwlibmUgMTAwMWYKKworCW1vdiBcaXJxbnIsIFxpcnFuciAvKiBicmVha3BvaW50IGhlcmUgKi8KKworCWJlcSAxMDAyZgorCisxMDAxOgorI2VuZGlmIC8qIENPTkZJR19DT01DRVJUT19NU1AgKi8KIAogCWxkciAgICAgXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfSU5UQUNLXQogCS8qIGJpdHMgMTItMTAgPSBzcmMgQ1BVLCA5LTAgPSBpbnQgIyAqLwogCi0JbGRyCVx0bXAsID0xMDIxCiAJYmljICAgICBcaXJxbnIsIFxpcnFzdGF0LCAjMHgxYzAwCisJCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX01TUAorCWNtcCAgICAgXGlycW5yLCAjMzMKKwlzdHJlcQlcaXJxc3RhdCwgW1xiYXNlLCAjR0lDX0NQVV9FT0ldCisJbGRyZXEJXHRtcCwgPTB4MgkvLzIgb24gYml0MQorCWxkcmVxCVxwZW5kaW5nX2ludHIsID1DT01DRVJUT19ESVNUUl9JTlRfU0VUX1BFTkRJTkdfT0ZGU0VUXzQKKwlzdHJlcQlcdG1wLCBbXHBlbmRpbmdfaW50cl0KKwliZXEJMTAwMmYKKworCWNtcG5lICAgXGlycW5yLCAjNjYKKwlzdHJlcQlcaXJxc3RhdCwgW1xiYXNlLCAjR0lDX0NQVV9FT0ldCisJbGRyZXEJXHRtcCwgPTB4NAkvLzQgb24gYml0IDIKKwlsZHJlcQlccGVuZGluZ19pbnRyLCA9Q09NQ0VSVE9fRElTVFJfSU5UX1NFVF9QRU5ESU5HX09GRlNFVF84CisJc3RyZXEJXHRtcCwgW1xwZW5kaW5nX2ludHJdCisJYmVxCTEwMDJmCisKKwljbXBuZSAgIFxpcnFuciwgIzg3CisJc3RyZXEJXGlycXN0YXQsIFtcYmFzZSwgI0dJQ19DUFVfRU9JXQorCWxkcmVxCVx0bXAsID0weDgwMDAwMAkvLzB4ODAwMDAwIG9uIGJpdCAyMworCWxkcmVxCVxwZW5kaW5nX2ludHIsID1DT01DRVJUT19ESVNUUl9JTlRfU0VUX1BFTkRJTkdfT0ZGU0VUXzgKKwlzdHJlcQlcdG1wLCBbXHBlbmRpbmdfaW50cl0KKwliZXEJMTAwMmYKKyNlbmRpZiAvKiBDT05GSUdfQ09NQ0VSVE9fTVNQICovCisJbGRyCVx0bXAsID0xMDIxCiAJY21wICAgICBcaXJxbnIsICMxNQogCWNtcGNjCVxpcnFuciwgXGlycW5yCiAJY21wbmUJXGlycW5yLCBcdG1wCiAJY21wY3MJXGlycW5yLCBcaXJxbnIKKworI2lmZGVmIENPTkZJR19DT01DRVJUT19NU1AKKzEwMDI6CisjZW5kaWYgLyogQ09ORklHX0NPTUNFUlRPX01TUCAqLworCiAJLmVuZG0KIAogLyogV2UgYXNzdW1lIHRoYXQgaXJxc3RhdCAodGhlIHJhdyB2YWx1ZSBvZiB0aGUgSVJRIGFja25vd2xlZGdlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9naWMuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2dpYy5oCmluZGV4IDNlOTFmMjIuLjcxNzdlYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2dpYy5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2dpYy5oCkBAIC0yMiw2ICsyMiw3IEBACiAKICNkZWZpbmUgR0lDX0RJU1RfQ1RSTAkJCTB4MDAwCiAjZGVmaW5lIEdJQ19ESVNUX0NUUgkJCTB4MDA0CisjZGVmaW5lIEdJQ19ESVNUX1NFQ1VSSVRZX0JJVAkJMHgwODAKICNkZWZpbmUgR0lDX0RJU1RfRU5BQkxFX1NFVAkJMHgxMDAKICNkZWZpbmUgR0lDX0RJU1RfRU5BQkxFX0NMRUFSCQkweDE4MAogI2RlZmluZSBHSUNfRElTVF9QRU5ESU5HX1NFVAkJMHgyMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2tleGVjLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rZXhlYy5oCmluZGV4IGMyYjliNGIuLmRkZDdmYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2tleGVjLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20va2V4ZWMuaApAQCAtMTAsNyArMTAsNyBAQAogLyogTWF4aW11bSBhZGRyZXNzIHdlIGNhbiB1c2UgZm9yIHRoZSBjb250cm9sIGNvZGUgYnVmZmVyICovCiAjZGVmaW5lIEtFWEVDX0NPTlRST0xfTUVNT1JZX0xJTUlUICgtMVVMKQogCi0jZGVmaW5lIEtFWEVDX0NPTlRST0xfUEFHRV9TSVpFCTQwOTYKKyNkZWZpbmUgS0VYRUNfQ09OVFJPTF9QQUdFX1NJWkUJKFBBR0VfU0laRSkKIAogI2RlZmluZSBLRVhFQ19BUkNIIEtFWEVDX0FSQ0hfQVJNCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvbWFwLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL21hcC5oCmluZGV4IGIzNmYzNjUuLjUyMGQ1YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvbWFwLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9tYXAuaApAQCAtMzAsNiArMzAsOCBAQAogI2RlZmluZSBNVF9NRU1PUllfRFRDTQkJMTIKICNkZWZpbmUgTVRfTUVNT1JZX0lUQ00JCTEzCiAjZGVmaW5lIE1UX01FTU9SWV9TTwkJMTQKKyNkZWZpbmUgTVRfTVNQCQkJCTE1CisjZGVmaW5lIE1UX01TUF9OQ05CCQkJMTYKIAogI2lmZGVmIENPTkZJR19NTVUKIGV4dGVybiB2b2lkIGlvdGFibGVfaW5pdChzdHJ1Y3QgbWFwX2Rlc2MgKiwgaW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21lbW9yeS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKaW5kZXggYTg5OTdkNy4uYTg5NDFhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmgKQEAgLTM1LDI4ICszNSwzMSBAQAogICogVEFTS19TSVpFIC0gdGhlIG1heGltdW0gc2l6ZSBvZiBhIHVzZXIgc3BhY2UgdGFzay4KICAqIFRBU0tfVU5NQVBQRURfQkFTRSAtIHRoZSBsb3dlciBib3VuZGFyeSBvZiB0aGUgbW1hcCBWTSBhcmVhCiAgKi8KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS0ybGV2ZWwuaD4KKyNpZiAhZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQogI2RlZmluZSBQQUdFX09GRlNFVAkJVUwoQ09ORklHX1BBR0VfT0ZGU0VUKQogI2RlZmluZSBUQVNLX1NJWkUJCShVTChDT05GSUdfUEFHRV9PRkZTRVQpIC0gVUwoMHgwMTAwMDAwMCkpCiAjZGVmaW5lIFRBU0tfVU5NQVBQRURfQkFTRQkoVUwoQ09ORklHX1BBR0VfT0ZGU0VUKSAvIDMpCi0KKyNlbHNlCisjZGVmaW5lIFBBR0VfT0ZGU0VUCQlVTChDT05GSUdfUEFHRV9PRkZTRVQpCisjZGVmaW5lIFRBU0tfU0laRQkJKChVTChDT05GSUdfUEFHRV9PRkZTRVQpIC0gVUwoMHgwMTAwMDAwMCkpICYgfihVTCgoMSA8PCBQTURfU0hJRlQpLTEpKSkgIC8vIE11c3QgYmUgYWxpZ25lZCBvbiBQTUQgc2l6ZSAoa2VybmVsL3VzZXIgc3BhY2UgY2FuIHNoYXJlIHNhbWUgUE1EKQorI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKFVMKENPTkZJR19QQUdFX09GRlNFVCkgLyAzKQorI2VuZGlmCiAvKgogICogVGhlIG1heGltdW0gc2l6ZSBvZiBhIDI2LWJpdCB1c2VyIHNwYWNlIHRhc2suCiAgKi8KICNkZWZpbmUgVEFTS19TSVpFXzI2CQlVTCgweDA0MDAwMDAwKQogCisjaWZuZGVmIENPTkZJR19DT01DRVJUT19aT05FX0RNQV9OQ05CCiAvKgogICogVGhlIG1vZHVsZSBzcGFjZSBsaXZlcyBiZXR3ZWVuIHRoZSBhZGRyZXNzZXMgZ2l2ZW4gYnkgVEFTS19TSVpFCiAgKiBhbmQgUEFHRV9PRkZTRVQgLSBpdCBtdXN0IGJlIHdpdGhpbiAzMk1CIG9mIHRoZSBrZXJuZWwgdGV4dC4KICAqLwogI2lmbmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAotI2RlZmluZSBNT0RVTEVTX1ZBRERSCQkoUEFHRV9PRkZTRVQgLSAxNioxMDI0KjEwMjQpCisjZGVmaW5lIE1PRFVMRVNfVkFERFIJKFBBR0VfT0ZGU0VUIC0gMTYqMTAyNCoxMDI0KQogI2Vsc2UKIC8qIHNtYWxsZXIgcmFuZ2UgZm9yIFRodW1iLTIgc3ltYm9scyByZWxvY2F0aW9uICgyXjI0KSovCi0jZGVmaW5lIE1PRFVMRVNfVkFERFIJCShQQUdFX09GRlNFVCAtIDgqMTAyNCoxMDI0KQotI2VuZGlmCi0KLSNpZiBUQVNLX1NJWkUgPiBNT0RVTEVTX1ZBRERSCi0jZXJyb3IgVG9wIG9mIHVzZXIgc3BhY2UgY2xhc2hlcyB3aXRoIHN0YXJ0IG9mIG1vZHVsZSBzcGFjZQorI2RlZmluZSBNT0RVTEVTX1ZBRERSCShQQUdFX09GRlNFVCAtIDgqMTAyNCoxMDI0KQogI2VuZGlmCiAKIC8qCkBAIC02OCw2ICs3MSwyMiBAQAogI2RlZmluZSBNT0RVTEVTX0VORAkJKFBBR0VfT0ZGU0VUKQogI2VuZGlmCiAKKyNlbHNlCisvKiBNb3ZlIG1vZHVsZSBzcGFjZSBpbnRvIHRoZSBob2xlIHJlc2VydmVkIGZvciBNU1AvUEZFIHNvIHdlIGNhbiBoYXZlIGEgYmlnZ2VyIERNQSB6b25lICovCisjZGVmaW5lIE1PRFVMRVNfRU5ECQkoKENPTUNFUlRPX0REUl9TSEFSRURfQkFTRSArIENPTUNFUlRPX0REUl9TSEFSRURfU0laRSAtIFBMQVRfUEhZU19PRkZTRVQgKyBQQUdFX09GRlNFVCkgJiBQTURfTUFTSykgLy8gY29udmVydCBTSEFSRURfRU5EIHRvIHZpcnQgYW5kIGFsaWduIG9uIGxvd2VyIFBNRCBib3VuZGFyeQorCisjaWZuZGVmIENPTkZJR19USFVNQjJfS0VSTkVMCisjZGVmaW5lIE1PRFVMRVNfVkFERFIJKE1PRFVMRVNfRU5EIC0gMTYqMTAyNCoxMDI0KQorI2Vsc2UKKyNkZWZpbmUgTU9EVUxFU19WQUREUgkoTU9EVUxFU19FTkQgLSAxMCoxMDI0KjEwMjQpIC8vIFJlbG9jYXRpb25zIHdpbGwgYmUgZ3VhcmFudGVlZCB0byB3b3JrIGFzIGxvbmcgYXMga2VybmVsIHNpemUgaXMgbGVzcyB0aGFuIDZNQgorI2VuZGlmCisKKyNlbmRpZgorCisjaWYgVEFTS19TSVpFID4gTU9EVUxFU19WQUREUgorI2Vycm9yIFRvcCBvZiB1c2VyIHNwYWNlIGNsYXNoZXMgd2l0aCBzdGFydCBvZiBtb2R1bGUgc3BhY2UKKyNlbmRpZgorCiAvKgogICogVGhlIFhJUCBrZXJuZWwgZ2V0cyBtYXBwZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbW9kdWxlIHZtIGFyZWEuCiAgKiBTaW5jZSB3ZSB1c2Ugc2VjdGlvbnMgdG8gbWFwIGl0LCB0aGlzIG1hY3JvIHJlcGxhY2VzIHRoZSBwaHlzaWNhbCBhZGRyZXNzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggY2E5NDY1My4uMGNiNjllMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wYWdlLmgKQEAgLTExLDcgKzExLDExIEBACiAjZGVmaW5lIF9BU01BUk1fUEFHRV9ICiAKIC8qIFBBR0VfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgcGFnZSBzaXplICovCisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKICNkZWZpbmUgUEFHRV9TSElGVAkJMTIKKyNlbHNlCisjZGVmaW5lIFBBR0VfU0hJRlQJCTE2CisjZW5kaWYKICNkZWZpbmUgUEFHRV9TSVpFCQkoX0FDKDEsVUwpIDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIFBBR0VfTUFTSwkJKH4oUEFHRV9TSVpFLTEpKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wYXJhbS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGFyYW0uaAppbmRleCA4YjI0YmY5NC4uODgzNjdhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGFyYW0uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wYXJhbS5oCkBAIC0xOCw3ICsxOCwxMSBAQAogIyBkZWZpbmUgSFoJCTEwMAogI2VuZGlmCiAKKyNpZiAhZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQogI2RlZmluZSBFWEVDX1BBR0VTSVpFCTQwOTYKKyNlbHNlCisjZGVmaW5lIEVYRUNfUEFHRVNJWkUJNjU1MzYKKyNlbmRpZgogCiAjaWZuZGVmIE5PR1JPVVAKICNkZWZpbmUgTk9HUk9VUCAgICAgICAgICgtMSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BnYWxsb2MuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAppbmRleCAzZTA4ZmQzLi4xYTk0MTNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGdhbGxvYy5oCkBAIC0xMDgsOCArMTA4LDE3IEBACiAJCQkJICBwbWR2YWxfdCBwcm90KQogewogCXBtZHZhbF90IHBtZHZhbCA9IChwdGUgKyBQVEVfSFdUQUJMRV9PRkYpIHwgcHJvdDsKKyNpZiAhZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQogCXBtZHBbMF0gPSBfX3BtZChwbWR2YWwpOwogCXBtZHBbMV0gPSBfX3BtZChwbWR2YWwgKyAyNTYgKiBzaXplb2YocHRlX3QpKTsKKyNlbHNlCisJaW50IGksIG9mZiA9IDA7CisJZm9yIChpID0gMDsgaSA8IExJTktFRF9QTURTOyBpKyspIHsKKwkJcG1kcFtpXSA9IF9fcG1kKHBtZHZhbCArIG9mZik7CisJCW9mZiArPSAxMDI0OyAvLyBFYWNoIFBNRCBwb2ludHMgdG8gYSAxa0IgMm5kLWxldmVsIHRhYmxlCisJfQorCisjZW5kaWYKIAlmbHVzaF9wbWRfZW50cnkocG1kcCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsLWh3ZGVmLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTJsZXZlbC1od2RlZi5oCmluZGV4IDVjZmJhMTUuLjAxYmJiOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsLWh3ZGVmLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwtaHdkZWYuaApAQCAtNjUsNyArNjUsMTMgQEAKIC8qCiAgKiAgIC0gZXh0ZW5kZWQgc21hbGwgcGFnZS90aW55IHBhZ2UKICAqLworI2lmICFkZWZpbmVkKENPTkZJR19DT01DRVJUT182NEtfUEFHRVMpCiAjZGVmaW5lIFBURV9FWFRfWE4JCShfQVQocHRldmFsX3QsIDEpIDw8IDApCQkvKiB2NiAqLworI2RlZmluZSBQVEVfRVhUX1RFWCh4KQkJKF9BVChwdGV2YWxfdCwgKHgpKSA8PCA2KQkvKiB2NSAqLworI2Vsc2UKKyNkZWZpbmUgUFRFX0VYVF9YTgkJKF9BVChwdGV2YWxfdCwgMSkgPDwgMTUpCQkvKiB2NiAqLworI2RlZmluZSBQVEVfRVhUX1RFWCh4KQkJKF9BVChwdGV2YWxfdCwgKHgpKSA8PCAxMikJLyogdjUgKi8KKyNlbmRpZgogI2RlZmluZSBQVEVfRVhUX0FQX01BU0sJCShfQVQocHRldmFsX3QsIDMpIDw8IDQpCiAjZGVmaW5lIFBURV9FWFRfQVAwCQkoX0FUKHB0ZXZhbF90LCAxKSA8PCA0KQogI2RlZmluZSBQVEVfRVhUX0FQMQkJKF9BVChwdGV2YWxfdCwgMikgPDwgNCkKQEAgLTczLDcgKzc5LDYgQEAKICNkZWZpbmUgUFRFX0VYVF9BUF9VTk9fU1JXCShQVEVfRVhUX0FQMCkKICNkZWZpbmUgUFRFX0VYVF9BUF9VUk9fU1JXCShQVEVfRVhUX0FQMSkKICNkZWZpbmUgUFRFX0VYVF9BUF9VUldfU1JXCShQVEVfRVhUX0FQMXxQVEVfRVhUX0FQMCkKLSNkZWZpbmUgUFRFX0VYVF9URVgoeCkJCShfQVQocHRldmFsX3QsICh4KSkgPDwgNikJLyogdjUgKi8KICNkZWZpbmUgUFRFX0VYVF9BUFgJCShfQVQocHRldmFsX3QsIDEpIDw8IDkpCQkvKiB2NiAqLwogI2RlZmluZSBQVEVfRVhUX0NPSEVSRU5UCShfQVQocHRldmFsX3QsIDEpIDw8IDkpCQkvKiBYU2NhbGUzICovCiAjZGVmaW5lIFBURV9FWFRfU0hBUkVECQkoX0FUKHB0ZXZhbF90LCAxKSA8PCAxMCkJLyogdjYgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsLXR5cGVzLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTJsZXZlbC10eXBlcy5oCmluZGV4IDY2Y2I1YjAuLmFkNDhiZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsLXR5cGVzLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwtdHlwZXMuaApAQCAtMjQsMTIgKzI0LDE3IEBACiB0eXBlZGVmIHUzMiBwdGV2YWxfdDsKIHR5cGVkZWYgdTMyIHBtZHZhbF90OwogCisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKICN1bmRlZiBTVFJJQ1RfTU1fVFlQRUNIRUNLUworI2Vsc2UKKyNkZWZpbmUgU1RSSUNUX01NX1RZUEVDSEVDS1MJMQorI2VuZGlmCiAKICNpZmRlZiBTVFJJQ1RfTU1fVFlQRUNIRUNLUwogLyoKICAqIFRoZXNlIGFyZSB1c2VkIHRvIG1ha2UgdXNlIG9mIEMgdHlwZS1jaGVja2luZy4uCiAgKi8KKyNpZiAhZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQogdHlwZWRlZiBzdHJ1Y3QgeyBwdGV2YWxfdCBwdGU7IH0gcHRlX3Q7CiB0eXBlZGVmIHN0cnVjdCB7IHBtZHZhbF90IHBtZDsgfSBwbWRfdDsKIHR5cGVkZWYgc3RydWN0IHsgcG1kdmFsX3QgcGdkWzJdOyB9IHBnZF90OwpAQCAtNDUsNiArNTAsMjMgQEAKICNkZWZpbmUgX19wZ3Byb3QoeCkgICAgICgocGdwcm90X3QpIHsgKHgpIH0gKQogCiAjZWxzZQorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLTJsZXZlbC5oPgordHlwZWRlZiBzdHJ1Y3QgeyBwdGV2YWxfdCBwdGVbMTZdOyB9IHB0ZV90OwordHlwZWRlZiBzdHJ1Y3QgeyBwbWR2YWxfdCBwbWQ7IH0gcG1kX3Q7Cit0eXBlZGVmIHN0cnVjdCB7IHBtZHZhbF90IHBnZFtMSU5LRURfUE1EU107IH0gcGdkX3Q7Cit0eXBlZGVmIHN0cnVjdCB7IHB0ZXZhbF90IHBncHJvdDsgfSBwZ3Byb3RfdDsKKworI2RlZmluZSBwdGVfdmFsKHgpICAgICAgKCh4KS5wdGVbMF0pCisjZGVmaW5lIHBtZF92YWwoeCkgICAgICAoKHgpLnBtZCkKKyNkZWZpbmUgcGdkX3ZhbCh4KQkoKHgpLnBnZFswXSkKKyNkZWZpbmUgcGdwcm90X3ZhbCh4KSAgICgoeCkucGdwcm90KQorCisjZGVmaW5lIF9fcHRlKHgpICAgICAgICAoKHB0ZV90KSB7IHsoeCl9IH0gKQorI2RlZmluZSBfX3BtZCh4KSAgICAgICAgKChwbWRfdCkgeyAoeCkgfSApCisjZGVmaW5lIF9fcGdwcm90KHgpICAgICAoKHBncHJvdF90KSB7ICh4KSB9ICkKKyNlbmRpZgorCisjZWxzZQogLyoKICAqIC4uIHdoaWxlIHRoZXNlIG1ha2UgaXQgZWFzaWVyIG9uIHRoZSBjb21waWxlcgogICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTJsZXZlbC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwuaAppbmRleCA0NzA0NTdlLi41ZmViODlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTJsZXZlbC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsLmgKQEAgLTI4LDYgKzI4LDE1IEBACiAgKiB3aGljaCBjb250YWluIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiBMaW51eCBuZWVkcy4gIFdlLCB0aGVyZWZvcmUsIGVuZCB1cAogICogd2l0aCA1MTIgZW50cmllcyBpbiB0aGUgIlBURSIgbGV2ZWwuCiAgKgorICogNjRrIHBhZ2VzIHN1cHBvcnQgKE1pbmRzcGVlZCBDT01DRVJUTyk6CisgKiBXZSBjaGVhdCBldmVuIG1vcmUgYW5kIHRlbGwgTGludXggdGhhdCB3ZSBoYXZlIDI1NiBlbnRyaWVzIGluIHRoZSBmaXJzdAorICogbGV2ZWwsIGVhY2ggb2Ygd2hpY2ggaXMgNjQgYnl0ZXMgKDE2IGhhcmR3YXJlIHBvaW50ZXJzKS4gVGhlIDJuZCBsZXZlbAorICogY29udGFpbnMgMTYgaGFyZHdhcmUgUFRFIHRhYmxlcywgb3IgNDA5NiBoYXJkd2FyZSBlbnRyaWVzLiBIb3dldmVyLAorICogc2luY2UgNjRrQiBwYWdlcyBhcmUgZG9uZSBieSBkdXBsaWNhdGluZyA0a0IgZW50cmllcywgdGhlcmUgd2lsbCBvbmx5IGJ5CisgKiAyNTYgZW50cmllcyBpbiB0aGUgTGludXggIlBURSIgbGV2ZWwgKGFuZCB0aGUgUFRFIGVudHJ5IHdpbGwgYmUgbGFyZ2VyKS4KKyAqIEFsbCBkZWZpbmVzIGFyZSBub3cgYWxzbyBkZXJpdmVkIGZyb20gdGhlIExJTktFRF9QTURTX1NISUZUIG1hY3JvLCB3aGljaAorICogZGV0ZXJtaW5lcyBob3cgbWFueSBQTURzIHBvaW50IGludG8gYSBzaW5nbGUgMm5kLWxldmVsIHRhYmxlLgorICoKICAqIFRoaXMgbGVhZHMgdG8gdGhlIHBhZ2UgdGFibGVzIGhhdmluZyB0aGUgZm9sbG93aW5nIGxheW91dDoKICAqCiAgKiAgICBwZ2QgICAgICAgICAgICAgcHRlCkBAIC02OCw2ICs3Nyw3IEBACiAgKiB1bnRpbCBlaXRoZXIgdGhlIFRMQiBlbnRyeSBpcyBldmljdGVkIHVuZGVyIHByZXNzdXJlLCBvciBhIGNvbnRleHQKICAqIHN3aXRjaCB3aGljaCBjaGFuZ2VzIHRoZSB1c2VyIHNwYWNlIG1hcHBpbmcgb2NjdXJzLgogICovCisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKICNkZWZpbmUgUFRSU19QRVJfUFRFCQk1MTIKICNkZWZpbmUgUFRSU19QRVJfUE1ECQkxCiAjZGVmaW5lIFBUUlNfUEVSX1BHRAkJMjA0OApAQCAtODIsNiArOTIsMjEgQEAKICAqLwogI2RlZmluZSBQTURfU0hJRlQJCTIxCiAjZGVmaW5lIFBHRElSX1NISUZUCQkyMQorI2Vsc2UKKyNkZWZpbmUgTElOS0VEX1BNRFNfU0hJRlQJNAorI2RlZmluZSBMSU5LRURfUE1EUwkJCSgxIDw8IExJTktFRF9QTURTX1NISUZUKQkvKiBudW1iZXIgb2YgUE1EcyBwb2ludGluZyB0byB0aGUgc2FtZSAybmQtbGV2ZWwgcGFnZSAqLworI2RlZmluZSBQVFJTX1BFUl9QR0QJCSg0MDk2IC8gTElOS0VEX1BNRFMpCQkvKiBvbmUgcGdkaXIgdGFibGUgY29udGFpbnMgNDA5NiBlbnRyaWVzICovCisjZGVmaW5lIFBHRElSX1NISUZUCQkJKDIwICsgTElOS0VEX1BNRFNfU0hJRlQpCS8qIG9uZSBwZ2RpciBlbnRyeSBjYW4gbWFwIDFNQiAoMl4yMCkgKi8KKyNkZWZpbmUgUE1EX1NISUZUCQkJKFBHRElSX1NISUZUKQorI2RlZmluZSBQVEVUX1NJWkVfU0hJRlQJCTYJCQkJCQkJLyogYSBIVyBQVEUgZW50cnkgaXMgMTYqNGJ5dGVzICovCisjZGVmaW5lIFBURV9IV1RBQkxFX1BUUlMJKDEgPDwgKDEwICsgTElOS0VEX1BNRFNfU0hJRlQgLSBQVEVUX1NJWkVfU0hJRlQpKSAvKiBvbmUgSFcgUFRFIHRhYmxlIGlzIDFrQiAoMl4xMCkgKi8KKworI2RlZmluZSBQVFJTX1BFUl9QVEUJCShQVEVfSFdUQUJMRV9QVFJTKQorI2RlZmluZSBQVFJTX1BFUl9QTUQJCTEKKworI2RlZmluZSBQVEVfSFdUQUJMRV9PRkYJCTMyNzY4IC8vKFBUUlNfUEVSX1BURSAqIHNpemVvZihwdGVfdCkpCisjZGVmaW5lIFBURV9IV1RBQkxFX1NJWkUJKDEgPDwgKDEwICsgTElOS0VEX1BNRFNfU0hJRlQpKQorI2VuZGlmCiAKICNkZWZpbmUgUE1EX1NJWkUJCSgxVUwgPDwgUE1EX1NISUZUKQogI2RlZmluZSBQTURfTUFTSwkJKH4oUE1EX1NJWkUtMSkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggOTQ1MWRjZS4uZWYzMzNkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMTgzLDYgKzE4Myw3IEBACiAjZGVmaW5lIHBtZF9wcmVzZW50KHBtZCkJKHBtZF92YWwocG1kKSkKICNkZWZpbmUgcG1kX2JhZChwbWQpCQkocG1kX3ZhbChwbWQpICYgMikKIAorI2lmICFkZWZpbmVkKENPTkZJR19DT01DRVJUT182NEtfUEFHRVMpCiAjZGVmaW5lIGNvcHlfcG1kKHBtZHBkLHBtZHBzKQkJXAogCWRvIHsJCQkJXAogCQlwbWRwZFswXSA9IHBtZHBzWzBdOwlcCkBAIC0xOTYsMTAgKzE5NywyOSBAQAogCQlwbWRwWzFdID0gX19wbWQoMCk7CVwKIAkJY2xlYW5fcG1kX2VudHJ5KHBtZHApOwlcCiAJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIGNvcHlfcG1kKHBtZHBkLHBtZHBzKQlcCisJZG8gewlcCisJCWludCBpOwlcCisJCWZvcihpID0gMDsgaSA8IExJTktFRF9QTURTOyBpKyspCVwKKwkJCXBtZHBkW2ldID0gcG1kcHNbaV07CVwKKwkJZmx1c2hfcG1kX2VudHJ5KHBtZHBkKTsJXAorCX0gd2hpbGUgKDApCiAKKyNkZWZpbmUgcG1kX2NsZWFyKHBtZHApCVwKKwlkbyB7CVwKKwkJaW50IGk7CVwKKwkJZm9yKGkgPSAwOyBpIDwgTElOS0VEX1BNRFM7IGkrKykJXAorCQkJcG1kcFtpXSA9IF9fcG1kKDApOwlcCisJCWNsZWFuX3BtZF9lbnRyeShwbWRwKTsJXAorCX0gd2hpbGUgKDApCisKKyNlbmRpZgorCisjZGVmaW5lIFBNRF9QQUdFX0FERFJfTUFTSwkJKH4oKDEgPDwgMTApIC0gMSkpCiBzdGF0aWMgaW5saW5lIHB0ZV90ICpwbWRfcGFnZV92YWRkcihwbWRfdCBwbWQpCiB7Ci0JcmV0dXJuIF9fdmEocG1kX3ZhbChwbWQpICYgUEhZU19NQVNLICYgKHMzMilQQUdFX01BU0spOworCXJldHVybiBfX3ZhKChwbWRfdmFsKHBtZCkgJiBQSFlTX01BU0sgJiAoczMyKVBNRF9QQUdFX0FERFJfTUFTSykgLSBQVEVfSFdUQUJMRV9PRkYpOwogfQogCiAjZGVmaW5lIHBtZF9wYWdlKHBtZCkJCXBmbl90b19wYWdlKF9fcGh5c190b19wZm4ocG1kX3ZhbChwbWQpICYgUEhZU19NQVNLKSkKQEAgLTIyOSw4ICsyNDksMTcgQEAKICNkZWZpbmUgcHRlX3BhZ2UocHRlKQkJcGZuX3RvX3BhZ2UocHRlX3BmbihwdGUpKQogI2RlZmluZSBta19wdGUocGFnZSxwcm90KQlwZm5fcHRlKHBhZ2VfdG9fcGZuKHBhZ2UpLCBwcm90KQogCi0jZGVmaW5lIHNldF9wdGVfZXh0KHB0ZXAscHRlLGV4dCkgY3B1X3NldF9wdGVfZXh0KHB0ZXAscHRlLGV4dCkKLSNkZWZpbmUgcHRlX2NsZWFyKG1tLGFkZHIscHRlcCkJc2V0X3B0ZV9leHQocHRlcCwgX19wdGUoMCksIDApCisjZGVmaW5lIHNldF9wdGVfZXh0KHB0ZXAscHRlLGV4dCkgY3B1X3NldF9wdGVfZXh0KHB0ZXAscHRlX3ZhbChwdGUpLGV4dCkKKyNkZWZpbmUgdW5jYWNoZV9wdGVfZXh0KHB0ZXApIGNwdV91bmNhY2hlX3B0ZV9leHQocHRlcCkKKyNkZWZpbmUgcHRlX2NsZWFyKG1tLGFkZHIscHRlcCkJZG8ge19fc3luY19vdXRlcl9jYWNoZShwdGVwLCBfX3B0ZSgwKSk7IHNldF9wdGVfZXh0KHB0ZXAsIF9fcHRlKDApLCAwKTsgfSB3aGlsZSAoMCkKKworI2lmICFkZWZpbmVkKENPTkZJR19MMlgwX0lOU1RSVUNUSU9OX09OTFkpCitzdGF0aWMgaW5saW5lIHZvaWQgX19zeW5jX291dGVyX2NhY2hlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCit7Cit9CisjZWxzZQorZXh0ZXJuIHZvaWQgX19zeW5jX291dGVyX2NhY2hlKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpOworI2VuZGlmCiAKICNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPCA2CiBzdGF0aWMgaW5saW5lIHZvaWQgX19zeW5jX2ljYWNoZV9kY2FjaGUocHRlX3QgcHRldmFsKQpAQCAtMjQzLDYgKzI3Miw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJICAgICAgcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKIHsKKwlfX3N5bmNfb3V0ZXJfY2FjaGUocHRlcCwgcHRldmFsKTsKKwogCWlmIChhZGRyID49IFRBU0tfU0laRSkKIAkJc2V0X3B0ZV9leHQocHRlcCwgcHRldmFsLCAwKTsKIAllbHNlIHsKQEAgLTMwMyw3ICszMzQsNyBAQAogI2RlZmluZSBfX3N3cF9lbnRyeSh0eXBlLG9mZnNldCkgKChzd3BfZW50cnlfdCkgeyAoKHR5cGUpIDw8IF9fU1dQX1RZUEVfU0hJRlQpIHwgKChvZmZzZXQpIDw8IF9fU1dQX09GRlNFVF9TSElGVCkgfSkKIAogI2RlZmluZSBfX3B0ZV90b19zd3BfZW50cnkocHRlKQkoKHN3cF9lbnRyeV90KSB7IHB0ZV92YWwocHRlKSB9KQotI2RlZmluZSBfX3N3cF9lbnRyeV90b19wdGUoc3dwKQkoKHB0ZV90KSB7IChzd3ApLnZhbCB9KQorI2RlZmluZSBfX3N3cF9lbnRyeV90b19wdGUoc3dwKQkoKHB0ZV90KSB7IHsgKHN3cCkudmFsIH0gfSkKIAogLyoKICAqIEl0IGlzIGFuIGVycm9yIGZvciB0aGUga2VybmVsIHRvIGhhdmUgbW9yZSBzd2FwIGZpbGVzIHRoYW4gd2UgY2FuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9jLWZucy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvYy1mbnMuaAppbmRleCA5ZTkyY2IyMC4uYmJiMWQ5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvYy1mbnMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9jLWZucy5oCkBAIC02NSw3ICs2NSw3IEBACiAJICogU2V0IGEgcG9zc2libHkgZXh0ZW5kZWQgUFRFLiAgTm9uLWV4dGVuZGVkIFBURXMgc2hvdWxkCiAJICogaWdub3JlICdleHQnLgogCSAqLwotCXZvaWQgKCpzZXRfcHRlX2V4dCkocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGV4dCk7CisJdm9pZCAoKnNldF9wdGVfZXh0KShwdGVfdCAqcHRlcCwgcHRldmFsX3QgcHRlLCB1bnNpZ25lZCBpbnQgZXh0KTsKIAogCS8qIFN1c3BlbmQvcmVzdW1lICovCiAJdW5zaWduZWQgaW50IHN1c3BlbmRfc2l6ZTsKQEAgLTc5LDcgKzc5LDggQEAKIGV4dGVybiBpbnQgY3B1X2RvX2lkbGUodm9pZCk7CiBleHRlcm4gdm9pZCBjcHVfZGNhY2hlX2NsZWFuX2FyZWEodm9pZCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgY3B1X2RvX3N3aXRjaF9tbSh1bnNpZ25lZCBsb25nIHBnZF9waHlzLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSk7Ci1leHRlcm4gdm9pZCBjcHVfc2V0X3B0ZV9leHQocHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZSwgdW5zaWduZWQgaW50IGV4dCk7CitleHRlcm4gdm9pZCBjcHVfc2V0X3B0ZV9leHQocHRlX3QgKnB0ZXAsIHB0ZXZhbF90IHB0ZSwgdW5zaWduZWQgaW50IGV4dCk7CitleHRlcm4gdm9pZCBjcHVfdW5jYWNoZV9wdGVfZXh0KHB0ZV90ICpwdGVwKTsKIGV4dGVybiB2b2lkIGNwdV9yZXNldCh1bnNpZ25lZCBsb25nIGFkZHIpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CiAKIC8qIFRoZXNlIHRocmVlIGFyZSBwcml2YXRlIHRvIGFyY2gvYXJtL2tlcm5lbC9zdXNwZW5kLmMgKi8KQEAgLTkyLDYgKzkzLDcgQEAKICNkZWZpbmUgY3B1X2RvX2lkbGUJCQlwcm9jZXNzb3IuX2RvX2lkbGUKICNkZWZpbmUgY3B1X2RjYWNoZV9jbGVhbl9hcmVhCQlwcm9jZXNzb3IuZGNhY2hlX2NsZWFuX2FyZWEKICNkZWZpbmUgY3B1X3NldF9wdGVfZXh0CQkJcHJvY2Vzc29yLnNldF9wdGVfZXh0CisjZGVmaW5lIGNwdV91bmNhY2hlX3B0ZV9leHQJCXByb2Nlc3Nvci51bmNhY2hlX3B0ZV9leHQKICNkZWZpbmUgY3B1X2RvX3N3aXRjaF9tbQkJcHJvY2Vzc29yLnN3aXRjaF9tbQogCiAvKiBUaGVzZSB0aHJlZSBhcmUgcHJpdmF0ZSB0byBhcmNoL2FybS9rZXJuZWwvc3VzcGVuZC5jICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zaG1wYXJhbS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc2htcGFyYW0uaAppbmRleCBhNTIyM2IzLi43M2NkYjVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9zaG1wYXJhbS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NobXBhcmFtLmgKQEAgLTYsNyArNiwxMiBAQAogICogb3IgcGFnZSBzaXplLCB3aGljaGV2ZXIgaXMgZ3JlYXRlciBzaW5jZSB0aGUgY2FjaGUgYWxpYXNlcwogICogZXZlcnkgc2l6ZS93YXlzIGJ5dGVzLgogICovCisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKICNkZWZpbmUJU0hNTEJBCSg0ICogUEFHRV9TSVpFKQkJIC8qIGF0dGFjaCBhZGRyIGEgbXVsdGlwbGUgb2YgdGhpcyAqLworI2Vsc2UKKyNkZWZpbmUJU0hNTEJBCShQQUdFX1NJWkUpCQkgLyogYXR0YWNoIGFkZHIgYSBtdWx0aXBsZSBvZiB0aGlzICovCisjZW5kaWYKKwogCiAvKgogICogRW5mb3JjZSBTSE1MQkEgaW4gc2htYXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcF90d2QuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcF90d2QuaAppbmRleCBlZjlmZmJhOS4uZDI4OWM3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc21wX3R3ZC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcF90d2QuaApAQCAtMjQsNSArMjQsOCBAQAogCiB2b2lkIHR3ZF90aW1lcl9zZXR1cChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOwogdm9pZCB0d2RfdGltZXJfc3RvcChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOworI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKK2ludCB0d2RfdGltZXJfYWNrKHZvaWQpOworI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggN2I1Y2M4ZC4uN2Q2YThhYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xNSw4ICsxNSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL2Zwc3RhdGUuaD4KIAorI2lmICFkZWZpbmVkKENPTkZJR19DT01DRVJUT182NEtfUEFHRVMpCiAjZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSCTEKICNkZWZpbmUgVEhSRUFEX1NJWkUJCTgxOTIKKyNlbHNlCisjZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSCTAKKyNkZWZpbmUgVEhSRUFEX1NJWkUJCTY1NTM2CisjZW5kaWYKICNkZWZpbmUgVEhSRUFEX1NUQVJUX1NQCQkoVEhSRUFEX1NJWkUgLSA4KQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGxiZmx1c2guaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggMDJiMmY4Mi4uNDlmZjIzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGxiZmx1c2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCkBAIC00NzEsNiArNDcxLDcgQEAKICAqCXRoZXNlIG9wZXJhdGlvbnMuICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gd2UgYXJlIHJlbW92aW5nCiAgKglQTUQgZW50cmllcy4KICAqLworI2lmICFkZWZpbmVkKENPTkZJR19DT01DRVJUT182NEtfUEFHRVMpCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfcG1kX2VudHJ5KHZvaWQgKnBtZCkKIHsKIAljb25zdCB1bnNpZ25lZCBpbnQgX190bGJfZmxhZyA9IF9fY3B1X3RsYl9mbGFnczsKQEAgLTQ5OSw2ICs1MDAsMzkgQEAKIAkJYXNtKCJtY3IJcDE1LCAxLCAlMCwgYzE1LCBjOSwgMSAgQCBMMiBmbHVzaF9wbWQiCiAJCQk6IDogInIiIChwbWQpIDogImNjIik7CiB9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3BtZF9lbnRyeSh2b2lkICpwbWQpCit7CisJY29uc3QgdW5zaWduZWQgaW50IF9fdGxiX2ZsYWcgPSBfX2NwdV90bGJfZmxhZ3M7CisJY2hhciAqcCA9IChjaGFyICopcG1kOworCisJaWYgKHRsYl9mbGFnKFRMQl9EQ0xFQU4pKSB7CisJCXdoaWxlIChwIDwgKChjaGFyICopcG1kICsgKExJTktFRF9QTURTICogc2l6ZW9mKHUzMikpKSkgeyAvLyBBIFBNRCBjb250YWlucyBMSU5LRURfUE1EUyBwb2ludGVycyB0byB0aGUgMm5kLWxldmVsIHRhYmxlCisJCQlhc20oIm1jcglwMTUsIDAsICUwLCBjNywgYzEwLCAxCUAgZmx1c2hfcG1kIgorCQkJCQk6IDogInIiIChwKSA6ICJjYyIpOworCQkJcCArPSAzMjsgLy9OZXh0IGNhY2hlIGxpbmUKKwkJfQorCX0KKworCWlmICh0bGJfZmxhZyhUTEJfV0IpKQorCQlkc2IoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFuX3BtZF9lbnRyeSh2b2lkICpwbWQpCit7CisJY29uc3QgdW5zaWduZWQgaW50IF9fdGxiX2ZsYWcgPSBfX2NwdV90bGJfZmxhZ3M7CisJY2hhciAqcCA9IChjaGFyICopcG1kOworCisJaWYgKHRsYl9mbGFnKFRMQl9EQ0xFQU4pKSB7CisJCXdoaWxlIChwIDwgKChjaGFyICopcG1kICsgKExJTktFRF9QTURTICogc2l6ZW9mKHUzMikpKSkgeyAvLyBBIFBNRCBjb250YWlucyBMSU5LRURfUE1EUyBwb2ludGVycyB0byB0aGUgMm5kLWxldmVsIHRhYmxlCisJCQlhc20oIm1jcglwMTUsIDAsICUwLCBjNywgYzEwLCAxCUAgZmx1c2hfcG1kIgorCQkJCQk6IDogInIiIChwKSA6ICJjYyIpOworCQkJcCArPSAzMjsgLy9OZXh0IGNhY2hlIGxpbmUKKwkJfQorCX0KK30KKworI2VuZGlmCiAKICN1bmRlZiB0bGJfZmxhZwogI3VuZGVmIGFsd2F5c190bGJfZmxhZ3MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCmluZGV4IGIxNDVmMTYuLmVjZTA5OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwpAQCAtMjQyLDYgKzI0MiwxOSBAQAogCWIJMWIKICNlbmRpZgogCitfX3VuZF9mYXVsdDoKKwlAIENvcnJlY3QgdGhlIFBDIHN1Y2ggdGhhdCBpdCBpcyBwb2ludGluZyBhdCB0aGUgaW5zdHJ1Y3Rpb24KKwlAIHdoaWNoIGNhdXNlZCB0aGUgZmF1bHQuICBJZiB0aGUgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24gd2FzIEFSTQorCUAgdGhlIFBDIHdpbGwgYmUgcG9pbnRpbmcgYXQgdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIGFuZCBoYXZlIHRvCisJQCBzdWJ0cmFjdCA0LiAgT3RoZXJ3aXNlLCBpdCBpcyBUaHVtYiwgYW5kIHRoZSBQQyB3aWxsIGJlCisJQCBwb2ludGluZyBhdCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIFRodW1iIGluc3RydWN0aW9uLiAgV2UKKwlAIGhhdmUgdG8gc3VidHJhY3QgMi4KKwlsZHIJcjIsIFtyMCwgI1NfUENdCisJc3ViCXIyLCByMiwgcjEKKwlzdHIJcjIsIFtyMCwgI1NfUENdCisJYglkb191bmRlZmluc3RyCitFTkRQUk9DKF9fdW5kX2ZhdWx0KQorCiAJLmFsaWduCTUKIF9fdW5kX3N2YzoKICNpZmRlZiBDT05GSUdfS1BST0JFUwpAQCAtMjU5LDI1ICsyNzIsMzIgQEAKIAlACiAJQCAgcjAgLSBpbnN0cnVjdGlvbgogCUAKLSNpZm5kZWYJQ09ORklHX1RIVU1CMl9LRVJORUwKKyNpZm5kZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKIAlsZHIJcjAsIFtyNCwgIy00XQogI2Vsc2UKKwltb3YJcjEsICMyCiAJbGRyaAlyMCwgW3I0LCAjLTJdCQkJQCBUaHVtYiBpbnN0cnVjdGlvbiBhdCBMUiAtIDIKIAljbXAJcjAsICMweGU4MDAJCQlAIDMyLWJpdCBpbnN0cnVjdGlvbiBpZiB4eCA+PSAwCi0JbGRyaGhzCXI5LCBbcjRdCQkJQCBib3R0b20gMTYgYml0cwotCW9ycmhzCXIwLCByOSwgcjAsIGxzbCAjMTYKKwlibG8JX191bmRfc3ZjX2ZhdWx0CisJbGRyaAlyOSwgW3I0XQkJCUAgYm90dG9tIDE2IGJpdHMKKwlhZGQJcjQsIHI0LCAjMgorCXN0cglyNCwgW3NwLCAjU19QQ10KKwlvcnIJcjAsIHI5LCByMCwgbHNsICMxNgogI2VuZGlmCi0JYWRyCXI5LCBCU1lNKDFmKQorCWFkcglyOSwgQlNZTShfX3VuZF9zdmNfZmluaXNoKQogCW1vdglyMiwgcjQKIAlibAljYWxsX2ZwZQogCisJbW92CXIxLCAjNAkJCQlAIFBDIGNvcnJlY3Rpb24gdG8gYXBwbHkKK19fdW5kX3N2Y19mYXVsdDoKIAltb3YJcjAsIHNwCQkJCUAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MKLQlibAlkb191bmRlZmluc3RyCisJYmwJX191bmRfZmF1bHQKIAogCUAKIAlAIElSUXMgb2ZmIGFnYWluIGJlZm9yZSBwdWxsaW5nIHByZXNlcnZlZCBkYXRhIG9mZiB0aGUgc3RhY2sKIAlACi0xOglkaXNhYmxlX2lycV9ub3RyYWNlCitfX3VuZF9zdmNfZmluaXNoOgorCWRpc2FibGVfaXJxX25vdHJhY2UKIAogCUAKIAlAIHJlc3RvcmUgU1BTUiBhbmQgcmVzdGFydCB0aGUgaW5zdHJ1Y3Rpb24KQEAgLTQyMSwyNSArNDQxLDMzIEBACiAJbW92CXIyLCByNAogCW1vdglyMywgcjUKIAorCUAgcjIgPSByZWdzLT5BUk1fcGMsIHdoaWNoIGlzIGVpdGhlciAyIG9yIDQgYnl0ZXMgYWhlYWQgb2YgdGhlCisJQCAgICAgIGZhdWx0aW5nIGluc3RydWN0aW9uIGRlcGVuZGluZyBvbiBUaHVtYiBtb2RlLgorCUAgcjMgPSByZWdzLT5BUk1fY3BzcgogCUAKLQlAIGZhbGwgdGhyb3VnaCB0byB0aGUgZW11bGF0aW9uIGNvZGUsIHdoaWNoIHJldHVybnMgdXNpbmcgcjkgaWYKLQlAIGl0IGhhcyBlbXVsYXRlZCB0aGUgaW5zdHJ1Y3Rpb24sIG9yIHRoZSBtb3JlIGNvbnZlbnRpb25hbCBscgotCUAgaWYgd2UgYXJlIHRvIHRyZWF0IHRoaXMgYXMgYSByZWFsIHVuZGVmaW5lZCBpbnN0cnVjdGlvbgotCUAKLQlAICByMCAtIGluc3RydWN0aW9uCisJQCBUaGUgZW11bGF0aW9uIGNvZGUgcmV0dXJucyB1c2luZyByOSBpZiBpdCBoYXMgZW11bGF0ZWQgdGhlCisJQCBpbnN0cnVjdGlvbiwgb3IgdGhlIG1vcmUgY29udmVudGlvbmFsIGxyIGlmIHdlIGFyZSB0byB0cmVhdAorCUAgdGhpcyBhcyBhIHJlYWwgdW5kZWZpbmVkIGluc3RydWN0aW9uCiAJQAogCWFkcglyOSwgQlNZTShyZXRfZnJvbV9leGNlcHRpb24pCi0JYWRyCWxyLCBCU1lNKF9fdW5kX3Vzcl91bmtub3duKQorCiAJdHN0CXIzLCAjUFNSX1RfQklUCQkJQCBUaHVtYiBtb2RlPwotCWl0ZXQJZXEJCQkJQCBleHBsaWNpdCBJVCBuZWVkZWQgZm9yIHRoZSAxZiBsYWJlbAotCXN1YmVxCXI0LCByMiwgIzQJCQlAIEFSTSBpbnN0ciBhdCBMUiAtIDQKLQlzdWJuZQlyNCwgcjIsICMyCQkJQCBUaHVtYiBpbnN0ciBhdCBMUiAtIDIKLTE6CWxkcmVxdAlyMCwgW3I0XQorCWJuZQlfX3VuZF91c3JfdGh1bWIKKwlzdWIJcjQsIHIyLCAjNAkJCUAgQVJNIGluc3RyIGF0IExSIC0gNAorMToJbGRydAlyMCwgW3I0XQogI2lmZGVmIENPTkZJR19DUFVfRU5ESUFOX0JFOAotCXJldmVxCXIwLCByMAkJCQlAIGxpdHRsZSBlbmRpYW4gaW5zdHJ1Y3Rpb24KKwlyZXYJcjAsIHIwCQkJCUAgbGl0dGxlIGVuZGlhbiBpbnN0cnVjdGlvbgogI2VuZGlmCi0JYmVxCWNhbGxfZnBlCisJQCByMCA9IDMyLWJpdCBBUk0gaW5zdHJ1Y3Rpb24gd2hpY2ggY2F1c2VkIHRoZSBleGNlcHRpb24KKwlAIHIyID0gUEMgdmFsdWUgZm9yIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gKDo9IHJlZ3MtPkFSTV9wYykKKwlAIHI0ID0gUEMgdmFsdWUgZm9yIHRoZSBmYXVsdGluZyBpbnN0cnVjdGlvbgorCUAgbHIgPSAzMi1iaXQgdW5kZWZpbmVkIGluc3RydWN0aW9uIGZ1bmN0aW9uCisJYWRyCWxyLCBCU1lNKF9fdW5kX3Vzcl9mYXVsdF8zMikKKwliCWNhbGxfZnBlCisKK19fdW5kX3Vzcl90aHVtYjoKIAlAIFRodW1iIGluc3RydWN0aW9uCisJc3ViCXI0LCByMiwgIzIJCQlAIEZpcnN0IGhhbGYgb2YgdGh1bWIgaW5zdHIgYXQgTFIgLSAyCiAjaWYgQ09ORklHX0FSTV9USFVNQiAmJiBfX0xJTlVYX0FSTV9BUkNIX18gPj0gNiAmJiBDT05GSUdfQ1BVX1Y3CiAvKgogICogVGh1bWItMiBpbnN0cnVjdGlvbiBoYW5kbGluZy4gIE5vdGUgdGhhdCBiZWNhdXNlIHByZS12NiBhbmQgPj0gdjYgcGxhdGZvcm1zCkBAIC00NTMsNyArNDgxLDcgQEAKIAlsZHIJcjUsIC5MQ2NwdV9hcmNoaXRlY3R1cmUKIAlsZHIJcjUsIFtyNV0KIAljbXAJcjUsICNDUFVfQVJDSF9BUk12NwotCWJsbwlfX3VuZF91c3JfdW5rbm93bgorCWJsbwlfX3VuZF91c3JfZmF1bHRfMTYJCUAgMTZiaXQgdW5kZWZpbmVkIGluc3RydWN0aW9uCiAvKgogICogVGhlIGZvbGxvd2luZyBjb2RlIHdvbid0IGdldCBydW4gdW5sZXNzIHRoZSBydW5uaW5nIENQVSByZWFsbHkgaXMgdjcsIHNvCiAgKiBjb2Rpbmcgcm91bmQgdGhlIGxhY2sgb2YgbGRyaHQgb24gb2xkZXIgYXJjaGVzIGlzIHBvaW50bGVzcy4gIFRlbXBvcmFyaWx5CkBAIC00NjEsMTUgKzQ4OSwxOCBAQAogICovCiAJLmFyY2gJYXJtdjZ0MgogI2VuZGlmCi0yOgotIEFSTSgJbGRyaHQJcjUsIFtyNF0sICMyCSkKLSBUSFVNQigJbGRyaHQJcjUsIFtyNF0JKQotIFRIVU1CKAlhZGQJcjQsIHI0LCAjMgkpCisyOglsZHJodAlyNSwgW3I0XQogCWNtcAlyNSwgIzB4ZTgwMAkJCUAgMzJiaXQgaW5zdHJ1Y3Rpb24gaWYgeHggIT0gMAotCWJsbwlfX3VuZF91c3JfdW5rbm93bgotMzoJbGRyaHQJcjAsIFtyNF0KKwlibG8JX191bmRfdXNyX2ZhdWx0XzE2CQlAIDE2Yml0IHVuZGVmaW5lZCBpbnN0cnVjdGlvbgorMzoJbGRyaHQJcjAsIFtyMl0KIAlhZGQJcjIsIHIyLCAjMgkJCUAgcjIgaXMgUEMgKyAyLCBtYWtlIGl0IFBDICsgNAorCXN0cglyMiwgW3NwLCAjU19QQ10JCQlAIGl0J3MgYSAyeDE2Yml0IGluc3RyLCB1cGRhdGUKIAlvcnIJcjAsIHIwLCByNSwgbHNsICMxNgorCWFkcglsciwgQlNZTShfX3VuZF91c3JfZmF1bHRfMzIpCisJQCByMCA9IHRoZSB0d28gMTYtYml0IFRodW1iIGluc3RydWN0aW9ucyB3aGljaCBjYXVzZWQgdGhlIGV4Y2VwdGlvbgorCUAgcjIgPSBQQyB2YWx1ZSBmb3IgdGhlIGZvbGxvd2luZyBUaHVtYiBpbnN0cnVjdGlvbiAoOj0gcmVncy0+QVJNX3BjKQorCUAgcjQgPSBQQyB2YWx1ZSBmb3IgdGhlIGZpcnN0IDE2LWJpdCBUaHVtYiBpbnN0cnVjdGlvbgorCUAgbHIgPSAzMmJpdCB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gZnVuY3Rpb24KIAogI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA8IDcKIC8qIElmIHRoZSB0YXJnZXQgYXJjaCB3YXMgb3ZlcnJpZGRlbiwgY2hhbmdlIGl0IGJhY2s6ICovCkBAIC00ODAsMTcgKzUxMSwxMyBAQAogI2VuZGlmCiAjZW5kaWYgLyogX19MSU5VWF9BUk1fQVJDSF9fIDwgNyAqLwogI2Vsc2UgLyogIShDT05GSUdfQVJNX1RIVU1CICYmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2ICYmIENPTkZJR19DUFVfVjcpICovCi0JYglfX3VuZF91c3JfdW5rbm93bgorCWIJX191bmRfdXNyX2ZhdWx0XzE2CiAjZW5kaWYKLSBVTldJTkQoLmZuZW5kCQkpCisgVU5XSU5EKC5mbmVuZCkKIEVORFBST0MoX191bmRfdXNyKQogCi0JQAotCUAgZmFsbHRocm91Z2ggdG8gY2FsbF9mcGUKLQlACi0KIC8qCi0gKiBUaGUgb3V0IG9mIGxpbmUgZml4dXAgZm9yIHRoZSBsZHJ0IGFib3ZlLgorICogVGhlIG91dCBvZiBsaW5lIGZpeHVwIGZvciB0aGUgbGRydCBpbnN0cnVjdGlvbnMgYWJvdmUuCiAgKi8KIAkucHVzaHNlY3Rpb24gLmZpeHVwLCAiYXgiCiA0Ogltb3YJcGMsIHI5CkBAIC01MjEsMTEgKzU0OCwxMiBAQAogICogTkVPTiBoYW5kbGVyIGNvZGUuCiAgKgogICogRW11bGF0b3JzIG1heSB3aXNoIHRvIG1ha2UgdXNlIG9mIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXJzOgotICogIHIwICA9IGluc3RydWN0aW9uIG9wY29kZS4KLSAqICByMiAgPSBQQys0CisgKiAgcjAgID0gaW5zdHJ1Y3Rpb24gb3Bjb2RlICgzMi1iaXQgQVJNIG9yIHR3byAxNi1iaXQgVGh1bWIpCisgKiAgcjIgID0gUEMgdmFsdWUgdG8gcmVzdW1lIGV4ZWN1dGlvbiBhZnRlciBzdWNjZXNzZnVsIGVtdWxhdGlvbgogICogIHI5ICA9IG5vcm1hbCAic3VjY2Vzc2Z1bCIgcmV0dXJuIGFkZHJlc3MKLSAqICByMTAgPSB0aGlzIHRocmVhZHMgdGhyZWFkX2luZm8gc3RydWN0dXJlLgorICogIHIxMCA9IHRoaXMgdGhyZWFkcyB0aHJlYWRfaW5mbyBzdHJ1Y3R1cmUKICAqICBsciAgPSB1bnJlY29nbmlzZWQgaW5zdHJ1Y3Rpb24gcmV0dXJuIGFkZHJlc3MKKyAqIElSUXMgZGlzYWJsZWQsIEZJUXMgZW5hYmxlZC4KICAqLwogCUAKIAlAIEZhbGwtdGhyb3VnaCBmcm9tIFRodW1iLTIgX191bmRfdXNyCkBAIC02NjAsMTIgKzY4OCwxNyBAQAogCW1vdglwYywgbHIKIEVORFBST0Mobm9fZnApCiAKLV9fdW5kX3Vzcl91bmtub3duOgotCWVuYWJsZV9pcnEKK19fdW5kX3Vzcl9mYXVsdF8zMjoKKwltb3YJcjEsICM0CisJYgkxZgorX191bmRfdXNyX2ZhdWx0XzE2OgorCW1vdglyMSwgIzIKKzE6CWVuYWJsZV9pcnEKIAltb3YJcjAsIHNwCiAJYWRyCWxyLCBCU1lNKHJldF9mcm9tX2V4Y2VwdGlvbikKLQliCWRvX3VuZGVmaW5zdHIKLUVORFBST0MoX191bmRfdXNyX3Vua25vd24pCisJYglfX3VuZF9mYXVsdAorRU5EUFJPQyhfX3VuZF91c3JfZmF1bHRfMzIpCitFTkRQUk9DKF9fdW5kX3Vzcl9mYXVsdF8xNikKIAogCS5hbGlnbgk1CiBfX3BhYnRfdXNyOgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWNvbW1vbi5TCmluZGV4IGIyYTI3YjYuLmFhY2FlMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1jb21tb24uUworKysgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktY29tbW9uLlMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vdW53aW5kLmg+CiAKICNpbmNsdWRlICJlbnRyeS1oZWFkZXIuUyIKLQorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKIAkuYWxpZ24JNQogLyoKQEAgLTU4Myw2ICs1ODMsNyBAQAogICovCiBzeXNfbW1hcDI6CiAjaWYgUEFHRV9TSElGVCA+IDEyCisjZGVmaW5lIFBHT0ZGX01BU0sgKCgxIDw8IChQQUdFX1NISUZUIC0gMTIpKSAtIDEpCiAJCXRzdAlyNSwgI1BHT0ZGX01BU0sKIAkJbW92ZXEJcjUsIHI1LCBsc3IgI1BBR0VfU0hJRlQgLSAxMgogCQlzdHJlcQlyNSwgW3NwLCAjNF0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1oZWFkZXIuUwppbmRleCA5YTg1MzFlLi4zOWI0YmQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktaGVhZGVyLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWhlYWRlci5TCkBAIC0xMDgsMTEgKzEwOCwxNyBAQAogCW1vdnMJcGMsIGxyCQkJCUAgcmV0dXJuICYgbW92ZSBzcHNyX3N2YyBpbnRvIGNwc3IKIAkuZW5kbQogCisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKIAkubWFjcm8JZ2V0X3RocmVhZF9pbmZvLCByZAogCW1vdglccmQsIHNwLCBsc3IgIzEzCiAJbW92CVxyZCwgXHJkLCBsc2wgIzEzCiAJLmVuZG0KLQorI2Vsc2UKKwkubWFjcm8JZ2V0X3RocmVhZF9pbmZvLCByZAorCW1vdglccmQsIHNwLCBsc3IgIzE2CisJbW92CVxyZCwgXHJkLCBsc2wgIzE2CisJLmVuZG0KKyNlbmRpZgogCUAKIAlAIDMyLWJpdCB3aWRlICJtb3YgcGMsIHJlZyIKIAlACkBAIC0xNDgsMTEgKzE1NCwxOCBAQAogCW1vdnMJcGMsIGxyCQkJCUAgcmV0dXJuICYgbW92ZSBzcHNyX3N2YyBpbnRvIGNwc3IKIAkuZW5kbQogCisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKIAkubWFjcm8JZ2V0X3RocmVhZF9pbmZvLCByZAogCW1vdglccmQsIHNwCiAJbHNyCVxyZCwgXHJkLCAjMTMKIAltb3YJXHJkLCBccmQsIGxzbCAjMTMKIAkuZW5kbQorI2Vsc2UKKwkubWFjcm8JZ2V0X3RocmVhZF9pbmZvLCByZAorCW1vdglccmQsIHNwLCBsc3IgIzE2CisJbW92CVxyZCwgXHJkLCBsc2wgIzE2CisJLmVuZG0KKyNlbmRpZgogCiAJQAogCUAgMzItYml0IHdpZGUgIm1vdiBwYywgcmVnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2hlYWQuUyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKaW5kZXggMDhjODJmZC4uZWViNGQ4NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2hlYWQuUworKysgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCkBAIC00NCw5ICs0NCwxNyBAQAogCiAJLmdsb2JsCXN3YXBwZXJfcGdfZGlyCiAJLmVxdQlzd2FwcGVyX3BnX2RpciwgS0VSTkVMX1JBTV9WQUREUiAtIFBHX0RJUl9TSVpFCi0KKy8qCisqCU1pbmRzcGVlZDoKKyogICBOZWVkIHRvIGJyZWFrIHRoZSBmdW5jdGlvbiBpbiBjYXNlIHRleHQgb2Zmc2V0IGlzIHRvbyBiaWcKKyogICB0aGlzIGlzIHRoZSBjYXNlIHdoZW4gdXNpbmcgem9uZV9kbWEKKyoJVGhlcmUgaXMgcHJvYmFibHkgYSBtb3JlIGVsZWdhbnQgd2F5IHRvIHRvIHRoYXQKKyoJb3JpZ2luYWwgY29kZToKKyoJYWRkCVxyZCwgXHBoeXMsICNURVhUX09GRlNFVCAtIFBHX0RJUl9TSVpFCisqLwogCS5tYWNybwlwZ3RibCwgcmQsIHBoeXMKLQlhZGQJXHJkLCBccGh5cywgI1RFWFRfT0ZGU0VUIC0gUEdfRElSX1NJWkUKKwlsZHIJXHJkLCA9VEVYVF9PRkZTRVQgLSBQR19ESVJfU0laRQorCWFkZAlccmQsIFxwaHlzLCBccmQKIAkuZW5kbQogCiAjaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbGVlcC5TIGIvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKaW5kZXggMDIwZTk5Yy4uMGE1ODliNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKQEAgLTUsNiArNSwxMyBAQAogI2luY2x1ZGUgPGFzbS9nbHVlLWNhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL2dsdWUtcHJvYy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorLyogCisgKiBJUkFNIExvY2F0aW9uIHRvIHJlc3RvcmUgdGhlIGJhbmtlZCByZWdpc3RlcnMKKyAqLworI2RlZmluZSBTQ1JBVENIUEFEX0NQVV9DT05URVhUX0xPQ19EQkcJICgweGYwODAyNTcwKQorI2VuZGlmCiAJLnRleHQKIAogLyoKQEAgLTY0LDEwICs3MSw2NiBAQAogRU5EUFJPQyhjcHVfcmVzdW1lX21tdSkKIGNwdV9yZXN1bWVfYWZ0ZXJfbW11OgogCWJsCWNwdV9pbml0CQlAIHJlc3RvcmUgdGhlIHVuZC9hYnQvaXJxIGJhbmtlZCByZWdzCisKKyNpZmRlZiBDT05GSUdfQVJDSF9NODZYWFgKKwkvKiAKKwkgKiBUaGlzIGNvZGUgaXMgYWRkZWQgdG8gcmVzdG9yZSB0aGUgYmFua2VkIHJlZ2lzdGVycworCSAqIFRoaXMgcmVzdG9yZSBoYXMgdG8gYmUga2VwdCBoZXJlIGFzIGl0IGhhcyB0byBoYXBwZW4gCisJICogYWZ0ZXIgTU1VIGludC4KKwkgKi8KKworCS8qIFJlc3RvcmUgY3BzciBhbmQgc3BzciAqLworICAgICAgICBsZHIgCXI3LCBzY3JhdGNocGFkX2NwdV9jb250ZXh0X2xvY19kYmcKKworCS8qIFJlc3RvcmluZyBhbGwgdGhlIGJhbmtlZCByZWdpc3RlcnMgKi8KKyAgICAgICAgbXJzICAgICByMCwgY3BzcgorCisgICAgICAgIC8qIFJlc3RvcmUgdGhlIFVuZGVmIG1vZGUgcmVpc3RlcnMgKi8KKyAgICAgICAgYmljICAgICByMSwgcjAsICMweDFmCisgICAgICAgIG9yciAgICAgcjEsIHIxLCAjMHgxYgorICAgICAgICBtc3IgICAgIGNwc3JfYywgcjEKKwlBUk0gKCBsZG1pYQlyNyEsIHtyMTMtcjE0fSApCisJbGRtaWEJcjchLCB7cjZ9CisJbXNyCXNwc3IsIHI2CisKKyAgICAgICAgLyogUmVzdG9yZSB0aGUgQWJvcnQgbW9kZSByZWlzdGVycyAqLworICAgICAgICBiaWMgICAgIHIxLCByMCwgIzB4MWYKKyAgICAgICAgb3JyICAgICByMSwgcjEsICMweDE3CisgICAgICAgIG1zciAgICAgY3Bzcl9jLCByMQorCUFSTSAoIGxkbWlhCXI3ISwge3IxMy1yMTR9ICkKKwlsZG1pYQlyNyEsIHtyNn0KKwltc3IJc3BzciwgcjYKKworICAgICAgICAvKiBSZXN0b3JlIHRoZSBJUlEgbW9kZSByZWlzdGVycyAqLworICAgICAgICBiaWMgICAgIHIxLCByMCwgIzB4MWYKKyAgICAgICAgb3JyICAgICByMSwgcjEsICMweDEyCisgICAgICAgIG1zciAgICAgY3Bzcl9jLCByMQorCUFSTSAoIGxkbWlhCXI3ISwge3IxMy1yMTR9ICkKKwlsZG1pYQlyNyEsIHtyNn0KKwltc3IJc3BzciwgcjYKKworICAgICAgICAvKiBSZXN0b3JlIHRoZSBGSVEgbW9kZSByZWlzdGVycyAqLworICAgICAgICBiaWMgICAgIHIxLCByMCwgIzB4MWYKKyAgICAgICAgb3JyICAgICByMSwgcjEsICMweDExCisgICAgICAgIG1zciAgICAgY3Bzcl9jLCByMQorCUFSTSAoIGxkbWlhCXI3ISwge3I4LXIxNH0gKQorCVRIVU1CICggbGRtaWEJcjchLCB7cjgtcjEyfSApCisJbGRtaWEJcjchLCB7cjZ9CisJbXNyCXNwc3IsIHI2CisKKyAgICAgICAgLyogUmV0dXJuIHRvIHRoZSBvcmlnaW5hbCBtb2RlICovCisgICAgICAgIG1zciAgICAgY3Bzcl9jLCByMAorI2VuZGlmCiAJbW92CXIwLCAjMAkJCUAgcmV0dXJuIHplcm8gb24gc3VjY2VzcwogCWxkbWZkCXNwISwge3I0IC0gcjExLCBwY30KIEVORFBST0MoY3B1X3Jlc3VtZV9hZnRlcl9tbXUpCiAKKworI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorc2NyYXRjaHBhZF9jcHVfY29udGV4dF9sb2NfZGJnOgorICAgICAgICAud29yZCAgIFNDUkFUQ0hQQURfQ1BVX0NPTlRFWFRfTE9DX0RCRworI2VuZGlmCisKIC8qCiAgKiBOb3RlOiBZZXMsIHBhcnQgb2YgdGhlIGZvbGxvd2luZyBjb2RlIGlzIGxvY2F0ZWQgaW50byB0aGUgLmRhdGEgc2VjdGlvbi4KICAqICAgICAgIFRoaXMgaXMgdG8gYWxsb3cgc2xlZXBfc2F2ZV9zcCB0byBiZSBhY2Nlc3NlZCB3aXRoIGEgcmVsYXRpdmUgbG9hZApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IDFkMTcxMGUuLjBmN2EyNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTM0NSw3ICszNDUsMTAgQEAKIAkgKiBub3cuCiAJICovCiAJbG9jYWxfaXJxX2VuYWJsZSgpOworCisjaWZuZGVmIENPTkZJR19DT01DRVJUT19NU1AKIAlsb2NhbF9maXFfZW5hYmxlKCk7CisjZW5kaWYgIC8qICFDT05GSUdfQ09NQ0VSVE9fTVNQICovCiAKIAkvKgogCSAqIE9LLCBpdCdzIG9mZiB0byB0aGUgaWRsZSB0aHJlYWQgZm9yIHVzCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wX3NjdS5jIGIvYXJjaC9hcm0va2VybmVsL3NtcF9zY3UuYwppbmRleCA4ZjVkZDc5Li5mZjg0NzcyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc21wX3NjdS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXBfc2N1LmMKQEAgLTUyLDYgKzUyLDEwIEBACiAJaWYgKHNjdV9jdHJsICYgMSkKIAkJcmV0dXJuOwogCisjaWZkZWYgQ09ORklHX1NDVV9TUEVDVUxBVElWRV9MSU5FX0ZJTExTCisJc2N1X2N0cmwgfD0gKDEgPDwgMyk7CisjZW5kaWYKKwogCXNjdV9jdHJsIHw9IDE7CiAJX19yYXdfd3JpdGVsKHNjdV9jdHJsLCBzY3VfYmFzZSArIFNDVV9DVFJMKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwppbmRleCAxNjBjYjE2Li44MzgwYmQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FybS9rZXJuZWwvdHJhcHMuYwpAQCAtMzYyLDE4ICszNjIsMTAgQEAKIAogYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uIGRvX3VuZGVmaW5zdHIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdW5zaWduZWQgaW50IGNvcnJlY3Rpb24gPSB0aHVtYl9tb2RlKHJlZ3MpID8gMiA6IDQ7CiAJdW5zaWduZWQgaW50IGluc3RyOwogCXNpZ2luZm9fdCBpbmZvOwogCXZvaWQgX191c2VyICpwYzsKIAotCS8qCi0JICogQWNjb3JkaW5nIHRvIHRoZSBBUk0gQVJNLCBQQyBpcyAyIG9yIDQgYnl0ZXMgYWhlYWQsCi0JICogZGVwZW5kaW5nIHdoZXRoZXIgd2UncmUgaW4gVGh1bWIgbW9kZSBvciBub3QuCi0JICogQ29ycmVjdCB0aGlzIG9mZnNldC4KLQkgKi8KLQlyZWdzLT5BUk1fcGMgLT0gY29ycmVjdGlvbjsKLQogCXBjID0gKHZvaWQgX191c2VyICopaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKIAogCWlmIChwcm9jZXNzb3JfbW9kZShyZWdzKSA9PSBTVkNfTU9ERSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL01ha2VmaWxlIGIvYXJjaC9hcm0vbGliL01ha2VmaWxlCmluZGV4IGNmNzNhN2YuLjdjNjlkZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9saWIvTWFrZWZpbGUKQEAgLTQyLDYgKzQyLDcgQEAKIAogbGliLSQoQ09ORklHX0FSQ0hfUlBDKQkJKz0gZWNhcmQubyBpby1hY29ybi5vIGZsb3BweWRtYS5vCiBsaWItJChDT05GSUdfQVJDSF9TSEFSSykJKz0gaW8tc2hhcmsubworbGliLSQoQ09ORklHX0NPTUNFUlRPX1pPTkVfRE1BX05DTkIpICs9IGF0b21pYy5vCiAKICQob2JqKS9jc3VtcGFydGlhbGNvcHkubzoJJChvYmopL2NzdW1wYXJ0aWFsY29weWdlbmVyaWMuUwogJChvYmopL2NzdW1wYXJ0aWFsY29weXVzZXIubzoJJChvYmopL2NzdW1wYXJ0aWFsY29weWdlbmVyaWMuUwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2F0b21pYy5jIGIvYXJjaC9hcm0vbGliL2F0b21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NjBkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9saWIvYXRvbWljLmMKQEAgLTAsMCArMSw0OCBAQAorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCitzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhhdG9taWNfbG9jayk7CisKK3N0cnVjdCB2aXJ0dWFsX3pvbmUgYXJtX2RtYV96b25lOyAvKiBpbml0aWFsaXplZCBpbiBhcmNoL2FybS9tbS9tbXUuYzo6bWFwX2xvd21lbSgpICovCitFWFBPUlRfU1lNQk9MKGFybV9kbWFfem9uZSk7CisKK2ludCBjb21jZXJ0b19hdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXN1bHQ7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisJdi0+Y291bnRlciArPSBpOworCXJlc3VsdCA9IHYtPmNvdW50ZXI7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChjb21jZXJ0b19hdG9taWNfYWRkKTsKKworaW50IGNvbWNlcnRvX2F0b21pY19jbXB4Y2hnKGF0b21pY190ICp2LCBpbnQgb2xkLCBpbnQgbmV3KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlc3VsdDsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmYXRvbWljX2xvY2ssIGZsYWdzKTsKKwlyZXN1bHQgPSB2LT5jb3VudGVyOworCWlmIChsaWtlbHkocmVzdWx0ID09IG9sZCkpCisJCXYtPmNvdW50ZXIgPSBuZXc7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorRVhQT1JUX1NZTUJPTChjb21jZXJ0b19hdG9taWNfY21weGNoZyk7CisKK3ZvaWQgY29tY2VydG9fYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgbG9uZyBtYXNrLCB1bnNpZ25lZCBsb25nICphZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmF0b21pY19sb2NrLCBmbGFncyk7CisJKmFkZHIgJj0gfm1hc2s7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmF0b21pY19sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGNvbWNlcnRvX2F0b21pY19jbGVhcl9tYXNrKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NvcHlfcGFnZS5TIGIvYXJjaC9hcm0vbGliL2NvcHlfcGFnZS5TCmluZGV4IDZlZTJmNjcuLmViMGY1ODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jb3B5X3BhZ2UuUworKysgYi9hcmNoL2FybS9saWIvY29weV9wYWdlLlMKQEAgLTI4LDcgKzI4LDcgQEAKIAkJc3RtZmQJc3AhLCB7cjQsIGxyfQkJCUAJMgogCVBMRCgJcGxkCVtyMSwgIzBdCQkpCiAJUExEKAlwbGQJW3IxLCAjTDFfQ0FDSEVfQllURVNdCQkpCi0JCW1vdglyMiwgI0NPUFlfQ09VTlQJCQlACTEKKwkJbGRyCXIyLCA9Q09QWV9DT1VOVAkJCUAJMQogCQlsZG1pYQlyMSEsIHtyMywgcjQsIGlwLCBscn0JCUAJNCsxCiAxOglQTEQoCXBsZAlbcjEsICMyICogTDFfQ0FDSEVfQllURVNdKQogCVBMRCgJcGxkCVtyMSwgIzMgKiBMMV9DQUNIRV9CWVRFU10pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczNTQ3OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vS2NvbmZpZwpAQCAtMCwwICsxLDI4OSBAQAoraWYgQVJDSF9DT01DRVJUTworCittZW51ICJDb21jZXJ0byBJbXBsZW1lbnRhdGlvbiBPcHRpb25zIgorCitjb25maWcgQVJDSF9TVVBQT1JUU19CSUdfRU5ESUFOCisJYm9vbCAiQXJjaGl0ZWN0dXJlIHN1cHBvcnRzIEJpZyBFbmRpYW4iCisgICAgICAgIGRlZmF1bHQgbgorCitjaG9pY2UKKwlwcm9tcHQgIkNvbWNlcnRvIFN5c3RlbSBUeXBlIgorCWRlZmF1bHQgQ09ORklHX0FSQ0hfTTg2WFhYCisKK2NvbmZpZyBBUkNIX004NlhYWAorCWJvb2wgIk04Nnh4eCIKKwlzZWxlY3QgQ1BVX1Y3CisJc2VsZWN0IEFSTV9HSUMKKwlzZWxlY3QgQVJNX0VSUkFUQV83NDM2MjIKKwlzZWxlY3QgQVJNX0VSUkFUQV83NTE0NzIKKwlzZWxlY3QgQVJNX0VSUkFUQV83NTQzMjIKKwlzZWxlY3QgQVJNX0VSUkFUQV83NjQzNjkgaWYgU01QCisJc2VsZWN0IE1URF9DT01DRVJUT19OT1IKKwlzZWxlY3QgQ09NQ0VSVE9fVUFSVDFfU1VQUE9SVAorCXNlbGVjdCBDT01DRVJUT19QRkVfVUFSVF9TVVBQT1JUCisJc2VsZWN0IENPTUNFUlRPX1VTQjJfU1VQUE9SVAorCXNlbGVjdCBDT01DRVJUT19VU0IzX1NVUFBPUlQKKyAJc2VsZWN0IENPTUNFUlRPX1VTQjNfSU5URVJOQUxfQ0xLCisJc2VsZWN0IENPTUNFUlRPX0lQU0VDX1NVUFBPUlQKKwlzZWxlY3QgQ09NQ0VSVE9fSTJDX1NVUFBPUlQKKwlzZWxlY3QgR0VORVJJQ19USU1FCisJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlzZWxlY3QgSEFWRV9TQ0hFRF9DTE9DSworCXNlbGVjdCBDT01DRVJUT19EV19ETUFfU1VQUE9SVAorCXNlbGVjdCBDTEtERVZfTE9PS1VQCisJc2VsZWN0IEFSQ0hfSEFTX0NQVUZSRVEKKwlzZWxlY3QgQVJDSF9IQVNfT1BQCisJc2VsZWN0IE1JR0hUX0hBVkVfUENJIGlmICFSVFNNX0MySworCXNlbGVjdCBQQ0lfTVNJIGlmIFBDSQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgd2l0aCBhIENvbWNlcnRvMjAwMCBkZXZpY2UuCisKK2VuZGNob2ljZQorCisKKworY2hvaWNlCisJcHJvbXB0ICJDb21jZXJ0byBCb2FyZCB0eXBlIgorCWRlZmF1bHQgUlRTTV9DMksKKworY29uZmlnIEMyS19FVk0KKwlib29sICJFVk0iCisJZGVwZW5kcyBvbiBBUkNIX004NlhYWAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgd2l0aCBhIEMySyBFVk0uCisKK2NvbmZpZyBDMktfTUZDTl9FVk0KKwlib29sICJNRkNOIEVWTSIKKwlkZXBlbmRzIG9uIEFSQ0hfTTg2WFhYCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaW50ZW5kIHRvIHJ1biB0aGlzIGtlcm5lbCB3aXRoIGEgQzJLIE1GQ04gRVZNLgorCitjb25maWcgQzJLX0FTSUMKKwlib29sICJBU0lDIgorCWRlcGVuZHMgb24gQVJDSF9NODZYWFgKKwlzZWxlY3QgQ09NQ0VSVE9fVUFSVDBfU1VQUE9SVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGludGVuZCB0byBydW4gdGhpcyBrZXJuZWwgd2l0aCBhIEMySyBBU0lDLgorCitjb25maWcgUlRTTV9DMksKKwlib29sICJSVFNNIgorCWRlcGVuZHMgb24gQVJDSF9NODZYWFgKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBpbnRlbmQgdG8gcnVuIHRoaXMga2VybmVsIHdpdGggYSBDMksgUlRTTS4KKwkgIAorZW5kY2hvaWNlCisKKworY29uZmlnIE1URF9DT01DRVJUT19OT1IKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBDT01DRVJUT19URE1fQ0xPQ0sKKyAgICAgICAgYm9vbCAiQ29tY2VydG8gZGV2aWNlIFRETSBjbG9jayBhbmQgZnJhbWUgc3luYyBjb250cm9sIHRocm91Z2ggc3lzZnMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaWYgeW91IGludGVuZCB0byB1c2UgdGhlIENvbWNlcnRvIFRETSBhbmQgYmUgYWJsZSB0byBjaGFuZ2UKKwkgIGRpZmZlcmVudCBwYXJhbWV0ZXJzIHRocm91Z2ggc3lzZnMuCisKK2NvbmZpZyBDT01DRVJUT19DU1lTX1RQSV9DTE9DSworICAgICAgICBib29sICJDb21jZXJ0byBkZXZpY2UgVFBJIGFuZCBDU1lTIGNsb2NrIGNvbnRyb2wgIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gdXNlIHRoZSBDb21jZXJ0byBUUEkgKENvcnRleCBBOSBKVEFHIGludGVyZmFjZSkgYW5kIENTWVMgY2xvY2sgKENvcnRleCBBOSBDb3JlU2lnaHQgbW9kdWxlKS4KKworY29uZmlnIENPTUNFUlRPX1BDSUVfT0NDX0NMT0NLCisgICAgICAgIGJvb2wgIkNvbWNlcnRvIGRldmljZSBQQ0lFIE9DQyBjbG9jayBjb250cm9sICIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIHVzZSB0aGUgQ29tY2VydG8gUENJRSBPQ0MgY2xvY2suCisKK2NvbmZpZyBDT01DRVJUT19TQVRBX09DQ19DTE9DSworICAgICAgICBib29sICJDb21jZXJ0byBkZXZpY2UgU0FUQSBPQ0MgY2xvY2sgY29udHJvbCAiCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5IFkgaWYgeW91IGludGVuZCB0byB1c2UgdGhlIENvbWNlcnRvIFNBVEEgT0NDIGNsb2NrLgorCitjb25maWcgQ09NQ0VSVE9fU0dNSUlfT0NDX0NMT0NLCisgICAgICAgIGJvb2wgIkNvbWNlcnRvIGRldmljZSBTR01JSSBPQ0MgY2xvY2sgY29udHJvbCAiCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5IFkgaWYgeW91IGludGVuZCB0byB1c2UgdGhlIENvbWNlcnRvIFNHTUlJIE9DQyBjbG9jay4KKworY29uZmlnIENPTUNFUlRPX01FTUJVRgorCWJvb2wgIkNvbWNlcnRvIG1lbW9yeSBidWZmZXIgZHJpdmVyIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gdXNlIHRoZSBtZW1vcnkgYnVmZmVyIGRyaXZlci4gVGhpcyBkcml2ZXIgaGVscHMKKwkgIExpbnV4IHVzZXIgc3BhY2UgYXBwbGljYXRpb25zIHNldHVwIGEgcGh5c2ljYWwgc2NhdHRlciBidWZmZXIgdGhhdCBjYW4gYmUgdXNlZAorCSAgZGlyZWN0bHkgYnkgdGhlIFBGRS4gQ3VycmVudGx5IHRoZSBQRkUgaG9sZCB0b25lIGdlbmVyYXRpb24gZmVhdHVyZSByZXF1aXJlcworCSAgdGhpcyBkcml2ZXIgdG8gYmUgZW5hYmxlZC4KKworY29uZmlnIENPTUNFUlRPX05VTV9QQ0lFUworCWludCAiTnVtYmVyIG9mIFBDSWUgY29udHJvbGxlcnMgdG8gYmUgZW5hYmxlZCAoMC0yKSIKKwlyYW5nZSAwIDIKKwlkZXBlbmRzIG9uIEFSQ0hfTTg2WFhYIAorCWRlZmF1bHQgIjIiCisKK2NvbmZpZyBDT01DRVJUT19GUAorCWJvb2wgIkNvbWNlcnRvIEZhc3QgUGF0aCBTdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9NODZYWFgKKwlkZWZhdWx0IHkKKworY29uZmlnIENPTUNFUlRPX1VBUlQwX1NVUFBPUlQKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBDT01DRVJUT19VQVJUMV9TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgQ09NQ0VSVE9fVVNCMl9TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQ09NQ0VSVE9fVVNCM19TVVBQT1JUCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgQ09NQ0VSVE9fSVBTRUNfU1VQUE9SVAorCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIENPTUNFUlRPX0VQQVZJUworCWJvb2wgIkRQSSBFUEFWSVMgY29udGVudCBpbnNwZWN0aW9uIGRyaXZlciIKKwlkZWZhdWx0IG4KKworY29uZmlnIENPTUNFUlRPX0VMUF9TVVBQT1JUCisJYm9vbCAiRWxsaXB0aWMgRVBOMTgwMiBTUEFjYy9QS0EgY3J5cHRvIGRyaXZlciIKKwlkZWZhdWx0IHkKKworY29uZmlnIENPTUNFUlRPX0kyQ19TVVBQT1JUCisgICAgICAgIGJvb2wKKyAgICAgICAgZGVmYXVsdCBuCisKK2NvbmZpZyBDT01DRVJUT19EV19ETUFfU1VQUE9SVAorICAgICAgICBib29sCisgICAgICAgIGRlZmF1bHQgbgorCitjb25maWcgQ09NQ0VSVE9fRERSX0VDQ19TVVBQT1JUCisgICAgICAgIGJvb2wgIkZpeCBmb3IgdGhlIENvbWNlcnRvIEREUiBFQ0MgU3VwcG9ydCBwcm9ibGVtIgorICAgICAgICBkZWZhdWx0IG4KKyAgICAgICAgaGVscAorICAgICAgICAgIFRoZXJlIGlzIGEgbGltaXRhdGlvbiB3aXRoIERlbmFsaSBERFJDIENvbnRyb2xsZXIgd2hlbiBFQ0MgaXMgZW5hYmxlZC4gSXQgZXhwZWN0cyB0aGF0IHRoZQorICAgICAgICAgIGJ1cnN0IHdyaXRlcyBvZiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMTYgYnl0ZXMgbXVzdCBzdGFydCBhbmQgZW5kIGF0IGEgMTYtYnl0ZSBib3VuZGFyeS4KKyAgICAgICAgICBTYXlpbmcgWSBmb3IgdGhpcyBvcHRpb24gd2lsbCBtYWtlIHRoZSBkbWEgbWVtb3J5IGFyZWEgdG8gYmUgbm9uLXdyaXRlYWJsZSwgYXBhcnQgZnJvbSBiZWluZworICAgICAgICAgIG5vbi1jYWNoZWFibGUgc28gdGhhdCBzaW5nbGUgd3JpdGUgc2hvdWxkIGhhcHBlbiBpbnN0ZWFkIG9mIGJ1cnN0LgorCitjb25maWcgQ09NQ0VSVE9fTVNQCisJYm9vbCAiTWluZHNwZWVkIENvbWNlcnRvIFZvSVAiCisJZGVwZW5kcyBvbiBBUkNIX004NlhYWAorCXNlbGVjdCBGSVEKKwlkZWZhdWx0IHkKKworY29uZmlnIENPTUNFUlRPX1NBVEEKKwlib29sICJDb21jZXJ0byBTQVRBIgorCXNlbGVjdCBBVEEKKwlzZWxlY3QgQVRBX1ZFUkJPU0VfRVJST1IKKwlzZWxlY3QgU0FUQV9BSENJX1BMQVRGT1JNCisJc2VsZWN0IEJMS19ERVZfU0QKKwlzZWxlY3QgTEJEQUYKKworY29uZmlnIENPTUNFUlRPX0lNUFJPVkVEX1NQTElDRQorCWJvb2wgIkNvbWNlcnRvIGltcHJvdmVkIHNwbGljZSBjYWxsIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIGlmIHlvdSBpbnRlbmQgdG8gdXNlIHRoZSBDb21jZXJ0byBpbXByb3ZlZCBzcGxpY2UgY2FsbC4gV2hlbiB3cml0aW5nIGRhdGEgdG8gYSBmaWxlIG9uIGFuCisJICBleHQ0IHBhcnRpdGlvbiwgcmUtb3JnYW5pemUgdGhlIHNwbGljZSBjb2RlIHRvIGdhdGhlciBhbGwgdGhlIG1lbWNweSBjYWxscyBpbiBvbmUgcGxhY2UsIGluc3RlYWQKKwkgIG9mIGFsbG9jYXRpbmcgcGFnZXMgYW5kIHJlbGVhc2luZyBwaXBlIGJ1ZmZlcnMgb25lIGJ5IG9uZS4gVGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBhbmQgbWFrZXMgaXQKKwkgIHBvc3NpYmxlIHRvIHVzZSBhIERNQSBlbmdpbmUgd2l0aCBzY2F0dGVyLWdhdGhlciBpbi1wbGFjZSBvZiBtZW1wY3kuCisKK2NvbmZpZyBDT01DRVJUT19TUExJQ0VfVVNFX01ETUEKKwlib29sICJDb21jZXJ0byBzcGxpY2UgdXNpbmcgTURNQSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIENPTUNFUlRPX0lNUFJPVkVEX1NQTElDRQorCXNlbGVjdCBDT01DRVJUT19ETUFfQkFTSUMKKwloZWxwCisJICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIHVzZSB0aGUgQ29tY2VydG8gTURNQSBlbmdpbmUgdG8gcmVwbGFjZSBtZW1jcHkgY2FsbHMgaW5zaWRlIHRoZSBpbXByb3ZlZCAKKwkgIHNwbGljZSBjYWxsLgorCitjb25maWcgQ09NQ0VSVE9fWk9ORV9ETUFfTkNOQgorCWJvb2wgIkNvbWNlcnRvIFpvbmUgRE1BIgorCXNlbGVjdCBaT05FX0RNQQorCWRlZmF1bHQgbgorCitjb25maWcgQ09NQ0VSVE9fQ1VTVE9NX1NLQl9MQVlPVVQKKwlib29sICJNaW5kc3BlZWQgY3VzdG9taXplZCBza2IgbGF5b3V0LCB0byByZWR1Y2UgTkNOQiBhY2Nlc3Mgb3ZlcmhlYWQsIHdoZW4gTkNOQiBidWZmZXIgaXMgdXNlZCBpbiBza2IiCisJZGVwZW5kcyBvbiBDT01DRVJUT19aT05FX0RNQV9OQ05CCisJZGVmYXVsdCBuCisKK2NvbmZpZyBEU1BHX0RFQ1RfQ1NTCisJYm9vbCAiRFNQRyBERUNUIENTUyIKKwlkZWZhdWx0IG4KKworY29uZmlnIENPTUNFUlRPX1VTQjNfSU5URVJOQUxfQ0xLCisJYm9vbCAiQ29tY2VydG8gaW50ZXJuYWwgY2xvY2sgZm9yIFVTQjMiCisJZGVmYXVsdCBuCisKK2NvbmZpZyBDT01DRVJUT19BSENJX1BST0YKKwlib29sICJDb21jZXJ0byBBSENJIHByb2ZpbGluZyIKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBDT01DRVJUT19TUExJQ0VfUFJPRgorCWJvb2wgIkNvbWNlcnRvIHNwbGljZSBwcm9maWxpbmciCisJZGVwZW5kcyBvbiBDT01DRVJUT19JTVBST1ZFRF9TUExJQ0UKKwlkZWZhdWx0IG4KKworY29uZmlnIENPTUNFUlRPX01ETUFfUFJPRgorCWJvb2wgIkNvbWNlcnRvIE1ETUEgcHJvZmlsaW5nIgorCWRlcGVuZHMgb24gQ09NQ0VSVE9fRE1BX0JBU0lDCisJZGVmYXVsdCBuCisKK2NvbmZpZyBDT01DRVJUT182NEtfUEFHRVMKKwlib29sICJDb21jZXJ0byA2NGtCIHBhZ2VzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNheSBZIHRvIGVuYWJsZSA2NGtCIHBhZ2VzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNGtCLiBNZW1vcnkgdXNhZ2Ugd2lsbCBiZSBpbmNyZWFzZWQsIGJ1dAorICAgICAgICAgIHBlci1wYWdlIG9wZXJhdGlvbnMgd2lsbCBiZSByZWR1Y2VkLCBhbmQgZGF0YSB0cmFuc2ZlcnMgd2lsbCBiZWNvbWUgbW9yZSBlZmZpY2llbnQuCisKK2NvbmZpZyBDT01DRVJUT19DQ19PUFRJTUlaRV9PMworCWJvb2wgIkNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIC1PMyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFDQ19PUFRJTUlaRV9GT1JfU0laRQorCWhlbHAKKwkgIENvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIC1PMyBpbnN0ZWFkIG9mIC1PMiBvcHRpb24uIFJlc3VsdGluZyBrZXJuZWwgY2FuIGJlIGEgYml0IGZhc3RlciwgYnV0CisJICBpdCB3aWxsIGFsc28gYmUgYmlnZ2VyLgorCitjb25maWcgQ09NQ0VSVE9fSFdfS0VSTkVMX1BBR0VUQUJMRQorCWJvb2wgIlVzZSB0aGUgMm5kIEhXIHBhZ2UgdGFibGUgZm9yIGtlcm5lbCBtZW1vcnkgc3BhY2UiCisJc2VsZWN0IFZNU1BMSVRfMkcKKwlkZWZhdWx0IG4KKwloZWxwCisJICBCeSBkZWZhdWx0LCBMaW51eCB1c2VzIG9ubHkgb25lIHBhZ2UgdGFibGUgYXQgYSB0aW1lLCBhbmQgc3dpdGNoZXMgcGFnZSB0YWJsZXMgd2hlbiBzd2l0Y2hpbmcKKwkgIGJldHdlZW4gcHJvY2Vzc2VzLiBTYXkgWSB0byBlbmFibGUgdGhlIDJuZCBoYXJkd2FyZSBwYWdlIHRhYmxlLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gbWFwIGtlcm5lbAorCSAgYWRkcmVzc2VzLgorCSAgTm90ZSB0aGF0IGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgQVJNIE1NVSBkZXRlcm1pbmVzIHdoaWNoIHBhZ2UgdGFibGUgdG8gdXNlLCB0aGlzIG9wdGlvbiBjYW4KKwkgIG9ubHkgYmUgZW5hYmxlZCB3aXRoIGEgMkcvMkcgdXNlcnNwYWNlL2tlcm5lbCBtZW1vcnkgc3BsaXQuCisKK2NvbmZpZyBDT01DRVJUT19VTkNBQ0hFRF9ETUEKKwlib29sICJNYWtlIHBhZ2VzIHVuY2FjaGVhYmxlIHdoZW4gZG9pbmcgRE1BIG9wZXJhdGlvbnMiCisJZGVwZW5kcyBvbiBDT01DRVJUT19IV19LRVJORUxfUEFHRVRBQkxFCisJZGVmYXVsdCBuCisJaGVscAorCSAgV2hlbiB0cmFuc2ZlcnJpbmcgb3duZXJzaGlwIG9mIGEgcGFnZSB0byBhIGRldmljZSB0aHJvdWdoIHRoZSBETUEgQVBJLCBtYWtlIHRoZSBwYWdlIHVuY2FjaGVhYmxlCisJICBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0cmFuc2Zlci4gVGhpcyBtYWtlcyB0aGUgMm5kIGNhY2hlIGludmFsaWRhdGUgKHRoYXQgd2FzIG5lZWRlZCBiZWNhdXNlCisJICBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3BlY3VsYXRpdmUgYWNjZXNzZXMgYnkgdGhlIEE5IGNvcmVzKSB1bm5lY2Vzc2FyeSwgd2hpY2ggY2FuIGluY3JlYXNlCisJICBwZXJmb3JtYW5jZSBkdXJpbmcgaGVhdnkgSU8gd29ya2xvYWRzLiBUaGUgcGFnZSB0YWJsZXMgd2lsbCBiZSBtb3JlIGNvbXBsZXggdGhvdWdoLCByZXN1bHRpbmcgaW4KKwkgIG1vcmUgVExCIG1pc3NlcyB3aGVuIGEgRE1BIHRyYW5zZmVyIGlzIGdvaW5nIG9uLgorCitjb25maWcgQ09NQ0VSVE9fU1BMSUNFX1JFQURfTk9DT05USUcKKwlib29sICJVc2UgZmluZF9nZXRfcGFnZXMgaW4gc3BsaWNlIHJlYWQgY29kZSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGUgc3BsaWNlIHJlYWQgY29kZSBub3JtYWxseSBjYWxscyBmaW5kX2dldF9wYWdlc19jb250aWcgdG8gcmV0cmlldmUgcGFnZXMgbWFwcGluZyB0aGUgcmVxdWVzdGVkCisJICBwb3J0aW9uIG9mIHRoZSBmaWxlIHRvIHJlYWQuIEhvd2V2ZXIsIHVzaW5nIGZpbmRfZ2V0X3BhZ2VzIHdvcmtzIGp1c3QgYXMgd2VsbCwgYXMgdGhlIHNwbGljZSBjb2RlCisJICBpcyBhYmxlIHRvIGhhbmRsZSBib3RoIHNpdHVhdGlvbnMuCisJICBTYXkgWSB0byB1c2UgZmluZF9nZXRfcGFnZXMgaW5zdGVhZCBvZiBmaW5kX2dldF9wYWdlc19jb250aWcsIHdoaWNoIHNlZW1zIHRvIHlpZWxkIGEgc2lnbmlmaWNhbnQKKwkgIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluIFNhbWJhIHJlYWQgdGVzdHMuCitlbmRtZW51CitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1Y2ZhMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vTWFrZWZpbGUKQEAgLTAsMCArMSwzMCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KKyMKKworIyBPYmplY3QgZmlsZSBsaXN0cy4KKworb2JqLXkgOj0gZ3Bpby5vIHRpbWUubyBkbWEubyBjbG9jay5vIHJlc2V0Lm8gcG0ubyBzbGVlcC5vCitvYmotbSA6PQorb2JqLW4gOj0KK29iai0gOj0KKworb2JqLSQoQ09ORklHX0FSQ0hfTTg2WFhYKSAJCSAgICAJKz0gY29tY2VydG8tMjAwMC5vCitvYmotJChDT05GSUdfQVJDSF9NODZYWFgpIAkJICAgIAkrPSBjb21jZXJ0by12d2QubworCitvYmotJChDT05GSUdfQVJDSF9NODZYWFgpICAgICAgICAgICAgICAgCSs9IHNlcmRlcy1jMjAwMC5vCisKK2lmZXEgKCQoQ09ORklHX1BDSSkseSkKKyAgICAgICAgb2JqLSQoQ09ORklHX0FSQ0hfTTg2WFhYKSAgICAgICAgICAgICAgICs9IHBjaWUtYzIwMDAubworZW5kaWYKKworb2JqLSQoQ09ORklHX0NPTUNFUlRPX01FTUJVRikgICAgICAgICAgICAgICAgICAgKz0gbWVtYnVmLm8KK29iai0kKENPTkZJR19DT01DRVJUT19URE1fQ0xPQ0spICAgICAgICAgICAgICAgICs9IHN5c2ZzdGRtLm8KK29iai0kKENPTkZJR19SVFNNX0MySykgCQkJCSs9IGJvYXJkLWMya3J0c20ubworb2JqLSQoQ09ORklHX0MyS19FVk0pIAkJCQkrPSBib2FyZC1jMmtldm0ubworb2JqLSQoQ09ORklHX0MyS19NRkNOX0VWTSkJCQkrPSBib2FyZC1jMmttZmNuZXZtLm8KK29iai0kKENPTkZJR19DMktfQVNJQykgCQkJCSs9IGJvYXJkLWMya2FzaWMubworb2JqLSQoQ09ORklHX1NNUCkJCQkJKz0gcGxhdHNtcC5vIGhlYWRzbXAubworb2JqLSQoQ09ORklHX0NPTUNFUlRPX01TUCkJCQkrPSBtc3AvCitvYmotJChDT05GSUdfSE9UUExVR19DUFUpCQkJKz0gaG90cGx1Zy5vCitvYmotJChDT05GSUdfQ09NQ0VSVE9fQ1NZU19UUElfQ0xPQ0spCQkrPSBjb21jZXJ0by10cGljc3lzLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vTWFrZWZpbGUuYm9vdCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vTWFrZWZpbGUuYm9vdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzMwMjViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9NYWtlZmlsZS5ib290CkBAIC0wLDAgKzEsOCBAQAoraWZlcSAoJChDT05GSUdfQVJDSF9NODZYWFgpLHkpCitpZmVxICgkKENPTkZJR19DT01DRVJUT19aT05FX0RNQV9OQ05CKSx5KQorICAgenJlbGFkZHIteSAgICAgOj0gMHgwNDAwODAwMAorZWxzZQorICAgenJlbGFkZHIteSAgICAgOj0gMHgwMDAwODAwMAorZW5kaWYKKyAgIHBhcmFtc19waHlzLXkgIDo9IDB4MDAwMDAxMDAKK2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2JvYXJkLWMya2FzaWMuYyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vYm9hcmQtYzJrYXNpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwOTdiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2JvYXJkLWMya2FzaWMuYwpAQCAtMCwwICsxLDc1NyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtY29tY2VydG8vYm9hcmQtYzJrYXNpYy5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMiBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF84MjUwLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUTykgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQ09NQ0VSVE9fTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKQorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bGludXgvZHdfZG1hYy5oPgorCisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxhc20vc21wX3R3ZC5oPgorI2luY2x1ZGUgPGFzbS9sb2NhbHRpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKyNpbmNsdWRlIDxtYWNoL2dwaW8uaD4KKworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcmVzZXJ2ZSh2b2lkKTsKK2V4dGVybiB2b2lkIGRldmljZV9tYXBfaW8gKHZvaWQpOworZXh0ZXJuIHZvaWQgZGV2aWNlX2lycV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZGV2aWNlX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtYWNfYWRkcl9pbml0KHN0cnVjdCBjb21jZXJ0b19wZmVfcGxhdGZvcm1fZGF0YSAqKTsKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGNvbWNlcnRvX3RpbWVyOworCitzdGF0aWMgdm9pZCBfX2luaXQgYm9hcmRfZ3Bpb19pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1BGRV9VQVJUX1NVUFBPUlQKKwl3cml0ZWwoKHJlYWRsKENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcpICYgflBGRV9VQVJUX0dQSU8pIHwgUEZFX1VBUlRfQlVTLCBDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHKTsKKwljMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzBfMzEgfD0gUEZFX1VBUlRfR1BJT19QSU47IC8qIEdQSU9zIDEyICYgMTMgYXJlIHVzZWQgZm9yIFBGRV9VQVJUICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJMl9NU1BEX0xPV19TUEVFRCkKKwkvKiBlbmFibGUgU1BJIHBpbnMgKi8KKwl3cml0ZWwoKHJlYWRsKENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcxKSAmIH4oU1BJX01VWF9HUElPXzEpKSB8IChTUElfTVVYX0JVU18xKSwgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKSAmIH4oU1BJX01VWF9HUElPXzIpKSB8IChTUElfTVVYX0JVU18yKSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKTsKKwljMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzBfMzEgfD0gU1BJX01VWF9HUElPXzFfUElOOyAvKiBHUElPcyAxOCwxOSwgMjEsMjIsIDMwLDMxIGFyZSB1c2VkIGZvciBTUEkqLworCWMya19ncGlvX3Bpbl9zdGF0LmMya19ncGlvX3BpbnNfMzJfNjMgfD0gU1BJX01VWF9HUElPXzJfUElOOyAvKiBHUElPIDMyIGlzIHVzZWQgZm9yIFNQSSovCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpCisJLyogZW5hYmxlIFNQSSBwaW5zICovCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+KFNQSV8yX01VWF9HUElPXzEpKSB8IChTUElfMl9NVVhfQlVTXzEpLCBDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSk7CisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QpICYgfihTUElfMl9NVVhfR1BJT18yKSkgfCAoU1BJXzJfTVVYX0JVU18yKSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKTsKKwljMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzBfMzEgfD0gU1BJXzJfTVVYX0dQSU9fMV9QSU47CisJYzJrX2dwaW9fcGluX3N0YXQuYzJrX2dwaW9fcGluc18zMl82MyB8PSBTUElfMl9NVVhfR1BJT18yX1BJTjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSTJDX1NVUFBPUlQpCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+STJDX0dQSU8pIHwgSTJDX0JVUywgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworCWMya19ncGlvX3Bpbl9zdGF0LmMya19ncGlvX3BpbnNfMF8zMSB8PSBJMkNfR1BJT19QSU47CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0NPTUNFUlRPKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUT19NT0RVTEUpCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+TkFORF9HUElPKSB8IE5BTkRfQlVTLCBDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSk7CisJYzJrX2dwaW9fcGluX3N0YXQuYzJrX2dwaW9fcGluc18wXzMxIHw9IE5BTkRfR1BJT19QSU47CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9DT01DRVJUT19OT1IpCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+Tk9SX0dQSU8pIHwgTk9SX0JVUywgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworCWMya19ncGlvX3Bpbl9zdGF0LmMya19ncGlvX3BpbnNfMF8zMSB8PSBOT1JfR1BJT19QSU47CisjZW5kaWYKKworICAgICAgICAvKiBURE0gYnVzIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgLyogRml4IGZvciBDMktBU0lDIFJldkEuIENvcnJlY3QvbG93ZXIgVERNIGJ1cyBzdHJlbmd0aCB0byBhdm9pZCBub2lzZSBkaXN0b3J0aW5nIHZvaWNlIHdpdGggc2kzMjI3ICovCisJLyogVE9ETzogQ2hlY2sgb24gUmV2Qi4gKi8KKyAgICAgICAgLyogU2V0dGluZyBURE1fQ0sgc3RyYW5ndGggWzc6Nl0gZXF1YWwgWDMgKi8KKyAgICAgICAgI2RlZmluZSBYMSAwCisgICAgICAgICNkZWZpbmUgWDIgMgorICAgICAgICAjZGVmaW5lIFgzIDEKKyAgICAgICAgI2RlZmluZSBYNCAzCisgICAgICAgIHdyaXRlbCgoWDMgPDwgNikgfChyZWFkbChDT01DRVJUT19HUElPX1BBRF9DT05GSUcwKSAmIH4oMHgzIDw8IDYpKSwgQ09NQ0VSVE9fR1BJT19QQURfQ09ORklHMCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBOT1IgZGV2aWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX01URF9DT01DRVJUT19OT1IpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fbm9yX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gTk9SRkxBU0hfTUVNT1JZX1BIWTEsCisJCS5lbmQJPSBOT1JGTEFTSF9NRU1PUllfUEhZMSArIFNaXzEyOE0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGNvbWNlcnRvX25vcl9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19ub3IgPSB7CisJLm5hbWUgICAgICAgICAgID0gImNvbWNlcnRvZmxhc2giLAorCS5pZCAgICAgICAgICAgICA9IDAsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShjb21jZXJ0b19ub3JfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBjb21jZXJ0b19ub3JfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmNvbWNlcnRvX25vcl9kYXRhLAorCX0sCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcnRjX3Jlc1tdID0geworCXsKKwkJLnN0YXJ0ID0gQ09NQ0VSVE9fQVBCX1JUQ19CQVNFLAorCQkuZW5kID0gQ09NQ0VSVE9fQVBCX1JUQ19CQVNFICsgU1pfMzIgLSAxLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gSVJRX1JUQ19BTE0sCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBJUlFfUlRDX1BSSSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2ID0geworCS5uYW1lID0gImMyay1ydGMiLAorCS5pZCA9IC0xLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShydGNfcmVzKSwKKwkucmVzb3VyY2UgPSBydGNfcmVzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBETUFDIGNvbnRyb2xsZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRFdfRE1BX1NVUFBPUlQpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGR3X2RtYWNfcmVzb3VyY2VbXSA9IHsKKwl7CisJCS5zdGFydCAgICAgICAgICA9IERXX0RNQV9ETUFDX0JBU0VBRERSLAorCQkuZW5kICAgICAgICAgICAgPSBEV19ETUFfRE1BQ19CQVNFQUREUiArIDB4MkMwLAorCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ICAgICAgICAgID0gSVJRX0RNQUMsCisJCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZHdfZG1hX3BsYXRmb3JtX2RhdGEgZHdfZG1hY19kYXRhID0geworCS5ucl9jaGFubmVscyAgICA9IDgsCit9OworCitzdGF0aWMgdTY0IGR3X2RtYWNfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkd19kbWFjX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiZHdfZG1hYyIsCisJLmlkICAgICAgICAgICAgID0gMCwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5kbWFfbWFzayA9ICZkd19kbWFjX2RtYV9tYXNrLAorCQkucGxhdGZvcm1fZGF0YSAgPSAmZHdfZG1hY19kYXRhLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLnJlc291cmNlICAgICAgID0gZHdfZG1hY19yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGR3X2RtYWNfcmVzb3VyY2UpLAorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE5BTkQgZGV2aWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0NPTUNFUlRPKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUT19NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX25hbmRfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBDT01DRVJUT19OQU5EX0ZJT19BRERSLAorCQkuZW5kCT0gQ09NQ0VSVE9fTkFORF9GSU9fQUREUiArIENPTUNFUlRPX05BTkRfSU9fU1ogLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19uYW5kID0geworCS5uYW1lCQk9ICJjb21jZXJ0b25hbmQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9IE5VTEwsCisJfSwKKwkucmVzb3VyY2UJPSBjb21jZXJ0b19uYW5kX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY29tY2VydG9fbmFuZF9yZXNvdXJjZXMpLAorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFNQSSBidXMgY29udHJvbGxlcgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpCisKKyNkZWZpbmUJQ0xLX05BTUUJMTAKK3N0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSB7CisJaW50IHVzZV9kbWE7CisJaW50IG51bV9jaGlwc2VsZWN0czsKKwlpbnQgYnVzX251bTsKKwl1MzIgbWF4X2ZyZXE7CisJY2hhciBjbGtfbmFtZVtDTEtfTkFNRV07Cit9OworCitzdHJ1Y3Qgc3BpX3BsYXRmb3JtX2RhdGEgeworCWludCB0eXBlOworCWludCBkdW1teTsKK307CisKK3N0cnVjdCBzcGlfY29udHJvbGxlcl9kYXRhIHsKKyAgICAgICAgdTggcG9sbF9tb2RlOyAgIC8qIDAgZm9yIGNvbnRvbGxlciBwb2xsaW5nIG1vZGUgKi8KKyAgICAgICAgdTggdHlwZTsgICAgICAgIC8qIFNQSS9TU1AvTWljcndpcmUgKi8KKyAgICAgICAgdTggZW5hYmxlX2RtYTsKKyAgICAgICAgdm9pZCAoKmNzX2NvbnRyb2wpKHUzMiBjb21tYW5kKTsKK307CisKK3N0cnVjdCBzcGlfcGxhdGZvcm1fZGF0YSBzcGlfcGRhdGEgPSB7CisJLnR5cGUgPSAwLAorCS5kdW1teSA9IDAsCit9OworCitzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfZGF0YSBzcGlfY3RybF9kYXRhID0gIHsKKyAgICAgICAgLnBvbGxfbW9kZSA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGNvbWNlcnRvX3NwaV9ib2FyZF9pbmZvW10gPSB7CisJeworCQkvKiBGSVhNRTogZm9yIGNoaXBzZWxlY3QtMCAqLworCQkubW9kYWxpYXMgPSAiY29tY2VydG9fc3BpMSIsCisJCS5jaGlwX3NlbGVjdCA9IDAsCisJCS5tYXhfc3BlZWRfaHogPSA0KjEwMDAqMTAwMCwKKwkJLmJ1c19udW0gPSAwLAorCQkuaXJxID0gLTEsCisJCS5tb2RlID0gU1BJX01PREVfMywKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc3BpX3BkYXRhLAorICAgICAgICAgICAgICAgIC5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2N0cmxfZGF0YSwKKwl9LAorCXsKKwkJLyogRklYTUU6IGZvciBjaGlwc2VsZWN0LTEgKi8KKwkJLm1vZGFsaWFzID0gInByb3NsaWMiLAorCQkubWF4X3NwZWVkX2h6ID0gNCoxMDAwKjEwMDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5tb2RlID0gU1BJX01PREVfMywKKwkJLmJ1c19udW0gPSAwLAorCQkuaXJxID0gLTEsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaV9wZGF0YSwKKyAgICAgICAgICAgICAgICAuY29udHJvbGxlcl9kYXRhID0gJnNwaV9jdHJsX2RhdGEsCisJfSwKKwl7CisJCS5tb2RhbGlhcyA9ICJjb21jZXJ0b19zcGkzIiwKKwkJLmNoaXBfc2VsZWN0ID0gMiwKKwkJLm1heF9zcGVlZF9oeiA9IDQqMTAwMCoxMDAwLAorCQkuYnVzX251bSA9IDAsCisJCS5pcnEgPSAtMSwKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCQkucGxhdGZvcm1fZGF0YSA9ICZzcGlfcGRhdGEsCisgICAgICAgICAgICAgICAgLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfY3RybF9kYXRhLAorCX0sCisKKyNpZiAwIC8vTVNJRgorCisJeworCQkubW9kYWxpYXMgPSAicHJvc2xpYyIsCisJCS5tYXhfc3BlZWRfaHogPSAyKjEwMDAqMTAwMCwKKwkJLmNoaXBfc2VsZWN0ID0gMywKKyAgICAgICAgICAgICAgICAubW9kZSA9IFNQSV9NT0RFXzEsCisJCS5idXNfbnVtID0gMCwKKwkJLmlycSA9IC0xLAorCQkucGxhdGZvcm1fZGF0YSA9ICZzcGlfcGRhdGEsCisgICAgICAgICAgICAgICAgLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfY3RybF9kYXRhLAorCX0sCisjZWxzZQorCXsKKwkJLm1vZGFsaWFzID0gImxlZ2VyaXR5IiwKKwkJLmNoaXBfc2VsZWN0ID0gMywKKwkJLm1heF9zcGVlZF9oeiA9IDQqMTAwMCoxMDAwLAorCQkuYnVzX251bSA9IDAsCisJCS5pcnEgPSAtMSwKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCQkucGxhdGZvcm1fZGF0YSA9ICZzcGlfcGRhdGEsCisgICAgICAgICAgICAgICAgLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfY3RybF9kYXRhLAorCX0sCisjZW5kaWYKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpCitzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfcGRhdGEgZmFzdF9zcGlfcGRhdGEgPSB7CisJLnVzZV9kbWEgPSAwLAorCS5udW1fY2hpcHNlbGVjdHMgPSAyLAorCS5idXNfbnVtID0gMSwKKwkubWF4X2ZyZXEgPSA2MCAqIDEwMDAgKiAxMDAwLAorCS5jbGtfbmFtZSA9ICJEVVMiLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJMl9NU1BEX0hJR0hfU1BFRUQpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX2Zhc3Rfc3BpX3Jlc291cmNlW10gPSB7CisJeworCQkuc3RhcnQgID0gQ09NQ0VSVE9fQVhJX1NQSV9CQVNFLAorCQkuZW5kICAgID0gQ09NQ0VSVE9fQVhJX1NQSV9CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCAgPSBJUlFfU1BJLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fZmFzdF9zcGkgPSB7CisJLm5hbWUgPSAiY29tY2VydG9fc3BpIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShjb21jZXJ0b19mYXN0X3NwaV9yZXNvdXJjZSksCisJLnJlc291cmNlID0gY29tY2VydG9fZmFzdF9zcGlfcmVzb3VyY2UsCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZmYXN0X3NwaV9wZGF0YSwKKwl9LAorI2VuZGlmCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpCitzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfcGRhdGEgbHNfc3BpX3BkYXRhID0geworCS51c2VfZG1hID0gMCwKKwkubnVtX2NoaXBzZWxlY3RzID0gNCwKKwkuYnVzX251bSA9IDAsCisJLm1heF9mcmVxID0gMjAgKiAxMDAwICogMTAwMCwKKwkuY2xrX25hbWUgPSAic3BpX2kyYyIsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpIHx8IGRlZmluZWQoQ09ORklHX1NQSTJfTVNQRF9MT1dfU1BFRUQpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX3NwaV9yZXNvdXJjZVtdID0geworCXsKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX0FQQl9TUElfQkFTRSwKKwkJLmVuZCAgICA9IENPTUNFUlRPX0FQQl9TUElfQkFTRSArIFNaXzRLIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgID0gSVJRX1NQSV9MUywKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX3NwaSA9IHsKKwkubmFtZSA9ICJjb21jZXJ0b19zcGkiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX3NwaV9yZXNvdXJjZSksCisJLnJlc291cmNlID0gY29tY2VydG9fc3BpX3Jlc291cmNlLAorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZsc19zcGlfcGRhdGEsCisJfSwKKyNlbmRpZgorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEkyQyBidXMgY29udHJvbGxlcgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19JMkNfU1VQUE9SVCkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9faTJjX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gQ09NQ0VSVE9fQVBCX0kyQ19CQVNFLAorCQkuZW5kCT0gQ09NQ0VSVE9fQVBCX0kyQ19CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gSVJRX0kyQywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX2kyYyA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiY29tY2VydG9faTJjIiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX2kyY19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGNvbWNlcnRvX2kyY19yZXNvdXJjZXMsCit9OworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqICBXYXRjaGRvZworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIENPTkZJR19NUENPUkVfV0FUQ0hET0cKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fYTl3ZF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IENPTUNFUlRPX1RXRF9CQVNFLAorCQkuZW5kCT0gQ09NQ0VSVE9fVFdEX0JBU0UgKyAweEZGLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAibXBjb3JlX3dkdCIsCisJCS5zdGFydAk9IElSUV9MT0NBTFdET0csCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19hOXdkID0geworCS5uYW1lCQk9ICJtcGNvcmVfd2R0IiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX2E5d2RfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBjb21jZXJ0b19hOXdkX3Jlc291cmNlcywKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DT01DRVJUT19XQVRDSERPRworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b193ZHRfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4RDAsCisJCS5lbmQJPSBDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4RDgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b193ZHQgPSB7CisgICAgICAgIC5uYW1lICAgPSAiY29tY2VydG9fd2R0IiwKKyAgICAgICAgLmlkICAgICA9IC0xLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoY29tY2VydG9fd2R0X3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gY29tY2VydG9fd2R0X3Jlc291cmNlcywKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0VMUF9TVVBQT1JUKQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBJUHNlYworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fZWxwX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUgICA9ICJlbHAiLAorCQkuc3RhcnQgID0gQ09NQ0VSVE9fQVhJX1NQQUNDX1BEVV9CQVNFLAorCQkuZW5kICAgID0gQ09NQ0VSVE9fQVhJX1NQQUNDX1BEVV9CQVNFICsgU1pfMTZNICAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJpcnFfc3BhY2MiLAorCQkuc3RhcnQgID0gSVJRX1NQQUNDLAorCQkuZW5kICAgID0gSVJRX1NQQUNDLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHU2NCBjb21jZXJ0b19lbHBfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAgY29tY2VydG9fZWxwX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgICAgICAgICA9ICJFbGxpcHRpYy1FUE4xODAyIiwKKwkuaWQgICAgICAgICAgICAgICAgICAgICA9IDAsCisJLm51bV9yZXNvdXJjZXMgICAgICAgICAgPSAyLAorCS5yZXNvdXJjZSAgICAgICAgICAgICAgID0gY29tY2VydG9fZWxwX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkuZG1hX21hc2sgICAgICAgICAgICAgICA9ICZjb21jZXJ0b19lbHBfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayAgICAgID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorfTsKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgY29tY2VydG9fdGRtX2RhdGEgY29tY2VydG9fdGRtX3BkYXRhID0geworCS5mc291dHB1dCA9IDEsIC8qIEdlbmVyaWMgUGFkIENvbnRyb2wgYW5kIFZlcnNpb24gSUQgUmVnaXN0ZXJbMl0gKi8KKwkuZnNwb2xhcml0eSA9IDAsIC8qIDI4IEZTWU5DX0ZBTEwoUklTRSlfRURHRSAqLworCS5mc2h3aWR0aCA9IDEsIC8qIEhpZ2hfUGhhc2VfV2lkdGhbMTA6MF0gKi8KKwkuZnNsd2lkdGggPSAweEZGLCAvKiBMb3dfUGhhc2VfV2lkdGhbMTA6MF0gKi8KKwkuY2xvY2toeiA9IDIwNDgwMDAsIC8qIElOQ19WQUxVRVsyOTowXSBBY2NvcmRpbmcgdG8gdGhlIGRlc2lyZWQgVERNIGNsb2NrIG91dHB1dCAKKwkJCWZyZXF1ZW5jeSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgY29uZmlndXJlZCAqLworCS5jbG9ja291dCA9IDEsIC8qIDAgLT4gc2V0IGJpdCAyMSwgY2xlYXIgYml0IDIwIGluIENPTUNFUlRPX0dQSU9fSU9DVFJMX1JFRworCQkJICAoc29mdHdhcmUgY29udHJvbCwgY2xvY2sgaW5wdXQpCisJCQkgIDEgLT4gc2V0IGJpdCAyMSBhbmQgMjAgaW4gQ09NQ0VSVE9fR1BJT19JT0NUUkxfUkVHCisJCQkgIChzb2Z0d2FyZSBjb250cm9sLCBjbG9jayBvdXRwdXQpCisJCQkgIDIgLT4gY2xlYXIgYml0IDIxIGluIENPTUNFUlRPX0dQSU9fSU9DVFJMX1JFRyAoaGFyZHdhcmUgY29udHJvbCkgKi8KKwkudGRtbXV4ID0gMHgxLCAvKiBURE0gaW50ZXJmYWNlIE11eGluZzoweDAgLSBURE0gYmxvY2ssIDB4MSAtIFpEUyBibG9jaywKKwkJMHgyIC0gR1BJT1s2Mzo2MF0gc2lnbmFscyBhbmQgMHgzIC0gTVNJRiBibG9jayBpcyBzZWxlY3RlZCAqLworI2lmIDAKKwkvKiBGSVggTUUgLSBOZWVkIGNvcnJlY3QgdmFsdWVzIGZvciBURE1fRFIsIFRETV9EWCwgVERNX0ZTIGFuZCBURE1fQ0sgKi8KKwkudGRtY2sgPSAweDNGLAorCS50ZG1mcyA9IDB4M0YsCisJLnRkbWR4ID0gMHgzRiwKKwkudGRtZHIgPSAweDNGLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b190ZG1fZGV2aWNlID0geworCS5uYW1lCT0gImNvbWNlcnRvLXRkbSIsCisJLmlkCQk9IDAsCisJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmNvbWNlcnRvX3RkbV9wZGF0YSwKKwkubnVtX3Jlc291cmNlcwk9IDAsCisJLnJlc291cmNlID0gTlVMTCwKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19EU1BHX0RFQ1RfQ1NTKQorI2RlZmluZSBDU1NfSVRDTV9CQVNFCQlDT01DRVJUT19BWElfREVDVF9CQVNFCisjZGVmaW5lIENTU19JVENNX1NJWkUJCShTWl8xTSkKKworI2RlZmluZSBDU1NfRFRDTV9CQVNFCQkoQ1NTX0lUQ01fQkFTRSArIENTU19JVENNX1NJWkUpCisjZGVmaW5lIENTU19EVENNX1NJWkUJCShTWl8xTSkKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b19jc3NfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQk9ICJpdGNtIiwKKwkJLnN0YXJ0CT0gQ1NTX0lUQ01fQkFTRSwKKwkJLmVuZAk9IENTU19JVENNX0JBU0UgKyBDU1NfSVRDTV9TSVpFIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lCT0gImR0Y20iLAorCQkuc3RhcnQJPSBDU1NfRFRDTV9CQVNFLAorCQkuZW5kCT0gQ1NTX0RUQ01fQkFTRSArIENTU19EVENNX1NJWkUgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fY3NzX2RldmljZSA9IHsKKwkubmFtZQkJPSAiY3NzIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAwLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvbWNlcnRvX2Nzc19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGNvbWNlcnRvX2Nzc19yZXNvdXJjZXMsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fcGZlX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUJPSAiYXBiIiwKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX0FQQl9QRkVfQkFTRSwKKwkJLmVuZCAgICA9IENPTUNFUlRPX0FQQl9QRkVfQkFTRSArIENPTUNFUlRPX0FQQl9QRkVfU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiYXhpIiwKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX0FYSV9QRkVfQkFTRSwKKwkJLmVuZCAgICA9IENPTUNFUlRPX0FYSV9QRkVfQkFTRSArIENPTUNFUlRPX0FYSV9QRkVfU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiZGRyIiwKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX1BGRV9ERFJfQkFTRSwKKwkJLmVuZAk9IENPTUNFUlRPX1BGRV9ERFJfQkFTRSArIENPTUNFUlRPX1BGRV9ERFJfU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiaXJhbSIsCisJCS5zdGFydCAgPSBDT01DRVJUT19QRkVfSVJBTV9CQVNFLAorCQkuZW5kCT0gQ09NQ0VSVE9fUEZFX0lSQU1fQkFTRSArIENPTUNFUlRPX1BGRV9JUkFNX1NJWkUgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lCT0gImlwc2VjIiwKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX0FYSV9JUFNFQ19CQVNFLAorCQkuZW5kCT0gQ09NQ0VSVE9fQVhJX0lQU0VDX0JBU0UgKyBDT01DRVJUT19BWElfSVBTRUNfU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiaGlmIiwKKwkJLnN0YXJ0ICA9IElSUV9QRkVfSElGLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29tY2VydG9fcGZlX3BsYXRmb3JtX2RhdGEgY29tY2VydG9fcGZlX3BkYXRhID0geworCS5jb21jZXJ0b19ldGhfcGRhdGFbMF0gPSB7CisJCS5uYW1lID0gR0VNMF9JVEZfTkFNRSwKKwkJLmRldmljZV9mbGFncyA9IENPTkZJR19DT01DRVJUT19HRU1BQywKKwkJLm1paV9jb25maWcgPSBDT05GSUdfQ09NQ0VSVE9fVVNFX1JHTUlJLAorCQkuZ2VtYWNfbW9kZSA9IEdFTUFDX1NXX0NPTkYgfCBHRU1BQ19TV19GVUxMX0RVUExFWCB8IEdFTUFDX1NXX1NQRUVEXzFHLAorCQkucGh5X2ZsYWdzID0gR0VNQUNfUEhZX1JHTUlJX0FERF9ERUxBWSwKKwkJLmJ1c19pZCA9IDAsCisJCS5waHlfaWQgPSA0LAorCQkuZ2VtX2lkID0gMCwKKwkJLm1hY19hZGRyID0gKHU4W10pR0VNMF9NQUMsCisJfSwKKworCS5jb21jZXJ0b19ldGhfcGRhdGFbMV0gPSB7CisJCS5uYW1lID0gR0VNMV9JVEZfTkFNRSwKKwkJLmRldmljZV9mbGFncyA9IENPTkZJR19DT01DRVJUT19HRU1BQywKKwkJLm1paV9jb25maWcgPSBDT05GSUdfQ09NQ0VSVE9fVVNFX1JHTUlJLAorCQkuZ2VtYWNfbW9kZSA9IEdFTUFDX1NXX0NPTkYgfCBHRU1BQ19TV19GVUxMX0RVUExFWCB8IEdFTUFDX1NXX1NQRUVEXzFHLAorCQkucGh5X2ZsYWdzID0gR0VNQUNfUEhZX1JHTUlJX0FERF9ERUxBWSwKKwkJLmJ1c19pZCA9IDAsCisJCS5waHlfaWQgPSA1LAorCQkuZ2VtX2lkID0gMSwKKwkJLm1hY19hZGRyID0gKHU4W10pR0VNMV9NQUMsCisJfSwKKworCS5jb21jZXJ0b19ldGhfcGRhdGFbMl0gPSB7CisJCS5uYW1lID0gR0VNMl9JVEZfTkFNRSwKKwkJLmRldmljZV9mbGFncyA9IENPTkZJR19DT01DRVJUT19HRU1BQywKKwkJLm1paV9jb25maWcgPSBDT05GSUdfQ09NQ0VSVE9fVVNFX1JHTUlJLAorCQkuZ2VtYWNfbW9kZSA9IEdFTUFDX1NXX0NPTkYgfCBHRU1BQ19TV19GVUxMX0RVUExFWCB8IEdFTUFDX1NXX1NQRUVEXzFHLAorCQkucGh5X2ZsYWdzID0gR0VNQUNfUEhZX1JHTUlJX0FERF9ERUxBWSwKKwkJLmJ1c19pZCA9IDAsCisJCS5waHlfaWQgPSA2LAorCQkuZ2VtX2lkID0gMiwKKwkJLm1hY19hZGRyID0gKHU4W10pR0VNMl9NQUMsCisJfSwKKworCS8qKgorCSAqIFRoZXJlIGlzIGEgc2luZ2xlIG1kaW8gYnVzIGNvbWluZyBvdXQgb2YgQzJLLiAgQW5kIHRoYXQncyB0aGUgb25lCisJICogY29ubmVjdGVkIHRvIEdFTTAuIEFsbCBQSFkncywgc3dpdGNocyB3aWxsIGJlIGNvbm5lY3RlZCB0byB0aGUgc2FtZQorCSAqIGJ1cyB1c2luZyBkaWZmZXJlbnQgYWRkcmVzc2VzLiBUeXBpY2FsbHkgLmJ1c19pZCBpcyBhbHdheXMgMCwgb25seQorCSAqIC5waHlfaWQgd2lsbCBjaGFuZ2UgaW4gdGhlIGRpZmZlcmVudCBjb21jZXJ0b19ldGhfcGRhdGFbXSBzdHJ1Y3R1cmVzIGFib3ZlLgorCSAqLworCS5jb21jZXJ0b19tZGlvX3BkYXRhWzBdID0geworCQkuZW5hYmxlZCA9IDEsCisJCS5waHlfbWFzayA9IDB4RkZGRkZGOEYsCisJCS5tZGNfZGl2ID0gOTYsCisJCS5pcnEgPSB7CisJCQlbNF0gPSBQSFlfUE9MTCwKKwkJCVs1XSA9IFBIWV9QT0xMLAorCQkJWzZdID0gUEhZX1BPTEwsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyB1NjQgY29tY2VydG9fcGZlX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fcGZlX2RldmljZSA9IHsKKwkubmFtZQkJPSAicGZlIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJmNvbWNlcnRvX3BmZV9wZGF0YSwKKwkJLmRtYV9tYXNrCQk9ICZjb21jZXJ0b19wZmVfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY29tY2VydG9fcGZlX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gY29tY2VydG9fcGZlX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjb21jZXJ0b19kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUTykgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQ09NQ0VSVE9fTU9EVUxFKQorCQkmY29tY2VydG9fbmFuZCwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01URF9DT01DRVJUT19OT1IpCisJCSZjb21jZXJ0b19ub3IsCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19JMkNfU1VQUE9SVCkKKwkJJmNvbWNlcnRvX2kyYywKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoQ09ORklHX01QQ09SRV9XQVRDSERPRykKKwkJJmNvbWNlcnRvX2E5d2QsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1dBVENIRE9HKQorCQkmY29tY2VydG9fd2R0LAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUEkyX01TUERfSElHSF9TUEVFRCkKKwkJJmNvbWNlcnRvX2Zhc3Rfc3BpLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUEkyX01TUERfTE9XX1NQRUVEKQorCQkmY29tY2VydG9fc3BpLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRFdfRE1BX1NVUFBPUlQpCisJCSZkd19kbWFjX2RldmljZSwKKyNlbmRpZgorCQkmY29tY2VydG9fdGRtX2RldmljZSwKKwkJJmNvbWNlcnRvX3BmZV9kZXZpY2UsCisJCSZydGNfZGV2LAorI2lmIGRlZmluZWQoQ09ORklHX0RTUEdfREVDVF9DU1MpCisJCSZjb21jZXJ0b19jc3NfZGV2aWNlLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRUxQX1NVUFBPUlQpCisJJmNvbWNlcnRvX2VscF9kZXZpY2UsCisjZW5kaWYKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEV4cGFuc2lvbiBidXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IGNvbWNlcnRvLTIwMDAuYyB0byBpbml0aWFsaXplIHRoZSBleHBhbnNpb24gYnVzICovCitpbnQgY29tY2VydG9fZXhwX3ZhbHVlc1s1XVs3XT0geworCS8qIEVOQUJMRSwgQkFTRSwgU0VHX1NaLCBDRkcsIFRNRzEsIFRNRzIsIFRNRzMgKi8KKwl7MSwgKEVYUF9CVVNfUkVHX0JBU0VfQ1MwID4+IDEyKSwgKChFWFBfQlVTX1JFR19CQVNFX0NTMCArIEVYUF9DUzBfU0VHX1NJWkUgLSAxKSA+PiAxMiksIEVYUF9NRU1fQlVTX1NJWkVfMTYsIDB4MUExQTQwMUYsIDB4MDYwNjBBMDQsIDB4MDAwMDAwMDJ9LAkJLypUT0RPIFZhbHVlcyB0byBjaGVjayovCisJezAsIChFWFBfQlVTX1JFR19CQVNFX0NTMSA+PiAxMiksICgoRVhQX0JVU19SRUdfQkFTRV9DUzEgKyBFWFBfQ1MxX1NFR19TSVpFIC0gMSkgPj4gMTIpLCBFWFBfUkRZX0VOfEVYUF9NRU1fQlVTX1NJWkVfMzIsIDB4MUExQTQwMUYsIDB4MDYwNjBBMDQsIDB4MDAwMDAwMDJ9LAkvKlRPRE8gVmFsdWVzIHRvIGNoZWNrKi8KKwl7MCwgKEVYUF9CVVNfUkVHX0JBU0VfQ1MyID4+IDEyKSwgKChFWFBfQlVTX1JFR19CQVNFX0NTMiArIEVYUF9DUzJfU0VHX1NJWkUgLSAxKSA+PiAxMiksIEVYUF9TVFJCX01PREV8RVhQX0FMRV9NT0RFfEVYUF9NRU1fQlVTX1NJWkVfOCwgMHgxQTEwMjAxQSwgMHgwMzA4MDQwMywgMHgwMDAwMDAyfSwJLypUT0RPIFZhbHVlcyB0byBjaGVjayovCisJezAsIChFWFBfQlVTX1JFR19CQVNFX0NTMyA+PiAxMiksICgoRVhQX0JVU19SRUdfQkFTRV9DUzMgKyBFWFBfQ1MzX1NFR19TSVpFIC0gMSkgPj4gMTIpLCBFWFBfU1RSQl9NT0RFfEVYUF9BTEVfTU9ERXxFWFBfTUVNX0JVU19TSVpFXzgsIDB4MUExMDIwMUEsIDB4MDMwODA0MDMsIDB4MDAwMDAwMn0sCS8qQlQ4MzcwKi8KKwl7MCwgKEVYUF9CVVNfUkVHX0JBU0VfQ1M0ID4+IDEyKSwgKChFWFBfQlVTX1JFR19CQVNFX0NTNCArIEVYUF9DUzRfU0VHX1NJWkUgLSAxKSA+PiAxMiksIEVYUF9OQU5EX01PREV8RVhQX01FTV9CVVNfU0laRV84LCAweDFBMUE0MDFGLCAweDA2MDYwQTA0LCAweDAwMDAwMDAyfSwJLyogTkFORDogVE9ETyBWYWx1ZXMgdG8gY2hlY2sgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBNYWNoaW5lIGRlZmluaXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19pbml0IHBsYXRmb3JtX21hcF9pbyh2b2lkKQoreworCWRldmljZV9tYXBfaW8oKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBsYXRmb3JtX2lycV9pbml0KHZvaWQpCit7CisJZGV2aWNlX2lycV9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbGF0Zm9ybV9pbml0KHZvaWQpCit7CisJZGV2aWNlX2luaXQoKTsKKwlib2FyZF9ncGlvX2luaXQoKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkKKwlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhjb21jZXJ0b19zcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShjb21jZXJ0b19zcGlfYm9hcmRfaW5mbykpOworI2VuZGlmCisJbWFjX2FkZHJfaW5pdCgmY29tY2VydG9fcGZlX3BkYXRhKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGNvbWNlcnRvX2RldmljZXMsIEFSUkFZX1NJWkUoY29tY2VydG9fZGV2aWNlcykpOworfQorCitNQUNISU5FX1NUQVJUKENPTUNFUlRPLCAiQ29tY2VydG8gMjAwMCBBU0lDIikKKwkvKiBNaW5kc3BlZWQgVGVjaG5vbG9naWVzIEluYy4gKi8KKwkuYXRhZ19vZmZzZXQgICAgPSBDT01DRVJUT19BWElfRERSX0JBU0UgKyAweDEwMCwKKwkucmVzZXJ2ZQk9IHBsYXRmb3JtX3Jlc2VydmUsCisJLm1hcF9pbwkJPSBwbGF0Zm9ybV9tYXBfaW8sCisJLmluaXRfaXJxCT0gcGxhdGZvcm1faXJxX2luaXQsCisJLmluaXRfbWFjaGluZQk9IHBsYXRmb3JtX2luaXQsCisJLnRpbWVyCQk9ICZjb21jZXJ0b190aW1lciwKKyNpZmRlZiBDT05GSUdfWk9ORV9ETUEKKwkuZG1hX3pvbmVfc2l6ZQk9IFNaXzMyTSArIDMqU1pfNE0sICAvKiBVcCB0byBzdGFydCBvZiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIFBGRStNU1AgKi8KKyNlbmRpZgorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vYm9hcmQtYzJrZXZtLmMgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2JvYXJkLWMya2V2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NDQ2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2JvYXJkLWMya2V2bS5jCkBAIC0wLDAgKzEsNzQzIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9ib2FyZC1jMmtldm0uYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQ09NQ0VSVE8pIHx8IGRlZmluZWQoQ09ORklHX01URF9OQU5EX0NPTUNFUlRPX01PRFVMRSkKKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2R3X2RtYWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8YXNtL3NtcF90d2QuaD4KKyNpbmNsdWRlIDxhc20vbG9jYWx0aW1lci5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisKKworZXh0ZXJuIHZvaWQgcGxhdGZvcm1fcmVzZXJ2ZSh2b2lkKTsKK2V4dGVybiB2b2lkIGRldmljZV9tYXBfaW8gKHZvaWQpOworZXh0ZXJuIHZvaWQgZGV2aWNlX2lycV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZGV2aWNlX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBtYWNfYWRkcl9pbml0KHN0cnVjdCBjb21jZXJ0b19wZmVfcGxhdGZvcm1fZGF0YSAqKTsKK2V4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGNvbWNlcnRvX3RpbWVyOworCitzdGF0aWMgdm9pZCBfX2luaXQgYm9hcmRfZ3Bpb19pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1BGRV9VQVJUX1NVUFBPUlQKKwl3cml0ZWwoKHJlYWRsKENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcpICYgflBGRV9VQVJUX0dQSU8pIHwgUEZFX1VBUlRfQlVTLCBDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHKTsKKwljMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzBfMzEgfD0gUEZFX1VBUlRfR1BJT19QSU47IC8qIEdQSU9zIDEyICYgMTMgYXJlIHVzZWQgZm9yIFBGRV9VQVJUICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJMl9NU1BEX0xPV19TUEVFRCkKKwkvKiBlbmFibGUgU1BJIHBpbnMgKi8KKwl3cml0ZWwoKHJlYWRsKENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcxKSAmIH4oU1BJX01VWF9HUElPXzEpKSB8IChTUElfTVVYX0JVU18xKSwgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKSAmIH4oU1BJX01VWF9HUElPXzIpKSB8IChTUElfTVVYX0JVU18yKSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKTsKKwljMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzBfMzEgfD0gU1BJX01VWF9HUElPXzFfUElOOyAvKiBHUElPcyAxOCwxOSwgMjEsMjIsIDMwLDMxIGFyZSB1c2VkIGZvciBTUEkqLworCWMya19ncGlvX3Bpbl9zdGF0LmMya19ncGlvX3BpbnNfMzJfNjMgfD0gU1BJX01VWF9HUElPXzJfUElOOyAvKiBHUElPIDMyIGlzIHVzZWQgZm9yIFNQSSovCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpCisJLyogZW5hYmxlIFNQSSBwaW5zICovCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+KFNQSV8yX01VWF9HUElPXzEpKSB8IChTUElfMl9NVVhfQlVTXzEpLCBDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSk7CisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QpICYgfihTUElfMl9NVVhfR1BJT18yKSkgfCAoU1BJXzJfTVVYX0JVU18yKSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKTsKKwljMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzBfMzEgfD0gU1BJXzJfTVVYX0dQSU9fMV9QSU47CisJYzJrX2dwaW9fcGluX3N0YXQuYzJrX2dwaW9fcGluc18zMl82MyB8PSBTUElfMl9NVVhfR1BJT18yX1BJTjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSTJDX1NVUFBPUlQpCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+STJDX0dQSU8pIHwgSTJDX0JVUywgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworCWMya19ncGlvX3Bpbl9zdGF0LmMya19ncGlvX3BpbnNfMF8zMSB8PSBJMkNfR1BJT19QSU47CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0NPTUNFUlRPKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUT19NT0RVTEUpCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+TkFORF9HUElPKSB8IE5BTkRfQlVTLCBDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSk7CisJYzJrX2dwaW9fcGluX3N0YXQuYzJrX2dwaW9fcGluc18wXzMxIHw9IE5BTkRfR1BJT19QSU47CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX01URF9DT01DRVJUT19OT1IpCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+Tk9SX0dQSU8pIHwgTk9SX0JVUywgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworCWMya19ncGlvX3Bpbl9zdGF0LmMya19ncGlvX3BpbnNfMF8zMSB8PSBOT1JfR1BJT19QSU47CisjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBOT1IgZGV2aWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX01URF9DT01DRVJUT19OT1IpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fbm9yX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gTk9SRkxBU0hfTUVNT1JZX1BIWTEsCisJCS5lbmQJPSBOT1JGTEFTSF9NRU1PUllfUEhZMSArIFNaXzY0TSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgY29tY2VydG9fbm9yX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX25vciA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiY29tY2VydG9mbGFzaCIsCisJLmlkICAgICAgICAgICAgID0gMCwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX25vcl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGNvbWNlcnRvX25vcl9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY29tY2VydG9fbm9yX2RhdGEsCisJfSwKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBydGNfcmVzW10gPSB7CisgICAgICAgeworICAgICAgICAgICAgICAgLnN0YXJ0ID0gQ09NQ0VSVE9fQVBCX1JUQ19CQVNFLAorICAgICAgICAgICAgICAgLmVuZCA9IENPTUNFUlRPX0FQQl9SVENfQkFTRSArIFNaXzMyIC0gMSwKKyAgICAgICAgICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAgICAgLnN0YXJ0ID0gSVJRX1JUQ19BTE0sCisgICAgICAgICAgICAgICAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgICAgIC5zdGFydCA9IElSUV9SVENfUFJJLAorICAgICAgICAgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisgICAgICAgfSwKK307CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2ID0geworICAgICAgIC5uYW1lID0gImMyay1ydGMiLAorICAgICAgIC5pZCA9IC0xLAorICAgICAgIC5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShydGNfcmVzKSwKKyAgICAgICAucmVzb3VyY2UgPSBydGNfcmVzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBETUFDIGNvbnRyb2xsZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRFdfRE1BX1NVUFBPUlQpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGR3X2RtYWNfcmVzb3VyY2VbXSA9IHsKKwl7CisJCS5zdGFydCAgICAgICAgICA9IERXX0RNQV9ETUFDX0JBU0VBRERSLAorCQkuZW5kICAgICAgICAgICAgPSBEV19ETUFfRE1BQ19CQVNFQUREUiArIDB4MkMwLAorCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ICAgICAgICAgID0gSVJRX0RNQUMsCisJCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZHdfZG1hX3BsYXRmb3JtX2RhdGEgZHdfZG1hY19kYXRhID0geworCS5ucl9jaGFubmVscyAgICA9IDgsCit9OworCitzdGF0aWMgdTY0IGR3X2RtYWNfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkd19kbWFjX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiZHdfZG1hYyIsCisJLmlkICAgICAgICAgICAgID0gMCwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5kbWFfbWFzayA9ICZkd19kbWFjX2RtYV9tYXNrLAorCQkucGxhdGZvcm1fZGF0YSAgPSAmZHdfZG1hY19kYXRhLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLnJlc291cmNlICAgICAgID0gZHdfZG1hY19yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGR3X2RtYWNfcmVzb3VyY2UpLAorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIE5BTkQgZGV2aWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0NPTUNFUlRPKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUT19NT0RVTEUpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX25hbmRfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBDT01DRVJUT19OQU5EX0ZJT19BRERSLAorCQkuZW5kCT0gQ09NQ0VSVE9fTkFORF9GSU9fQUREUiArIENPTUNFUlRPX05BTkRfSU9fU1ogLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19uYW5kID0geworCS5uYW1lCQk9ICJjb21jZXJ0b25hbmQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJCQkucGxhdGZvcm1fZGF0YQk9IE5VTEwsCisJfSwKKwkucmVzb3VyY2UJPSBjb21jZXJ0b19uYW5kX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY29tY2VydG9fbmFuZF9yZXNvdXJjZXMpLAorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFNQSSBidXMgY29udHJvbGxlcgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpCisKKyNkZWZpbmUJQ0xLX05BTUUJMTAKK3N0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSB7CisJaW50IHVzZV9kbWE7CisJaW50IG51bV9jaGlwc2VsZWN0czsKKwlpbnQgYnVzX251bTsKKwl1MzIgbWF4X2ZyZXE7CisJY2hhciBjbGtfbmFtZVtDTEtfTkFNRV07Cit9OworCitzdHJ1Y3Qgc3BpX3BsYXRmb3JtX2RhdGEgeworCWludCB0eXBlOworCWludCBkdW1teTsKK307CisKK3N0cnVjdCBzcGlfY29udHJvbGxlcl9kYXRhIHsKKyAgICAgICAgdTggcG9sbF9tb2RlOyAgIC8qIDAgZm9yIGNvbnRvbGxlciBwb2xsaW5nIG1vZGUgKi8KKyAgICAgICAgdTggdHlwZTsgICAgICAgIC8qIFNQSS9TU1AvTWljcndpcmUgKi8KKyAgICAgICAgdTggZW5hYmxlX2RtYTsKKyAgICAgICAgdm9pZCAoKmNzX2NvbnRyb2wpKHUzMiBjb21tYW5kKTsKK307CisKK3N0cnVjdCBzcGlfcGxhdGZvcm1fZGF0YSBzcGlfcGRhdGEgPSB7CisJLnR5cGUgPSAwLAorCS5kdW1teSA9IDAsCit9OworCitzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfZGF0YSBzcGlfY3RybF9kYXRhID0gIHsKKyAgICAgICAgLnBvbGxfbW9kZSA9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGNvbWNlcnRvX3NwaV9ib2FyZF9pbmZvW10gPSB7CisJeworCQkvKiBGSVhNRTogZm9yIGNoaXBzZWxlY3QtMCAqLworCQkubW9kYWxpYXMgPSAiczI1ZmwyNTZzMCIsCisJCS5jaGlwX3NlbGVjdCA9IDAsCisJCS5tYXhfc3BlZWRfaHogPSA0KjEwMDAqMTAwMCwKKwkJLmJ1c19udW0gPSAwLAorCQkuaXJxID0gLTEsCisJCS5tb2RlID0gU1BJX01PREVfMywKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc3BpX3BkYXRhLAorICAgICAgICAgICAgICAgIC5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2N0cmxfZGF0YSwKKwl9LAorCXsKKwkJLyogRklYTUU6IGZvciBjaGlwc2VsZWN0LTEgKi8KKwkJLm1vZGFsaWFzID0gInByb3NsaWMiLAorCQkubWF4X3NwZWVkX2h6ID0gNCoxMDAwKjEwMDAsCisJCS5jaGlwX3NlbGVjdCA9IDEsCisJCS5tb2RlID0gU1BJX01PREVfMywKKwkJLmJ1c19udW0gPSAwLAorCQkuaXJxID0gLTEsCisJCS5tb2RlID0gU1BJX01PREVfMywKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc3BpX3BkYXRhLAorICAgICAgICAgICAgICAgIC5jb250cm9sbGVyX2RhdGEgPSAmc3BpX2N0cmxfZGF0YSwKKwl9LAorCXsKKwkJLm1vZGFsaWFzID0gImNvbWNlcnRvX3NwaTMiLAorCQkuY2hpcF9zZWxlY3QgPSAyLAorCQkubWF4X3NwZWVkX2h6ID0gNCoxMDAwKjEwMDAsCisJCS5idXNfbnVtID0gMCwKKwkJLmlycSA9IC0xLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaV9wZGF0YSwKKyAgICAgICAgICAgICAgICAuY29udHJvbGxlcl9kYXRhID0gJnNwaV9jdHJsX2RhdGEsCisJfSwKKworI2lmIDAgLy9NU0lGCisKKwl7CisJCS5tb2RhbGlhcyA9ICJwcm9zbGljIiwKKwkJLm1heF9zcGVlZF9oeiA9IDIqMTAwMCoxMDAwLAorCQkuY2hpcF9zZWxlY3QgPSAzLAorCQkubW9kZSA9IFNQSV9NT0RFXzEsCisJCS5idXNfbnVtID0gMCwKKwkJLmlycSA9IC0xLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaV9wZGF0YSwKKyAgICAgICAgICAgICAgICAuY29udHJvbGxlcl9kYXRhID0gJnNwaV9jdHJsX2RhdGEsCisJfSwKKyNlbHNlCisJeworCQkubW9kYWxpYXMgPSAibGVnZXJpdHkiLAorCQkuY2hpcF9zZWxlY3QgPSAzLAorCQkubWF4X3NwZWVkX2h6ID0gNCoxMDAwKjEwMDAsCisJCS5idXNfbnVtID0gMCwKKwkJLmlycSA9IC0xLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaV9wZGF0YSwKKyAgICAgICAgICAgICAgICAuY29udHJvbGxlcl9kYXRhID0gJnNwaV9jdHJsX2RhdGEsCisJfSwKKyNlbmRpZgorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkKK3N0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSBmYXN0X3NwaV9wZGF0YSA9IHsKKwkudXNlX2RtYSA9IDAsCisJLm51bV9jaGlwc2VsZWN0cyA9IDIsCisJLmJ1c19udW0gPSAxLAorCS5tYXhfZnJlcSA9IDYwICogMTAwMCAqIDEwMDAsCisJLmNsa19uYW1lID0gIkRVUyIsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUEkyX01TUERfSElHSF9TUEVFRCkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fZmFzdF9zcGlfcmVzb3VyY2VbXSA9IHsKKwl7CisJCS5zdGFydCAgPSBDT01DRVJUT19BWElfU1BJX0JBU0UsCisJCS5lbmQgICAgPSBDT01DRVJUT19BWElfU1BJX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ICA9IElSUV9TUEksCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19mYXN0X3NwaSA9IHsKKwkubmFtZSA9ICJjb21jZXJ0b19zcGkiLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX2Zhc3Rfc3BpX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBjb21jZXJ0b19mYXN0X3NwaV9yZXNvdXJjZSwKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKQorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmZhc3Rfc3BpX3BkYXRhLAorCX0sCisjZW5kaWYKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkKK3N0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSBsc19zcGlfcGRhdGEgPSB7CisJLnVzZV9kbWEgPSAwLAorCS5udW1fY2hpcHNlbGVjdHMgPSA0LAorCS5idXNfbnVtID0gMCwKKwkubWF4X2ZyZXEgPSAyMCAqIDEwMDAgKiAxMDAwLAorCS5jbGtfbmFtZSA9ICJzcGlfaTJjIiwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJMl9NU1BEX0xPV19TUEVFRCkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fc3BpX3Jlc291cmNlW10gPSB7CisJeworCQkuc3RhcnQgID0gQ09NQ0VSVE9fQVBCX1NQSV9CQVNFLAorCQkuZW5kICAgID0gQ09NQ0VSVE9fQVBCX1NQSV9CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCAgPSBJUlFfU1BJX0xTLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fc3BpID0geworCS5uYW1lID0gImNvbWNlcnRvX3NwaSIsCisJLmlkID0gMCwKKwkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoY29tY2VydG9fc3BpX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBjb21jZXJ0b19zcGlfcmVzb3VyY2UsCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKQorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmxzX3NwaV9wZGF0YSwKKwl9LAorI2VuZGlmCit9OworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgSTJDIGJ1cyBjb250cm9sbGVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0kyQ19TVVBQT1JUKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b19pMmNfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBDT01DRVJUT19BUEJfSTJDX0JBU0UsCisJCS5lbmQJPSBDT01DRVJUT19BUEJfSTJDX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQJPSBJUlFfSTJDLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9faTJjID0geworCS5uYW1lICAgICAgICAgICA9ICJjb21jZXJ0b19pMmMiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoY29tY2VydG9faTJjX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gY29tY2VydG9faTJjX3Jlc291cmNlcywKK307CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyogIFdhdGNoZG9nCisqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgQ09ORklHX01QQ09SRV9XQVRDSERPRworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b19hOXdkX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gQ09NQ0VSVE9fVFdEX0JBU0UsCisJCS5lbmQJPSBDT01DRVJUT19UV0RfQkFTRSArIDB4RkYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZQk9ICJtcGNvcmVfd2R0IiwKKwkJLnN0YXJ0CT0gSVJRX0xPQ0FMV0RPRywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX2E5d2QgPSB7CisJLm5hbWUJCT0gIm1wY29yZV93ZHQiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoY29tY2VydG9fYTl3ZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGNvbWNlcnRvX2E5d2RfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1dBVENIRE9HCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX3dkdF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IENPTUNFUlRPX0FQQl9USU1FUl9CQVNFICsgMHhEMCwKKwkJLmVuZAk9IENPTUNFUlRPX0FQQl9USU1FUl9CQVNFICsgMHhEOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX3dkdCA9IHsKKyAgICAgICAgLm5hbWUgICA9ICJjb21jZXJ0b193ZHQiLAorICAgICAgICAuaWQgICAgID0gLTEsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShjb21jZXJ0b193ZHRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBjb21jZXJ0b193ZHRfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRUxQX1NVUFBPUlQpCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIElQc2VjCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b19lbHBfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZSAgID0gImVscCIsCisJCS5zdGFydCAgPSBDT01DRVJUT19BWElfU1BBQ0NfUERVX0JBU0UsCisJCS5lbmQgICAgPSBDT01DRVJUT19BWElfU1BBQ0NfUERVX0JBU0UgKyBTWl8xNk0gIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZSAgID0gImlycV9zcGFjYyIsCisJCS5zdGFydCAgPSBJUlFfU1BBQ0MsCisJCS5lbmQgICAgPSBJUlFfU1BBQ0MsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgdTY0IGNvbWNlcnRvX2VscF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICBjb21jZXJ0b19lbHBfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICAgICAgICAgID0gIkVsbGlwdGljLUVQTjE4MDIiLAorCS5pZCAgICAgICAgICAgICAgICAgICAgID0gMCwKKwkubnVtX3Jlc291cmNlcyAgICAgICAgICA9IDIsCisJLnJlc291cmNlICAgICAgICAgICAgICAgPSBjb21jZXJ0b19lbHBfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzayAgICAgICAgICAgICAgID0gJmNvbWNlcnRvX2VscF9kbWFfbWFzaywKKwkJLmNvaGVyZW50X2RtYV9tYXNrICAgICAgPSBETUFfQklUX01BU0soMzIpLAorCX0sCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgY29tY2VydG9fdGRtX2RhdGEgY29tY2VydG9fdGRtX3BkYXRhID0geworCS5mc291dHB1dCA9IDEsIC8qIEdlbmVyaWMgUGFkIENvbnRyb2wgYW5kIFZlcnNpb24gSUQgUmVnaXN0ZXJbMl0gKi8KKwkuZnNwb2xhcml0eSA9IDAsIC8qIDI4IEZTWU5DX0ZBTEwoUklTRSlfRURHRSAqLworCS5mc2h3aWR0aCA9IDEsIC8qIEhpZ2hfUGhhc2VfV2lkdGhbMTA6MF0gKi8KKwkuZnNsd2lkdGggPSAweEZGLCAvKiBMb3dfUGhhc2VfV2lkdGhbMTA6MF0gKi8KKwkuY2xvY2toeiA9IDIwNDgwMDAsIC8qIElOQ19WQUxVRVsyOTowXSBBY2NvcmRpbmcgdG8gdGhlIGRlc2lyZWQgVERNIGNsb2NrIG91dHB1dCBcCisJCQkgICAgICAgZnJlcXVlbmN5LCB0aGlzIGZpZWxkIHNob3VsZCBiZSBjb25maWd1cmVkICovCisJLmNsb2Nrb3V0ID0gMSwgLyogMCAtPiBzZXQgYml0IDIxLCBjbGVhciBiaXQgMjAgaW4gQ09NQ0VSVE9fR1BJT19JT0NUUkxfUkVHCisJCQkgIChzb2Z0d2FyZSBjb250cm9sLCBjbG9jayBpbnB1dCkKKwkJCSAgMSAtPiBzZXQgYml0IDIxIGFuZCAyMCBpbiBDT01DRVJUT19HUElPX0lPQ1RSTF9SRUcKKwkJCSAgKHNvZnR3YXJlIGNvbnRyb2wsIGNsb2NrIG91dHB1dCkKKwkJCSAgMiAtPiBjbGVhciBiaXQgMjEgaW4gQ09NQ0VSVE9fR1BJT19JT0NUUkxfUkVHIChoYXJkd2FyZSBjb250cm9sKSAqLworCS50ZG1tdXggPSAweDEsIC8qIFRETSBpbnRlcmZhY2UgTXV4aW5nOjB4MCAtIFRETSBibG9jaywgMHgxIC0gWkRTIGJsb2NrLAorCQkweDIgLSBHUElPWzYzOjYwXSBzaWduYWxzIGFuZCAweDMgLSBNU0lGIGJsb2NrIGlzIHNlbGVjdGVkICovCisjaWYgMAorCS8qIEZJWCBNRSAtIE5lZWQgY29ycmVjdCB2YWx1ZXMgZm9yIFRETV9EUiwgVERNX0RYLCBURE1fRlMgYW5kIFRETV9DSyAqLworCS50ZG1jayA9IDB4M0YsCisJLnRkbWZzID0gMHgzRiwKKwkudGRtZHggPSAweDNGLAorCS50ZG1kciA9IDB4M0YsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX3RkbV9kZXZpY2UgPSB7CisJLm5hbWUJPSAiY29tY2VydG8tdGRtIiwKKwkuaWQJCT0gMCwKKwkuZGV2LnBsYXRmb3JtX2RhdGEgPSAmY29tY2VydG9fdGRtX3BkYXRhLAorCS5udW1fcmVzb3VyY2VzCT0gMCwKKwkucmVzb3VyY2UgPSBOVUxMLAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0RTUEdfREVDVF9DU1MpCisjZGVmaW5lIENTU19JVENNX0JBU0UJCUNPTUNFUlRPX0FYSV9ERUNUX0JBU0UKKyNkZWZpbmUgQ1NTX0lUQ01fU0laRQkJKFNaXzFNKQorCisjZGVmaW5lIENTU19EVENNX0JBU0UJCShDU1NfSVRDTV9CQVNFICsgQ1NTX0lUQ01fU0laRSkKKyNkZWZpbmUgQ1NTX0RUQ01fU0laRQkJKFNaXzFNKQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX2Nzc19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5uYW1lCT0gIml0Y20iLAorCQkuc3RhcnQJPSBDU1NfSVRDTV9CQVNFLAorCQkuZW5kCT0gQ1NTX0lUQ01fQkFTRSArIENTU19JVENNX1NJWkUgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiZHRjbSIsCisJCS5zdGFydAk9IENTU19EVENNX0JBU0UsCisJCS5lbmQJPSBDU1NfRFRDTV9CQVNFICsgQ1NTX0RUQ01fU0laRSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19jc3NfZGV2aWNlID0geworCS5uYW1lCQk9ICJjc3MiLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9IDAsCisJCS5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY29tY2VydG9fY3NzX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gY29tY2VydG9fY3NzX3Jlc291cmNlcywKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b19wZmVfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQk9ICJhcGIiLAorCQkuc3RhcnQgID0gQ09NQ0VSVE9fQVBCX1BGRV9CQVNFLAorCQkuZW5kICAgID0gQ09NQ0VSVE9fQVBCX1BGRV9CQVNFICsgQ09NQ0VSVE9fQVBCX1BGRV9TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZQk9ICJheGkiLAorCQkuc3RhcnQgID0gQ09NQ0VSVE9fQVhJX1BGRV9CQVNFLAorCQkuZW5kICAgID0gQ09NQ0VSVE9fQVhJX1BGRV9CQVNFICsgQ09NQ0VSVE9fQVhJX1BGRV9TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZQk9ICJkZHIiLAorCQkuc3RhcnQgID0gQ09NQ0VSVE9fUEZFX0REUl9CQVNFLAorCQkuZW5kCT0gQ09NQ0VSVE9fUEZFX0REUl9CQVNFICsgQ09NQ0VSVE9fUEZFX0REUl9TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZQk9ICJpcmFtIiwKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX1BGRV9JUkFNX0JBU0UsCisJCS5lbmQJPSBDT01DRVJUT19QRkVfSVJBTV9CQVNFICsgQ09NQ0VSVE9fUEZFX0lSQU1fU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgLm5hbWUgICA9ICJpcHNlYyIsCisgICAgICAgICAgICAgICAgLnN0YXJ0ICA9IENPTUNFUlRPX0FYSV9JUFNFQ19CQVNFLAorICAgICAgICAgICAgICAgIC5lbmQgICAgPSBDT01DRVJUT19BWElfSVBTRUNfQkFTRSArIENPTUNFUlRPX0FYSV9JUFNFQ19TSVpFIC0gMSwKKyAgICAgICAgICAgICAgICAuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisgICAgICAgIH0sCisKKwl7CisJCS5uYW1lCT0gImhpZiIsCisJCS5zdGFydCAgPSBJUlFfUEZFX0hJRiwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGNvbWNlcnRvX3BmZV9wbGF0Zm9ybV9kYXRhIGNvbWNlcnRvX3BmZV9wZGF0YSA9IHsKKwkuY29tY2VydG9fZXRoX3BkYXRhWzBdID0geworCQkubmFtZSA9IEdFTTBfSVRGX05BTUUsCisJCS5kZXZpY2VfZmxhZ3MgPSBDT05GSUdfQ09NQ0VSVE9fR0VNQUMsCisJCS5taWlfY29uZmlnID0gQ09ORklHX0NPTUNFUlRPX1VTRV9SR01JSSwKKwkJLmdlbWFjX21vZGUgPSBHRU1BQ19TV19DT05GIHwgR0VNQUNfU1dfRlVMTF9EVVBMRVggfCBHRU1BQ19TV19TUEVFRF8xRywKKwkJLnBoeV9mbGFncyA9IEdFTUFDX1BIWV9SR01JSV9BRERfREVMQVksCisJCS5idXNfaWQgPSAwLAorCQkucGh5X2lkID0gNCwKKwkJLmdlbV9pZCA9IDAsCisJCS5tYWNfYWRkciA9ICh1OFtdKUdFTTBfTUFDLAorCX0sCisKKwkuY29tY2VydG9fZXRoX3BkYXRhWzFdID0geworCQkubmFtZSA9IEdFTTFfSVRGX05BTUUsCisJCS5kZXZpY2VfZmxhZ3MgPSBDT05GSUdfQ09NQ0VSVE9fR0VNQUMsCisJCS5taWlfY29uZmlnID0gQ09ORklHX0NPTUNFUlRPX1VTRV9SR01JSSwKKwkJLmdlbWFjX21vZGUgPSBHRU1BQ19TV19DT05GIHwgR0VNQUNfU1dfRlVMTF9EVVBMRVggfCBHRU1BQ19TV19TUEVFRF8xRywKKwkJLnBoeV9mbGFncyA9IEdFTUFDX05PX1BIWSwKKwkJLmdlbV9pZCA9IDEsCisJCS5tYWNfYWRkciA9ICh1OFtdKUdFTTFfTUFDLAorCX0sCisKKwkuY29tY2VydG9fZXRoX3BkYXRhWzJdID0geworCQkubmFtZSA9IEdFTTJfSVRGX05BTUUsCisJCS5kZXZpY2VfZmxhZ3MgPSBDT05GSUdfQ09NQ0VSVE9fR0VNQUMsCisJCS5taWlfY29uZmlnID0gQ09ORklHX0NPTUNFUlRPX1VTRV9SR01JSSwKKwkJLmdlbWFjX21vZGUgPSBHRU1BQ19TV19DT05GIHwgR0VNQUNfU1dfRlVMTF9EVVBMRVggfCBHRU1BQ19TV19TUEVFRF8xRywKKwkJLnBoeV9mbGFncyA9IEdFTUFDX05PX1BIWSwKKwkJLmdlbV9pZCA9IDIsCisJCS5tYWNfYWRkciA9ICh1OFtdKUdFTTJfTUFDLAorCX0sCisKKwkvKioKKwkgKiBUaGVyZSBpcyBhIHNpbmdsZSBtZGlvIGJ1cyBjb21pbmcgb3V0IG9mIEMySy4gIEFuZCB0aGF0J3MgdGhlIG9uZQorCSAqIGNvbm5lY3RlZCB0byBHRU0wLiBBbGwgUEhZJ3MsIHN3aXRjaHMgd2lsbCBiZSBjb25uZWN0ZWQgdG8gdGhlIHNhbWUKKwkgKiBidXMgdXNpbmcgZGlmZmVyZW50IGFkZHJlc3Nlcy4gVHlwaWNhbGx5IC5idXNfaWQgaXMgYWx3YXlzIDAsIG9ubHkKKwkgKiAucGh5X2lkIHdpbGwgY2hhbmdlIGluIHRoZSBkaWZmZXJlbnQgY29tY2VydG9fZXRoX3BkYXRhW10gc3RydWN0dXJlcyBhYm92ZS4KKwkgKi8KKwkuY29tY2VydG9fbWRpb19wZGF0YVswXSA9IHsKKwkJLmVuYWJsZWQgPSAxLAorCQkucGh5X21hc2sgPSAweEZGRkZGRkVGLAorCQkubWRjX2RpdiA9IDk2LAorCQkuaXJxID0geworCQkJWzRdID0gUEhZX1BPTEwsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyB1NjQgY29tY2VydG9fcGZlX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fcGZlX2RldmljZSA9IHsKKwkubmFtZQkJPSAicGZlIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJCT0gJmNvbWNlcnRvX3BmZV9wZGF0YSwKKwkJLmRtYV9tYXNrCQk9ICZjb21jZXJ0b19wZmVfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY29tY2VydG9fcGZlX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gY29tY2VydG9fcGZlX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjb21jZXJ0b19kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUTykgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQ09NQ0VSVE9fTU9EVUxFKQorCQkmY29tY2VydG9fbmFuZCwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX01URF9DT01DRVJUT19OT1IpCisJCSZjb21jZXJ0b19ub3IsCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19JMkNfU1VQUE9SVCkKKwkJJmNvbWNlcnRvX2kyYywKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoQ09ORklHX01QQ09SRV9XQVRDSERPRykKKwkJJmNvbWNlcnRvX2E5d2QsCisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1dBVENIRE9HKQorCQkmY29tY2VydG9fd2R0LAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUEkyX01TUERfSElHSF9TUEVFRCkKKwkJJmNvbWNlcnRvX2Zhc3Rfc3BpLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUEkyX01TUERfTE9XX1NQRUVEKQorCQkmY29tY2VydG9fc3BpLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRFdfRE1BX1NVUFBPUlQpCisJCSZkd19kbWFjX2RldmljZSwKKyNlbmRpZgorCQkmY29tY2VydG9fdGRtX2RldmljZSwKKwkJJmNvbWNlcnRvX3BmZV9kZXZpY2UsCisJCSZydGNfZGV2LAorI2lmIGRlZmluZWQoQ09ORklHX0RTUEdfREVDVF9DU1MpCisJCSZjb21jZXJ0b19jc3NfZGV2aWNlLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRUxQX1NVUFBPUlQpCisJJmNvbWNlcnRvX2VscF9kZXZpY2UsCisjZW5kaWYKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEV4cGFuc2lvbiBidXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGJ5IGNvbWNlcnRvLTIwMDAuYyB0byBpbml0aWFsaXplIHRoZSBleHBhbnNpb24gYnVzICovCitpbnQgY29tY2VydG9fZXhwX3ZhbHVlc1s1XVs3XT0geworCS8qIEVOQUJMRSwgQkFTRSwgU0VHX1NaLCBDRkcsIFRNRzEsIFRNRzIsIFRNRzMgKi8KKwl7MSwgKEVYUF9CVVNfUkVHX0JBU0VfQ1MwID4+IDEyKSwgKChFWFBfQlVTX1JFR19CQVNFX0NTMCArIEVYUF9DUzBfU0VHX1NJWkUgLSAxKSA+PiAxMiksIEVYUF9NRU1fQlVTX1NJWkVfMTYsIDB4MDMwMzQwMDcsIDB4MDQwNDA1MDIsIDB4MDAwMDAwMDJ9LAkJLypUT0RPIFZhbHVlcyB0byBjaGVjayovCisJezAsIChFWFBfQlVTX1JFR19CQVNFX0NTMSA+PiAxMiksICgoRVhQX0JVU19SRUdfQkFTRV9DUzEgKyBFWFBfQ1MxX1NFR19TSVpFIC0gMSkgPj4gMTIpLCBFWFBfUkRZX0VOfEVYUF9NRU1fQlVTX1NJWkVfMzIsIDB4MUExQTQwMUYsIDB4MDYwNjBBMDQsIDB4MDAwMDAwMDJ9LAkvKlRPRE8gVmFsdWVzIHRvIGNoZWNrKi8KKwl7MCwgKEVYUF9CVVNfUkVHX0JBU0VfQ1MyID4+IDEyKSwgKChFWFBfQlVTX1JFR19CQVNFX0NTMiArIEVYUF9DUzJfU0VHX1NJWkUgLSAxKSA+PiAxMiksIEVYUF9TVFJCX01PREV8RVhQX0FMRV9NT0RFfEVYUF9NRU1fQlVTX1NJWkVfOCwgMHgxQTEwMjAxQSwgMHgwMzA4MDQwMywgMHgwMDAwMDAyfSwJLypUT0RPIFZhbHVlcyB0byBjaGVjayovCisJezAsIChFWFBfQlVTX1JFR19CQVNFX0NTMyA+PiAxMiksICgoRVhQX0JVU19SRUdfQkFTRV9DUzMgKyBFWFBfQ1MzX1NFR19TSVpFIC0gMSkgPj4gMTIpLCBFWFBfU1RSQl9NT0RFfEVYUF9BTEVfTU9ERXxFWFBfTUVNX0JVU19TSVpFXzgsIDB4MUExMDIwMUEsIDB4MDMwODA0MDMsIDB4MDAwMDAwMn0sCS8qQlQ4MzcwKi8KKwl7MSwgKEVYUF9CVVNfUkVHX0JBU0VfQ1M0ID4+IDEyKSwgKChFWFBfQlVTX1JFR19CQVNFX0NTNCArIEVYUF9DUzRfU0VHX1NJWkUgLSAxKSA+PiAxMiksIEVYUF9OQU5EX01PREV8RVhQX01FTV9CVVNfU0laRV84LCAweDAwMDAwMDAxLCAweDAxMDEwMDAxLCAweDAwMDAwMDAyfSwJLyogTkFORDogVE9ETyBWYWx1ZXMgdG8gY2hlY2sgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBNYWNoaW5lIGRlZmluaXRpb24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19pbml0IHBsYXRmb3JtX21hcF9pbyh2b2lkKQoreworCWRldmljZV9tYXBfaW8oKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBsYXRmb3JtX2lycV9pbml0KHZvaWQpCit7CisJZGV2aWNlX2lycV9pbml0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbGF0Zm9ybV9pbml0KHZvaWQpCit7CisJZGV2aWNlX2luaXQoKTsKKwlib2FyZF9ncGlvX2luaXQoKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkKKwlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhjb21jZXJ0b19zcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShjb21jZXJ0b19zcGlfYm9hcmRfaW5mbykpOworI2VuZGlmCisJbWFjX2FkZHJfaW5pdCgmY29tY2VydG9fcGZlX3BkYXRhKTsKKworCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGNvbWNlcnRvX2RldmljZXMsIEFSUkFZX1NJWkUoY29tY2VydG9fZGV2aWNlcykpOworfQorCitNQUNISU5FX1NUQVJUKENPTUNFUlRPLCAiQ29tY2VydG8gMjAwMCBFVk0iKQorCS8qIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMgSW5jLiAqLworCS5hdGFnX29mZnNldCAgICA9IENPTUNFUlRPX0FYSV9ERFJfQkFTRSArIDB4MTAwLAorCS5yZXNlcnZlCT0gcGxhdGZvcm1fcmVzZXJ2ZSwKKwkubWFwX2lvCQk9IHBsYXRmb3JtX21hcF9pbywKKwkuaW5pdF9pcnEJPSBwbGF0Zm9ybV9pcnFfaW5pdCwKKwkuaW5pdF9tYWNoaW5lCT0gcGxhdGZvcm1faW5pdCwKKwkudGltZXIJCT0gJmNvbWNlcnRvX3RpbWVyLAorI2lmZGVmIENPTkZJR19aT05FX0RNQQorCS5kbWFfem9uZV9zaXplCT0gU1pfMzJNICsgMypTWl80TSwKKyNlbmRpZgorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vYm9hcmQtYzJrbWZjbmV2bS5jIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9ib2FyZC1jMmttZmNuZXZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0Y2Y0NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vYm9hcmQtYzJrbWZjbmV2bS5jCkBAIC0wLDAgKzEsNzQzIEBACisvKgorICogYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9ib2FyZC1jMmttZmNuZXZtLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorCisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2lmIGRlZmluZWQoQ09ORklHX01URF9OQU5EX0NPTUNFUlRPKSB8fCBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUT19NT0RVTEUpCisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpCisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9kd19kbWFjLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGFzbS9zbXBfdHdkLmg+CisjaW5jbHVkZSA8YXNtL2xvY2FsdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvZ2ljLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPG1hY2gvZ3Bpby5oPgorCisKK2V4dGVybiB2b2lkIHBsYXRmb3JtX3Jlc2VydmUodm9pZCk7CitleHRlcm4gdm9pZCBkZXZpY2VfbWFwX2lvICh2b2lkKTsKK2V4dGVybiB2b2lkIGRldmljZV9pcnFfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGRldmljZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgbWFjX2FkZHJfaW5pdChzdHJ1Y3QgY29tY2VydG9fcGZlX3BsYXRmb3JtX2RhdGEgKik7CitleHRlcm4gc3RydWN0IHN5c190aW1lciBjb21jZXJ0b190aW1lcjsKKworc3RhdGljIHZvaWQgX19pbml0IGJvYXJkX2dwaW9faW5pdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19DT01DRVJUT19QRkVfVUFSVF9TVVBQT1JUCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHKSAmIH5QRkVfVUFSVF9HUElPKSB8IFBGRV9VQVJUX0JVUywgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRyk7CisJYzJrX2dwaW9fcGluX3N0YXQuYzJrX2dwaW9fcGluc18wXzMxIHw9IFBGRV9VQVJUX0dQSU9fUElOOyAvKiBHUElPcyAxMiAmIDEzIGFyZSB1c2VkIGZvciBQRkVfVUFSVCAqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpIHx8IGRlZmluZWQoQ09ORklHX1NQSTJfTVNQRF9MT1dfU1BFRUQpCisJLyogZW5hYmxlIFNQSSBwaW5zICovCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+KFNQSV9NVVhfR1BJT18xKSkgfCAoU1BJX01VWF9CVVNfMSksIENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcxKTsKKwl3cml0ZWwoKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCkgJiB+KFNQSV9NVVhfR1BJT18yKSkgfCAoU1BJX01VWF9CVVNfMiksIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCk7CisJYzJrX2dwaW9fcGluX3N0YXQuYzJrX2dwaW9fcGluc18wXzMxIHw9IFNQSV9NVVhfR1BJT18xX1BJTjsgLyogR1BJT3MgMTgsMTksIDIxLDIyLCAzMCwzMSBhcmUgdXNlZCBmb3IgU1BJKi8KKwljMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzMyXzYzIHw9IFNQSV9NVVhfR1BJT18yX1BJTjsgLyogR1BJTyAzMiBpcyB1c2VkIGZvciBTUEkqLworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKQorCS8qIGVuYWJsZSBTUEkgcGlucyAqLworCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpICYgfihTUElfMl9NVVhfR1BJT18xKSkgfCAoU1BJXzJfTVVYX0JVU18xKSwgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKSAmIH4oU1BJXzJfTVVYX0dQSU9fMikpIHwgKFNQSV8yX01VWF9CVVNfMiksIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCk7CisJYzJrX2dwaW9fcGluX3N0YXQuYzJrX2dwaW9fcGluc18wXzMxIHw9IFNQSV8yX01VWF9HUElPXzFfUElOOworCWMya19ncGlvX3Bpbl9zdGF0LmMya19ncGlvX3BpbnNfMzJfNjMgfD0gU1BJXzJfTVVYX0dQSU9fMl9QSU47CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0kyQ19TVVBQT1JUKQorCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpICYgfkkyQ19HUElPKSB8IEkyQ19CVVMsIENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcxKTsKKwljMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzBfMzEgfD0gSTJDX0dQSU9fUElOOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUTykgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQ09NQ0VSVE9fTU9EVUxFKQorCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpICYgfk5BTkRfR1BJTykgfCBOQU5EX0JVUywgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworCWMya19ncGlvX3Bpbl9zdGF0LmMya19ncGlvX3BpbnNfMF8zMSB8PSBOQU5EX0dQSU9fUElOOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfQ09NQ0VSVE9fTk9SKQorCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpICYgfk5PUl9HUElPKSB8IE5PUl9CVVMsIENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcxKTsKKwljMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzBfMzEgfD0gTk9SX0dQSU9fUElOOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgTk9SIGRldmljZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NVERfQ09NQ0VSVE9fTk9SKQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX25vcl9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IE5PUkZMQVNIX01FTU9SWV9QSFkxLAorCQkuZW5kCT0gTk9SRkxBU0hfTUVNT1JZX1BIWTEgKyBTWl82NE0gLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhIGNvbWNlcnRvX25vcl9kYXRhID0geworCS5tYXBfbmFtZQk9ICJjZmlfcHJvYmUiLAorCS53aWR0aAk9IDIsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19ub3IgPSB7CisJLm5hbWUgICAgICAgICAgID0gImNvbWNlcnRvZmxhc2giLAorCS5pZCAgICAgICAgICAgICA9IDAsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShjb21jZXJ0b19ub3JfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBjb21jZXJ0b19ub3JfcmVzb3VyY2VzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmNvbWNlcnRvX25vcl9kYXRhLAorCX0sCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcnRjX3Jlc1tdID0geworICAgICAgIHsKKyAgICAgICAgICAgICAgIC5zdGFydCA9IENPTUNFUlRPX0FQQl9SVENfQkFTRSwKKyAgICAgICAgICAgICAgIC5lbmQgPSBDT01DRVJUT19BUEJfUlRDX0JBU0UgKyBTWl8zMiAtIDEsCisgICAgICAgICAgICAgICAuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKKyAgICAgICB9LAorICAgICAgIHsKKyAgICAgICAgICAgICAgIC5zdGFydCA9IElSUV9SVENfQUxNLAorICAgICAgICAgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisgICAgICAgfSwKKyAgICAgICB7CisgICAgICAgICAgICAgICAuc3RhcnQgPSBJUlFfUlRDX1BSSSwKKyAgICAgICAgICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorICAgICAgIH0sCit9Oworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldiA9IHsKKyAgICAgICAubmFtZSA9ICJjMmstcnRjIiwKKyAgICAgICAuaWQgPSAtMSwKKyAgICAgICAubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUocnRjX3JlcyksCisgICAgICAgLnJlc291cmNlID0gcnRjX3JlcywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgRE1BQyBjb250cm9sbGVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0RXX0RNQV9TVVBQT1JUKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkd19kbWFjX3Jlc291cmNlW10gPSB7CisJeworCQkuc3RhcnQgICAgICAgICAgPSBEV19ETUFfRE1BQ19CQVNFQUREUiwKKwkJLmVuZCAgICAgICAgICAgID0gRFdfRE1BX0RNQUNfQkFTRUFERFIgKyAweDJDMCwKKwkJLmZsYWdzICAgICAgICAgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCAgICAgICAgICA9IElSUV9ETUFDLAorCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGR3X2RtYV9wbGF0Zm9ybV9kYXRhIGR3X2RtYWNfZGF0YSA9IHsKKwkubnJfY2hhbm5lbHMgICAgPSA4LAorfTsKKworc3RhdGljIHU2NCBkd19kbWFjX2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZHdfZG1hY19kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImR3X2RtYWMiLAorCS5pZCAgICAgICAgICAgICA9IDAsCisJLmRldiAgICAgICAgICAgID0geworCQkuZG1hX21hc2sgPSAmZHdfZG1hY19kbWFfbWFzaywKKwkJLnBsYXRmb3JtX2RhdGEgID0gJmR3X2RtYWNfZGF0YSwKKwkJLmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorCS5yZXNvdXJjZSAgICAgICA9IGR3X2RtYWNfcmVzb3VyY2UsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShkd19kbWFjX3Jlc291cmNlKSwKK307CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBOQU5EIGRldmljZQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUTykgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQ09NQ0VSVE9fTU9EVUxFKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b19uYW5kX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gQ09NQ0VSVE9fTkFORF9GSU9fQUREUiwKKwkJLmVuZAk9IENPTUNFUlRPX05BTkRfRklPX0FERFIgKyBDT01DRVJUT19OQU5EX0lPX1NaIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fbmFuZCA9IHsKKwkubmFtZQkJPSAiY29tY2VydG9uYW5kIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCQkJLnBsYXRmb3JtX2RhdGEJPSBOVUxMLAorCX0sCisJLnJlc291cmNlCT0gY29tY2VydG9fbmFuZF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvbWNlcnRvX25hbmRfcmVzb3VyY2VzKSwKK307CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBTUEkgYnVzIGNvbnRyb2xsZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKQorCisjZGVmaW5lCUNMS19OQU1FCTEwCitzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfcGRhdGEgeworCWludCB1c2VfZG1hOworCWludCBudW1fY2hpcHNlbGVjdHM7CisJaW50IGJ1c19udW07CisJdTMyIG1heF9mcmVxOworCWNoYXIgY2xrX25hbWVbQ0xLX05BTUVdOworfTsKKworc3RydWN0IHNwaV9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgdHlwZTsKKwlpbnQgZHVtbXk7Cit9OworCitzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfZGF0YSB7CisgICAgICAgIHU4IHBvbGxfbW9kZTsgICAvKiAwIGZvciBjb250b2xsZXIgcG9sbGluZyBtb2RlICovCisgICAgICAgIHU4IHR5cGU7ICAgICAgICAvKiBTUEkvU1NQL01pY3J3aXJlICovCisgICAgICAgIHU4IGVuYWJsZV9kbWE7CisgICAgICAgIHZvaWQgKCpjc19jb250cm9sKSh1MzIgY29tbWFuZCk7Cit9OworCitzdHJ1Y3Qgc3BpX3BsYXRmb3JtX2RhdGEgc3BpX3BkYXRhID0geworCS50eXBlID0gMCwKKwkuZHVtbXkgPSAwLAorfTsKKworc3RydWN0IHNwaV9jb250cm9sbGVyX2RhdGEgc3BpX2N0cmxfZGF0YSA9ICB7CisgICAgICAgIC5wb2xsX21vZGUgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyBjb21jZXJ0b19zcGlfYm9hcmRfaW5mb1tdID0geworCXsKKwkJLyogRklYTUU6IGZvciBjaGlwc2VsZWN0LTAgKi8KKwkJLm1vZGFsaWFzID0gInMyNWZsMjU2czAiLAorCQkuY2hpcF9zZWxlY3QgPSAwLAorCQkubWF4X3NwZWVkX2h6ID0gNCoxMDAwKjEwMDAsCisJCS5idXNfbnVtID0gMCwKKwkJLmlycSA9IC0xLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaV9wZGF0YSwKKyAgICAgICAgICAgICAgICAuY29udHJvbGxlcl9kYXRhID0gJnNwaV9jdHJsX2RhdGEsCisJfSwKKwl7CisJCS8qIEZJWE1FOiBmb3IgY2hpcHNlbGVjdC0xICovCisJCS5tb2RhbGlhcyA9ICJwcm9zbGljIiwKKwkJLm1heF9zcGVlZF9oeiA9IDQqMTAwMCoxMDAwLAorCQkuY2hpcF9zZWxlY3QgPSAxLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJCS5idXNfbnVtID0gMCwKKwkJLmlycSA9IC0xLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaV9wZGF0YSwKKyAgICAgICAgICAgICAgICAuY29udHJvbGxlcl9kYXRhID0gJnNwaV9jdHJsX2RhdGEsCisJfSwKKwl7CisJCS5tb2RhbGlhcyA9ICJjb21jZXJ0b19zcGkzIiwKKwkJLmNoaXBfc2VsZWN0ID0gMiwKKwkJLm1heF9zcGVlZF9oeiA9IDQqMTAwMCoxMDAwLAorCQkuYnVzX251bSA9IDAsCisJCS5pcnEgPSAtMSwKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCQkucGxhdGZvcm1fZGF0YSA9ICZzcGlfcGRhdGEsCisgICAgICAgICAgICAgICAgLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfY3RybF9kYXRhLAorCX0sCisKKyNpZiAwIC8vTVNJRgorCisJeworCQkubW9kYWxpYXMgPSAicHJvc2xpYyIsCisJCS5tYXhfc3BlZWRfaHogPSAyKjEwMDAqMTAwMCwKKwkJLmNoaXBfc2VsZWN0ID0gMywKKwkJLm1vZGUgPSBTUElfTU9ERV8xLAorCQkuYnVzX251bSA9IDAsCisJCS5pcnEgPSAtMSwKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCQkucGxhdGZvcm1fZGF0YSA9ICZzcGlfcGRhdGEsCisgICAgICAgICAgICAgICAgLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfY3RybF9kYXRhLAorCX0sCisjZWxzZQorCXsKKwkJLm1vZGFsaWFzID0gImxlZ2VyaXR5IiwKKwkJLmNoaXBfc2VsZWN0ID0gMywKKwkJLm1heF9zcGVlZF9oeiA9IDQqMTAwMCoxMDAwLAorCQkuYnVzX251bSA9IDAsCisJCS5pcnEgPSAtMSwKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCQkucGxhdGZvcm1fZGF0YSA9ICZzcGlfcGRhdGEsCisgICAgICAgICAgICAgICAgLmNvbnRyb2xsZXJfZGF0YSA9ICZzcGlfY3RybF9kYXRhLAorCX0sCisjZW5kaWYKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpCitzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfcGRhdGEgZmFzdF9zcGlfcGRhdGEgPSB7CisJLnVzZV9kbWEgPSAwLAorCS5udW1fY2hpcHNlbGVjdHMgPSAyLAorCS5idXNfbnVtID0gMSwKKwkubWF4X2ZyZXEgPSA2MCAqIDEwMDAgKiAxMDAwLAorCS5jbGtfbmFtZSA9ICJEVVMiLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJMl9NU1BEX0hJR0hfU1BFRUQpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX2Zhc3Rfc3BpX3Jlc291cmNlW10gPSB7CisJeworCQkuc3RhcnQgID0gQ09NQ0VSVE9fQVhJX1NQSV9CQVNFLAorCQkuZW5kICAgID0gQ09NQ0VSVE9fQVhJX1NQSV9CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydCAgPSBJUlFfU1BJLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fZmFzdF9zcGkgPSB7CisJLm5hbWUgPSAiY29tY2VydG9fc3BpIiwKKwkuaWQgPSAxLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShjb21jZXJ0b19mYXN0X3NwaV9yZXNvdXJjZSksCisJLnJlc291cmNlID0gY29tY2VydG9fZmFzdF9zcGlfcmVzb3VyY2UsCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZmYXN0X3NwaV9wZGF0YSwKKwl9LAorI2VuZGlmCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpCitzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfcGRhdGEgbHNfc3BpX3BkYXRhID0geworCS51c2VfZG1hID0gMCwKKwkubnVtX2NoaXBzZWxlY3RzID0gNCwKKwkuYnVzX251bSA9IDAsCisJLm1heF9mcmVxID0gMjAgKiAxMDAwICogMTAwMCwKKwkuY2xrX25hbWUgPSAic3BpX2kyYyIsCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpIHx8IGRlZmluZWQoQ09ORklHX1NQSTJfTVNQRF9MT1dfU1BFRUQpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX3NwaV9yZXNvdXJjZVtdID0geworCXsKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX0FQQl9TUElfQkFTRSwKKwkJLmVuZCAgICA9IENPTUNFUlRPX0FQQl9TUElfQkFTRSArIFNaXzRLIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkuc3RhcnQgID0gSVJRX1NQSV9MUywKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX3NwaSA9IHsKKwkubmFtZSA9ICJjb21jZXJ0b19zcGkiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX3NwaV9yZXNvdXJjZSksCisJLnJlc291cmNlID0gY29tY2VydG9fc3BpX3Jlc291cmNlLAorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSA9ICZsc19zcGlfcGRhdGEsCisJfSwKKyNlbmRpZgorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEkyQyBidXMgY29udHJvbGxlcgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19JMkNfU1VQUE9SVCkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9faTJjX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gQ09NQ0VSVE9fQVBCX0kyQ19CQVNFLAorCQkuZW5kCT0gQ09NQ0VSVE9fQVBCX0kyQ19CQVNFICsgU1pfNEsgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0CT0gSVJRX0kyQywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX2kyYyA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiY29tY2VydG9faTJjIiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX2kyY19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGNvbWNlcnRvX2kyY19yZXNvdXJjZXMsCit9OworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqICBXYXRjaGRvZworKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIENPTkZJR19NUENPUkVfV0FUQ0hET0cKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fYTl3ZF9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IENPTUNFUlRPX1RXRF9CQVNFLAorCQkuZW5kCT0gQ09NQ0VSVE9fVFdEX0JBU0UgKyAweEZGLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAibXBjb3JlX3dkdCIsCisJCS5zdGFydAk9IElSUV9MT0NBTFdET0csCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19hOXdkID0geworCS5uYW1lCQk9ICJtcGNvcmVfd2R0IiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX2E5d2RfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBjb21jZXJ0b19hOXdkX3Jlc291cmNlcywKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DT01DRVJUT19XQVRDSERPRworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b193ZHRfcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQJPSBDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4RDAsCisJCS5lbmQJPSBDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4RDgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b193ZHQgPSB7CisgICAgICAgIC5uYW1lICAgPSAiY29tY2VydG9fd2R0IiwKKyAgICAgICAgLmlkICAgICA9IC0xLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoY29tY2VydG9fd2R0X3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gY29tY2VydG9fd2R0X3Jlc291cmNlcywKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0VMUF9TVVBQT1JUKQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBJUHNlYworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fZWxwX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUgICA9ICJlbHAiLAorCQkuc3RhcnQgID0gQ09NQ0VSVE9fQVhJX1NQQUNDX1BEVV9CQVNFLAorCQkuZW5kICAgID0gQ09NQ0VSVE9fQVhJX1NQQUNDX1BEVV9CQVNFICsgU1pfMTZNICAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUgICA9ICJpcnFfc3BhY2MiLAorCQkuc3RhcnQgID0gSVJRX1NQQUNDLAorCQkuZW5kICAgID0gSVJRX1NQQUNDLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfQorfTsKKworc3RhdGljIHU2NCBjb21jZXJ0b19lbHBfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAgY29tY2VydG9fZWxwX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgICAgICAgICA9ICJFbGxpcHRpYy1FUE4xODAyIiwKKwkuaWQgICAgICAgICAgICAgICAgICAgICA9IDAsCisJLm51bV9yZXNvdXJjZXMgICAgICAgICAgPSAyLAorCS5yZXNvdXJjZSAgICAgICAgICAgICAgID0gY29tY2VydG9fZWxwX3Jlc291cmNlcywKKwkuZGV2ID0geworCQkuZG1hX21hc2sgICAgICAgICAgICAgICA9ICZjb21jZXJ0b19lbHBfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayAgICAgID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9LAorfTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGNvbWNlcnRvX3RkbV9kYXRhIGNvbWNlcnRvX3RkbV9wZGF0YSA9IHsKKwkuZnNvdXRwdXQgPSAxLCAvKiBHZW5lcmljIFBhZCBDb250cm9sIGFuZCBWZXJzaW9uIElEIFJlZ2lzdGVyWzJdICovCisJLmZzcG9sYXJpdHkgPSAwLCAvKiAyOCBGU1lOQ19GQUxMKFJJU0UpX0VER0UgKi8KKwkuZnNod2lkdGggPSAxLCAvKiBIaWdoX1BoYXNlX1dpZHRoWzEwOjBdICovCisJLmZzbHdpZHRoID0gMHhGRiwgLyogTG93X1BoYXNlX1dpZHRoWzEwOjBdICovCisJLmNsb2NraHogPSAyMDQ4MDAwLCAvKiBJTkNfVkFMVUVbMjk6MF0gQWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVkIFRETSBjbG9jayBvdXRwdXQgXAorCQkJICAgICAgIGZyZXF1ZW5jeSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgY29uZmlndXJlZCAqLworCS5jbG9ja291dCA9IDEsIC8qIDAgLT4gc2V0IGJpdCAyMSwgY2xlYXIgYml0IDIwIGluIENPTUNFUlRPX0dQSU9fSU9DVFJMX1JFRworCQkJICAoc29mdHdhcmUgY29udHJvbCwgY2xvY2sgaW5wdXQpCisJCQkgIDEgLT4gc2V0IGJpdCAyMSBhbmQgMjAgaW4gQ09NQ0VSVE9fR1BJT19JT0NUUkxfUkVHCisJCQkgIChzb2Z0d2FyZSBjb250cm9sLCBjbG9jayBvdXRwdXQpCisJCQkgIDIgLT4gY2xlYXIgYml0IDIxIGluIENPTUNFUlRPX0dQSU9fSU9DVFJMX1JFRyAoaGFyZHdhcmUgY29udHJvbCkgKi8KKwkudGRtbXV4ID0gMHgxLCAvKiBURE0gaW50ZXJmYWNlIE11eGluZzoweDAgLSBURE0gYmxvY2ssIDB4MSAtIFpEUyBibG9jaywKKwkJMHgyIC0gR1BJT1s2Mzo2MF0gc2lnbmFscyBhbmQgMHgzIC0gTVNJRiBibG9jayBpcyBzZWxlY3RlZCAqLworI2lmIDAKKwkvKiBGSVggTUUgLSBOZWVkIGNvcnJlY3QgdmFsdWVzIGZvciBURE1fRFIsIFRETV9EWCwgVERNX0ZTIGFuZCBURE1fQ0sgKi8KKwkudGRtY2sgPSAweDNGLAorCS50ZG1mcyA9IDB4M0YsCisJLnRkbWR4ID0gMHgzRiwKKwkudGRtZHIgPSAweDNGLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b190ZG1fZGV2aWNlID0geworCS5uYW1lCT0gImNvbWNlcnRvLXRkbSIsCisJLmlkCQk9IDAsCisJLmRldi5wbGF0Zm9ybV9kYXRhID0gJmNvbWNlcnRvX3RkbV9wZGF0YSwKKwkubnVtX3Jlc291cmNlcwk9IDAsCisJLnJlc291cmNlID0gTlVMTCwKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19EU1BHX0RFQ1RfQ1NTKQorI2RlZmluZSBDU1NfSVRDTV9CQVNFCQlDT01DRVJUT19BWElfREVDVF9CQVNFCisjZGVmaW5lIENTU19JVENNX1NJWkUJCShTWl8xTSkKKworI2RlZmluZSBDU1NfRFRDTV9CQVNFCQkoQ1NTX0lUQ01fQkFTRSArIENTU19JVENNX1NJWkUpCisjZGVmaW5lIENTU19EVENNX1NJWkUJCShTWl8xTSkKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b19jc3NfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZQk9ICJpdGNtIiwKKwkJLnN0YXJ0CT0gQ1NTX0lUQ01fQkFTRSwKKwkJLmVuZAk9IENTU19JVENNX0JBU0UgKyBDU1NfSVRDTV9TSVpFIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lCT0gImR0Y20iLAorCQkuc3RhcnQJPSBDU1NfRFRDTV9CQVNFLAorCQkuZW5kCT0gQ1NTX0RUQ01fQkFTRSArIENTU19EVENNX1NJWkUgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fY3NzX2RldmljZSA9IHsKKwkubmFtZQkJPSAiY3NzIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAwLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvbWNlcnRvX2Nzc19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGNvbWNlcnRvX2Nzc19yZXNvdXJjZXMsCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fcGZlX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUJPSAiYXBiIiwKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX0FQQl9QRkVfQkFTRSwKKwkJLmVuZCAgICA9IENPTUNFUlRPX0FQQl9QRkVfQkFTRSArIENPTUNFUlRPX0FQQl9QRkVfU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiYXhpIiwKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX0FYSV9QRkVfQkFTRSwKKwkJLmVuZCAgICA9IENPTUNFUlRPX0FYSV9QRkVfQkFTRSArIENPTUNFUlRPX0FYSV9QRkVfU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiZGRyIiwKKwkJLnN0YXJ0ICA9IENPTUNFUlRPX1BGRV9ERFJfQkFTRSwKKwkJLmVuZAk9IENPTUNFUlRPX1BGRV9ERFJfQkFTRSArIENPTUNFUlRPX1BGRV9ERFJfU0laRSAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLm5hbWUJPSAiaXJhbSIsCisJCS5zdGFydCAgPSBDT01DRVJUT19QRkVfSVJBTV9CQVNFLAorCQkuZW5kCT0gQ09NQ0VSVE9fUEZFX0lSQU1fQkFTRSArIENPTUNFUlRPX1BGRV9JUkFNX1NJWkUgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC5uYW1lICAgPSAiaXBzZWMiLAorICAgICAgICAgICAgICAgIC5zdGFydCAgPSBDT01DRVJUT19BWElfSVBTRUNfQkFTRSwKKyAgICAgICAgICAgICAgICAuZW5kICAgID0gQ09NQ0VSVE9fQVhJX0lQU0VDX0JBU0UgKyBDT01DRVJUT19BWElfSVBTRUNfU0laRSAtIDEsCisgICAgICAgICAgICAgICAgLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorICAgICAgICB9LAorCisJeworCQkubmFtZQk9ICJoaWYiLAorCQkuc3RhcnQgID0gSVJRX1BGRV9ISUYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjb21jZXJ0b19wZmVfcGxhdGZvcm1fZGF0YSBjb21jZXJ0b19wZmVfcGRhdGEgPSB7CisJLmNvbWNlcnRvX2V0aF9wZGF0YVswXSA9IHsKKwkJLm5hbWUgPSBHRU0wX0lURl9OQU1FLAorCQkuZGV2aWNlX2ZsYWdzID0gQ09ORklHX0NPTUNFUlRPX0dFTUFDLAorCQkubWlpX2NvbmZpZyA9IENPTkZJR19DT01DRVJUT19VU0VfUkdNSUksCisJCS5nZW1hY19tb2RlID0gR0VNQUNfU1dfQ09ORiB8IEdFTUFDX1NXX0ZVTExfRFVQTEVYIHwgR0VNQUNfU1dfU1BFRURfMUcsCisJCS5waHlfZmxhZ3MgPSBHRU1BQ19QSFlfUkdNSUlfQUREX0RFTEFZLAorCQkuYnVzX2lkID0gMCwKKwkJLnBoeV9pZCA9IDQsCisJCS5nZW1faWQgPSAwLAorCQkubWFjX2FkZHIgPSAodThbXSlHRU0wX01BQywKKwl9LAorCisJLmNvbWNlcnRvX2V0aF9wZGF0YVsxXSA9IHsKKwkJLm5hbWUgPSBHRU0xX0lURl9OQU1FLAorCQkuZGV2aWNlX2ZsYWdzID0gQ09ORklHX0NPTUNFUlRPX0dFTUFDLAorCQkubWlpX2NvbmZpZyA9IENPTkZJR19DT01DRVJUT19VU0VfUkdNSUksCisJCS5nZW1hY19tb2RlID0gR0VNQUNfU1dfQ09ORiB8IEdFTUFDX1NXX0ZVTExfRFVQTEVYIHwgR0VNQUNfU1dfU1BFRURfMUcsCisJCS5waHlfZmxhZ3MgPSBHRU1BQ19OT19QSFksCisJCS5nZW1faWQgPSAxLAorCQkubWFjX2FkZHIgPSAodThbXSlHRU0xX01BQywKKwl9LAorCisJLmNvbWNlcnRvX2V0aF9wZGF0YVsyXSA9IHsKKwkJLm5hbWUgPSBHRU0yX0lURl9OQU1FLAorCQkuZGV2aWNlX2ZsYWdzID0gQ09ORklHX0NPTUNFUlRPX0dFTUFDLAorCQkubWlpX2NvbmZpZyA9IENPTkZJR19DT01DRVJUT19VU0VfUkdNSUksCisJCS5nZW1hY19tb2RlID0gR0VNQUNfU1dfQ09ORiB8IEdFTUFDX1NXX0ZVTExfRFVQTEVYIHwgR0VNQUNfU1dfU1BFRURfMUcsCisJCS5waHlfZmxhZ3MgPSBHRU1BQ19OT19QSFksCisJCS5nZW1faWQgPSAyLAorCQkubWFjX2FkZHIgPSAodThbXSlHRU0yX01BQywKKwl9LAorCisJLyoqCisJICogVGhlcmUgaXMgYSBzaW5nbGUgbWRpbyBidXMgY29taW5nIG91dCBvZiBDMksuICBBbmQgdGhhdCdzIHRoZSBvbmUKKwkgKiBjb25uZWN0ZWQgdG8gR0VNMC4gQWxsIFBIWSdzLCBzd2l0Y2hzIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBzYW1lCisJICogYnVzIHVzaW5nIGRpZmZlcmVudCBhZGRyZXNzZXMuIFR5cGljYWxseSAuYnVzX2lkIGlzIGFsd2F5cyAwLCBvbmx5CisJICogLnBoeV9pZCB3aWxsIGNoYW5nZSBpbiB0aGUgZGlmZmVyZW50IGNvbWNlcnRvX2V0aF9wZGF0YVtdIHN0cnVjdHVyZXMgYWJvdmUuCisJICovCisJLmNvbWNlcnRvX21kaW9fcGRhdGFbMF0gPSB7CisJCS5lbmFibGVkID0gMSwKKwkJLnBoeV9tYXNrID0gMHhGRkZGRkZFRiwKKwkJLm1kY19kaXYgPSA5NiwKKwkJLmlycSA9IHsKKwkJCVs0XSA9IFBIWV9QT0xMLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgdTY0IGNvbWNlcnRvX3BmZV9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX3BmZV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInBmZSIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZjb21jZXJ0b19wZmVfcGRhdGEsCisJCS5kbWFfbWFzawkJPSAmY29tY2VydG9fcGZlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvbWNlcnRvX3BmZV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGNvbWNlcnRvX3BmZV9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY29tY2VydG9fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisjaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQ09NQ0VSVE8pIHx8IGRlZmluZWQoQ09ORklHX01URF9OQU5EX0NPTUNFUlRPX01PRFVMRSkKKwkJJmNvbWNlcnRvX25hbmQsCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfQ09NQ0VSVE9fTk9SKQorCQkmY29tY2VydG9fbm9yLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSTJDX1NVUFBPUlQpCisJCSZjb21jZXJ0b19pMmMsCisjZW5kaWYKKworI2lmIGRlZmluZWQgKENPTkZJR19NUENPUkVfV0FUQ0hET0cpCisJCSZjb21jZXJ0b19hOXdkLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19XQVRDSERPRykKKwkJJmNvbWNlcnRvX3dkdCwKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJMl9NU1BEX0hJR0hfU1BFRUQpCisJCSZjb21jZXJ0b19mYXN0X3NwaSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJMl9NU1BEX0xPV19TUEVFRCkKKwkJJmNvbWNlcnRvX3NwaSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0RXX0RNQV9TVVBQT1JUKQorCQkmZHdfZG1hY19kZXZpY2UsCisjZW5kaWYKKwkJJmNvbWNlcnRvX3RkbV9kZXZpY2UsCisJCSZjb21jZXJ0b19wZmVfZGV2aWNlLAorCQkmcnRjX2RldiwKKyNpZiBkZWZpbmVkKENPTkZJR19EU1BHX0RFQ1RfQ1NTKQorCQkmY29tY2VydG9fY3NzX2RldmljZSwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0VMUF9TVVBQT1JUKQorCSZjb21jZXJ0b19lbHBfZGV2aWNlLAorI2VuZGlmCit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBFeHBhbnNpb24gYnVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBieSBjb21jZXJ0by0yMDAwLmMgdG8gaW5pdGlhbGl6ZSB0aGUgZXhwYW5zaW9uIGJ1cyAqLworaW50IGNvbWNlcnRvX2V4cF92YWx1ZXNbNV1bN109IHsKKwkvKiBFTkFCTEUsIEJBU0UsIFNFR19TWiwgQ0ZHLCBUTUcxLCBUTUcyLCBUTUczICovCisJezEsIChFWFBfQlVTX1JFR19CQVNFX0NTMCA+PiAxMiksICgoRVhQX0JVU19SRUdfQkFTRV9DUzAgKyBFWFBfQ1MwX1NFR19TSVpFIC0gMSkgPj4gMTIpLCBFWFBfTUVNX0JVU19TSVpFXzE2LCAweDAzMDM0MDA3LCAweDA0MDQwNTAyLCAweDAwMDAwMDAyfSwJCS8qVE9ETyBWYWx1ZXMgdG8gY2hlY2sqLworCXswLCAoRVhQX0JVU19SRUdfQkFTRV9DUzEgPj4gMTIpLCAoKEVYUF9CVVNfUkVHX0JBU0VfQ1MxICsgRVhQX0NTMV9TRUdfU0laRSAtIDEpID4+IDEyKSwgRVhQX1JEWV9FTnxFWFBfTUVNX0JVU19TSVpFXzMyLCAweDFBMUE0MDFGLCAweDA2MDYwQTA0LCAweDAwMDAwMDAyfSwJLypUT0RPIFZhbHVlcyB0byBjaGVjayovCisJezAsIChFWFBfQlVTX1JFR19CQVNFX0NTMiA+PiAxMiksICgoRVhQX0JVU19SRUdfQkFTRV9DUzIgKyBFWFBfQ1MyX1NFR19TSVpFIC0gMSkgPj4gMTIpLCBFWFBfU1RSQl9NT0RFfEVYUF9BTEVfTU9ERXxFWFBfTUVNX0JVU19TSVpFXzgsIDB4MUExMDIwMUEsIDB4MDMwODA0MDMsIDB4MDAwMDAwMn0sCS8qVE9ETyBWYWx1ZXMgdG8gY2hlY2sqLworCXswLCAoRVhQX0JVU19SRUdfQkFTRV9DUzMgPj4gMTIpLCAoKEVYUF9CVVNfUkVHX0JBU0VfQ1MzICsgRVhQX0NTM19TRUdfU0laRSAtIDEpID4+IDEyKSwgRVhQX1NUUkJfTU9ERXxFWFBfQUxFX01PREV8RVhQX01FTV9CVVNfU0laRV84LCAweDFBMTAyMDFBLCAweDAzMDgwNDAzLCAweDAwMDAwMDJ9LAkvKkJUODM3MCovCisJezEsIChFWFBfQlVTX1JFR19CQVNFX0NTNCA+PiAxMiksICgoRVhQX0JVU19SRUdfQkFTRV9DUzQgKyBFWFBfQ1M0X1NFR19TSVpFIC0gMSkgPj4gMTIpLCBFWFBfTkFORF9NT0RFfEVYUF9NRU1fQlVTX1NJWkVfOCwgMHgwMDAwMDAwMSwgMHgwMTAxMDAwMSwgMHgwMDAwMDAwMn0sCS8qIE5BTkQ6IFRPRE8gVmFsdWVzIHRvIGNoZWNrICovCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgTWFjaGluZSBkZWZpbml0aW9uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwbGF0Zm9ybV9tYXBfaW8odm9pZCkKK3sKKwlkZXZpY2VfbWFwX2lvKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbGF0Zm9ybV9pcnFfaW5pdCh2b2lkKQoreworCWRldmljZV9pcnFfaW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGxhdGZvcm1faW5pdCh2b2lkKQoreworCWRldmljZV9pbml0KCk7CisJYm9hcmRfZ3Bpb19pbml0KCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpCisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oY29tY2VydG9fc3BpX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoY29tY2VydG9fc3BpX2JvYXJkX2luZm8pKTsKKyNlbmRpZgorCW1hY19hZGRyX2luaXQoJmNvbWNlcnRvX3BmZV9wZGF0YSk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhjb21jZXJ0b19kZXZpY2VzLCBBUlJBWV9TSVpFKGNvbWNlcnRvX2RldmljZXMpKTsKK30KKworTUFDSElORV9TVEFSVChDT01DRVJUTywgIkNvbWNlcnRvIDIwMDAgTUZDTiBFVk0iKQorCS8qIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMgSW5jLiAqLworCS5hdGFnX29mZnNldCAgICA9IENPTUNFUlRPX0FYSV9ERFJfQkFTRSArIDB4MTAwLAorCS5yZXNlcnZlCT0gcGxhdGZvcm1fcmVzZXJ2ZSwKKwkubWFwX2lvCQk9IHBsYXRmb3JtX21hcF9pbywKKwkuaW5pdF9pcnEJPSBwbGF0Zm9ybV9pcnFfaW5pdCwKKwkuaW5pdF9tYWNoaW5lCT0gcGxhdGZvcm1faW5pdCwKKwkudGltZXIJCT0gJmNvbWNlcnRvX3RpbWVyLAorI2lmZGVmIENPTkZJR19aT05FX0RNQQorCS5kbWFfem9uZV9zaXplCT0gU1pfMzJNICsgMypTWl80TSwKKyNlbmRpZgorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vYm9hcmQtYzJrcnRzbS5jIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9ib2FyZC1jMmtydHNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhZDQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vYm9hcmQtYzJrcnRzbS5jCkBAIC0wLDAgKzEsNTE2IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9ib2FyZC1jMmtydHNtLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUTykgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQ09NQ0VSVE9fTU9EVUxFKQorI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKQorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2ZsYXNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CisjaW5jbHVkZSA8bGludXgvZHdfZG1hYy5oPgorCisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxhc20vc21wX3R3ZC5oPgorI2luY2x1ZGUgPGFzbS9sb2NhbHRpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KKworCisKK2V4dGVybiB2b2lkIHBsYXRmb3JtX3Jlc2VydmUodm9pZCk7CitleHRlcm4gdm9pZCBkZXZpY2VfbWFwX2lvICh2b2lkKTsKK2V4dGVybiB2b2lkIGRldmljZV9pcnFfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGRldmljZV9pbml0KHZvaWQpOworZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgY29tY2VydG9fdGltZXI7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBib2FyZF9ncGlvX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fUEZFX1VBUlRfU1VQUE9SVAorCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRykgJiB+UEZFX1VBUlRfR1BJTykgfCBQRkVfVUFSVF9CVVMsIENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpIHx8IGRlZmluZWQoQ09ORklHX1NQSTJfTVNQRF9MT1dfU1BFRUQpCisJLyogZW5hYmxlIFNQSSBwaW5zICovCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+KFNQSV9NVVhfR1BJT18xKSkgfCAoU1BJX01VWF9CVVNfMSksIENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcxKTsKKwl3cml0ZWwoKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCkgJiB+KFNQSV9NVVhfR1BJT18yKSkgfCAoU1BJX01VWF9CVVNfMiksIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpCisJLyogZW5hYmxlIFNQSSBwaW5zICovCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+KFNQSV8yX01VWF9HUElPXzEpKSB8IChTUElfMl9NVVhfQlVTXzEpLCBDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSk7CisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QpICYgfihTUElfMl9NVVhfR1BJT18yKSkgfCAoU1BJXzJfTVVYX0JVU18yKSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSTJDX1NVUFBPUlQpCisJd3JpdGVsKChyZWFkbChDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMSkgJiB+STJDX0dQSU8pIHwgSTJDX0JVUywgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9DT01DRVJUTykgfHwgZGVmaW5lZChDT05GSUdfTVREX05BTkRfQ09NQ0VSVE9fTU9EVUxFKQorCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpICYgfk5BTkRfR1BJTykgfCBOQU5EX0JVUywgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19NVERfQ09NQ0VSVE9fTk9SKQorCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRzEpICYgfk5PUl9HUElPKSB8IE5PUl9CVVMsIENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcxKTsKKyNlbmRpZgorfQorCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBOT1IgZGV2aWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX01URF9DT01DRVJUT19OT1IpCisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fbm9yX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gTk9SRkxBU0hfTUVNT1JZX1BIWTEsCisJCS5lbmQJPSBOT1JGTEFTSF9NRU1PUllfUEhZMSArIFNaXzY0TSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgY29tY2VydG9fbm9yX2RhdGEgPSB7CisJLm1hcF9uYW1lCT0gImNmaV9wcm9iZSIsCisJLndpZHRoCT0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX25vciA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiY29tY2VydG9mbGFzaCIsCisJLmlkICAgICAgICAgICAgID0gMCwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX25vcl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGNvbWNlcnRvX25vcl9yZXNvdXJjZXMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY29tY2VydG9fbm9yX2RhdGEsCisJfSwKK307CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBETUFDIGNvbnRyb2xsZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRFdfRE1BX1NVUFBPUlQpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGR3X2RtYWNfcmVzb3VyY2VbXSA9IHsKKwl7CisJCS5zdGFydCAgICAgICAgICA9IERXX0RNQV9ETUFDX0JBU0VBRERSLAorCQkuZW5kICAgICAgICAgICAgPSBEV19ETUFfRE1BQ19CQVNFQUREUiArIDB4MkMwLAorCQkuZmxhZ3MgICAgICAgICAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ICAgICAgICAgID0gSVJRX0RNQUMsCisJCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfSVJRLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZHdfZG1hX3BsYXRmb3JtX2RhdGEgZHdfZG1hY19kYXRhID0geworCS5ucl9jaGFubmVscyAgICA9IDgsCit9OworCitzdGF0aWMgdTY0IGR3X2RtYWNfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkd19kbWFjX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiZHdfZG1hYyIsCisJLmlkICAgICAgICAgICAgID0gMCwKKwkuZGV2ICAgICAgICAgICAgPSB7CisJCS5kbWFfbWFzayA9ICZkd19kbWFjX2RtYV9tYXNrLAorCQkucGxhdGZvcm1fZGF0YSAgPSAmZHdfZG1hY19kYXRhLAorCQkuY29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLnJlc291cmNlICAgICAgID0gZHdfZG1hY19yZXNvdXJjZSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGR3X2RtYWNfcmVzb3VyY2UpLAorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFNQSSBidXMgY29udHJvbGxlciBbRklYTUVdCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkgfHwgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkKK3N0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSB7CisJaW50IHVzZV9kbWE7CisJaW50IG51bV9jaGlwc2VsZWN0czsKKwlpbnQgYnVzX251bTsKKwl1MzIgbWF4X2ZyZXE7Cit9OworCitzdHJ1Y3Qgc3BpX3BsYXRmb3JtX2RhdGEgeworCWludCB0eXBlOworCWludCBkdW1teTsKK307CisKK3N0cnVjdCBzcGlfcGxhdGZvcm1fZGF0YSBzcGlfcGRhdGEgPSB7CisJLnR5cGUgPSAwLAorCS5kdW1teSA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIGNvbWNlcnRvX3NwaV9ib2FyZF9pbmZvW10gPSB7CisJeworCQkvKiBGSVhNRTogZm9yIGNoaXBzZWxlY3QtMCAqLworCQkubW9kYWxpYXMgPSAiY29tY2VydG9fc3BpMSIsCisJCS5jaGlwX3NlbGVjdCA9IDAsCisJCS5tYXhfc3BlZWRfaHogPSA0KjEwMDAqMTAwMCwKKwkJLmJ1c19udW0gPSAwLAorCQkuaXJxID0gLTEsCisJCS5tb2RlID0gU1BJX01PREVfMywKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc3BpX3BkYXRhLAorCX0sCisKKwl7CisJCS8qIEZJWE1FOiBmb3IgY2hpcHNlbGVjdC0xICovCisJCS5tb2RhbGlhcyA9ICJjb21jZXJ0b19zcGkyIiwKKwkJLmNoaXBfc2VsZWN0ID0gMSwKKwkJLm1heF9zcGVlZF9oeiA9IDQqMTAwMCoxMDAwLAorCQkuYnVzX251bSA9IDAsCisJCS5pcnEgPSAtMSwKKwkJLm1vZGUgPSBTUElfTU9ERV8zLAorCQkucGxhdGZvcm1fZGF0YSA9ICZzcGlfcGRhdGEsCisJfSwKKworCXsKKwkJLm1vZGFsaWFzID0gImNvbWNlcnRvX3NwaTMiLAorCQkuY2hpcF9zZWxlY3QgPSAyLAorCQkubWF4X3NwZWVkX2h6ID0gNCoxMDAwKjEwMDAsCisJCS5idXNfbnVtID0gMCwKKwkJLmlycSA9IC0xLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaV9wZGF0YSwKKwl9LAorCisJeworCQkubW9kYWxpYXMgPSAibGVnZXJpdHkiLAorCQkuY2hpcF9zZWxlY3QgPSAzLAorCQkubWF4X3NwZWVkX2h6ID0gNCoxMDAwKjEwMDAsCisJCS5idXNfbnVtID0gMCwKKwkJLmlycSA9IC0xLAorCQkubW9kZSA9IFNQSV9NT0RFXzMsCisJCS5wbGF0Zm9ybV9kYXRhID0gJnNwaV9wZGF0YSwKKwl9LAorCit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKQorc3RydWN0IHNwaV9jb250cm9sbGVyX3BkYXRhIGZhc3Rfc3BpX3BkYXRhID0geworCS51c2VfZG1hID0gMSwKKwkubnVtX2NoaXBzZWxlY3RzID0gMiwKKwkuYnVzX251bSA9IDEsCisJLm1heF9mcmVxID0gNjAgKiAxMDAwICogMTAwMCwKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUEkyX01TUERfSElHSF9TUEVFRCkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29tY2VydG9fZmFzdF9zcGlfcmVzb3VyY2VbXSA9IHsKKwl7CisJCS5zdGFydCAgPSBDT01DRVJUT19BWElfU1BJX0JBU0UsCisJCS5lbmQgICAgPSBDT01DRVJUT19BWElfU1BJX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ICA9IElSUV9TUEksCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19mYXN0X3NwaSA9IHsKKwkubmFtZSA9ICJjb21jZXJ0b19zcGkiLAorCS5pZCA9IDEsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX2Zhc3Rfc3BpX3Jlc291cmNlKSwKKwkucmVzb3VyY2UgPSBjb21jZXJ0b19mYXN0X3NwaV9yZXNvdXJjZSwKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKQorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhID0gJmZhc3Rfc3BpX3BkYXRhLAorCX0sCisjZW5kaWYKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCkKK3N0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSBsc19zcGlfcGRhdGEgPSB7CisJLnVzZV9kbWEgPSAwLAorCS5udW1fY2hpcHNlbGVjdHMgPSA0LAorCS5idXNfbnVtID0gMCwKKwkubWF4X2ZyZXEgPSAyMCAqIDEwMDAgKiAxMDAwLAorfTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUEkyX01TUERfTE9XX1NQRUVEKQorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b19zcGlfcmVzb3VyY2VbXSA9IHsKKwl7CisJCS5zdGFydCAgPSBDT01DRVJUT19BUEJfU1BJX0JBU0UsCisJCS5lbmQgICAgPSBDT01DRVJUT19BUEJfU1BJX0JBU0UgKyBTWl80SyAtIDEsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCXsKKwkJLnN0YXJ0ICA9IElSUV9TUElfTFMsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19zcGkgPSB7CisJLm5hbWUgPSAiY29tY2VydG9fc3BpIiwKKwkuaWQgPSAwLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShjb21jZXJ0b19zcGlfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGNvbWNlcnRvX3NwaV9yZXNvdXJjZSwKKyNpZiBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9MT1dfU1BFRUQpCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmbHNfc3BpX3BkYXRhLAorCX0sCisjZW5kaWYKK307CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBJMkMgYnVzIGNvbnRyb2xsZXIKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSTJDX1NVUFBPUlQpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX2kyY19yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IENPTUNFUlRPX0FQQl9JMkNfQkFTRSwKKwkJLmVuZAk9IENPTUNFUlRPX0FQQl9JMkNfQkFTRSArIFNaXzRLIC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5zdGFydAk9IElSUV9JMkMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19pMmMgPSB7CisJLm5hbWUgICAgICAgICAgID0gImNvbWNlcnRvX2kyYyIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShjb21jZXJ0b19pMmNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgICAgICAgPSBjb21jZXJ0b19pMmNfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCisKK3N0YXRpYyBzdHJ1Y3QgY29tY2VydG9fdGRtX2RhdGEgY29tY2VydG9fdGRtX3BkYXRhID0geworCS5mc291dHB1dCA9IDEsIC8qIEdlbmVyaWMgUGFkIENvbnRyb2wgYW5kIFZlcnNpb24gSUQgUmVnaXN0ZXJbMl0gKi8KKwkuZnNwb2xhcml0eSA9IDAsIC8qIDI4IEZTWU5DX0ZBTEwoUklTRSlfRURHRSAqLworCS5mc2h3aWR0aCA9IDEsIC8qIEhpZ2hfUGhhc2VfV2lkdGhbMTA6MF0gKi8KKwkuZnNsd2lkdGggPSAweEZGLCAvKiBMb3dfUGhhc2VfV2lkdGhbMTA6MF0gKi8KKwkuY2xvY2toeiA9IDIwNDgwMDAsIC8qIElOQ19WQUxVRVsyOTowXSBBY2NvcmRpbmcgdG8gdGhlIGRlc2lyZWQgVERNIGNsb2NrIG91dHB1dCBmcmVxdWVuY3ksIHRoaXMgZmllbGQgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgKi8KKwkuY2xvY2tvdXQgPSAxLCAvKiAwIC0+IHNldCBiaXQgMjEsIGNsZWFyIGJpdCAyMCBpbiBDT01DRVJUT19HUElPX0lPQ1RSTF9SRUcKKwkJCSAgKHNvZnR3YXJlIGNvbnRyb2wsIGNsb2NrIGlucHV0KQorCQkJICAxIC0+IHNldCBiaXQgMjEgYW5kIDIwIGluIENPTUNFUlRPX0dQSU9fSU9DVFJMX1JFRworCQkJICAoc29mdHdhcmUgY29udHJvbCwgY2xvY2sgb3V0cHV0KQorCQkJICAyIC0+IGNsZWFyIGJpdCAyMSBpbiBDT01DRVJUT19HUElPX0lPQ1RSTF9SRUcgKGhhcmR3YXJlIGNvbnRyb2wpICovCisJLnRkbW11eCA9IDB4MSwgLyogVERNIGludGVyZmFjZSBNdXhpbmc6MHgwIC0gVERNIGJsb2NrLCAweDEgLSBaRFMgYmxvY2ssDQorCQkweDIgLSBHUElPWzYzOjYwXSBzaWduYWxzIGFuZCAweDMgLSBNU0lGIGJsb2NrIGlzIHNlbGVjdGVkICovCisjaWYgMAorLyogRklYIE1FIC0gTmVlZCBjb3JyZWN0IHZhbHVlcyBmb3IgVERNX0RSLCBURE1fRFgsIFRETV9GUyBhbmQgVERNX0NLICovCisJLnRkbWNrID0gMHgzRiwKKwkudGRtZnMgPSAweDNGLAorCS50ZG1keCA9IDB4M0YsCisJLnRkbWRyID0gMHgzRiwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fdGRtX2RldmljZSA9IHsKKwkubmFtZQk9ICJjb21jZXJ0by10ZG0iLAorCS5pZAkJPSAwLAorCS5kZXYucGxhdGZvcm1fZGF0YSA9ICZjb21jZXJ0b190ZG1fcGRhdGEsCisJLm51bV9yZXNvdXJjZXMJPSAwLAorCS5yZXNvdXJjZSA9IE5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX3BmZV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5uYW1lCT0gImFwYiIsCisJCS5zdGFydCAgPSBDT01DRVJUT19BUEJfUEZFX0JBU0UsCisJCS5lbmQgICAgPSBDT01DRVJUT19BUEJfUEZFX0JBU0UgKyBDT01DRVJUT19BUEJfUEZFX1NJWkUgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lCT0gImF4aSIsCisJCS5zdGFydCAgPSBDT01DRVJUT19BWElfUEZFX0JBU0UsCisJCS5lbmQgICAgPSBDT01DRVJUT19BWElfUEZFX0JBU0UgKyBDT01DRVJUT19BWElfUEZFX1NJWkUgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lCT0gImRkciIsCisJCS5zdGFydCAgPSBDT01DRVJUT19QRkVfRERSX0JBU0UsCisJCS5lbmQJPSBDT01DRVJUT19QRkVfRERSX0JBU0UgKyBDT01DRVJUT19QRkVfRERSX1NJWkUgLSAxLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lCT0gImlyYW0iLAorCQkuc3RhcnQgID0gQ09NQ0VSVE9fUEZFX0lSQU1fQkFTRSwKKwkJLmVuZAk9IENPTUNFUlRPX1BGRV9JUkFNX0JBU0UgKyBDT01DRVJUT19QRkVfSVJBTV9TSVpFIC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJeworCQkubmFtZQk9ICJoaWYiLAorCQkuc3RhcnQgID0gSVJRX1BGRV9ISUYsCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBjb21jZXJ0b19wZmVfcGxhdGZvcm1fZGF0YSBjb21jZXJ0b19wZmVfcGRhdGEgPSB7CisJLmNvbWNlcnRvX2V0aF9wZGF0YVswXSA9IHsKKwkJLm5hbWUgPSBHRU0wX0lURl9OQU1FLAorCQkuZGV2aWNlX2ZsYWdzID0gQ09ORklHX0NPTUNFUlRPX0dFTUFDLAorCQkubWlpX2NvbmZpZyA9IENPTkZJR19DT01DRVJUT19VU0VfUkdNSUksCisJCS5nZW1hY19tb2RlID0gR0VNQUNfU1dfQ09ORiB8IEdFTUFDX1NXX0ZVTExfRFVQTEVYIHwgR0VNQUNfU1dfU1BFRURfMUcsCisJCS5waHlfZmxhZ3MgPSBHRU1BQ19QSFlfUkdNSUlfQUREX0RFTEFZLAorCQkuYnVzX2lkID0gMCwKKwkJLnBoeV9pZCA9IDAsCisJCS5nZW1faWQgPSAwLAorCQkubWFjX2FkZHIgPSAodThbXSlHRU0wX01BQywKKwl9LAorCisJLmNvbWNlcnRvX2V0aF9wZGF0YVsxXSA9IHsKKwkJLm5hbWUgPSBHRU0xX0lURl9OQU1FLAorCQkuZGV2aWNlX2ZsYWdzID0gQ09ORklHX0NPTUNFUlRPX0dFTUFDLAorCQkubWlpX2NvbmZpZyA9IENPTkZJR19DT01DRVJUT19VU0VfUkdNSUksCisJCS5nZW1hY19tb2RlID0gR0VNQUNfU1dfQ09ORiB8IEdFTUFDX1NXX0ZVTExfRFVQTEVYIHwgR0VNQUNfU1dfU1BFRURfMUcsCisJCS5waHlfZmxhZ3MgPSBHRU1BQ19OT19QSFksCisJCS5nZW1faWQgPSAxLAorCQkubWFjX2FkZHIgPSAodThbXSlHRU0xX01BQywKKwl9LAorCisJLmNvbWNlcnRvX2V0aF9wZGF0YVsyXSA9IHsKKwkJLm5hbWUgPSBHRU0yX0lURl9OQU1FLAorCQkuZGV2aWNlX2ZsYWdzID0gQ09ORklHX0NPTUNFUlRPX0dFTUFDLAorCQkubWlpX2NvbmZpZyA9IENPTkZJR19DT01DRVJUT19VU0VfUkdNSUksCisJCS5nZW1hY19tb2RlID0gR0VNQUNfU1dfQ09ORiB8IEdFTUFDX1NXX0ZVTExfRFVQTEVYIHwgR0VNQUNfU1dfU1BFRURfMUcsCisJCS5waHlfZmxhZ3MgPSBHRU1BQ19OT19QSFksCisJCS5nZW1faWQgPSAyLAorCQkubWFjX2FkZHIgPSAodThbXSlHRU0yX01BQywKKwl9LAorCisJLyoqCisJICogVGhlcmUgaXMgYSBzaW5nbGUgbWRpbyBidXMgY29taW5nIG91dCBvZiBDMksuICBBbmQgdGhhdCdzIHRoZSBvbmUKKwkgKiBjb25uZWN0ZWQgdG8gR0VNMC4gQWxsIFBIWSdzLCBzd2l0Y2hzIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBzYW1lCisJICogYnVzIHVzaW5nIGRpZmZlcmVudCBhZGRyZXNzZXMuIFR5cGljYWxseSAuYnVzX2lkIGlzIGFsd2F5cyAwLCBvbmx5CisJICogLnBoeV9pZCB3aWxsIGNoYW5nZSBpbiB0aGUgZGlmZmVyZW50IGNvbWNlcnRvX2V0aF9wZGF0YVtdIHN0cnVjdHVyZXMgYWJvdmUuCisJICovCisJLmNvbWNlcnRvX21kaW9fcGRhdGFbMF0gPSB7CisJCS5lbmFibGVkID0gMSwKKwkJLnBoeV9tYXNrID0gMHhGRkZGRkZGRSwKKwkJLm1kY19kaXYgPSA5NiwKKwkJLmlycSA9IHsKKwkJCVswXSA9IFBIWV9QT0xMLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgdTY0IGNvbWNlcnRvX3BmZV9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX3BmZV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInBmZSIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCQk9ICZjb21jZXJ0b19wZmVfcGRhdGEsCisJCS5kbWFfbWFzawkJPSAmY29tY2VydG9fcGZlX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sJPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNvbWNlcnRvX3BmZV9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGNvbWNlcnRvX3BmZV9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY29tY2VydG9fZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisjaWYgZGVmaW5lZChDT05GSUdfTVREX0NPTUNFUlRPX05PUikKKwkJJmNvbWNlcnRvX25vciwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0kyQ19TVVBQT1JUKQorCQkmY29tY2VydG9faTJjLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkKKwkJJmNvbWNlcnRvX2Zhc3Rfc3BpLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUEkyX01TUERfTE9XX1NQRUVEKQorCQkmY29tY2VydG9fc3BpLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRFdfRE1BX1NVUFBPUlQpCisJCSZkd19kbWFjX2RldmljZSwKKyNlbmRpZgorCQkmY29tY2VydG9fdGRtX2RldmljZSwKKwkJJmNvbWNlcnRvX3BmZV9kZXZpY2UsCisJfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgRXhwYW5zaW9uIGJ1cworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgY29tY2VydG8tMTAwMC5jIHRvIGluaXRpYWxpemUgdGhlIGV4cGFuc2lvbiBidXMgKi8KK2ludCBjb21jZXJ0b19leHBfdmFsdWVzWzVdWzddPSB7CisJLyogRU5BQkxFLCBCQVNFLCBTRUdfU1osIENGRywgVE1HMSwgVE1HMiwgVE1HMyAqLworCXsxLCAoRVhQX0JVU19SRUdfQkFTRV9DUzAgPj4gMTIpLCAoKEVYUF9CVVNfUkVHX0JBU0VfQ1MwICsgRVhQX0NTMF9TRUdfU0laRSAtIDEpID4+IDEyKSwgRVhQX01FTV9CVVNfU0laRV8xNiwgMHgxQTFBNDAxRiwgMHgwNjA2MEEwNCwgMHgwMDAwMDAwMn0sCQkvKlRPRE8gVmFsdWVzIHRvIGNoZWNrKi8KKwl7MCwgKEVYUF9CVVNfUkVHX0JBU0VfQ1MxID4+IDEyKSwgKChFWFBfQlVTX1JFR19CQVNFX0NTMSArIEVYUF9DUzFfU0VHX1NJWkUgLSAxKSA+PiAxMiksIEVYUF9SRFlfRU58RVhQX01FTV9CVVNfU0laRV8zMiwgMHgxQTFBNDAxRiwgMHgwNjA2MEEwNCwgMHgwMDAwMDAwMn0sCS8qVE9ETyBWYWx1ZXMgdG8gY2hlY2sqLworCXswLCAoRVhQX0JVU19SRUdfQkFTRV9DUzIgPj4gMTIpLCAoKEVYUF9CVVNfUkVHX0JBU0VfQ1MyICsgRVhQX0NTMl9TRUdfU0laRSAtIDEpID4+IDEyKSwgRVhQX1NUUkJfTU9ERXxFWFBfQUxFX01PREV8RVhQX01FTV9CVVNfU0laRV84LCAweDFBMTAyMDFBLCAweDAzMDgwNDAzLCAweDAwMDAwMDJ9LAkvKlRPRE8gVmFsdWVzIHRvIGNoZWNrKi8KKwl7MCwgKEVYUF9CVVNfUkVHX0JBU0VfQ1MzID4+IDEyKSwgKChFWFBfQlVTX1JFR19CQVNFX0NTMyArIEVYUF9DUzNfU0VHX1NJWkUgLSAxKSA+PiAxMiksIEVYUF9TVFJCX01PREV8RVhQX0FMRV9NT0RFfEVYUF9NRU1fQlVTX1NJWkVfOCwgMHgxQTEwMjAxQSwgMHgwMzA4MDQwMywgMHgwMDAwMDAyfSwJLypCVDgzNzAqLworCXswLCAoRVhQX0JVU19SRUdfQkFTRV9DUzQgPj4gMTIpLCAoKEVYUF9CVVNfUkVHX0JBU0VfQ1M0ICsgRVhQX0NTNF9TRUdfU0laRSAtIDEpID4+IDEyKSwgRVhQX05BTkRfTU9ERXxFWFBfTUVNX0JVU19TSVpFXzgsIDB4MUExQTQwMUYsIDB4MDYwNjBBMDQsIDB4MDAwMDAwMDJ9LAkvKiBOQU5EOiBUT0RPIFZhbHVlcyB0byBjaGVjayAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE1hY2hpbmUgZGVmaW5pdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBfX2luaXQgcGxhdGZvcm1fbWFwX2lvKHZvaWQpCit7CisJZGV2aWNlX21hcF9pbygpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGxhdGZvcm1faXJxX2luaXQodm9pZCkKK3sKKwlkZXZpY2VfaXJxX2luaXQoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBsYXRmb3JtX2luaXQodm9pZCkKK3sKKwlkZXZpY2VfaW5pdCgpOworCWJvYXJkX2dwaW9faW5pdCgpOworCisjaWYgZGVmaW5lZChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKSB8fCBkZWZpbmVkKENPTkZJR19TUElfTVNQRF9ISUdIX1NQRUVEKQorCXNwaV9yZWdpc3Rlcl9ib2FyZF9pbmZvKGNvbWNlcnRvX3NwaV9ib2FyZF9pbmZvLCBBUlJBWV9TSVpFKGNvbWNlcnRvX3NwaV9ib2FyZF9pbmZvKSk7CisjZW5kaWYKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhjb21jZXJ0b19kZXZpY2VzLCBBUlJBWV9TSVpFKGNvbWNlcnRvX2RldmljZXMpKTsKK30KKworTUFDSElORV9TVEFSVChDT01DRVJUTywgIkNvbWNlcnRvIDIwMDAgUlRTTSIpCisJLyogTWluZHNwZWVkIFRlY2hub2xvZ2llcyBJbmMuICovCisJLmF0YWdfb2Zmc2V0ICAgID0gQ09NQ0VSVE9fQVhJX0REUl9CQVNFICsgMHgxMDAsCisJLnJlc2VydmUJPSBwbGF0Zm9ybV9yZXNlcnZlLAorCS5tYXBfaW8JCT0gcGxhdGZvcm1fbWFwX2lvLAorCS5pbml0X2lycQk9IHBsYXRmb3JtX2lycV9pbml0LAorCS5pbml0X21hY2hpbmUJPSBwbGF0Zm9ybV9pbml0LAorCS50aW1lcgkJPSAmY29tY2VydG9fdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9jbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjc5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2Nsb2NrLmMKQEAgLTAsMCArMSwxMDIzIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY29tY2VydG8vY2xvY2suYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvY2xvY2suaD4KKworc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja19sb2NrKTsKKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQgSEFMX3NldF9jbGtfZGl2aWRlcih1bnNpZ25lZCBsb25nICx1MzIgLCB1MzIpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgSEFMX2dldF9jbGtfZnJlcSh1MzIsIHUzMik7CisKKy8qIEFQSSBjbGtfcHV0IGNsa19nZXQKKyAqIERlY2xhcmVkIGluICJpbmNsdWRlL2xpbnV4L2Nsay5oIiwgaW5jbHVkZSB0aGlzCisgKiBpbiBjb3JyZXNwb2RpbmcgZHJpdmVyLgorICogRGVmaW5lZCBpbiBkcml2ZXJzL2Nsay9jbGtkZXYuYywgd2lsbAorICogdXNlIHRoZSBhYm92ZS4KKyAqLworCisvKiBAIHN0cnVjdCBjbGsgKgorICogQVBJOmxvY2FsX2Nsa19kaXNhYmxlCisgKiBDYWxsIHRoZSBkZXZpY2UgbGV2ZWwgZGlzYWJsZS4KKyAqIFRoaXMgd2lsbCBkZWNyZWFzZSB0aGUgIHVzZWNvdW50IGZvbGxvd2luZyB0byBkaXNhYmxpbmcKKyAqIHRoZSBjbG9jay4KKyovCitzdGF0aWMgdm9pZCBsb2NhbF9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIHZhbDsKKwlpZiAoY2xrLT51c2Vjb3VudCA9PSAwKXsKKwkJcHJfd2FybmluZygiV2FybmluZyA6ICVzIENsb2NrIGlzIGFscmVhZHkgZGlzYWJsZWQgXG4iLGNsay0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBEZWNyZW1lbnQgdGhlIHVzZWNvdW50ICovCisJY2xrLT51c2Vjb3VudC0tOworCisJaWYgKCFjbGstPnVzZWNvdW50KXsKKwkJLyogVGFrZSBjYXJlIG9mIHBhcmVudCBkaXNhYmxlICwgaWYgcHJlc2VudCBmb3IgdGhlIGNsb2NrLgorCQkgKiBEaXNhYmxlIHRoZSBwYXJlbnQgLCBpZiBubyBvdGhlciBjbG9jayBpcyB1c2luZy4KKwkJKi8KKwkJaWYgKGNsay0+cGFyZW50KQorCQkJbG9jYWxfY2xrX2Rpc2FibGUoY2xrLT5wYXJlbnQpOworCisJCS8qIEFwcGx5IHRoZSBDbG9jayByZWdpc3RlciB3cml0ZSBoZXJlICovCisJCWlmIChjbGstPmVuYWJsZV9yZWcpeworCQkJdmFsID0gcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwkJCXZhbCAmPSB+Y2xrLT5lbmFibGVfbWFzazsKKwkJCXdyaXRlbCh2YWwgLCBjbGstPmVuYWJsZV9yZWcpOworCQl9CisJfQorfQorCisvKiBAIHN0cnVjdCBjbGsgKgorICogQVBJOmNsa19kaXNhYmxlIHVzZWQgdG8gZGlzYWJsZSBjbG9jayBmb3IKKyAqIHRoZSBkZXZpY2VzLgorICogVGhpcyBBUEkgd2lsbCBiZSBhdmFpbGFibGUgdG8gb3V0c2lkZQorICogKCBmb3IgYWxsIGRldmljZSBkcml2ZXIpLgorICogQ2FsbCBvZiB0aGlzIEFQSSBzaG91bGQgYmUgZm9sbG93ZWQgYnkgY2xrX2dldAorICogY2xrX2Rpc2FibGUtPmNsa19wdXQuCisqLworCit2b2lkIGNsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworICAgICAgICBsb2NhbF9jbGtfZGlzYWJsZShjbGspOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja19sb2NrLCBmbGFncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woY2xrX2Rpc2FibGUpOworCisvKiBAIHN0cnVjdCBjbGsgKgorICogQVBJIDogSW50ZXJuYWwgY2FsbCBmb3IgY2xrX2Rpc2FibGVfdW51c2VkIGZvciAKKyAqIHVudXNlZCBkZXZpY2VzLgorKi8KK3N0YXRpYyB2b2lkIF9fY2xrX2Rpc2FibGVfdW51c2VkKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKKwkvKiBBcHBseSB0aGUgQ2xvY2sgcmVnaXN0ZXIgd3JpdGUgaGVyZSAqLworCWlmIChjbGstPmVuYWJsZV9yZWcpeworCQl2YWwgPSByZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQl2YWwgJj0gfmNsay0+ZW5hYmxlX21hc2s7CisgICAgICAgICAgICAgICAgd3JpdGVsKHZhbCAsIGNsay0+ZW5hYmxlX3JlZyk7CisJfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja19sb2NrLCBmbGFncyk7Cit9CisKKy8qIEAgc3RydWN0IGNsayAqCisgKiBBUEk6bG9jYWxfY2xrX2VuYWJsZQorICogQ2FsbCB0aGUgZGV2aWNlIGxldmVsIGVuYWJsZS4KKyAqIFRoaXMgd2lsbCBpbmNyZWFzZSB0aGUgIHVzZWNvdW50LgorKi8KK3N0YXRpYyBpbnQgbG9jYWxfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IHJldCA9IDA7CisJdTMyIHZhbDsKKworCWlmIChjbGstPnVzZWNvdW50ID09IDApIHsKKwkJLyogQ2hlY2sgZm9yIHBhcmVudCBjbG9jayAuRW5hYmxlIHRoZSBwYXJlbnQgY2xvY2ssaWYgYXZhaWxhYmxlKi8KKwkJaWYgKGNsay0+cGFyZW50KXsKKwkJCXJldCA9IGxvY2FsX2Nsa19lbmFibGUoY2xrLT5wYXJlbnQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY2xrLT5lbmFibGVfcmVnKXsKKwkJCXZhbCA9IHJlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisgICAgICAgICAgICAgICAgCXZhbCB8PSBjbGstPmVuYWJsZV9tYXNrOworICAgICAgICAgICAgICAgIAl3cml0ZWwodmFsICwgY2xrLT5lbmFibGVfcmVnKTsKKwkJCXJldD0wOworCQl9CisJfQorCS8qIEluY3JlbWVudCB0aGUgdXNlIGNvdW50ICovCisJY2xrLT51c2Vjb3VudCsrOworICAgICAgICByZXR1cm4gcmV0OworfQorCisvKiBAIHN0cnVjdCBjbGsgKgorICogQVBJOmNsa19lbmFibGUgdXNlZCB0byBlbmFibGUgY2xvY2sgZm9yCisgKiB0aGUgZGV2aWNlcy4KKyAqIFRoaXMgQVBJIHdpbGwgYmUgYXZhaWxhYmxlIHRvIG91dHNpZGUKKyAqICggZm9yIGFsbCBkZXZpY2UgZHJpdmVyKS4KKyAqIENhbGwgb2YgdGhpcyBBUEkgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGNsa19nZXQKKyAqIGNsa19nZXQgLT4gY2xrX2VuYWJsZS4KKyovCitpbnQgY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0PTA7CisKKwlpZiAoIWNsaykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworCXJldCA9IGxvY2FsX2Nsa19lbmFibGUoY2xrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjbGtfZW5hYmxlKTsKKworCisvKiBAIHN0cnVjdCBjbGsgKgorICogQVBJOmNsa19nZXRfcmF0ZSB1c2VkIHRvIGdldCBjbG9jayByYXRlIHZhbHVlCisgKiBmb3IgdGhlIGRldmljZXMuIFRoaXMgQVBJIHdpbGwgYmUgYXZhaWxhYmxlIHRvCisgKiBvdXRzaWRlICggZm9yIGFsbCBkZXZpY2UgZHJpdmVyKS4KKyovCit1bnNpZ25lZCBsb25nIGNsa19nZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaWYgKGNsay0+Z2V0X3JhdGUpCisJCXJldHVybiBjbGstPmdldF9yYXRlKGNsayk7CisJZWxzZQorCQlyZXR1cm4gY2xrLT5yYXRlOworfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOworCisvKiBAIHN0cnVjdCBjbGsgKiAsIHVuc2lnbmVkIGxvbmcKKyAqIEFQSTpsb2NhbF9zZXRfcmF0ZSB1c2VkIHRvIHNldCBjbG9jayByYXRlIHZhbHVlCisgKiBmb3IgdGhlIGRldmljZXMuCisqLworCitzdGF0aWMgaW50IGxvY2FsX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCWludCByZXQgPSAtRUlOVkFMOworCWlmIChjbGstPnNldF9yYXRlKSB7CisJCXJldCA9IGNsay0+c2V0X3JhdGUoY2xrLCByYXRlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogQCBzdHJ1Y3QgY2xrICogLCB1bnNpZ25lZCBsb25nCisgKiBBUEk6Y2xrX3NldF9yYXRlIHVzZWQgdG8gc2V0IGNsb2NrIHJhdGUgdmFsdWUKKyAqIGZvciB0aGUgZGV2aWNlcy4gVGhpcyBBUEkgd2lsbCBiZSBhdmFpbGFibGUgdG8KKyAqIG91dHNpZGUgKCBmb3IgYWxsIGRldmljZSBkcml2ZXIpLgorKi8KKworaW50IGNsa19zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFjdHVhbF9yYXRlOworCWludCByZXQgPSAtRUlOVkFMOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKKwlhY3R1YWxfcmF0ZT1jbGstPnJhdGU7CisKKwlpZiAoYWN0dWFsX3JhdGUgIT0gcmF0ZSApeworICAgICAgICAgICAgICAgIHJldCA9IGxvY2FsX3NldF9yYXRlKGNsaywgcmF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsgLypjb25maWd1cmVkIHJhdGUgaXMgc2FtZSBhcyBkZXNpcmVkIHJhdGUqLworICAgICAgICAgICAgICAgIHByX2RlYnVnKCJDdXJyZW50IHJhdGUgdmFsdWUgb2YgY2xvY2sgc291cmNlICglcykgaXMgc2FtZSBhcyBkZXNpcmVkIHJhdGUgdmFsdWUgKCVsZClcbiIsY2xrLT5uYW1lLGNsay0+cmF0ZSk7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKwlpZiAoIHJldCA9PSAtRUlOVkFMICl7CisJCXByX2RlYnVnKCJDYW5ub3QgY2hhbmdlIGNsb2NrOiglcykgLG5vdCBzdXBwb3J0aW5nIHNldF9yYXRlLHNldCB0byBwcmV2aW91cyB2YWx1ZSAoJWxkKVxuIixjbGstPm5hbWUsY2xrLT5yYXRlKTsKKwl9ZWxzZXsKKwkJcHJfZGVidWcoIkNoYW5nZWQgY2xvY2s6KCVzKSByYXRlICxyYXRlIHZhbHVlIGlzICglbGQpXG4iLGNsay0+bmFtZSxjbGstPnJhdGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woY2xrX3NldF9yYXRlKTsKKworLyogQCBzdHJ1Y3QgY2xrICogCisgKiBBUEk6Y2xrX2dldF9wYXJlbnQgdXNlZCB0byBwYXJlbnQgY2xvY2sgc291cmNlLgorICogVGhpcyBBUEkgd2lsbCBiZSBhdmFpbGFibGUgdG8KKyAqIG91dHNpZGUgKCBmb3IgYWxsIGRldmljZSBkcml2ZXIpLgorKi8KK3N0cnVjdCBjbGsgKmNsa19nZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaykKK3sKKyAgICAgICAgcmV0dXJuIGNsay0+cGFyZW50OworfQorRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3BhcmVudCk7CisKKy8qIEAgc3RydWN0IGNsayAqICwgdW5zaWduZWQgbG9uZworICogQVBJOmNsa19zZXRfcGFyZW50IHVzZWQgdG8gc2V0IHRvIGEgZGlmZmVyZW50CisgKiBwYXJlbnQgY2xvY2sgc291cmNlLgorICogVGhpcyBBUEkgd2lsbCBiZSBhdmFpbGFibGUgdG8KKyAqIG91dHNpZGUgKCBmb3IgYWxsIGRldmljZSBkcml2ZXIpLgorKi8KKworaW50IGNsa19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNsayA9PSBOVUxMIHx8IElTX0VSUihjbGspKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisJLyogT25seSBzZXQgcGFyZW50IG9uY2UgYW5kIGlmIG5vbmUgaXMgYWxyZWFkeSBzZXQuICovCisgICAgICAgIGlmIChjbGstPnBhcmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworCS8qIENhbm5vdCBjaGFuZ2UgcGFyZW50IG9uIGVuYWJsZWQgY2xvY2sgKi8KKyAgICAgICAgaWYgKCBXQVJOX09OKGNsay0+dXNlY291bnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworCS8qIFNldCB0aGUgcGFyZW50IGluIGNsayAgc3RydXN0dXJlICovCisgICAgICAgIGNsay0+cGFyZW50ID0gcGFyZW50OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGNsa19zZXRfcGFyZW50KTsKKworLyoKKyAqIENMS0dFTiBEaXZpZGVyIHJlZ2lzdGVycworICogVGhlIGRpdmlkZXIgYnlwYXNzIGJpdCBpbiBzZXZlcmFsIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgKiBjYW4gb25seSBiZSB3cml0dGVuIChpZiB5b3UgcmVhZCBiYWNrIHlvdSBnZXQgemVybykuCisgKgorICogVGhlIEJ1ZyBpcyBpbiByZWdpc3RlcnM6IDB4ODQgKEE5RFBfQ0xLRElWX0NOVFJMKSwgMHg4NCArIDE2IChMMkNDX0NMS0RJVl9DTlRSTCksIDB4ODQgKyAzMgorICoJKFRQSV9DTEtESVZfQ05UUkwpLCBldGMuLi4gdW50aWwgUExMX0FERFJfU1BBQ0UgYXQgMHgxQzAuCisgKi8KKworLyoKKyAqIEJhcmVib3ggdXNlcyBJUkFNIHRvIG1pcnJvciB0aGUgY2xvY2sgZGl2aWRlciByZWdpc3RlcnMKKyAqIExpbnV4IHdpbGwgcmVsb2NhdGUgdGhpcyBtaXJyb3IgZnJvbSBJUkFNIHRvIEREUiB0byBmcmVlIHVwIElSQU0uCisgKi8KKyNkZWZpbmUgSVJBTV9DTEtfUkVHX01JUlJPUgkJKDB4ODMwMEZDMDAgLSBDT01DRVJUT19BWElfSVJBTV9CQVNFICsgSVJBTV9NRU1PUllfVkFERFIpCisjZGVmaW5lIENMS19SRUdfRElWX0JVR19CQVNFCQlBWElfQ0xLX0RJVl9DTlRSTAorI2RlZmluZSBDTEtfUkVHX0RJVl9CVUdfU0laRQkJKFBMTDBfTV9MU0IgLSBBWElfQ0xLX0RJVl9DTlRSTCkKKworc3RhdGljIHU4IGNsa19kaXZfYmFja3VwX3RhYmxlIFtDTEtfUkVHX0RJVl9CVUdfU0laRV07CisjZGVmaW5lIHJlYWRfY2xrX2Rpdl9ieXBhc3NfYmFja3VwKHJlZykgcmVhZGwocmVnIC0gQ0xLX1JFR19ESVZfQlVHX0JBU0UgKyBjbGtfZGl2X2JhY2t1cF90YWJsZSkKKyNkZWZpbmUgd3JpdGVfY2xrX2Rpdl9ieXBhc3NfYmFja3VwKHZhbCwgcmVnKSB3cml0ZWwodmFsLCByZWcgLSBDTEtfUkVHX0RJVl9CVUdfQkFTRSArIGNsa19kaXZfYmFja3VwX3RhYmxlKQorCit2b2lkIEhBTF9jbGtfZGl2X2JhY2t1cF9yZWxvY2F0ZV90YWJsZSAodm9pZCkKK3sKKwltZW1jcHkgKGNsa19kaXZfYmFja3VwX3RhYmxlLCAodm9pZCopIElSQU1fQ0xLX1JFR19NSVJST1IsIENMS19SRUdfRElWX0JVR19TSVpFKTsKK30KK0VYUE9SVF9TWU1CT0woSEFMX2Nsa19kaXZfYmFja3VwX3JlbG9jYXRlX3RhYmxlKTsKKworLyoKKyAqIEdldCB0aGUgcmVmZXJlbmNlIGNsb2NrIGFmdGVyIHJlYWRpbmcgYm9vdHN0cmFwCisgKi8KK3Vuc2lnbmVkIGxvbmcgSEFMX2dldF9yZWZfY2xrICh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY2xvY2tfZnJlcSA9IDA7CisJdW5zaWduZWQgaW50IGJvb3Rfc3RyYXAsIHRtcDsKKworCWJvb3Rfc3RyYXAgPSByZWFkbChDT01DRVJUT19HUElPX1NZU1RFTV9DT05GSUcpOworCXRtcCA9IChib290X3N0cmFwICYgR1BJT19TWVNfUExMX1JFRl9DTEtfTUFTSykgPj4gR1BJT19TWVNfUExMX1JFRl9DTEtfU0hJRlQ7CisKKwlpZiAoIFVTQl9YVEFMX1JFRl9DTEsgPT0gdG1wICkKKwl7CisJCQlpZiAoIGJvb3Rfc3RyYXAgJiBHUElPX1VTQl9PU0NfUEFEX01BU0sgKQorCQkJCWNsb2NrX2ZyZXEgPSBSRUZfQ0xLXzI0TUhaOworCQkJZWxzZQorCQkJCWNsb2NrX2ZyZXEgPSBSRUZfQ0xLXzQ4TUhaOworCX0KKwllbHNlIGlmICggU0VSREVTX1hUQUxfUkVGX0NMSyA9PSB0bXAgKQorCXsKKwkJaWYgKCBib290X3N0cmFwICYgR1BJT19TRVJERVNfT1NDX1BBRF9NQVNLICkKKwkJCWNsb2NrX2ZyZXEgPSBSRUZfQ0xLXzI0TUhaOworCQllbHNlCisJCQljbG9ja19mcmVxID0gUkVGX0NMS180OE1IWjsKKwl9CisKKwlyZXR1cm4gY2xvY2tfZnJlcTsKK30KK0VYUE9SVF9TWU1CT0woSEFMX2dldF9yZWZfY2xrKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgSEFMX2dldF9wbGxfZnJlcShpbnQgcGxsX25vKQoreworCXUzMiBwOworCXUzMiBvZDsKKwl1MzIgbTsKKwl1MzIgazsKKwl1MzIgczsKKwl1bnNpZ25lZCBsb25nIHBsbF9jbGsgPSAwOworCXVuc2lnbmVkIGxvbmcgcmVmX2NsayA9IEhBTF9nZXRfcmVmX2NsaygpOworCXVuc2lnbmVkIGxvbmcgcGxsX2RpdiA9IDA7CisKKwlpZiAocGxsX25vIDwgUExMMykKKwl7CisJCS8vZ2V0IE5GLCBOUiBhbmQgT0QgdmFsdWVzCisJCXN3aXRjaCAocGxsX25vKQorCQl7CisJCWNhc2UgUExMMDoKKwkJCW0gPSByZWFkbChQTEwwX01fTFNCKSAmIDB4ZmY7CisJCQltIHw9IChyZWFkbChQTEwwX01fTVNCKSAmIDB4MykgPDwgODsKKwkJCXAgPSByZWFkbChQTEwwX1ApICYgMHgzZjsKKwkJCXMgPSByZWFkbChQTEwwX1MpICYgMHg3OworCQkJb2QgPSAoMSA8PCBzKTsgLy8gMl5zOworCQkJcGxsX2RpdiA9IHJlYWRsKFBMTDBfRElWX0NOVFJMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUExMMToKKwkJCW0gPSByZWFkbChQTEwxX01fTFNCKSAmIDB4ZmY7CisJCQltIHw9IChyZWFkbChQTEwxX01fTVNCKSAmIDB4MykgPDwgODsKKwkJCXAgPSByZWFkbChQTEwxX1ApICYgMHgzZjsKKwkJCXMgPSByZWFkbChQTEwxX1MpICYgMHg3OworCQkJb2QgPSAoMSA8PCBzKTsKKwkJCXBsbF9kaXYgPSByZWFkbChQTEwxX0RJVl9DTlRSTCk7CisJCQlicmVhazsKKworCQljYXNlIFBMTDI6CisJCQltID0gcmVhZGwoUExMMl9NX0xTQikgJiAweGZmOworCQkJbSB8PSAocmVhZGwoUExMMl9NX01TQikgJiAweDMpIDw8IDg7CisJCQlwID0gcmVhZGwoUExMMl9QKSAmIDB4M2Y7CisJCQlzID0gcmVhZGwoUExMMl9TKSAmIDB4NzsKKwkJCW9kID0gKDEgPDwgcyk7CisJCQlwbGxfZGl2ID0gcmVhZGwoUExMMl9ESVZfQ05UUkwpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBSZWYgQ2xvY2sgZGl2aWRlZCBieSAxMDAwMDAwLiBJdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIE1Iei4gKi8KKwkJcGxsX2NsayA9ICgocmVmX2NsayAvIDEwMDAwMDApICogbSkgLyBwIC8gb2QgOworCQkKKwkJaWYgKHBsbF9kaXYgJiBDTEtfRElWX0JZUEFTUykKKwkJCXBsbF9kaXYgPSAxOworCQllbHNlCisJCQlwbGxfZGl2ID0gcGxsX2RpdiAmIDB4MUY7CisKKwkJaWYgKHBsbF9kaXYgPiAxKQorCQkJcGxsX2NsayA9IHBsbF9jbGsvcGxsX2RpdjsKKworCX0KKwllbHNlIGlmIChwbGxfbm8gPT0gUExMMykKKwl7CisJCW0gPSByZWFkbChQTEwzX01fTFNCKSAmIDB4ZmY7CisJCW0gfD0gKHJlYWRsKFBMTDNfTV9NU0IpICYgMHgzKSA8PCA4OworCQlwID0gcmVhZGwoUExMM19QKSAmIDB4M2Y7CisJCXMgPSByZWFkbChQTEwzX1MpICYgMHg3OworCQlrID0gcmVhZGwoUExMM19LX0xTQikgJiAweGZmOworCQlrIHw9IChyZWFkbChQTEwzX0tfTVNCKSAmIDB4ZikgPDwgODsKKwkJb2QgPSAoMSA8PCBzKTsKKwkJcGxsX2NsayA9ICgoKHJlZl9jbGsgLyAxMDAwMDAwKSAqIChtICogMTAyNCArIGspKSAvIHAgLyBvZCArIDEwMjMpIC8gMTAyNDsKKwl9CisKKwlyZXR1cm4gKHBsbF9jbGsgKiAxMDAwMDAwKTsgLyogY29udmVydCBpbnRvIEh6IGFuZCByZXR1cm4gaXQgKi8KK30KKworc3RhdGljIHZvaWQgSEFMX3NldF9jbGtfZGl2aWRlcih1bnNpZ25lZCBsb25nIHJhdGUsdTMyIGN0cmxfcmVnLCB1MzIgZGl2X3JlZykKK3sKKwl1MzIgcGxsX3NyYzsKKwl1MzIgdmFsOworCWludCBkaXZpZGVyOworCXVuc2lnbmVkIGxvbmcgIHBsbF9yYXRlOworCisJLyogR2V0IFBMTCBTb3VyY2UgKi8KKwlwbGxfc3JjID0gcmVhZGwoY3RybF9yZWcpOworCXBsbF9zcmMgPSAocGxsX3NyYyA+PiBDTEtfUExMX1NSQ19TSElGVCkgJiBDTEtfUExMX1NSQ19NQVNLOworCisJLyogR2V0IFBMTCBGcmVxICovCisJcGxsX3JhdGUgPSBIQUxfZ2V0X3BsbF9mcmVxKHBsbF9zcmMpOworCisJLyogR2V0IFRoZSBEaXZpZGVyIHZhbHVlIEZvciAgQ2xvY2sgKi8KKwlkaXZpZGVyICAgPSAgcGxsX3JhdGUvcmF0ZTsKKworCWlmICggZGl2aWRlciA9PSAxKXsKKwkJd3JpdGVfY2xrX2Rpdl9ieXBhc3NfYmFja3VwKENMS19ESVZfQllQQVNTLGRpdl9yZWcpOworCQkvKiBFbmFibGUgdGhlIEJ5cGFzcyBiaXQgaW4gSHcgcmVnIChjbGtfZGl2X2J5cGFzcyBpbiBkaXZfcmVnKSAqLworCQl2YWwgPSByZWFkbChkaXZfcmVnKTsKKwkJdmFsIHw9IENMS19ESVZfQllQQVNTOworCQl3cml0ZWwodmFsICwgZGl2X3JlZyk7CisJfQorCWVsc2UKKwl7CisJCXdyaXRlX2Nsa19kaXZfYnlwYXNzX2JhY2t1cCgwLGRpdl9yZWcpOworCQkvKiBXcml0ZSB0byB0aGUgZGl2aWRlciByZWcgKi8KKwkJdmFsID0gcmVhZGwoZGl2X3JlZyk7CisJCXZhbCAmPSB+MHgxZjsKKwkJdmFsIHw9IGRpdmlkZXI7CisJCXdyaXRlbCh2YWwsIGRpdl9yZWcpOworCQkvKiBDbGVhciB0aGUgQnlwYXNzIGJpdCBpbiBIdyByZWcgKGNsa19kaXZfYnlwYXNzIGluIGRpdl9yZWcpICovCisJCXZhbCA9IHJlYWRsKGRpdl9yZWcpOworCQl2YWwgJj0gfkNMS19ESVZfQllQQVNTOworCQl3cml0ZWwodmFsICwgZGl2X3JlZyk7CisJfQorfQorCitzdGF0aWMgaW50IEhBTF9nZXRfY2xvY2tfcGxsX3NvdXJjZSh1MzIgY3RybF9yZWcpCit7CisJaW50IHBsbF9zcmM7CisKKwkvKiBHZXQgUExMIHNvdXJjZSAqLworCXBsbF9zcmMgPSByZWFkbChjdHJsX3JlZyk7CisJcGxsX3NyYyA9IChwbGxfc3JjID4+IENMS19QTExfU1JDX1NISUZUKSAmIENMS19QTExfU1JDX01BU0s7CisKKwlyZXR1cm4gcGxsX3NyYzsKKworfQorCitzdGF0aWMgdm9pZCBIQUxfc2V0X2Nsb2NrX3BsbF9zb3VyY2UodTMyIGN0cmxfcmVnLGludCBwbGxfc3JjKXsKKworCXN3aXRjaChwbGxfc3JjKQorCXsKKwkJY2FzZSBQTEwwOgorCQkJd3JpdGVsKHJlYWRsKGN0cmxfcmVnKSB8ICgxIDw8IDApICwgY3RybF9yZWcpOworICAgICAgICAgICAgICAgIAlicmVhazsKKwkJY2FzZSBQTEwxOgorCQkJd3JpdGVsKHJlYWRsKGN0cmxfcmVnKSB8ICgxIDw8IDEpICwgY3RybF9yZWcpOworICAgICAgICAgICAgICAgIAlicmVhazsKKwkJY2FzZSBQTEwzOgorCQkJd3JpdGVsKHJlYWRsKGN0cmxfcmVnKSB8ICgxIDw8IDMpLCBjdHJsX3JlZyk7CisgICAgICAgICAgICAgICAgCWJyZWFrOworCQljYXNlIFBMTDI6CisJCWRlZmF1bHQ6CisJCQl3cml0ZWwocmVhZGwoY3RybF9yZWcpIHwgKDEgPDwgMiksIGN0cmxfcmVnKTsKKyAgICAgICAgICAgICAgICAJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEhBTF9nZXRfY2xrX2ZyZXEodTMyIGN0cmxfcmVnLCB1MzIgZGl2X3JlZykKK3sKKwl1MzIgcGxsX3NyYzsKKwl1MzIgY2xrX2RpdjsKKwl1bnNpZ25lZCBsb25nIGNsa19vdXQ7CisJdW5zaWduZWQgbG9uZyBwbGxfY2xrOworCWludCBieXBhc3MgPSAwOworCisJLyogR2V0IFBMTCBTb3VyY2UgKi8KKwlwbGxfc3JjID0gcmVhZGwoY3RybF9yZWcpOworCXBsbF9zcmMgPSAocGxsX3NyYyA+PiBDTEtfUExMX1NSQ19TSElGVCkgJiBDTEtfUExMX1NSQ19NQVNLOworCisJLyogR2V0IGNsb2NrIGRpdmlkZXIgYnlwYXNzIHZhbHVlIGZyb20gSVJBTSBDbG9jayBEaXZpZGVyIHJlZ2lzdGVycyBtaXJyb3IgbG9jYXRpb24gKi8KKwljbGtfZGl2ID0gcmVhZF9jbGtfZGl2X2J5cGFzc19iYWNrdXAoZGl2X3JlZyk7CisKKwlpZiAoY2xrX2RpdiAmIENMS19ESVZfQllQQVNTKQorCQlieXBhc3MgPSAxOworCWVsc2UKKwl7CisJCWNsa19kaXYgPSByZWFkbChkaXZfcmVnKTsKKwkJY2xrX2RpdiAmPSAweDFmOworCX0KKworCXBsbF9jbGsgPSBIQUxfZ2V0X3BsbF9mcmVxKHBsbF9zcmMpOyAKKworCWlmIChieXBhc3MpCisJCWNsa19vdXQgPSBwbGxfY2xrOworCWVsc2UKKwkJY2xrX291dCA9IHBsbF9jbGsgLyBjbGtfZGl2OworCisJcmV0dXJuIGNsa19vdXQ7Cit9CisKKy8qIEdldCByYXRlIEFQSSBjYWxsYmFjayAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgSEFMX2dldF9jbGsoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBIQUxfZ2V0X2Nsa19mcmVxKGNsay0+Y2xrZ2VuX3JlZywgY2xrLT5kaXZfcmVnKTsKK30KKworLyogR2V0IHJhdGUgQVBJIGNhbGxiYWNrIGZvciB0aG9zZSBjbG9ja3MgaGF2aW5nIFBhcmVudCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgSEFMX2dldF9wYXJlbnRfY2xrKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKK30KKy8qIFNwZWNpZmljIEdldCByYXRlIEFQSSBjYWxsYmFjayBmb3IgYXJtIHBlcmlwaGVyYWxzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyAgSEFMX2dldF9hcm1fcGVyaV9jbGsoc3RydWN0IGNsayAqY2xrKQoreworCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpLzQgOworfQorCisvKiBTZXQgcmF0ZSBBUElzIGNhbGxiYWNrcyAqLworc3RhdGljIGludCBIQUxfc2V0X2NsayhzdHJ1Y3QgY2xrICpjbGssdW5zaWduZWQgbG9uZyByYXRlKQoreworCXN0cnVjdCBjbGsgKmNsa19wYXJlbnQ7CisJLyogR2V0IHRoZSBwYXJlbnQgY2xvY2sgKi8KKwljbGtfcGFyZW50PWNsa19nZXRfcGFyZW50KGNsayk7CisJaWYgKCBjbGtfcGFyZW50IHx8IHJhdGUgPD0gY2xrX3BhcmVudC0+cmF0ZSl7CisJCS8qIFNldCB0aGUgZGl2aWRlciB2YWx1ZSB0byByZWcgKi8KKwkJSEFMX3NldF9jbGtfZGl2aWRlcihyYXRlLGNsay0+Y2xrZ2VuX3JlZyxjbGstPmRpdl9yZWcpOworCQkvKiBTZXQgdGhlIHJhdGUgdmFsdWUgdG8gY2xrIHN0cnVjdHVyZSAqLworCQljbGstPnJhdGU9cmF0ZTsKKwkJcmV0dXJuIDA7CisJfWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIEluaXRpemF0aW9uIG9mIGNsayBzdHJ1Y3R1cmUgZm9yIGluZGl2aWR1YWwgZGV2aWNlICovCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wbGwwID0geworCS5uYW1lICAgICA9ICJwbGwwIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wbGwxID0geworCS5uYW1lICAgPSAicGxsMSIsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjbGtfcGxsMiA9IHsKKwkubmFtZSAgID0gInBsbDIiLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3BsbDMgPSB7CisJLm5hbWUgICA9ICJwbGwzIiwKK307CisKKworCitzdGF0aWMgc3RydWN0IGNsayBnZW10eF9jbGsgPSB7CisJLm5hbWUgICAgICAgID0gImdlbXR4IiwKKwkuZW5hYmxlX3JlZyAgPSBHRU1UWF9DTEtfQ05UUkwsCisJLmNsa2dlbl9yZWcgID0gR0VNVFhfQ0xLX0NOVFJMLAorCS5kaXZfcmVnICAgICA9IEdFTVRYX0NMS19ESVZfQ05UUkwsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfY2xrLAorCS5zZXRfcmF0ZSAgICA9IEhBTF9zZXRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZGRyX2NsayA9IHsKKwkubmFtZSAgICAgICAgPSAiZGRyIiwKKwkuZW5hYmxlX3JlZyAgPSBERFJfQ0xLX0NOVFJMLAorCS5jbGtnZW5fcmVnICA9IEREUl9DTEtfQ05UUkwsCisJLmRpdl9yZWcgICAgID0gRERSX0NMS19ESVZfQ05UUkwsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgYXJtX2NsayA9IHsKKwkubmFtZSAgICAgICAgPSAiYXJtIiwKKwkuZW5hYmxlX3JlZyAgPSBBOURQX0NMS19DTlRSTCwKKwkuY2xrZ2VuX3JlZyAgPSBBOURQX0NMS19DTlRSTCwKKwkuZGl2X3JlZyAgICAgPSBBOURQX0NMS19ESVZfQ05UUkwsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfY2xrLAorCS5zZXRfcmF0ZSAgICA9IEhBTF9zZXRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgbDJjY19jbGsgPSB7CisJLm5hbWUgICAgICAgID0gImwyY2MiLAorCS5lbmFibGVfcmVnICA9IEwyQ0NfQ0xLX0NOVFJMLAorCS5jbGtnZW5fcmVnICA9IEwyQ0NfQ0xLX0NOVFJMLAorCS5kaXZfcmVnICAgICA9IEwyQ0NfQ0xLX0RJVl9DTlRSTCwKKwkuZW5hYmxlX21hc2sgPSBDTEtfRE9NQUlOX01BU0ssCisJLmdldF9yYXRlICAgID0gSEFMX2dldF9jbGssCisJLnNldF9yYXRlICAgID0gSEFMX3NldF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBheGlfY2xrID0geworCS5uYW1lICAgICAgICA9ICJheGkiLAorCS5lbmFibGVfcmVnICA9IEFYSV9DTEtfQ05UUkxfMCwKKwkuY2xrZ2VuX3JlZyAgPSBBWElfQ0xLX0NOVFJMXzAsCisJLmRpdl9yZWcgICAgID0gQVhJX0NMS19ESVZfQ05UUkwsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfY2xrLAorCS5zZXRfcmF0ZSAgICA9IEhBTF9zZXRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdWFydF9jbGsgPSB7IC8qIExlZ2FjeSBVQVJUICovCisJLnBhcmVudCAgICAgID0gJmF4aV9jbGssCisJLm5hbWUgICAgICAgID0gInVhcnQiLAorCS5lbmFibGVfcmVnICA9IEFYSV9DTEtfQ05UUkxfMSwKKwkuZW5hYmxlX21hc2sgPSBDTEtfRE9NQUlOX1VBUlRfTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X3BhcmVudF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBpcHNlY19lYXBlX2NsayA9IHsKKwkubmFtZSAgICAgICAgPSAiaXBzZWNfZWFwZSIsCisJLmVuYWJsZV9yZWcgID0gSVBTRUNfQ0xLX0NOVFJMLAorCS5jbGtnZW5fcmVnICA9IElQU0VDX0NMS19DTlRSTCwKKwkuZGl2X3JlZyAgICAgPSBJUFNFQ19DTEtfRElWX0NOVFJMLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGlwc2VjX3NwYWNjX2NsayA9IHsgICAgICAgLyogSVBTRUMgc3BhY2MgY2xvY2sgZm9yIEVsbGlwdGljIEVQTjE4MDIqLworCS5wYXJlbnQgICAgICA9ICZheGlfY2xrLAorCS5uYW1lICAgICAgICA9ICJpcHNlY19zcGFjYyIsCisJLmVuYWJsZV9yZWcgID0gQVhJX0NMS19DTlRSTF8xLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fSVBTRUNfU1BBQ0NfTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X3BhcmVudF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGlfY2llX2NsayA9IHsgICAgICAgLyogRFBJIGNpZSBjbG9jayovCisJLnBhcmVudCAgICAgID0gJmF4aV9jbGssCisJLm5hbWUgICAgICAgID0gImRwaV9jaWUiLAorCS5lbmFibGVfcmVnICA9IEFYSV9DTEtfQ05UUkxfMCwKKwkuZW5hYmxlX21hc2sgPSBDTEtfRE9NQUlOX0RQSV9DSUVfTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X3BhcmVudF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBkcGlfZGVjb21wX2NsayA9IHsgICAgICAgLyogRFBJIGRlY29tcCBjbG9jayovCisJLnBhcmVudCAgICAgID0gJmF4aV9jbGssCisJLm5hbWUgICAgICAgID0gImRwaV9kZWNvbXAiLAorCS5lbmFibGVfcmVnICA9IEFYSV9DTEtfQ05UUkxfMCwKKwkuZW5hYmxlX21hc2sgPSBDTEtfRE9NQUlOX0RQSV9ERUNPTVBfTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X3BhcmVudF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBEVVNfY2xrID0geyAvKiBETUEsRkFTVC1VQVJUIGFuZCBTTUkgY2xvY2sgKi8KKwkucGFyZW50ICAgICAgPSAmYXhpX2NsaywKKwkubmFtZSAgICAgICAgPSAiRFVTIiwKKwkuZW5hYmxlX3JlZyAgPSBBWElfQ0xLX0NOVFJMXzEsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9EVVNfTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X3BhcmVudF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBhcm1fcGVyaV9jbGsgPSB7CisJLnBhcmVudCAgICAgID0gJmFybV9jbGssCisJLm5hbWUgICAgICAgID0gImFybV9wZXJpIiwKKwkuZW5hYmxlX3JlZyAgPSBBOURQX01QVV9DTEtfQ05UUkwsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfYXJtX3BlcmlfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaGZlX2NvcmVfY2xrID0geworCS5uYW1lICAgICAgICA9ICJoZmVfY29yZSIsCisJLmVuYWJsZV9yZWcgID0gUEZFX0NMS19DTlRSTCwKKwkuY2xrZ2VuX3JlZyAgPSBQRkVfQ0xLX0NOVFJMLAorCS5kaXZfcmVnICAgICA9IFBGRV9DTEtfRElWX0NOVFJMLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X2NsaywKKwkuc2V0X3JhdGUgICAgPSBIQUxfc2V0X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNwaV9pMmNfY2xrID0geworCS5wYXJlbnQgICAgICA9ICZheGlfY2xrLAorCS5uYW1lICAgICAgICA9ICJzcGlfaTJjIiwKKwkuZW5hYmxlX3JlZyAgPSBBWElfQ0xLX0NOVFJMXzEsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9TUElfSTJDX01BU0ssCisJLmdldF9yYXRlICAgID0gSEFMX2dldF9wYXJlbnRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdGRtTlRHX2NsayA9IHsKKwkubmFtZSAgICAgICAgPSAibnRncmVmIiwKKwkuZW5hYmxlX3JlZyAgPSBURE1OVEdfUkVGX0NMS19DTlRSTCwKKwkuY2xrZ2VuX3JlZyAgPSBURE1OVEdfUkVGX0NMS19DTlRSTCwKKwkuZGl2X3JlZyAgICAgPSBURE1OVEdfUkVGX0NMS19ESVZfQ05UUkwsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfY2xrLAorCS5zZXRfcmF0ZSAgICA9IEhBTF9zZXRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgcGNpZTBfY2xrID0geworCS5wYXJlbnQgICAgICA9ICZheGlfY2xrLAorCS5uYW1lICAgICAgICA9ICJwY2llMCIsCisJLmVuYWJsZV9yZWcgID0gQVhJX0NMS19DTlRSTF8yLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fUENJRTBfTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X3BhcmVudF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBwY2llMV9jbGsgPSB7CisJLnBhcmVudCAgICAgID0gJmF4aV9jbGssCisJLm5hbWUgICAgICAgID0gInBjaWUxIiwKKwkuZW5hYmxlX3JlZyAgPSBBWElfQ0xLX0NOVFJMXzIsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9QQ0lFMV9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfcGFyZW50X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHVzYjBfY2xrID0geworCS5wYXJlbnQgICAgICA9ICZheGlfY2xrLAorCS5uYW1lICAgICAgICA9ICJ1c2IwIiwKKwkuZW5hYmxlX3JlZyAgPSBBWElfQ0xLX0NOVFJMXzIsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9VU0IwX01BU0ssCisJLmdldF9yYXRlICAgID0gSEFMX2dldF9wYXJlbnRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdXNiMV9jbGsgPSB7CisJLnBhcmVudCAgICAgID0gJmF4aV9jbGssCisJLm5hbWUgICAgICAgID0gInVzYjEiLAorCS5lbmFibGVfcmVnICA9IEFYSV9DTEtfQ05UUkxfMiwKKwkuZW5hYmxlX21hc2sgPSBDTEtfRE9NQUlOX1VTQjFfTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X3BhcmVudF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzYXRhX2NsayA9IHsgICAgICAgICAgICAvKiBTQVRBIEFYSSBjbG9jayAqLworCS5wYXJlbnQgICAgICA9ICZheGlfY2xrLAorCS5uYW1lICAgICAgICA9ICJzYXRhIiwKKwkuZW5hYmxlX3JlZyAgPSBBWElfQ0xLX0NOVFJMXzIsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9TQVRBX01BU0ssCisJLmdldF9yYXRlICAgID0gSEFMX2dldF9wYXJlbnRfY2xrLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNhdGFfb29iX2NsayA9IHsKKwkubmFtZSAgICAgICAgPSAic2F0YV9vb2IiLAkgIC8qIFNBVEEgUE1VIGFsaXZlIGNsb2NrICovCisJLmVuYWJsZV9yZWcgID0gU0FUQV9PT0JfQ0xLX0NOVFJMLAorCS5jbGtnZW5fcmVnICA9IFNBVEFfT09CX0NMS19DTlRSTCwKKwkuZGl2X3JlZyAgICAgPSBTQVRBX09PQl9DTEtfRElWX0NOVFJMLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X2NsaywKKwkuc2V0X3JhdGUgICAgPSBIQUxfc2V0X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHNhdGFfcG11X2NsayA9IHsKKwkubmFtZSAgICAgICAgPSAic2F0YV9wbXUiLAkgLyogU0FUQSBjb3JlIGNsb2NrIGNvbnRyb2wgKi8KKwkuZW5hYmxlX3JlZyAgPSBTQVRBX1BNVV9DTEtfQ05UUkwsCisJLmNsa2dlbl9yZWcgID0gU0FUQV9QTVVfQ0xLX0NOVFJMLAorCS5kaXZfcmVnICAgICA9IFNBVEFfUE1VX0NMS19ESVZfQ05UUkwsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfY2xrLAorCS5zZXRfcmF0ZSAgICA9IEhBTF9zZXRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZXh0X3BoeTBfY2xrID0geworCS5uYW1lCSAgICAgPSAiZXh0X3BoeTAiLAorCS5lbmFibGVfcmVnICA9IEVYVFBIWTBfQ0xLX0NOVFJMLAorCS5jbGtnZW5fcmVnICA9IEVYVFBIWTBfQ0xLX0NOVFJMLAorCS5kaXZfcmVnICAgICA9IEVYVFBIWTBfQ0xLX0RJVl9DTlRSTCwKKwkuZW5hYmxlX21hc2sgPSBDTEtfRE9NQUlOX01BU0ssCisJLmdldF9yYXRlICAgID0gSEFMX2dldF9jbGssCisJLnNldF9yYXRlICAgID0gSEFMX3NldF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBleHRfcGh5MV9jbGsgPSB7CisJLm5hbWUJICAgICA9ICJleHRfcGh5MSIsCisJLmVuYWJsZV9yZWcgID0gRVhUUEhZMV9DTEtfQ05UUkwsCisJLmNsa2dlbl9yZWcgID0gRVhUUEhZMV9DTEtfQ05UUkwsCisJLmRpdl9yZWcgICAgID0gRVhUUEhZMV9DTEtfRElWX0NOVFJMLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X2NsaywKKwkuc2V0X3JhdGUgICAgPSBIQUxfc2V0X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGV4dF9waHkyX2NsayA9IHsKKwkubmFtZQkgICAgID0gImV4dF9waHkyIiwKKwkuZW5hYmxlX3JlZyAgPSBFWFRQSFkyX0NMS19DTlRSTCwKKwkuY2xrZ2VuX3JlZyAgPSBFWFRQSFkyX0NMS19DTlRSTCwKKwkuZGl2X3JlZyAgICAgPSBFWFRQSFkyX0NMS19ESVZfQ05UUkwsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfY2xrLAorCS5zZXRfcmF0ZSAgICA9IEhBTF9zZXRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgdHBpX2NsayA9IHsKKwkubmFtZQkgICAgID0gInRwaSIsCisJLmVuYWJsZV9yZWcgID0gVFBJX0NMS19DTlRSTCwKKwkuY2xrZ2VuX3JlZyAgPSBUUElfQ0xLX0NOVFJMLAorCS5kaXZfcmVnICAgICA9IFRQSV9DTEtfRElWX0NOVFJMLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X2NsaywKKwkuc2V0X3JhdGUgICAgPSBIQUxfc2V0X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNzeXNfY2xrID0geworCS5uYW1lCSAgICAgPSAiY3N5cyIsCisJLmVuYWJsZV9yZWcgID0gQ1NZU19DTEtfQ05UUkwsCisJLmNsa2dlbl9yZWcgID0gQ1NZU19DTEtfQ05UUkwsCisJLmRpdl9yZWcgICAgID0gQ1NZU19DTEtfRElWX0NOVFJMLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X2NsaywKKwkuc2V0X3JhdGUgICAgPSBIQUxfc2V0X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHRzdW50Z19jbGsgPSB7CisJLm5hbWUJICAgICA9ICJ0c3VudGciLAorCS5lbmFibGVfcmVnICA9IFRTVU5UR19SRUZfQ0xLX0NOVFJMLAorCS5jbGtnZW5fcmVnICA9IFRTVU5UR19SRUZfQ0xLX0NOVFJMLAorCS5kaXZfcmVnICAgICA9IFRTVU5UR19SRUZfQ0xLX0RJVl9DTlRSTCwKKwkuZW5hYmxlX21hc2sgPSBDTEtfRE9NQUlOX01BU0ssCisJLmdldF9yYXRlICAgID0gSEFMX2dldF9jbGssCisJLnNldF9yYXRlICAgID0gSEFMX3NldF9jbGssCit9OworCitzdGF0aWMgc3RydWN0IGNsayBzYXRhX29jY19jbGsgPSB7CisJLm5hbWUJICAgICA9ICJzYXRhX29jYyIsCisJLmVuYWJsZV9yZWcgID0gU0FUQV9PQ0NfQ0xLX0NOVFJMLAorCS5jbGtnZW5fcmVnICA9IFNBVEFfT0NDX0NMS19DTlRSTCwKKwkuZGl2X3JlZyAgICAgPSBTQVRBX09DQ19DTEtfRElWX0NOVFJMLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X2NsaywKKwkuc2V0X3JhdGUgICAgPSBIQUxfc2V0X2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBjaWVfb2NjX2NsayA9IHsKKwkubmFtZQkgICAgID0gInBjaWVfb2NjIiwKKwkuZW5hYmxlX3JlZyAgPSBQQ0lFX09DQ19DTEtfQ05UUkwsCisJLmNsa2dlbl9yZWcgID0gUENJRV9PQ0NfQ0xLX0NOVFJMLAorCS5kaXZfcmVnICAgICA9IFBDSUVfT0NDX0NMS19ESVZfQ05UUkwsCisJLmVuYWJsZV9tYXNrID0gQ0xLX0RPTUFJTl9NQVNLLAorCS5nZXRfcmF0ZSAgICA9IEhBTF9nZXRfY2xrLAorCS5zZXRfcmF0ZSAgICA9IEhBTF9zZXRfY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgc2dtaWlfb2NjX2NsayA9IHsKKwkubmFtZQkgICAgID0gInNnbWlpX29jYyIsCisJLmVuYWJsZV9yZWcgID0gU0dNSUlfT0NDX0NMS19DTlRSTCwKKwkuY2xrZ2VuX3JlZyAgPSBTR01JSV9PQ0NfQ0xLX0NOVFJMLAorCS5kaXZfcmVnICAgICA9IFNHTUlJX09DQ19DTEtfRElWX0NOVFJMLAorCS5lbmFibGVfbWFzayA9IENMS19ET01BSU5fTUFTSywKKwkuZ2V0X3JhdGUgICAgPSBIQUxfZ2V0X2NsaywKKwkuc2V0X3JhdGUgICAgPSBIQUxfc2V0X2NsaywKK307CisKKy8qIFRoZXNlIGNsb2NrcyBhcmUgdmlzaWJsZSBvdXRzaWRlIHRoaXMgbW9kdWxlCisgKiBhbmQgY2FuIGJlIGluaXRpYWxpemVkICwgdGhpcyBsaXN0IGNvdWxkIGJlIGV4cGFuZGVkCisgKiBhY2NvcmRpbmcgdG8gbmV3IGRldmljZSBzdXBwb3J0LgorICovCitzdGF0aWMgc3RydWN0IGNsayAqYzJrX2Nsa3NbXSBfX2luaXRkYXRhID0geworCSZjbGtfcGxsMCwKKwkmY2xrX3BsbDEsCisJJmNsa19wbGwyLAorCSZjbGtfcGxsMywKKwkmdWFydF9jbGssCisJJkRVU19jbGssCisJJmdlbXR4X2NsaywKKwkmaXBzZWNfZWFwZV9jbGssCisJJmlwc2VjX3NwYWNjX2NsaywKKwkmZHBpX2NpZV9jbGssCisJJmRwaV9kZWNvbXBfY2xrLAorCSZkZHJfY2xrLAorCSZhcm1fY2xrLAorCSZsMmNjX2NsaywKKwkmYXhpX2NsaywKKwkmYXJtX3BlcmlfY2xrLAorCSZoZmVfY29yZV9jbGssCisJJnNwaV9pMmNfY2xrLAorCSZ0ZG1OVEdfY2xrLAorCSZwY2llMF9jbGssCisJJnBjaWUxX2NsaywKKwkmdXNiMF9jbGssCisJJnVzYjFfY2xrLAorCSZzYXRhX2NsaywKKwkmc2F0YV9vb2JfY2xrLAorCSZzYXRhX3BtdV9jbGssCisJJmV4dF9waHkwX2NsaywKKwkmZXh0X3BoeTFfY2xrLAorCSZleHRfcGh5Ml9jbGssCisJJnRwaV9jbGssCisJJmNzeXNfY2xrLAorCSZ0c3VudGdfY2xrLAorCSZzYXRhX29jY19jbGssCisJJnBjaWVfb2NjX2NsaywKKwkmc2dtaWlfb2NjX2NsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBjMmtfY2xrc3JlZ1tdID0geworCXsgLmNsayA9ICZjbGtfcGxsMCwgICAgICAgICAuY29uX2lkID0gInBsbDAifSwKKwl7IC5jbGsgPSAmY2xrX3BsbDEsICAgICAgICAgLmNvbl9pZCA9ICJwbGwxIn0sCisJeyAuY2xrID0gJmNsa19wbGwyLCAgICAgICAgIC5jb25faWQgPSAicGxsMiJ9LAorCXsgLmNsayA9ICZjbGtfcGxsMywgICAgICAgICAuY29uX2lkID0gInBsbDMifSwKKwl7IC5jbGsgPSAmdWFydF9jbGssICAgICAgICAgLmNvbl9pZCA9ICJ1YXJ0In0sCisJeyAuY2xrID0gJkRVU19jbGssICAgICAgICAgIC5jb25faWQgPSAiRFVTIn0sCisJeyAuY2xrID0gJmdlbXR4X2NsaywgICAgICAgIC5jb25faWQgPSAiZ2VtdHgifSwKKwl7IC5jbGsgPSAmaXBzZWNfZWFwZV9jbGssICAgLmNvbl9pZCA9ICJpcHNlY19lYXBlIn0sCisJeyAuY2xrID0gJmlwc2VjX3NwYWNjX2NsaywgIC5jb25faWQgPSAiaXBzZWNfc3BhY2MifSwKKwl7IC5jbGsgPSAmZHBpX2NpZV9jbGssICAgICAgLmNvbl9pZCA9ICJkcGlfY2llIn0sCisJeyAuY2xrID0gJmRwaV9kZWNvbXBfY2xrLCAgIC5jb25faWQgPSAiZHBpX2RlY29tcCJ9LAorCXsgLmNsayA9ICZkZHJfY2xrLCAgICAgICAgICAuY29uX2lkID0gImRkciJ9LAorCXsgLmNsayA9ICZhcm1fY2xrLCAgICAgICAgICAuY29uX2lkID0gImFybSJ9LAorCXsgLmNsayA9ICZsMmNjX2NsaywgICAgICAgICAuY29uX2lkID0gImwyY2MifSwKKwl7IC5jbGsgPSAmYXhpX2NsaywgICAgICAgICAgLmNvbl9pZCA9ICJheGkifSwKKwl7IC5jbGsgPSAmYXJtX3BlcmlfY2xrLCAgICAgLmNvbl9pZCA9ICJhcm1fcGVyaSJ9LAorCXsgLmNsayA9ICZoZmVfY29yZV9jbGssICAgICAuY29uX2lkID0gImhmZV9jb3JlIn0sCisJeyAuY2xrID0gJnNwaV9pMmNfY2xrLCAgICAgIC5jb25faWQgPSAic3BpX2kyYyJ9LAorCXsgLmNsayA9ICZ0ZG1OVEdfY2xrLCAgICAgICAuY29uX2lkID0gIm50Z3JlZiJ9LAorCXsgLmNsayA9ICZwY2llMF9jbGssICAgICAgICAuY29uX2lkID0gInBjaWUwIn0sCisJeyAuY2xrID0gJnBjaWUxX2NsaywgICAgICAgIC5jb25faWQgPSAicGNpZTEifSwKKwl7IC5jbGsgPSAmdXNiMF9jbGssICAgICAgICAgLmNvbl9pZCA9ICJ1c2IwIn0sCisJeyAuY2xrID0gJnVzYjFfY2xrLCAgICAgICAgIC5jb25faWQgPSAidXNiMSJ9LAorCXsgLmNsayA9ICZzYXRhX2NsaywgICAgCSAgICAuY29uX2lkID0gInNhdGEifSwKKwl7IC5jbGsgPSAmc2F0YV9vb2JfY2xrLCAgICAgLmNvbl9pZCA9ICJzYXRhX29vYiJ9LAorCXsgLmNsayA9ICZzYXRhX3BtdV9jbGssICAgICAuY29uX2lkID0gInNhdGFfcG11In0sCisJeyAuY2xrID0gJmV4dF9waHkwX2NsaywgICAgIC5jb25faWQgPSAiZXh0X3BoeTAifSwKKwl7IC5jbGsgPSAmZXh0X3BoeTFfY2xrLCAgICAgLmNvbl9pZCA9ICJleHRfcGh5MSJ9LAorCXsgLmNsayA9ICZleHRfcGh5Ml9jbGssICAgICAuY29uX2lkID0gImV4dF9waHkyIn0sCisJeyAuY2xrID0gJnRwaV9jbGssICAgICAJICAgIC5jb25faWQgPSAidHBpIn0sCisJeyAuY2xrID0gJmNzeXNfY2xrLCAgICAgICAgIC5jb25faWQgPSAiY3N5cyJ9LAorCXsgLmNsayA9ICZ0c3VudGdfY2xrLCAgICAgICAuY29uX2lkID0gInRzdW50ZyJ9LAorCXsgLmNsayA9ICZzYXRhX29jY19jbGssICAgICAuY29uX2lkID0gInNhdGFfb2NjIn0sCisJeyAuY2xrID0gJnBjaWVfb2NjX2NsaywgICAgIC5jb25faWQgPSAicGNpZV9vY2MifSwKKwl7IC5jbGsgPSAmc2dtaWlfb2NjX2NsaywgICAgLmNvbl9pZCA9ICJzZ21paV9vY2MifSwKK307CisKKy8qIEluaXRpbGl6ZSBhbGwgdGhlIGF2YWlsYWJsZSBjbG9ja3MgKi8KK2ludCBjbGtfaW5pdCh2b2lkKXsKKyAgICAgICAgc3RydWN0IGNsayAqKmNsa3A7CisJaW50IHBsbF9ubzsKKworCXNwaW5fbG9ja19pbml0KCZjbG9ja19sb2NrKTsKKworICAgICAgICAvKiBEZXRlcm1pbmUgdGhlIGJhcmVib3ggY29uZmlndXJlZCBwbGwwLHBsbDEscGxsMixwbGwzIHJhdGUgdmFsdWUgKi8KKyAgICAgICAgY2xrX3BsbDAucmF0ZSA9IEhBTF9nZXRfcGxsX2ZyZXEoUExMMCk7CisgICAgICAgIGNsa19wbGwxLnJhdGUgPSBIQUxfZ2V0X3BsbF9mcmVxKFBMTDEpOworICAgICAgICBjbGtfcGxsMi5yYXRlID0gSEFMX2dldF9wbGxfZnJlcShQTEwyKTsKKyAgICAgICAgY2xrX3BsbDMucmF0ZSA9IEhBTF9nZXRfcGxsX2ZyZXEoUExMMyk7CisKKwkvKiBTZXQgdGhlIE5URyByZWYgY2xvY2sgdG8gUExMIHNyYyAoZ2VtdHggUExMIHNvdXJjZSkKKwkgKiBDdXJyZW50bHkgaXQgaXMgbm90IHNldCBmcm9tIGJhcmVib3gsc2V0IGhlcmUuCisJKi8KKwlwbGxfbm8gPSBIQUxfZ2V0X2Nsb2NrX3BsbF9zb3VyY2UoZ2VtdHhfY2xrLmNsa2dlbl9yZWcpOworCUhBTF9zZXRfY2xvY2tfcGxsX3NvdXJjZSh0ZG1OVEdfY2xrLmNsa2dlbl9yZWcscGxsX25vKTsKKworICAgICAgICBwcl9pbmZvKCJQTEwwIHJ1bm5pbmcgYXQgJWxkIE1IeiwgUExMMSBhdCAlbGQgTUh6IFBMTDIgcnVubmluZyBhdCAlbGQgTUh6IFBMTDMgcnVubmluZyBhdCAlbGQgTUh6XG4iLAorICAgICAgICAgICAgICAgIGNsa19wbGwwLnJhdGUvMTAwMDAwMCwgY2xrX3BsbDEucmF0ZS8xMDAwMDAwLCBjbGtfcGxsMi5yYXRlLzEwMDAwMDAsIGNsa19wbGwzLnJhdGUvMTAwMDAwMCk7CisgICAgICAgIC8qIEluaXRpbGl6YXRpb24gb2YgQ2xvY2tzIHByZXNlbnQgaW4gQzJrIGRldmljZSAqLworICAgICAgICBmb3IgKGNsa3AgPSBjMmtfY2xrczsgY2xrcCA8IGMya19jbGtzICsgQVJSQVlfU0laRShjMmtfY2xrcyk7Y2xrcCsrKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGNsayAqY2xrID0gKmNsa3A7CisJCS8qIFNldHRpbmcgdGhlIHBhcmVudCBjbG9jayBpbiB0aGUgaW5pdAorCQkgKiBPbmx5IHRvIHRob3NlIHdobyBjYW4gYmUgY29uZmlndXJlZCB3aXRoIFBMTCBzb3VyY2UKKwkJICovCisJCWlmICghY2xrLT5wYXJlbnQpeworCQkJaWYgKGNsay0+Y2xrZ2VuX3JlZyl7IC8qIFRoaXMgY2hlY2sgaXMgZm9yIG5vdCB0byBzZXQgcGFyZW50IGZvciBQTExTICovCisJCQkJcGxsX25vID0gSEFMX2dldF9jbG9ja19wbGxfc291cmNlKGNsay0+Y2xrZ2VuX3JlZyk7CisJCQkJc3dpdGNoIChwbGxfbm8pCisJCQkJeworCQkJCQljYXNlIFBMTDA6CisJCQkJCQljbGtfc2V0X3BhcmVudChjbGssJmNsa19wbGwwKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFBMTDE6CisJCQkJCQljbGtfc2V0X3BhcmVudChjbGssJmNsa19wbGwxKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIFBMTDI6CisJCQkJCQljbGtfc2V0X3BhcmVudChjbGssJmNsa19wbGwyKTsKKwkJCQkJCWJyZWFrOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisgICAgICAgIAkvKiBHZXQgVGhlIERldmljZSBDbG9jayBSYXRlIFZhbHVlcyAqLworCQlpZiAoIGNsay0+Z2V0X3JhdGUpCisJCQljbGstPnJhdGU9Y2xrLT5nZXRfcmF0ZShjbGspOworICAgICAgICAgICAgICAgIHByX2RlYnVnKCIlczogY2xvY2sgJXMsIHJhdGUgJWxkXG4iLF9fZnVuY19fLCBjbGstPm5hbWUsIGNsay0+cmF0ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDcmVhdGlvbiBvZiBDbG9jayBEZXZpY2UgVHJlZSAqLworICAgICAgICBjbGtkZXZfYWRkX3RhYmxlKGMya19jbGtzcmVnLCBBUlJBWV9TSVpFKGMya19jbGtzcmVnKSk7CisJcmV0dXJuIDA7CisKK30KK0VYUE9SVF9TWU1CT0woY2xrX2luaXQpOworCisvKgorICogRGlzYWJsZSBhbnkgdW51c2VkIGNsb2NrcyBsZWZ0IG9uIGJ5IHRoZSBib290bG9hZGVyKEJhcmVib3gpCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGNsa19kaXNhYmxlX3VudXNlZCh2b2lkKQoreworICAgICAgICBzdHJ1Y3QgY2xrICoqY2xrcDsKKworICAgICAgICBmb3IgKGNsa3AgPSBjMmtfY2xrczsgY2xrcCA8IGMya19jbGtzICsgQVJSQVlfU0laRShjMmtfY2xrcyk7Y2xrcCsrKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGNsayAqY2xrID0gKmNsa3A7CisJCWlmIChjbGstPnVzZWNvdW50ID4gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZJWE1FIEN1cnJlbnRseSB0aGVyZSBpcyBubyBjbG9jayBGVyBzdXBwb3J0IGZvciB0aGUKKyAgICAgICAgICAgICAgICAgKiBmb2xsb3dpbmcgY2xvY2tzIGluIGNvcnJlc3BvbmRpbmcgZHJpdmVyIC4gU28gc2tpcHBpbmcgdGhlc2UKKwkJICogY2xvY2tzIGZyb20gYnkgZGVmYXVsdCBkaXNhYmxlIHN0YXRlLgorICAgICAgICAgICAgICAgICAqIEFsbCBvdGhlciB1bnVzZWQgY2xvY2tzIHdpbGwgYmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgICAgKi8KKwkJaWYgKCBzdHJjbXAoY2xrLT5uYW1lLCAiaGZlX2NvcmUiKSAmJgorCQkJCXN0cmNtcChjbGstPm5hbWUsICJpcHNlY19lYXBlIikgJiYKKwkJCQlzdHJjbXAoY2xrLT5uYW1lLCAicGxsMyIpICYmCisJCQkJc3RyY21wKGNsay0+bmFtZSwgImFybV9wZXJpIikgKQorCQl7CisJCQlwcl9pbmZvKCJDbG9ja3M6IGRpc2FibGVkIHVudXNlZCAlc1xuIiwgY2xrLT5uYW1lKTsKKwkJCV9fY2xrX2Rpc2FibGVfdW51c2VkKGNsayk7CisJCX0KKwl9CisgICAgICAgIHJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChjbGtfZGlzYWJsZV91bnVzZWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9jb21jZXJ0by0yMDAwLmMgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2NvbWNlcnRvLTIwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWIwY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9jb21jZXJ0by0yMDAwLmMKQEAgLTAsMCArMSwxMDI3IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY29tY2VydG8vY29tY2VydG8tMjAwMC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9wbXUuaD4KKyNpbmNsdWRlIDxtYWNoL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpb19kcml2ZXIuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NtcF90d2QuaD4KKyNpbmNsdWRlIDxhc20vbG9jYWx0aW1lci5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAuaD4KKyNpbmNsdWRlIDxsaW51eC9haGNpX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bWFjaC9zZXJkZXMtYzIwMDAuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bWFjaC9jb21jZXJ0by0yMDAwL2Nsb2NrLmg+CisjaW5jbHVkZSA8bWFjaC9jb21jZXJ0by0yMDAwL3BtLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisKK3N0cnVjdCBjMmtfZ3Bpb19waW5fc3RhdF9pbmZvIGMya19ncGlvX3Bpbl9zdGF0ID0KK3sKKwkuYzJrX2dwaW9fcGluc18wXzMxID0gMHgwLAorCS5jMmtfZ3Bpb19waW5zXzMyXzYzID0gMHgwLAorfTsKKworI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCit2b2lkIF9faW9tZW0gKmwyY2FjaGVfYmFzZTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgVmlydHVhbCBhZGRyZXNzIE1hcHBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgY29tY2VydG9faW9fZGVzY1tdIF9faW5pdGRhdGEgPQoreworI2lmZGVmIENPTkZJR19DT01DRVJUT19NU1AKKwl7CisJCS52aXJ0dWFsICAgID0gQ09NQ0VSVE9fTVNQX1ZBRERSLAorCQkucGZuICAgICAgICA9IF9fcGh5c190b19wZm4oQ09NQ0VSVE9fTVNQX0REUl9CQVNFKSwKKwkJLmxlbmd0aCAgICAgPSBDT01DRVJUT19NU1BfRERSX1NJWkVfQ0IsCisJCS50eXBlICAgICAgID0gTVRfTVNQCisJfSwKKwl7CisJCS52aXJ0dWFsICAgID0gKENPTUNFUlRPX01TUF9WQUREUiArIENPTUNFUlRPX01TUF9ERFJfU0laRV9DQiksCisJCS5wZm4gICAgICAgID0gX19waHlzX3RvX3BmbihDT01DRVJUT19NU1BfRERSX0JBU0UgKyBDT01DRVJUT19NU1BfRERSX1NJWkVfQ0IpLAorCQkubGVuZ3RoICAgICA9IENPTUNFUlRPX01TUF9ERFJfU0laRV9OQ05CLAorCQkudHlwZSAgICAgICA9IE1UX01TUF9OQ05CCisJfSwKKyAgICAgICB7CisgICAgICAgICAgICAgICAudmlydHVhbCAgICA9IENPTUNFUlRPX1BGRV9WQUREUiwKKyAgICAgICAgICAgICAgIC5wZm4gICAgICAgID0gX19waHlzX3RvX3BmbihDT01DRVJUT19QRkVfRERSX0JBU0UpLAorICAgICAgICAgICAgICAgLmxlbmd0aCAgICAgPSBDT01DRVJUT19QRkVfRERSX1NJWkUsCisgICAgICAgICAgICAgICAudHlwZSAgICAgICA9IE1UX0RFVklDRQorICAgICAgIH0sCisgICAgICAgeworICAgICAgICAgICAgICAgLnZpcnR1YWwgICAgPSBDT01DRVJUT19QRkVfQVhJX1ZBRERSLAorICAgICAgICAgICAgICAgLnBmbiAgICAgICAgPSBfX3BoeXNfdG9fcGZuKENPTUNFUlRPX0FYSV9QRkVfQkFTRSksCisgICAgICAgICAgICAgICAubGVuZ3RoICAgICA9IENPTUNFUlRPX0FYSV9QRkVfU0laRSwKKyAgICAgICAgICAgICAgIC50eXBlICAgICAgID0gTVRfREVWSUNFCisgICAgICAgfSwKKyNlbmRpZiAgLyogQ09ORklHX0NPTUNFUlRPX01TUCAqLworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC52aXJ0dWFsICAgID0gQ09NQ0VSVE9fQVhJX1BDSWUwX1ZBRERSX0JBU0UsCisgICAgICAgICAgICAgICAgLnBmbiAgICAgICAgPSBfX3BoeXNfdG9fcGZuKENPTUNFUlRPX0FYSV9QQ0llMF9CQVNFKSwKKyAgICAgICAgICAgICAgICAubGVuZ3RoICAgICA9IFNaXzE2TSwKKyAgICAgICAgICAgICAgICAudHlwZSAgICAgICA9IE1UX0RFVklDRQorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAgICAgLnZpcnR1YWwgICAgPSBDT01DRVJUT19BWElfUENJZTFfVkFERFJfQkFTRSwKKyAgICAgICAgICAgICAgICAucGZuICAgICAgICA9IF9fcGh5c190b19wZm4oQ09NQ0VSVE9fQVhJX1BDSWUxX0JBU0UpLAorICAgICAgICAgICAgICAgIC5sZW5ndGggICAgID0gU1pfMTZNLAorICAgICAgICAgICAgICAgIC50eXBlICAgICAgID0gTVRfREVWSUNFCisgICAgICAgIH0sCisjZW5kaWYKKwl7CisJCS52aXJ0dWFsICAgID0gQ09NQ0VSVE9fU0NVX1ZBRERSLAorCQkucGZuICAgICAgICA9IF9fcGh5c190b19wZm4oQ09NQ0VSVE9fU0NVX0JBU0UpLAorCQkubGVuZ3RoICAgICA9IFNaXzEyOEssCisJCS50eXBlICAgICAgID0gTVRfREVWSUNFCisJfSwKKwl7CisJCS52aXJ0dWFsICAgID0gSVJBTV9NRU1PUllfVkFERFIsCisJCS5wZm4gICAgICAgID0gX19waHlzX3RvX3BmbihDT01DRVJUT19BWElfSVJBTV9CQVNFKSwKKwkJLmxlbmd0aCAgICAgPSBJUkFNX01FTU9SWV9TSVpFLAorCQkudHlwZSAgICAgICA9IE1UX0RFVklDRQorCX0sCisJeworCQkudmlydHVhbCAgICA9IENPTUNFUlRPX0FQQl9WQUREUiwKKwkJLnBmbiAgICAgICAgPSBfX3BoeXNfdG9fcGZuKENPTUNFUlRPX0FYSV9BUEJfQkFTRSksCisJCS5sZW5ndGggICAgID0gQ09NQ0VSVE9fQVBCX1NJWkUsCisJCS50eXBlICAgICAgID0gTVRfREVWSUNFCisJfSwKKwl7CisJCS52aXJ0dWFsCT0gQ09NQ0VSVE9fQVhJX1VBUlRfU1BJX1ZBRERSLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQ09NQ0VSVE9fQVhJX1VBUlRfU1BJX0JBU0UpLAorCQkubGVuZ3RoIAk9IENPTUNFUlRPX0FYSV9VQVJUX1NQSV9TSVpFLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorCXsKKwkJLnZpcnR1YWwJPSBDT01DRVJUT19ERUNUX1ZBRERSLAorCQkucGZuCQk9IF9fcGh5c190b19wZm4oQ09NQ0VSVE9fQVhJX0RFQ1RfQkFTRSksCisJCS5sZW5ndGgJCT0gMiAqIFNaXzFNLAorCQkudHlwZQkJPSBNVF9ERVZJQ0UKKwl9LAorCXsKKwkJLnZpcnR1YWwgICAgPSBDT01DRVJUT19TRU1BX1ZBRERSLAorCQkucGZuICAgICAgICA9IF9fcGh5c190b19wZm4oQ09NQ0VSVE9fQVhJX1NFTUFfQkFTRSksCisJCS5sZW5ndGggICAgID0gU1pfMTZNLAorCQkudHlwZSAgICAgICA9IE1UX0RFVklDRQorCX0sCit9OworCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQorI2RlZmluZSBQRkVfRE1BX1NJWkUJCSg0ICogU1pfMU0pCisjZWxzZQorI2RlZmluZSBQRkVfRE1BX1NJWkUgICAgICAgICAgICAoMTYgKiBTWl8xTSkKKyNlbmRpZgorCisjZGVmaW5lIERTUEdfREVDVF9DU1NfRE1BX1NJWkUJKDEwICogU1pfMU0pCisKK3ZvaWQgX19pbml0IGRldmljZV9tYXBfaW8odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBQRkVfRE1BX1NJWkU7CisKKyNpZiBkZWZpbmVkKENPTkZJR19EU1BHX0RFQ1RfQ1NTKQorCXNpemUgKz0gRFNQR19ERUNUX0NTU19ETUFfU0laRTsKKyNlbmRpZgorCisJaW90YWJsZV9pbml0KGNvbWNlcnRvX2lvX2Rlc2MsIEFSUkFZX1NJWkUoY29tY2VydG9faW9fZGVzYykpOworCisJLyogSW5jcmVhc2UgY29uc2lzdGVudCBETUEgem9uZSBzaXplICovCisJaW5pdF9jb25zaXN0ZW50X2RtYV9zaXplKHNpemUpOworfQorCisKK3ZvaWQgX19pbml0IGRldmljZV9pcnFfaW5pdCh2b2lkKQoreworCWdpY19pbml0KDAsIFNHSV9JUlEoMSksICh2b2lkICopQ09NQ0VSVE9fR0lDX0RJU1RfVkFERFIsICh2b2lkICopQ09NQ0VSVE9fR0lDX0NQVV9WQUREUik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBHUElPCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIF9faW5pdCB2b2lkIGdwaW9faW5pdCh2b2lkKQoreworCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fVUFSVDFfU1VQUE9SVCkKKwl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT19NSVNDX1BJTl9TRUxFQ1QpICYgfjB4MywgQ09NQ0VSVE9fR1BJT19NSVNDX1BJTl9TRUxFQ1QpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19VQVJUMF9TVVBQT1JUKQorCXdyaXRlbCgocmVhZGwoQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRykgJiB+VUFSVDBfR1BJTykgfCBVQVJUMF9CVVMsIENPTUNFUlRPX0dQSU9fUElOX1NFTEVDVF9SRUcpOworCWMya19ncGlvX3Bpbl9zdGF0LmMya19ncGlvX3BpbnNfMF8zMSB8PSBVQVJUMF9HUElPX1BJTjsgLyogR1BJT3MgOCB0byAxMSBhcmUgdXNlZCBmb3IgVUFSVDAgKi8KKyNlbmRpZgorCisJLyoKKwkgKiBDb25maWd1cmUgZWFjaCBHUElPIHRvIGJlIE91dHB1dCBvciBJbnB1dAorCSAqIFdoZW4gSW5wdXQsIENvbmZpZ3VyZSB0byBiZSBJbnB1dCwgSVJRCisJICogV2hlbiBJbnB1dCBJUlEsIENvbmZpZ3VyZSB0byBiZSBJUlEgUmlzaW5nIEVkZ2Ugb3IgSVJRIGZhbGxpbmcgRWRnZQorCSAqLworCisJLypbRklYTUVdOiBHUElPIE91dHB1dCwgb3RoZXJzIGFyZSBpbnB1dCovCisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKENPTUNFUlRPX0dQSU9fT0VfUkVHKSB8IENPTUNFUlRPX09VVFBVVF9HUElPLCBDT01DRVJUT19HUElPX09FX1JFRyk7CisKKwkvKltGSVhNRV06IEdQSU8gSVJRIENvbmZpZ3VyYXRpb24gKi8KKwlfX3Jhd193cml0ZWwoQ09NQ0VSVE9fSVJRX1JJU0lOR19FREdFX0dQSU8sIENPTUNFUlRPX0dQSU9fSU5UX0NGR19SRUcpOworCisjaWYgIWRlZmluZWQoQ09ORklHX0MyS19NRkNOX0VWTSkKKwkvKiBbRklYTUVdOiBOZWVkIHRvIGhhdmUgcHJvcGVyIGRlZmluZXMgZm9yIGVuYWJsaW5nIHRoZSBHUElPIGlycSAqLworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChDT01DRVJUT19HUElPX09FX1JFRykgICAgIHwgKDB4MSA8PCA1KSwgQ09NQ0VSVE9fR1BJT19PRV9SRUcpOwkJLy8gZW5hYmxlIEdQSU81IChTTElDX1JFU0VUX24pIGFzIG91dHB1dAorCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChDT01DRVJUT19HUElPX09VVFBVVF9SRUcpIHwgKDB4MSA8PCA1KSwgQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHKTsgICAgIC8vIGNsZWFyIHJlc2V0CisJdWRlbGF5KDE1KTsKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHKSAmIH4oMHgxIDw8IDUpLCBDT01DRVJUT19HUElPX09VVFBVVF9SRUcpOwkvLyBwdXQgaW4gcmVzZXQKKwl1ZGVsYXkoMTUpOworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChDT01DRVJUT19HUElPX09VVFBVVF9SRUcpIHwgKDB4MSA8PCA1KSwgQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHKTsgCS8vIGNsZWFyIHJlc2V0IGFmdGVyIHNvbWUgdGltZQorI2VuZGlmCisJX19yYXdfd3JpdGVsKDB4NCwgQ09NQ0VSVE9fR1BJT19JTlRfQ0ZHX1JFRyk7IC8qIHNpMzIyNyBpcyBmYWxsaW5nIGVkZ2UgaW50ZXJydXB0KGdwaW8xKSAqLworCisKKwkvKiBbRklYTUVdOiBBcmUgcGlucyBHUElPIG9yIHBpbnMgdXNlZCBieSBhbm90aGVyIGJsb2NrKi8KKwkvL19fcmF3X3dyaXRlbChDT01DRVJUT19HUElPX1BJTl9VU0FHRSwgQ09NQ0VSVE9fR1BJT19JT0NUUkxfUkVHKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIEV4cGFuc2lvbiBCdXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qVGhpcyB2YXJpYWJsZSBpcyBwcm92aWRlZCBieSB0aGUgYm9hcmQgZmlsZSovCitleHRlcm4gaW50IGNvbWNlcnRvX2V4cF92YWx1ZXNbNV1bN107CisKK3N0YXRpYyBfX2luaXQgdm9pZCBleHBfYnVzX2luaXQodm9pZCkKK3sKKwlpbnQgY3M7CisJdTMyIGNzX2VuYWJsZTsKKwl1bnNpZ25lZCBpbnQgYXhpX2NsaywgY2xrX2RpdjsKKwlzdHJ1Y3QgY2xrICpjbGtfYXhpOworCisJLypGaXJzdCwgUmVzZXQgdGhlIEV4cGFuc2lvbiBibG9jayovCisJX19yYXdfd3JpdGVsKDB4MSwgQ09NQ0VSVE9fRVhQX1NXX1JTVF9SKTsKKworCXdoaWxlIChyZWFkbChDT01DRVJUT19FWFBfU1dfUlNUX1IpICYgMHgxKSA7CisKKwkvKiBDbG9jayBkaXZpZGVyIGNvbmZpZ3VyYXRpb24sIGdldCB0aGUgQVhJIGNsb2NrIGZpcnN0CisJICogQVhJIGNsb2NrIHdpbGwgYmUgdXNlZCBmb3IgcmVmZXJuY2UgY291bnQgLCBhcyBleHAgYnVzCisgICAgICAgICAqIGFsc28gaGF2ZSBhIGRlcGVuZGFuY3kgd2l0aCBBWEkuCisJKi8KKyAgICAgICAgY2xrX2F4aSA9IGNsa19nZXQoTlVMTCwiYXhpIik7CisKKwlpZiAoSVNfRVJSKGNsa19heGkpKSB7CisJCXByX2VycigiY29tY2VydG9fRGV2aWNlX2luaXQ6IFVuYWJsZSB0byBvYnRhaW4gYXhpIGNsb2NrOiAlbGRcbiIsUFRSX0VSUihjbGtfYXhpKSk7CisJfQorCisJLypFbmFibGUgdGhlIEFYSSBjbG9jayAqLworCWlmIChjbGtfZW5hYmxlKGNsa19heGkpKXsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIGVuYWJsZSBheGkgY2xvY2s6XG4iLF9fZnVuY19fKTsKKwl9CisKKyAgICAgICAgLyogR2V0IHRoZSBBWEkgY2xvY2sgcmF0ZSBpbiBIWiAqLworICAgICAgICBheGlfY2xrID0gY2xrX2dldF9yYXRlKGNsa19heGkpOworCS8qIFJvdW5kIGRpdmlkZXIgdXAgKi8KKwljbGtfZGl2ID0gKGF4aV9jbGsgKyBDT01DRVJUT19FWFBDTEsgLSAxKSAvIENPTUNFUlRPX0VYUENMSzsKKworCV9fcmF3X3dyaXRlbChjbGtfZGl2LCBDT01DRVJUT19FWFBfQ0xPQ0tfRElWX1IpOworCisJY3NfZW5hYmxlID0gMDsKKwlmb3IgKGNzID0gMDsgY3MgPCA1OyBjcysrKSB7CisJCS8qY29uZmlndXJlIG9ubHkgZW5hYmxlZCBDUyAqLworCQl7CisJCQlpZiAoY29tY2VydG9fZXhwX3ZhbHVlc1tjc11bMF0gPT0gMSkKKwkJCQljc19lbmFibGUgfD0gRVhQX0NTeF9FTihjcyk7CisKKwkJCS8qbW9kZSBjb25maWd1cmF0aW9uKi8KKwkJCV9fcmF3X3dyaXRlbChjb21jZXJ0b19leHBfdmFsdWVzW2NzXVszXSwgQ09NQ0VSVE9fRVhQX0NTeF9DRkdfUihjcykpOworCisJCQkvKkNoaXAgc2VsZWN0IEJhc2UgY29uZmlndXJhdGlvbiAoc3RhcnQgb2YgYWRkcmVzcyBzcGFjZSkqLworCQkJX19yYXdfd3JpdGVsKGNvbWNlcnRvX2V4cF92YWx1ZXNbY3NdWzFdLCBDT01DRVJUT19FWFBfQ1N4X0JBU0VfUihjcykpOworCisJCQkvKkNoaXAgc2VsZWN0IFNlZ21lbnQgc2l6ZSBjb25maWd1cmF0aW9uIChlbmQgb2YgYWRkcmVzcyBzcGFjZSkqLworCQkJX19yYXdfd3JpdGVsKGNvbWNlcnRvX2V4cF92YWx1ZXNbY3NdWzJdLCBDT01DRVJUT19FWFBfQ1N4X1NFR19SKGNzKSk7CisKKwkJCS8qQ2hpcCBzZWxlY3QgdGltaW5nIGNvbmZpZ3VyYXRpb24qLworCQkJLyogW0ZJWE1FXSA6IFVzaW5nIGRlZmF1bHQgdGltaW5nIHZhbHVlcyAqLworCQkJX19yYXdfd3JpdGVsKGNvbWNlcnRvX2V4cF92YWx1ZXNbY3NdWzRdLCBDT01DRVJUT19FWFBfQ1N4X1RNRzFfUihjcykpOworCQkJX19yYXdfd3JpdGVsKGNvbWNlcnRvX2V4cF92YWx1ZXNbY3NdWzVdLCBDT01DRVJUT19FWFBfQ1N4X1RNRzJfUihjcykpOworCQkJX19yYXdfd3JpdGVsKGNvbWNlcnRvX2V4cF92YWx1ZXNbY3NdWzZdLCBDT01DRVJUT19FWFBfQ1N4X1RNRzNfUihjcykpOworCQl9CisJfQorCisJLypDaGlwIFNlbGVjdCBhY3RpdmF0aW9uKi8KKwlfX3Jhd193cml0ZWwoRVhQX0NMS19FTiB8IGNzX2VuYWJsZSwgQ09NQ0VSVE9fRVhQX0NTX0VOX1IpOworfQorCitzdGF0aWMgdTMyIGFybXY3X2F1eF9jdHJsX3JlYWQodm9pZCkKK3sKKwl1MzIgdmFsOworCisJYXNtIHZvbGF0aWxlICgibXJjIHAxNSwgMCwgJTAsIGMxLCBjMCwgMSIgOiAiPXIiKHZhbCkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiQVJNdjcgQVVYIENUUkwoJWQpOiAlI3hcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgdmFsKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGFybXY3X2F1eF9jdHJsX3dyaXRlKHUzMiB2YWwpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiQVJNdjcgQVVYIENUUkwoJWQpOiAlI3hcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgdmFsKTsKKwlhc20gdm9sYXRpbGUgKCJtY3IgcDE1LCAwLCAlMCwgYzEsIGMwLCAxIiA6IDogInIiKHZhbCkpOworfQorCitzdGF0aWMgdm9pZCBhcm12N19hdXhfY3RybF9zZXR1cCh2b2lkICppbmZvKQoreworCXUzMiBhdXhfY3RybDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJYXV4X2N0cmwgPSBhcm12N19hdXhfY3RybF9yZWFkKCk7CisKKyNpZmRlZiBDT05GSUdfUEwzMTBfRlVMTF9MSU5FX09GX1pFUk8KKwlhdXhfY3RybCB8PSAoMSA8PCAzKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BMMzEwX0VYQ0xVU0lWRV9DQUNIRQorCWF1eF9jdHJsIHw9ICgxIDw8IDcpOworI2VuZGlmCisKKwlhcm12N19hdXhfY3RybF93cml0ZShhdXhfY3RybCk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAordm9pZCBsMngwX2xhdGVuY3kodTMyIHRhZ19yYW1fc2V0dXBfbGF0LCB1MzIgdGFnX3JhbV9yZF9sYXQsIHUzMiB0YWdfcmFtX3dyX2xhdCwgdTMyIGRhdGFfcmFtX3NldHVwX2xhdCwgdTMyIGRhdGFfcmFtX3JkX2xhdCwgdTMyIGRhdGFfcmFtX3dyX2xhdCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKCh0YWdfcmFtX3dyX2xhdCAtIDEpIDw8IENPTUNFUlRPX0wyQ0NfV1JfTEFUX1NISUZUKSB8ICgodGFnX3JhbV9yZF9sYXQgLSAxKSA8PCBDT01DRVJUT19MMkNDX1JEX0xBVF9TSElGVCkgfCAodGFnX3JhbV9zZXR1cF9sYXQgLSAxKTsKKwl3cml0ZWwodmFsLCBsMmNhY2hlX2Jhc2UgKyBMMlgwX1RBR19MQVRFTkNZX0NUUkwpOworCisJdmFsID0gKChkYXRhX3JhbV93cl9sYXQgLSAxKSA8PCBDT01DRVJUT19MMkNDX1dSX0xBVF9TSElGVCkgfCAoKGRhdGFfcmFtX3JkX2xhdCAtIDEpIDw8IENPTUNFUlRPX0wyQ0NfUkRfTEFUX1NISUZUKSB8IChkYXRhX3JhbV9zZXR1cF9sYXQgLSAxKTsKKwl3cml0ZWwodmFsLCBsMmNhY2hlX2Jhc2UgKyBMMlgwX0RBVEFfTEFURU5DWV9DVFJMKTsKK30KKwordm9pZCBjb21jZXJ0b19sMmNjX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgYXV4X3ZhbCwgYXV4X21hc2s7CisJdW5zaWduZWQgaW50IGFzc29jaWF0aXZpdHksIHdheXNpemU7CisjaWZkZWYgQ09ORklHX0wyWDBfSU5TVFJVQ1RJT05fT05MWQorCWludCBpOworI2VuZGlmCisKKworCWwyY2FjaGVfYmFzZSA9ICh2b2lkICopQ09NQ0VSVE9fTDMxMF9WQUREUjsKKwlCVUdfT04oIWwyY2FjaGVfYmFzZSk7CisKKwkvKiBTZXQgTGF0ZW5jeSBvZiBMMkNDIHRvIG1pbmltdW0gKGkuZS4gMSBjeWNsZSkgKi8KKwlsMngwX2xhdGVuY3koMSwgMSwgMSwgMSwgMSwgMSk7CisKKwkvKiBTZXQgTDIgYWRkcmVzcyBmaWx0ZXJpbmcsIHVzZSBMMkNDIE0xIHBvcnQgZm9yIEREUiBhY2Nlc3NlcyAqLworCXdyaXRlbCgweDgwMDAwMDAwLCBsMmNhY2hlX2Jhc2UgKyBMMlgwX0FERFJfRklMVEVSX0VORCk7CisJd3JpdGVsKDB4MDAwMDAwMDAgfCBMMlgwX0FERFJfRklMVEVSX0VOLCBsMmNhY2hlX2Jhc2UgKyBMMlgwX0FERFJfRklMVEVSX1NUQVJUKTsKKworCWFzc29jaWF0aXZpdHkgPSAoQ09NQ0VSVE9fTDJDQ19BU1NPQ0lBVElWSVRZXzhXQVkgPDwgQ09NQ0VSVE9fTDJDQ19BU1NPQ0lBVElWSVRZX1NISUZUKSAmIENPTUNFUlRPX0wyQ0NfQVNTT0NJQVRJVklUWV9NQVNLOworCXdheXNpemUgPSAoQ09NQ0VSVE9fTDJDQ19BU1NPQ0lBVElWSVRZXzMyS0IgPDwgQ09NQ0VSVE9fTDJDQ19XQVlTSVpFX1NISUZUKSAmIENPTUNFUlRPX0wyQ0NfV0FZU0laRV9NQVNLOworCWF1eF92YWwgPSBhc3NvY2lhdGl2aXR5IHwgd2F5c2l6ZTsKKwlhdXhfbWFzayA9IChDT01DRVJUT19MMkNDX0FTU09DSUFUSVZJVFlfTUFTSyB8IENPTUNFUlRPX0wyQ0NfV0FZU0laRV9NQVNLKTsKKworCS8qIFNoYXJlYWJsZSBhdHRyaWJ1dGUgb3ZlcnJpZGUgZW5hYmxlICovCisJLyogVGhpcyBwcmV2ZW50cyB0aGUgY2FjaGUgZnJvbSBjaGFuZ2luZyAibm9ybWFsIG1lbW9yeS9ub24tY2FjaGVhYmxlIiBhY2Nlc3NlcyB0bworCSJub3JtYWwgbWVtb3J5L2NhY2hlYWJsZS93cml0ZXRocm91Z2ggbm8gcmVhZC93cml0ZSBhbGxvY2F0ZSIqLworCWF1eF92YWwgfD0gKDEgPDwgMjIpOworCWF1eF9tYXNrIHw9ICgxIDw8IDIyKTsKKworCS8qIFdyaXRlIGFsbG9jYXRlIG92ZXJyaWRlLCBubyB3cml0ZSBhbGxvY2F0ZSAqLworCWF1eF92YWwgfD0gKDEgPDwgMjMpOworCWF1eF9tYXNrIHw9ICgzIDw8IDIzKTsKKworI2lmZGVmIENPTkZJR19QTDMxMF9GVUxMX0xJTkVfT0ZfWkVSTworCWF1eF92YWwgfD0gKDEgPDwgMCk7CisJYXV4X21hc2sgfD0gKDEgPDwgMCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QTDMxMF9FQVJMWV9XUklURV9SRVNQT05TRQorCWF1eF92YWwgfD0gKDEgPDwgMzApOworCWF1eF9tYXNrIHw9ICgxIDw8IDMwKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BMMzEwX1NUT1JFX0JVRkZFUl9ERVZJQ0VfTElNSVRBVElPTgorCWF1eF92YWwgfD0gKDEgPDwgMTEpOworCWF1eF9tYXNrIHw9ICgxIDw8IDExKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BMMzEwX0lOU1RSVUNUSU9OX1BSRUZFVENICisJYXV4X3ZhbCB8PSAoMSA8PCAyOSk7CisJYXV4X21hc2sgfD0gKDEgPDwgMjkpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUEwzMTBfREFUQV9QUkVGRVRDSAorCWF1eF92YWwgfD0gKDEgPDwgMjgpOworCWF1eF9tYXNrIHw9ICgxIDw8IDI4KTsKKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfUEwzMTBfRVhDTFVTSVZFX0NBQ0hFCisJYXV4X3ZhbCB8PSAoMSA8PCAxMik7CisJYXV4X21hc2sgfD0gKDEgPDwgMTIpOworI2VuZGlmCisKKwkvKiBMMiA4LXdheSBhc3NvY2lhdGl2aXR5IHdpdGggMzJLQiB3YXkgc2l6ZSAqLworCWwyeDBfaW5pdChsMmNhY2hlX2Jhc2UsIGF1eF92YWwsIGF1eF9tYXNrKTsKKworI2lmZGVmIENPTkZJR19MMlgwX0lOU1RSVUNUSU9OX09OTFkKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQl3cml0ZWxfcmVsYXhlZCgweGZmZmYsIGwyY2FjaGVfYmFzZSArIEwyWDBfTE9DS0RPV05fV0FZX0RfQkFTRSArIGkgKiBMMlgwX0xPQ0tET1dOX1NUUklERSk7CisKKwlvdXRlcl9mbHVzaF9hbGwoKTsKKyNlbmRpZgorCisJYXJtdjdfYXV4X2N0cmxfc2V0dXAoTlVMTCk7CisKKwlzbXBfY2FsbF9mdW5jdGlvbihhcm12N19hdXhfY3RybF9zZXR1cCwgTlVMTCwgMSk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NBVEEpCisKKyNkZWZpbmUgU0VSREVTX1BIWTEgICAgIDEKKyNkZWZpbmUgU0VSREVTX1BIWTIgICAgIDIKKworc3RhdGljIGludCBjb21jZXJ0b19haGNpX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkIF9faW9tZW0gKm1taW8pCit7CisJc3RydWN0IHNlcmRlc19yZWdzX3MgKnBfc2F0YV9waHlfcmVnX2ZpbGU7CisJaW50IHNlcmRlc19yZWdzX3NpemU7CisgICAgICAgIHUzMiB2YWw7CisJaW50IHJlZl9jbGtfMjQ7CisKKwkvKiBNb3ZlIFNBVEEgY29udHJvbGxlciB0byBERFJDMiBwb3J0ICovCisJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fRkFCUklDX0NUUkxfUkVHKSB8IDB4MiwgQ09NQ0VSVE9fR1BJT19GQUJSSUNfQ1RSTF9SRUcpOworCisJdmFsID0gcmVhZGwoQ09NQ0VSVE9fR1BJT19TWVNURU1fQ09ORklHKTsKKwlyZWZfY2xrXzI0ID0gdmFsICYgKEJJVF81X01TS3xCSVRfN19NU0spOworCisJaWYocmVmX2Nsa18yNCkKKwl7CisJCXBfc2F0YV9waHlfcmVnX2ZpbGUgPSAmc2F0YV9waHlfcmVnX2ZpbGVfMjRbMF07CisJCXNlcmRlc19yZWdzX3NpemUgPSBzaXplb2Yoc2F0YV9waHlfcmVnX2ZpbGVfMjQpOworCQlwcmludGsoS0VSTl9JTkZPICJTQVRBIFNlcmRlczogMjRNaHogcmVmIGNsa1xuIik7CisJfQorCWVsc2UKKwl7CisJCXBfc2F0YV9waHlfcmVnX2ZpbGUgPSAmc2F0YV9waHlfcmVnX2ZpbGVfNDhbMF07CisJCXNlcmRlc19yZWdzX3NpemUgPSBzaXplb2Yoc2F0YV9waHlfcmVnX2ZpbGVfNDgpOworCQlwcmludGsoS0VSTl9JTkZPICJTQVRBIFNlcmRlczogNDhNaHogcmVmIGNsa1xuIik7CisJfQorCisJLy9UYWtlIFNBVEEgQVhJIGRvbWFpbiBvdXQgb2YgcmVzZXQKKwljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX1NBVEEsMCk7CisJLy9CcmluZyBTQVRBIFBNVSBhbmQgT09CIG91dCBvZiByZXNldAorCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9TQVRBX1BNVSwwKTsKKwljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfU0FUQV9PT0IsMCk7CisKKyAgICAgICAgaWYgKCAodmFsICYgQk9PVF9TRVJERVMxX0NORl9TQVRBMCkgfHwgKCEodmFsICYgQk9PVF9TRVJERVMyX0NORl9TQVRBMSkpKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZhbCAmIEJPT1RfU0VSREVTMV9DTkZfU0FUQTApCisgICAgICAgICAgICAgICAgeworCQkJLy9CcmluZyBTZXJkZXMxIG91dCBvZiByZXNldAorCQkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1NFUkRFUzEsMCk7CisJCQkvL0JyaW5nIFNBVEEwIG91dCBvZiByZXNldAorCQkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1NFUkRFU19TQVRBMCwwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VyZGVzIEluaXRpYWxpemF0aW9uLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNlcmRlc19waHlfaW5pdChTRVJERVNfUEhZMSwgIHBfc2F0YV9waHlfcmVnX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJkZXNfcmVnc19zaXplIC8gc2l6ZW9mKHNlcmRlc19yZWdzX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RfREVWX1RZUEVfU0FUQSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBzZXJkZXMxICEhXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghKHZhbCAmIEJPT1RfU0VSREVTMl9DTkZfU0FUQTEpKQorICAgICAgICAgICAgICAgIHsKKwkJCS8vQnJpbmcgU2VyZGVzMiBvdXQgb2YgcmVzZXQKKwkJCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9TRVJERVMyLDApOworCQkJLy9CcmluZyBTQVRBMSBvdXQgb2YgcmVzZXQKKwkJCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9TRVJERVNfU0FUQTEsMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlcmRlcyBJbml0aWFsaXphdGlvbi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzZXJkZXNfcGh5X2luaXQoU0VSREVTX1BIWTIsICBwX3NhdGFfcGh5X3JlZ19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyZGVzX3JlZ3Nfc2l6ZSAvIHNpemVvZihzZXJkZXNfcmVnc190KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEX0RFVl9UWVBFX1NBVEEpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgc2VyZGVzMiAhIVxuIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1VBUlQwX1NVUFBPUlQpIHx8IGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1VBUlQxX1NVUFBPUlQpCisjZGVmaW5lIFVBUlRfRFdDX1VTUgkweDFGCitzdGF0aWMgaW50IGZhc3R1YXJ0X2hhbmRsZV9pcnEoc3RydWN0IHVhcnRfcG9ydCAqcCkKK3sKKwl1bnNpZ25lZCBpbnQgaWlyID0gcC0+c2VyaWFsX2luKHAsIFVBUlRfSUlSKTsKKwl1bnNpZ25lZCBpbnQgZHVtbXk7CisJaWYgKHNlcmlhbDgyNTBfaGFuZGxlX2lycShwLCBpaXIpKSB7CisJCXJldHVybiAxOworCX0gZWxzZSBpZiAoKGlpciAmIFVBUlRfSUlSX0JVU1kpID09IFVBUlRfSUlSX0JVU1kpIHsKKwkJLyogQ2xlYXIgdGhlIFVTUiAqLworCQlkdW1teSA9IHAtPnNlcmlhbF9pbihwLCBVQVJUX0RXQ19VU1IpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX3BtdV9yZXNvdXJjZXNbXSA9IHsKKwl7CisJCS5zdGFydAk9IElSUV9BOV9QTVUwLAorCQkuZW5kCT0gSVJRX0E5X1BNVTAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQJPSBJUlFfQTlfUE1VMSwKKwkJLmVuZAk9IElSUV9BOV9QTVUxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fcG11ID0geworCS5uYW1lCQk9ICJhcm0tcG11IiwKKwkuaWQJCT0gQVJNX1BNVV9ERVZJQ0VfQ1BVLAorCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShjb21jZXJ0b19wbXVfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UgPSBjb21jZXJ0b19wbXVfcmVzb3VyY2VzLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBTZXJpYWwgaW50ZXJmYWNlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1VBUlQwX1NVUFBPUlQpIHx8IGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1VBUlQxX1NVUFBPUlQpCitzdGF0aWMgc3RydWN0IHBsYXRfc2VyaWFsODI1MF9wb3J0IGNvbWNlcnRvX3VhcnRfZGF0YVtdID0geworI2lmZGVmIENPTkZJR19DT01DRVJUT19VQVJUMV9TVVBQT1JUCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubWFwYmFzZSAgICAgICAgPSBDT01DRVJUT19BWElfVUFSVDFfQkFTRSwKKwkJLm1lbWJhc2UJPSAodm9pZCAqKUNPTUNFUlRPX0FYSV9VQVJUMV9WQUREUiwKKyAgICAgICAgICAgICAgICAuaXJxICAgICAgICAgICAgPSBJUlFfVUFSVDEsCisJCS5oYW5kbGVfaXJxCT0gZmFzdHVhcnRfaGFuZGxlX2lycSwKKyAgICAgICAgICAgICAgICAuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9TS0lQX1RFU1QgfCBVUEZfSU9SRU1BUCwKKyAgICAgICAgICAgICAgICAuaW90eXBlICAgICAgICAgPSBVUElPX01FTSwKKyAgICAgICAgICAgICAgICAucmVnc2hpZnQgICAgICAgPSAyLAorICAgICAgICB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1VBUlQwX1NVUFBPUlQKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC5tYXBiYXNlICAgICAgICA9IENPTUNFUlRPX0FYSV9VQVJUMF9CQVNFLAorICAgICAgICAgICAgICAgIC5tZW1iYXNlICAgICAgICA9ICh2b2lkICopQ09NQ0VSVE9fQVhJX1VBUlQwX1ZBRERSLAorICAgICAgICAgICAgICAgIC5pcnEgICAgICAgICAgICA9IElSUV9VQVJUMCwKKwkJLmhhbmRsZV9pcnEJPSBmYXN0dWFydF9oYW5kbGVfaXJxLAorICAgICAgICAgICAgICAgIC5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9JT1JFTUFQLAorICAgICAgICAgICAgICAgIC5pb3R5cGUgICAgICAgICA9IFVQSU9fTUVNLAorICAgICAgICAgICAgICAgIC5yZWdzaGlmdCAgICAgICA9IDIsCisJfSwKKyNlbmRpZgorCXsKKwkJLmZsYWdzICAgICAgICAgID0gMCwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fdWFydCA9IHsKKwkubmFtZSAgICAgICA9ICJzZXJpYWw4MjUwIiwKKwkuaWQgICAgICAgICA9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9IGNvbWNlcnRvX3VhcnRfZGF0YSwKKwl9LAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX01TUAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b192ZWRfcmVzb3VyY2VzW10gPSB7CisJeworCQkubmFtZSAgPSAidm9pcCIsCisJCS5zdGFydCA9IENPTUNFUlRPX01TUF9ERFJfQkFTRSwKKwkJLmVuZCAgID0gQ09NQ0VSVE9fTVNQX0REUl9CQVNFICsgQ09NQ0VSVE9fTVNQX0REUl9TSVpFIC0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwl7CisJCS5uYW1lICA9ICJpcnEiLAorCQkuc3RhcnQgPSBJUlFfUFRQMCwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX3ZlZCA9IHsKKwkubmFtZSA9ICJ2ZWQiLAorCS5pZCA9IDAsCisJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX3ZlZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSA9IGNvbWNlcnRvX3ZlZF9yZXNvdXJjZXMsCit9OworI2VuZGlmICAvKiBDT05GSUdfQ09NQ0VSVE9fTVNQICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBVU0IgMy4wIEhvc3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19VU0IzX1NVUFBPUlQpCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX3VzYjNfcmVzb3VyY2VbXSA9IHsKKyAgICAgICAgWzBdID0geworICAgICAgICAgICAgICAgIC5zdGFydCAgPSBDT01DRVJUT19BWElfVVNCM1AwX0JBU0UsCisgICAgICAgICAgICAgICAgLmVuZCAgICA9IENPTUNFUlRPX0FYSV9VU0IzUDBfQkFTRSArIFNaXzhNIC0gMSwKKyAgICAgICAgICAgICAgICAuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisgICAgICAgIH0sCisgICAgICAgIFsxXSA9IHsKKyAgICAgICAgICAgICAgICAuc3RhcnQgID0gSVJRX1VTQjMsCisgICAgICAgICAgICAgICAgLmVuZCAgICA9IElSUV9VU0IzLAorICAgICAgICAgICAgICAgIC5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKyAgICAgICAgfSwKK307CisKK3N0YXRpYyB1NjQgY29tY2VydG9fdXNiM19kbWFtYXNrID0gMHhmZmZmZjAwMDsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19kZXZpY2VfdXNiMyA9IHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gInhoY2ktaGNkIiwKKyAgICAgICAgLmlkICAgICAgICAgICAgID0gLTEsCisgICAgICAgIC5yZXNvdXJjZSAgICAgICA9IGNvbWNlcnRvX3VzYjNfcmVzb3VyY2UsCisgICAgICAgIC5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoY29tY2VydG9fdXNiM19yZXNvdXJjZSksCisgICAgICAgIC5kZXYgICAgICAgICAgICA9IHsKKyAgICAgICAgICAgICAgICAuZG1hX21hc2sgICAgICAgICAgICAgICA9ICZjb21jZXJ0b191c2IzX2RtYW1hc2ssCisgICAgICAgICAgICAgICAgLmNvaGVyZW50X2RtYV9tYXNrICAgICAgPSBETUFfQklUX01BU0soMzIpLAorICAgICAgICB9LAorfTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFVTQiAyLjAgSG9zdCAKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19VU0IyX1NVUFBPUlQpCisKK3N0YXRpYyB1NjQgY29tY2VydG9fZHdjX290Z19kbWFtYXNrID0gMHhGRkZGRkZGRiAvKkRNQV9CSVRfTUFTSygzMikqLzsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjb21jZXJ0b19kd2Nfb3RnX3Jlc291cmNlc1tdID0geworCXsKKwkJLnN0YXJ0CT0gQ09NQ0VSVE9fQVhJX1VTQjJQMF9CQVNFLAorCQkuZW5kCT0gQ09NQ0VSVE9fQVhJX1VTQjJQMF9CQVNFICsgMHhGRkZGRkYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sIHsKKwkJLnN0YXJ0CT0gSVJRX1VTQjIsCisJCS5lbmQJPSBJUlFfVVNCMiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX2R3Y19vdGdfZGV2aWNlID0geworCS5uYW1lCQkJPSAiZHdjX290ZyIsCisJLnJlc291cmNlCQk9IGNvbWNlcnRvX2R3Y19vdGdfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjb21jZXJ0b19kd2Nfb3RnX3Jlc291cmNlcyksCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSBOVUxMLAorICAgICAgICAuZG1hX21hc2sgICAgICAgICAgICAgICA9ICZjb21jZXJ0b19kd2Nfb3RnX2RtYW1hc2ssCisgICAgICAgIC5jb2hlcmVudF9kbWFfbWFzayAgICAgID0gRE1BX0JJVF9NQVNLKDMyKSwKKwl9Cit9OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19TQVRBKQorc3RhdGljIHN0cnVjdCBhaGNpX3BsYXRmb3JtX2RhdGEgY29tY2VydG9fYWhjaV9wZGF0YSA9IHsKKyAgICAgICAgLmluaXQgPSBjb21jZXJ0b19haGNpX2luaXQsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX2FoY2lfcmVzb3VyY2VbXSA9IHsKKyAgICAgICAgWzBdID0geworICAgICAgICAgICAgICAgIC5zdGFydCAgPSBDT01DRVJUT19BWElfU0FUQV9CQVNFLAorICAgICAgICAgICAgICAgIC5lbmQgICAgPSBDT01DRVJUT19BWElfU0FUQV9CQVNFICsgU1pfNjRLIC0gMSwKKyAgICAgICAgICAgICAgICAuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisgICAgICAgIH0sCisgICAgICAgIFsxXSA9IHsKKyAgICAgICAgICAgICAgICAuc3RhcnQgID0gSVJRX1NBVEEsCisgICAgICAgICAgICAgICAgLmVuZCAgICA9IElSUV9TQVRBLAorICAgICAgICAgICAgICAgIC5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKyAgICAgICAgfSwKK307CisKK3N0YXRpYyB1NjQgY29tY2VydG9fYWhjaV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19kZXZpY2VfYWhjaSA9IHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImFoY2kiLAorICAgICAgICAuaWQgICAgICAgICAgICAgPSAtMSwKKyAgICAgICAgLnJlc291cmNlICAgICAgID0gY29tY2VydG9fYWhjaV9yZXNvdXJjZSwKKyAgICAgICAgLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShjb21jZXJ0b19haGNpX3Jlc291cmNlKSwKKyAgICAgICAgLmRldiAgICAgICAgICAgID0geworICAgICAgICAgICAgICAgIC5wbGF0Zm9ybV9kYXRhICAgICAgICAgID0gJmNvbWNlcnRvX2FoY2lfcGRhdGEsCisgICAgICAgICAgICAgICAgLmRtYV9tYXNrICAgICAgICAgICAgICAgPSAmY29tY2VydG9fYWhjaV9kbWFtYXNrLAorICAgICAgICAgICAgICAgIC5jb2hlcmVudF9kbWFfbWFzayAgICAgID0gRE1BX0JJVF9NQVNLKDMyKSwKKyAgICAgICAgfSwKK307CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBYT1IgRW5naW5lCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX3hvcl9yZXNvdXJjZVtdID0geworCQl7CisJCQkJLm5hbWUgID0gInhvciBiYXNlIGFkZHJlc3MiLAorCQkJCS5zdGFydCA9IENPTUNFUlRPX0FQQl9NRE1BX0JBU0UsCisJCQkJLmVuZCAgID0gQ09NQ0VSVE9fQVBCX01ETUFfQkFTRSArIENPTUNFUlRPX0FQQl9NRE1BX1NJWkUgLSAxLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCQl9LAorCQl7CisJCQkJLm5hbWUgID0gIklPMk0gSVJRIiwKKwkJCQkuc3RhcnQgPSBJUlFfTURNQV9JTzJNLAorCQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCQl9LAorfTsKKworc3RhdGljIHU2NCBjb21jZXJ0b194b3JfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b194b3JfZGV2aWNlID0geworCS5uYW1lICAgICAgID0gImNvbWNlcnRvX3hvciIsCisJLmlkICAgICAgICAgPSAwLAorCS5kZXYgICAgICAgID0geworCQkuZG1hX21hc2sgICAgPSAmY29tY2VydG9feG9yX2RtYV9tYXNrLAorCQkuY29oZXJlbnRfZG1hX21hc2sgICAgPSBETUFfQklUX01BU0soMzIpLAorCX0sCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShjb21jZXJ0b194b3JfcmVzb3VyY2UpLAorCS5yZXNvdXJjZSA9IGNvbWNlcnRvX3hvcl9yZXNvdXJjZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgQmFzaWMgQzJLIE1ETUEgRW5naW5lCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvbWNlcnRvX2RtYV9yZXNvdXJjZVtdID0geworCQl7CisJCQkJLm5hbWUgID0gImMyayBtZG1hIGJhc2UgYWRkcmVzcyIsCisJCQkJLnN0YXJ0ID0gQ09NQ0VSVE9fQVBCX01ETUFfQkFTRSwKKwkJCQkuZW5kICAgPSBDT01DRVJUT19BUEJfTURNQV9CQVNFICsgQ09NQ0VSVE9fQVBCX01ETUFfU0laRSAtIDEsCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCisJCX0sCisJCXsKKwkJCQkubmFtZSAgPSAiSU8yTSBJUlEiLAorCQkJCS5zdGFydCA9IElSUV9NRE1BX0lPMk0sCisJCQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJCX0sCit9OworCitzdGF0aWMgdTY0IGNvbWNlcnRvX2RtYV9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX2RtYV9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgPSAiY29tY2VydG9fZG1hIiwKKwkuaWQgICAgICAgICA9IDAsCisJLmRldiAgICAgICAgPSB7CisJCS5kbWFfbWFzayAgICA9ICZjb21jZXJ0b19kbWFfZG1hX21hc2ssCisJCS5jb2hlcmVudF9kbWFfbWFzayAgICA9IERNQV9CSVRfTUFTSygzMiksCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGNvbWNlcnRvX2RtYV9yZXNvdXJjZSksCisJLnJlc291cmNlID0gY29tY2VydG9fZG1hX3Jlc291cmNlLAorfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0VQQVZJUykKK3N0YXRpYyB1NjQgY29tY2VydG9fZXBhdmlzX2NpZV9kbWFtYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworc3RydWN0IHBsYXRmb3JtX2RldmljZSBjb21jZXJ0b19kZXZpY2VfZXBhdmlzX2NpZSA9IHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImxjX2NpZSIsCisgICAgICAgIC5pZCAgICAgICAgICAgICA9IC0xLAorICAgICAgICAuZGV2ICAgICAgICAgICAgPSB7CisgICAgICAgICAgICAgICAgLnBsYXRmb3JtX2RhdGEgICAgICAgICAgPSBOVUxMLAorICAgICAgICAgICAgICAgIC5kbWFfbWFzayAgICAgICAgICAgICAgID0gJmNvbWNlcnRvX2VwYXZpc19jaWVfZG1hbWFzaywKKyAgICAgICAgICAgICAgICAuY29oZXJlbnRfZG1hX21hc2sgICAgICA9IERNQV9CSVRfTUFTSygzMiksCisgICAgICAgIH0sCit9Oworc3RhdGljIHU2NCBjb21jZXJ0b19lcGF2aXNfZGVjb21wX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOworCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNvbWNlcnRvX2RldmljZV9lcGF2aXNfZGVjb21wID0geworICAgICAgICAubmFtZSAgICAgICAgICAgPSAibGNfZGVjb21wIiwKKyAgICAgICAgLmlkICAgICAgICAgICAgID0gLTEsCisgICAgICAgIC5kZXYgICAgICAgICAgICA9IHsKKyAgICAgICAgICAgICAgICAucGxhdGZvcm1fZGF0YSAgICAgICAgICA9IE5VTEwsCisgICAgICAgICAgICAgICAgLmRtYV9tYXNrICAgICAgICAgICAgICAgPSAmY29tY2VydG9fZXBhdmlzX2RlY29tcF9kbWFtYXNrLAorICAgICAgICAgICAgICAgIC5jb2hlcmVudF9kbWFfbWFzayAgICAgID0gRE1BX0JJVF9NQVNLKDMyKSwKKyAgICAgICAgfSwKK307CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0NTWVNfVFBJX0NMT0NLKSAKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY29tY2VydG9fZGV2aWNlX3RwaV9jc3lzX2NsayA9IHsKKwkubmFtZQkJPSAidHBpX2NzeXMiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9ICB7CisJCS5wbGF0Zm9ybV9kYXRhCQk9IE5VTEwsCisJfSwKK307CisjZW5kaWYKKworaW50IHVzYjNfY2xrX2ludGVybmFsID0gMTsKK3N0YXRpYyBpbnQgX19pbml0IGdldF91c2IzX2Nsa19tb2RlKGNoYXIgKnN0cikKK3sKKyAgICAgICAgaWYgKCFzdHJjbXAoc3RyLCAibm8iKSkKKyAgICAgICAgICAgICAgICB1c2IzX2Nsa19pbnRlcm5hbCA9IDA7CisKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInVzYjNfaW50ZXJuYWxfY2xrPSIsIGdldF91c2IzX2Nsa19tb2RlKTsKKworaW50IGlzX21hY196ZXJvKHU4ICpidWYpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZG07CisgICAgICAgIGZvciAoZG0gPSAwOyBkbSA8IDY7IGRtKyspeworCQlpZiAoKCooYnVmK2RtKSkgIT0gMCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbWFjX2FkZHJfYXRvaSh1OCBtYWNfYWRkcltdLCBjaGFyICptYWNfYWRkcl9zdHIpCit7CisJaW50IGksIGosIGs7CisJaW50IHN0cl9pbmNyX2NudCA9IDA7CisKKwlpZiAoKm1hY19hZGRyX3N0ciA9PSAnLCcpIHsKKwkJKm1hY19hZGRyX3N0cisrOworCQlzdHJfaW5jcl9jbnQrKzsKKwkJcmV0dXJuIHN0cl9pbmNyX2NudDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisKKwkJaiA9IGhleF90b19iaW4oKm1hY19hZGRyX3N0cisrKTsKKwkJc3RyX2luY3JfY250Kys7CisJCWlmIChqID09IC0xKQorCQkJcmV0dXJuIHN0cl9pbmNyX2NudDsKKworCQlrID0gaGV4X3RvX2JpbigqbWFjX2FkZHJfc3RyKyspOworCQlzdHJfaW5jcl9jbnQrKzsKKwkJaWYgKGsgPT0gLTEpCisJCQlyZXR1cm4gc3RyX2luY3JfY250OworCisJCW1hY19hZGRyX3N0cisrOworCQlzdHJfaW5jcl9jbnQrKzsKKwkJbWFjX2FkZHJbaV0gPSAoaiA8PCA0KSArIGs7CisJfQorCisJcmV0dXJuIHN0cl9pbmNyX2NudDsKK30KKwordTggYzJrX21hY19hZGRyWzNdWzE0XTsKKworc3RhdGljIHZvaWQgX19pbml0IG1hY19hZGRyX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgc3RyX2luY3JfY250ID0gMDsKKworCWlmICgqc3RyKysgIT0gJz0nIHx8ICEqc3RyKSAgLyogTm8gbWFjIGFkZHIgc3BlY2lmaWVkICovCisJCXJldHVybjsKKworCXN0cl9pbmNyX2NudCA9IG1hY19hZGRyX2F0b2koYzJrX21hY19hZGRyWzBdLCBzdHIpOworCisJc3RyICs9IHN0cl9pbmNyX2NudDsKKworCXN0cl9pbmNyX2NudCA9IG1hY19hZGRyX2F0b2koYzJrX21hY19hZGRyWzFdLCBzdHIpOworCisJc3RyICs9IHN0cl9pbmNyX2NudDsKKworCW1hY19hZGRyX2F0b2koYzJrX21hY19hZGRyWzJdLCBzdHIpOworfQorX19zZXR1cCgibWFjX2FkZHIiLCBtYWNfYWRkcl9zZXR1cCk7CisKK3ZvaWQgX19pbml0IG1hY19hZGRyX2luaXQoc3RydWN0IGNvbWNlcnRvX3BmZV9wbGF0Zm9ybV9kYXRhICogY29tY2VydG9fcGZlX2RhdGFfcHRyKQoreworCXU4IGdlbV9wb3J0X2lkOworCisJZm9yIChnZW1fcG9ydF9pZCA9IDA7IGdlbV9wb3J0X2lkIDwgTlVNX0dFTUFDX1NVUFBPUlQ7IGdlbV9wb3J0X2lkKyspIHsKKwkJaWYgKGlzX21hY196ZXJvKGMya19tYWNfYWRkcltnZW1fcG9ydF9pZF0pKSAgLyogSWYgbWFjIGlzIG5vbi16ZXJvICovCisJCQljb21jZXJ0b19wZmVfZGF0YV9wdHItPmNvbWNlcnRvX2V0aF9wZGF0YVtnZW1fcG9ydF9pZF0ubWFjX2FkZHIgPSBjMmtfbWFjX2FkZHJbZ2VtX3BvcnRfaWRdOworCX0KKworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY29tY2VydG9fY29tbW9uX2RldmljZXNbXSBfX2luaXRkYXRhID0geworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1VBUlQwX1NVUFBPUlQpIHx8IGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1VBUlQxX1NVUFBPUlQpCisJJmNvbWNlcnRvX3VhcnQsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fTVNQCisJJmNvbWNlcnRvX3ZlZCwKKyNlbmRpZiAgLyogQ09ORklHX0NPTUNFUlRPX01TUCAqLworCSZjb21jZXJ0b19wbXUsCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19VU0IzX1NVUFBPUlQpCisJJmNvbWNlcnRvX2RldmljZV91c2IzLAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19VU0IyX1NVUFBPUlQpCisJJmNvbWNlcnRvX2R3Y19vdGdfZGV2aWNlLAorI2VuZGlmCQorCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fU0FUQSkKKwkmY29tY2VydG9fZGV2aWNlX2FoY2ksCisjZW5kaWYKKy8vCSZjb21jZXJ0b194b3JfZGV2aWNlLAorCSZjb21jZXJ0b19kbWFfZGV2aWNlLAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0VQQVZJUykKKwkmY29tY2VydG9fZGV2aWNlX2VwYXZpc19jaWUsCisJJmNvbWNlcnRvX2RldmljZV9lcGF2aXNfZGVjb21wLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fQ1NZU19UUElfQ0xPQ0spCisJJmNvbWNlcnRvX2RldmljZV90cGlfY3N5c19jbGssCisjZW5kaWYKK307CisKK3ZvaWQgX19pbml0IGRldmljZV9pbml0KHZvaWQpCit7CisJLyogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGJpdCBtYXNrICovCisJdW5zaWduZWQgaW50IGRlZmF1bHRfaG9zdF91dGlscGVfc2hhcmVkX2JpdG1hc2sgPSB+KFVTQjJwMF9JUlF8V09MX0lSUSk7CisJc3RydWN0IGNsayAqYXhpX2NsaywqZGRyX2NsaywqYXJtX2NsaywqbDJjY19jbGs7CisJSEFMX2Nsa19kaXZfYmFja3VwX3JlbG9jYXRlX3RhYmxlICgpOworCXN5c3RlbV9yZXYgPSAocmVhZGwoQ09NQ0VSVE9fR1BJT19ERVZJQ0VfSURfUkVHKSA+PiAyNCkgJiAweGY7CisKKwkvKiBJbml0aWFsaXplIHRoZSByZXNldCBkcml2ZXIgaGVyZSAqLworCXJlc2V0X2luaXQoKTsKKwkKKwkvKiBFbmFibGUgdGhlIEFYSSxERFIsQTkgc3VzYnN5c3RlbSBjbG9jaworCSAqIHRoaXMgaXMganVzdCBmb3Igcy93IHVzZSBjb3VudCBob3VzZSBrZWVwaW5nLgorCSAqIFRoZXNlIGNsb2NrcyB3aWxsIG5ldmVyIGJlIGRpc2FibGVkIGZyb20gYm9vdGxvYWRlciB3aGlsZQorCSAqIGJvb3RpbmcuIEluIGZhY3Qgd2UgYXJlIGtlZXBpbmcgdGhpcyBiZWNhdXNlIGZvciB0aGVzZSBjbG9ja3MgLCAKKwkgKiB3ZSBkb250IGhhdmUgYW55IGRyaXZlciB0byBkbyBhIGNsa19lbmFibGUuIHNvIGRvaW5nICBpdCBoZXJlLgorCSovCisKKwkvKiBHZXQgdGhlIEFYSSBjbGsgc3RydWN0dXJlICovCisJYXhpX2NsayA9IGNsa19nZXQoTlVMTCwiYXhpIik7CisJaWYgKElTX0VSUihheGlfY2xrKSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gb2J0YWluIEFYSSBjbG9jazogJWxkXG4iLF9fZnVuY19fLFBUUl9FUlIoYXhpX2NsaykpOworCQkvKiBTeXN0ZW0gY2Fubm90IHByb2NlZWQgZnJvbSBoZXJlICovCisJCUJVRygpOworCX0KKwkvKiBFbmFibGUgdGhlIEFYSSBjbGsgICovCisJaWYgKGNsa19lbmFibGUoYXhpX2NsaykpeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZW5hYmxlIEFYSSBjbG9jazpcbiIsX19mdW5jX18pOworCQkvKiBTeXN0ZW0gY2Fubm90IHByb2NlZWQgZnJvbSBoZXJlICovCisJCUJVRygpOworCX0KKwkKKwkvKiBHZXQgdGhlIEREUiBjbG9jayBzdHJ1Y3R1cmUgKi8KKwlkZHJfY2xrID0gY2xrX2dldChOVUxMLCJkZHIiKTsKKwlpZiAoSVNfRVJSKGRkcl9jbGspKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBvYnRhaW4gRERSIGNsb2NrOiAlbGRcbiIsX19mdW5jX18sUFRSX0VSUihkZHJfY2xrKSk7CisJCS8qIFN5c3RlbSBjYW5ub3QgcHJvY2VlZCBmcm9tIGhlcmUgKi8KKwkJQlVHKCk7CisJfQorCS8qIEVuYWJsZSB0aGUgRERSIGNsayAgKi8KKyAJaWYgKGNsa19lbmFibGUoZGRyX2NsaykpeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZW5hYmxlIEREUiBjbG9jazpcbiIsX19mdW5jX18pOworCQkvKiBTeXN0ZW0gY2Fubm90IHByb2NlZWQgZnJvbSBoZXJlICovCisJCUJVRygpOworCX0KKwkKKwkvKiBHZXQgdGhlIENQVShBOSkgY2xvY2sgKi8KKwlhcm1fY2xrID0gY2xrX2dldChOVUxMLCJhcm0iKTsKKwlpZiAoSVNfRVJSKGFybV9jbGspKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBvYnRhaW4gQTkoYXJtKSBjbG9jazogJWxkXG4iLF9fZnVuY19fLFBUUl9FUlIoYXJtX2NsaykpOworCQkvKiBTeXN0ZW0gY2Fubm90IHByb2NlZWQgZnJvbSBoZXJlICovCisJCUJVRygpOworCX0KKwkvKiBFbmFibGUgdGhlIEFSTSBjbGsgICovCisJaWYgKGNsa19lbmFibGUoYXJtX2NsaykpeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZW5hYmxlIEE5KGFybSkgY2xvY2s6XG4iLF9fZnVuY19fKTsKKwkJLyogU3lzdGVtIGNhbm5vdCBwcm9jZWVkIGZyb20gaGVyZSAqLworCQlCVUcoKTsKKwl9CisKKwkvKiBHZXQgdGhlIEwyQ0MgY2xvY2sgKi8KKwlsMmNjX2NsayA9IGNsa19nZXQoTlVMTCwibDJjYyIpOworCWlmIChJU19FUlIobDJjY19jbGspKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBvYnRhaW4gTDJDQyBjbG9jazogJWxkXG4iLF9fZnVuY19fLFBUUl9FUlIobDJjY19jbGspKTsKKwkJLyogTDJDQyBpbml0aWxpemF0aW9uIGNhbm5vdCBwcm9jZWVkIGZyb20gaGVyZSAqLworCQlCVUcoKTsKKwl9CisKKwkvKiBFbmFibGUgdGhlIEwyQ0MgY2xrICAqLworCWlmIChjbGtfZW5hYmxlKGwyY2NfY2xrKSl7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBlbmFibGUgTDJDQyBjbG9jazpcbiIsX19mdW5jX18pOworCQkvKiBMMkNDIGluaXRpbGl6YXRpb24gY2Fubm90IHByb2NlZWQgZnJvbSBoZXJlICovCisJCUJVRygpOworCX0KKwkKKyNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAorCWNvbWNlcnRvX2wyY2NfaW5pdCgpOworI2VuZGlmCisKKwlleHBfYnVzX2luaXQoKTsKKworCWdwaW9faW5pdCgpOworCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1RETV9DTE9DSworCS8vIFtGSVhNRV0gVGFrZSBURE0gb3V0IG9mIHJlc2V0CisJLy93cml0ZWwocmVhZGwoQ09NQ0VSVE9fQkxPQ0tfUkVTRVRfUkVHKSB8IFRETV9SU1QsIENPTUNFUlRPX0JMT0NLX1JFU0VUX1JFRyk7CisjZW5kaWYKKwkvKiBEZWZhdWx0IGJpdCBtYXNrIGlzIGFwcGxpZWQgaGVyZSAsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIFV0aWwtUGUqLworCWMya19wbV9iaXRtYXNrX3N0b3JlKGRlZmF1bHRfaG9zdF91dGlscGVfc2hhcmVkX2JpdG1hc2spOworCisJcGxhdGZvcm1fYWRkX2RldmljZXMoY29tY2VydG9fY29tbW9uX2RldmljZXMsIEFSUkFZX1NJWkUoY29tY2VydG9fY29tbW9uX2RldmljZXMpKTsKK30KKwordm9pZCBfX2luaXQgcGxhdGZvcm1fcmVzZXJ2ZSh2b2lkKQoreworCS8qIEFsbG9jYXRlIEREUiBibG9jayB1c2VkIGJ5IFBGRS9NU1AsIHRoZSBiYXNlIGFkZHJlc3MgaXMgZml4ZWQgc28gdGhhdCB1dGlsLXBlIGNvZGUgY2FuCisJYmUgbGlua2VkIGF0IGEgZml4ZWQgYWRkcmVzcyAqLworCWlmIChtZW1ibG9ja19yZXNlcnZlKENPTUNFUlRPX0REUl9TSEFSRURfQkFTRSwgQ09NQ0VSVE9fRERSX1NIQVJFRF9TSVpFKSA8IDApCisJCUJVRygpOworCisJaWYgKG1lbWJsb2NrX2ZyZWUoQ09NQ0VSVE9fRERSX1NIQVJFRF9CQVNFLCBDT01DRVJUT19ERFJfU0hBUkVEX1NJWkUpIDwgMCkKKwkJQlVHKCk7CisKKwlpZiAobWVtYmxvY2tfcmVtb3ZlKENPTUNFUlRPX0REUl9TSEFSRURfQkFTRSwgQ09NQ0VSVE9fRERSX1NIQVJFRF9TSVpFKSA8IDApCisJCUJVRygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9jb21jZXJ0by10cGljc3lzLmMgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2NvbWNlcnRvLXRwaWNzeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTFlNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9jb21jZXJ0by10cGljc3lzLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9jb21jZXJ0by10cGljc3lzLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitzdHJ1Y3QgY2xrICpjbGtfdHBpLCpjbGtfY3N5czsKKworc3RhdGljIGludCB0cGlfY3N5c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBlcnI9MDsKKwkvKiBHZXQgdGhlIHJlZnJlbmNlIHRvIFRQSSBjbGsgc3RydWN0dXJlICovCisJY2xrX3RwaSA9IGNsa19nZXQoTlVMTCwidHBpIik7CisKKwkvKiBFcnJvciBIYW5kbGluZyAsIGlmIG5vIFRQSSBjbG9jayByZWZlcmVuY2U6IHJldHVybiBlcnJvciAqLworCWlmIChJU19FUlIoY2xrX3RwaSkpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIG9idGFpbiAgY2xvY2s6ICVsZFxuIixfX2Z1bmNfXyxQVFJfRVJSKGNsa190cGkpKTsKKwkJZXJyID0gUFRSX0VSUihjbGtfdHBpKTsKKwkJZ290byBlcnJfdHBpX2dldDsKKwl9CisKKwkvKiBFbmFibGUgdGhlIFRQSSBjbG9jayAscmVxdWlyZWQgZm9yIGNvcnRleCBBOSBKVEFHICovCisJZXJyID0gY2xrX2VuYWJsZShjbGtfdHBpKTsKKwlpZiAoZXJyKXsKKwkJcHJfZXJyKCIlczogVFBJIGNsb2NrIGZhaWxlZCB0byBlbmFibGU6XG4iLF9fZnVuY19fKTsKKwkJZ290byBlcnJfdHBpX2VuYWJsZTsKKwl9CisKKwkvKiBHZXQgdGhlIENTWVMgY2xrIHN0cnVjdHVyZSAscmVxdWlyZWQgb2ZyIGNvcnRleCBBOSBjb3Jlc2lnaHQqLworCWNsa19jc3lzID0gY2xrX2dldChOVUxMLCJjc3lzIik7CisKKwkvKiBFcnJvciBIYW5kbGluZyAsIGlmIG5vIENTWVMgY2xvY2sgcmVmZXJlbmNlOiByZXR1cm4gZXJyb3IgCisJICogRGlzYWJsZSB0aGUgVFBJIGNsb2NrIGVuYWJsZWQgYmVmb3JlLiAKKwkgKi8KKwlpZiAoSVNfRVJSKGNsa19jc3lzKSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gb2J0YWluICBjbG9jazogJWxkXG4iLF9fZnVuY19fLFBUUl9FUlIoY2xrX2NzeXMpKTsKKwkJZXJyID0gUFRSX0VSUihjbGtfY3N5cyk7CisgCQlnb3RvIGVycl9jc3lzX2dldDsKKwl9CisKKwkvKkVuYWJsZSB0aGUgIENTWVMgY2xvY2sgKi8KKwllcnIgPSBjbGtfZW5hYmxlKGNsa19jc3lzKTsKKwlpZiAoZXJyKXsKKwkJcHJfZXJyKCIlczogQ1NZUyBjbG9jayBmYWlsZWQgdG8gZW5hYmxlOlxuIixfX2Z1bmNfXyk7CisJCS8qIERpc2FibGUgdGhlIENTWVMoQTkgY29yZXNpZ2h0IGNsb2NrIGFsc28gKi8gCisJCWdvdG8gZXJyX2NzeXNfZW5hYmxlOworCX0KKworCXJldHVybiAwOworCitlcnJfY3N5c19lbmFibGU6CisJY2xrX3B1dChjbGtfY3N5cyk7CitlcnJfY3N5c19nZXQ6CisJY2xrX2Rpc2FibGUoY2xrX3RwaSk7CitlcnJfdHBpX2VuYWJsZToKKwljbGtfcHV0KGNsa190cGkpOworZXJyX3RwaV9nZXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0cGlfY3N5c19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKworCS8qIERpc2FibGUgdGhlIFRQSS9DU1lTIGNsb2NrICovCisJY2xrX2Rpc2FibGUoY2xrX3RwaSk7CisJY2xrX3B1dChjbGtfdHBpKTsKKworCWNsa19kaXNhYmxlKGNsa19jc3lzKTsKKwljbGtfcHV0KGNsa19jc3lzKTsKKworCXJldHVybiAwOworfQorCQorCisvKiBTdHJ1Y3R1cmUgZm9yIERldmljZSBEcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRwaV9jc3lzX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkucHJvYmUgPSB0cGlfY3N5c19wcm9iZSwKKwkucmVtb3ZlID0gdHBpX2NzeXNfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRwaV9jc3lzIiwKKwl9LAkKK307CisKK3N0YXRpYyBpbnQgY29tY2VydG9fdHBpX2NzeXNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRwaV9jc3lzX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3RwaV9jc3lzX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdHBpX2NzeXNfcGxhdGZvcm1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY29tY2VydG9fdHBpX2NzeXNfaW5pdCk7Cittb2R1bGVfZXhpdChjb21jZXJ0b190cGlfY3N5c19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21jZXJ0byBUUEkvQ1NZUyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9jb21jZXJ0by12d2QuYyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vY29tY2VydG8tdndkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0MzFkOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vY29tY2VydG8tdndkLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2NvbWNlcnRvLXZ3ZC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKworc3RhdGljIGludCBjb21jZXJ0b193aWZpX3J4X2R1bW15X2hkbHIoaW50ICgqaGRscikoc3RydWN0IHNrX2J1ZmYgKnNrYikpOworc3RhdGljIGludCAoKnZ3ZF9yeF9oZGxyKShzdHJ1Y3Qgc2tfYnVmZiAqKSA9IGNvbWNlcnRvX3dpZmlfcnhfZHVtbXlfaGRscjsKKworc3RhdGljIGludCBjb21jZXJ0b193aWZpX3J4X2R1bW15X2hkbHIoaW50ICgqaGRscikoc3RydWN0IHNrX2J1ZmYgKnNrYikpCit7CisJcmV0dXJuIC0xOworfQorCitpbnQgY29tY2VydG9fd2lmaV9yeF9mYXN0cGF0aF9yZWdpc3RlcihpbnQgKCpoZGxyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSkKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczolZCBWV0QgVHggZnVuY3Rpb24gcmVnaXN0ZXJlZFxuIiwgX19mdW5jX18sIF9fTElORV9fICk7CisJdndkX3J4X2hkbHIgPSBoZGxyOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29tY2VydG9fd2lmaV9yeF9mYXN0cGF0aF91bnJlZ2lzdGVyKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6JWQgVldEIFR4IGZ1bmN0aW9uIHVucmVnaXN0ZXJlZFxuIiwgX19mdW5jX18sIF9fTElORV9fICk7CisJdndkX3J4X2hkbHIgPSBjb21jZXJ0b193aWZpX3J4X2R1bW15X2hkbHI7CisKKwlyZXR1cm47Cit9CisKK2ludCBjb21jZXJ0b193aWZpX3J4X2Zhc3RwYXRoKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHZ3ZF9yeF9oZGxyKHNrYik7CisKK30KKworRVhQT1JUX1NZTUJPTChjb21jZXJ0b193aWZpX3J4X2Zhc3RwYXRoX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woY29tY2VydG9fd2lmaV9yeF9mYXN0cGF0aF91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woY29tY2VydG9fd2lmaV9yeF9mYXN0cGF0aCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2RtYS5jIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTExYzliCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9kbWEuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorOyAgICAgICAgRmlsZW5hbWUgOiBkbWEuYworOyAgICAgICAgUHVycG9zZSAgOiBEVyBETUEgQVBJcyBmb3IgRmFzdCBTUEkgYW5kIEZhc3QgVUFSVC4KKzs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaW5jbHVkZSA8bWFjaC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9kbWEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworCisKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZG1hX3NzaV94ZmVyX2NtcGxldGVfY2hrICgpCisgKgorICogQ2hlY2sgZm9yIHRoZSBjb21wbGV0ZSBvZiBETUEgZGF0YSB4ZmVyIG9uIGdpdmVuIGNoYW5uYWwgbm8uCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3JldGNvZGUgZG1hX3hmZXJfY21wbGV0ZV9jaGsodW5zaWduZWQgaW50IGNoX25vKQoreworICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbF9zdGF0dXMgPSAweEY7CisKKyAgICAgICAgd2hpbGUoY2hhbm5lbF9zdGF0dXMgIT0gMHgwKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhbm5lbF9zdGF0dXMgPSByZWFkbChEV19ETUFfRE1BQ19DSF9FTl9SRUcpOworCQljaGFubmVsX3N0YXR1cyA9IGNoYW5uZWxfc3RhdHVzICYgKCgxIDw8IGNoX25vKSAmIDB4RkYpOworCX0KKworCXJldHVybiBSRVRDT0RFX09LOworfQorCitFWFBPUlRfU1lNQk9MKGRtYV94ZmVyX2NtcGxldGVfY2hrKTsKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgIGRtYV9jb25maWd1cmUgKCkKKyAqCisgKiAgIFNpbmdsZS1ibG9jayBUcmFuc2ZlciAtLSB3aXRob3V0IHdyaXRlLWJhY2sgb2YgY29udHJvbAorICogICBhbmQgc3RhdHVzIGluZm9ybWF0aW9uIGVuYWJsZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2luZ2xlLWJsb2NrIHRyYW5zZmVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCit2b2lkIGRtYV9jb25maWd1cmUodW5zaWduZWQgaW50IHNvdXJjZV9hZGQsIHVuc2lnbmVkIGludCB0YXJnZXRfYWRkLCB1bnNpZ25lZCBpbnQgZGF0YV9sZW4sIHVuc2lnbmVkIGludCBjaF9ubykKK3sKKwl1bnNpZ25lZCBpbnQgZG1hX2NoYW5uZWwgPSAoMSA8PCBjaF9ubykgJiAweEZGIDsKKwl1bnNpZ25lZCBpbnQgY2hfcmVnX211bHRpcGxpZXIgPSAwOworCXVuc2lnbmVkIGludCBjaF9jdHJsX2wgPSAwOworCXVuc2lnbmVkIGludCBjaF9jZmdfbCA9IDA7CisJdW5zaWduZWQgaW50IGNoX2NmZ19oID0gMDsKKworCS8qIERNQSBlbmFibGUgKi8KKwl3cml0ZWwoRE1BX0dMT0JBTF9FTkFCTEUsIERXX0RNQV9ETUFDX0RNQV9DRkdfUkVHKTsKKworCS8qIHZlcmlmeSBjaGFubmVsIGlzIG5vdCBidXN5LCBkb25lIHdpdGggbGFzdCB0cmFuc2FjdGlvbiAqLworCWRtYV94ZmVyX2NtcGxldGVfY2hrKGNoX25vKTsKKworCS8qIENvbmZpZ3VyZSBETUEgaGFuZHNoYWtpbmcgKi8KKworCS8qIFdyaXRpbmcgYSAxIHRvIHRoZSBMYXN0IERlc3RpbmF0aW9uIFRyYW5zYWN0aW9uIFJlcXVlc3QgUmVnaXN0ZXIgaW5pdGlhdGVzIGEgdHJhbnNhY3Rpb24uICovCisJd3JpdGVsKCgoZG1hX2NoYW5uZWwgPDwgRE1BX1JFR19XRV9TSElGVCkgfCAoMHgwICYgMHhGRikpLCBEV19ETUFfRE1BQ19MU1RfRFNUX1JFRyk7CisKKy8qIFRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uLCBzaW5nbGUgb3IgYnVyc3QsIGRlcGVuZHMgb24gdGhlIHN0YXRlIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgYml0CisgKiBpbiB0aGUgU2luZ2xlIFNvdXJjZS9EZXN0aW5hdGlvbiBUcmFuc2FjdGlvbiBSZXF1ZXN0IHJlZ2lzdGVyLgorICovCisJd3JpdGVsKCgoZG1hX2NoYW5uZWwgPDwgRE1BX1JFR19XRV9TSElGVCkgfCAoMHgwICYgMHhGRikpLCBEV19ETUFfRE1BQ19TR0xfUkVRX0RTVF9SRUcpOworCisJLyogQ2xlYXIgSW50ZXJydXB0cyBvbiB0aGUgY2hhbm5hbCAqLworCisJLyogQ2xlYXIgZm9yIEludFRmciBJbnRlcnJ1cHQgKi8KKwl3cml0ZWwoZG1hX2NoYW5uZWwsIERXX0RNQV9ETUFDX0NMRUFSX1RGUik7CisJLyogQ2xlYXIgZm9yIEludEJsb2NrIEludGVycnVwdCAqLworCXdyaXRlbChkbWFfY2hhbm5lbCwgRFdfRE1BX0RNQUNfQ0xFQVJfQkxLKTsKKwkvKiBDbGVhciBmb3IgSW50U3JjVHJhbiBJbnRlcnJ1cHRzICovCisJd3JpdGVsKGRtYV9jaGFubmVsLCBEV19ETUFfRE1BQ19DTEVBUl9TUkNfVFJBTik7CisJLyogQ2xlYXIgZm9yIEludERzdFRyYW4gSW50ZXJydXB0ICovCisJd3JpdGVsKGRtYV9jaGFubmVsLCBEV19ETUFfRE1BQ19DTEVBUl9EU1RfVFJBTik7CisJLyogQ2xlYXIgZm9yIEludEVyciBJbnRlcnJ1cHQgKi8KKwl3cml0ZWwoZG1hX2NoYW5uZWwsIERXX0RNQV9ETUFDX0NMRUFSX0VSUik7CisKKwkvKiBTZXQgdXAgSW50ZXJydXB0IE1hc2sgcmVnaXN0ZXJzICovCisKKwkvKiBNYXNrIGZvciBJbnRUZnIgSW50ZXJydXB0ICovCisJd3JpdGVsKCgoZG1hX2NoYW5uZWwgPDwgRE1BX1JFR19XRV9TSElGVCkgfCAoMHgwICYgMHhGRikpLCBEV19ETUFfRE1BQ19NQVNLX1RGUik7CisJLyogTWFzayBmb3IgSW50QmxvY2sgSW50ZXJydXB0ICovCisJd3JpdGVsKCgoZG1hX2NoYW5uZWwgPDwgRE1BX1JFR19XRV9TSElGVCkgfCBkbWFfY2hhbm5lbCksIERXX0RNQV9ETUFDX01BU0tfQkxPQ0spOworCS8qIE1hc2sgZm9yIEludFNyY1RyYW4gSW50ZXJydXB0ICovCisJd3JpdGVsKCgoZG1hX2NoYW5uZWwgPDwgRE1BX1JFR19XRV9TSElGVCkgfCBkbWFfY2hhbm5lbCksIERXX0RNQV9ETUFDX01BU0tfU1JDX1RSQU4pOworCS8qIE1hc2sgZm9yIEludERzdFRyYW4gSW50ZXJydXB0ICovCisJd3JpdGVsKCgoZG1hX2NoYW5uZWwgPDwgRE1BX1JFR19XRV9TSElGVCkgfCBkbWFfY2hhbm5lbCksIERXX0RNQV9ETUFDX01BU0tfRFNUX1RSQU4pOworCS8qIE1hc2sgZm9yIEludEVyciBJbnRlcnJ1cHQgKi8KKwl3cml0ZWwoKChkbWFfY2hhbm5lbCA8PCBETUFfUkVHX1dFX1NISUZUKSB8ICgweDAgJiAweEZGKSksIERXX0RNQV9ETUFDX01BU0tfRVJSKTsKKworCS8qIGNvbmZpZ3VyZSBjaGFubmVsIHNwZWNpZmljIHJlZ2lzdGVycyAqLworCWlmKCBjaF9ubyAhPSAwICkKKwl7CisJCWNoX3JlZ19tdWx0aXBsaWVyID0gKERNQV9DSEFOTkVMX1JFR19DT1VOVCA8PCAzKSA7CisJCWNoX3JlZ19tdWx0aXBsaWVyID0gY2hfbm8gKiBjaF9yZWdfbXVsdGlwbGllcjsKKwl9CisKKwkvKiBjb25maWd1cmUgOiBTb3VyY2UgQWRkcmVzcyBSZWdpc3RlciBmb3IgQ2hhbm5lbCAqLworCisvKiBUaGUgc3RhcnRpbmcgc291cmNlIGFkZHJlc3MgaXMgcHJvZ3JhbW1lZCBiZWZvcmUgdGhlIERNQSBjaGFubmVsIGlzIGVuYWJsZWQuIFdoaWxlIHRoZSBETUEgdHJhbnNmZXIgaXMgaW4KKyAqIHByb2dyZXNzLCB0aGlzIHJlZ2lzdGVyIGlzIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgc291cmNlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgQUhCIHRyYW5zZmVyLgorICovCisJLyogU0FSIEFkZHJlc3MgbXVzdCBiZSBhbGxpZ25lZCB0byBETUFfQ1RMX1NSQ19UUl9XSURUSCBib3VuZHJ5ICovCisJd3JpdGVsKHNvdXJjZV9hZGQsIChETUFfQ0hBTk5FTF9SRUdfU0FSX0JBU0UgKyBjaF9yZWdfbXVsdGlwbGllcikpOworCisJLyogY29uZmlndXJlIDogRGVzdGluYXRpb24gQWRkcmVzcyBSZWdpc3RlciBmb3IgQ2hhbm5lbCAqLworCisvKiBUaGUgc3RhcnRpbmcgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBwcm9ncmFtbWVkIGJlZm9yZSB0aGUgRE1BIGNoYW5uZWwgaXMgZW5hYmxlZC4gV2hpbGUgdGhlIERNQSB0cmFuc2ZlciBpcyBpbgorICogcHJvZ3Jlc3MsIHRoaXMgcmVnaXN0ZXIgaXMgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IEFIQiB0cmFuc2Zlci4KKyAqLworCS8qIERBUiBBZGRyZXNzIG11c3QgYmUgYWxsaWduZWQgdG8gRE1BX0NUTF9EU1RfVFJfV0lEVEggYm91bmRyeSAqLworCXdyaXRlbCh0YXJnZXRfYWRkLCAoRE1BX0NIQU5ORUxfUkVHX0RBUl9CQVNFICsgY2hfcmVnX211bHRpcGxpZXIpKTsKKworCisJLyogY29uZmlndXJlIDogQ29udHJvbCBSZWdpc3RlciBmb3IgQ2hhbm5lbCBbMzItNjNdICovCisvKiBUaGUgbnVtYmVyIHByb2dyYW1tZWQgaW50byBCTE9DS19UUyBpbmRpY2F0ZXMgdGhlIHRvdGFsIG51bWJlciBvZiBzaW5nbGUgdHJhbnNhY3Rpb25zCisgKiB0byBwZXJmb3JtIGZvciBldmVyeSBibG9jayB0cmFuc2ZlcjsgYSBzaW5nbGUgdHJhbnNhY3Rpb24gaXMgbWFwcGVkIHRvIGEgc2luZ2xlIEFNQkEgYmVhdC4KKyAqLworCXdyaXRlbChkYXRhX2xlbiwgKERNQV9DSEFOTkVMX1JFR19DVExfQkFTRSArIGNoX3JlZ19tdWx0aXBsaWVyICsgY2hfbm8pKTsKKworCS8qIGNvbmZpZ3VyZSA6IENvbnRyb2wgUmVnaXN0ZXIgZm9yIENoYW5uZWwgWzAtMzFdICovCisJY2hfY3RybF9sID0gKCgoRE1BX0NUTF9JTlRfRU4gJiBETUFfQ1RMX0lOVF9FTl9NQVNLKSA8PCBETUFfQ1RMX0lOVF9FTl9TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9EU1RfVFJfV0lEVEggJiBETUFfQ1RMX0RTVF9UUl9XSURUSF9NQVNLKSA8PCBETUFfQ1RMX0RTVF9UUl9XSURUSF9TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9TUkNfVFJfV0lEVEggJiBETUFfQ1RMX1NSQ19UUl9XSURUSF9NQVNLKSA8PCBETUFfQ1RMX1NSQ19UUl9XSURUSF9TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9ESU5DICYgRE1BX0NUTF9ESU5DX01BU0spIDw8IERNQV9DVExfRElOQ19TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9TSU5DICYgRE1BX0NUTF9TSU5DX01BU0spIDw8IERNQV9DVExfU0lOQ19TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9ERVNUX01TSVpFICYgRE1BX0NUTF9ERVNUX01TSVpFX01BU0spIDw8IERNQV9DVExfREVTVF9NU0laRV9TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9TUkNfTVNJWkUgJiBETUFfQ1RMX1NSQ19NU0laRV9NQVNLKSA8PCBETUFfQ1RMX1NSQ19NU0laRV9TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9TUkNfR0FUSEVSX0VOICYgRE1BX0NUTF9TUkNfR0FUSEVSX0VOX01BU0spIDw8IERNQV9DVExfU1JDX0dBVEhFUl9FTl9TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9EU1RfU0NBVFRFUl9FTiAmIERNQV9DVExfRFNUX1NDQVRURVJfRU5fTUFTSykgPDwgRE1BX0NUTF9EU1RfU0NBVFRFUl9FTl9TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9UVF9GQyAmIERNQV9DVExfVFRfRkNfTUFTSykgPDwgRE1BX0NUTF9UVF9GQ19TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9ETVMgJiBETUFfQ1RMX0RNU19NQVNLKSA8PCBETUFfQ1RMX0RNU19TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9TTVMgJiBETUFfQ1RMX1NNU19NQVNLKSA8PCBETUFfQ1RMX1NNU19TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9MTFBfRFNUX0VOICYgRE1BX0NUTF9MTFBfRFNUX0VOX01BU0spIDw8IERNQV9DVExfTExQX0RTVF9FTl9TSElGVCkgfAorCQkJCSgoRE1BX0NUTF9MTFBfU1JDX0VOICYgRE1BX0NUTF9MTFBfU1JDX0VOX01BU0spIDw8IERNQV9DVExfTExQX1NSQ19FTl9TSElGVCkpOworCisJd3JpdGVsKGNoX2N0cmxfbCwgKERNQV9DSEFOTkVMX1JFR19DVExfQkFTRSArIGNoX3JlZ19tdWx0aXBsaWVyKSk7CisKKwkvKiBjb25maWd1cmUgOiBMaW5rZWQgTGlzdCBQb2ludGVyIFJlZ2lzdGVyIGZvciBDaGFubmVsICovCisJd3JpdGVsKDB4MCwgKERNQV9DSEFOTkVMX1JFR19MTFBfQkFTRSArIGNoX3JlZ19tdWx0aXBsaWVyKSk7CisKKwkvKiBjb25maWd1cmUgOiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIGZvciBDaGFubmVsIFszMi02M10gKi8KKwljaF9jZmdfaCA9ICgoKERNQV9DRkdfRkNNT0RFICYgRE1BX0NGR19GQ01PREVfTUFTSykgPDwgRE1BX0NGR19GQ01PREVfU0hJRlQpIHwKKwkJCSAgICgoRE1BX0NGR19GSUZPX01PREUgJiBETUFfQ0ZHX0ZJRk9fTU9ERV9NQVNLKSA8PCBETUFfQ0ZHX0ZJRk9fTU9ERV9TSElGVCkgfAorCQkJICAgKChETUFfQ0ZHX1BST1RDVEwgJiBETUFfQ0ZHX1BST1RDVExfTUFTSykgPDwgRE1BX0NGR19QUk9UQ1RMX1NISUZUKSB8CisJCQkgICAoKERNQV9DRkdfRFNfVVBEX0VOICYgRE1BX0NGR19EU19VUERfRU5fTUFTSykgPDwgRE1BX0NGR19EU19VUERfRU5fU0hJRlQpIHwKKwkJCSAgICgoRE1BX0NGR19TU19VUERfRU4gJiBETUFfQ0ZHX1NTX1VQRF9FTl9NQVNLKSA8PCBETUFfQ0ZHX1NTX1VQRF9FTl9TSElGVCkgfAorCQkJICAgKChjaF9ubyAvKkRNQV9DRkdfU1JDX1BFUiovICYgRE1BX0NGR19TUkNfUEVSX01BU0spIDw8IERNQV9DRkdfU1JDX1BFUl9TSElGVCkgfAorCQkJICAgKChETUFfQ0ZHX0RFU1RfUEVSICYgRE1BX0NGR19ERVNUX1BFUl9NQVNLKSA8PCBETUFfQ0ZHX0RFU1RfUEVSX1NISUZUKSk7CisKKwl3cml0ZWwoY2hfY2ZnX2gsIChETUFfQ0hBTk5FTF9SRUdfQ0ZHX0JBU0UgKyBjaF9yZWdfbXVsdGlwbGllciArIGNoX25vKSk7CisKKwkvKiBjb25maWd1cmUgOiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIGZvciBDaGFubmVsIFswLTMxXSAqLworCWNoX2NmZ19sID0gKCgoY2hfbm8gJiBETUFfQ0ZHX0NIX1BSSU9SX01BU0spIDw8IERNQV9DRkdfQ0hfUFJJT1JfU0hJRlQpIHwKKwkJCSAgICgoRE1BX0NGR19DSF9TVVNQICYgRE1BX0NGR19DSF9TVVNQX01BU0spIDw8IERNQV9DRkdfQ0hfU1VTUF9TSElGVCkgfAorCQkJICAgKChETUFfQ0ZHX0ZJRk9fRU1QVFkgJiBETUFfQ0ZHX0ZJRk9fRU1QVFlfTUFTSykgPDwgRE1BX0NGR19GSUZPX0VNUFRZX1NISUZUKSB8CisJCQkgICAoKERNQV9DRkdfSFNfU0VMX0RTVCAmIERNQV9DRkdfSFNfU0VMX0RTVF9NQVNLKSA8PCBETUFfQ0ZHX0hTX1NFTF9EU1RfU0hJRlQpIHwKKwkJCSAgICgoRE1BX0NGR19IU19TRUxfU1JDICYgRE1BX0NGR19IU19TRUxfU1JDX01BU0spIDw8IERNQV9DRkdfSFNfU0VMX1NSQ19TSElGVCkgfAorCQkJICAgKChETUFfQ0ZHX0xPQ0tfQ0hfTCAmIERNQV9DRkdfTE9DS19DSF9MX01BU0spIDw8IERNQV9DRkdfTE9DS19DSF9MX1NISUZUKSB8CisJCQkgICAoKERNQV9DRkdfTE9DS19CX0wgJiBETUFfQ0ZHX0xPQ0tfQl9MX01BU0spIDw8IERNQV9DRkdfTE9DS19CX0xfU0hJRlQpIHwKKwkJCSAgICgoRE1BX0NGR19MT0NLX0NIICYgRE1BX0NGR19MT0NLX0NIX01BU0spIDw8IERNQV9DRkdfTE9DS19DSF9TSElGVCkgfAorCQkJICAgKChETUFfQ0ZHX0xPQ0tfQiAmIERNQV9DRkdfTE9DS19CX01BU0spIDw8IERNQV9DRkdfTE9DS19CX1NISUZUKSB8CisJCQkgICAoKERNQV9DRkdfRFNUX0hTX1BPTCAmIERNQV9DRkdfRFNUX0hTX1BPTF9NQVNLKSA8PCBETUFfQ0ZHX0RTVF9IU19QT0xfU0hJRlQpIHwKKwkJCSAgICgoRE1BX0NGR19TUkNfSFNfUE9MICYgRE1BX0NGR19TUkNfSFNfUE9MX01BU0spIDw8IERNQV9DRkdfU1JDX0hTX1BPTF9TSElGVCkgfAorCQkJICAgKChETUFfQ0ZHX01BWF9BQlJTVCAmIERNQV9DRkdfTUFYX0FCUlNUX01BU0spIDw8IERNQV9DRkdfTUFYX0FCUlNUX1NISUZUKSB8CisJCQkgICAoKERNQV9DRkdfUkVMT0FEX1NSQyAmIERNQV9DRkdfUkVMT0FEX1NSQ19NQVNLKSA8PCBETUFfQ0ZHX1JFTE9BRF9TUkNfU0hJRlQpIHwKKwkJCSAgICgoRE1BX0NGR19SRUxPQURfRFNUICYgRE1BX0NGR19SRUxPQURfRFNUX01BU0spIDw8IERNQV9DRkdfUkVMT0FEX0RTVF9TSElGVCkpOworCisJd3JpdGVsKGNoX2NmZ19sLCAoRE1BX0NIQU5ORUxfUkVHX0NGR19CQVNFICsgY2hfcmVnX211bHRpcGxpZXIpKTsKKworCS8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KKwl3cml0ZWwoKChkbWFfY2hhbm5lbCA8PCBETUFfUkVHX1dFX1NISUZUKSB8IGRtYV9jaGFubmVsKSwgRFdfRE1BX0RNQUNfQ0hfRU5fUkVHKTsKKworCXJldHVybiA7Cit9CisKK0VYUE9SVF9TWU1CT0woZG1hX2NvbmZpZ3VyZSk7CisKK2ludCBmYXN0X3VhcnRfd3JpdGUodW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGludCBkbWFfbGVuOworCisJd2hpbGUgKGxlbikKKwl7CisJCWlmIChsZW4gPiBETUFfWEZFUl9ETEVOKQorCQkJZG1hX2xlbiA9IERNQV9YRkVSX0RMRU47CisJCWVsc2UKKwkJCWRtYV9sZW4gPSBsZW47CisKKwkJd2hpbGUgKChyZWFkbChEV19ETUFfVUFSVDFfQkFTRUFERFIgKyBVQVJUX0xTUikgJiBMU1JfVEVNVCkgPT0gMCkgOworCisJCWRtYV9jb25maWd1cmUoKHVuc2lnbmVkIGludCkgc3RyLCBEV19ETUFfVUFSVDFfQkFTRUFERFIgKyBVQVJUX1RIUiwgZG1hX2xlbiwgRE1BX0NIQU5ORUxfMSk7CisKKwkJLyogV2FpdCBmb3IgY29tcGxldGlvbiBvZiBETUEgeGZlciAodGlsbCBjaGFubmVsIGlzIGRpc2FibGVkIGJ5IEhXKSAqLworCQlpZiAoUkVUQ09ERV9PSyAhPSBkbWFfeGZlcl9jbXBsZXRlX2NoayhETUFfQ0hBTk5FTF8xKSkKKwkJCXJldHVybiBSRVRDT0RFX0VSUk9SOworCisJCWxlbiAtPSBkbWFfbGVuOworCisJCXN0ciArPSBkbWFfbGVuOworCX0KKworCXJldHVybiBSRVRDT0RFX09LOworfQorCitFWFBPUlRfU1lNQk9MKGZhc3RfdWFydF93cml0ZSk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1MWRhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vZ3Bpby5jCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY29tY2VydG8vZ3Bpby5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKy8qIFtGSVhNRV0gKi8KKyNpZiAwCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KKworI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX004M1hYWCkKKworLyogVGhlIEdQSU8gSVJRIGJsb2NrIGdlbmVyYXRlcyBpbnRlcnJ1cHRzIG9ubHkgb24gcmlzaW5nL2ZhbGxpbmcgZWRnZXMgb2YgdGhlIEdQSU8gcGluIHNpZ25hbC4KKyAqIFRvIGF2b2lkIGxvb3NpbmcgaW50ZXJydXB0cyBvciBoYXZpbmcgc3B1cmlvdXMgaW50ZXJydXB0cyBjYXJlIG11c3QgYmUgdGFrZW4uCisgKiBUaGUgZ2VuZXJhbCBzdHJhdGVneSBpcyB0byBsb29wIGFuZCBwb2xsIHRoZSBHUElPIHBpbiB0byBtYWtlIHN1cmUgbm8gaW50ZXJydXB0cyBhcmUgbWlzc2VkLgorICogVGhlIEdQSU8gSVJRIG11c3QgYmUgYWNrZWQgaW5zaWRlIHRoZSBsb29wIGF0IGVhY2ggaXRlcmF0aW9uLiBJZiBpdCB3YXMgYWNrZWQKKyAqIGJlZm9yZSB0aGUgbG9vcCB0aGVyZSB3b3VsZCBiZSBhIHJhY2UgY29uZGl0aW9uKDEpIHdoZXJlIHdlIGV4aXQgY29tY2VydG9faGFuZGxlX2dwaW9fbGV2ZWxfaXJxKCkgd2l0aAorICogdGhlIEdQSU8gSVJRIHNldCwgZXZlbiBpZiB0aGUgc291cmNlIHdhcyBhbHJlYWR5IGhhbmRsZWQuIElmIGl0IHdhcyBhY2tlZCBhZnRlciB0aGUgbG9vcAorICogdGhlcmUgd291bGQgYmUgYSByYWNlIGNvbmRpdGlvbigyKSB3aGVyZSB3ZSBhY2sgYSBHUElPIElSUSBidXQgdGhlIHNvdXJjZSBpcyBub3QgeWV0IGhhbmRsZWQuCisgKiBUaGUgR1BJTyBJUlEgbXVzdCBiZSBhY2tlZCBhZnRlciBhbGwgdGhlIGRyaXZlciBoYW5kbGVycyBoYXZlIGJlZW4gY2FsbGVkIChhZnRlciBoYW5kbGVfc2ltcGxlX2lycSgpKQorICogdG8gYWxzbyBhdm9pZCB0aGUgcmFjZSBtZW50aW9uZWQgaW4gKDEpIGFib3ZlLgorICovCisKK2V4dGVybiBpbnQgbm9pcnFkZWJ1ZzsKK2V4dGVybiBpbnQgcmVkaXJlY3RfaGFyZGlycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOworCit2b2lkIGNvbWNlcnRvX2hhbmRsZV9ncGlvX2xldmVsX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOworCWlycXJldHVybl90IGFjdGlvbl9yZXQ7CisJY29uc3QgdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl1MzIgcGVuZGluZzsKKworCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7CisKKwkvKgorCSAqIE1hc2sgSVJRLgorCSAqLworCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKKworCWRvIHsKKwkJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIElSUV9JTlBST0dSRVNTKSkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJZGVzYy0+c3RhdHVzICY9IH4oSVJRX1JFUExBWSB8IElSUV9XQUlUSU5HKTsKKwkJa3N0YXRfY3B1KGNwdSkuaXJxc1tpcnFdKys7CisKKwkJYWN0aW9uID0gZGVzYy0+YWN0aW9uOworCQlpZiAodW5saWtlbHkoIWFjdGlvbiB8fCAoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSkpIHsKKwkJCWRlc2MtPnN0YXR1cyB8PSBJUlFfUEVORElORzsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWRlc2MtPnN0YXR1cyB8PSBJUlFfSU5QUk9HUkVTUzsKKwkJLyoKKwkJICogaGFyZGlycSByZWRpcmVjdGlvbiB0byB0aGUgaXJxZCBwcm9jZXNzIGNvbnRleHQ6CisJCSAqLworCQlpZiAocmVkaXJlY3RfaGFyZGlycShkZXNjKSkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJZGVzYy0+c3RhdHVzICY9IH5JUlFfUEVORElORzsKKwkJc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOworCisJCWFjdGlvbl9yZXQgPSBoYW5kbGVfSVJRX2V2ZW50KGlycSwgYWN0aW9uKTsKKwkJaWYgKCFub2lycWRlYnVnKQorCQkJbm90ZV9pbnRlcnJ1cHQoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KTsKKworCQlzcGluX2xvY2soJmRlc2MtPmxvY2spOworCQlkZXNjLT5zdGF0dXMgJj0gfklSUV9JTlBST0dSRVNTOworCisJCS8qCisJCSAqIEFjayBJUlEuCisJCSAqLworCQlkZXNjLT5jaGlwLT5hY2soaXJxKTsKKwkJLyoKKwkJICogU291cmNlIGludGVycnVwdHMgYXJlIHVzdWFsbHkgYWN0aXZlIGxvdworCQkgKi8KKwkJcGVuZGluZyA9IGNvbWNlcnRvX2dwaW9fcmVhZCgxIDw8ICgoaXJxIC0gMSkgJiAweDFmKSkgPyAwIDogMTsKKworCX0gd2hpbGUgKHBlbmRpbmcgJiYgIShkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpKTsKKworCWlmICghKGRlc2MtPnN0YXR1cyAmIElSUV9ESVNBQkxFRCkgJiYgZGVzYy0+Y2hpcC0+dW5tYXNrKQorCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmZGVzYy0+bG9jayk7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9oZWFkc21wLlMgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2hlYWRzbXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFjYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9oZWFkc21wLlMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtdHJhbnNjZWRlL2hlYWRzbXAuUworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgQVJNIExpbWl0ZWQKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkKKwlfX0NQVUlOSVQKKyNlbHNlICAgIAorCV9fSU5JVAorI2VuZGlmICAgIAorCisvKgorICogUmVhbHZpZXcgc3BlY2lmaWMgZW50cnkgcG9pbnQgZm9yIHNlY29uZGFyeSBDUFVzLiAgVGhpcyBwcm92aWRlcworICogYSAiaG9sZGluZyBwZW4iIGludG8gd2hpY2ggYWxsIHNlY29uZGFyeSBjb3JlcyBhcmUgaGVsZCB1bnRpbCB3ZSdyZQorICogcmVhZHkgZm9yIHRoZW0gdG8gaW5pdGlhbGlzZS4KKyAqLworRU5UUlkodjdfaW52YWxpZGF0ZV9sMSkKKwltb3YJcjAsICMwCisJbWNyCXAxNSwgMiwgcjAsIGMwLCBjMCwgMAorCW1yYwlwMTUsIDEsIHIwLCBjMCwgYzAsIDAKKworCWxkcglyMSwgPTB4N2ZmZgorCWFuZAlyMiwgcjEsIHIwLCBsc3IgIzEzCisKKwlsZHIJcjEsID0weDNmZgorCisJYW5kCXIzLCByMSwgcjAsIGxzciAjMwlAIE51bVdheXMgLSAxCisJYWRkCXIyLCByMiwgIzEJCUAgTnVtU2V0cworCisJYW5kCXIwLCByMCwgIzB4NworCWFkZAlyMCwgcjAsICM0CQlAIFNldFNoaWZ0CisKKwljbHoJcjEsIHIzCQkJQCBXYXlTaGlmdAorCWFkZAlyNCwgcjMsICMxCQlAIE51bVdheXMKKzE6CXN1YglyMiwgcjIsICMxCQlAIE51bVNldHMtLQorCW1vdglyMywgcjQJCQlAIFRlbXAgPSBOdW1XYXlzCisyOglzdWJzCXIzLCByMywgIzEJCUAgVGVtcC0tCisJbW92CXI1LCByMywgbHNsIHIxCisJbW92CXI2LCByMiwgbHNsIHIwCisJb3JyCXI1LCByNSwgcjYJCUAgUmVnID0gKFRlbXA8PFdheVNoaWZ0KXwoTnVtU2V0czw8U2V0U2hpZnQpCisJbWNyCXAxNSwgMCwgcjUsIGM3LCBjNiwgMgorCWJndAkyYgorCWNtcAlyMiwgIzAKKwliZ3QJMWIKKwlkc2IKKwlpc2IKKwltb3YJcGMsIGxyCitFTkRQUk9DKHY3X2ludmFsaWRhdGVfbDEpCisKKworRU5UUlkoY29tY2VydG9fc2Vjb25kYXJ5X3N0YXJ0dXApCisJbW92IHIwLCAjMHhkMworCW1zciBjcHNyX2ZzeGMsIHIwCisJYmwJdjdfaW52YWxpZGF0ZV9sMQorCW1yYwlwMTUsIDAsIHIwLCBjMCwgYzAsIDUKKwlhbmQJcjAsIHIwLCAjMTUKKwlhZHIJcjQsIDFmCisJbGRtaWEJcjQsIHtyNSwgcjZ9CisJc3ViCXI0LCByNCwgcjUKKwlhZGQJcjYsIHI2LCByNAorcGVuOglsZHIJcjcsIFtyNl0KKwljbXAJcjcsIHIwCisJYm5lCXBlbgorCisJLyoKKwkgKiB3ZSd2ZSBiZWVuIHJlbGVhc2VkIGZyb20gdGhlIGhvbGRpbmcgcGVuOiBzZWNvbmRhcnlfc3RhY2sKKwkgKiBzaG91bGQgbm93IGNvbnRhaW4gdGhlIFNWQyBzdGFjayBmb3IgdGhpcyBjb3JlCisJICovCisJYglzZWNvbmRhcnlfc3RhcnR1cAorCisxOgkubG9uZwkuCisJLmxvbmcJcGVuX3JlbGVhc2UKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9ob3RwbHVnLmMgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2hvdHBsdWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ4NDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9ob3RwbHVnLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIGNvbWNlcnRvIFNNUCBjcHUtaG90cGx1ZyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIExURC4KKyAqIEF1dGhvcjoKKyAqICAgICAgU2F0eWFicmF0YSBzYWh1IDxzYXR5YWJyYXQuc2FodUBtaW5kc3BlZWQuY29tPgorICoKKyAqIFBsYXRmb3JtIGZpbGUgbmVlZGVkIGZvciB0aGUgY29tY2VydG8gQTkgU01QIHN5c3RlbSAuIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBhcm0KKyAqIHJlYWx2aWV3IHNtcCBwbGF0Zm9ybS4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBBUk0gTGltaXRlZC4KKworICogQ1BVLTEgc2h1dGRvd24gYW5kIHJlc2V0IC4gd2hpbGUgbWFrZWluZyBvbmxpbmUgLCBDUFUtMSB3aWxsIGJlIGFnYWluIGluIAorICogb3V0IG9mIHJlc2V0IG1vZGUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPiAgLy8gZm9yIHRocmVhZHMKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAgLy8gZm9yIHRhc2tfc3RydWN0CisjaW5jbHVkZSA8bGludXgvdGltZS5oPiAgIC8vIGZvciB1c2luZyBqaWZmaWVzCisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworCisKK2V4dGVybiB2b2xhdGlsZSBpbnQgcGVuX3JlbGVhc2U7CisKK2V4dGVybiBjcHUxX2hvdHBsdWc7CitleHRlcm4gdTMyIGNwdTFfaG90cGx1Z19kb25lOworCitpbnQgcGxhdGZvcm1fY3B1X2tpbGwodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIHBsYXRmb3JtLXNwZWNpZmljIGNvZGUgdG8gc2h1dGRvd24gYSBDUFUKKyAqIENhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQKKyAqLwordm9pZCBwbGF0Zm9ybV9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogRmx1c2ggYWxsIGNhY2hlICAqLworCWZsdXNoX2NhY2hlX2FsbCgpOworCWRzYigpOworCisJLyoKKwkgKiB3ZSdyZSByZWFkeSBmb3Igc2h1dGRvd24gbm93LCBzbyBkbyBpdAorCSAqLworCQorICAgICAgICAgLyogRW50ZXJpbmcgdG8gTE9XIHBvd2VyIHN0YXRlLiAKKwkgICogR28gdG8gTG93IHBvd2VyICxDb25maWd1cmUgdGhlIENQVSB0byByZXNldCBtb2RlLgorCSAgKi8KKworCWlmKGNwdSkgeworCQkvKiBQdXQgQTkgQ1BVLTEgdG8gcmVzZXQgKi8KKwkJY3B1MV9ob3RwbHVnX2RvbmUgPSAxOworCQl3YWtlX3VwKCZjcHUxX2hvdHBsdWcpOworCQl3aGlsZSgxKTsKKwl9Cit9CisKK2ludCBwbGF0Zm9ybV9jcHVfZGlzYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCS8qCisJICogd2UgZG9uJ3QgYWxsb3cgQ1BVIDAgdG8gYmUgc2h1dGRvd24gKGl0IGlzIHN0aWxsIHRvbyBzcGVjaWFsCisJICogZS5nLiBjbG9jayB0aWNrIGludGVycnVwdHMpCisJICovCisKKwlpZiAoIWNwdSkKKyAgICAgICAgICAgICAgICBwcl9pbmZvKCJXZSBhcmUgbm90IGFsbG93aW5nIHRoZSBDUFUoJWQpIHRvIHNodXRkb3duLiBcbiIsY3B1KTsKKwkKKwlyZXR1cm4gY3B1ID09IDAgPyAtRVBFUk0gOiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvYm9hcmQtYzJrYXNpYy5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvYm9hcmQtYzJrYXNpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NmMzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9ib2FyZC1jMmthc2ljLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2JvYXJkLWMya2FzaWMuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX0JPQVJEX0MyS0FTSUNfSF9fCisjZGVmaW5lIF9fQk9BUkRfQzJLQVNJQ19IX18KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEV4cGFuc2lvbiBidXMgY29uZmlndXJhdGlvbgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCSNkZWZpbmUgQ09NQ0VSVE9fRVhQQ0xLCQk1MDAwMDAwMAkvKiA1ME1IeiAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR1BJTworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkjZGVmaW5lIENPTUNFUlRPX09VVFBVVF9HUElPCQkoQ09NQ0VSVE9fTkFORF9DRSkKKwkjZGVmaW5lIENPTUNFUlRPX0lSUV9SSVNJTkdfRURHRV9HUElPCTAgLy8gW0ZJWE1FXQorCSNkZWZpbmUgQ09NQ0VSVE9fSVJRX0ZBTExJTkdfRURHRV9HUElPCShHUElPXzIgfCBHUElPXzApIC8vIFtGSVhNRV0KKwkjZGVmaW5lIENPTUNFUlRPX0lSUV9MRVZFTF9HUElPIAlHUElPXzIgLy8gW0ZJWE1FXQorCS8qQXJlIHBpbnMgdXNlZCBlaXRoZXIgYXMgR1BJTyBvciBhcyBwaW5zIGZvciBvdGhlcnMgSVAgYmxvY2tzKi8KKwkjZGVmaW5lIENPTUNFUlRPX0dQSU9fUElOX1VTQUdFCQkoU1BJX0JVUykgLy8gW0ZJWE1FXQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRUVQUk9NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogTk9SCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSNkZWZpbmUgTk9SRkxBU0hfTUVNT1JZX1BIWTEJCUVYUF9DUzBfQVhJX0JBU0VBRERSCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBOQU5ECisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSNkZWZpbmUgQ09NQ0VSVE9fRVhQX0NTNF9TRUdfU1oJCTEKKworCSNkZWZpbmUgQ09NQ0VSVE9fTkFORF9GSU9fQUREUgkJRVhQX0NTNF9BWElfQkFTRUFERFIKKwkjZGVmaW5lIENPTUNFUlRPX05BTkRfQlIJCTB4MjAwMDAwMDAgLyogQlIgaXMgb24gR1BJT18yOSAqLworCSNkZWZpbmUgQ09NQ0VSVE9fTkFORF9DRQkJMHgxMDAwMDAwMCAvKiBDRSBpcyBvbiBHUElPXzI4ICovCisJI2RlZmluZSBDT01DRVJUT19OQU5EX0lPX1NaCQkoKENPTUNFUlRPX0VYUF9DUzRfU0VHX1NaIDw8IDEyKSArMHgxMDAwKQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0xJQworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkjZGVmaW5lIENPTUNFUlRPX1NMSUNfR1BJT19JUlEJCUlSUV9HMQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvYm9hcmQtYzJrZXZtLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9ib2FyZC1jMmtldm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJkNDhmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvYm9hcmQtYzJrZXZtLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2JvYXJkLWMya2V2bS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQk9BUkRfQzJLRVZNX0hfXworI2RlZmluZSBfX0JPQVJEX0MyS0VWTV9IX18KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKwkKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBFeHBhbnNpb24gYnVzIGNvbmZpZ3VyYXRpb24KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJIAorCSNkZWZpbmUgQ09NQ0VSVE9fRVhQQ0xLCQk1MDAwMDAwMAkvKiA1ME1IeiAqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogR1BJTworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkjZGVmaW5lIENPTUNFUlRPX09VVFBVVF9HUElPCQkoQ09NQ0VSVE9fTkFORF9DRSkKKwkjZGVmaW5lIENPTUNFUlRPX0lSUV9SSVNJTkdfRURHRV9HUElPCTAgLy8gW0ZJWE1FXQorCSNkZWZpbmUgQ09NQ0VSVE9fSVJRX0ZBTExJTkdfRURHRV9HUElPCShHUElPXzIgfCBHUElPXzApIC8vIFtGSVhNRV0KKwkjZGVmaW5lIENPTUNFUlRPX0lSUV9MRVZFTF9HUElPIAlHUElPXzIgLy8gW0ZJWE1FXQorCS8qQXJlIHBpbnMgdXNlZCBlaXRoZXIgYXMgR1BJTyBvciBhcyBwaW5zIGZvciBvdGhlcnMgSVAgYmxvY2tzKi8KKwkjZGVmaW5lIENPTUNFUlRPX0dQSU9fUElOX1VTQUdFCQkoU1BJX0JVUykgLy8gW0ZJWE1FXQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRUVQUk9NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogTk9SCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSNkZWZpbmUgTk9SRkxBU0hfTUVNT1JZX1BIWTEJCUVYUF9DUzBfQVhJX0JBU0VBRERSCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBOQU5ECisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSNkZWZpbmUgQ09NQ0VSVE9fRVhQX0NTNF9TRUdfU1oJCTEKKworCSNkZWZpbmUgQ09NQ0VSVE9fTkFORF9GSU9fQUREUgkJRVhQX0NTNF9BWElfQkFTRUFERFIKKwkjZGVmaW5lIENPTUNFUlRPX05BTkRfQlIJCTB4MjAwMDAwMDAgLyogQlIgaXMgb24gR1BJT18yOSAqLworCSNkZWZpbmUgQ09NQ0VSVE9fTkFORF9DRQkJMHgxMDAwMDAwMCAvKiBDRSBpcyBvbiBHUElPXzI4ICovCisJI2RlZmluZSBDT01DRVJUT19OQU5EX0lPX1NaCQkoKENPTUNFUlRPX0VYUF9DUzRfU0VHX1NaIDw8IDEyKSArMHgxMDAwKQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0xJQworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkjZGVmaW5lIENPTUNFUlRPX1NMSUNfR1BJT19JUlEJCUlSUV9HMgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2JvYXJkLWMya21mY25ldm0uaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2JvYXJkLWMya21mY25ldm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzUyYzkxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvYm9hcmQtYzJrbWZjbmV2bS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBhcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9ib2FyZC1jMmttZmNuZXZtLmgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19CT0FSRF9DMktNRkNORVZNX0hfXworI2RlZmluZSBfX0JPQVJEX0MyS01GQ05FVk1fSF9fCisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisJCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRXhwYW5zaW9uIGJ1cyBjb25maWd1cmF0aW9uCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSAKKwkjZGVmaW5lIENPTUNFUlRPX0VYUENMSwkJNTAwMDAwMDAJLyogNTBNSHogKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEdQSU8KKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJI2RlZmluZSBDT01DRVJUT19PVVRQVVRfR1BJTwkJKENPTUNFUlRPX05BTkRfQ0UpCisJI2RlZmluZSBDT01DRVJUT19JUlFfUklTSU5HX0VER0VfR1BJTwkwIC8vIFtGSVhNRV0KKwkjZGVmaW5lIENPTUNFUlRPX0lSUV9GQUxMSU5HX0VER0VfR1BJTwkoR1BJT18yIHwgR1BJT18wKSAvLyBbRklYTUVdCisJI2RlZmluZSBDT01DRVJUT19JUlFfTEVWRUxfR1BJTyAJR1BJT18yIC8vIFtGSVhNRV0KKwkvKkFyZSBwaW5zIHVzZWQgZWl0aGVyIGFzIEdQSU8gb3IgYXMgcGlucyBmb3Igb3RoZXJzIElQIGJsb2NrcyovCisJI2RlZmluZSBDT01DRVJUT19HUElPX1BJTl9VU0FHRQkJKFNQSV9CVVMpIC8vIFtGSVhNRV0KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEVFUFJPTQorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIE5PUgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkjZGVmaW5lIE5PUkZMQVNIX01FTU9SWV9QSFkxCQlFWFBfQ1MwX0FYSV9CQVNFQUREUgorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogTkFORAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkjZGVmaW5lIENPTUNFUlRPX0VYUF9DUzRfU0VHX1NaCQkxCisKKwkjZGVmaW5lIENPTUNFUlRPX05BTkRfRklPX0FERFIJCUVYUF9DUzRfQVhJX0JBU0VBRERSCisJI2RlZmluZSBDT01DRVJUT19OQU5EX0JSCQkweDIwMDAwMDAwIC8qIEJSIGlzIG9uIEdQSU9fMjkgKi8KKwkjZGVmaW5lIENPTUNFUlRPX05BTkRfQ0UJCTB4MTAwMDAwMDAgLyogQ0UgaXMgb24gR1BJT18yOCAqLworCSNkZWZpbmUgQ09NQ0VSVE9fTkFORF9JT19TWgkJKChDT01DRVJUT19FWFBfQ1M0X1NFR19TWiA8PCAxMikgKzB4MTAwMCkKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFNMSUMKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJI2RlZmluZSBDT01DRVJUT19TTElDX0dQSU9fSVJRCQlJUlFfRzIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9ib2FyZC1jMmtydHNtLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9ib2FyZC1jMmtydHNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1NDFhNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2JvYXJkLWMya3J0c20uaApAQCAtMCwwICsxLDU2IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvYm9hcmQtYzJrcnRzbS5oCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQk9BUkRfQzJLUlRTTV9IX18KKyNkZWZpbmUgX19CT0FSRF9DMktSVFNNX0hfXworCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCQorCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIEV4cGFuc2lvbiBidXMgY29uZmlndXJhdGlvbgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkgCisJI2RlZmluZSBDT01DRVJUT19FWFBDTEsJCTUwMDAwMDAwCS8qIDUwTUh6ICovCisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiBHUElPCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSNkZWZpbmUgQ09NQ0VSVE9fT1VUUFVUX0dQSU8gCQkoQ09NQ0VSVE9fTkFORF9DRSB8IENPTUNFUlRPX05BTkRfQUxFIHwgQ09NQ0VSVE9fTkFORF9DTEUpIC8vIFtGSVhNRV0KKwkjZGVmaW5lIENPTUNFUlRPX0lSUV9SSVNJTkdfRURHRV9HUElPCTAgLy8gW0ZJWE1FXQorCSNkZWZpbmUgQ09NQ0VSVE9fSVJRX0ZBTExJTkdfRURHRV9HUElPCShHUElPXzIgfCBHUElPXzApIC8vIFtGSVhNRV0KKwkjZGVmaW5lIENPTUNFUlRPX0lSUV9MRVZFTF9HUElPIAlHUElPXzIgLy8gW0ZJWE1FXQorCS8qQXJlIHBpbnMgdXNlZCBlaXRoZXIgYXMgR1BJTyBvciBhcyBwaW5zIGZvciBvdGhlcnMgSVAgYmxvY2tzKi8KKwkjZGVmaW5lIENPTUNFUlRPX0dQSU9fUElOX1VTQUdFCQkoU1BJX0JVUykgLy8gW0ZJWE1FXQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogRUVQUk9NCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQorCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIE5PUgorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkjZGVmaW5lIE5PUkZMQVNIX01FTU9SWV9QSFkxCQlFWFBfQ1MwX0FYSV9CQVNFQUREUgorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogTkFORAorCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkjZGVmaW5lIENPTUNFUlRPX0VYUF9DUzRfU0VHX1NaCQkxCisJCisJI2RlZmluZSBDT01DRVJUT19OQU5EX0ZJT19BRERSCQlDT01DRVJUT19FWFBfQ1M0X0JBU0UKKwkjZGVmaW5lIENPTUNFUlRPX05BTkRfQlIJCUdQSU9fNgorCSNkZWZpbmUgQ09NQ0VSVE9fTkFORF9DRQkJR1BJT18yOQorCSNkZWZpbmUgQ09NQ0VSVE9fTkFORF9BTEUJCUdQSU9fMzAKKwkjZGVmaW5lIENPTUNFUlRPX05BTkRfQ0xFCQlHUElPXzMxCisJI2RlZmluZSBDT01DRVJUT19OQU5EX0lPX1NaCQkoKENPTUNFUlRPX0VYUF9DUzRfU0VHX1NaIDw8IDEyKSArMHgxMDAwKQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogU0xJQworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkjZGVmaW5lIENPTUNFUlRPX1NMSUNfR1BJT19JUlEJCUlSUV9HMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2Mya19kbWEuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2Mya19kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDJhYzdmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvYzJrX2RtYS5oCkBAIC0wLDAgKzEsMjQxIEBACisjaWZuZGVmIEMyS19ETUFfSF8KKyNkZWZpbmUgQzJLX0RNQV9IXworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisjaW5jbHVkZSA8bGludXgvbW1fdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKy8vCU1lbSB0byBJTyBDb250cm9sCisjZGVmaW5lIE0ySU9fU1RBUlQJKDEgPDwgMCkKKyNkZWZpbmUgTTJJT19GTEVORU4JKDEgPDwgMSkKKyNkZWZpbmUgTTJJT19GQ09NCSgxIDw8IDIpCisjZGVmaW5lIE0ySU9fRE9OT1NUT1AJKDEgPDwgMykKKyNkZWZpbmUgTTJJT19ET05PU1RBCSgxIDw8IDQpCisKKy8vCUlPIHRvIE1lbTogRE1BIENvbnRyb2wKKyNkZWZpbmUgSU8yTV9JUlFGUkRZTgkoMSA8PCAwKQorI2RlZmluZSBJTzJNX0lSUUZMU1QJKDEgPDwgMSkKKyNkZWZpbmUgSU8yTV9JUlFGRE9OCSgxIDw8IDIpCisjZGVmaW5lIElPMk1fSVJRRkxTSAkoMSA8PCAzKQorI2RlZmluZSBJTzJNX0lSUUZMRU4JKDEgPDwgNCkKKyNkZWZpbmUgSU8yTV9JUlFGVEhMRAkoMSA8PCA1KQorCisvLyBJUlEgU3RhdHVzIFJlZ2lzdGVyCisjZGVmaW5lIElSUV9JUlFGUkRZTgkoMSA8PCAwKQorI2RlZmluZSBJUlFfSVJRRkxTVAkoMSA8PCAxKQorI2RlZmluZSBJUlFfSVJRRkRPTgkoMSA8PCAyKQorI2RlZmluZSBJUlFfSVJRRkxTSAkoMSA8PCAzKQorI2RlZmluZSBJUlFfSVJRRkxFTgkoMSA8PCA0KQorI2RlZmluZSBJUlFfSVJRRlRITEQJKDEgPDwgNSkKKyNkZWZpbmUgSVJRX0lSUUZDVFJMCSgxIDw8IDYpCisKKy8vIEluYm91bmQgRnJhbWUgYW5kIEJ1ZmZlciBEZXNjcmlwdG9yIFByb2dyYW1taW5nCisKKy8vIEJDb250cm9sCisjZGVmaW5lIEJMQVNUCSgxIDw8IDE2KQorI2RlZmluZSBCRklYCSgxIDw8IDE3KQorCisvLyBCbG9jayBTaXplCisjZGVmaW5lIFhPUl9CTE9DS19TSVpFXzI1NgkwCisjZGVmaW5lIFhPUl9CTE9DS19TSVpFXzUxMgkxCisjZGVmaW5lIFhPUl9CTE9DS19TSVpFXzEwMjQJMgorI2RlZmluZSBYT1JfQkxPQ0tfU0laRV8yMDQ4CTMKKyNkZWZpbmUgWE9SX0JMT0NLX1NJWkVfNDA5Ngk0CisKKyNkZWZpbmUgQ09NQ0VSVE9fWE9SX01BWF9TUkMgICAgNgorCisjZGVmaW5lIE1ETUFfSU5CT1VORF9CVUZfREVTQwkJMjU2CisjZGVmaW5lIE1ETUFfT1VUQk9VTkRfQlVGX0RFU0MJMjU2CisKKyNkZWZpbmUgWE9SX0lOQk9VTkRfQlVGX0RFU0MJNgorI2RlZmluZSBYT1JfT1VUQk9VTkRfQlVGX0RFU0MJMgorCisvKiBGTEVOID0+IE1heGltdW0gbm8uIG9mIGZkZXNjcyBtZG1hIGNhbiBwcm9jZXNzIGF0IGEgdGltZSBpcyA0ay0xICovCisvKiBOZWVkIHRvIHZlcmlmeSBpZiB0aGVzZSBtYW55IGNhbiBiZSBjcmVhdGVkIGluIGFyYW1fcG9vbC4gRG9uJ3Qga25vdyB3aGV0aGVyIHNvbWVvbmUgZWxzZSB1c2UgaXJhbV9wb29sICovCisvLyNkZWZpbmUgWE9SX0ZERVNDX0NPVU5UCTI1NgorCisjZGVmaW5lIE1ETUFfTUFYX0JVRl9TSVpFCQkweGZmZmYKKyNkZWZpbmUgTURNQV9TUExJVF9CVUZfU0laRQkJMHg4MDAwCS8qIGhhbGYgYSBwYWdlIHdpdGggNjRrQiBwYWdlcyAqLworCisvKiBBeENBQ0hFWzM6MF0sIGJpdFszXT0gV0EsIGJpdFsyXT0gUkEsIGJpdFsxXT0gQywgYml0WzBdPSBCICovCisjZGVmaW5lIEJVRkZFUkFCTEUJCSgxIDw8IDApCisjZGVmaW5lIENBQ0hFQUJMRQkJKDEgPDwgMSkKKyNkZWZpbmUgUkVBRF9BTExPQwkJKDEgPDwgMikKKyNkZWZpbmUgV1JJVEVfQUxMT0MJCSgxIDw8IDMpCisKKy8qIEF4VVNFUlswXSA9IGNvaGVyZW50KDEpL25vbl9jb2hlcmVudCgwKSAqLworCisvKiBBeFVTRVJbNDoxXSAqLworI2RlZmluZSBTVFJPTkdMWV9PUkRFUkVECTB4MAorI2RlZmluZSBERVZJQ0UJCQkweDEKKyNkZWZpbmUgTk9STUFMX05PTkNBQ0hFQUJMRQkweDMKKyNkZWZpbmUgV1JJVEVUSFJPVUdICQkweDYKKyNkZWZpbmUgV1JJVEVCQUNLCQkweDcKKyNkZWZpbmUgV1JJVEVCQUNLX1dBCQkweGYKKworLyogQXhQUk9UWzI6MF0sIGJpdFsyXT0gaW5zdHJ1Y3Rpb24oMSkvZGF0YSgwKSwgYml0WzFdPSBub24tc2VjdXJlKDEpL3NlY3VyZSgwKSAsIGJpdFswXSA9IHByaXZpbGVnZSgxKS9ub3JtYWwoMCkgKi8KKyNkZWZpbmUgUFJJVklMRUdFCQkoMSA8PCAwKQorI2RlZmluZSBOT05fU0VDVVJFCQkoMSA8PCAxKQorI2RlZmluZSBJTlNUUlVDVElPTgkJKDEgPDwgMikKKworCisjZGVmaW5lIEFXVVNFUl9DT0hFUkVOVCh4KQkJKCgoKHgpIDw8IDEpIHwgMSkgPDwgMTkpCisjZGVmaW5lIEFXUFJPVCh4KQkJCSgoeCkgPDwgMTYpCisjZGVmaW5lIEFXQ0FDSEUoeCkJCQkoKHgpIDw8IDEyKQorCisjZGVmaW5lIEFSVVNFUl9DT0hFUkVOVCh4KQkJKCgoKHgpIDw8IDEpIHwgMSkgPDwgNykKKyNkZWZpbmUgQVJQUk9UKHgpCQkJKCh4KSA8PCA0KQorI2RlZmluZSBBUkNBQ0hFKHgpCQkJKCh4KSA8PCAwKQorCitlbnVtIG1kbWFfdHJhbnNhY3Rpb25fdHlwZSB7CisJTURNQV9NRU1DUFksCisJTURNQV9YT1IsCisJTURNQV9YT1JfVkFMLAorfTsKKworc3RydWN0IGNvbWNlcnRvX21kbWFfYnVmZmVyX2Rlc2MgeworCXUzMiBicG9pbnRlcjsKKwl1MzIgYmNvbnRyb2w7Cit9X19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKTsKKworc3RydWN0IGNvbWNlcnRvX21lbWNweV9pbmJvdW5kX2ZkZXNjIHsKKwl1MzIgIG5leHRfZGVzYzsKKwl1MzIgIGZjb250cm9sOworCXUzMiAgZnN0YXR1czA7CisJdTMyICBmc3RhdHVzMTsKKwlzdHJ1Y3QgY29tY2VydG9fbWRtYV9idWZmZXJfZGVzYyBiZGVzY1tNRE1BX0lOQk9VTkRfQlVGX0RFU0NdOworfV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOworCitzdHJ1Y3QgY29tY2VydG9fbWVtY3B5X291dGJvdW5kX2ZkZXNjIHsKKwl1MzIgIG5leHRfZGVzYzsKKwl1MzIgIGZjb250cm9sOworCXUzMiAgZnN0YXR1czA7CisJdTMyICBmc3RhdHVzMTsKKwlzdHJ1Y3QgY29tY2VydG9fbWRtYV9idWZmZXJfZGVzYyBiZGVzY1tNRE1BX09VVEJPVU5EX0JVRl9ERVNDXTsKK31fX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKKworc3RydWN0IGNvbWNlcnRvX3hvcl9pbmJvdW5kX2ZkZXNjIHsKKwl1MzIgIG5leHRfZGVzYzsKKwl1MzIgIGZjb250cm9sOworCXUzMiAgZnN0YXR1czA7CisJdTMyICBmc3RhdHVzMTsKKwlzdHJ1Y3QgY29tY2VydG9fbWRtYV9idWZmZXJfZGVzYyBiZGVzY1tYT1JfSU5CT1VORF9CVUZfREVTQ107Cit9X19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CisKK3N0cnVjdCBjb21jZXJ0b194b3Jfb3V0Ym91bmRfZmRlc2MgeworCXUzMiAgbmV4dF9kZXNjOworCXUzMiAgZmNvbnRyb2w7CisJdTMyICBmc3RhdHVzMDsKKwl1MzIgIGZzdGF0dXMxOworCXN0cnVjdCBjb21jZXJ0b19tZG1hX2J1ZmZlcl9kZXNjIGJkZXNjW1hPUl9PVVRCT1VORF9CVUZfREVTQ107Cit9X19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoMTYpKSk7CisKK3N0cnVjdCBjb21jZXJ0b19kbWFfYnVmIHsKKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBzcGxpdDsKK307CisKK3N0cnVjdCBjb21jZXJ0b19kbWFfc2cgeworCXVuc2lnbmVkIGludCBpbnB1dF9pZHg7CisJdW5zaWduZWQgaW50IG91dHB1dF9pZHg7CisJZG1hX2FkZHJfdCBoaWdoX3BoeXNfYWRkcjsKKwlkbWFfYWRkcl90IGxvd19waHlzX2FkZHI7CisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fTURNQV9QUk9GKQorCXN0cnVjdCB0aW1ldmFsIHN0YXJ0OworCXN0cnVjdCB0aW1ldmFsIGVuZDsKKyNlbmRpZgorCXN0cnVjdCBjb21jZXJ0b19kbWFfYnVmIGluX2JkZXNjW01ETUFfSU5CT1VORF9CVUZfREVTQ107CisJc3RydWN0IGNvbWNlcnRvX2RtYV9idWYgb3V0X2JkZXNjW01ETUFfT1VUQk9VTkRfQlVGX0RFU0NdOworfTsKKworc3RydWN0IG1kbWFfeG9yX3N0cnVjdCB7CisJaW50IHRyYW5zYWN0aW9uX3R5cGU7CisJaW50IHhvcl9ibG9ja19zaXplOworCWludCB4b3Jfc3JjX2NudDsKKwlkbWFfYWRkcl90ICoqeG9yX3NyY3M7CisJZG1hX2FkZHJfdCAqeG9yX2Rlc3Q7Cit9OworCisKK2V4dGVybiBzdHJ1Y3QgY29tY2VydG9fbWVtY3B5X2luYm91bmRfZmRlc2MgKm1kbWFfaW5fZGVzYzsKK2V4dGVybiBzdHJ1Y3QgY29tY2VydG9fbWVtY3B5X291dGJvdW5kX2ZkZXNjICptZG1hX291dF9kZXNjOworCitleHRlcm4gc3RydWN0IGNvbWNlcnRvX3hvcl9pbmJvdW5kX2ZkZXNjICp4b3JfaW5fZmRlc2NbXTsKK2V4dGVybiBzdHJ1Y3QgY29tY2VydG9feG9yX291dGJvdW5kX2ZkZXNjICp4b3Jfb3V0X2ZkZXNjW107CisKKworc3RhdGljIGlubGluZSB2b2lkIGNvbWNlcnRvX2RtYV9zZXRfaW5fYmRlc2ModTMyIGlkeCwgdTMyIGFkZHIsIHUzMiBjdHJsKQoreworCW1kbWFfaW5fZGVzYy0+YmRlc2NbaWR4XS5icG9pbnRlciA9IGFkZHI7CisJbWRtYV9pbl9kZXNjLT5iZGVzY1tpZHhdLmJjb250cm9sID0gY3RybDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbWNlcnRvX2RtYV9zZXRfb3V0X2JkZXNjKHUzMiBpZHgsIHUzMiBhZGRyLCB1MzIgY3RybCkKK3sKKwltZG1hX291dF9kZXNjLT5iZGVzY1tpZHhdLmJwb2ludGVyID0gYWRkcjsKKwltZG1hX291dF9kZXNjLT5iZGVzY1tpZHhdLmJjb250cm9sID0gY3RybDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbWNlcnRvX2RtYV9pbl9iZGVzY19jdHJsX3VwZGF0ZSh1MzIgaWR4LCB1MzIgY3RybCkKK3sKKwltZG1hX2luX2Rlc2MtPmJkZXNjW2lkeF0uYmNvbnRyb2wgfD0gY3RybDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbWNlcnRvX2RtYV9vdXRfYmRlc2NfY3RybF91cGRhdGUodTMyIGlkeCwgdTMyIGN0cmwpCit7CisJbWRtYV9vdXRfZGVzYy0+YmRlc2NbaWR4XS5iY29udHJvbCB8PSBjdHJsOworfQorCisvKioqKioqKioqKioqKioqKioqIFhPUiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW5saW5lIHZvaWQgbWRtYV94b3Jfc2V0X2luX2JkZXNjKHUzMiB4b3JfY2J1Zl93cl9jbnRyLCB1MzIgaWR4LCB1MzIgYWRkciwgdTMyIGN0cmwpCit7CisJeG9yX2luX2ZkZXNjW3hvcl9jYnVmX3dyX2NudHJdLT5iZGVzY1tpZHhdLmJwb2ludGVyID0gYWRkcjsKKwl4b3JfaW5fZmRlc2NbeG9yX2NidWZfd3JfY250cl0tPmJkZXNjW2lkeF0uYmNvbnRyb2wgPSBjdHJsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWRtYV94b3Jfc2V0X291dF9iZGVzYyh1MzIgeG9yX2NidWZfd3JfY250ciwgdTMyIGlkeCwgdTMyIGFkZHIsIHUzMiBjdHJsKQoreworCXhvcl9vdXRfZmRlc2NbeG9yX2NidWZfd3JfY250cl0tPmJkZXNjW2lkeF0uYnBvaW50ZXIgPSBhZGRyOworCXhvcl9vdXRfZmRlc2NbeG9yX2NidWZfd3JfY250cl0tPmJkZXNjW2lkeF0uYmNvbnRyb2wgPSBjdHJsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWRtYV94b3JfaW5fYmRlc2NfY3RybF91cGRhdGUodTMyIHhvcl9jYnVmX3dyX2NudHIsdTMyIGlkeCwgdTMyIGN0cmwpCit7CisJeG9yX2luX2ZkZXNjW3hvcl9jYnVmX3dyX2NudHJdLT5iZGVzY1tpZHhdLmJjb250cm9sIHw9IGN0cmw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZG1hX3hvcl9vdXRfYmRlc2NfY3RybF91cGRhdGUodTMyIHhvcl9jYnVmX3dyX2NudHIsdTMyIGlkeCwgdTMyIGN0cmwpCit7CisJeG9yX291dF9mZGVzY1t4b3JfY2J1Zl93cl9jbnRyXS0+YmRlc2NbaWR4XS5iY29udHJvbCB8PSBjdHJsOworfQorCisvKioqKioqKioqKioqKioqKioqIFhPUiBmdW5jdGlvbnMgZW5kICoqKioqKioqKioqKioqKioqKioqLworCitleHRlcm4gdm9pZCBjb21jZXJ0b19kbWFfZ2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgY29tY2VydG9fZG1hX3B1dCh2b2lkKTsKK2V4dGVybiB2b2lkIGNvbWNlcnRvX2RtYV9zZXRfaW5fYmRlc2ModTMyIGlkeCwgdTMyIGFkZHIsIHUzMiBjdHJsKTsKK2V4dGVybiB2b2lkIGNvbWNlcnRvX2RtYV9zZXRfb3V0X2JkZXNjKHUzMiBpZHgsIHUzMiBhZGRyLCB1MzIgY3RybCk7CitleHRlcm4gdm9pZCBjb21jZXJ0b19kbWFfc3RhcnQodm9pZCk7CitleHRlcm4gdm9pZCBjb21jZXJ0b19kbWFfd2FpdCh2b2lkKTsKK2V4dGVybiB2b2lkIGNvbWNlcnRvX2RvX21kbWFfeG9yKHVuc2lnbmVkIGludCBzcmNfY291bnQsIHVuc2lnbmVkIGludCBieXRlcywgZG1hX2FkZHJfdCBkZXN0LCBkbWFfYWRkcl90ICpzcmNzKTsKK2V4dGVybiB2b2lkIGNvbWNlcnRvX2RvX21kbWFfbWVtY3B5KHZvaWQpOworCitpbnQgY29tY2VydG9fZG1hX3NnX2FkZF9pbnB1dChzdHJ1Y3QgY29tY2VydG9fZG1hX3NnICpzZywgdm9pZCAqcCwgdW5zaWduZWQgaW50IGxlbiwgaW50IHVzZV9hY3ApOworaW50IGNvbWNlcnRvX2RtYV9zZ19hZGRfb3V0cHV0KHN0cnVjdCBjb21jZXJ0b19kbWFfc2cgKnNnLCB2b2lkICpwLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgdXNlX2FjcCk7Cit2b2lkIGNvbWNlcnRvX2RtYV9zZ19zZXR1cChzdHJ1Y3QgY29tY2VydG9fZG1hX3NnICpzZywgdW5zaWduZWQgaW50IGxlbik7Cit2b2lkIGNvbWNlcnRvX2RtYV9zZ19jbGVhbnVwKHN0cnVjdCBjb21jZXJ0b19kbWFfc2cgKnNnLCB1bnNpZ25lZCBpbnQgbGVuKTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvbWNlcnRvX2RtYV9zZ19pbml0KHN0cnVjdCBjb21jZXJ0b19kbWFfc2cgKnNnKQoreworCXNnLT5pbnB1dF9pZHggPSAwOworCXNnLT5vdXRwdXRfaWR4ID0gMDsKKwlzZy0+aGlnaF9waHlzX2FkZHIgPSAweDA7CisJc2ctPmxvd19waHlzX2FkZHIgPSAweGZmZmZmZmZmOworfQorCisjZW5kaWYKKworI2VuZGlmIC8qIEMyS19ETUFfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjdkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiAgYXJjaC9hcm0vYXJjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICisjZXJyb3IgIkRvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVNNX0FSQ0hfQ09NQ0VSVE8yMDAwX0hfXworI2RlZmluZSBfX0FTTV9BUkNIX0NPTUNFUlRPMjAwMF9IX18KKworCisvKgorICAqIFN5c3RlbSBDbG9jayBGcmVxdWVuY2llcworICAqLworI2lmZGVmIENPTkZJR19SVFNNX0MySworI2RlZmluZSBDT01DRVJUT19ERUZBVUxUQVhJQ0xLICAgICAgICAgICg2MDAwMDAwMDAvMykgLyogSHogKi8KKyNlbHNlCisjZGVmaW5lIENPTUNFUlRPX0RFRkFVTFRBWElDTEsgICAgICAgICAgMjAwMDAwMDAwIC8qIEh6ICovCisjZW5kaWYKKworCisvKgorICogU0NVIHJlZ2lzdGVycyAKKyAqLworI2RlZmluZSBDT01DRVJUT19TQ1VfQkFTRQkJCQkJMHhGRkYwMDAwMAkJCQorI2RlZmluZSBDT01DRVJUT19HSUNfQ1BVX0JBU0UJCQkJKENPTUNFUlRPX1NDVV9CQVNFICsgMHgxMDApCisjZGVmaW5lIENPTUNFUlRPX1RXRF9CQVNFCQkJCQkoQ09NQ0VSVE9fU0NVX0JBU0UgKyAweDYwMCkKKyNkZWZpbmUgQ09NQ0VSVE9fVFdEX1BFUkNQVV9CQVNFCQkJKENPTUNFUlRPX1NDVV9CQVNFICsgMHg3MDApCisjZGVmaW5lIENPTUNFUlRPX0dJQ19ESVNUX0JBU0UJCQkJKENPTUNFUlRPX1NDVV9CQVNFICsgMHgxMDAwKQorI2RlZmluZSBDT01DRVJUT19MMzEwX0JBU0UJCQkJCShDT01DRVJUT19TQ1VfQkFTRSArIDB4MTAwMDApCisKKyNkZWZpbmUgQ09NQ0VSVE9fTDJDQ19BU1NPQ0lBVElWSVRZX1NISUZUCTE2CisjZGVmaW5lIENPTUNFUlRPX0wyQ0NfQVNTT0NJQVRJVklUWV9NQVNLCTB4MDAwMTAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fTDJDQ19BU1NPQ0lBVElWSVRZXzhXQVkJMHgwCisjZGVmaW5lIENPTUNFUlRPX0wyQ0NfQVNTT0NJQVRJVklUWV8xNldBWQkweDEKKworI2RlZmluZSBDT01DRVJUT19MMkNDX1dBWVNJWkVfU0hJRlQJCQkxNworI2RlZmluZSBDT01DRVJUT19MMkNDX1dBWVNJWkVfTUFTSwkJCTB4MDAwRTAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fTDJDQ19BU1NPQ0lBVElWSVRZXzMyS0IJMHgyCisKKyNkZWZpbmUgQ09NQ0VSVE9fTDJDQ19XUl9MQVRfU0hJRlQJCQk4CisjZGVmaW5lIENPTUNFUlRPX0wyQ0NfUkRfTEFUX1NISUZUCQkJNAorCisKKy8qCisgICogUGh5c2ljYWwgYWRkcmVzcyBvZiBJTyBvbiBBUEIgQnVzCisgICovCisKKyNkZWZpbmUgQ09NQ0VSVE9fQVBCX1RETV9CQVNFCQkJMHg5MDQwMDAwMAorI2RlZmluZSBDT01DRVJUT19BUEJfVVNCUEhZX1NFUkRFU19TVEFUX0JBU0UJMHg5MDQxMDAwMAorI2RlZmluZSBDT01DRVJUT19BUEJfVERNQV9CQVNFCQkJMHg5MDQyMDAwMAorI2RlZmluZSBDT01DRVJUT19BUEJfVElNRVJfQkFTRQkJCTB4OTA0NTAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVBCX1BDSV9TQVRBX1VTQl9DVFJMX0JBU0UJMHg5MDQ2MDAwMAorI2RlZmluZSBDT01DRVJUT19BUEJfR1BJT19CQVNFCQkJMHg5MDQ3MDAwMAorI2RlZmluZSBDT01DRVJUT19BUEJfVUFSVDBfQkFTRQkJCTB4OTA0OTAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVBCX1NQSV9CQVNFCQkJMHg5MDQ5ODAwMAorI2RlZmluZSBDT01DRVJUT19BUEJfSTJDX0JBU0UJCQkweDkwNDlDMDAwCisjZGVmaW5lIENPTUNFUlRPX0FQQl9VU0IzX0JBU0UJCQkweDkwNEEwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FQQl9DTEtfQkFTRQkJCTB4OTA0QjAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVBCX1JUQ19CQVNFCQkJMHg5MDRFMDAwMAorI2RlZmluZSBDT01DRVJUT19BUEJfT1RQX0JBU0UJCQkweDkwNEYwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FQQl9QRkVfQkFTRQkJCTB4OTA1MDAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVBCX1NFUkRFU19DT05GX0JBU0UJCTB4OTA1OTAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVBCX0VYUEJVU19CQVNFCQkweDkwNUEwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FQQl9ERFJQSFlfQkFTRQkJMHg5MDVCMDAwMAorI2RlZmluZSBDT01DRVJUT19BUEJfVERNQTJfQkFTRQkJCTB4OTA1RDAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVBCX01ETUFfQkFTRQkJCTB4OTA1RTAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVBCX0E5Q1NfQkFTRQkJCTB4OTA2MDAwMDAKKworCisvKgorICAqIFBoeXNpY2FsIGFkZHJlc3Mgb24gQVhJIEJ1cworICAqLworI2RlZmluZSBDT01DRVJUT19BWElfSElHSE1FTUREUl9CQVNFCQkweEZGRkYwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FYSV9ERFJfQkFTRQkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX0FDUF9CQVNFCQkJMHg4MDAwMDAwMCAvKiA0OE1CICovCisjZGVmaW5lIENPTUNFUlRPX0FYSV9JUkFNX0JBU0UJCQkweDgzMDAwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FYSV9JQlJfQkFTRQkJCTB4OTAwMDAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX0FQQl9CQVNFCQkJMHg5MDQwMDAwMCAvKiAxMk1CICovCisjZGVmaW5lIENPTUNFUlRPX0FYSV9TRU1BX0JBU0UJCQkweDkxMDAwMDAwIC8qIDE2TUIgKi8KKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX1VTQjJQMF9CQVNFCQkweDkyMDAwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FYSV9UUlVTVFpPTkVfQkFTRQkJMHg5MzAwMDAwMAorI2RlZmluZSBDT01DRVJUT19BWElfRFBJMF9CQVNFCQkJMHg5NDAwMDAwMCAvKiAxNk1CICovCisjZGVmaW5lIENPTUNFUlRPX0FYSV9EUEkxX0JBU0UJCQkweDk1MDAwMDAwIC8qIDE2TUIgKi8KKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX1VBUlRfU1BJX0JBU0UJCTB4OTYwMDAwMDAgLyogMTZNQiAqLworI2RlZmluZSBDT01DRVJUT19BWElfVUFSVDBfQkFTRQkJCShDT01DRVJUT19BWElfVUFSVF9TUElfQkFTRSArIDB4MDAzMDAwMDApCisjZGVmaW5lIENPTUNFUlRPX0FYSV9VQVJUMV9CQVNFCQkJKENPTUNFUlRPX0FYSV9VQVJUX1NQSV9CQVNFICsgMHgwMDQwMDAwMCkKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX1NQSV9CQVNFCQkJKENPTUNFUlRPX0FYSV9VQVJUX1NQSV9CQVNFICsgMHgwMDUwMDAwMCkKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX0REUkNPTkZJR19CQVNFCQkweDk3MDAwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FYSV9QQ0llMV9CQVNFCQkJMHg5OTAwMDAwMAorI2RlZmluZSBDT01DRVJUT19BWElfUENJZTBfQkFTRQkJCTB4OTgwMDAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX0lQU0VDX0JBU0UJCQkweDlBMDAwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FYSV9TUEFDQ19QRFVfQkFTRQkJMHg5QjAwMDAwMCAvKiAxNk1CICovCisjZGVmaW5lIENPTUNFUlRPX0FYSV9QRkVfQkFTRQkJCTB4OUMwMDAwMDAgLyogMTZNQiAqLworI2RlZmluZSBDT01DRVJUT19BWElfU0FUQV9CQVNFCQkJMHg5RDAwMDAwMCAvKiAxNk1CICovCisjZGVmaW5lIENPTUNFUlRPX0FYSV9ERUNUX0JBU0UJCQkweDlFMDAwMDAwIC8qIDE2TUIgKi8KKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX1VTQjNQMF9CQVNFICAgICAgICAgICAgICAgIDB4OUYwMDAwMDAgLyogMTZNQiAqLworI2RlZmluZSBDT01DRVJUT19BWElfUENJZTBfU0xBVkVfQkFTRQkweEEwMDAwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FYSV9QQ0llMV9TTEFWRV9CQVNFCTB4QjAwMDAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX0VYUF9CQVNFCQkJMHhDMDAwMDAwMAorI2RlZmluZSBDT01DRVJUT19BWElfRVhQX0VDQ19CQVNFCQkweENGRkYwMDAwIC8qIDY0S0IgKi8KKworI2RlZmluZSBDT01DRVJUT19BWElfQUNQX1NJWkUJCQkoMSA8PCAyNCkKKworI2RlZmluZSBDT01DRVJUT19ERFJfU0hBUkVEX0JBU0UJCShDT01DRVJUT19BWElfRERSX0JBU0UgKyAweDJDMDAwMDApCisjZGVmaW5lIENPTUNFUlRPX0REUl9TSEFSRURfU0laRQkJKFNaXzE2TSArIFNaXzRNKQorCisvKiBNU1AgbWVtb3J5IG1hcCAqLworI2RlZmluZSBDT01DRVJUT19NU1BfRERSX0JBU0UJCQlDT01DRVJUT19ERFJfU0hBUkVEX0JBU0UKKyNkZWZpbmUgQ09NQ0VSVE9fTVNQX0REUl9TSVpFX0NCCQkoU1pfMU0gKiA1KQorI2RlZmluZSBDT01DRVJUT19NU1BfRERSX1NJWkVfTkNOQgkJKFNaXzFNICogMykKKyNkZWZpbmUgQ09NQ0VSVE9fTVNQX0REUl9TSVpFCQkJKENPTUNFUlRPX01TUF9ERFJfU0laRV9DQiArIENPTUNFUlRPX01TUF9ERFJfU0laRV9OQ05CKQorCisvKiBQRkUgbWVtb3J5IG1hcCAqLworI2RlZmluZSBDT01DRVJUT19BUEJfUEZFX1NJWkUJCQlTWl82NEsKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX1BGRV9TSVpFCQkJU1pfMTZNCisjZGVmaW5lIENPTUNFUlRPX0FYSV9JUFNFQ19TSVpFCQkJU1pfMTZNCisjZGVmaW5lIENPTUNFUlRPX1BGRV9ERFJfQkFTRQkJCShDT01DRVJUT19ERFJfU0hBUkVEX0JBU0UgKyBTWl84TSkKKyNkZWZpbmUgQ09NQ0VSVE9fUEZFX0REUl9TSVpFCQkJKFNaXzhNICsgU1pfNE0pCisjZGVmaW5lIENPTUNFUlRPX1BGRV9JUkFNX0JBU0UJCQkoQ09NQ0VSVE9fQVhJX0lSQU1fQkFTRSArIDB4MDAwMCkKKyNkZWZpbmUgQ09NQ0VSVE9fUEZFX0lSQU1fU0laRQkJCVNaXzhLCisKKyNkZWZpbmUgSU9fU1BBQ0VfTElNSVQJCQkJCTAKKworLyogTURNQSBtZW1vcnkgbWFwICovCisjZGVmaW5lIENPTUNFUlRPX0FQQl9NRE1BX1NJWkUgICAgICAgICAgU1pfMUsrU1pfNAorCisvKgorICogVmlydHVhbCBhZGRyZXNzIG1hcHBpbmcKKyAqLworI2RlZmluZSBDT01DRVJUT19NU1BfVkFERFIJCQkweGYwMDAwMDAwCisjZGVmaW5lIENPTUNFUlRPX1BGRV9WQUREUiAgICAgICAgICAgICAgICAgICAgIDB4ZmEwMDAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fUEZFX0FYSV9WQUREUiAgICAgICAgIDB4ZmMwMDAwMDAKKyNkZWZpbmUgQ09NQ0VSVE9fU0NVX1ZBRERSCQkJCUNPTUNFUlRPX1NDVV9CQVNFCisjZGVmaW5lIENPTUNFUlRPX0dJQ19DUFVfVkFERFIJCQkoQ09NQ0VSVE9fU0NVX1ZBRERSICsgMHgxMDApCisjZGVmaW5lIENPTUNFUlRPX0dJQ19HTE9CQUxfVElNRVJfVkFERFIJKENPTUNFUlRPX1NDVV9WQUREUiArIDB4MjAwKQorI2RlZmluZSBDT01DRVJUT19UV0RfVkFERFIJCQkJKENPTUNFUlRPX1NDVV9WQUREUiArIDB4NjAwKQorI2RlZmluZSBDT01DRVJUT19HSUNfRElTVF9WQUREUgkJCShDT01DRVJUT19TQ1VfVkFERFIgKyAweDEwMDApCisjZGVmaW5lIENPTUNFUlRPX0wzMTBfVkFERFIJCQkJKENPTUNFUlRPX1NDVV9WQUREUiArIDB4MTAwMDApCisKKyNkZWZpbmUgQ09NQ0VSVE9fRElTVFJfSU5UX1NFVF9QRU5ESU5HICAgICAgICAgICAgICAgICAgIChDT01DRVJUT19HSUNfRElTVF9WQUREUiArIDB4MjAwKQorI2RlZmluZSBDT01DRVJUT19ESVNUUl9JTlRfU0VUX1BFTkRJTkdfT0ZGU0VUXzQgICAgICAgICAgKENPTUNFUlRPX0RJU1RSX0lOVF9TRVRfUEVORElORyArIDB4NCkKKyNkZWZpbmUgQ09NQ0VSVE9fRElTVFJfSU5UX1NFVF9QRU5ESU5HX09GRlNFVF84ICAgICAgICAgIChDT01DRVJUT19ESVNUUl9JTlRfU0VUX1BFTkRJTkcgKyAweDgpCisKKyNkZWZpbmUgSVJBTV9NRU1PUllfVkFERFIJCQkweGYwODAwMDAwCisjZGVmaW5lIENPTUNFUlRPX0FQQl9WQUREUgkJCQkweGYwOTAwMDAwCS8qIFZBIG9mIElPIG9uIEFQQiBidXMgKi8KKyNkZWZpbmUgQ09NQ0VSVE9fQVBCX1NJWkUJCQkJMHgwMEMwMDAwMAkKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX1VBUlRfU1BJX1ZBRERSCQkweEYxNjAwMDAwIAorI2RlZmluZSBDT01DRVJUT19BWElfVUFSVF9TUElfU0laRQkJMHgwMTAwMDAwMCAKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX0RNQV9WQUREUgkJCShDT01DRVJUT19BWElfVUFSVF9TUElfVkFERFIrMHgwMDAwMDAwMCkgCisjZGVmaW5lIENPTUNFUlRPX0FYSV9VQVJUMF9WQUREUgkJKENPTUNFUlRPX0FYSV9VQVJUX1NQSV9WQUREUisweDAwMzAwMDAwKSAKKyNkZWZpbmUgQ09NQ0VSVE9fQVhJX1VBUlQxX1ZBRERSCQkoQ09NQ0VSVE9fQVhJX1VBUlRfU1BJX1ZBRERSKzB4MDA0MDAwMDApIAorI2RlZmluZSBDT01DRVJUT19BWElfU1NJX1ZBRERSCQkJKENPTUNFUlRPX0FYSV9VQVJUX1NQSV9WQUREUisweDAwNTAwMDAwKSAKKworI2RlZmluZSBDT01DRVJUT19TRU1BX1ZBRERSCQkJMHhmNDAwMDAwMAorI2RlZmluZSBDT01DRVJUT19BWElfUENJZTBfVkFERFJfQkFTRQkJMHhmNTAwMDAwMAorI2RlZmluZSBDT01DRVJUT19BWElfUENJZTFfVkFERFJfQkFTRQkJMHhmNjAwMDAwMAorI2RlZmluZSBDT01DRVJUT19ERUNUX1ZBRERSCQkJMHhmNzAwMDAwMAorCisvKiAKKyAgKiBSZWZlcmVuY2UgQ2xvY2sgT3B0aW9uIGluIEJvb3QgU3RyYXAgUmVnaXN0ZXIKKyAgKgorICAqIEJJVCBbOTo4XSBTeXN0ZW0gUExMIFJlZmNsayBTZWxlY3QgCisgICogJzAwJyAtIFVTQiBYVEFMCisgICogJzAxJyAtIFNlcmRlcyAjMCBSZWZjbGsKKyAgKiAnMTAnIC0gU2VyZGVzICMxIFJlZmNsaworICAqICcxMScgLSBTZXJkZXMgWFRBTAorICAqCisgICogQklUWzddICAgU2VyZGVzIE9TQyBQQUQgLSBSZWZlcmVuY2UgY2xvY2sgZnJlcXVlbmN5IHNlbGVjdGlvbiBib290c3RyYXAgKGludmVydGVkIHZhbHVlIG9mIFNGMSkKKyAgKiAnMCcgLSAzME1IeiB+IDUwTUh6CisgICogJzEnIC0gMTVNSHogfiAzME1IegorICAqIE5vdGU6IFNGMCBpcyB0aWVkIHRvIDEgaW4gR1BJTyBibG9jayBhbmQgbWlnaHQgbGF0ZXIgb24gYmUgY29udHJvbGxlZCBkdXJpbmcgREZUCisgICoKKyAgKiBCSVRbNV0gICBVU0IvU3lzIFBMTCBPU0MgUEFEIC0gUmVmZXJlbmNlIGNsb2NrIGZyZXF1ZW5jeSBzZWxlY3Rpb24gYm9vdHN0cmFwIChpbnZlcnRlZCB2YWx1ZSBvZiBTRjEpCisgIConMCcgLSAzME1IeiB+IDUwTUh6CisgICogJzEnIC0gMTVNSHogfiAzME1IegorICAqIE5vdGU6IFNGMCBpcyB0aWVkIHRvIDEgaW4gR1BJTyBibG9jayBhbmQgbWlnaHQgbGF0ZXIgb24gYmUgY29udHJvbGxlZCBkdXJpbmcgREZUCisgICoKKyAgKi8KKworI2RlZmluZSBHUElPX1NZU19QTExfUkVGX0NMS19NQVNLCQkJKDB4MDAwMDAxMDAgfCAweDAwMDAwMjAwKQorI2RlZmluZSBHUElPX1NZU19QTExfUkVGX0NMS19TSElGVAkJCTgKKworI2RlZmluZSBVU0JfWFRBTF9SRUZfQ0xLCQkJCQkwCisjZGVmaW5lIFNFUkRFU18wX1JFRl9DTEsJCQkJCTEKKyNkZWZpbmUgU0VSREVTXzJfUkVGX0NMSwkJCQkJMgorI2RlZmluZSBTRVJERVNfWFRBTF9SRUZfQ0xLCQkJCQkzCisKKyNkZWZpbmUgR1BJT19TRVJERVNfT1NDX1BBRF9NQVNLCQkJKDB4MDAwMDAwODApCisjZGVmaW5lIEdQSU9fU0VSREVTX09TQ19QQURfU0hJRlQJCQk3CisKKyNkZWZpbmUgR1BJT19VU0JfT1NDX1BBRF9NQVNLCQkJCSgweDAwMDAwMDIwKQorI2RlZmluZSBHUElPX1VTQl9PU0NfUEFEX1NISUZUCQkJCTUKKworI2RlZmluZSBSRUZfQ0xLXzI0TUhaCQkJCQkJMjQwMDAwMDAgLyogMjQgTUh6ICovCisjZGVmaW5lIFJFRl9DTEtfNDhNSFoJCQkJCQk0ODAwMDAwMCAvKiA0OCBNSHogKi8KKworCisvKiBVU0IgMi4wICovCisjZGVmaW5lIFVTQjJfUEhZX0JBU0UJCQkJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX1BDSV9TQVRBX1VTQl9DVFJMX0JBU0UpCisKKy8qIFVTQiAzLjAgKi8KKyNkZWZpbmUgVVNCM19QSFlfQkFTRSAgICAgICAgICAgQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9VU0IzX0JBU0UpCisKKyNkZWZpbmUgVVNCUEhZX1NFUkRFU19TVEFUX0JBU0UgQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9VU0JQSFlfU0VSREVTX1NUQVRfQkFTRSkKKworLyogSW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvY2xrLXJzdC5oPgorI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tMjAwMC90aW1lci5oPgorI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tMjAwMC9ncGlvLmg+CisjaW5jbHVkZSA8bWFjaC9jb21jZXJ0by0yMDAwL2V4cC1idXMuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvcGNpZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tMjAwMC9zZXJkZXMuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvbWVtb3J5Lmg+CisjaW5jbHVkZSA8bWFjaC9jMmtfZG1hLmg+CisKKyNkZWZpbmUgY29tY2VydG9fdGltZXI0X3NldChoYm91bmQpCV9fcmF3X3dyaXRlbCgoaGJvdW5kKSwgQ09NQ0VSVE9fVElNRVI0X0hJR0hfQk9VTkQpCisKKyNkZWZpbmUgY29tY2VydG9fdGltZXI0X2dldCgpCQlfX3Jhd19yZWFkbChDT01DRVJUT19USU1FUjRfQ1VSUkVOVF9DT1VOVCkKKworCisjZGVmaW5lIGNvbWNlcnRvX3RpbWVyNV9zZXQobGJvdW5kLCBoYm91bmQsIGN0cmwpICBkbyB7CQkJCQkJCQlcCisJCQkJCQkgICAgICBfX3Jhd193cml0ZWwoKGN0cmwpICYgMHgxLCBDT01DRVJUT19USU1FUjVfQ1RSTCk7CVwKKwkJCQkJCSAgICAgIF9fcmF3X3dyaXRlbCgobGJvdW5kKSwgQ09NQ0VSVE9fVElNRVI1X0xPV19CT1VORCk7CVwKKwkJCQkJCSAgICAgIF9fcmF3X3dyaXRlbCgoaGJvdW5kKSwgQ09NQ0VSVE9fVElNRVI1X0hJR0hfQk9VTkQpOwlcCisJCQkJCQkgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgY29tY2VydG9fdGltZXI1X2dldCgpCQlfX3Jhd19yZWFkbChDT01DRVJUT19USU1FUjVfQ1VSUkVOVF9DT1VOVCkKKworLyogTnVtYmVyIG9mIGdlbWFjcyBzdXBwb3J0ZWQgaW4gY29tY2VydG8gMjAwMCAqLworI2RlZmluZSBOVU1fR0VNQUNfU1VQUE9SVAkzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9jbGstcnN0LmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL2Nsay1yc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzFlYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9jbGstcnN0LmgKQEAgLTAsMCArMSwyNTIgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9jbGstcnN0LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0NMS19IX18KKyNkZWZpbmUgX19DTEtfSF9fCisKKy8qCisgKiBDbG9jayBSZXNldCBSZWdpc3RlcnMKKyAqLworI2RlZmluZSBERVZJQ0VfUlNUX0NOVFJMCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwMDApCisjZGVmaW5lIFNFUkRFU19SU1RfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDAwNCkKKyNkZWZpbmUgUENJZV9TQVRBX1JTVF9DTlRSTAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MDA4KQorI2RlZmluZSBVU0JfUlNUX0NOVFJMCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MDBDKQorI2RlZmluZSBHTlJMX0RFVklDRV9DTkZHXzAJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDAxMCkKKyNkZWZpbmUgR05STF9ERVZJQ0VfQ05GR18xIAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MDE0KQorI2RlZmluZSBHTlJMX0RFVklDRV9TVEFUVVMJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDAxOCkKKyNkZWZpbmUgQTlEUF9QV1JfU1RBVAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDAyOCkKKyNkZWZpbmUgQTlEUF9QV1JfQ05UUkwJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwMkMpCisjZGVmaW5lIEdOUkxfQ0xLX0NOVFJMXzAgCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwMzApCisjZGVmaW5lIEdOUkxfQ0xLX0NOVFJMXzEJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDAzNCkKKyNkZWZpbmUgUExMU19HTE9CQUxfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDAzOCkKKyNkZWZpbmUgQVhJX0NMS19DTlRSTF8wCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MDQwKQorI2RlZmluZSBBWElfQ0xLX0NOVFJMXzEJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwNDQpCisjZGVmaW5lIEFYSV9DTEtfQ05UUkxfMgkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDA0OCkKKyNkZWZpbmUgQVhJX0NMS19ESVZfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDA0QykKKyNkZWZpbmUgQVhJX1JFU0VUXzAJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwNTApCisjZGVmaW5lIEFYSV9SRVNFVF8xCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MDU0KQorI2RlZmluZSBBWElfUkVTRVRfMgkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDA1OCkKKyNkZWZpbmUgQTlEUF9NUFVfQ0xLX0NOVFJMCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHg2OCkKKyNkZWZpbmUgQTlEUF9NUFVfQ0xLX0RJVl9DTlRSTCAgICAgICAJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4NkMpCisjZGVmaW5lIEE5RFBfTVBVX1JFU0VUICAgICAgICAgICAgICAgCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDcwKQorI2RlZmluZSBBOURQX0NQVV9DTEtfQ05UUkwgICAgICAgICAgIAlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHg3NCkKKyNkZWZpbmUgQTlEUF9DUFVfUkVTRVQgICAgICAgICAgICAgICAJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4NzgpCisjZGVmaW5lIEE5RFBfQ0xLX0NOVFJMICAgICAgICAgICAgICAgCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDgwKQorI2RlZmluZSBBOURQX0NMS19ESVZfQ05UUkwgICAgICAgICAgIAlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHg4NCkKKyNkZWZpbmUgQTlEUF9SRVNFVCAgICAgICAgICAgICAgICAgICAJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4ODgpCisjZGVmaW5lIEwyQ0NfQ0xLX0NOVFJMCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MDkwKQorI2RlZmluZSBMMkNDX0NMS19ESVZfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDA5NCkKKyNkZWZpbmUgTDJDQ19SRVNFVAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDA5OCkKKyNkZWZpbmUgVFBJX0NMS19DTlRSTAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDBBMCkKKyNkZWZpbmUgVFBJX0NMS19ESVZfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDBBNCkKKyNkZWZpbmUgVFBJX1JFU0VUCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MEE4KQorI2RlZmluZSBDU1lTX0NMS19DTlRSTAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDBCMCkKKyNkZWZpbmUgQ1NZU19DTEtfRElWX0NOVFJMCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwQjQpCisjZGVmaW5lIENTWVNfUkVTRVQJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwQjgpCisjZGVmaW5lIEVYVFBIWTBfQ0xLX0NOVFJMCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwQzApCisjZGVmaW5lIEVYVFBIWTBfQ0xLX0RJVl9DTlRSTAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MEM0KQorI2RlZmluZSBFWFRQSFkwX1JFU0VUCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MEM4KQorI2RlZmluZSBFWFRQSFkxX0NMS19DTlRSTAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MEQwKQorI2RlZmluZSBFWFRQSFkxX0NMS19ESVZfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDBENCkKKyNkZWZpbmUgRVhUUEhZMV9SRVNFVAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDBEOCkKKyNkZWZpbmUgRVhUUEhZMl9DTEtfQ05UUkwgCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwRTApCisjZGVmaW5lIEVYVFBIWTJfQ0xLX0RJVl9DTlRSTCAJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDBFNCkKKyNkZWZpbmUgRVhUUEhZMl9SRVNFVAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDBFOCkKKyNkZWZpbmUgRERSX0NMS19DTlRSTCAJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwRjApCisjZGVmaW5lIEREUl9DTEtfRElWX0NOVFJMIAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MEY0KQorI2RlZmluZSBERFJfUkVTRVQJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgwRjgpCisjZGVmaW5lIFBGRV9DTEtfQ05UUkwgCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTAwKQorI2RlZmluZSBQRkVfQ0xLX0RJVl9DTlRSTCAJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDEwNCkKKyNkZWZpbmUgUEZFX1JFU0VUCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTA4KQorI2RlZmluZSBJUFNFQ19DTEtfQ05UUkwJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxMTApCisjZGVmaW5lIElQU0VDX0NMS19ESVZfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDExNCkKKyNkZWZpbmUgSVBTRUNfUkVTRVQJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxMTgpCisjZGVmaW5lIERFQ1RfQ0xLX0NOVFJMIAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDEyMCkKKyNkZWZpbmUgREVDVF9DTEtfRElWX0NOVFJMIAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTI0KQorI2RlZmluZSBERUNUX1JFU0VUIAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDEyOCkKKyNkZWZpbmUgR0VNVFhfQ0xLX0NOVFJMCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTMwKQorI2RlZmluZSBHRU1UWF9DTEtfRElWX0NOVFJMCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxMzQpCisjZGVmaW5lIEdFTVRYX1JFU0VUCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTM4KQorI2RlZmluZSBURE1OVEdfUkVGX0NMS19DTlRSTCAJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDE0MCkKKyNkZWZpbmUgVERNTlRHX1JFRl9DTEtfRElWX0NOVFJMIAlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxNDQpCisjZGVmaW5lIFRETU5UR19SRVNFVCAJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxNDgpCisjZGVmaW5lIFRETV9DTEtfQ05UUkwJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxNEMpCisjZGVmaW5lIFRTVU5UR19SRUZfQ0xLX0NOVFJMIAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTUwKQorI2RlZmluZSBUU1VOVEdfUkVGX0NMS19ESVZfQ05UUkwgCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDE1NCkKKyNkZWZpbmUgVFNVTlRHX1JFU0VUIAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDE1OCkKKyNkZWZpbmUgU0FUQV9QTVVfQ0xLX0NOVFJMIAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTYwKQorI2RlZmluZSBTQVRBX1BNVV9DTEtfRElWX0NOVFJMIAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTY0KQorI2RlZmluZSBTQVRBX1BNVV9SRVNFVCAJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxNjgpCisjZGVmaW5lIFNBVEFfT09CX0NMS19DTlRSTCAJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDE3MCkKKyNkZWZpbmUgU0FUQV9PT0JfQ0xLX0RJVl9DTlRSTCAJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDE3NCkKKyNkZWZpbmUgU0FUQV9PT0JfUkVTRVQgCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTc4KQorI2RlZmluZSBTQVRBX09DQ19DTEtfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDE4MCkKKyNkZWZpbmUgU0FUQV9PQ0NfQ0xLX0RJVl9DTlRSTAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MTg0KQorI2RlZmluZSBTQVRBX09DQ19SRVNFVAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDE4OCkKKyNkZWZpbmUgUENJRV9PQ0NfQ0xLX0NOVFJMCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxOTApCisjZGVmaW5lIFBDSUVfT0NDX0NMS19ESVZfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDE5NCkKKyNkZWZpbmUgUENJRV9PQ0NfUkVTRVQJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxOTgpCisjZGVmaW5lIFNHTUlJX09DQ19DTEtfQ05UUkwgCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxQTApCisjZGVmaW5lIFNHTUlJX09DQ19DTEtfRElWX0NOVFJMIAlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxQTQpCisjZGVmaW5lIFNHTUlJX09DQ19SRVNFVCAJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDFBOCkKKyNkZWZpbmUgUExMMF9NX0xTQgkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDFDMCkKKyNkZWZpbmUgUExMMF9NX01TQgkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDFDNCkKKyNkZWZpbmUgUExMMF9QCQkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDFDOCkKKyNkZWZpbmUgUExMMF9TCQkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDFDQykKKyNkZWZpbmUgUExMMF9DTlRSTAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDFEMCkKKyNkZWZpbmUgUExMMF9URVNUCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MUQ0KQorI2RlZmluZSBQTEwwX1NUQVRVUwkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDFEOCkKKyNkZWZpbmUgUExMMF9ESVZfQ05UUkwJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxREMpCisjZGVmaW5lIFBMTDFfTV9MU0IJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxRTApCisjZGVmaW5lIFBMTDFfTV9NU0IJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxRTQpCisjZGVmaW5lIFBMTDFfUAkJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxRTgpCisjZGVmaW5lIFBMTDFfUwkJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxRUMpCisjZGVmaW5lIFBMTDFfQ05UUkwJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxRjApCisjZGVmaW5lIFBMTDFfVEVTVAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDFGNCkKKyNkZWZpbmUgUExMMV9TVEFUVVMJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgxRjgpCisjZGVmaW5lIFBMTDFfRElWX0NOVFJMCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MUZDKQorI2RlZmluZSBQTEwyX01fTFNCCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MjAwKQorI2RlZmluZSBQTEwyX01fTVNCCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MjA0KQorI2RlZmluZSBQTEwyX1AJCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MjA4KQorI2RlZmluZSBQTEwyX1MJCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MjBDKQorI2RlZmluZSBQTEwyX0NOVFJMCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MjEwKQorI2RlZmluZSBQTEwyX1RFU1QJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgyMTQpCisjZGVmaW5lIFBMTDJfU1RBVFVTCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MjE4KQorI2RlZmluZSBQTEwyX0RJVl9DTlRSTAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDIxQykKKyNkZWZpbmUgUExMM19NX0xTQgkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDIyMCkKKyNkZWZpbmUgUExMM19NX01TQgkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDIyNCkKKyNkZWZpbmUgUExMM19QCQkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDIyOCkKKyNkZWZpbmUgUExMM19TCQkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDIyYykKKyNkZWZpbmUgUExMM19DTlRSTAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDIzMCkKKyNkZWZpbmUgUExMM19URVNUCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MjM0KQorI2RlZmluZSBQTEwzX1NUQVRVUwkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDIzOCkKKyNkZWZpbmUgUExMM19ESVRIRVJfQ05UUkwJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDIzQykKKyNkZWZpbmUgUExMM19LX0xTQiAJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgyNDApCisjZGVmaW5lIFBMTDNfS19NU0IgCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9DTEtfQkFTRSArIDB4MjQ0KQorI2RlZmluZSBQTEwzX01GUiAJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgyNDgpCisjZGVmaW5lIFBMTDNfTVJSIAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDI0QykKKworI2RlZmluZSBQTEwwCQkJCTAKKyNkZWZpbmUgUExMMQkJCQkxCisjZGVmaW5lIFBMTDIJCQkJMgorI2RlZmluZSBQTEwzCQkJCTMKKworLyogRGV2aWNlIFJlc2V0IENvbnRyb2wgUmVnaXN0ZXIgKERFVklDRV9SU1RfQ05UUkwpKi8KKworI2RlZmluZSBDTEtfRElWX1JFU1RBUlQgICAgICAgICAoMSA8PCA3KQorI2RlZmluZSBXRF9TVEFUVVNfQ0xSICAgICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBBWElfV0RfUlNUX0VOICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBERUJVR19SU1QgICAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBDTEtSU1RfU0NMUl9SU1QgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBGVU5DX1NDTFJfUlNUICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBHTEJfU0NMUl9SU1QgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBQV1JfT05fU09GVF9SU1QgICAgICAgICAoMSA8PCAwKQorCisvKiBHZW5lcmFsIERldmljZSBDb25maWd1cmF0aW9uIFN0YXR1cyBSZWdpc3RlciAoR05STF9ERVZJQ0VfU1RBVFVTKSAqLworI2RlZmluZSBDUFUxX1dEX1JTVF9BQ1RJVkFURUQgICAoMSA8PCAyKQorI2RlZmluZSBDUFUwX1dEX1JTVF9BQ1RJVkFURUQgICAoMSA8PCAxKQorI2RlZmluZSBBWElfV0RfUlNUX0FDVElWQVRFRCAgICAoMSA8PCAwKQorCisvKiBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIENMT0NLX0RPTUFJTl9FTkFCTEUJCTEKKyNkZWZpbmUgQ0xPQ0tfRE9NQUlOX0VOQUJMRV9TSElGVAkwCisKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX1BMTDAJCTAKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX1BMTDEJCTEKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX1BMTDIJCTIKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX1BMTDMJCTMKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX1BMTDQJCTQKKworI2RlZmluZSBDTE9DS19TT1VSQ0VfU0hJRlQJCTEKKworI2RlZmluZSBDTEtfRElWX0JZUEFTUwkJCSgxIDw8IDcpCisjZGVmaW5lIENMS19ESVZfUkFUSU9fTUFTSwkJMHgxZgorCisjZGVmaW5lIFBMTF9WU0VMCQkJKDEgPDwgNikKKyNkZWZpbmUgUExMX0xPQ0tfRU4JCQkoMSA8PCA1KQorI2RlZmluZSBQTExfQllQQVNTCQkJKDEgPDwgNCkKKyNkZWZpbmUgUExMX1JFU0VUCQkJKDEgPDwgMCkKKworI2RlZmluZSBQTExfTE9DSwkJCSgxIDw8IDApCisKKyNkZWZpbmUgQ0xLX1BMTF9TUkNfTUFTSwkJMHg3CisjZGVmaW5lIENMS19QTExfU1JDX1NISUZUCQkxCisjZGVmaW5lIENMS19BOURQX1BFUklfRElWX0JZUEFTUwkoMSA8PCAzKQorCisKKy8qIFRETU5URyAqLworI2RlZmluZSBURE1OVEdfQUREUl9TUEFDRV9CQVNFQUREUiAJCUFQQl9WQUREUihDT01DRVJUT19BUEJfQ0xLX0JBU0UgKyAweDI4MCkKKworI2RlZmluZSBURE1fTlRHX0NMS19DVFJMCShURE1OVEdfQUREUl9TUEFDRV9CQVNFQUREUiArIDB4MDApCisjZGVmaW5lIFRETV9OVEdfSU5DUgkJKFRETU5UR19BRERSX1NQQUNFX0JBU0VBRERSICsgMHgwNCkKKyNkZWZpbmUgVERNX0ZTWU5DX0dFTl9DVFJMCShURE1OVEdfQUREUl9TUEFDRV9CQVNFQUREUiArIDB4MDgpCisjZGVmaW5lCVRETV9GU1lOQ19MT1cJCShURE1OVEdfQUREUl9TUEFDRV9CQVNFQUREUiArIDB4MEMpCisjZGVmaW5lIFRETV9GU1lOQ19ISUdICQkoVERNTlRHX0FERFJfU1BBQ0VfQkFTRUFERFIgKyAweDEwKQorCisjZGVmaW5lIEZTWU5DX0ZBTExfRURHRQkJKDEgPDwgMSkKKyNkZWZpbmUJTlRHX0RJVl9SU1RfTgkJKDEgPDwgNSkKKyNkZWZpbmUgTlRHX0VOCQkJKDEgPDwgMCkKKworCisvKiBUU1VOVEcgKi8KKyNkZWZpbmUgVFNVTlRHX0FERFJfU1BBQ0VfQkFTRUFERFIgCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0NMS19CQVNFICsgMHgyQzApCisKKy8qIFVTQiAzLjAgKi8KKyNkZWZpbmUgVVNCMV9VVE1JX1JTVCAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgVVNCMV9QSFlfUlNUICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgVVNCMV9BWElfUlNUICAgICAgICAgICAgKDEgPDwgNCkKKworLyogVVNCIDIuMCAqLworI2RlZmluZSBVU0IwX1BIWV9SU1QJCSgxIDw8IDApCisjZGVmaW5lIFVTQjBfVVRNSV9SU1QJCSgxIDw8IDEpCisjZGVmaW5lIFVTQjBfQVhJX1JTVAkJKDEgPDwgMykKKworLyogQ1BVICovCisjZGVmaW5lIENQVTBfUlNUCQkJKDEgPDwgMCkKKyNkZWZpbmUgTkVPTjBfUlNUCQkJKDEgPDwgMSkKKyNkZWZpbmUgQ1BVMV9SU1QJCQkoMSA8PCAyKQorI2RlZmluZSBORU9OMV9SU1QJCQkoMSA8PCAzKQorCisjZGVmaW5lIENQVTBfQ0xLX0VOQUJMRQkJKDEgPDwgMCkKKyNkZWZpbmUgTkVPTjBfQ0xLX0VOQUJMRQkoMSA8PCAxKQorI2RlZmluZSBDUFUxX0NMS19FTkFCTEUJCSgxIDw8IDIpCisjZGVmaW5lIE5FT04xX0NMS19FTkFCTEUJKDEgPDwgMykKKworI2RlZmluZSBHTE9CQUxfQ0xLX0VOQUJMRQkoMSA8PCAwKQorCisjZGVmaW5lIENMQU1QX0NPUkUwICAgICAJKDEgPDwgNCkKKyNkZWZpbmUgQ0xBTVBfQ09SRTEgICAgIAkoMSA8PCA2KQorI2RlZmluZSBDT1JFX1BXUkRXTjAgICAgICAgICgxIDw8IDUpCisjZGVmaW5lIENPUkVfUFdSRFdOMSAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgTVBfUFdSRFdOICAgICAgIAkoMSA8PCAwKQorCisjZGVmaW5lIFNDUFJFICAgCQkJKDEgPDwgNCkKKyNkZWZpbmUgU0NBTEwgICAJCQkoMSA8PCA1KQorI2RlZmluZSBJU09fRU4gIAkJCSgxIDw8IDYpCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qIEZ1bmN0aW9uIERlY2xhcmF0aW9uICovCitleHRlcm4gdm9pZCBIQUxfY2xrX2Rpdl9iYWNrdXBfcmVsb2NhdGVfdGFibGUgKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgSEFMX2dldF9yZWZfY2xrICh2b2lkKTsKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9jbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOWZiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL2Nsb2NrLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtY29tY2VydG8vY2xvY2suaAorICoKKyAqIENsb2NrIGNvbnRyb2wgZHJpdmVyIGZvciBDb21jZXJ0byBDMksgZGV2aWNlIC0gaW50ZXJuYWwgaGVhZGVyIGZpbGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0KKyAqIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkgd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4KKyAqLworI2lmbmRlZiBfX0FSQ0hfQVJNX0MyS19DTE9DS19IX18KKyNkZWZpbmUgX19BUkNIX0FSTV9DMktfQ0xPQ0tfSF9fCisKKyNkZWZpbmUgQ0xLX0RPTUFJTl9NQVNLICgxPDwwKQorI2RlZmluZSBDTEtfRE9NQUlOX1NQSV9JMkNfTUFTSyAoMTw8NSkKKyNkZWZpbmUgQ0xLX0RPTUFJTl9URE1OVEdfTUFTSyAoMTw8NCkKKyNkZWZpbmUgQ0xLX0RPTUFJTl9VQVJUX01BU0sgKDE8PDYpCisjZGVmaW5lIENMS19ET01BSU5fUENJRTBfTUFTSyAoMTw8MCkKKyNkZWZpbmUgQ0xLX0RPTUFJTl9QQ0lFMV9NQVNLICgxPDwxKQorI2RlZmluZSBDTEtfRE9NQUlOX0lQU0VDX1NQQUNDX01BU0sgKDE8PDIpCisjZGVmaW5lIENMS19ET01BSU5fRFBJX0NJRV9NQVNLICgxPDw1KQorI2RlZmluZSBDTEtfRE9NQUlOX0RQSV9ERUNPTVBfTUFTSyAoMTw8NikKKyNkZWZpbmUgQ0xLX0RPTUFJTl9VU0IwX01BU0sgKDE8PDMpCisjZGVmaW5lIENMS19ET01BSU5fVVNCMV9NQVNLICgxPDw0KQorI2RlZmluZSBDTEtfRE9NQUlOX0RVU19NQVNLICAoMTw8MCkKKyNkZWZpbmUgQ0xLX0RPTUFJTl9TQVRBX01BU0sgKDE8PDIpCisKK3N0cnVjdCBjbGsgeworCXN0cnVjdCBjbGsgKnBhcmVudDsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGxvbmcgIHJhdGU7ICAgICAgICAgIC8qIERlZmF1bHQgcmF0ZSB2YWx1ZSBpbiBIWiAqLworCWludCB1c2Vjb3VudDsKKwl1MzIgICAgICAgICAgICAgZW5hYmxlX3JlZzsKKwl1MzIgICAgICAgICAgICAgY2xrZ2VuX3JlZzsKKwl1MzIgICAgICAgICAgICAgZGl2X3JlZzsKKwl1MzIgICAgICAgICAgICAgZW5hYmxlX21hc2s7CisJdW5zaWduZWQgbG9uZwkoKmdldF9yYXRlKShzdHJ1Y3QgY2xrICopOworICAgICAgICBpbnQgCQkoKnNldF9yYXRlKSAoc3RydWN0IGNsayAqLCB1bnNpZ25lZCBsb25nIHJhdGUpOworfTsKK2V4dGVybiBpbnQgY2xrX2luaXQodm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvZXhwLWJ1cy5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9leHAtYnVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhMzlhMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvZXhwLWJ1cy5oCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogIGFyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvZXhwLWJ1cy5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMiBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19DT01DRVJUT19FWFBfQlVTX0hfXworI2RlZmluZSBfX0NPTUNFUlRPX0VYUF9CVVNfSF9fCisKKworLyoqKioqIFJlZ2lzdGVycyBhZGRyZXNzICoqKioqLworCisjZGVmaW5lIENPTUNFUlRPX0VYUF9TV19SU1RfUgkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfRVhQQlVTX0JBU0UgKyAweDAwMCkKKyNkZWZpbmUgQ09NQ0VSVE9fRVhQX0NTX0VOX1IJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0VYUEJVU19CQVNFICsgMHgwMDQpCisjZGVmaW5lIENPTUNFUlRPX0VYUF9DU3hfQkFTRV9SKHgpCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0VYUEJVU19CQVNFICsgMHgwMDggKyAweDQgKiAoeCkpCisjZGVmaW5lIENPTUNFUlRPX0VYUF9DU3hfU0VHX1IoeCkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfRVhQQlVTX0JBU0UgKyAweDAxQyArIDB4NCAqICh4KSkKKyNkZWZpbmUgQ09NQ0VSVE9fRVhQX0NTeF9DRkdfUih4KQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9FWFBCVVNfQkFTRSArIDB4MDMwICsgMHg0ICogKHgpKQorI2RlZmluZSBDT01DRVJUT19FWFBfQ1N4X1RNRzFfUih4KQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9FWFBCVVNfQkFTRSArIDB4MDQ0ICsgMHg0ICogKHgpKQorI2RlZmluZSBDT01DRVJUT19FWFBfQ1N4X1RNRzJfUih4KQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9FWFBCVVNfQkFTRSArIDB4MDU4ICsgMHg0ICogKHgpKQorI2RlZmluZSBDT01DRVJUT19FWFBfQ1N4X1RNRzNfUih4KQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9FWFBCVVNfQkFTRSArIDB4MDZDICsgMHg0ICogKHgpKQorI2RlZmluZSBDT01DRVJUT19FWFBfQ0xPQ0tfRElWX1IJCUFQQl9WQUREUihDT01DRVJUT19BUEJfRVhQQlVTX0JBU0UgKyAweDA4MCkKKyNkZWZpbmUgQ09NQ0VSVE9fRVhQX01GU01fUgkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfRVhQQlVTX0JBU0UgKyAweDEwMCkKKyNkZWZpbmUgQ09NQ0VSVE9fRVhQX0NTRlNNX1IJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0VYUEJVU19CQVNFICsgMHgxMDQpCisjZGVmaW5lIENPTUNFUlRPX0VYUF9XUlNNX1IJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0VYUEJVU19CQVNFICsgMHgxMDgpCisjZGVmaW5lIENPTUNFUlRPX0VYUF9SRFNNX1IJCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0VYUEJVU19CQVNFICsgMHgxMEMpCisKKwkKKy8qKioqKiBNYXNrcyAqKioqKi8KKworLyogRVhQX1NXUlNUX1IgcmVnaXN0ZXIqLworI2RlZmluZSBFWFBfU1dfUlNUCQkJMHgwMDAwMDAwMQorCQorLyogRVhQX0NTX0VOX1IgcmVnaXN0ZXIqLworI2RlZmluZSBFWFBfQ1M0X0VOCQkJMHgwMDAwMDAyMAorI2RlZmluZSBFWFBfQ1MzX0VOCQkJMHgwMDAwMDAxMAorI2RlZmluZSBFWFBfQ1MyX0VOCQkJMHgwMDAwMDAwOAorI2RlZmluZSBFWFBfQ1MxX0VOCQkJMHgwMDAwMDAwNAorI2RlZmluZSBFWFBfQ1MwX0VOCQkJMHgwMDAwMDAwMgorI2RlZmluZSBFWFBfQ1N4X0VOKHgpCQkJKDEgPDwgKCh4KSArIDEpKQorI2RlZmluZSBFWFBfQ0xLX0VOCQkJMHgwMDAwMDAwMQorCisvKiBFWFBfQ1N4X0NGR19SIHJlZ2lzdGVyKi8KKyNkZWZpbmUgRVhQX1JEWV9FREcJCQkweDAwMDAwODAwCisjZGVmaW5lIEVYUF9SRFlfRU4JCQkweDAwMDAwNDAwCisjZGVmaW5lIEVYUF9OQU5EX01PREUJCQkweDAwMDAwMjAwCisjZGVmaW5lIEVYUF9ETV9NT0RFCQkJMHgwMDAwMDEwMAorI2RlZmluZSBFWFBfU1RSQl9NT0RFCQkJMHgwMDAwMDA4MAorI2RlZmluZSBFWFBfQUxFX01PREUJCQkweDAwMDAwMDQwCisjZGVmaW5lIEVYUF9SRV9DTURfTFZMCQkJMHgwMDAwMDAyMAorI2RlZmluZSBFWFBfV0VfQ01EX0xWTAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRVhQX0NTX0xFVkVMCQkJMHgwMDAwMDAwOAorI2RlZmluZSBFWFBfTUVNX0JVU19TSVpFCQkweDAwMDAwMDA2CisjZGVmaW5lIEVYUF9NRU1fQlVTX1NJWkVfMzIJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRVhQX01FTV9CVVNfU0laRV8xNgkJMHgwMDAwMDAwMgorI2RlZmluZSBFWFBfTUVNX0JVU19TSVpFXzgJCTB4MDAwMDAwMDAKKworCisKKyNkZWZpbmUgRVhQX0NTMF9TRUdfU0laRQkJU1pfMTI4TQorI2RlZmluZSBFWFBfQ1MxX1NFR19TSVpFCQlTWl8xTQorI2RlZmluZSBFWFBfQ1MyX1NFR19TSVpFCQlTWl8xTQorI2RlZmluZSBFWFBfQ1MzX1NFR19TSVpFCQlTWl8xTQorI2RlZmluZSBFWFBfQ1M0X1NFR19TSVpFCQlTWl8xTQorCisjZGVmaW5lIEVYUF9DUzBfQVhJX0JBU0VBRERSCQlDT01DRVJUT19BWElfRVhQX0JBU0UKKyNkZWZpbmUgRVhQX0NTMV9BWElfQkFTRUFERFIJCShFWFBfQ1MwX0FYSV9CQVNFQUREUiArIEVYUF9DUzBfU0VHX1NJWkUpCisjZGVmaW5lIEVYUF9DUzJfQVhJX0JBU0VBRERSCQkoRVhQX0NTMV9BWElfQkFTRUFERFIgKyBFWFBfQ1MxX1NFR19TSVpFKQorI2RlZmluZSBFWFBfQ1MzX0FYSV9CQVNFQUREUgkJKEVYUF9DUzJfQVhJX0JBU0VBRERSICsgRVhQX0NTMl9TRUdfU0laRSkKKyNkZWZpbmUgRVhQX0NTNF9BWElfQkFTRUFERFIJCShFWFBfQ1MzX0FYSV9CQVNFQUREUiArIEVYUF9DUzNfU0VHX1NJWkUpCisKKyNkZWZpbmUgRVhQX0JVU19SRUdfQkFTRV9DUzAJCShFWFBfQ1MwX0FYSV9CQVNFQUREUiAmIH4weGYwMDAwMDAwKQorI2RlZmluZSBFWFBfQlVTX1JFR19CQVNFX0NTMQkJKEVYUF9DUzFfQVhJX0JBU0VBRERSICYgfjB4ZjAwMDAwMDApCisjZGVmaW5lIEVYUF9CVVNfUkVHX0JBU0VfQ1MyCQkoRVhQX0NTMl9BWElfQkFTRUFERFIgJiB+MHhmMDAwMDAwMCkKKyNkZWZpbmUgRVhQX0JVU19SRUdfQkFTRV9DUzMJCShFWFBfQ1MzX0FYSV9CQVNFQUREUiAmIH4weGYwMDAwMDAwKQorI2RlZmluZSBFWFBfQlVTX1JFR19CQVNFX0NTNAkJKEVYUF9DUzRfQVhJX0JBU0VBRERSICYgfjB4ZjAwMDAwMDApCisKKy8qIEVYUF9DU3hfVE1HMV9SIHJlZ2lzdGVyICovCisvKiBFWFBfQ1N4X1RNRzJfUiByZWdpc3RlciAqLworLyogRVhQX0NTeF9UTUczX1IgcmVnaXN0ZXIgKi8KKwkKKy8qIEVYUF9DTE9DS19ESVZfUiByZWdpc3RlciAqLworCQorLyogRVhQX01GU01fUiByZWdpc3RlciovCisvKiBFWFBfQ1NGU01fUiByZWdpc3RlciovCisvKiBFWFBfV1JGU01fUiByZWdpc3RlciovCisvKiBFWFBfUkRGU01fUiByZWdpc3RlciovCisJCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY0YjE3NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvZ3Bpby5oCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogIGFyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvZ3Bpby5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMiBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19DT01DRVJUT19HUElPX0hfXworI2RlZmluZSBfX0NPTUNFUlRPX0dQSU9fSF9fCisKKy8qKioqKiBHUElPICAqKioqKi8KKyNkZWZpbmUgQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MDApCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fT0VfUkVHCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDA0KQorI2RlZmluZSBDT01DRVJUT19HUElPX0lOVF9DRkdfUkVHCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MDgpCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fSU5QVVRfUkVHCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDEwKQorI2RlZmluZSBDT01DRVJUT19HUElPX0FQQl9XUwkJCUFQQl9WQUREUihPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDE0KQorI2RlZmluZSBDT01DRVJUT19HUElPX1NZU1RFTV9DT05GSUcJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHgxQykKKyNkZWZpbmUgQ09NQ0VSVE9fR1BJT19URE1fTVVYCQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDI4KQorI2RlZmluZSBDT01DRVJUT19HUElPX01JU0NfQ1RSTAkJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHgzNCkKKyNkZWZpbmUgQ09NQ0VSVE9fR1BJT19ERFJfQVhJX0NUUkwJCUFQQl9WQUREUihPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDM4KQorI2RlZmluZSBDT01DRVJUT19HUElPX0REUkNfU1RBVFVTCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4M0MpCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fQk9PVFNUUkFQX1NUQVRVUwkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDQwKQorI2RlZmluZSBDT01DRVJUT19HUElPX0JPT1RTVFJBUF9PVkVSUklERQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4NDQpCisKKworI2RlZmluZSBDT01DRVJUT19HUElPX0RFVklDRV9JRF9SRUcJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHg1MCkKKyNkZWZpbmUgQ09NQ0VSVE9fR1BJT19QSU5fU0VMRUNUX1JFRwkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDU4KQorI2RlZmluZSBDT01DRVJUT19HUElPX1BJTl9TRUxFQ1RfUkVHMQkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDVDKQorI2RlZmluZSBDT01DRVJUT19HUElPX01JU0NfUElOX1NFTEVDVAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDYwKQorCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fRkFCUklDX0NUUkxfUkVHCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4NkMpCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fQTlfQVVUSF9DVFJMX1JFRwkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDcwKQorI2RlZmluZSBDT01DRVJUT19HUElPX0E5X0FDUF9DT05GX1JFRwkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDc0KQorI2RlZmluZSBDT01DRVJUT19HUElPX1BDSUVfQ0xLX09VVF9DVFJMX1JFRwlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4ODApCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fSU5UUl9DTFJfUkVHCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4OTgpCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fSU5UUl9TRVRfUkVHCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4OUMpCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fSU5UUl9NQVNLX1JFRwkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweEEwKQorI2RlZmluZSBDT01DRVJUT19HUElPX0NTU19ERUNUX1NZU19DRkcwCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4QjApCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fQ1NTX0RFQ1RfU1lTX0NGRzEJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHhCNCkKKyNkZWZpbmUgQ09NQ0VSVE9fR1BJT19DU1NfREVDVF9DVFJMCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4QjgpCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweEQwKQorI2RlZmluZSBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVRfRU4JQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweEQ0KQorI2RlZmluZSBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9JTlBVVAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweEQ4KQorI2RlZmluZSBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHhEQykKKworI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUcwCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTAwKQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUcxCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTA0KQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUcyCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTA4KQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUczCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTBDKQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUc0CQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTEwKQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUc1CQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTE0KQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUc2CQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTE4KQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUc3CQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTFDKQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUc4CQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTIwKQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUc5CQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTI0KQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUcxMAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDEyOCkKKyNkZWZpbmUJQ09NQ0VSVE9fR1BJT19QQURfQ09ORklHMTEJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHgxMkMpCisjZGVmaW5lCUNPTUNFUlRPX0dQSU9fUEFEX0NPTkZJRzEyCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTMwKQorI2RlZmluZQlDT01DRVJUT19HUElPX1BBRF9DT05GSUcxMwkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDEzNCkKKyNkZWZpbmUJQ09NQ0VSVE9fR1BJT19QQURfQ09ORklHMTQJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHgxMzgpCisKKyNkZWZpbmUgQ09NQ0VSVE9fR1BJT19QTVVfSU5UUl9DTFIJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHgxNjApCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fUE1VX0lOVFJfU0VUCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTY0KQorI2RlZmluZSBDT01DRVJUT19HUElPX1BNVV9JTlRSX01BU0swCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTY4KQorI2RlZmluZSBDT01DRVJUT19HUElPX1BNVV9JTlRSX01BU0sxCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MTZDKQorCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fTUVNX0VNQV9DT05GMAkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDFBNCkKKyNkZWZpbmUgQ09NQ0VSVE9fR1BJT19NRU1fRU1BX0NPTkYxCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MUE4KQorI2RlZmluZSBDT01DRVJUT19HUElPX01FTV9FTUFfQ09ORjIJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHgxQTgpCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fTUVNX0VNQV9DT05GMwkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDFBQykKKyNkZWZpbmUgQ09NQ0VSVE9fR1BJT19NRU1fRU1BX0NPTkY0CQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX0dQSU9fQkFTRSArIDB4MUIwKQorI2RlZmluZSBDT01DRVJUT19HUElPX01FTV9FTUFfQ09ORjUJCUFQQl9WQUREUihDT01DRVJUT19BUEJfR1BJT19CQVNFICsgMHgxQjQpCisjZGVmaW5lIENPTUNFUlRPX0dQSU9fTUVNX0VNQV9DT05GNgkJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9HUElPX0JBU0UgKyAweDFCOCkKKworI2RlZmluZSBHUElPXzAJCTB4MDAwMDAwMDMKKyNkZWZpbmUgR1BJT18xCQkweDAwMDAwMDBDCisjZGVmaW5lIEdQSU9fMgkJMHgwMDAwMDAzMAorI2RlZmluZSBHUElPXzMJCTB4MDAwMDAwQzAKKyNkZWZpbmUgR1BJT180CQkweDAwMDAwMzAwCisjZGVmaW5lIEdQSU9fNQkJMHgwMDAwMEMwMAorI2RlZmluZSBHUElPXzYJCTB4MDAwMDMwMDAKKyNkZWZpbmUgR1BJT183CQkweDAwMDBDMDAwCisjZGVmaW5lIEdQSU9fOAkJMHgwMDAzMDAwMAorI2RlZmluZSBHUElPXzkJCTB4MDAwQzAwMDAKKyNkZWZpbmUgR1BJT18xMAkJMHgwMDMwMDAwMAorI2RlZmluZSBHUElPXzExCQkweDAwQzAwMDAwCisjZGVmaW5lIEdQSU9fMTIJCTB4MDMwMDAwMDAKKyNkZWZpbmUgR1BJT18xMwkJMHgwQzAwMDAwMAorI2RlZmluZSBHUElPXzE0CQkweDMwMDAwMDAwCisjZGVmaW5lIEdQSU9fMTUJCTB4QzAwMDAwMDAKKyNkZWZpbmUgR1BJT18xNgkJMHgwMDAwMDAwMworI2RlZmluZSBHUElPXzE3CQkweDAwMDAwMDBDCisjZGVmaW5lIEdQSU9fMTgJCTB4MDAwMDAwMzAKKyNkZWZpbmUgR1BJT18xOQkJMHgwMDAwMDBDMAorI2RlZmluZSBHUElPXzIwCQkweDAwMDAwMzAwCisjZGVmaW5lIEdQSU9fMjEJCTB4MDAwMDBDMDAKKyNkZWZpbmUgR1BJT18yMgkJMHgwMDAwMzAwMAorI2RlZmluZSBHUElPXzIzCQkweDAwMDBDMDAwCisjZGVmaW5lIEdQSU9fMjQJCTB4MDAwMzAwMDAKKyNkZWZpbmUgR1BJT18yNQkJMHgwMDBDMDAwMAorI2RlZmluZSBHUElPXzI2CQkweDAwMzAwMDAwCisjZGVmaW5lIEdQSU9fMjcJCTB4MDBDMDAwMDAKKyNkZWZpbmUgR1BJT18yOAkJMHgwMzAwMDAwMAorI2RlZmluZSBHUElPXzI5CQkweDBDMDAwMDAwCisjZGVmaW5lIEdQSU9fMzAJCTB4MzAwMDAwMDAKKyNkZWZpbmUgR1BJT18zMQkJMHhDMDAwMDAwMAorCisjZGVmaW5lIEdQSU9fMF9TCTB4MDAwMDAwMDEKKyNkZWZpbmUgR1BJT18xX1MJMHgwMDAwMDAwMgorI2RlZmluZSBHUElPXzJfUwkweDAwMDAwMDA0CisKKy8qIEdQSU8gUGluIE51bWJlciBhbmQgRGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgR1BJT19QSU5fTlVNXzAJCTAKKyNkZWZpbmUgR1BJT19QSU5fTlVNXzEJCTEKKyNkZWZpbmUgR1BJT19QSU5fTlVNXzIJCTIKKyNkZWZpbmUgR1BJT19QSU5fTlVNXzMJCTMKKyNkZWZpbmUgR1BJT19QSU5fTlVNXzQJCTQKKyNkZWZpbmUgR1BJT19QSU5fTlVNXzUJCTUKKworI2RlZmluZSBHUElPX1BJTl9ERVNDXzAJCSJncGlvLTAiCisjZGVmaW5lIEdQSU9fUElOX0RFU0NfMQkJImdwaW8tMSIKKyNkZWZpbmUgR1BJT19QSU5fREVTQ18yCQkiZ3Bpby0yIgorI2RlZmluZSBHUElPX1BJTl9ERVNDXzMJCSJncGlvLTMiCisjZGVmaW5lIEdQSU9fUElOX0RFU0NfNAkJImdwaW8tNCIKKyNkZWZpbmUgR1BJT19QSU5fREVTQ181CQkiZ3Bpby01IgorCisjZGVmaW5lCUdQSU9fU0VUXzAJMAorI2RlZmluZQlHUElPX1NFVF8xCTEKKworCisvKiBHUElPIFBpbiBNYXNrICovCisjZGVmaW5lIEdQSU9fUElOXzAJCSgweDEgPDwgMCkKKyNkZWZpbmUgR1BJT19QSU5fMQkJKDB4MSA8PCAxKQorI2RlZmluZSBHUElPX1BJTl8yCQkoMHgxIDw8IDIpCisjZGVmaW5lIEdQSU9fUElOXzMJCSgweDEgPDwgMykKKyNkZWZpbmUgR1BJT19QSU5fNAkJKDB4MSA8PCA0KQorI2RlZmluZSBHUElPX1BJTl81CQkoMHgxIDw8IDUpCisjZGVmaW5lIEdQSU9fUElOXzYJCSgweDEgPDwgNikKKyNkZWZpbmUgR1BJT19QSU5fNwkJKDB4MSA8PCA3KQorI2RlZmluZSBHUElPX1BJTl84CQkoMHgxIDw8IDgpCisjZGVmaW5lIEdQSU9fUElOXzkJCSgweDEgPDwgOSkKKyNkZWZpbmUgR1BJT19QSU5fMTAJCSgweDEgPDwgMTApCisjZGVmaW5lIEdQSU9fUElOXzExCQkoMHgxIDw8IDExKQorI2RlZmluZSBHUElPX1BJTl8xMgkJKDB4MSA8PCAxMikKKyNkZWZpbmUgR1BJT19QSU5fMTMJCSgweDEgPDwgMTMpCisjZGVmaW5lIEdQSU9fUElOXzE0CQkoMHgxIDw8IDE0KQorI2RlZmluZSBHUElPX1BJTl8xNQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgR1BJT19QSU5fMTYJCSgweDEgPDwgMTYpCisjZGVmaW5lIEdQSU9fUElOXzE3CQkoMHgxIDw8IDE3KQorI2RlZmluZSBHUElPX1BJTl8xOAkJKDB4MSA8PCAxOCkKKyNkZWZpbmUgR1BJT19QSU5fMTkJCSgweDEgPDwgMTkpCisjZGVmaW5lIEdQSU9fUElOXzIwCQkoMHgxIDw8IDIwKQorI2RlZmluZSBHUElPX1BJTl8yMQkJKDB4MSA8PCAyMSkKKyNkZWZpbmUgR1BJT19QSU5fMjIJCSgweDEgPDwgMjIpCisjZGVmaW5lIEdQSU9fUElOXzIzCQkoMHgxIDw8IDIzKQorI2RlZmluZSBHUElPX1BJTl8yNAkJKDB4MSA8PCAyNCkKKyNkZWZpbmUgR1BJT19QSU5fMjUJCSgweDEgPDwgMjUpCisjZGVmaW5lIEdQSU9fUElOXzI2CQkoMHgxIDw8IDI2KQorI2RlZmluZSBHUElPX1BJTl8yNwkJKDB4MSA8PCAyNykKKyNkZWZpbmUgR1BJT19QSU5fMjgJCSgweDEgPDwgMjgpCisjZGVmaW5lIEdQSU9fUElOXzI5CQkoMHgxIDw8IDI5KQorI2RlZmluZSBHUElPX1BJTl8zMAkJKDB4MSA8PCAzMCkKKyNkZWZpbmUgR1BJT19QSU5fMzEJCSgweDEgPDwgMzEpCisKKyNkZWZpbmUgR1BJT19QSU5fMzIJCSgweDEgPDwgKDMyIC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl8zMwkJKDB4MSA8PCAoMzMgLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzM0CQkoMHgxIDw8ICgzNCAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fMzUJCSgweDEgPDwgKDM1IC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl8zNgkJKDB4MSA8PCAoMzYgLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzM3CQkoMHgxIDw8ICgzNyAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fMzgJCSgweDEgPDwgKDM4IC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl8zOQkJKDB4MSA8PCAoMzkgLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzQwCQkoMHgxIDw8ICg0MCAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fNDEJCSgweDEgPDwgKDQxIC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl80MgkJKDB4MSA8PCAoNDIgLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzQzCQkoMHgxIDw8ICg0MyAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fNDQJCSgweDEgPDwgKDQ0IC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl80NQkJKDB4MSA8PCAoNDUgLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzQ2CQkoMHgxIDw8ICg0NiAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fNDcJCSgweDEgPDwgKDQ3IC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl80OAkJKDB4MSA8PCAoNDggLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzQ5CQkoMHgxIDw8ICg0OSAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fNTAJCSgweDEgPDwgKDUwIC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl81MQkJKDB4MSA8PCAoNTEgLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzUyCQkoMHgxIDw8ICg1MiAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fNTMJCSgweDEgPDwgKDUzIC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl81NAkJKDB4MSA8PCAoNTQgLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzU1CQkoMHgxIDw8ICg1NSAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fNTYJCSgweDEgPDwgKDU2IC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl81NwkJKDB4MSA8PCAoNTcgLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzU4CQkoMHgxIDw8ICg1OCAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fNTkJCSgweDEgPDwgKDU5IC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl82MAkJKDB4MSA8PCAoNjAgLSAzMikpCisjZGVmaW5lIEdQSU9fUElOXzYxCQkoMHgxIDw8ICg2MSAtIDMyKSkKKyNkZWZpbmUgR1BJT19QSU5fNjIJCSgweDEgPDwgKDYyIC0gMzIpKQorI2RlZmluZSBHUElPX1BJTl82MwkJKDB4MSA8PCAoNjMgLSAzMikpCisKKy8qIEdQSU8gUGluIFNlbGVjdCBQaW5zICovCisKKyNkZWZpbmUgR1BJTzRfUFdNMAkJKDB4MSA8PCA4KQorI2RlZmluZSBHUElPNV9QV00xCQkoMHgxIDw8IDEwKQorI2RlZmluZSBHUElPNl9QV00yCQkoMHgxIDw8IDEyKQorI2RlZmluZSBHUElPNl9TQVRBMF9BQ1RfTEVEIAkoMHgyIDw8IDEyKQorI2RlZmluZSBHUElPN19QV00zCQkoMHgxIDw8IDE0KQorI2RlZmluZSBHUElPN19TQVRBMF9DUF9QT0QgIAkoMHgyIDw8IDE0KQorI2RlZmluZSBHUElPOF9VQVJUMF9SWAkJKDB4MiA8PCAxNikKKyNkZWZpbmUgR1BJTzlfVUFSVDBfVFgJCSgweDIgPDwgMTgpCisjZGVmaW5lIEdQSU8xMF9VQVJUMF9SVFNfTgkoMHgyIDw8IDIwKQorI2RlZmluZSBHUElPMTBfREVDVDAJCSgweDMgPDwgMjApCisjZGVmaW5lIEdQSU8xMV9VQVJUMF9DVFNfTgkoMHgyIDw8IDIyKQorI2RlZmluZSBHUElPMTFfREVDVDIJCSgweDMgPDwgMjIpCisjZGVmaW5lIEdQSU8xMl9QV000CQkoMHgxIDw8IDI0KQorI2RlZmluZSBHUElPMTJfUEZFX1VBUlRfUlgJKDB4MiA8PCAyNCkKKyNkZWZpbmUgR1BJTzEyX0RFQ1QzCQkoMHgzIDw8IDI0KQorI2RlZmluZSBHUElPMTNfUFdNNQkJKDB4MSA8PCAyNikKKyNkZWZpbmUgR1BJTzEzX1BGRV9VQVJUX1RYCSgweDIgPDwgMjYpCisjZGVmaW5lIEdQSU8xM19ERUNUNAkJKDB4MyA8PCAyNikKKyNkZWZpbmUgR1BJTzE0X1NBVEExX0FDVF9MRUQJKDB4MSA8PCAyOCkKKyNkZWZpbmUgR1BJTzE0X1RJTV9FVkVOVDAJKDB4MiA8PCAyOCkKKyNkZWZpbmUgR1BJTzE0X0RFQ1Q1CQkoMHgzIDw8IDI4KQorI2RlZmluZSBHUElPMTVfU0FUQTFfQ1BfUE9EIAkoMHgxIDw8IDMwKQorI2RlZmluZSBHUElPMTVfVElNX0VWRU5UMQkoMHgyIDw8IDMwKQorI2RlZmluZSBHUElPMTVfUlRDT1NDCQkoMHgzIDw8IDMwKQorI2RlZmluZSBHUElPMTZfSTJDX1NDTAkJKDB4MCA8PCAwKQorI2RlZmluZSBHUElPMTdfSTJDX1NEQQkJKDB4MCA8PCAyKQorI2RlZmluZSBHUElPMThfU1BJX1NTMF9OCSgweDAgPDwgNCkKKyNkZWZpbmUgR1BJTzE5X1NQSV9TUzFfTgkoMHgwIDw8IDYpCisjZGVmaW5lIEdQSU8yMF9TUEkyX1NTMV9OCSgweDAgPDwgOCkKKyNkZWZpbmUgR1BJTzIxX1NQSV9TUzJfTgkoMHgwIDw8IDEwKQorI2RlZmluZSBHUElPMjJfU1BJX1NTM19OCSgweDAgPDwgMTIpCisjZGVmaW5lIEdQSU8yM19FWFBfQ1MyCQkoMHgwIDw8IDE0KQorI2RlZmluZSBHUElPMjRfRVhQX0NTMwkJKDB4MCA8PCAxNikKKyNkZWZpbmUgR1BJTzI1X0VYUF9BTEUJCSgweDAgPDwgMTgpCisjZGVmaW5lIEdQSU8yNl9FWFBfUkRZCQkoMHgwIDw8IDIwKQorI2RlZmluZSBHUElPMjdfVE1fRVhUX1JFU0VUCSgweDAgPDwgMjIpCisjZGVmaW5lIEdQSU8yOF9FWFBfTkFORF9DUyAJKDB4MCA8PCAyNCkKKyNkZWZpbmUgR1BJTzI5X0VYUF9OQU5EX1JEWQkoMHgwIDw8IDI2KQorI2RlZmluZSBHUElPMzBfU1BJX1RYRAkJKDB4MCA8PCAyOCkKKyNkZWZpbmUgR1BJTzMxX1NQSV9TQ0xLCQkoMHgwIDw8IDMwKQorI2RlZmluZSBHUElPMzJfU1BJX1JYRAkJKDB4MCA8PCAwKQorI2RlZmluZSBHUElPMzNfU1BJXzJfUlhECSgweDAgPDwgMSkKKyNkZWZpbmUgR1BJTzM0X1NQSV8yX1NTMF9OCSgweDAgPDwgMikKKworI2RlZmluZSBCT09UX1NFUkRFUzFfQ05GX1NBVEEwCSgxIDw8IDExKQorI2RlZmluZSBCT09UX1NFUkRFUzJfQ05GX1NBVEExICAoMSA8PCAxMikKKworCQkJCS8qIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDExIDAwMDAgMDAwMCAqLworI2RlZmluZSBTUElfMl9NVVhfR1BJT18xCShHUElPXzQpCisjZGVmaW5lIFNQSV8yX01VWF9CVVNfMQkJKEdQSU8yMF9TUEkyX1NTMV9OKQorI2RlZmluZSBTUElfMl9NVVhfR1BJT18xX1BJTgkoR1BJT19QSU5fMjApCisKKwkJCQkvKiAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAxMTAgKi8KKyNkZWZpbmUgU1BJXzJfTVVYX0dQSU9fMgkoR1BJT18xX1MgfCBHUElPXzJfUykKKyNkZWZpbmUgU1BJXzJfTVVYX0JVU18yCQkoR1BJTzM0X1NQSV8yX1NTMF9OIHwgR1BJTzMzX1NQSV8yX1JYRCkKKyNkZWZpbmUgU1BJXzJfTVVYX0dQSU9fMl9QSU4JKEdQSU9fUElOXzM0IHwgR1BJT19QSU5fMzMpCisKKwkJCQkvKiAxMTExIDAwMDAgMDAwMCAwMDAwIDAwMTEgMTEwMCAxMTExIDAwMDAgKi8KKyNkZWZpbmUgU1BJX01VWF9HUElPXzEJCShHUElPXzMwIHwgR1BJT18zMSB8IEdQSU9fMTggfCBHUElPXzE5IHwgR1BJT18yMSB8IEdQSU9fMjIpCisjZGVmaW5lIFNQSV9NVVhfQlVTXzEJCShHUElPMzFfU1BJX1NDTEsgfCBHUElPMzBfU1BJX1RYRCB8IEdQSU8yMl9TUElfU1MzX04gfCBHUElPMjFfU1BJX1NTMl9OIFwKKwkJCQkJfCBHUElPMTlfU1BJX1NTMV9OIHwgR1BJTzE4X1NQSV9TUzBfTikKKyNkZWZpbmUgU1BJX01VWF9HUElPXzFfUElOCShHUElPX1BJTl8zMCB8IEdQSU9fUElOXzMxIHwgR1BJT19QSU5fMTggfCBHUElPX1BJTl8xOSB8IEdQSU9fUElOXzIxIHwgR1BJT19QSU5fMjIpCisKKwkJCQkvKiAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDEgKi8KKyNkZWZpbmUgU1BJX01VWF9HUElPXzIJCShHUElPXzBfUykKKyNkZWZpbmUgU1BJX01VWF9CVVNfMgkJKEdQSU8zMl9TUElfUlhEKQorI2RlZmluZSBTUElfTVVYX0dQSU9fMl9QSU4JKEdQSU9fUElOXzMyKQorCisjZGVmaW5lIFVBUlQwX0dQSU8JKEdQSU9fOCB8IEdQSU9fOSB8IEdQSU9fMTAgfCBHUElPXzExKQorI2RlZmluZSBVQVJUMF9CVVMJKEdQSU84X1VBUlQwX1JYIHwgR1BJTzlfVUFSVDBfVFggfCBHUElPMTBfVUFSVDBfUlRTX04gfCBHUElPMTFfVUFSVDBfQ1RTX04pCisjZGVmaW5lIFVBUlQwX0dQSU9fUElOCShHUElPX1BJTl84IHwgR1BJT19QSU5fOSB8IEdQSU9fUElOXzEwIHwgR1BJT19QSU5fMTEpCisKKyNkZWZpbmUgUEZFX1VBUlRfR1BJTwkJKEdQSU9fMTIgfCBHUElPXzEzKQorI2RlZmluZSBQRkVfVUFSVF9CVVMJCShHUElPMTJfUEZFX1VBUlRfUlggfCBHUElPMTNfUEZFX1VBUlRfVFgpCisjZGVmaW5lIFBGRV9VQVJUX0dQSU9fUElOCShHUElPX1BJTl8xMiB8IEdQSU9fUElOXzEzKQorCisjZGVmaW5lIEkyQ19HUElPCQkoR1BJT18xNiB8IEdQSU9fMTcpCisjZGVmaW5lIEkyQ19CVVMJCQkoR1BJTzE2X0kyQ19TQ0wgfCBHUElPMTdfSTJDX1NEQSkKKyNkZWZpbmUgSTJDX0dQSU9fUElOCQkoR1BJT19QSU5fMTYgfCBHUElPX1BJTl8xNykKKworI2RlZmluZSBOQU5EX0dQSU8JCShHUElPXzI4IHwgR1BJT18yOSApCisjZGVmaW5lIE5BTkRfQlVTCQkoR1BJTzI4X0VYUF9OQU5EX0NTIHwgR1BJTzI5X0VYUF9OQU5EX1JEWSkKKyNkZWZpbmUgTkFORF9HUElPX1BJTgkJKEdQSU9fUElOXzI4IHwgR1BJT19QSU5fMjkpCisKKyNkZWZpbmUgTk9SX0dQSU8JCShHUElPXzI1IHwgR1BJT18yNikKKyNkZWZpbmUgTk9SX0JVUwkJCShHUElPMjVfRVhQX0FMRSB8IEdQSU8yNl9FWFBfUkRZKQorI2RlZmluZSBOT1JfR1BJT19QSU4JCShHUElPX1BJTl8yNSB8IEdQSU9fUElOXzI2KQorCisjZGVmaW5lIEMyS19HUElPX05SX0dQSU9TCTY0CisKKyNkZWZpbmUgQVJDSF9OUl9HUElPUwkJQzJLX0dQSU9fTlJfR1BJT1MKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qIFRoaXMgaXMgYSB0ZW1wb3JhcnkgYml0IG1hc2sgZm9yIGF2b2lkaW5nIHVzYWdlIG9mIHJlc2VydmVkIGdwaW8gcGlucy4gKi8KK3N0cnVjdCBjMmtfZ3Bpb19waW5fc3RhdF9pbmZvIHsKKwl1aW50MzJfdCBjMmtfZ3Bpb19waW5zXzBfMzE7CisJdWludDMyX3QgYzJrX2dwaW9fcGluc18zMl82MzsKK307CisKK2V4dGVybiBzdHJ1Y3QgYzJrX2dwaW9fcGluX3N0YXRfaW5mbyBjMmtfZ3Bpb19waW5fc3RhdDsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvaTJjLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL2kyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmY5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL2kyYy5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtY29tY2VydG8vY29tY2VydG8xMDAwL2kyYy5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworI2lmbmRlZiBfX0FTTV9BUkNIX0NPTUNFUlRPMTAwMF9JMkNfSAorI2RlZmluZSBfX0FTTV9BUkNIX0NPTUNFUlRPMTAwMF9JMkNfSAorCisjZGVmaW5lIENPTUNFUlRPX0kyQ19BRERSCQkoMHgwMCo0KQorI2RlZmluZSBDT01DRVJUT19JMkNfREFUQQkJKDB4MDEqNCkKKyNkZWZpbmUgQ09NQ0VSVE9fSTJDX0NOVFIJCSgweDAyKjQpCisjZGVmaW5lIENPTUNFUlRPX0kyQ19TVEFUCQkoMHgwMyo0KQorI2RlZmluZSBDT01DRVJUT19JMkNfQ0NSRlMJCSgweDAzKjQpCisjZGVmaW5lIENPTUNFUlRPX0kyQ19YQUREUgkJKDB4MDQqNCkKKyNkZWZpbmUgQ09NQ0VSVE9fSTJDX0NDUkgJCSgweDA1KjQpCisjZGVmaW5lIENPTUNFUlRPX0kyQ19SRVNFVAkJKDB4MDcqNCkKKworLyogQ05UUiAtIENvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBDTlRSX0lFTgkJCSgxPDw3KQorI2RlZmluZSBDTlRSX0VOQUIJCQkoMTw8NikKKyNkZWZpbmUgQ05UUl9TVEEJCQkoMTw8NSkKKyNkZWZpbmUgQ05UUl9TVFAJCQkoMTw8NCkKKyNkZWZpbmUgQ05UUl9JRkxHCQkJKDE8PDMpCisjZGVmaW5lIENOVFJfQUFLCQkJKDE8PDIpCisKKy8qIFNUQVQgLSBTdGF0dXMgY29kZXMgKi8KKyNkZWZpbmUgU1RBVF9CVVNfRVJST1IJCQkweDAwCS8qIEJ1cyBlcnJvciBpbiBtYXN0ZXIgbW9kZSBvbmx5ICovCisjZGVmaW5lIFNUQVRfU1RBUlQJCQkweDA4CS8qIFN0YXJ0IGNvbmRpdGlvbiB0cmFuc21pdHRlZCAqLworI2RlZmluZSBTVEFUX1NUQVJUX1JFUEVBVEVECQkweDEwCS8qIFJlcGVhdGVkIFN0YXJ0IGNvbmRpdGlvbiB0cmFuc21pdGVkICovCisjZGVmaW5lIFNUQVRfQUREUl9XUl9BQ0sJCTB4MTgJLyogQWRkcmVzcyArIFdyaXRlIGJpdCB0cmFuc21pdHRlZCwgQUNLIHJlY2VpdmVkICovCisjZGVmaW5lIFNUQVRfQUREUl9XUl9OQUNLCQkweDIwCS8qIEFkZHJlc3MgKyBXcml0ZSBiaXQgdHJhbnNtaXR0ZWQsIE5BQ0sgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgU1RBVF9EQVRBX1dSX0FDSwkJMHgyOAkvKiBEYXRhIGJ5dGUgdHJhbnNtaXR0ZWQgaW4gbWFzdGVyIG1vZGUgLCBBQ0sgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgU1RBVF9EQVRBX1dSX05BQ0sJCTB4MzAJLyogRGF0YSBieXRlIHRyYW5zbWl0dGVkIGluIG1hc3RlciBtb2RlICwgTkFDSyByZWNlaXZlZCAqLworI2RlZmluZSBTVEFUX0FSQklUX0xPU1QJCQkweDM4CS8qIEFyYml0cmF0aW9uIGxvc3QgaW4gYWRkcmVzcyBvciBkYXRhIGJ5dGUgKi8KKyNkZWZpbmUgU1RBVF9BRERSX1JEX0FDSwkJMHg0MAkvKiBBZGRyZXNzICsgUmVhZCBiaXQgdHJhbnNtaXR0ZWQsIEFDSyByZWNlaXZlZCAgKi8KKyNkZWZpbmUgU1RBVF9BRERSX1JEX05BQ0sJCTB4NDgJLyogQWRkcmVzcyArIFJlYWQgYml0IHRyYW5zbWl0dGVkLCBOQUNLIHJlY2VpdmVkICAqLworI2RlZmluZSBTVEFUX0RBVEFfUkRfQUNLCQkweDUwCS8qIERhdGEgYnl0ZSByZWNlaXZlZCBpbiBtYXN0ZXIgbW9kZSwgQUNLIHRyYW5zbWl0dGVkICAqLworI2RlZmluZSBTVEFUX0RBVEFfUkRfTkFDSwkJMHg1OAkvKiBEYXRhIGJ5dGUgcmVjZWl2ZWQgaW4gbWFzdGVyIG1vZGUsIE5BQ0sgdHJhbnNtaXR0ZWQqLworI2RlZmluZSBTVEFUX0FSQklUX0xPU1RfQUREUgkJMHg2OAkvKiBBcmJpdHJhdGlvbiBsb3N0IGluIGFkZHJlc3MgICovCisjZGVmaW5lIFNUQVRfR0VORVJBTF9DQUxMCQkweDcwCS8qIEdlbmVyYWwgQ2FsbCwgQUNLIHRyYW5zbWl0dGVkICovCisjZGVmaW5lIFNUQVRfTk9fUkVMRVZBTlRfSU5GTwkJMHhGOAkvKiBObyByZWxldmFudCBzdGF0dXMgaW5mb3JtYXRpb24sIElGTEY9MCAqLworCisjZW5kaWYgLyogX19BU01fQVJDSF9DT01DRVJUTzEwMDBfSTJDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvaW8uaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWIzNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9pby5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtY29tY2VydG8vY29tY2VydG8tMTAwMC9pby5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19BU01fQVJDSF9DT01DRVJUTzEwMDBfSU9fSAorI2RlZmluZSBfX0FTTV9BUkNIX0NPTUNFUlRPMTAwMF9JT19ICisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNpZiAhZGVmaW5lZChDT05GSUdfUENJKQorCisjZGVmaW5lIF9faW8oYSkJCQkoKHZvaWQgX19pb21lbSAqKShhKSkKKyNkZWZpbmUgX19tZW1fcGNpKGEpCShhKQorCisjZWxzZQorCisjZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKKworLyogSU8gcG9ydHMgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgb3V0Yih2LHApCV9fcmVhZHdyaXRlX2J1Zygib3V0YiIpCisjZGVmaW5lIG91dHcodixwKQlfX3JlYWR3cml0ZV9idWcoIm91dHciKQorI2RlZmluZSBvdXRsKHYscCkJX19yZWFkd3JpdGVfYnVnKCJvdXRsIikKKworI2RlZmluZSBpbmIocCkJCShfX3JlYWR3cml0ZV9idWcoImluYiIpLCAwKQorI2RlZmluZSBpbncocCkJCShfX3JlYWR3cml0ZV9idWcoImludyIpLCAwKQorI2RlZmluZSBpbmwocCkJCShfX3JlYWR3cml0ZV9idWcoImlubCIpLCAwKQorCisjZGVmaW5lIG91dHNiKHAsZCxsKQlfX3JlYWR3cml0ZV9idWcoIm91dHNiIikKKyNkZWZpbmUgb3V0c3cocCxkLGwpCV9fcmVhZHdyaXRlX2J1Zygib3V0c3ciKQorI2RlZmluZSBvdXRzbChwLGQsbCkJX19yZWFkd3JpdGVfYnVnKCJvdXRzbCIpCisKKyNkZWZpbmUgaW5zYihwLGQsbCkJKF9fcmVhZHdyaXRlX2J1ZygiaW5zYiIpLCAwKQorI2RlZmluZSBpbnN3KHAsZCxsKQkoX19yZWFkd3JpdGVfYnVnKCJpbnN3IiksIDApCisjZGVmaW5lIGluc2wocCxkLGwpCShfX3JlYWR3cml0ZV9idWcoImluc2wiKSwgMCkKKworLyoKKyAqIGlve3JlYWQsd3JpdGV9ezgsMTYsMzJ9IG1hY3JvcworICovCisKKyNkZWZpbmUgaW9yZWFkOChwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gX19yYXdfcmVhZGIocCk7IF9fdjsgfSkKKyNkZWZpbmUgaW9yZWFkMTYocCkJKHsgdW5zaWduZWQgaW50IF9fdiA9IGxlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KHApKTsgX192OyB9KQorI2RlZmluZSBpb3JlYWQzMihwKQkoeyB1bnNpZ25lZCBpbnQgX192ID0gbGUzMl90b19jcHUoX19yYXdfcmVhZGwocCkpOyBfX3Y7IH0pCisKKyNkZWZpbmUgaW93cml0ZTgodixwKQlfX3Jhd193cml0ZWIodiwgcCkKKyNkZWZpbmUgaW93cml0ZTE2KHYscCkJX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KHYpLCBwKQorI2RlZmluZSBpb3dyaXRlMzIodixwKQlfX3Jhd193cml0ZWwoY3B1X3RvX2xlMzIodiksIHApCisKKyNkZWZpbmUgaW9yZWFkOF9yZXAocCxkLGMpCV9fcmF3X3JlYWRzYihwLGQsYykKKyNkZWZpbmUgaW9yZWFkMTZfcmVwKHAsZCxjKQlfX3Jhd19yZWFkc3cocCxkLGMpCisjZGVmaW5lIGlvcmVhZDMyX3JlcChwLGQsYykJX19yYXdfcmVhZHNsKHAsZCxjKQorCisjZGVmaW5lIGlvd3JpdGU4X3JlcChwLHMsYykJX19yYXdfd3JpdGVzYihwLHMsYykKKyNkZWZpbmUgaW93cml0ZTE2X3JlcChwLHMsYykJX19yYXdfd3JpdGVzdyhwLHMsYykKKyNkZWZpbmUgaW93cml0ZTMyX3JlcChwLHMsYykJX19yYXdfd3JpdGVzbChwLHMsYykKKworI2RlZmluZSBpb3BvcnRfbWFwKGMscykJCShfX3JlYWR3cml0ZV9idWcoImlvcG9ydF9tYXAiKSwgTlVMTCkKKyNkZWZpbmUgaW9wb3J0X3VubWFwKGFkZHIpCV9fcmVhZHdyaXRlX2J1ZygiaW9wb3J0X3VubWFwIikKKworI2VuZGlmIC8qICFkZWZpbmVkKENPTkZJR19QQ0kpICovCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0NPTUNFUlRPMTAwMF9JT19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvaXJxcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNWFmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL2lycXMuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqICBhcmNoL2FybS9hcmNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL2lycXMuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfX0NPTUNFUlRPX0lSUVNfSF9fCisjZGVmaW5lIF9fQ09NQ0VSVE9fSVJRU19IX18KKworI2RlZmluZSBGSVFfU1RBUlQJCSgwKQorCisjZGVmaW5lIFNHSV9JUlEoeCkJCSgwICsgKHgpKQkvKiBJRDAgIC0gSUQxNSAqLworI2RlZmluZSBQUElfSVJRKHgpCQkoMjcgKyAoeCkpCS8qIElEMjcgLSBJRDMxICovCisjZGVmaW5lIExTUElfSVJRKHgpCQkoMzIgKyAoeCkpCS8qIElEMzIgLSBJRDYyICovCisjZGVmaW5lIFNQSV9JUlEoeCkJCSg2MyArICh4KSkgICAgICAvKiBJRDYzIC0gSUQxMDIwICovCisKKyNkZWZpbmUgSVJRX0xPQ0FMVElNRVIJCVBQSV9JUlEoMikKKyNkZWZpbmUgSVJRX0xPQ0FMV0RPRwkJUFBJX0lSUSgzKQorCisjZGVmaW5lIElSUV9QVFAwCQlMU1BJX0lSUSgwKQorI2RlZmluZSBJUlFfUFRQMQkJTFNQSV9JUlEoMSkKKyNkZWZpbmUgSVJRX1BUUDIJCUxTUElfSVJRKDIpCisjZGVmaW5lIElSUV9QVFAzCQlMU1BJX0lSUSgzKQorI2RlZmluZSBJUlFfUEZFX0hJRgkJTFNQSV9JUlEoNCkKKyNkZWZpbmUgSVJRX1BGRV9ISUZOQ1BZCQlMU1BJX0lSUSg1KQorI2RlZmluZSBJUlFfUEZFX0dQVAkJTFNQSV9JUlEoNikKKyNkZWZpbmUgSVJRX0ZBQlJJQwkJTFNQSV9JUlEoNykKKyNkZWZpbmUgSVJRX0E5X0wxX1BBUgkJTFNQSV9JUlEoOCkKKyNkZWZpbmUgSVJRX0E5X1BNVTAJCUxTUElfSVJRKDkpCisjZGVmaW5lIElSUV9BOV9QTVUxCQlMU1BJX0lSUSgxMCkKKyNkZWZpbmUgSVJRX0wyCQkJTFNQSV9JUlEoMTEpCisjZGVmaW5lIElSUV9FQVBFCQlMU1BJX0lSUSgxMikKKyNkZWZpbmUgSVJRX1NQQUNDCQlMU1BJX0lSUSgxMykKKyNkZWZpbmUgSVJRX0NJRQkJCUxTUElfSVJRKDE0KQorI2RlZmluZSBJUlFfREVDCQkJTFNQSV9JUlEoMTUpCisjZGVmaW5lIElSUV9TQVRBCQlMU1BJX0lSUSgxNikKKyNkZWZpbmUgSVJRX0NTUzAJCUxTUElfSVJRKDE3KQorI2RlZmluZSBJUlFfQ1NTMQkJTFNQSV9JUlEoMTgpCisjZGVmaW5lIElSUV9DU1MyCQlMU1BJX0lSUSgxOSkKKyNkZWZpbmUgSVJRX0NTUzMJCUxTUElfSVJRKDIwKQorI2RlZmluZSBJUlFfVVNCMgkJTFNQSV9JUlEoMjEpCisjZGVmaW5lIElSUV9VU0IzCQlMU1BJX0lSUSgyMikKKyNkZWZpbmUgSVJRX1NBVEFfTVNJCQlMU1BJX0lSUSgyMykKKyNkZWZpbmUgSVJRX0NTUwkJCUxTUElfSVJRKDI0KQorI2RlZmluZSBJUlFfRE1BQwkJTFNQSV9JUlEoMjUpCisjZGVmaW5lIElSUV9VQVJUMAkJTFNQSV9JUlEoMjYpCisjZGVmaW5lIElSUV9VQVJUMQkJTFNQSV9JUlEoMjcpCisjZGVmaW5lIElSUV9VQVJUX1MyCQlMU1BJX0lSUSgyNykKKyNkZWZpbmUgSVJRX1NQSQkJCUxTUElfSVJRKDI4KQorI2RlZmluZSBJUlFfU1BJX0xTCQlMU1BJX0lSUSgyOSkKKyNkZWZpbmUgSVJRX0kyQwkJCUxTUElfSVJRKDMwKQorCisjZGVmaW5lIElSUV9QRkVfVVBFCQlTUElfSVJRKDApCisjZGVmaW5lIElSUV9ERFJDCQlTUElfSVJRKDEpCisjZGVmaW5lIElSUV9URE1BX1RYCQlTUElfSVJRKDIpCisjZGVmaW5lIElSUV9URE1BX1JYCQlTUElfSVJRKDMpCisjZGVmaW5lIElSUV9URE1BX0FIQkVSUgkJU1BJX0lSUSg0KQorI2RlZmluZSBJUlFfUEZFX1VQRV9USU1FUglTUElfSVJRKDUpCisjZGVmaW5lIElSUV9URE1BCQlTUElfSVJRKDYpCisjZGVmaW5lIElSUV9TTElDCQlTUElfSVJRKDcpCisjZGVmaW5lIElSUV9NRE1BX00ySU8JCVNQSV9JUlEoOCkKKyNkZWZpbmUgSVJRX01ETUFfSU8yTQkJU1BJX0lSUSg5KQorI2RlZmluZSBJUlFfTURNQV9BWElXCQlTUElfSVJRKDEwKQorI2RlZmluZSBJUlFfTURNQV9BWElSCQlTUElfSVJRKDExKQorI2RlZmluZSBJUlFfUENJZTAJCVNQSV9JUlEoMTIpCisjZGVmaW5lIElSUV9QQ0llMQkJU1BJX0lSUSgxMykKKyNkZWZpbmUgSVJRX0cwCQkJU1BJX0lSUSgxNCkKKyNkZWZpbmUgSVJRX0cxCQkJU1BJX0lSUSgxNSkKKyNkZWZpbmUgSVJRX0cyCQkJU1BJX0lSUSgxNikKKyNkZWZpbmUgSVJRX0czCQkJU1BJX0lSUSgxNykKKyNkZWZpbmUgSVJRX0c0CQkJU1BJX0lSUSgxOCkKKyNkZWZpbmUgSVJRX0c1CQkJU1BJX0lSUSgxOSkKKyNkZWZpbmUgSVJRX0c2CQkJU1BJX0lSUSgyMCkKKyNkZWZpbmUgSVJRX0c3CQkJU1BJX0lSUSgyMSkKKyNkZWZpbmUgSVJRX1dPTAkJCVNQSV9JUlEoMjIpCisjZGVmaW5lIElSUV9VU0IzX1BNRQkJU1BJX0lSUSgyMykKKyNkZWZpbmUgSVJRX1RJTUVSMAkJU1BJX0lSUSgyNCkKKyNkZWZpbmUgSVJRX1RJTUVSMQkJU1BJX0lSUSgyNSkKKyNkZWZpbmUgSVJRX1RJTUVSMgkJU1BJX0lSUSgyNikKKyNkZWZpbmUgSVJRX1RJTUVSMwkJU1BJX0lSUSgyNykKKyNkZWZpbmUgSVJRX1RJTUVSNAkJU1BJX0lSUSgyOCkKKyNkZWZpbmUgSVJRX1RJTUVSNQkJU1BJX0lSUSgyOSkKKyNkZWZpbmUgSVJRX1RJTUVSNgkJU1BJX0lSUSgzMCkKKyNkZWZpbmUgSVJRX1JUQ19BTE0JCVNQSV9JUlEoMzEpCisjZGVmaW5lIElSUV9SVENfUFJJCQlTUElfSVJRKDMyKQorCisKKy8qIFNvZnR3YXJlIGRlY29kZWQgaW50ZXJydXB0cyB1c2VkIGJ5IFBDSUUgKi8KKyNkZWZpbmUgQ09NQ0VSVE9fSVJRX01BWAlTUElfSVJRKDMzKQkKKworLyogUENJRSBNU0kgdmlydHVhbCBpcnFzICovCisjZGVmaW5lIFBDSUVfTlVNX01TSV9JUlFTCTMyCisjZGVmaW5lIFBDSUUwX01TSV9JTlRfQkFTRQkoQ09NQ0VSVE9fSVJRX01BWCArIDApCisjZGVmaW5lIFBDSUUwX01TSV9JTlRfRU5ECShQQ0lFMF9NU0lfSU5UX0JBU0UgKyBQQ0lFX05VTV9NU0lfSVJRUykKKyNkZWZpbmUgUENJRTFfTVNJX0lOVF9CQVNFCShQQ0lFMF9NU0lfSU5UX0VORCArIDApCisjZGVmaW5lIFBDSUUxX01TSV9JTlRfRU5ECShQQ0lFMV9NU0lfSU5UX0JBU0UgKyBQQ0lFX05VTV9NU0lfSVJRUykKKworI2RlZmluZSBQQ0lFX05VTV9JTlRYX0lSUVMJNAorI2RlZmluZSBQQ0lFMF9JTlRYX0JBU0UJCShQQ0lFMV9NU0lfSU5UX0VORCArIDApCisjZGVmaW5lIFBDSUUwX0lOVFhfRU5ECQkoUENJRTBfSU5UWF9CQVNFICsgUENJRV9OVU1fSU5UWF9JUlFTKQorI2RlZmluZSBQQ0lFMV9JTlRYX0JBU0UJCShQQ0lFMF9JTlRYX0VORCArIDApCisjZGVmaW5lIFBDSUUxX0lOVFhfRU5ECQkoUENJRTFfSU5UWF9CQVNFICsgUENJRV9OVU1fSU5UWF9JUlFTKQorCisjZGVmaW5lIFZJUlFfRU5ECQlQQ0lFMV9JTlRYX0VORAorI2RlZmluZSBOUl9JUlFTCQkJMjU2CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9tZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUzODQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9tZW1vcnkuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogIGFyY2gvYXJtL2FyY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvbWVtb3J5LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworCisjaWZuZGVmIF9fTUVNT1JZX0hfXworI2RlZmluZSBfX01FTU9SWV9IX18KKworCS8qIFBoeXNpY2FsIGFkZHJlc3NlcyBvZiBtZW1vcmllcyAqLworCSNkZWZpbmUgSVJBTV9NRU1PUllfU0laRQkJCVNaXzY0SworCisvKgorICogVmlydHVhbCB2aWV3IDwtPiBETUEgdmlldyBtZW1vcnkgYWRkcmVzcyB0cmFuc2xhdGlvbnMKKyAqIHZpcnRfdG9fYnVzOiBVc2VkIHRvIHRyYW5zbGF0ZSB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIGFuCisgKiAgICAgICAgICAgICAgYWRkcmVzcyBzdWl0YWJsZSB0byBiZSBwYXNzZWQgdG8gc2V0X2RtYV9hZGRyCisgKiBidXNfdG9fdmlydDogVXNlZCB0byBjb252ZXJ0IGFuIGFkZHJlc3MgZm9yIERNQSBvcGVyYXRpb25zCisgKiAgICAgICAgICAgICAgdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgY2FuIHVzZS4KKyAqLworCisjZGVmaW5lIGFyYW1fdG9fdmlydChwKQkJKHZvaWQqKSgoKHVuc2lnbmVkIGxvbmcpcCAtIENPTUNFUlRPX0FYSV9JUkFNX0JBU0UpICsgSVJBTV9NRU1PUllfVkFERFIpCisjZGVmaW5lIHZpcnRfdG9fYXJhbSh2KQkJKCgodW5zaWduZWQgbG9uZyl2IC0gSVJBTV9NRU1PUllfVkFERFIpICsgQ09NQ0VSVE9fQVhJX0lSQU1fQkFTRSkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9wY2llLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL3BjaWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTk1OTZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9wY2llLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtY29tY2VydG8vY29tY2VydG8tMjAwMC9wY2llLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0NPTUNFUlRPX1BDSUVfSF9fCisjZGVmaW5lIF9fQ09NQ0VSVE9fUENJRV9IX18KKworLyogQ0ZHMCBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBEV0NfQ0ZHMF9ERVZfVFlQRV9NQVNLIAkJMHgwRgorI2RlZmluZSAJQ0ZHMF9ERVZfVFlQRV9FUCAJMHgwMAorI2RlZmluZSAJQ0ZHMF9ERVZfVFlQRV9MRVAgCTB4MDEKKyNkZWZpbmUgCUNGRzBfREVWX1RZUEVfUkMgCTB4MDQKKyNkZWZpbmUgCUNGRzBfREVWX1RZUEVfVVBfU1cgCTB4MDUKKyNkZWZpbmUgCUNGRzBfREVWX1RZUEVfRFdOX1NXIAkweDA2CisKKy8qIENGRzEsMiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworLypJRCBkZWZpbml0aW9ucyBvZiBBUk1JU0MqLworI2RlZmluZSBBWElfT1BfVFlQRV9JRF9NQVNLCQkweDAwMDAwMDFGCisjZGVmaW5lIEFYSV9PUF9UWVBFX0lEX0JJVAkJMAorI2RlZmluZSBBWElfT1BfQkNNX0lECQkJMHgwMDAwMDAyMAorI2RlZmluZSBBWElfT1BfRVBfSUQJCQkweDAwMDAwMDQwCisjZGVmaW5lIEFYSV9PUF9URF9JRAkJCTB4MDAwMDAwODAKKyNkZWZpbmUgQVhJX09QX0FUVFJJQlVURV9JRF9NQVNLCTB4MDAwMDAzMDAKKyNkZWZpbmUgQVhJX09QX0FUVFJJQlVURV9JRF9CSVQJCTgKKyNkZWZpbmUgQVhJX09QX1RDX0lEX01BU0sJCTB4MDAwMDFDMDAKKyNkZWZpbmUgQVhJX09QX1RDX0lEX0JJVAkJMTAKKyNkZWZpbmUgQVhJX09QX01TR19DT0RFX0lEX01BU0sJCTB4MDAxRkUwMDAKKyNkZWZpbmUgQVhJX09QX01TR19DT0RFX0lEX0JJVAkJMTMKKyNkZWZpbmUgQVhJX09QX0RCSV9BQ0NFU1NfSUQJCTB4MDAyMDAwMDAKKyNkZWZpbmUgQVhJX09QX1RZUEVfTUFTSwkweDFGCisjZGVmaW5lIEFYSV9PUF9UWVBFX01FTV9SRFJXCTAKKyNkZWZpbmUgQVhJX09QX1RZUEVfTUVNX1JEUldfTE9DS0VECTEKKyNkZWZpbmUgQVhJX09QX1RZUEVfSU9fUkRSVwkyCisjZGVmaW5lIEFYSV9PUF9UWVBFX0NPTkZJR19SRFJXX1RZUEUwCTQKKyNkZWZpbmUgQVhJX09QX1RZUEVfQ09ORklHX1JEUldfVFlQRTEJNQorI2RlZmluZSBBWElfT1BfVFlQRV9NU0dfUkVRCTE2CisjZGVmaW5lIEFYSV9PUF9UWVBFX0NPTVBMRVRJT04JMTAKKyNkZWZpbmUgQVhJX09QX1RZUEVfQ09NUExFVElPTl9MT0NLRUQJMTEKKyNkZWZpbmUgQVhJX09QX1RZUEVfREJJX0VMQklfRU5BQkxFCTEKKworCisKKy8qIENGRzUgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgCUNGRzVfQVBQX0lOSVRfUlNUCTB4MDEKKyNkZWZpbmUgCUNGRzVfTFRTU01fRU5BQkxFCTB4MDIKKyNkZWZpbmUgCUNGRzVfQVBQX1JEWV9MMjMJMHgwNAorI2RlZmluZSAJQ0ZHNV9MSU5LX0RPV05fUlNUCTB4MjAwCisKKworLyogU1RTMCBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSAJU1RTMF9MSU5LX1JFUV9SU1RfTk9UCTB4MDAwMQorI2RlZmluZSAJU1RTMF9YTUxIX0xJTktfVVAJMHg4MDAwCisjZGVmaW5lIAlTVFMwX1JETEhfTElOS19VUAkweDEwMDAwCisKKy8qIElOVFJfU1RTIGFuZCBJTlRSX0VOIFJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIAlJTlRSX0NUUkxfSU5UQV9BU1NFUlQJMHgwMDAxCisjZGVmaW5lIAlJTlRSX0NUUkxfSU5UQV9ERUFTU0VSVAkweDAwMDIKKyNkZWZpbmUgCUlOVFJfQ1RSTF9JTlRCX0FTU0VSVAkweDAwMDQKKyNkZWZpbmUgCUlOVFJfQ1RSTF9JTlRCX0RFQVNTRVJUCTB4MDAwOAorI2RlZmluZSAJSU5UUl9DVFJMX0lOVENfQVNTRVJUCTB4MDAxMAorI2RlZmluZSAJSU5UUl9DVFJMX0lOVENfREVBU1NFUlQJMHgwMDIwCisjZGVmaW5lIAlJTlRSX0NUUkxfSU5URF9BU1NFUlQJMHgwMDQwCisjZGVmaW5lIAlJTlRSX0NUUkxfSU5URF9ERUFTU0VSVAkweDAwODAKKyNkZWZpbmUgCUlOVFJfQ1RSTF9BRVIJCTB4MDEwMAorI2RlZmluZSAJSU5UUl9DVFJMX1BNRQkJMHgwMjAwCisjZGVmaW5lIAlJTlRSX0NUUkxfSFAJCTB4MDQwMAorI2RlZmluZSAJSU5UUl9DVFJMX0xJTktfQVVUT19CVwkweDA4MDAKKyNkZWZpbmUgCUlOVFJfQ1RSTF9NU0kJCTB4MTAwMAorCisvKiBzeW5vcHNpcyBzcGVjaWZpYyBQQ0lFIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzKi8KKworLyogUG9ydCBMb2dpYyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJRV9BTFJUX1JFRyAgICAgICAgICAgICAgMHg3MDAKKyNkZWZpbmUgUENJRV9BRkwwTDFfUkVHICAgICAgICAgICAgMHg3MEMKKyNkZWZpbmUgUENJRV9TWU1OVU1fUkVHICAgICAgICAgICAgMHg3MTgKKyNkZWZpbmUgUENJRV9HMkNUUkxfUkVHICAgICAgICAgICAgMHg4MEMKKworI2RlZmluZSBQQ0lFX0NBUF9CQVNFICAgICAgICAgICAweDcwCisjZGVmaW5lIFBDSUVfTENBUF9SRUcgICAgICAgICAgIChQQ0lFX0NBUF9CQVNFICsgMHgwQykKKyNkZWZpbmUgUENJRV9MQ05UMl9SRUcgICAgICAgICAgKFBDSUVfQ0FQX0JBU0UgKyAweDMwKQorCisJLyogTVNJIGludGVyZmFjZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUENJRV9NU0lfQUREUl9MTwkweDgyMAkvKiAzMiBiaXRzICovCisjZGVmaW5lIFBDSUVfTVNJX0FERFJfSEkJMHg4MjQJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lFX01TSV9JTlRSMF9FTkFCTEUJMHg4MjgJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lFX01TSV9JTlRSMF9NQVNLCTB4ODJDCS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJRV9NU0lfSU5UUjBfU1RBVFVTCTB4ODMwCS8qIDMyIGJpdHMgKi8KKworLyogaUFUVSBpbnRlcmZhY2UgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDSUVfaUFUVV9WSUVXX1BPUlQJMHg5MDAJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lFX2lBVFVfQ1RSTDEJCTB4OTA0ICAgLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lFX2lBVFVfQ1RSTDIJCTB4OTA4CS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJRV9pQVRVX1NSQ19MT1cJMHg5MEMJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lFX2lBVFVfU1JDX0hJR0gJMHg5MTAJLyogMzIgYml0cyAqLworI2RlZmluZSBQQ0lFX2lBVFVfTElNSVQJCTB4OTE0CS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJRV9pQVRVX1RSR1RfTE9XCTB4OTE4CS8qIDMyIGJpdHMgKi8KKyNkZWZpbmUgUENJRV9pQVRVX1RSR1RfSElHSAkweDkxQwkvKiAzMiBiaXRzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQkFSIE1BU0sgUmVnaXN0ZXJzICh1c2VzIGRiaV9jczIpICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgUENJRV9CQVIwX01BU0tfUkVHICAgICAgICAgICAgICAweDEwMDAxMAorCisvKiBpQVRVIHZpZXdwb3J0IHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIGlBVFVfVklFV19QT1JUX0lEX01BU0sJMHgwRgorI2RlZmluZSBpQVRVX1ZJRVdfUE9SVF9JRF9CSVQJMAorI2RlZmluZSBpQVRVX1ZJRVdfUE9SVF9JTl9CT1VORAkwWDgwMDAwMDAwCisKKy8qIGlBVFUgY29udHJvbDEgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgaUFUVV9DVFJMMV9UWVBFX01BU0sJMHgwMDFGCisjZGVmaW5lIGlBVFVfQ1RSTDFfVFlQRV9CSVQJMAorI2RlZmluZSBpQVRVX0NUUkwxX1RDX01BU0sJMHgwMEUwCisjZGVmaW5lIGlBVFVfQ1RSTDFfVENfQklUCTUKKyNkZWZpbmUgaUFUVV9DVFJMMV9URAkJMHgxMDAKKworCisvKiBpQVRVIGNvbnRyb2wyIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIGlBVFVfQ1RSTDJfSURfRU4JCTB4ODAwMDAwMDAKKyNkZWZpbmUgaUFUVV9DVFJMMl9JQl9NRU1fQkFSX01BVENICTB4NDAwMDAwMDAKKyNkZWZpbmUgaUFUVV9DVFJMMl9JQl9DRkcwX0FDQ0VQVAkweDQwMDAwMDAwCisjZGVmaW5lIGlBVFVfQ1RSTDJfSUJfTUFUQ0hfQkFSMAkweDAwMDAwMDAwCisjZGVmaW5lIGlBVFVfQ1RSTDJfSUJfTUFUQ0hfQkFSMQkweDAwMDAwMTAwCisjZGVmaW5lIGlBVFVfQ1RSTDJfSUJfTUFUQ0hfQkFSMgkweDAwMDAwMjAwCisjZGVmaW5lIGlBVFVfQ1RSTDJfSUJfTUFUQ0hfQkFSMwkweDAwMDAwMzAwCisjZGVmaW5lIGlBVFVfQ1RSTDJfSUJfTUFUQ0hfQkFSNAkweDAwMDAwNDAwCisjZGVmaW5lIGlBVFVfQ1RSTDJfSUJfTUFUQ0hfQkFSNQkweDAwMDAwNTAwCisjZGVmaW5lIGlBVFVfQ1RSTDJfSUJfTUFUQ0hfUk9NCQkweDAwMDAwNjAwCisKKyNkZWZpbmUgaUFUVV9FTlRSWV9NQVgJCTgKKyNkZWZpbmUgaUFUVV9FTlRSWV9NRU0JCTAKKyNkZWZpbmUgaUFUVV9FTlRSWV9JTwkJMQorI2RlZmluZSBpQVRVX0VOVFJZX0NORjAJCTIKKyNkZWZpbmUgaUFUVV9FTlRSWV9DTkYxCQkzCisjZGVmaW5lIGlBVFVfRU5UUllfTVNHCQk0CisKKy8qKiAyNTRNQixzIHVzZWQgZm9yIHNsYXZlIG1lbW9yeSBtYXBwZWQgYWRkcmVzcyBzcGFjZSByZW1haW5pbmcgMk1CCisgKiAgaXMgdXNlZCBmb3IgSU8sIENGRzAvMSBhbmQgTVNHIHRyYW5zYWxhdGlvbi4gVGhpcyB2YWx1ZSBjYW5uJ3QgYmUKKyAqICBpbmNyZWFzZWQuCisgKi8KKyNkZWZpbmUgQ09NQ0VSVE9fUENJZV9NRU1fU0laRQkJCQkoMjU0ICogMTAyNCAqMTAyNCkKKyNkZWZpbmUgQ09NQ0VSVE9fUENJZV9NU0dfU0laRQkJCQkoMSAqIDEwMjQgKiAxMDI0KQorI2RlZmluZSBDT01DRVJUT19QQ0llX0lPX1NJWkUJCQkJKDY0ICogMTAyNCkKKyNkZWZpbmUgQ09NQ0VSVE9fUENJZV9DRkcwX1NJWkUJCQkJKDY0ICogMTAyNCkKKyNkZWZpbmUgQ09NQ0VSVE9fUENJZV9DRkcxX1NJWkUJCQkJKDY0ICogMTAyNCkKKworLyogU3VtIG9mIGFsbCB0aGVzZSBzcGFjZSBjYW4gbWF4aW11bSBiZSAyNTZNQiAqLworI2RlZmluZSBpQVRVX01FTV9TSVpFCShDT01DRVJUT19QQ0llX01FTV9TSVpFKQorI2RlZmluZSBpQVRVX01TR19TSVpFCShDT01DRVJUT19QQ0llX01TR19TSVpFKQorI2RlZmluZSBpQVRVX0lPX1NJWkUJKENPTUNFUlRPX1BDSWVfSU9fU0laRSkKKyNkZWZpbmUgaUFUVV9DRkcwX1NJWkUJKENPTUNFUlRPX1BDSWVfQ0ZHMF9TSVpFKQorI2RlZmluZSBpQVRVX0NGRzFfU0laRQkoQ09NQ0VSVE9fUENJZV9DRkcxX1NJWkUpCisKKyNkZWZpbmUgaUFUVV9HRVRfTUVNX0JBU0UoIF9iYXNlICkgKF9iYXNlICsgMCkKKyNkZWZpbmUgaUFUVV9HRVRfTVNHX0JBU0UoIF9iYXNlICkgKCBpQVRVX0dFVF9NRU1fQkFTRSAoIF9iYXNlICkgKyBpQVRVX01FTV9TSVpFKQorI2RlZmluZSBpQVRVX0dFVF9JT19CQVNFKCBfYmFzZSApICggaUFUVV9HRVRfTVNHX0JBU0UoIF9iYXNlICkgKyBpQVRVX01TR19TSVpFKQorI2RlZmluZSBpQVRVX0dFVF9DRkcwX0JBU0UoIF9iYXNlICkgKCBpQVRVX0dFVF9JT19CQVNFKCBfYmFzZSApICsgaUFUVV9JT19TSVpFKQorI2RlZmluZSBpQVRVX0dFVF9DRkcxX0JBU0UoIF9iYXNlICkgKCBpQVRVX0dFVF9DRkcwX0JBU0UoIF9iYXNlICkgKyBpQVRVX0NGRzBfU0laRSkKKworI2VuZGlmIC8qIF9fQ09NQ0VSVE9fUENJRV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvcG0uaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvcG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYyMTAyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9wbS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBwbS5oCisgKgorICogUG93ZXIgbWFuYWdlbWVuIGRyaXZlciBmb3IgQ29tY2VydG8gQzJLIGRldmljZSAtIGludGVybmFsIGhlYWRlciBmaWxlCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKyNpZm5kZWYgX19BUkNIX0FSTV9DMktfUE1fSF9fCisjZGVmaW5lIF9fQVJDSF9BUk1fQzJLX1BNX0hfXworCisvKiBQTVUgSW50ZXJydXAgbWFza3MgKi8KKyNkZWZpbmUgR1BJTzBfSVJRICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgR1BJTzFfSVJRICAgICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgR1BJTzJfSVJRICAgICAgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgR1BJTzNfSVJRICAgICAgICAgICAgICAgKDEgPDwgMykKKworI2RlZmluZSBHUElPNF9JUlEgICAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBHUElPNV9JUlEgICAgICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBHUElPNl9JUlEgICAgICAgICAgICAgICAoMSA8PCA2KQorI2RlZmluZSBHUElPN19JUlEgICAgICAgICAgICAgICAoMSA8PCA3KQorCisjZGVmaW5lIFRJTUVSMF9JUlEgICAgICAgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIFRJTUVSMV9JUlEgICAgICAgICAgICAgICgxIDw8IDkpCisjZGVmaW5lIFRJTUVSMl9JUlEgICAgICAgICAgICAgICgxIDw8IDEwKQorI2RlZmluZSBUSU1FUjNfSVJRICAgICAgICAgICAgICAoMSA8PCAxMSkKKworI2RlZmluZSBaRFNfTVNJRl9JUlEgICAgICAgICAgICAoMSA8PCAxMikKKyNkZWZpbmUgUlRDX0FMTV9JUlEgICAgICAgICAgICAgKDEgPDwgMTMpCisjZGVmaW5lIFJUQ19QUklfSVJRICAgICAgICAgICAgICgxIDw8IDE0KQorI2RlZmluZSBQQ0llMF9JUlEgICAgICAgICAgICAgICAoMSA8PCAxNSkKKworI2RlZmluZSBQQ0llMV9JUlEgICAgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgU0FUQV9JUlEgICAgICAgICAgICAgICAgKDEgPDwgMTcpCisjZGVmaW5lIFNBVEFfTVNJX0lSUSAgICAgICAgICAgICgxIDw8IDE4KQorI2RlZmluZSBVU0IycDBfSVJRICAgICAgICAgICAgICAoMSA8PCAxOSkKKworI2RlZmluZSBVU0IzcDBfSVJRICAgICAgICAgICAgICAoMSA8PCAyMCkKKyNkZWZpbmUgSEZFXzBfSVJRICAgICAgICAgICAgICAgKDEgPDwgMjEpCisjZGVmaW5lIFdPTF9JUlEgICAgICAgICAgICAgICAgICgxIDw8IDIyKQorI2RlZmluZSBDU1NfSVJRICAgICAgICAgICAgICAgICAoMSA8PCAyMykKKworI2RlZmluZSBEVVNfRE1BQ19JUlEgICAgICAgICAgICAoMSA8PCAyNCkKKyNkZWZpbmUgRFVTX1VBUlQwX0lSUSAgICAgICAgICAgKDEgPDwgMjUpCisjZGVmaW5lIERVU19VQVJUMFVBUlRTMl9JUlEgICAgICgxIDw8IDI2KQorI2RlZmluZSBIRkVfMV9JUlEgICAgICAgICAgICAgICAoMSA8PCAyNykKKworI2RlZmluZSBVU0IzcDBfUE0gICAgICAgICAgICAgICAoMSA8PCAyOCkKKyNkZWZpbmUgUFRQMF9JUlEgICAgICAgICAgICAgICAgKDEgPDwgMjkpCisjZGVmaW5lIFBUUDFfSVJRICAgICAgICAgICAgICAgICgxIDw8IDMwKQorI2RlZmluZSBQVFAyX0lSUSAgICAgICAgICAgICAgICAoMSA8PCAzMSkKKworI2RlZmluZSBKVU1QX1RPX1JFU1VNRV8xCQkgICAgICAgIDB4ZTNhMDAwMjAgCS8qIG1vdglyMCwgIzMyICovCisjZGVmaW5lIEpVTVBfVE9fUkVTVU1FXzIJCSAgICAgICAgMHhlNTkwZjAwMCAJLyogbGRyCXBjLCBbcjBdICovCisKKy8qCisgKiBUd28gQnl0ZXMgYXJlIHVzZWQgYXMgc2hhcmVkIG1lbW9yeSBiZXR3ZWVuIEhvc3QgYW5kIFV0aWxQRQorICogT25lIGZvciBpbnN0YWxsaW5nIHRoZSBTdXNwZW5kIEV2ZW50IGFuZCBSZXR1cm4gUmVzdW1lIGxvY2F0aW9uCisgKiAybmQgdG8gcGFzcyB0aGUgYml0bWFzaworICovCisjZGVmaW5lIEhPU1RfVVRJTFBFX1NIQVJFRF9BRERSRVNTX09GRiAgMHgyNDAwIC8qIFRoaXMgaXMgb2Zmc2V0IGludG8gdGhlIGlSQU0gKi8KKyNkZWZpbmUgSE9TVF9VVElMUEVfU0hBUkVEX0FERFJFU1MgICAgICAoSVJBTV9NRU1PUllfVkFERFIrSE9TVF9VVElMUEVfU0hBUkVEX0FERFJFU1NfT0ZGKQorCisvKiBHbG9iYWwgVmFyaWFibGUgZm9yIFNoYXJlZCBVdGlsLVBFIGludGVycnVwdCBNYXNrICovCitleHRlcm4gdW5zaWduZWQgaG9zdF91dGlscGVfc2hhcmVkX3BtdV9iaXRtYXNrOworCit2b2lkIGMya19wbV9iaXRtYXNrX3N0b3JlKHVuc2lnbmVkIGludCk7Cit1bnNpZ25lZCBpbnQgYzJrX3BtX2JpdG1hc2tfc2hvdyh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL3NlcmRlcy5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9zZXJkZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmEwZmZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9zZXJkZXMuaApAQCAtMCwwICsxLDYxIEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4gMjAxMS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiBAZmlsZSBzZXJkZXMuaAorICogQGJyaWVmIHRoaXMgaGVhZGVyIGZpbGUgd2lsbCBjb250YWluIGFsbCByZXF1aXJlZCBkYXRhIHN0cnVjdHVyZQorICogICAgICAgIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgU25vd2J1c2ggU2VyRGVzIFBIWSBpbnRlcmZhY2UuCisgKiBAZGF0ZSAxMC8wMi8yMDExCisgKi8KKworI2lmbmRlZiBfX0NPTUNFUlRPX1NFUkRFU19IX18KKyNkZWZpbmUgX19DT01DRVJUT19TRVJERVNfSF9fCisKKy8qIFNFUi1ERVMgQWRkcmVzcyBzcGFjZSAqLworI2RlZmluZSBTRF9DT01NT05fQ01VICAgICAweDAwMAorI2RlZmluZSBTRF9MQU5FMCAgICAgICAgICAweDIwMAorI2RlZmluZSBTRF9MQU5FMSAgICAgICAgICAweDQwMAorI2RlZmluZSBTRF9MQU5FMiAgICAgICAgICAweDYwMAorI2RlZmluZSBTRF9MQU5FMyAgICAgICAgICAweDgwMAorI2RlZmluZSBTRF9DT01NT05fTEFORSAgICAweEEwMAorCisjZGVmaW5lIFNEX0RFVl9UWVBFX1BDSUUJMAkKKyNkZWZpbmUJU0RfREVWX1RZUEVfU0FUQQkxCisjZGVmaW5lCVNEX0RFVl9UWVBFX1NHTUlJCTIKKworCisjZGVmaW5lIENPTUNFUlRPX0FQQl9TRVJERVMwX0JBU0UJQVBCX1ZBRERSKENPTUNFUlRPX0FQQl9TRVJERVNfQ09ORl9CQVNFKQorI2RlZmluZSBDT01DRVJUT19BUEJfU0VSREVTMV9CQVNFCShDT01DRVJUT19BUEJfU0VSREVTMF9CQVNFICsgMHg0MDAwKQorI2RlZmluZSBDT01DRVJUT19BUEJfU0VSREVTMl9CQVNFCShDT01DRVJUT19BUEJfU0VSREVTMF9CQVNFICsgMHg4MDAwKQorCisjZGVmaW5lIENPTUNFUlRPX0RXQzFfQ0ZHX0JBU0UgCQlBUEJfVkFERFIoQ09NQ0VSVE9fQVBCX1VTQlBIWV9TRVJERVNfU1RBVF9CQVNFKQorI2RlZmluZSBDT01DRVJUT19EV0MxX1NFUkRFU19DRkdfQkFTRSAJQ09NQ0VSVE9fRFdDMV9DRkdfQkFTRSArIDB4MkMKKyNkZWZpbmUgU0RfUEhZX1NUU19SRUdfT0ZTVAkJMHgwMAorI2RlZmluZSBTRF9QSFlfQ1RSTDFfUkVHX09GU1QJCTB4MDQKKyNkZWZpbmUgU0RfUEhZX0NUUkwyX1JFR19PRlNUCQkweDA4CisjZGVmaW5lIFNEX1BIWV9DVFJMM19SRUdfT0ZTVAkJMHgwQworCisKKyNkZWZpbmUgQ09NQ0VSVE9fU0VSREVTX1JFRyggX251bSwgX29mc3QpICgoQ09NQ0VSVE9fQVBCX1NFUkRFUzBfQkFTRSArICgweDQwMDAgKiBfbnVtKSkgKyBfb2ZzdCkKKworI2RlZmluZSBDT01DRVJUT19TRVJERVNfRFdDX0NGR19SRUcoIF9udW0sIF9vZnN0KSAoKENPTUNFUlRPX0RXQzFfU0VSREVTX0NGR19CQVNFICsgKF9udW0gPDw0KSkgKyBfb2ZzdCkKKworI2VuZGlmIC8vX19DT01DRVJUT19TRVJERVNfSF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL3NwaS5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTYxOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC9zcGkuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLWNvbWNlcnRvL2NvbWNlcnRvMTAwMC9zcGkuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwOCBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9fQVNNX0FSQ0hfQ09NQ0VSVE8xMDAwX1NQSV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfQ09NQ0VSVE8xMDAwX1NQSV9ICisKKyNkZWZpbmUgQ09NQ0VSVE9fU1BJX0ZJRk9fREVQVEgJCTgKKworLyogU1BJIGNvcmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIENPTUNFUlRPX1NQSV9DVFJMUjAJCTB4MDAKKyNkZWZpbmUgQ09NQ0VSVE9fU1BJX0NUUkxSMQkJMHgwNAorI2RlZmluZSBDT01DRVJUT19TUElfU1NJRU5SCQkweDA4CisjZGVmaW5lIENPTUNFUlRPX1NQSV9NV0NSCQkweDBDCisjZGVmaW5lIENPTUNFUlRPX1NQSV9TRVIJCTB4MTAKKyNkZWZpbmUgQ09NQ0VSVE9fU1BJX0JBVURSCQkweDE0CisjZGVmaW5lIENPTUNFUlRPX1NQSV9UWEZUTFIJCTB4MTgKKyNkZWZpbmUgQ09NQ0VSVE9fU1BJX1JYRlRMUgkJMHgxQworI2RlZmluZSBDT01DRVJUT19TUElfVFhGTFIJCTB4MjAKKyNkZWZpbmUgQ09NQ0VSVE9fU1BJX1JYRkxSCQkweDI0CisjZGVmaW5lIENPTUNFUlRPX1NQSV9TUgkJCTB4MjgKKyNkZWZpbmUgQ09NQ0VSVE9fU1BJX0lNUgkJMHgyQworI2RlZmluZSBDT01DRVJUT19TUElfSVNSCQkweDMwCisjZGVmaW5lIENPTUNFUlRPX1NQSV9SSVNSCQkweDM0CisjZGVmaW5lIENPTUNFUlRPX1NQSV9UWE9JQ1IJCTB4MzgKKyNkZWZpbmUgQ09NQ0VSVE9fU1BJX1JYT0lDUgkJMHgzQworI2RlZmluZSBDT01DRVJUT19TUElfUlhVSUNSCQkweDQwCisjZGVmaW5lIENPTUNFUlRPX1NQSV9NU1RJQ1IJCTB4NDQKKyNkZWZpbmUgQ09NQ0VSVE9fU1BJX0lDUgkJMHg0OAorI2RlZmluZSBDT01DRVJUT19TUElfSURSCQkweDU4CisjZGVmaW5lIENPTUNFUlRPX1NQSV9EUgkJCTB4NjAKKworLyogQ1RSTFIwIC0gY29udHJvbCByZWdpc3RlciAwIGJpdHMvbWFza3MgKGluY29tcGxldGUpICovCisjZGVmaW5lIFNQSV9DVFJMUjBfREZTX01BU0sJCSgxNTw8MCkJLyogRGF0YSBmcmFtZSBzaXplIG1hc2sgKi8KKyNkZWZpbmUgU1BJX0NUUkxSMF9TQ1BPTAkJKDE8PDcpCS8qIFNlcmlhbCBjbG9jayBwb2xhcml0eSAqLworI2RlZmluZSBTUElfQ1RSTFIwX1NDUEgJCQkoMTw8NikJLyogU2VyaWFsIGNsb2NrIHBoYXNlICovCisjZGVmaW5lIFNQSV9DVFJMUjBfU1JMCQkJKDE8PDExKQkvKiBTaGlmdCByZWdpc3RlciBsb29wICovCisKKy8qIFNSIC0gc3RhdHVzIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgU1BJX1NSX0JVU1kJCQkoMTw8MCkJLyogU1NJIGJ1c3kgZmxhZywgc2VyaWFsIHRyYW5zZmVyIGluIHByb2dyZXNzICovCisjZGVmaW5lIFNQSV9TUl9URk5GCQkJKDE8PDEpCS8qIFRyYW5zbWl0IEZJRk8gbm90IGZ1bGwgKi8KKyNkZWZpbmUgU1BJX1NSX1RGRQkJCSgxPDwyKQkvKiBUcmFuc21pdCBGSUZPIGVtcHR5ICovCisjZGVmaW5lIFNQSV9TUl9SRk5FCQkJKDE8PDMpCS8qIFJlY2VpdmUgRklGTyBub3QgZW1wdHkgKi8KKyNkZWZpbmUgU1BJX1NSX1JGRgkJCSgxPDw0KQkvKiBSZWNlaXZlIEZJRk8gZnVsbCAqLworI2RlZmluZSBTUElfU1JfVFhFCQkJKDE8PDUpCS8qIFRyYW5zbWlzc2lvbiBlcnJvciAqLworI2RlZmluZSBTUElfU1JfRENPTAkJCSgxPDw2KQkvKiBEYXRhIGNvbGxpc2lvbiBlcnJvciAqLworCisvKiBJTVIsIElTUiwgUklTUiAtIGludGVycnVwdCBtYXNrL3N0YXR1cyBiaXRzICovCisjZGVmaW5lIFNQSV9JTlRfVFhFSQkJCSgxPDwwKQkvKiBUcmFuc21pdCBGSUZPIGVtcHR5IGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgU1BJX0lOVF9UWE9JCQkJKDE8PDEpCS8qIFRyYW5zbWl0IEZJRk8gb3ZlcmZsb3cgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBTUElfSU5UX1JYVUkJCQkoMTw8MikJLyogUmVjZWl2ZSBGSUZPIHVuZGVyZmxvdyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFNQSV9JTlRfUlhPSQkJCSgxPDwzKQkvKiBSZWNlaXZlIEZJRk8gb3ZlcmZsb3cgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBTUElfSU5UX1JYRkkJCQkoMTw8NCkJLyogUmVjZWl2ZSBGSUZPIGZ1bGwgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBTUElfSU5UX01TVEkJCQkoMTw8NSkJLyogTXVsdGktTWFzdGVyIGNvbnRlbnRpb24gaW50ZXJydXB0IHN0YXR1cyAqLworCisjZW5kaWYgLyogX19BU01fQVJDSF9DT01DRVJUTzEwMDBfU1BJX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvdGltZXIuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLTIwMDAvdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTM5NmZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC90aW1lci5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtLWFybS9hcmNoLWNvbWNlcnRvL2NvbWNlcnRvLTEwMDAvdGltZXIuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwOCBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19USU1FUl9IX18KKyNkZWZpbmUgX19USU1FUl9IX18KKworCisvKiBDb21jZXJ0byBUaW1lcnMgICovCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSMF9ISUdIX0JPVU5EICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MDApCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSMF9DVVJSRU5UX0NPVU5UICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MDQpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSMV9ISUdIX0JPVU5EICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MDgpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSMV9DVVJSRU5UX0NPVU5UICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MEMpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSMl9MT1dfQk9VTkQgICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MTApCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSMl9ISUdIX0JPVU5EICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MTQpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSMl9DVFJMICAgICAgICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MTgpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSMl9DVVJSRU5UX0NPVU5UICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MUMpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSM19MT1dfQk9VTkQgICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MjApCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSM19ISUdIX0JPVU5EICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MjQpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSM19DVFJMICAgICAgICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MjgpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSM19DVVJSRU5UX0NPVU5UICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MkMpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSNF9ISUdIX0JPVU5EICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MzApCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSNF9DVVJSRU5UX0NPVU5UICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MzQpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSNV9MT1dfQk9VTkQgICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4MzgpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSNV9ISUdIX0JPVU5EICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4M0MpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSNV9DVVJSRU5UX0NPVU5UICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4NDApCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSNV9DVFJMICAgICAgICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4NDQpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSX0lSUV9NQVNLICAgICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4NDgpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSX1NUQVRVUyAgICAgICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4NTApCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSX1NUQVRVU19DTFIgICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4NTApCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSX1dEVF9ISUdIX0JPVU5EICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4RDApCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSX1dEVF9DT05UUk9MICAgICAgICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4RDQpCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSX1dEVF9DVVJSRU5UX0NPVU5UICAgIEFQQl9WQUREUihDT01DRVJUT19BUEJfVElNRVJfQkFTRSArIDB4RDgpCisKKyNkZWZpbmUgQ09NQ0VSVE9fVElNRVJfV0RUX0NPTlRST0xfVElNRVJfRU5BQkxFCQkoMSA8PCAwKQorCisvKkNPTUNFUlRPX1RJTUVSX0lSUV9NQVNLKi8KKyNkZWZpbmUgQ09NQ0VSVE9fVElNRVIwICAgICAweDAxCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSMSAgICAgMHgwMgorI2RlZmluZSBDT01DRVJUT19USU1FUjIgICAgIDB4MDQKKyNkZWZpbmUgQ09NQ0VSVE9fVElNRVIzICAgICAweDA4CisjZGVmaW5lIENPTUNFUlRPX1RJTUVSNCAgICAgMHgxMAorI2RlZmluZSBDT01DRVJUT19USU1FUjUgICAgIDB4MjAKKyNkZWZpbmUgQ09NQ0VSVE9fQUxMICAgICAgICAweEZGCisjZGVmaW5lIENPTUNFUlRPX1RJTUVSX0NTUCAgKENPTUNFUlRPX1RJTUVSMSB8IENPTUNFUlRPX1RJTUVSMiB8IENPTUNFUlRPX1RJTUVSMyB8IENPTUNFUlRPX1RJTUVSNCB8IENPTUNFUlRPX1RJTUVSNSkKKworLyoKKyAqIFRJTUVSUworICovCisKKworLypIYXJkd2FyZSBUaW1lciBBUEkqLworI2RlZmluZSBDT01DRVJUT19USU1FUl9SVU5fT05DRQkJKDEgPDwgMCkKKyNkZWZpbmUgX19jb21jZXJ0b190aW1lcl9lbmFibGUodCkJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKENPTUNFUlRPX1RJTUVSX0lSUV9NQVNLKSB8ICgxIDw8ICh0KSksIENPTUNFUlRPX1RJTUVSX0lSUV9NQVNLKQorI2RlZmluZSBfX2NvbWNlcnRvX3RpbWVyX2Rpc2FibGUodCkJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKENPTUNFUlRPX1RJTUVSX0lSUV9NQVNLKSAmIH4oMSA8PCAodCkpLCBDT01DRVJUT19USU1FUl9JUlFfTUFTSykKKyNkZWZpbmUgY29tY2VydG9fdGltZXJfYWNrKHQpCQlfX3Jhd193cml0ZWwoMSA8PCAodCksIENPTUNFUlRPX1RJTUVSX1NUQVRVU19DTFIpCisKKyNkZWZpbmUgY29tY2VydG9fdGltZXIwX3NldChoYm91bmQpCV9fcmF3X3dyaXRlbCgoaGJvdW5kKSwgQ09NQ0VSVE9fVElNRVIwX0hJR0hfQk9VTkQpCisjZGVmaW5lIGNvbWNlcnRvX3RpbWVyMF9nZXQoKQkJX19yYXdfcmVhZGwoQ09NQ0VSVE9fVElNRVIwX0NVUlJFTlRfQ09VTlQpCisKKyNkZWZpbmUgY29tY2VydG9fdGltZXIxX3NldChoYm91bmQpCV9fcmF3X3dyaXRlbCgoaGJvdW5kKSAmIDB4M0ZGRkZGRkYsIENPTUNFUlRPX1RJTUVSMV9ISUdIX0JPVU5EKQorI2RlZmluZSBjb21jZXJ0b190aW1lcjFfZ2V0KCkJCV9fcmF3X3JlYWRsKENPTUNFUlRPX1RJTUVSMV9DVVJSRU5UX0NPVU5UKQorCisjZGVmaW5lIGNvbWNlcnRvX3RpbWVyMl9zZXQobGJvdW5kLCBoYm91bmQsIGN0cmwpICBkbyB7XAorCQkJCQkJICAgICAgX19yYXdfd3JpdGVsKChjdHJsKSAmIDB4MSwgQ09NQ0VSVE9fVElNRVIyX0NUUkwpOwlcCisJCQkJCQkgICAgICBfX3Jhd193cml0ZWwoKGxib3VuZCksIENPTUNFUlRPX1RJTUVSMl9MT1dfQk9VTkQpOwlcCisJCQkJCQkgICAgICBfX3Jhd193cml0ZWwoKGhib3VuZCksIENPTUNFUlRPX1RJTUVSMl9ISUdIX0JPVU5EKTsJXAorCQkJCQkJICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBjb21jZXJ0b190aW1lcjJfZ2V0KCkJCV9fcmF3X3JlYWRsKENPTUNFUlRPX1RJTUVSMl9DVVJSRU5UX0NPVU5UKQorCisKKyNkZWZpbmUgY29tY2VydG9fdGltZXIzX3NldChsYm91bmQsIGhib3VuZCwgY3RybCkgIGRvIHsJCQkJCQkJCVwKKwkJCQkJCSAgICAgIF9fcmF3X3dyaXRlbCgoY3RybCkgJiAweDEsIENPTUNFUlRPX1RJTUVSM19DVFJMKTsJXAorCQkJCQkJICAgICAgX19yYXdfd3JpdGVsKChsYm91bmQpLCBDT01DRVJUT19USU1FUjNfTE9XX0JPVU5EKTsJXAorCQkJCQkJICAgICAgX19yYXdfd3JpdGVsKChoYm91bmQpLCBDT01DRVJUT19USU1FUjNfSElHSF9CT1VORCk7CVwKKwkJCQkJCSAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBjb21jZXJ0b190aW1lcjNfZ2V0KCkJCV9fcmF3X3JlYWRsKENPTUNFUlRPX1RJTUVSM19DVVJSRU5UX0NPVU5UKQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworc3RydWN0IGNvbWNlcnRvX3RpbWVyIHsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdm9pZCAoKmZ1bmMpICh1bnNpZ25lZCBsb25nIGRhdGEpOworCXVuc2lnbmVkIGxvbmcgZGF0YTsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdGh3OworfTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL3dkdC5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC93ZHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjc4ZGJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tMjAwMC93ZHQuaApAQCAtMCwwICsxLDI0IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvYXNtL2FyY2gvY29tY2VydG8xMDAwL3dkdC5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA4IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19BU01fQVJDSF9DT01DRVJUTzEwMDBfV0RUX0gKKyNkZWZpbmUgX19BU01fQVJDSF9DT01DRVJUTzEwMDBfV0RUX0gKKworCisjZW5kaWYgLyogX19BU01fQVJDSF9DT01DRVJUTzEwMDBfV0RUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLWNvbW1vbi5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvY29tY2VydG8tY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExNDk5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLWNvbW1vbi5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogIGFyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2NvbWNlcnRvLWNvbW1vbi5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMiBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9IQVJEV0FSRV9ICisjZXJyb3IgIkRvIG5vdCBpbmNsdWRlIHRoaXMgZGlyZWN0bHksIGluc3RlYWQgI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPiIKKyNlbmRpZgorCisjaWZuZGVmIF9fQVNNX0NPTUNFUlRPX0NPTU1PTl9IX18KKyNkZWZpbmUgX19BU01fQ09NQ0VSVE9fQ09NTU9OX0hfXworCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNkZWZpbmUgQVBCX1ZBRERSKHgpCSgoeCkgLSBDT01DRVJUT19BWElfQVBCX0JBU0UgKyBDT01DRVJUT19BUEJfVkFERFIpCQkvKiBtYWNybyB0byBnZXQgdmlydHVhbCBhZGRyZXNzIG9mIElPIG9uIEFQQiBCdXMgZnJvbSBQaHlzaWNhbCBhZGRyZXNzKi8KKyNkZWZpbmUgQVhJX1ZBRERSKHgpCSgoeCkgLSBDT01DRVJUT19BWElfU1BJX0JBU0UgKyBDT01DRVJUT19BWElfU1NJX1ZBRERSKQkvKiBtYWNybyB0byBnZXQgdmlydHVhbCBhZGRyZXNzIG9mIElPIG9uIEFYSSBCdXMgZnJvbSBQaHlzaWNhbCBhZGRyZXNzKi8KKworI2RlZmluZSAgQklUXzBfTVNLICAgMHgwMDAwMDAwMQorI2RlZmluZSAgQklUXzFfTVNLICAgMHgwMDAwMDAwMgorI2RlZmluZSAgQklUXzJfTVNLICAgMHgwMDAwMDAwNAorI2RlZmluZSAgQklUXzNfTVNLICAgMHgwMDAwMDAwOAorI2RlZmluZSAgQklUXzRfTVNLICAgMHgwMDAwMDAxMAorI2RlZmluZSAgQklUXzVfTVNLICAgMHgwMDAwMDAyMAorI2RlZmluZSAgQklUXzZfTVNLICAgMHgwMDAwMDA0MAorI2RlZmluZSAgQklUXzdfTVNLICAgMHgwMDAwMDA4MAorI2RlZmluZSAgQklUXzhfTVNLICAgMHgwMDAwMDEwMAorI2RlZmluZSAgQklUXzlfTVNLICAgMHgwMDAwMDIwMAorI2RlZmluZSAgQklUXzEwX01TSyAgMHgwMDAwMDQwMAorI2RlZmluZSAgQklUXzExX01TSyAgMHgwMDAwMDgwMAorI2RlZmluZSAgQklUXzEyX01TSyAgMHgwMDAwMTAwMAorI2RlZmluZSAgQklUXzEzX01TSyAgMHgwMDAwMjAwMAorI2RlZmluZSAgQklUXzE0X01TSyAgMHgwMDAwNDAwMAorI2RlZmluZSAgQklUXzE1X01TSyAgMHgwMDAwODAwMAorI2RlZmluZSAgQklUXzE2X01TSyAgMHgwMDAxMDAwMAorI2RlZmluZSAgQklUXzE3X01TSyAgMHgwMDAyMDAwMAorI2RlZmluZSAgQklUXzE4X01TSyAgMHgwMDA0MDAwMAorI2RlZmluZSAgQklUXzE5X01TSyAgMHgwMDA4MDAwMAorI2RlZmluZSAgQklUXzIwX01TSyAgMHgwMDEwMDAwMAorI2RlZmluZSAgQklUXzIxX01TSyAgMHgwMDIwMDAwMAorI2RlZmluZSAgQklUXzIyX01TSyAgMHgwMDQwMDAwMAorI2RlZmluZSAgQklUXzIzX01TSyAgMHgwMDgwMDAwMAorI2RlZmluZSAgQklUXzI0X01TSyAgMHgwMTAwMDAwMAorI2RlZmluZSAgQklUXzI1X01TSyAgMHgwMjAwMDAwMAorI2RlZmluZSAgQklUXzI2X01TSyAgMHgwNDAwMDAwMAorI2RlZmluZSAgQklUXzI3X01TSyAgMHgwODAwMDAwMAorI2RlZmluZSAgQklUXzI4X01TSyAgMHgxMDAwMDAwMAorI2RlZmluZSAgQklUXzI5X01TSyAgMHgyMDAwMDAwMAorI2RlZmluZSAgQklUXzMwX01TSyAgMHg0MDAwMDAwMAorI2RlZmluZSAgQklUXzMxX01TSyAgMHg4MDAwMDAwMAorCisvKgorICogR1BJTworICovCisvKiBTZXQgZ3BpbyBwaW5zIHNwZWNpZmllZCBieSBncGlvbWFzayB0byBiZSBvdXRwdXRzICovCisjZGVmaW5lIGNvbWNlcnRvX2dwaW9fZW5hYmxlX291dHB1dChncGlvbWFzaykJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKENPTUNFUlRPX0dQSU9fT0VfUkVHKSB8IChncGlvbWFzayksIENPTUNFUlRPX0dQSU9fT0VfUkVHKQorCisvKiBTZXQgb3V0cHV0IHBpbnMgc3BlY2lmaWVkIGJ5IGdwaW9tYXNrIHRvIGxvdyAqLworI2RlZmluZSBjb21jZXJ0b19ncGlvX3NldF8wKGdwaW9tYXNrKQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHKSAmIH4oZ3Bpb21hc2spLCBDT01DRVJUT19HUElPX09VVFBVVF9SRUcpCisKKy8qIFNldCBvdXRwdXQgcGlucyBzcGVjaWZpZWQgYnkgZ3Bpb21hc2sgdG8gaGlnaCAqLworI2RlZmluZSBjb21jZXJ0b19ncGlvX3NldF8xKGdwaW9tYXNrKQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHKSB8IChncGlvbWFzayksIENPTUNFUlRPX0dQSU9fT1VUUFVUX1JFRykKKworLyogUmVhZCBzdGF0dXMgb2YgaW5wdXQgcGlucyBzcGVjaWZpZWQgYnkgZ3Bpb21hc2sgKi8KKyNkZWZpbmUgY29tY2VydG9fZ3Bpb19yZWFkKGdwaW9tYXNrKQkoX19yYXdfcmVhZGwoQ09NQ0VSVE9fR1BJT19JTlBVVF9SRUcpICYgKGdwaW9tYXNrKSkKKworCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2RlZmluZSBDT05GSUdfQ09NQ0VSVE9fR0VNQUMJCTEKKworI2RlZmluZSBDT05GSUdfQ09NQ0VSVE9fVVNFX01JSQkJMQorI2RlZmluZSBDT05GSUdfQ09NQ0VSVE9fVVNFX1JNSUkJCTIKKyNkZWZpbmUgQ09ORklHX0NPTUNFUlRPX1VTRV9HTUlJCQk0CisjZGVmaW5lIENPTkZJR19DT01DRVJUT19VU0VfUkdNSUkJOAorI2RlZmluZSBDT05GSUdfQ09NQ0VSVE9fVVNFX1NHTUlJCTB4MTAKKworI2RlZmluZSBHRU1BQ19TV19DT05GCQkJKDEgPDwgOCkgfCAoMSA8PCAxMSkJLy8gR0VNQUMgY29uZmlndXJlZCBieSBTVworI2RlZmluZSBHRU1BQ19QSFlfQ09ORgkJMAkJCS8vIEdFTUFDIGNvbmZpZ3VyZWQgYnkgcGh5IGxpbmVzIChub3QgZm9yIE1JSS9HTUlJKQorI2RlZmluZSBHRU1BQ19TV19GVUxMX0RVUExFWAkoMSA8PCA5KQorI2RlZmluZSBHRU1BQ19TV19TUEVFRF8xME0JKDAgPDwgMTIpCisjZGVmaW5lIEdFTUFDX1NXX1NQRUVEXzEwME0JKDEgPDwgMTIpCisjZGVmaW5lIEdFTUFDX1NXX1NQRUVEXzFHCQkoMiA8PCAxMikKKworI2RlZmluZSBHRU1BQ19OT19QSFkJCQkoMSA8PCAwKQkJLy8gc2V0IGlmIG5vIHBoeSBjb25uZWN0ZWQgdG8gTUFDIChleCBldGhlcm5ldCBzd2l0Y2gpLiBJbiB0aGlzIGNhc2UgdXNlIE1BQyBmaXhlZCBjb25maWd1cmF0aW9uCisjZGVmaW5lIEdFTUFDX1BIWV9SR01JSV9BRERfREVMQVkJKDEgPDwgMSkKKworLyogZ2VtYWMgdG8gaW50ZXJmYWNlIG5hbWUgYXNzaWdubWVudCAqLworI2RlZmluZSBHRU0wX0lURl9OQU1FICJldGgwIgorI2RlZmluZSBHRU0xX0lURl9OQU1FICJldGgyIgorI2RlZmluZSBHRU0yX0lURl9OQU1FICJldGgzIgorCisjZGVmaW5lIEdFTTBfTUFDIHsgMHgwMCwgMHhFRCwgMHhDRCwgMHhFRiwgMHhBQSwgMHhDQyB9CisjZGVmaW5lIEdFTTFfTUFDIHsgMHgwMCwgMHgyQSwgMHgyQiwgMHgyQywgMHgyRCwgMHgyRSB9CisjZGVmaW5lIEdFTTJfTUFDIHsgMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSB9CisKK3N0cnVjdCBjb21jZXJ0b19ldGhfcGxhdGZvcm1fZGF0YSB7CisJLyogZGV2aWNlIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisJdTMyIGRldmljZV9mbGFnczsKKwljaGFyIG5hbWVbMTZdOworCisKKwkvKiBib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLworCXUzMiBtaWlfY29uZmlnOworCXUzMiBnZW1hY19tb2RlOworCXUzMiBwaHlfZmxhZ3M7CisJdTMyIGdlbV9pZDsKKwl1MzIgYnVzX2lkOworCXUzMiBwaHlfaWQ7CisJdTggKm1hY19hZGRyOworfTsKKworc3RydWN0IGNvbWNlcnRvX21kaW9fcGxhdGZvcm1fZGF0YSB7CisJaW50IGVuYWJsZWQ7CisJaW50IGlycVszMl07CisJdTMyIHBoeV9tYXNrOworCWludCBtZGNfZGl2OworfTsKKworc3RydWN0IGNvbWNlcnRvX3BmZV9wbGF0Zm9ybV9kYXRhCit7CisJc3RydWN0IGNvbWNlcnRvX2V0aF9wbGF0Zm9ybV9kYXRhIGNvbWNlcnRvX2V0aF9wZGF0YVszXTsKKwlzdHJ1Y3QgY29tY2VydG9fbWRpb19wbGF0Zm9ybV9kYXRhIGNvbWNlcnRvX21kaW9fcGRhdGFbM107Cit9OworCitzdHJ1Y3QgY29tY2VydG9fdGRtX2RhdGEgeworCXU4IGZzb3V0cHV0OyAvKiBHZW5lcmljIFBhZCBDb250cm9sIGFuZCBWZXJzaW9uIElEIFJlZ2lzdGVyWzJdICovCisJdTggZnNwb2xhcml0eTsgLyogIDI4IEZTWU5DX0ZBTEwoUklTRSlfRURHRSAqLworCXUxNiBmc2h3aWR0aDsgLyogSGlnaF9QaGFzZV9XaWR0aFsxMDowXSAqLworCXUxNiBmc2x3aWR0aDsgLyogTG93X1BoYXNlX1dpZHRoWzI2OjE2XV0gKi8KKwl1MzIgY2xvY2toejsgLyogSU5DX1ZBTFVFWzI5OjBdIEFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBURE0gY2xvY2sgb3V0cHV0IGZyZXF1ZW5jeSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgY29uZmlndXJlZCAqLworCXU4IGNsb2Nrb3V0OyAvKiBJTyBDb250cm9sIFJlZ2lzdGVyWzIxXSAgaGFyZHdhcmUgb3Igc29mdHdhcmUgY29udHJvbCBzZWxlY3Rpb24gIElPIENvbnRyb2wgUmVnaXN0ZXJbMjBdIHBhZHMgYXJlIGlucHV0IChvdXRwdXQpICovCisJdTggdGRtbXV4OworI2lmIDAKKwl1MzIgdGRtY2s7CisJdTMyIHRkbWZzOworCXUzMiB0ZG1keDsKKwl1MzIgdGRtZHI7CisjZW5kaWYKK307CisKKy8qIEwyMTAgY2FjaGUgY29udHJvbGxlciB2YWx1ZQorICAgIC8vIENvbmZpZ3VyZSBBdXg6CisgICAgLy8gICBbMTE6OV09Wzg6Nl09WzI6MF09MDAxIFJBTSBMQVQgPSAyIGN5Y2xlcworICAgIC8vICAgWzU6M109MDAwICAgIERhdGEgd3JpdGUgbGF0ZW5jeSBpcyAxCisgICAgLy8gICBbMTJdPTAgICAgICAgV1JBUCBhY2Nlc3MgaXMgZW5hYmxlZAorICAgIC8vICAgWzE2OjEzXT0xMDAwIDgtd2F5IGNhY2hlCisgICAgLy8gICBbMTk6MTddPTAwMSAgMTZLQiB3YXkKKyAgICAvLyAgIFsyMF09MSAgICAgICBFdmVudCBidXMgaXMgZW5hYmxlZAorICAgIC8vICAgWzIxXT0xICAgICAgIFBhcml0eSBpcyBlbmFibGVkCisgICAgLy8gICBbMjJdPTAgICAgICAgU2hhcmVkIGFjY2Vzc2VzIHRyZWF0ZWQgYXMgbm9uY2FjaGVhYmxlCisgICAgLy8gICBbMjNdPTAgICAgICAgSFBST1QgaXMgdXNlZAorICAgIC8vICAgWzI0XT0xICAgICAgIEFib3J0IGdlbmVyYXRpb24gb2YgZXhjbHVzaXZlIGFjY2VzcyBkaXNhYmxlZAorKi8KKyNkZWZpbmUgTDIxMF9BVVhfQ1RSTF9SRUcJMHgwMTMzMDI0MQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlZmI5YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjZGVmaW5lIFVBUlRfTFNSCTB4MTQKKworCisJLm1hY3JvCWFkZHJ1YXJ0LCByeCwgcnYsIHRtcAorCW1vdmVxCVxyeCwgIzB4OTYwMDAwMDAJQCBwaHlzaWNhbCBiYXNlIGFkZHJlc3MKKwlAbW92bmUJXHJ2LCAjMHhmMTYwMDAwMAlAIHZpcnR1YWwgYmFzZQorCSNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fVUFSVDFfU1VQUE9SVAorCQlvcnIJXHJ4LCBccngsICMweDAwNDAwMDAwCisJCW9ycglccnYsIFxydiwgIzB4MDA0MDAwMDAKKwkjZWxpZiBDT05GSUdfQ09NQ0VSVE9fVUFSVDBfU1VQUE9SVAorCQlvcnIJXHJ4LCBccngsICMweDAwMzAwMDAwCisJCW9ycglccnYsIFxydiwgIzB4MDAzMDAwMDAKKwkjZWxzZQorCQkjZXJyb3Igbm8gdWFydCBkZWZpbmVkCisJI2VuZGlmCisJLmVuZG0KKworCS5tYWNybwlzZW5kdWFydCxyZCxyeAorCXN0cmIJXHJkLCBbXHJ4LCAjMHgwMF0KKwkuZW5kbQorCisJLm1hY3JvCXdhaXR1YXJ0LHJkLHJ4CisxMDAxOglsZHJiCVxyZCwgW1xyeCwgI1VBUlRfTFNSXQorCXRzdAlccmQsICMweDIwCQlAIHdhaXQgZm9yIFRIUkUKKwliZXEJMTAwMWIKKwkuZW5kbQorCisJLm1hY3JvCWJ1c3l1YXJ0LHJkLHJ4CisxMDAxOglsZHJiCVxyZCwgW1xyeCwgI1VBUlRfTFNSXQorCWFuZAlccmQsIFxyZCwgIzB4NjAKKwl0ZXEJXHJkLCAjMHg2MAkJQCB3YWl0IGZvciBURU1UIGFuZCBUSFJFCisJYm5lCTEwMDFiCisJLmVuZG0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2RlYnVnLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzJlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9kZWJ1Zy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtY29tY2VydG8vZGVidWcuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0RFQlVHX0gKKyNkZWZpbmUgX0RFQlVHX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisvKiBkZWJ1ZyBtZXNzYWdlczogdG8gZGlzYWJsZSBjb21tZW50IHRoZSBuZXh0IGxpbmUgKi8KKyNkZWZpbmUgREVCVUdfTVNHCisKKy8qIHNldmVyYWwgZGVidWcgbGV2ZWxzOiAxIGVuYWJsZXMsIDAgZGlzYWJsZXMgKi8KKworI2RlZmluZSBERUJVR19BTFdBWVMgCQkxCisKKy8qIHByaW50cyBnZW5lcmFsIGluZm9ybWF0aW9uICovCisjZGVmaW5lIERFQlVHX0lORk8JCQkxCisKKy8qIHByaW50cyB0aW1pbmcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgREVCVUdfVElNSU5HCQkwCisKKyNkZWZpbmUgREVCVUdfRElTUExBWSAJCTEKKworI2RlZmluZSBWRURfSU5JVF9GVU5DCQkxCisjZGVmaW5lIFZFRF9SWF9GVU5DCQkwCisjZGVmaW5lIFZFRF9UWF9GVU5DCQkwCisjZGVmaW5lIFZFRF9TVEFURQkJMAorI2RlZmluZSBTTUlfUEFSVAkJMAorCisjZGVmaW5lIFNLQl9QT09MX0VSUgkJMQorI2RlZmluZSBTS0JfUE9PTF9JTklUCQkwCisjZGVmaW5lIFNLQl9QT09MX0ZVTkMJCTAKKworI2RlZmluZSBNU1BfRVJSCQkJMQorI2RlZmluZSBNU1BfSU5JVAkJMAorI2RlZmluZSBNU1BfRlVOQwkJMAorCisKKy8qIGFkZCBvdGhlciBkZWJ1ZyBtZXNzYWdlcyB0eXBlcyBoZXJlICovCisKKy8qIHRoZSBkZWJ1ZyBtYWNybyAqLworI2lmZGVmIERFQlVHX01TRworI2RlZmluZSBpbmZvKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fSU5GTyBfX0ZJTEVfXyAiOiAiIGZtdCAiXG4iICwgIyMgYXJncykKKyNkZWZpbmUgUERFQlVHKHR5cGUsIGZtdCwgYXJncy4uLikgZG8ge2lmKHR5cGUpIGluZm8gKCIlZDogIiBmbXQsIF9fTElORV9fICwgIyMgYXJncyk7fSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgUERFQlVHKHR5cGUsIGZtdCwgYXJncy4uLikgZG97fSB3aGlsZSgwKQorI2VuZGlmCisKKyNlbmRpZgkvKiBfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9kbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzA4ZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvZG1hLmgKQEAgLTAsMCArMSw1NTIgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtY29tY2VydG8vZG1hLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgTWluZHNwZWVkIFRlY2hub2xvZ2llcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfX0FTTV9BUkNIX0RNQV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfRE1BX0gKKworCisKK3R5cGVkZWYgbG9uZyBJMzI7Cit0eXBlZGVmIGNoYXIgSTg7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgVTg7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFUxNjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBVMzI7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgVjg7Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IFYxNjsKK3R5cGVkZWYgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBWMzI7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBCT09MOyAKK3R5cGVkZWYgVTMyICgqQ0tTVU1GVU5DKSh2b2lkKTsKK3R5cGVkZWYgVTMyICgqUExVR0lOUFJPQykodm9pZCAqICk7CisKK3R5cGVkZWYgZW51bSBfcmV0Y29kZQoreworICAgUkVUQ09ERV9PSyA9IDAsCisgICBSRVRDT0RFX0VSUk9SLAorICAgUkVUQ09ERV9CQURfUEFSQU1FVEVSLAorICAgUkVUQ09ERV9NSVNNQVRDSCwgICAgICAgICAgICAgICAgLyogU2VjdXJpdHkgdmlvbGF0aW9uLiAqLworICAgUkVUQ09ERV9JTlZBTElEX0ZVU0VfU0VUVElORywgICAgLyogU2VjdXJpdHkgdmlvbGF0aW9uLiAqLworICAgUkVUQ09ERV9JTlZBTElEX0lNQUdFX0hFQURFUiwgICAgLyogU2VjdXJpdHkgdmlvbGF0aW9uLiAqLworICAgUkVUQ09ERV9SU0FfRVJST1IsICAgICAgICAgICAgICAgLyogU2VjdXJpdHkgVmlvbGF0aW9uLiAqLworICAgUkVUQ09ERV9OT19WQUxJRF9DT1BZLCAgCisgICBSRVRDT0RFX0hEQ1BfS0VZX0xPQURfRkFJTEVELAorICAgUkVUQ09ERV9GVVNFX1BST0dSQU1fRkFJTEVELAorICAgUkVUQ09ERV9PVFBfRVJSLAorICAgUkVUQ09ERV9GQUlMRUQsCisgICBSRVRDT0RFX0JPT1RERVZfVUFSVCwKKyAgIFJFVENPREVfQk9PVERFVl9GTEFTSCwKKyAgIFJFVENPREVfQk9PVERFVl9JTlZBTElELAorICAgUkVUQ09ERV9GTEFTSF9ERVZJQ0VfTk9UX1NVUFBPUlRFRCwKKyAgIFJFVENPREVfRkxBU0hfQkFEX0JMT0NLLAorICAgUkVUQ09ERV9GTEFTSF9VTkNPUlJFQ1RBQkxFX0VSUk9SLAorICAgUkVUQ09ERV9VQVJUQk9PVF9FUlJPUiwKKyAgIFJFVENPREVfTk9UX1NVUFBPUlRFRCwKKyAgIFJFVENPREVfSU5WQUxJRF9CT09UX0RFViwKKyAgIFJFVENPREVfU0VDVVJFX0JPT1RfRU5BQkxFLAorICAgUkVUQ09ERV9TRUNVUkVfQk9PVF9ESVNBQkxFLAorICAgUkVUQ09ERV9ZTU9ERU1fSERSX0VSUk9SLAorICAgUkVUQ09ERV9ZTU9ERU1fUEtUX0VSUk9SLAorICAgUkVUQ09ERV9ZTU9ERU1fRE9ORV9FUlJPUiwKKyAgIFJFVENPREVfUEFEX0VSUk9SLAorICAgUkVUQ09ERV9FQ0NfRVJSX0NPUlJFQ1RFRCwKKyAgIFJFVENPREVfRUNDX0VSUl9VTkNPUlJFQ1RBQkxFLAorICAgUkVUQ09ERV9FQ0NfREFUQV9FUlJPUiwKKyAgIFJFVENPREVfTkFORF9CQlRfT1VUX09GX0JPVU5ECit9IHJldGNvZGU7CisKKworCisvKgorICAqIERXIERNQSAoSFMgU1BJIGFuZCBVQVJUKSBCbG9jaworICAqLworCisjZGVmaW5lIERXX0RNQV9ETUFDX0JBU0VBRERSCQkJCShDT01DRVJUT19BWElfVUFSVF9TUElfQkFTRSsweDAwMDAwMDAwKQorI2RlZmluZSBEV19ETUFfVUFSVDBfQkFTRUFERFIJCQkJKENPTUNFUlRPX0FYSV9VQVJUX1NQSV9CQVNFKzB4MDAzMDAwMDApCisjZGVmaW5lIERXX0RNQV9VQVJUMV9CQVNFQUREUgkJCQkoQ09NQ0VSVE9fQVhJX1VBUlRfU1BJX0JBU0UrMHgwMDQwMDAwMCkKKyNkZWZpbmUgRFdfRE1BX1NTSV9CQVNFQUREUgkJCQkJKENPTUNFUlRPX0FYSV9VQVJUX1NQSV9CQVNFKzB4MDA1MDAwMDApCisKKworLyoKKyAgKiBEVyBETUEgRE1BQworICAqLworCisvKiBDaGFubmVsIFJlZ2lzdGVycyAqLyAgCisjZGVmaW5lIERXX0RNQV9ETUFDX1NBUjAJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDAwMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfREFSMAkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MDA4KQorI2RlZmluZSBEV19ETUFfRE1BQ19MTFAwCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwMTApCisjZGVmaW5lIERXX0RNQV9ETUFDX0NUTDAJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDAxOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU1NUQVQwCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwMjApCisjZGVmaW5lIERXX0RNQV9ETUFDX0RTVEFUMAkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MDI4KQorI2RlZmluZSBEV19ETUFfRE1BQ19TU1RBVEFSMAkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwMzApCisjZGVmaW5lIERXX0RNQV9ETUFDX0RTVEFUQVIwCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDAzOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfQ0ZHMAkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MDQwKQorI2RlZmluZSBEV19ETUFfRE1BQ19TR1IwCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwNDgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0RTUjAJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDA1MCkKKworI2RlZmluZSBEV19ETUFfRE1BQ19TQVIxCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwNTgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0RBUjEJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDA2MCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfTExQMQkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MDY4KQorI2RlZmluZSBEV19ETUFfRE1BQ19DVEwxCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwNzApCisjZGVmaW5lIERXX0RNQV9ETUFDX1NTVEFUMQkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MDc4KQorI2RlZmluZSBEV19ETUFfRE1BQ19EU1RBVDEJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDA4MCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU1NUQVRBUjEJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MDg4KQorI2RlZmluZSBEV19ETUFfRE1BQ19EU1RBVEFSMQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwOTApCisjZGVmaW5lIERXX0RNQV9ETUFDX0NGRzEJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDA5OCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU0dSMQkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MEEwKQorI2RlZmluZSBEV19ETUFfRE1BQ19EU1IxCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwQTgpCisKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU0FSMgkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MEIwKQorI2RlZmluZSBEV19ETUFfRE1BQ19EQVIyCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwQjgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0xMUDIJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDBDMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfQ1RMMgkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MEM4KQorI2RlZmluZSBEV19ETUFfRE1BQ19TU1RBVDIJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDBEMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfRFNUQVQyCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwRDgpCisjZGVmaW5lIERXX0RNQV9ETUFDX1NTVEFUQVIyCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDBFMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfRFNUQVRBUjIJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MEU4KQorI2RlZmluZSBEV19ETUFfRE1BQ19DRkcyCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgwRjApCisjZGVmaW5lIERXX0RNQV9ETUFDX1NHUjIJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDBGOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfRFNSMgkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MTAwKQorCisjZGVmaW5lIERXX0RNQV9ETUFDX1NBUjMJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDEwOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfREFSMwkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MTEwKQorI2RlZmluZSBEV19ETUFfRE1BQ19MTFAzCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxMTgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0NUTDMJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDEyMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU1NUQVQzCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxMjgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0RTVEFUMwkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MTMwKQorI2RlZmluZSBEV19ETUFfRE1BQ19TU1RBVEFSMwkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxMzgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0RTVEFUQVIzCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDE0MCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfQ0ZHMwkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MTQ4KQorI2RlZmluZSBEV19ETUFfRE1BQ19TR1IzCQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxNTApCisjZGVmaW5lIERXX0RNQV9ETUFDX0RTUjMJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDE1OCkKKworI2RlZmluZSBEV19ETUFfRE1BQ19TQVI0CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxNjApCisjZGVmaW5lIERXX0RNQV9ETUFDX0RBUjQJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDE2OCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfTExQNAkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MTcwKQorI2RlZmluZSBEV19ETUFfRE1BQ19DVEw0CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxNzgpCisjZGVmaW5lIERXX0RNQV9ETUFDX1NTVEFUNAkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MTgwKQorI2RlZmluZSBEV19ETUFfRE1BQ19EU1RBVDQJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDE4OCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU1NUQVRBUjQJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MTkwKQorI2RlZmluZSBEV19ETUFfRE1BQ19EU1RBVEFSNAkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxOTgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0NGRzQJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDFBMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU0dSNAkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MUE4KQorI2RlZmluZSBEV19ETUFfRE1BQ19EU1I0CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxQjApCisKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU0FSNQkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MUI4KQorI2RlZmluZSBEV19ETUFfRE1BQ19EQVI1CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxQzApCisjZGVmaW5lIERXX0RNQV9ETUFDX0xMUDUJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDFDOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfQ1RMNQkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MUQwKQorI2RlZmluZSBEV19ETUFfRE1BQ19TU1RBVDUJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDFEOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfRFNUQVQ1CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxRTApCisjZGVmaW5lIERXX0RNQV9ETUFDX1NTVEFUQVI1CQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDFFOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfRFNUQVRBUjUJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MUYwKQorI2RlZmluZSBEV19ETUFfRE1BQ19DRkc1CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgxRjgpCisjZGVmaW5lIERXX0RNQV9ETUFDX1NHUjUJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDIwMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfRFNSNQkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MjA4KQorCisjZGVmaW5lIERXX0RNQV9ETUFDX1NBUjYJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDIxMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfREFSNgkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MjE4KQorI2RlZmluZSBEV19ETUFfRE1BQ19MTFA2CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyMjApCisjZGVmaW5lIERXX0RNQV9ETUFDX0NUTDYJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDIyOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU1NUQVQ2CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyMzApCisjZGVmaW5lIERXX0RNQV9ETUFDX0RTVEFUNgkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MjM4KQorI2RlZmluZSBEV19ETUFfRE1BQ19TU1RBVEFSNgkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyNDApCisjZGVmaW5lIERXX0RNQV9ETUFDX0RTVEFUQVI2CQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDI0OCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfQ0ZHNgkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MjUwKQorI2RlZmluZSBEV19ETUFfRE1BQ19TR1I2CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyNTgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0RTUjYJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDI2MCkKKworI2RlZmluZSBEV19ETUFfRE1BQ19TQVI3CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyNjgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0RBUjcJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDI3MCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfTExQNwkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4Mjc4KQorI2RlZmluZSBEV19ETUFfRE1BQ19DVEw3CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyODApCisjZGVmaW5lIERXX0RNQV9ETUFDX1NTVEFUNwkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4Mjg4KQorI2RlZmluZSBEV19ETUFfRE1BQ19EU1RBVDcJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDI5MCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU1NUQVRBUjcJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4Mjk4KQorI2RlZmluZSBEV19ETUFfRE1BQ19EU1RBVEFSNwkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyQTApCisjZGVmaW5lIERXX0RNQV9ETUFDX0NGRzcJCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDJBOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU0dSNwkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MkIwKQorI2RlZmluZSBEV19ETUFfRE1BQ19EU1I3CQkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyQjgpCisKKy8qIEludGVycnVwdCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRFdfRE1BX0RNQUNfUkFXX1RGUgkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MkMwKQorI2RlZmluZSBEV19ETUFfRE1BQ19SQVdfQkxPQ0sJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MkM4KQorI2RlZmluZSBEV19ETUFfRE1BQ19SQVdfU1JDX1RSQU4JCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyRDApCisjZGVmaW5lIERXX0RNQV9ETUFDX1JBV19EU1RfVFJBTgkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDJEOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfUkFXX0VSUgkJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MkUwKQorI2RlZmluZSBEV19ETUFfRE1BQ19TVEFUVVNfVEZSCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDJFOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU1RBVFVTX0JMSwkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgyRjApCisjZGVmaW5lIERXX0RNQV9ETUFDX1NUQVRVU19TUkNfVFJBTgkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDJGOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU1RBVFVTX0RTVF9UUkFOCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MzAwKQorI2RlZmluZSBEV19ETUFfRE1BQ19TVEFUVVNfRVJSCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDMwOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfTUFTS19URlIJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MzEwKQorI2RlZmluZSBEV19ETUFfRE1BQ19NQVNLX0JMT0NLCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDMxOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfTUFTS19TUkNfVFJBTgkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDMyMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfTUFTS19EU1RfVFJBTgkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDMyOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfTUFTS19FUlIJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MzMwKQorI2RlZmluZSBEV19ETUFfRE1BQ19DTEVBUl9URlIJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MzM4KQorI2RlZmluZSBEV19ETUFfRE1BQ19DTEVBUl9CTEsJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MzQwKQorI2RlZmluZSBEV19ETUFfRE1BQ19DTEVBUl9TUkNfVFJBTgkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDM0OCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfQ0xFQVJfRFNUX1RSQU4JCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgzNTApCisjZGVmaW5lIERXX0RNQV9ETUFDX0NMRUFSX0VSUgkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgzNTgpCisjZGVmaW5lIERXX0RNQV9ETUFDX1NUQVRVU19JTlQJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MzYwKQorCisvKiBTb2Z0d2FyZSBIYW5kc2hha2luZyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRFdfRE1BX0RNQUNfUkVRX1NSQ19SRUcJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MzY4KQorI2RlZmluZSBEV19ETUFfRE1BQ19SRVFfRFNUX1JFRwkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgzNzApCisjZGVmaW5lIERXX0RNQV9ETUFDX1NHTF9SRVFfU1JDX1JFRwkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDM3OCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfU0dMX1JFUV9EU1RfUkVHCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4MzgwKQorI2RlZmluZSBEV19ETUFfRE1BQ19MU1RfU1JDX1JFRwkJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgzODgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0xTVF9EU1RfUkVHCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDM5MCkKKworLyogTWlzY2VsbGFuZW91cyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgRFdfRE1BX0RNQUNfRE1BX0NGR19SRUcJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4Mzk4KQorI2RlZmluZSBEV19ETUFfRE1BQ19DSF9FTl9SRUcJCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4M0EwKQorI2RlZmluZSBEV19ETUFfRE1BQ19ETUFfTERfUkVHCQkJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDNBOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfRE1BX1RFU1RfUkVHCQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4M0IwKQorI2RlZmluZSBEV19ETUFfRE1BQ19ETUFfQ09NUF9QQV9SQU1TXzYJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDNDOCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfRE1BX0NPTVBfUEFfUkFNU181CQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgzRDApCisjZGVmaW5lIERXX0RNQV9ETUFDX0RNQV9DT01QX1BBX1JBTVNfNAkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4M0Q4KQorI2RlZmluZSBEV19ETUFfRE1BQ19ETUFfQ09NUF9QQV9SQU1TXzMJCShEV19ETUFfRE1BQ19CQVNFQUREUisweDNFMCkKKyNkZWZpbmUgRFdfRE1BX0RNQUNfRE1BX0NPTVBfUEFfUkFNU18yCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgzRTgpCisjZGVmaW5lIERXX0RNQV9ETUFDX0RNQV9DT01QX1BBX1JBTVNfMQkJKERXX0RNQV9ETUFDX0JBU0VBRERSKzB4M0YwKQorI2RlZmluZSBEV19ETUFfRE1BQ19ETUFfQ09NUF9JRF9SRUcJCQkoRFdfRE1BX0RNQUNfQkFTRUFERFIrMHgzRjgpCisKKworCisvKgorICAqIERXIERNQSBVQVJUMAorICAqLworCisjZGVmaW5lIERXX0RNQV9VQVJUMF9SQlIJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHgwMCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX1RIUgkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDAwKQorI2RlZmluZSBEV19ETUFfVUFSVDBfRExMCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4MDApCisjZGVmaW5lIERXX0RNQV9VQVJUMF9ETEgJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHgwNCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX0lFUgkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDA0KQorI2RlZmluZSBEV19ETUFfVUFSVDBfSUlSCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4MDgpCisjZGVmaW5lIERXX0RNQV9VQVJUMF9GQ1IJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHgwOCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX0xDUgkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDBDKQorI2RlZmluZSBEV19ETUFfVUFSVDBfTUNSCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4MTApCisjZGVmaW5lIERXX0RNQV9VQVJUMF9MU1IJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHgxNCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX01TUgkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDE4KQorI2RlZmluZSBEV19ETUFfVUFSVDBfU0NSCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4MUMpCisjZGVmaW5lIERXX0RNQV9VQVJUMF9MUERMTAkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDIwKQorI2RlZmluZSBEV19ETUFfVUFSVDBfTFBETEgJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHgyNCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX1NSQlIJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHgzMCkgLyogU2hhZG93IFJlY2VpdmUgQnVmZmVyIFJlZ2lzdGVyICgweDMwIHRvIDB4NkMpICovCisjZGVmaW5lIERXX0RNQV9VQVJUMF9TVEhSCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4MzApIC8qIFNoYWRvdyBUcmFuc21pdCBIb2xkaW5nIFJlZ2lzdGVyICgweDMwIHRvIDB4NkMpICovCisjZGVmaW5lIERXX0RNQV9VQVJUMF9GQVIJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHg0MCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX1RGUgkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDcwKQorI2RlZmluZSBEV19ETUFfVUFSVDBfUkZXCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4NzQpCisjZGVmaW5lIERXX0RNQV9VQVJUMF9VU1IJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHg3OCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX1RGTAkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDdDKQorI2RlZmluZSBEV19ETUFfVUFSVDBfUkZMCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4ODApCisjZGVmaW5lIERXX0RNQV9VQVJUMF9TUlIJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHg4NCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX1NSVFMJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHg4OCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX0RSCQkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDhDKQorI2RlZmluZSBEV19ETUFfVUFSVDBfU0JDUgkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDkwKQorI2RlZmluZSBEV19ETUFfVUFSVDBfU0RNQU0JCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHg5NCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX1NGRQkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweDk4KQorI2RlZmluZSBEV19ETUFfVUFSVDBfU1JUCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4OUMpCisjZGVmaW5lIERXX0RNQV9VQVJUMF9TVEVUCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4QTApCisjZGVmaW5lIERXX0RNQV9VQVJUMF9IVFgJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHhBNCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX0RNQVNBCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4QTgpCisjZGVmaW5lIERXX0RNQV9VQVJUMF9DUFIJCQkJCShEV19ETUFfVUFSVDBfQkFTRUFERFIrMHhGNCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQwX1VDVgkJCQkJKERXX0RNQV9VQVJUMF9CQVNFQUREUisweEY4KQorI2RlZmluZSBEV19ETUFfVUFSVDBfQ1RSCQkJCQkoRFdfRE1BX1VBUlQwX0JBU0VBRERSKzB4RkMpCisKKworCisKKy8qCisgICogRFcgRE1BIFVBUlQxCisgICovCisKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX1JCUgkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDAwKQorI2RlZmluZSBEV19ETUFfVUFSVDFfVEhSCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4MDApCisjZGVmaW5lIERXX0RNQV9VQVJUMV9ETEwJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHgwMCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX0RMSAkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDA0KQorI2RlZmluZSBEV19ETUFfVUFSVDFfSUVSCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4MDQpCisjZGVmaW5lIERXX0RNQV9VQVJUMV9JSVIJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHgwOCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX0ZDUgkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDA4KQorI2RlZmluZSBEV19ETUFfVUFSVDFfTENSCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4MEMpCisjZGVmaW5lIERXX0RNQV9VQVJUMV9NQ1IJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHgxMCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX0xTUgkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDE0KQorI2RlZmluZSBEV19ETUFfVUFSVDFfTVNSCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4MTgpCisjZGVmaW5lIERXX0RNQV9VQVJUMV9TQ1IJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHgxQykKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX0xQRExMCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4MjApCisjZGVmaW5lIERXX0RNQV9VQVJUMV9MUERMSAkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDI0KQorI2RlZmluZSBEV19ETUFfVUFSVDFfU1JCUgkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDMwKSAvKiBTaGFkb3cgUmVjZWl2ZSBCdWZmZXIgUmVnaXN0ZXIgKDB4MzAgdG8gMHg2QykgKi8KKyNkZWZpbmUgRFdfRE1BX1VBUlQxX1NUSFIJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHgzMCkgLyogU2hhZG93IFRyYW5zbWl0IEhvbGRpbmcgUmVnaXN0ZXIgKDB4MzAgdG8gMHg2QykgKi8KKyNkZWZpbmUgRFdfRE1BX1VBUlQxX0ZBUgkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDQwKQorI2RlZmluZSBEV19ETUFfVUFSVDFfVEZSCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4NzApCisjZGVmaW5lIERXX0RNQV9VQVJUMV9SRlcJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHg3NCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX1VTUgkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDc4KQorI2RlZmluZSBEV19ETUFfVUFSVDFfVEZMCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4N0MpCisjZGVmaW5lIERXX0RNQV9VQVJUMV9SRkwJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHg4MCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX1NSUgkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDg0KQorI2RlZmluZSBEV19ETUFfVUFSVDFfU1JUUwkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDg4KQorI2RlZmluZSBEV19ETUFfVUFSVDFfRFIJCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4OEMpCisjZGVmaW5lIERXX0RNQV9VQVJUMV9TQkNSCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4OTApCisjZGVmaW5lIERXX0RNQV9VQVJUMV9TRE1BTQkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweDk0KQorI2RlZmluZSBEV19ETUFfVUFSVDFfU0ZFCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4OTgpCisjZGVmaW5lIERXX0RNQV9VQVJUMV9TUlQJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHg5QykKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX1NURVQJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHhBMCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX0hUWAkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweEE0KQorI2RlZmluZSBEV19ETUFfVUFSVDFfRE1BU0EJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHhBOCkKKyNkZWZpbmUgRFdfRE1BX1VBUlQxX0NQUgkJCQkJKERXX0RNQV9VQVJUMV9CQVNFQUREUisweEY0KQorI2RlZmluZSBEV19ETUFfVUFSVDFfVUNWCQkJCQkoRFdfRE1BX1VBUlQxX0JBU0VBRERSKzB4RjgpCisjZGVmaW5lIERXX0RNQV9VQVJUMV9DVFIJCQkJCShEV19ETUFfVUFSVDFfQkFTRUFERFIrMHhGQykKKworCisKKworLyogRE1BIENoYW5uZWxzICovCisjZGVmaW5lIERNQV9DSEFOTkVMXzAJCQkJCTB4MAorI2RlZmluZSBETUFfQ0hBTk5FTF8xCQkJCQkweDEKKyNkZWZpbmUgRE1BX0NIQU5ORUxfMgkJCQkJMHgyCisjZGVmaW5lIERNQV9DSEFOTkVMXzMJCQkJCTB4MworI2RlZmluZSBETUFfQ0hBTk5FTF80CQkJCQkweDQKKyNkZWZpbmUgRE1BX0NIQU5ORUxfNQkJCQkJMHg1CisjZGVmaW5lIERNQV9DSEFOTkVMXzYJCQkJCTB4NgorI2RlZmluZSBETUFfQ0hBTk5FTF83CQkJCQkweDcKKworLyogRE1BIENoYW5uZWwgbWFzayAqLworI2RlZmluZSBETUFfQ0hBTk5FTF8wX01BU0sJCQkJMHgwMDAwMDAwMQorI2RlZmluZSBETUFfQ0hBTk5FTF8xX01BU0sJCQkJMHgwMDAwMDAwMgorI2RlZmluZSBETUFfQ0hBTk5FTF8yX01BU0sJCQkJMHgwMDAwMDAwNAorI2RlZmluZSBETUFfQ0hBTk5FTF8zX01BU0sJCQkJMHgwMDAwMDAwOAorI2RlZmluZSBETUFfQ0hBTk5FTF80X01BU0sJCQkJMHgwMDAwMDAxMAorI2RlZmluZSBETUFfQ0hBTk5FTF81X01BU0sJCQkJMHgwMDAwMDAyMAorI2RlZmluZSBETUFfQ0hBTk5FTF82X01BU0sJCQkJMHgwMDAwMDA0MAorI2RlZmluZSBETUFfQ0hBTk5FTF83X01BU0sJCQkJMHgwMDAwMDA4MAorCisjZGVmaW5lIERNQV9HTE9CQUxfRU5BQkxFCQkJCTB4MQorI2RlZmluZSBETUFfUkVHX1dFX1NISUZUCQkJCTB4OAorCisKKyNkZWZpbmUgRE1BX0NIQU5ORUxfUkVHX1NBUl9CQVNFCQlEV19ETUFfRE1BQ19TQVIwCisjZGVmaW5lIERNQV9DSEFOTkVMX1JFR19EQVJfQkFTRQkJRFdfRE1BX0RNQUNfREFSMAorI2RlZmluZSBETUFfQ0hBTk5FTF9SRUdfTExQX0JBU0UJCURXX0RNQV9ETUFDX0xMUDAKKyNkZWZpbmUgRE1BX0NIQU5ORUxfUkVHX0NUTF9CQVNFCQlEV19ETUFfRE1BQ19DVEwwCisjZGVmaW5lIERNQV9DSEFOTkVMX1JFR19TU1RBVF9CQVNFCQlEV19ETUFfRE1BQ19TU1RBVDAKKyNkZWZpbmUgRE1BX0NIQU5ORUxfUkVHX0RTVEFUX0JBU0UJCURXX0RNQV9ETUFDX0RTVEFUMAorI2RlZmluZSBETUFfQ0hBTk5FTF9SRUdfU1NUQVRBUl9CQVNFCURXX0RNQV9ETUFDX1NTVEFUQVIwCisjZGVmaW5lIERNQV9DSEFOTkVMX1JFR19EU1RBVEFSX0JBU0UJRFdfRE1BX0RNQUNfRFNUQVRBUjAKKyNkZWZpbmUgRE1BX0NIQU5ORUxfUkVHX0NGR19CQVNFCQlEV19ETUFfRE1BQ19DRkcwCisjZGVmaW5lIERNQV9DSEFOTkVMX1JFR19TR1JfQkFTRQkJRFdfRE1BX0RNQUNfU0dSMAorI2RlZmluZSBETUFfQ0hBTk5FTF9SRUdfRFNSX0JBU0UJCURXX0RNQV9ETUFDX0RTUjAKKworCisjZGVmaW5lIERNQV9DSEFOTkVMX1JFR19DT1VOVAkJCTExCisjZGVmaW5lIERNQV9DSEFOTkVMX1JFR19TSVpFCQkJOAorCisKKy8qIERNQSBDb250cm9sIFJlZ2lzdGVyIGZvciBDaGFubmVsIFswLTMxXSAqLworCisvKiAKKyAqIFNpbmdsZS1ibG9jayBUcmFuc2ZlciAtLSB3aXRob3V0IHdyaXRlLWJhY2sgCisgKiBvZiBjb250cm9sIGFuZCBzdGF0dXMgaW5mb3JtYXRpb24gZW5hYmxlZCBhdCAKKyAqIHRoZSBlbmQgb2YgdGhlIHNpbmdsZS1ibG9jayB0cmFuc2ZlcgorICovCisgCisjZGVmaW5lIERNQV9DVExfSU5UX0VOCQkJCQkweDEKKyNkZWZpbmUgRE1BX0NUTF9JTlRfRU5fTUFTSwkJCQkweDEKKyNkZWZpbmUgRE1BX0NUTF9JTlRfRU5fU0hJRlQJCQkwCisKKyNkZWZpbmUgRE1BX0NUTF9EU1RfVFJfV0lEVEgJCQkweDAgCQkvKiA4IGJpdCAqLworI2RlZmluZSBETUFfQ1RMX0RTVF9UUl9XSURUSF9NQVNLCQkweDcKKyNkZWZpbmUgRE1BX0NUTF9EU1RfVFJfV0lEVEhfU0hJRlQJCTEKKworI2RlZmluZSBETUFfQ1RMX1NSQ19UUl9XSURUSAkJCTB4MCAJCS8qIDggYml0ICovCisjZGVmaW5lIERNQV9DVExfU1JDX1RSX1dJRFRIX01BU0sJCTB4NworI2RlZmluZSBETUFfQ1RMX1NSQ19UUl9XSURUSF9TSElGVAkJNAorCisjZGVmaW5lIERNQV9DVExfRElOQwkJCQkJMHgwIAkJLyogSW5jcmltZW50ICovCisjZGVmaW5lIERNQV9DVExfRElOQ19NQVNLCQkJCTB4MworI2RlZmluZSBETUFfQ1RMX0RJTkNfU0hJRlQJCQkJNworCisjZGVmaW5lIERNQV9DVExfU0lOQwkJCQkJMHgyIAkJLyogTm8gQ2hhbmdlICovCisjZGVmaW5lIERNQV9DVExfU0lOQ19NQVNLCQkJCTB4MworI2RlZmluZSBETUFfQ1RMX1NJTkNfU0hJRlQJCQkJOQorCisjZGVmaW5lIERNQV9DVExfREVTVF9NU0laRQkJCQkweDMgLy8weDEgCQkvKiBOdW1iZXIgb2YgZGF0YSBpdGVtcyB0byBiZSB0cmFuc2ZlcnJlZCA9IDQgKi8KKyNkZWZpbmUgRE1BX0NUTF9ERVNUX01TSVpFX01BU0sJCQkweDcKKyNkZWZpbmUgRE1BX0NUTF9ERVNUX01TSVpFX1NISUZUCQkxMQorCisjZGVmaW5lIERNQV9DVExfU1JDX01TSVpFCQkJCTB4MyAvLzB4MQkJCS8qIE51bWJlciBvZiBkYXRhIGl0ZW1zIHRvIGJlIHRyYW5zZmVycmVkID0gNCAqLworI2RlZmluZSBETUFfQ1RMX1NSQ19NU0laRV9NQVNLCQkJMHg3CisjZGVmaW5lIERNQV9DVExfU1JDX01TSVpFX1NISUZUCQkJMTQKKworI2RlZmluZSBETUFfQ1RMX1NSQ19HQVRIRVJfRU4JCQkweDAJCQkvKiBEaXNhYmxlZCAqLworI2RlZmluZSBETUFfQ1RMX1NSQ19HQVRIRVJfRU5fTUFTSwkJMHgxCisjZGVmaW5lIERNQV9DVExfU1JDX0dBVEhFUl9FTl9TSElGVAkJMTcKKworI2RlZmluZSBETUFfQ1RMX0RTVF9TQ0FUVEVSX0VOCQkJMHgwCQkJLyogRGlzYWJsZWQgKi8KKyNkZWZpbmUgRE1BX0NUTF9EU1RfU0NBVFRFUl9FTl9NQVNLCQkweDEKKyNkZWZpbmUgRE1BX0NUTF9EU1RfU0NBVFRFUl9FTl9TSElGVAkxOAorCisjZGVmaW5lIERNQV9DVExfVFRfRkMJCQkJCTB4MgkJCS8qIFBlcmlwaGVyYWwgdG8gTWVtb3J5LCBGbG93IENvbnRyb2xsZXIgLS0gRFdfYWhiX2RtYWMgKi8KKyNkZWZpbmUgRE1BX0NUTF9UVF9GQ19NQVNLCQkJCTB4NworI2RlZmluZSBETUFfQ1RMX1RUX0ZDX1NISUZUCQkJCTIwCisKKyNkZWZpbmUgRE1BX0NUTF9ETVMJCQkJCQkweDAJCQkvKiA/Pz8/Pz8gQUhCIG1hc3RlciAxICovCisjZGVmaW5lIERNQV9DVExfRE1TX01BU0sJCQkJMHgzCisjZGVmaW5lIERNQV9DVExfRE1TX1NISUZUCQkJCTIzCisKKyNkZWZpbmUgRE1BX0NUTF9TTVMJCQkJCQkweDEJCQkvKiA/Pz8/Pz8gQUhCIG1hc3RlciAyICovCisjZGVmaW5lIERNQV9DVExfU01TX01BU0sJCQkJMHgzCisjZGVmaW5lIERNQV9DVExfU01TX1NISUZUCQkJCTI1CisKKyNkZWZpbmUgRE1BX0NUTF9MTFBfRFNUX0VOCQkJCTB4MAorI2RlZmluZSBETUFfQ1RMX0xMUF9EU1RfRU5fTUFTSwkJCTB4MQorI2RlZmluZSBETUFfQ1RMX0xMUF9EU1RfRU5fU0hJRlQJCTI3CisKKyNkZWZpbmUgRE1BX0NUTF9MTFBfU1JDX0VOCQkJCTB4MAorI2RlZmluZSBETUFfQ1RMX0xMUF9TUkNfRU5fTUFTSwkJCTB4MQorI2RlZmluZSBETUFfQ1RMX0xMUF9TUkNfRU5fU0hJRlQJCTI4CisKKworLyogRE1BIENvbnRyb2wgUmVnaXN0ZXIgZm9yIENoYW5uZWwgWzMyLTYzXSAqLworLyogCisgKiBTaW5nbGUtYmxvY2sgVHJhbnNmZXIgLS0gd2l0aG91dCB3cml0ZS1iYWNrIAorICogb2YgY29udHJvbCBhbmQgc3RhdHVzIGluZm9ybWF0aW9uIGVuYWJsZWQgYXQgCisgKiB0aGUgZW5kIG9mIHRoZSBzaW5nbGUtYmxvY2sgdHJhbnNmZXIKKyAqLworCisvKiBETUFfQ1RMX0JMT0NLX1RTCisgKiBXaGVuIHRoZSBEV19haGJfZG1hYyBpcyB0aGUgZmxvdyBjb250cm9sbGVyLCB0aGUgdXNlciB3cml0ZXMgdGhpcworICogZmllbGQgYmVmb3JlIHRoZSBjaGFubmVsIGlzIGVuYWJsZWQgaW4gb3JkZXIgdG8gaW5kaWNhdGUgdGhlIGJsb2NrIHNpemUuCisgKgorICogVGhlIG51bWJlciBwcm9ncmFtbWVkIGludG8gQkxPQ0tfVFMgaW5kaWNhdGVzIHRoZSB0b3RhbCBudW1iZXIKKyAqIG9mIHNpbmdsZSB0cmFuc2FjdGlvbnMgdG8gcGVyZm9ybSBmb3IgZXZlcnkgYmxvY2sgdHJhbnNmZXIuCisgKgorICogVGhlIHdpZHRoIG9mIHRoZSBzaW5nbGUgdHJhbnNhY3Rpb24gaXMgZGV0ZXJtaW5lZCBieQorICogRE1BX0NUTF9TUkNfVFJfV0lEVEguCisgKi8KKyNkZWZpbmUgRE1BX0NUTF9CTE9DS19UUwkJCQlTUElfTkRGIAorI2RlZmluZSBETUFfQ1RMX0JMT0NLX1RTX01BU0sJCQkwWEZGRgorI2RlZmluZSBETUFfQ1RMX0JMT0NLX1RTX1NISUZUCQkJMAorCisjZGVmaW5lIERNQV9DVExfRE9ORQkJCQkJMHgwCisjZGVmaW5lIERNQV9DVExfRE9ORV9NQVNLCQkJCTB4MQorI2RlZmluZSBETUFfQ1RMX0RPTkVfU0hJRlQJCQkJMTIKKworCisKKy8qIERNQSBDb25maWcgUmVnaXN0ZXIgZm9yIENoYW5uZWwgWzAtMzFdICovCisvKiAKKyAqIFNpbmdsZS1ibG9jayBUcmFuc2ZlciAtLSB3aXRob3V0IHdyaXRlLWJhY2sgCisgKiBvZiBjb250cm9sIGFuZCBzdGF0dXMgaW5mb3JtYXRpb24gZW5hYmxlZCBhdCAKKyAqIHRoZSBlbmQgb2YgdGhlIHNpbmdsZS1ibG9jayB0cmFuc2ZlcgorICovCisKKyNkZWZpbmUgRE1BX0NGR19SRUxPQURfRFNUCQkJCTB4MAkJCS8qIERpc2FibGVkIC0tIE5vIE11bHRpIEJsb2NrIHhmZXIgKi8KKyNkZWZpbmUgRE1BX0NGR19SRUxPQURfRFNUX01BU0sJCQkweDEKKyNkZWZpbmUgRE1BX0NGR19SRUxPQURfRFNUX1NISUZUCQkzMQorCisjZGVmaW5lIERNQV9DRkdfUkVMT0FEX1NSQwkJCQkweDAJCQkvKiBEaXNhYmxlZCAtLSBObyBNdWx0aSBCbG9jayB4ZmVyICovCisjZGVmaW5lIERNQV9DRkdfUkVMT0FEX1NSQ19NQVNLCQkJMHgxCisjZGVmaW5lIERNQV9DRkdfUkVMT0FEX1NSQ19TSElGVAkJMzAKKworI2RlZmluZSBETUFfQ0ZHX01BWF9BQlJTVAkJCQkweDAJCQkvKiBtYXggQU1CQSBidXJzdCBsZW5ndGggLS0gbm90IGxpbWl0ZWQgYnkgc29mdHdhcmUgICovCisjZGVmaW5lIERNQV9DRkdfTUFYX0FCUlNUX01BU0sJCQkweDNGRgorI2RlZmluZSBETUFfQ0ZHX01BWF9BQlJTVF9TSElGVAkJCTIwCisKKyNkZWZpbmUgRE1BX0NGR19TUkNfSFNfUE9MCQkJCTB4MAkJCS8qIEFjdGl2ZSBoaWdoICovCisjZGVmaW5lIERNQV9DRkdfU1JDX0hTX1BPTF9NQVNLCQkJMHgxCisjZGVmaW5lIERNQV9DRkdfU1JDX0hTX1BPTF9TSElGVAkJMTkKKworI2RlZmluZSBETUFfQ0ZHX0RTVF9IU19QT0wJCQkJMHgwCQkJLyogQWN0aXZlIGhpZ2ggKi8KKyNkZWZpbmUgRE1BX0NGR19EU1RfSFNfUE9MX01BU0sJCQkweDEKKyNkZWZpbmUgRE1BX0NGR19EU1RfSFNfUE9MX1NISUZUCQkxOAorCisjZGVmaW5lIERNQV9DRkdfTE9DS19CCQkJCQkweDAJCQkvKiBObyBMb2NrZWQgRE1BIFRyYW5zZmVycyAqLworI2RlZmluZSBETUFfQ0ZHX0xPQ0tfQl9NQVNLCQkJCTB4MQorI2RlZmluZSBETUFfQ0ZHX0xPQ0tfQl9TSElGVAkJCTE3CisKKyNkZWZpbmUgRE1BX0NGR19MT0NLX0NICQkJCQkweDAJCQkvKiBObyBleGNsdXNpdmUgQWNjZXNzIHRvIHRoZSBjaGFubmVsICovCisjZGVmaW5lIERNQV9DRkdfTE9DS19DSF9NQVNLCQkJMHgxCisjZGVmaW5lIERNQV9DRkdfTE9DS19DSF9TSElGVAkJCTE2CisKKyNkZWZpbmUgRE1BX0NGR19MT0NLX0JfTAkJCQkweDAKKyNkZWZpbmUgRE1BX0NGR19MT0NLX0JfTF9NQVNLCQkJMHgzCisjZGVmaW5lIERNQV9DRkdfTE9DS19CX0xfU0hJRlQJCQkxNAorCisjZGVmaW5lIERNQV9DRkdfTE9DS19DSF9MCQkJCTB4MAorI2RlZmluZSBETUFfQ0ZHX0xPQ0tfQ0hfTF9NQVNLCQkJMHgzCisjZGVmaW5lIERNQV9DRkdfTE9DS19DSF9MX1NISUZUCQkJMTIKKworI2RlZmluZSBETUFfQ0ZHX0hTX1NFTF9TUkMJCQkJMHgwIAkJLyogSGFyZHdhcmUgaGFuZHNoYWtpbmcgKi8KKyNkZWZpbmUgRE1BX0NGR19IU19TRUxfU1JDX01BU0sJCQkweDEKKyNkZWZpbmUgRE1BX0NGR19IU19TRUxfU1JDX1NISUZUCQkxMQorCisjZGVmaW5lIERNQV9DRkdfSFNfU0VMX0RTVAkJCQkweDEgCQkvKiBTL3cgaGFuZHNoYWtpbmcgKi8KKyNkZWZpbmUgRE1BX0NGR19IU19TRUxfRFNUX01BU0sJCQkweDEKKyNkZWZpbmUgRE1BX0NGR19IU19TRUxfRFNUX1NISUZUCQkxMAorCisjZGVmaW5lIERNQV9DRkdfRklGT19FTVBUWQkJCQkweDEJCQkvKiBDaGFubmVsIEZJRk8gZW1wdHkgKi8KKyNkZWZpbmUgRE1BX0NGR19GSUZPX0VNUFRZX01BU0sJCQkweDEKKyNkZWZpbmUgRE1BX0NGR19GSUZPX0VNUFRZX1NISUZUCQk5CisKKyNkZWZpbmUgRE1BX0NGR19DSF9TVVNQCQkJCQkweDAJCQkvKiBOb3Qgc3VzcGVuZGVkICovCisjZGVmaW5lIERNQV9DRkdfQ0hfU1VTUF9NQVNLCQkJMHgxCisjZGVmaW5lIERNQV9DRkdfQ0hfU1VTUF9TSElGVAkJCTgKKworI2RlZmluZSBETUFfQ0ZHX0NIX1BSSU9SCQkJCTB4MAkJCS8qIFNob3VsZCBiZSBrZXB0IGVxdWFsIHRvIGNoYW5uZWwgbm8gKi8KKyNkZWZpbmUgRE1BX0NGR19DSF9QUklPUl9NQVNLCQkJMHg3CisjZGVmaW5lIERNQV9DRkdfQ0hfUFJJT1JfU0hJRlQJCQk1CisKKworLyogRE1BIENvbmZpZyBSZWdpc3RlciBmb3IgQ2hhbm5lbCBbMzItNjNdICovCisvKiAKKyAqIFNpbmdsZS1ibG9jayBUcmFuc2ZlciAtLSB3aXRob3V0IHdyaXRlLWJhY2sgCisgKiBvZiBjb250cm9sIGFuZCBzdGF0dXMgaW5mb3JtYXRpb24gZW5hYmxlZCBhdCAKKyAqIHRoZSBlbmQgb2YgdGhlIHNpbmdsZS1ibG9jayB0cmFuc2ZlcgorICovCisKKyNkZWZpbmUgRE1BX0NGR19ERVNUX1BFUgkJCQkweDAKKyNkZWZpbmUgRE1BX0NGR19ERVNUX1BFUl9NQVNLCQkJMHhGCisjZGVmaW5lIERNQV9DRkdfREVTVF9QRVJfU0hJRlQJCQkxMQorCisjZGVmaW5lIERNQV9DRkdfU1JDX1BFUgkJCQkJMHg0CisjZGVmaW5lIERNQV9DRkdfU1JDX1BFUl9NQVNLCQkJMHhGCisjZGVmaW5lIERNQV9DRkdfU1JDX1BFUl9TSElGVAkJCTcKKworI2RlZmluZSBETUFfQ0ZHX1NTX1VQRF9FTgkJCQkweDAJCQkvKiBEaXNhYmxlZCAqLworI2RlZmluZSBETUFfQ0ZHX1NTX1VQRF9FTl9NQVNLCQkJMHgxCisjZGVmaW5lIERNQV9DRkdfU1NfVVBEX0VOX1NISUZUCQkJNgorCisjZGVmaW5lIERNQV9DRkdfRFNfVVBEX0VOCQkJCTB4MAkJCS8qIERpc2FibGVkICovCisjZGVmaW5lIERNQV9DRkdfRFNfVVBEX0VOX01BU0sJCQkweDEKKyNkZWZpbmUgRE1BX0NGR19EU19VUERfRU5fU0hJRlQJCQk1CisKKyNkZWZpbmUgRE1BX0NGR19QUk9UQ1RMCQkJCQkweDEKKyNkZWZpbmUgRE1BX0NGR19QUk9UQ1RMX01BU0sJCQkweDcKKyNkZWZpbmUgRE1BX0NGR19QUk9UQ1RMX1NISUZUCQkJMgorCisjZGVmaW5lIERNQV9DRkdfRklGT19NT0RFCQkJCTB4MAkJCS8qIFNpbmdsZSBBSEIgU3BhY2Ugb2YgdGhlIHNwZWNpZmllZCB0cmFuc2ZlciB3aWR0aCAqLworI2RlZmluZSBETUFfQ0ZHX0ZJRk9fTU9ERV9NQVNLCQkJMHgxCisjZGVmaW5lIERNQV9DRkdfRklGT19NT0RFX1NISUZUCQkJMQorCisjZGVmaW5lIERNQV9DRkdfRkNNT0RFCQkJCQkweDAKKyNkZWZpbmUgRE1BX0NGR19GQ01PREVfTUFTSwkJCQkweDEKKyNkZWZpbmUgRE1BX0NGR19GQ01PREVfU0hJRlQJCQkwCisKKyNkZWZpbmUgRE1BX1hGRVJfRExFTgkJCQkJMTYKKworI2VuZGlmIC8qIF9BU01fQVJDSF9ETUFfSCAqLworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9lY2MuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2VjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MmE2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9lY2MuaApAQCAtMCwwICsxLDEyNiBAQAorI2lmbmRlZiBfRUNDX0gKKyNkZWZpbmUgX0VDQ19ICisKKy8qIEVDQyBSZWdpc3RlciBTZXQgKi8KKy8qKioqKioqKioqKioqKioqKioqKi8KKy8qIEVDQyBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBFQ0NfU0hJRlRfRU5fQ0ZHCSgweDApCisjZGVmaW5lIEVDQ19HRU5fQ0ZHCQkoMHg0KQorI2RlZmluZSBFQ0NfVEFHX0NGRwkJKDB4OCkKKyNkZWZpbmUgRUNDX0lOSVRfQ0ZHCQkoMHhDKQorI2RlZmluZSBFQ0NfUFJUWV9PVVRfU0VMX0NGRwkoMHgxMCkKKyNkZWZpbmUgRUNDX1BPTFlfU1RBUlRfQ0ZHCSgweDE0KQorI2RlZmluZSBFQ0NfQ1NfU0VMX0NGRwkJKDB4MTgpCisvKiBFQ0MgU3RhdHVzIFJlZ2lzdGVycyAqLworI2RlZmluZSBFQ0NfSURMRV9TVEFUCQkoMHgxQykKKyNkZWZpbmUgRUNDX1BPTFlfU1RBVAkJKDB4MjApCisjZGVmaW5lIEVDQ19DT1JSX1NUQVQJCSgweDI0KQorI2RlZmluZSBFQ0NfQ09SUl9ET05FX1NUQVQJKDB4MjgpCisjZGVmaW5lIEVDQ19DT1JSX0RBVEFfU1RBVAkoMHgyQykKKworI2lmIDAKKyNkZWZpbmUgRUNDX1NISUZUX0VOX0NGRwkoQ09NQ0VSVE9fQVhJX0VYUF9FQ0NfQkFTRSkKKyNkZWZpbmUgRUNDX0dFTl9DRkcJCShDT01DRVJUT19BWElfRVhQX0VDQ19CQVNFICsgMHg0KQorI2RlZmluZSBFQ0NfVEFHX0NGRwkJKENPTUNFUlRPX0FYSV9FWFBfRUNDX0JBU0UgKyAweDgpCisjZGVmaW5lIEVDQ19JTklUX0NGRwkJKENPTUNFUlRPX0FYSV9FWFBfRUNDX0JBU0UgKyAweEMpCisjZGVmaW5lIEVDQ19QUlRZX09VVF9TRUxfQ0ZHCShDT01DRVJUT19BWElfRVhQX0VDQ19CQVNFICsgMHgxMCkKKyNkZWZpbmUgRUNDX1BPTFlfU1RBUlRfQ0ZHCShDT01DRVJUT19BWElfRVhQX0VDQ19CQVNFICsgMHgxNCkKKyNkZWZpbmUgRUNDX0NTX1NFTF9DRkcJCShDT01DRVJUT19BWElfRVhQX0VDQ19CQVNFICsgMHgxOCkKKy8qIEVDQyBTdGF0dXMgUmVnaXN0ZXJzICovCisjZGVmaW5lIEVDQ19JRExFX1NUQVQJCShDT01DRVJUT19BWElfRVhQX0VDQ19CQVNFICsgMHgxQykKKyNkZWZpbmUgRUNDX1BPTFlfU1RBVAkJKENPTUNFUlRPX0FYSV9FWFBfRUNDX0JBU0UgKyAweDIwKQorI2RlZmluZSBFQ0NfQ09SUl9TVEFUCQkoQ09NQ0VSVE9fQVhJX0VYUF9FQ0NfQkFTRSArIDB4MjQpCisjZGVmaW5lIEVDQ19DT1JSX0RPTkVfU1RBVAkoQ09NQ0VSVE9fQVhJX0VYUF9FQ0NfQkFTRSArIDB4MjgpCisjZGVmaW5lIEVDQ19DT1JSX0RBVEFfU1RBVAkoQ09NQ0VSVE9fQVhJX0VYUF9FQ0NfQkFTRSArIDB4MkMpCisjZW5kaWYKKworLyogRUNDIGdlbmVyYWwgY29uZmlndXJhdGlvbiByZWdpc3RlciBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhBTU1fTU9ERQlCSVRfMjhfTVNLCisjZGVmaW5lIEJDSF9NT0RFCSh+IEhBTU1fTU9ERSkKKworI2RlZmluZSBQUlRZX01PREVfTUFTSwlCSVRfMjRfTVNLCisjZGVmaW5lIFBSVFlfQ0FMQwlQUlRZX01PREVfTUFTSworI2RlZmluZSBTWU5EUk9NRV9DQUxDCSh+IFBSVFlfQ0FMQykKKworI2RlZmluZQlFQ0NfTFZMX01BU0sJMHgzRjAwMDAKKyNkZWZpbmUgRUNDX0xWTF9TSElGVAkxNgorCisjZGVmaW5lIEJMS19TSVpFX01BU0sgMHg3RkYKKworI2RlZmluZSBFQ0NfTFZMXzIgMHgyCisjZGVmaW5lIEVDQ19MVkxfNCAweDQKKyNkZWZpbmUgRUNDX0xWTF82IDB4NgorI2RlZmluZSBFQ0NfTFZMXzggMHg4CisjZGVmaW5lIEVDQ19MVkxfMTAgMHhBCisjZGVmaW5lIEVDQ19MVkxfMTIgMHhDCisjZGVmaW5lIEVDQ19MVkxfMTQgMHhFCisjZGVmaW5lIEVDQ19MVkxfMTYgMHgxMAorI2RlZmluZSBFQ0NfTFZMXzE4IDB4MTIKKyNkZWZpbmUgRUNDX0xWTF8yMCAweDE0CisjZGVmaW5lIEVDQ19MVkxfMjIgMHgxNgorI2RlZmluZSBFQ0NfTFZMXzI0IDB4MTgKKyNkZWZpbmUgRUNDX0xWTF8yNiAweDFBCisjZGVmaW5lIEVDQ19MVkxfMjggMHgxQworI2RlZmluZSBFQ0NfTFZMXzMwIDB4MUUKKyNkZWZpbmUgRUNDX0xWTF8zMiAweDIwCisKKyNpZiBkZWZpbmVkIChDT05GSUdfTkFORF9DT01DRVJUT19FQ0NfMjRfSFdfQkNIKQorCSNkZWZpbmUgRUNDX0xWTF9WQUwgRUNDX0xWTF8yNCAvKiBFQ0MgTGV2ZWwgMjQgaXMgdXNlZCAqLworI2VsaWYgZGVmaW5lZCAoQ09ORklHX05BTkRfQ09NQ0VSVE9fRUNDXzhfSFdfQkNIKQorCSNkZWZpbmUgRUNDX0xWTF9WQUwgRUNDX0xWTF84IC8qIEVDQyBMZXZlbCA4IGlzIHVzZWQgKi8KKyNlbmRpZgorIAorLyogQmxvY2sgc2l6ZSB1c2VkIGluIEJ5dGVzKi8KKyNkZWZpbmUgRUNDX0JMT0NLX1NJWkVfNTEyIDUxMgorI2RlZmluZSBFQ0NfQkxPQ0tfU0laRV8xMDI0IDEwMjQKKworLyogTWF4aW11bSB2YWx1ZSBvZiBFQ0MgQmxvY2sgc2l6ZSBpcyAyay0oMSsxNCpFQ0NfTFZMLzgpIEJ5dGVzICovCisjZGVmaW5lIEVDQ19CTE9DS19TSVpFCQlFQ0NfQkxPQ0tfU0laRV8xMDI0CisjZGVmaW5lIEVDQ19CTE9DS19TSVpFX1NISUZUCUVDQ19CTE9DS19TSVpFXzEwMjRfU0hJRlQKKworI2RlZmluZSBFQ0NfQ1M0X1NFTCAweDEwCisjZGVmaW5lIEVDQ19DUzNfU0VMIDB4MDgKKyNkZWZpbmUgRUNDX0NTMl9TRUwgMHgwNAorI2RlZmluZSBFQ0NfQ1MxX1NFTCAweDAyCisjZGVmaW5lIEVDQ19DUzBfU0VMIDB4MDEKKworI2RlZmluZSBFQ0NfSU5JVAkJMHgxCisjZGVmaW5lIEVDQ19TSElGVF9FTkFCTEUJMHgxCisjZGVmaW5lIEVDQ19TSElGVF9ESVNBQkxFCTB4MAorI2RlZmluZSBFQ0NfUEFSSVRZX09VVF9FTgkweDEKKyNkZWZpbmUgRUNDX1BBUklUWV9PVVRfRElTQUJMRQkweDAKKyNkZWZpbmUgRUNDX1VOQ09SUl9FUlJfSEFNTQkweDQKKworLyogUG9seW5vbWlhbCBTdGFydCBDb25maWd1cmF0aW9uIChFQ0NfUE9MWV9TVEFSVF9DRkcpICovCisjZGVmaW5lIEVDQ19QT0xZX1NUQVJUCQkoMSA8PCAwKQorCisvKiBJZGxlIFN0YXR1cyAoRUNDX0lETEVfU1RBVCkgKi8KKyNkZWZpbmUgRUNDX0lETEUJCSgxIDw8IDApCisKKy8qIFBvbHlub21pYWwgU3RhdHVzIChFQ0NfUE9MWV9TVEFUKSAqLworI2RlZmluZSBFQ0NfQ09SUl9SRVEJCSgxIDw8IDApCisjZGVmaW5lIEVDQ19FUkFTRURfUEFHRQkJKDEgPDwgMSkKKyNkZWZpbmUgRUNDX1VOQ09SUl9FUlJfSEFNTQkoMSA8PCAyKQorCisvKiBDb3JyZWN0aW9uIFN0YXR1cyAoRUNDX0NPUlJfU1RBVCkgKi8KKyNkZWZpbmUgRUNDX1RBR19NQVNLCQkweEZGRkYKKyNkZWZpbmUgRUNDX05VTV9FUlJfTUFTSwkweDNGCisjZGVmaW5lIEVDQ19OVU1fRVJSX1NISUZUCTE2CisjZGVmaW5lIEVDQ19VTkNPUlIJCSgxIDw8IDI0KQorCisvKiBDb3JyZWN0aW9uIERvbmUgU3RhdHVzIChFQ0NfQ09SUl9ET05FX1NUQVQpICovCisjZGVmaW5lIEVDQ19ET05FCQkoMSA8PCAwKQorCisvKiBDb3JyZWN0aW9uIERhdGEgU3RhdHVzIChFQ0NfQ09SUl9EQVRBX1NUQVQpLCBCQ0ggTW9kZSAqLworI2RlZmluZSBFQ0NfQkNIX01BU0sJCTB4RkZGRgorI2RlZmluZSBFQ0NfQkNIX0lOREVYX01BU0sJMHg3RkYKKyNkZWZpbmUgRUNDX0JDSF9JTkRFWF9TSElGVAkxNgorI2RlZmluZSBFQ0NfQkNIX1ZBTElECQkoMSA8PCAzMSkKKworLyogQ29ycmVjdGlvbiBEYXRhIFN0YXR1cyAoRUNDX0NPUlJfREFUQV9TVEFUKSwgSGFtbWluZyBNb2RlICovCisjZGVmaW5lIEVDQ19IQU1NX01BU0sJCTB4RgorI2RlZmluZSBFQ0NfSEFNTV9JTkRFWF9NQVNLCTB4MUZGCisjZGVmaW5lIEVDQ19IQU1NX0lOREVYX1NISUZUCTE2CisjZGVmaW5lIEVDQ19IQU1NX1ZBTElECQkoMSA8PCAzMSkKKworI2VuZGlmIC8qX0VDQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9lbnRyeS1tYWNyby5TIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzE4ZWZhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUwpAQCAtMCwwICsxLDI5IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvZW50cnktbWFjcm8uUworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2dpYy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9lbnRyeS1tYWNyby1naWMuUz4KKworCS5tYWNybwlkaXNhYmxlX2ZpcQorCS5lbmRtCisKKwkubWFjcm8gIGFyY2hfcmV0X3RvX3VzZXIsIHRtcDEsIHRtcDIKKwkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvZ3Bpby5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYmZlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9ncGlvLmgKQEAgLTAsMCArMSwyIEBACisKKyNpbmNsdWRlICJjb21jZXJ0by0yMDAwL2dwaW8uaCIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOTkxMTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAgYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAorI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKwkvKioqKiogRGV2aWNlICoqKioqLworCSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX004NlhYWCkKKwkJI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tMjAwMC5oPgorCSNlbHNlCisJCSNlcnJvciAibWFjaC9oYXJkd2FyZS5oIDogIFVua25vd24gYXJjaGl0ZWN0dXJlIiAKKwkjZW5kaWYKKwkKKworCS8qKioqKiBCb2FyZCAqKioqKi8KKwkjaWYgZGVmaW5lZChDT05GSUdfQzJLX0FTSUMpCisJCSNpbmNsdWRlIDxtYWNoL2JvYXJkLWMya2FzaWMuaD4KKwkjZWxpZiBkZWZpbmVkKENPTkZJR19DMktfRVZNKQorCQkjaW5jbHVkZSA8bWFjaC9ib2FyZC1jMmtldm0uaD4KKwkjZWxpZiBkZWZpbmVkKENPTkZJR19DMktfTUZDTl9FVk0pCisJCSNpbmNsdWRlIDxtYWNoL2JvYXJkLWMya21mY25ldm0uaD4KKwkjZWxpZiBkZWZpbmVkKENPTkZJR19SVFNNX0MySykKKwkJI2luY2x1ZGUgPG1hY2gvYm9hcmQtYzJrcnRzbS5oPgorCQorCSNlbHNlCisJCSNlcnJvciAibWFjaC9ib2FyZF9YWFguaCA6ICBVbmtub3duIGJvYXJkIgorCSNlbmRpZgorCisJI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tY29tbW9uLmg+CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvaTJjLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9pMmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWNlM2NkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvaTJjLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jb21jZXJ0by9pMmMuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0kyQ19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfSTJDX0gKKworCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NODZYWFgpCisJI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tMjAwMC9pMmMuaD4KKyNlbHNlCisJI2Vycm9yICJtYWNoL2NvbWNlcnRvLTIwMDAvaTJjLmggOiAgVW5rbm93biBhcmNoaXRlY3R1cmUiIAorI2VuZGlmCisKKyNlbmRpZiAgLyogX19BU01fQVJDSF9JMkNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvaW8uaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlN2RjNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jb21jZXJ0by9pby5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA4IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpZm5kZWYgX19BU01fQVJDSF9JT19ICisjZGVmaW5lIF9fQVNNX0FSQ0hfSU9fSAorCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX004NlhYWCkKKwkjaW5jbHVkZSA8bWFjaC9jb21jZXJ0by0yMDAwL2lvLmg+CisjZWxzZQorCSNlcnJvciAiVW5zdXBwb3J0ZWQgQ1BVIgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FTTV9BUkNIX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2lycXMuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL2lycXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTRlZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvaXJxcy5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiAgYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvaXJxcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX0lSUVNfSAorI2RlZmluZSBfX0FTTV9BUkNIX0lSUVNfSAorCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NODZYWFgpCisJI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tMjAwMC9pcnFzLmg+CisjZWxzZQorCSNlcnJvciAiVW5zdXBwb3J0ZWQgQ1BVIgorI2VuZGlmCisKKyNlbmRpZiAgLyogX19BU01fQVJDSF9JUlFTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL21lbW9yeS5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvbWVtb3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIyNjVhNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL21lbW9yeS5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvbWVtb3J5LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX01FTU9SWV9ICisjZGVmaW5lIF9fQVNNX0FSQ0hfTUVNT1JZX0gKKworCSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKwkjZGVmaW5lIFBMQVRfUEhZU19PRkZTRVQJCUNPTUNFUlRPX0FYSV9ERFJfQkFTRQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL21zcF9pb2N0bC5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvbXNwX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyMzFmZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL21zcF9pb2N0bC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiAgYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvbXNwX2lvY3RsLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9NU1BfSU9DVExfSAorI2RlZmluZSBfTVNQX0lPQ1RMX0gKKworc3RydWN0IE1TUF9JT0NUTF9JTUFHRQoreworCXZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGxlbjsKK307CisKK3N0cnVjdCBNU1BfSU9DVExfTUVNX0RVTVAKK3sKKwl2b2lkICpidWY7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCXVuc2lnbmVkIGxvbmcgbGVuOworfTsKKworI2lmZGVmIF9fS0VSTkVMX18KK2ludCBtc3BfaW9jdGxfZnJvbV9jc3AodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisvKiBPbmx5IHZhbGlkIHdoZW4gY2FsbGVkIGZyb20gdGhlIENTUCAqLworI2RlZmluZSBNU1BfSU9DVExfUkVTRVRfTVNQX0xPQURfRlJPTV9LRVJORUxCVUYJCV9JT1IoTVNQX0lPQ19UWVBFLCA1LCBzdHJ1Y3QgTVNQX0lPQ1RMX0lNQUdFKQorI2RlZmluZSBNU1BfSU9DVExfUkVTRVRfTVNQX0RVTVBfVE9fS0VSTkVMQlVGCQlfSU9XUihNU1BfSU9DX1RZUEUsIDYsIHN0cnVjdCBNU1BfSU9DVExfSU1BR0UpCisKKyNlbmRpZgorCisjZGVmaW5lIE1TUF9JT0NfVFlQRQkJCQkJJ20nCisjZGVmaW5lIE1TUF9JT0NUTF9ESVNQTEFZX01TUF9GUk9NX05PUkZMQVNICQlfSU8oTVNQX0lPQ19UWVBFLCAxKQorI2RlZmluZSBNU1BfSU9DVExfUkVTRVRfTVNQX0xPQURfRlJPTV9OT1JGTEFTSAkJX0lPKE1TUF9JT0NfVFlQRSwgMikKKyNkZWZpbmUgTVNQX0lPQ1RMX1JFU0VUX01TUF9MT0FEX0ZST01fQlVGCQlfSU9SKE1TUF9JT0NfVFlQRSwgMywgc3RydWN0IE1TUF9JT0NUTF9JTUFHRSkKKyNkZWZpbmUgTVNQX0lPQ1RMX1JFU0VUX01TUF9EVU1QX1RPX0JVRgkJCV9JT1IoTVNQX0lPQ19UWVBFLCA0LCBzdHJ1Y3QgTVNQX0lPQ1RMX01FTV9EVU1QKQorCisjZGVmaW5lIE1TUF9ERVZJQ0VfTkFNRQkJIi9kZXYvbXNwIgorCisjZGVmaW5lIE1TUF9ERVZJQ0VfTUFKT1JfTlVNCTIzNyAgICAgICAgIC8qIHRoaXMgY291bGQgYmUgd2hhdGV2ZXIgeW91IHdhbnQsIGFzIGxvbmcgYXMgaXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCBvdGhlciBtb2R1bGVzICovCisKKyNlbmRpZiAvKiBfTVNQX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3BjaWUtYzIwMDAuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3BjaWUtYzIwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTEwZDRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvcGNpZS1jMjAwMC5oCkBAIC0wLDAgKzEsOTcgQEAKKworLyoKKyAqIGxpbnV4L2FyY2gvYXJtL21hY2gtY29tY2VydG8vcGNpZS1jb21jZXJ0bzIwMDAuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworCisjaWZuZGVmIF9fUENJRV9DMjAwMF9fCisjZGVmaW5lIF9fUENJRV9DMjAwMF9fCisKKyNkZWZpbmUgTlVNX1BDSUVfUE9SVFMJQ09ORklHX0NPTUNFUlRPX05VTV9QQ0lFUworI2RlZmluZSBNQVhfUENJRV9QT1JUUyAgMgorCitzdHJ1Y3QgcGNpZV9wb3J0IHsKKwl1OAkJCXBvcnQ7CisJdTgJCQlyb290X2J1c19ucjsKKwl1MTYJCQlyZXNldDsKKwl1bnNpZ25lZCBsb25nCQliYXNlOworCXVuc2lnbmVkIGxvbmcJCXJlbW90ZV9tZW1fYmFzZWFkZHI7CisJdW5zaWduZWQgbG9uZwkJYXBwX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqdmFfYXBwX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqdmFfZGJpX2Jhc2U7CisJdW5zaWduZWQgbG9uZwkJY2ZnMF9iYXNlOworCXZvaWQgX19pb21lbQkJKnZhX2NmZzBfYmFzZTsKKwl1bnNpZ25lZCBsb25nCQljZmcxX2Jhc2U7CisJdm9pZCBfX2lvbWVtCQkqdmFfY2ZnMV9iYXNlOworCXVuc2lnbmVkIGludAkJY2ZnMF9wcmV2X3RhZGRyOworCXVuc2lnbmVkIGludAkJY2ZnMV9wcmV2X3RhZGRyOworCXVuc2lnbmVkIGludAkJY21kX3JlZ192YWw7CisJc3BpbmxvY2tfdAkJY29uZl9sb2NrOworCXNwaW5sb2NrX3QJCWludHJfbG9jazsKKwlzcGlubG9ja190CQltc2lfbWFwX2xvY2s7CisJY2hhcgkJCW1lbV9zcGFjZV9uYW1lWzE2XTsKKwljaGFyCQkJaW9fc3BhY2VfbmFtZVsxNl07CisJaW50IAkJCXBvcnRfbW9kZTsKKwlpbnQgCQkJbGlua19zdGF0ZTsKKwlpbnQgCQkJaW50eF9iYXNlOworCWludAkJCW1zaV9iYXNlOworCWludAkJCWlycTsKKwlkbWFfYWRkcl90IAkJbXNpX21ib3hfaGFuZGxlOworCXZvaWQgCQkJKm1zaV9tYm94X2Jhc2VhZGRyOworCXN0cnVjdCBwY2llX2FwcF9yZWcJKmFwcF9yZWdzOworCXN0cnVjdCByZXNvdXJjZQkJcmVzWzJdOworCXN0cnVjdCBjbGsJCSpyZWZfY2xvY2s7CisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fUENJRV9PQ0NfQ0xPQ0spCisJc3RydWN0IGNsayAgICAgICAgICAgICAgKm9jY19jbG9jazsKKyNlbmRpZgorfTsKKworI2RlZmluZSBQQ0lFX1BPUlRfTU9ERV9OT05FIAktMQorI2RlZmluZSBQQ0lFX1BPUlRfTU9ERV9FUCAJQ0ZHMF9ERVZfVFlQRV9FUAorI2RlZmluZSBQQ0lFX1BPUlRfTU9ERV9SQyAJQ0ZHMF9ERVZfVFlQRV9SQworCisvKiBQQ0llIFBNIHJlbGF0ZWQgZGVmaW5lcyAqLworI2RlZmluZSBQQ0lfQ0FQX1BNIDB4NDAKKworCisvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIGRlZmluaXRpb25zIGFyZSBhcyBwZXIgIkRXQ19yZWdzX3JldjA0LmRvYyIgZG9jdW1lbnQgKi8KKworc3RydWN0IHBjaWVfYXBwX3JlZyB7CisJdTMyCWNmZzA7CisJdTMyCWNmZzE7CisJdTMyCWNmZzI7CisJdTMyCWNmZzM7CisJdTMyCWNmZzQ7CisJdTMyCWNmZzU7CisJdTMyCWNmZzY7CisJdTMyCXN0czA7CisJdTMyCXN0czE7CisJdTMyCXN0czI7CisJdTMyCXN0czM7CisJdTMyCXB3cl9jZmdfYmRndF9kYXRhOworCXUzMglwd3JfY2ZnX2JkZ3RfZm47CisJdTMyCXJhZG1fc3RzOworCXUzMglwd3Jfc3RzX2JkZ3Q7CisJdTMyCWludHJfc3RzOworCXUzMglpbnRyX2VuOworCXUzMglpbnRyX21zaV9zdHM7CisJdTMyCWludHJfbXNpX2VuOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9yZXNldC5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvcmVzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjA0NWVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvcmVzZXQuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9jb21jZXJ0by0yMDAwL3Jlc2V0LmgKKyAqCisgKiAgSGVhZGVyIGZpbGUgZm9yIGJsb2NrIHJlc2V0IGZvciBhbGwgdGhlIGRldmljZXMgYXZhaWxibGUgaW4gdGhlIAorICogIGMyMDAwIGRldmljZS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisjaWZuZGVmICBfX0FSQ0hfQ09NQ0VSVE8yMDAwX1JFU0VUX0gKKyNkZWZpbmUgIF9fQVJDSF9DT01DRVJUTzIwMDBfUkVTRVRfSAorCisjZGVmaW5lIFJUQ19BWElfUkVTRVRfQklUCQkoMTw8NykKKyNkZWZpbmUgSTJDU1BJX0FYSV9SRVNFVF9CSVQJCSgxPDw1KQorI2RlZmluZSBEVVNfQVhJX1JFU0VUX0JJVAkJKDE8PDApCisjZGVmaW5lIFRETV9BWElfUkVTRVRfQklUIAkJKDE8PDQpCQkKKyNkZWZpbmUgUEZFX1NZU19BWElfUkVTRVRfQklUCQkoMTw8MykKKyNkZWZpbmUgSVBTRUNfU1BBQ0NfQVhJX1JFU0VUX0JJVAkoMTw8MikKKyNkZWZpbmUgSVBTRUNfRUFQRV9BWElfUkVTRVRfQklUCSgxPDwxKQorI2RlZmluZSBEUElfQ0lFX0FYSV9SRVNFVF9CSVQJCSgxPDw1KQorI2RlZmluZSBEUElfREVDT01QX0FYSV9SRVNFVF9CSVQJKDE8PDYpCisjZGVmaW5lIFVTQjFfQVhJX1JFU0VUX0JJVAkJKDE8PDQpCisjZGVmaW5lIFVTQjFfUEhZX1JFU0VUX0JJVAkJKDE8PDQpCisjZGVmaW5lIFVTQjBfQVhJX1JFU0VUX0JJVAkJKDE8PDMpCisjZGVmaW5lIFVTQjBfUEhZX1JFU0VUX0JJVAkJKDE8PDApCisjZGVmaW5lIFNBVEFfQVhJX1JFU0VUX0JJVAkJKDE8PDIpCisjZGVmaW5lIFNBVEFfUE1VX1JFU0VUX0JJVAkJKDE8PDApCisjZGVmaW5lIFNBVEFfT09CX1JFU0VUX0JJVAkJKDE8PDApCisjZGVmaW5lIFBDSUUxX0FYSV9SRVNFVF9CSVQJCSgxPDwxKQorI2RlZmluZSBQQ0lFMF9BWElfUkVTRVRfQklUCQkoMTw8MCkKKyNkZWZpbmUgUEZFX0NPUkVfUkVTRVRfQklUCQkoMTw8MCkKKyNkZWZpbmUgSVBTRUNfRUFQRV9DT1JFX1JFU0VUX0JJVAkoMTw8MCkKKyNkZWZpbmUgR0VNVFhfUkVTRVRfQklUCQkJKDE8PDApCisjZGVmaW5lIEwyQ0NfUkVTRVRfQklUCQkJKDE8PDApCisjZGVmaW5lIERFQ1RfUkVTRVRfQklUCQkJKDE8PDApCisjZGVmaW5lIEREUl9DTlRSTF9SRVNFVF9CSVQJCSgxPDwxKQorI2RlZmluZSBERFJfUEhZX1JFU0VUX0JJVAkJKDE8PDApCisjZGVmaW5lIFNFUkRFUzBfUkVTRVRfQklUCQkoMTw8MCkKKyNkZWZpbmUgU0VSREVTMV9SRVNFVF9CSVQJCSgxPDwxKQorI2RlZmluZSBTRVJERVMyX1JFU0VUX0JJVAkJKDE8PDIpCisjZGVmaW5lIFNFUkRFU19QQ0lFMF9SRVNFVF9CSVQJCSgoMTw8MCl8KDE8PDEpKQorI2RlZmluZSBTRVJERVNfUENJRTFfUkVTRVRfQklUCQkoKDE8PDIpfCgxPDwzKSkKKyNkZWZpbmUgU0VSREVTX1NBVEEwX1JFU0VUX0JJVAkJKCgxPDw0KXwoMTw8NSkpCisjZGVmaW5lIFNFUkRFU19TQVRBMV9SRVNFVF9CSVQJCSgoMTw8Nil8KDE8PDcpKQorI2RlZmluZSBTR01JSV9SRVNFVF9CSVQJCQkoMTw8MCkKKyNkZWZpbmUgVVNCMF9VVE1JX1JFU0VUX0JJVAkJKDE8PDEpCisjZGVmaW5lIFVTQjFfVVRNSV9SRVNFVF9CSVQJCSgxPDw1KQorI2RlZmluZSBURE1OVEdfUkVTRVRfQklUCQkoMTw8MCkKKworLyogQzIwMDAgZGV2aWNlIGJsb2NrcyB3aGljaCBhcmUgdG8gYmUgcHV0IAorICogaW4gcmVzZXQuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQ09NUE9ORU5UX0FYSV9SVEM9MCwgICAgICAgICAgICAgCisJQ09NUE9ORU5UX0FYSV9MRUdBQ1lfU1BJLAkKKwlDT01QT05FTlRfQVhJX0kyQywgCQkJCisJQ09NUE9ORU5UX0FYSV9ETUEsIAorCUNPTVBPTkVOVF9BWElfRkFTVF9VQVJULCAKKwlDT01QT05FTlRfQVhJX0ZBU1RfU1BJLCAKKwlDT01QT05FTlRfQVhJX1RETSwgCisJQ09NUE9ORU5UX1BGRV9TWVMsCisJQ09NUE9ORU5UX0FYSV9JUFNFQ19FQVBFLAorCUNPTVBPTkVOVF9BWElfSVBTRUNfU1BBQ0MsCisJQ09NUE9ORU5UX0FYSV9EUElfQ0lFLAorCUNPTVBPTkVOVF9BWElfRFBJX0RFQ09NUCwKKwlDT01QT05FTlRfQVhJX1VTQjEgLAkJLyogVVNCIGNvbnRyb2xsZXIxLCBBWEkgQ2xvY2sgRG9tYWluIHJlc2V0IGNvbnRyb2wgKi8KKwlDT01QT05FTlRfVVRNSV9VU0IxLCAgCQkvKiBVU0IgY29udHJvbGxlcjEsVVRNSSBDbG9jayBEb21haW4gcmVzZXQgY29udHJvbCovCisJQ09NUE9ORU5UX1VTQjFfUEhZLAkJLyogVVNCIFBIWTEgUmVzZXQgY29udHJvbCAqLworCUNPTVBPTkVOVF9BWElfVVNCMCwJCS8qIFVTQiBjb250cm9sbGVyMCwgQVhJIENsb2NrIERvbWFpbiByZXNldCBjb250cm9sKi8KKwlDT01QT05FTlRfVVRNSV9VU0IwLCAgCQkvKiBVU0IgY29udHJvbGxlcjAuIFVUTUkgQ2xvY2sgRG9tYWluIHJlc2V0IGNvbnRyb2wgKi8KKwlDT01QT05FTlRfVVNCMF9QSFksCQkvKiBVU0IgUEhZMCBSZXNldCBDb250cm9sICovCisJQ09NUE9ORU5UX0FYSV9TQVRBLAkJLyogU0FUQSBjb250cm9sbGVyIEFYSSBDbG9jayBEb21haW4gQ29udHJvbCBCb3RoIGZvciBTQVRBIDAvMSovCisJQ09NUE9ORU5UX1NFUkRFU19TQVRBMCwJCS8qIFNBVEEgc2VyZGVzIENvbnRyb2xsZXIwICBUWCxDb3JlIExvZ2ljIGFuZCBSWCBjbG9jayBkb21haW4gY29udHJvbCovCisJQ09NUE9ORU5UX1NFUkRFU19TQVRBMSwJCS8qIFNBVEEgc2VyZGVzIENvbnRyb2xsZXIxICBUWCxDb3JlIExvZ2ljIGFuZCBSWCBjbG9jayBkb21haW4gY29udHJvbCovCisJQ09NUE9ORU5UX0FYSV9QQ0lFMSwJCS8qIFBDSUUgQ29udHJvbGxlcjEsQVhJIENsb2NrIERvbWFpbiByZXNldCBjb250cm9sKi8gCisJQ09NUE9ORU5UX1NFUkRFU19QQ0lFMSwJCS8qIFBDSUUgc2VyZGVzIENvbnRyb2xsZXIxICBTdHJpa3kgcmVnaXN0ZXIgYW5kIHBvd2VyIHJlZ2lzdGVyKi8KKwlDT01QT05FTlRfQVhJX1BDSUUwLAkJLyogUENJRSBDb250cm9sbGVyMCxBWEkgQ2xvY2sgRG9tYWluIHJlc2V0IGNvbnRyb2wqLworCUNPTVBPTkVOVF9TRVJERVNfUENJRTAsCQkvKiBQQ0lFIENvbnRyb2xsZXIxLFRYLENvcmUgTG9naWMgYW5kIFJYIGNsb2NrIGRvbWFpbiBjb250cm9sKi8KKwlDT01QT05FTlRfUEZFX0NPUkUsCisJQ09NUE9ORU5UX0lQU0VDX0VBUEVfQ09SRSwKKwlDT01QT05FTlRfR0VNVFgsCisJQ09NUE9ORU5UX0wyQ0MsCisJQ09NUE9ORU5UX0RFQ1QsCisJQ09NUE9ORU5UX0REUl9DTlRMUiwKKwlDT01QT05FTlRfRERSX1BIWSwKKwlDT01QT05FTlRfU0VSREVTMCwKKwlDT01QT05FTlRfU0VSREVTMSwKKwlDT01QT05FTlRfU0VSREVTMiwKKwlDT01QT05FTlRfU0dNSUksCisJQ09NUE9ORU5UX1NBVEFfUE1VLAorCUNPTVBPTkVOVF9TQVRBX09PQiwKKwlDT01QT05FTlRfVERNTlRHLAorfUMyMDAwX1JFU0VUX0NPTVBPTkVOVDsKKworZXh0ZXJuIHZvaWQgY29tY2VydG9fcnN0X2NudHJsX3NldCh1bnNpZ25lZCBpbnQgZGV2X3JzdF9jbnRybF9iaXQpOworZXh0ZXJuIHZvaWQgYzIwMDBfYmxvY2tfcmVzZXQoaW50IGJsb2NrLGludCBzdGF0ZSk7CitleHRlcm4gdm9pZCByZXNldF9pbml0KHZvaWQpOworCisjaWYgZGVmaW5lZChDT05GSUdfQzJLX01GQ05fRVZNKQorLyogQzIwMDAgZGV2aWNlIGJsb2NrcyB3aGljaCBhcmUgdG8gYmUgcHV0CisgKiBpbiBvdXQgb2YgcmVzZXQoR1BJTykuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJQ09NUE9ORU5UX0FUSEVST1NfU1dJVENIPTAsCisJQ09NUE9ORU5UX1NMSUMsCisJQ09NUE9ORU5UX1BDSUUwLAorCUNPTVBPTkVOVF9QQ0lFMSwKKwlDT01QT05FTlRfVVNCX0hVQiwKKwlDT01QT05FTlRfRVhQX0RBVUdUSEVSX0NBUkQsCisJQ09NUE9ORU5UX1JHTUlJMCwKKwlDT01QT05FTlRfUkdNSUkxCit9QzIwMDBfR0VOMl9HUElPX1JFU0VUX0NPTVBPTkVOVDsKKwordm9pZCBHUElPX3Jlc2V0X2V4dGVybmFsX2RldmljZShpbnQgYmxvY2ssaW50IHN0YXRlKTsKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9zZW1hLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9zZW1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlY2MxMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3NlbWEuaApAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqICBhcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9zZW1hLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0FTTV9BUkNIX1NFTUFfSF9fCisjZGVmaW5lIF9fQVNNX0FSQ0hfU0VNQV9IX18KKworI2lmZGVmIENPTkZJR19DT01DRVJUT19NU1AKKworI2RlZmluZSBDT01DRVJUT19TRU1BX0NPVU5UICg2NCkKKworZW51bSB7CisJQ09NQ0VSVE9fU0VNQV9NU1AsCit9OworCisvKiBnZXQgc3RhdHVzIGFuZCBkaXNhYmxlIEZJUSAmIElSUSAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGFyY2hfbG9jYWxfZnJxX3NhdmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYXNtIHZvbGF0aWxlICgKKwkJIm1ycyAlMCwgY3BzciBAIGFyY2hfbG9jYWxfZnJxX3NhdmVcbiIKKwkJImNwc2lkIGlmIgorCQk6ICI9ciIgKGZsYWdzKSA6IDogIm1lbW9yeSIsICJjYyIpOworCisJcmV0dXJuIGZsYWdzOworfQorCisjZGVmaW5lIGxvY2FsX2ZycV9zYXZlKCkgYXJjaF9sb2NhbF9mcnFfc2F2ZSgpCisjZGVmaW5lIGxvY2FsX2ZycV9yZXN0b3JlKGZsYWdzKSBsb2NhbF9pcnFfcmVzdG9yZShmbGFncykKKworLyoqCisgKiBjb21jZXJ0b19zZW1hX2xvY2soKQorICogU3BpbiB0byBsb2NrLiBBbHdheXMgc3VjY2VlZHMuCisgKgorICogSW4gb3JkZXIgdG8gYWNxdWlyZSB0aGUgc2VtYXBob3JlLCB0aGUgcHJvY2Vzc29yIG5lZWRzIHRvIHJlYWQgdGhlCisgKiBzZW1hcGhvcmUgdmFsdWUuIElmIHplcm8sIHRoZSBwcm9jZXNzb3IgYWNxdWlyZWQgdGhlIHNlbWFwaG9yZSBhbmQKKyAqIEhXIHdpbGwgc2V0IGl0IHRvIG9uZSwgdG8gbWFyayB0aGF0IHRoZSBzZW1hcGhvcmUgaXMgdGFrZW4sIGlmIG9uZQorICogaXMgcmVhZCwgdGhlIHNlbWFwaG9yZSBpcyBhbHJlYWR5IHRha2VuIGJ5IGFub3RoZXIgcHJvY2Vzc29yIGFuZAorICogdGhlIGN1cnJlbnQgcHJvY2Vzc29yIG5lZWRzIHRvIGtlZXAgcG9sbGluZyB0aGUgc2VtYXBob3JlIHVudGlsCisgKiB2YWx1ZSBvZiB6ZXJvIGlzIHJlY2VpdmVkLgorICoKKyAqIEMySyBoYXMgQ09NQ0VSVE9fU0VNQV9DT1VOVD02NCwgMS1iaXQgc2VtYXBob3Jlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNvbWNlcnRvX3NlbWFfbG9jayh2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGxvY2tfaWQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqcCA9ICh1bnNpZ25lZCBsb25nICopQ09NQ0VSVE9fU0VNQV9WQUREUjsKKwl1bnNpZ25lZCBsb25nIHg7CisKKwlpZiAobG9ja19pZCA+PSBDT01DRVJUT19TRU1BX0NPVU5UKSB7CisJCUJVRygpOworCX0KKworCXAgKz0gbG9ja19pZDsKKwl4ID0gKnA7CisKKwlpZiAoeCkgeworCQl3aGlsZSAoKnApIHsKKwkJCS8qIHdhaXQgZm9yIGxvY2sgKi8KKwkJCTsKKwkJfQorCX0KK30KKworLyoqCisgKiBjb21jZXJ0b19zZW1hX3VubG9jaygpCisgKiBVbmxvY2suIEFsd2F5cyBzdWNjZWVkcy4KKyAqCisgKiBBZnRlciBhY3F1aXJpbmcgYSBzZW1hcGhvcmUgdGhlIHByb2Nlc3NvciBuZWVkcyB0byB3cml0ZSB6ZXJvIHRvIGl0CisgKiBpbiBvcmRlciB0byByZWxlYXNlIGl0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29tY2VydG9fc2VtYV91bmxvY2sodm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb2NrX2lkKQoreworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnAgPSAodW5zaWduZWQgbG9uZyAqKUNPTUNFUlRPX1NFTUFfVkFERFI7CisKKwlpZiAobG9ja19pZCA+PSBDT01DRVJUT19TRU1BX0NPVU5UKSB7CisJCUJVRygpOworCX0KKworCXAgKz0gbG9ja19pZDsKKwkqcCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtc3BfbG9ja19mcnFzYXZlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZsYWdzID0gbG9jYWxfZnJxX3NhdmUoKTsKKwljb21jZXJ0b19zZW1hX2xvY2soQ09NQ0VSVE9fU0VNQV9NU1ApOworCisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNwX3VubG9ja19mcnFyZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJY29tY2VydG9fc2VtYV91bmxvY2soQ09NQ0VSVE9fU0VNQV9NU1ApOworCWxvY2FsX2ZycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2Vsc2UgIC8qICFDT05GSUdfQ09NQ0VSVE9fTVNQICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXNwX2xvY2tfZnJxc2F2ZSh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNwX3VubG9ja19mcnFyZXN0b3JlKHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuOworfQorI2VuZGlmIC8qIENPTkZJR19DT01DRVJUT19NU1AgKi8KKworI2VuZGlmICAvKiBfX0FTTV9BUkNIX1NFTUFfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9zZXJkZXMtYzIwMDAuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3NlcmRlcy1jMjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMWFmODYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9zZXJkZXMtYzIwMDAuaApAQCAtMCwwICsxLDE5OTMgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLiAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEBmaWxlIHNlcmRlcy5oCisgKiBAYnJpZWYgdGhpcyBoZWFkZXIgZmlsZSB3aWxsIGNvbnRhaW4gYWxsIHJlcXVpcmVkIGRhdGEgc3RydWN0dXJlCisgKiAgICAgICAgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zIGZvciBTbm93YnVzaCBTZXJEZXMgUEhZIGludGVyZmFjZS4KKyAqIEBkYXRlIDEwLzAyLzIwMTEKKyAqLworLyogU0VSLURFUyBBZGRyZXNzIHNwYWNlICovCisKKwordHlwZWRlZiBzdHJ1Y3Qgc2VyZGVzX3JlZ3NfcworeworICB1bnNpZ25lZCBzaG9ydCBvZnN0OworICB1bnNpZ25lZCBzaG9ydCB2YWw7Cit9c2VyZGVzX3JlZ3NfdDsKKworaW50IHNlcmRlc19waHlfaW5pdChpbnQgcGh5X251bSwgc3RydWN0IHNlcmRlc19yZWdzX3MgKnJlZ3MsIGludCBzaXplLCBpbnQgdHlwZSk7Cit2b2lkIHNlcmRlc19waHlfcmVzZXQoaW50IHBoeV9udW0pOworCisgLyogIEluaXRpYWxpemUgdmFsdWVzIG9mIHRoZSBTbm93YnVzaCBQSFkgKFNlcmRlczEpIGZvciBTQVRBMCAqLworCisvKiA0OE1IeiBpbnRlcm5hbCByZWYgY2xvY2sgY29uZmlndXJhdGlvbiAqLworc3RhdGljIHN0cnVjdCBzZXJkZXNfcmVnc19zIHNhdGFfcGh5X3JlZ19maWxlXzQ4W10gPQorICAgICAgICB7CisgICAgICAgICAgeyAweDAwMCA8PCAyLCAweDA2fSwKKyAgICAgICAgICB7IDB4MDAxIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMDIgPDwgMiwgMHg4OH0sCisgICAgICAgICAgeyAweDAwMyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDA0IDw8IDIsIDB4ODR9LAorICAgICAgICAgIHsgMHgwMDUgPDwgMiwgMHgxMH0sCisgICAgICAgICAgeyAweDAwNiA8PCAyLCAweDIwfSwKKyAgICAgICAgICB7IDB4MDA3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMDggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwOSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDBBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMEIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwQyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDBEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMEUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwRiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDEwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMTEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDEzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMTQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxNSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDE2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMTcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxOCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDE5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMUEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxQiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDFDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMUQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxRSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDFGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMjAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDIyIDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHgwMjMgPDwgMiwgMHg2Mn0sCisgICAgICAgICAgeyAweDAyNCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDI1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMjYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDI4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMjkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyQSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDJCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMkMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyRCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDJFIDw8IDIsIDB4MDR9LAorICAgICAgICAgIHsgMHgwMkYgPDwgMiwgMHg1MH0sCisgICAgICAgICAgeyAweDAzMCA8PCAyLCAweDcwfSwKKyAgICAgICAgICB7IDB4MDMxIDw8IDIsIDB4MDJ9LAorICAgICAgICAgIHsgMHgwMzIgPDwgMiwgMHgyNX0sCisgICAgICAgICAgeyAweDAzMyA8PCAyLCAweDQwfSwKKyAgICAgICAgICB7IDB4MDM0IDw8IDIsIDB4MDF9LAorICAgICAgICAgIHsgMHgwMzUgPDwgMiwgMHg0MH0sCisgICAgICAgICAgeyAweDAzNiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDM3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMzggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAzOSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDNBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwM0IgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAzQyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDNEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwM0UgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAzRiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNDEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNDQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQ2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNDcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0OCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQ5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNEEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0QiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDRDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNEQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0RSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDRGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1MSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDUyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1NCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDU1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1NyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDU4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1QSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDVCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNUMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1RCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDVFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNUYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA2MCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDYxIDw8IDIsIDB4MmV9LAorICAgICAgICAgIHsgMHgwNjIgPDwgMiwgMHgwOH0sCisgICAgICAgICAgeyAweDA2MyA8PCAyLCAweDVlfSwKKyAgICAgICAgICB7IDB4MDY0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNjUgPDwgMiwgMHg0Mn0sCisgICAgICAgICAgeyAweDA2NiA8PCAyLCAweGQxfSwKKyAgICAgICAgICB7IDB4MDY3IDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHgwNjggPDwgMiwgMHgyOH0sCisgICAgICAgICAgeyAweDA2OSA8PCAyLCAweDc4fSwKKyAgICAgICAgICB7IDB4MDZBIDw8IDIsIDB4Y2N9LAorICAgICAgICAgIHsgMHgwNkIgPDwgMiwgMHhjMX0sCisgICAgICAgICAgeyAweDA2QyA8PCAyLCAweDRlfSwKKyAgICAgICAgICB7IDB4MDZEIDw8IDIsIDB4MDN9LAorICAgICAgICAgIHsgMHgwNkUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA2RiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDcwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNzEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA3MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjAwIDw8IDIsIDB4MDJ9LAorICAgICAgICAgIHsgMHgyMDEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIwMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjAzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMDQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIwNSA8PCAyLCAweDEwfSwKKyAgICAgICAgICB7IDB4MjA2IDw8IDIsIDB4ODR9LAorICAgICAgICAgIHsgMHgyMDcgPDwgMiwgMHgzQ30sIAorICAgICAgICAgIHsgMHgyMDggPDwgMiwgMHhlMH0sCisgICAgICAgICAgeyAweDIxMCA8PCAyLCAweDIzfSwKKyAgICAgICAgICB7IDB4MjExIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMTIgPDwgMiwgMHg0MH0sCisgICAgICAgICAgeyAweDIxMyA8PCAyLCAweDA1fSwKKyAgICAgICAgICB7IDB4MjE0IDw8IDIsIDB4MjB9LC8qICovCisgICAgICAgICAgeyAweDIxNSA8PCAyLCAweDE3fSwKKyAgICAgICAgICB7IDB4MjE2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMTcgPDwgMiwgMHg2OH0sCisgICAgICAgICAgeyAweDIxOCA8PCAyLCAweGUyfSwKKyAgICAgICAgICB7IDB4MjE5IDw8IDIsIDB4MWV9LAorICAgICAgICAgIHsgMHgyMUEgPDwgMiwgMHgxOH0sCisgICAgICAgICAgeyAweDIxQiA8PCAyLCAweDBkfSwKKyAgICAgICAgICB7IDB4MjFDIDw8IDIsIDB4MGN9LAorICAgICAgICAgIHsgMHgyMUQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIxRSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjFGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjIyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyNCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjI1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjI4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyQSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjJCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMkMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyRCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjJFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMkYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzMCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjMxIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMzIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzMyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjM0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMzUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzNiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjM3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMzggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzOSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjNBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyM0IgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzQyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjNEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyM0UgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzRiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNDEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNDQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQ2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNDcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0OCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQ5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNEEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0QiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjRDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNEQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0RSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjRGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNTAgPDwgMiwgMHg2MH0sCisgICAgICAgICAgeyAweDI1MSA8PCAyLCAweDBmfSwKKyAgICAgICAgICB7IDB4QTAwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMDEgPDwgMiwgMHgyMH0sCisgICAgICAgICAgeyAweEEwMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTAzIDw8IDIsIDB4NDB9LAorICAgICAgICAgIHsgMHhBMDQgPDwgMiwgMHgyNH0sCisgICAgICAgICAgeyAweEEwNSA8PCAyLCAweGFlfSwKKyAgICAgICAgICB7IDB4QTA2IDw8IDIsIDB4MTl9LAorICAgICAgICAgIHsgMHhBMDcgPDwgMiwgMHg0OX0sCisgICAgICAgICAgeyAweEEwOCA8PCAyLCAweDA0fSwKKyAgICAgICAgICB7IDB4QTA5IDw8IDIsIDB4YzN9LAorICAgICAgICAgIHsgMHhBMEEgPDwgMiwgMHgyYX0sCisgICAgICAgICAgeyAweEEwQiA8PCAyLCAweGM2fSwKKyAgICAgICAgICB7IDB4QTBDIDw8IDIsIDB4MDF9LAorICAgICAgICAgIHsgMHhBMEQgPDwgMiwgMHgwM30sCisgICAgICAgICAgeyAweEEwRSA8PCAyLCAweDI4fSwKKyAgICAgICAgICB7IDB4QTBGIDw8IDIsIDB4OTh9LAorICAgICAgICAgIHsgMHhBMTAgPDwgMiwgMHgxOX0sCisgICAgICAgICAgeyAweEExMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTEyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMTMgPDwgMiwgMHg4MH0sCisgICAgICAgICAgeyAweEExNCA8PCAyLCAweGYwfSwKKyAgICAgICAgICB7IDB4QTE1IDw8IDIsIDB4ZDB9LAorICAgICAgICAgIHsgMHhBMTYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEExNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTMwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEzMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTMzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEzNSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTM2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEzOCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTM5IDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHhBM0EgPDwgMiwgMHhhMH0sCisgICAgICAgICAgeyAweEEzQiA8PCAyLCAweGEwfSwKKyAgICAgICAgICB7IDB4QTNDIDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHhBM0QgPDwgMiwgMHhhMH0sCisgICAgICAgICAgeyAweEEzRSA8PCAyLCAweGEwfSwKKyAgICAgICAgICB7IDB4QTNGIDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHhBNDAgPDwgMiwgMHg2Mn0sCisgICAgICAgICAgeyAweEE0MSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTQyIDw8IDIsIDB4ODB9LAorICAgICAgICAgIHsgMHhBNDMgPDwgMiwgMHg1OH0sCisgICAgICAgICAgeyAweEE0NCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTQ1IDw8IDIsIDB4NDR9LAorICAgICAgICAgIHsgMHhBNDYgPDwgMiwgMHg1Y30sCisgICAgICAgICAgeyAweEE0NyA8PCAyLCAweDg2fSwKKyAgICAgICAgICB7IDB4QTQ4IDw8IDIsIDB4OGR9LAorICAgICAgICAgIHsgMHhBNDkgPDwgMiwgMHhkMH0sCisgICAgICAgICAgeyAweEE0QSA8PCAyLCAweDA5fSwKKyAgICAgICAgICB7IDB4QTRCIDw8IDIsIDB4OTB9LAorICAgICAgICAgIHsgMHhBNEMgPDwgMiwgMHgwN30sCisgICAgICAgICAgeyAweEE0RCA8PCAyLCAweDQwfSwKKyAgICAgICAgICB7IDB4QTRFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNEYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1MCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTUxIDw8IDIsIDB4MjB9LAorICAgICAgICAgIHsgMHhBNTIgPDwgMiwgMHgzMn0sCisgICAgICAgICAgeyAweEE1MyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTU0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNTUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1NiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTU3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNTggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1OSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTVBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNUIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1QyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTVEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNUUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1RiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTYwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTYzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTY2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2OCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTY5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNkEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2QiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTZDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNkQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2RSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTZGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3MSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTcyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3NCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTc1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3NyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTc4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3QSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTdCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBN0MgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3RCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTdFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBN0YgPDwgMiwgMHhkOH0sCisgICAgICAgICAgeyAweEE4MCA8PCAyLCAweDFhfSwKKyAgICAgICAgICB7IDB4QTgxIDw8IDIsIDB4ZmZ9LAorICAgICAgICAgIHsgMHhBODIgPDwgMiwgMHgxMX0sCisgICAgICAgICAgeyAweEE4MyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTg0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBODUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE4NiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTg3IDw8IDIsIDB4ZjB9LAorICAgICAgICAgIHsgMHhBODggPDwgMiwgMHhmZn0sCisgICAgICAgICAgeyAweEE4OSA8PCAyLCAweGZmfSwKKyAgICAgICAgICB7IDB4QThBIDw8IDIsIDB4ZmZ9LAorICAgICAgICAgIHsgMHhBOEIgPDwgMiwgMHhmZn0sCisgICAgICAgICAgeyAweEE4QyA8PCAyLCAweDFjfSwKKyAgICAgICAgICB7IDB4QThEIDw8IDIsIDB4YzJ9LAorICAgICAgICAgIHsgMHhBOEUgPDwgMiwgMHhjM30sCisgICAgICAgICAgeyAweEE4RiA8PCAyLCAweDNmfSwKKyAgICAgICAgICB7IDB4QTkwIDw8IDIsIDB4MGF9LAorICAgICAgICAgIHsgMHhBOTEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE5MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTkzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBOTQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE5NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTk2IDw8IDIsIDB4Zjh9LAorICAgICAgICAgIHsgMHgwMDAgPDwgMiwgMHgwN30KKyAgICAgICAgfTsKKworLyogMjRNSHogaW50ZXJuYWwgcmVmIGNsb2NrIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VyZGVzX3JlZ3NfcyBzYXRhX3BoeV9yZWdfZmlsZV8yNFtdID0KKyAgICAgICAgeworICAgICAgICAgIHsgMHgwMDAgPDwgMiwgMHgwNn0sCisgICAgICAgICAgeyAweDAwMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDAyIDw8IDIsIDB4ODh9LAorICAgICAgICAgIHsgMHgwMDMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwNCA8PCAyLCAweDdifSwKKyAgICAgICAgICB7IDB4MDA1IDw8IDIsIDB4Yzl9LAorICAgICAgICAgIHsgMHgwMDYgPDwgMiwgMHgwM30sCisgICAgICAgICAgeyAweDAwNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDA4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMDkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwQSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDBCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMEMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwRCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDBFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMEYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxMCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDExIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMTIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxMyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDE0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMTUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxNiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDE3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMTggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxOSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDFBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMUIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxQyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDFEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMUUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxRiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDIwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMjEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyMiA8PCAyLCAweGEwfSwKKyAgICAgICAgICB7IDB4MDIzIDw8IDIsIDB4NTR9LAorICAgICAgICAgIHsgMHgwMjQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyNSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDI2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMjcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyOCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDI5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMkEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyQiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDJDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMkQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyRSA8PCAyLCAweDA0fSwKKyAgICAgICAgICB7IDB4MDJGIDw8IDIsIDB4NTB9LAorICAgICAgICAgIHsgMHgwMzAgPDwgMiwgMHg3MH0sCisgICAgICAgICAgeyAweDAzMSA8PCAyLCAweDAyfSwKKyAgICAgICAgICB7IDB4MDMyIDw8IDIsIDB4MjV9LAorICAgICAgICAgIHsgMHgwMzMgPDwgMiwgMHg0MH0sCisgICAgICAgICAgeyAweDAzNCA8PCAyLCAweDAxfSwKKyAgICAgICAgICB7IDB4MDM1IDw8IDIsIDB4NDB9LAorICAgICAgICAgIHsgMHgwMzYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAzNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDM4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMzkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAzQSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDNCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwM0MgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAzRCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDNFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwM0YgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0MCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQxIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNDIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0MyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQ0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNDUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0NiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQ3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNDggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0OSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDRBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNEIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0QyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDREIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNEUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0RiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDUwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDUzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDU2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1OCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDU5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNUEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1QiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDVDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNUQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1RSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDVGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNjAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgLy97IDB4MDYxIDw8IDIsIDB4MmV9LCAvL2ZvciBSZXYtQTAgZGV2aWNlCisgICAgICAgICAgeyAweDA2MSA8PCAyLCAweDJlfSwgLy9mb3IgUmV2LUExIGRldmljZQorICAgICAgICAgIHsgMHgwNjIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA2MyA8PCAyLCAweDVlfSwKKyAgICAgICAgICB7IDB4MDY0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNjUgPDwgMiwgMHg0Mn0sCisgICAgICAgICAgeyAweDA2NiA8PCAyLCAweGQxfSwKKyAgICAgICAgICB7IDB4MDY3IDw8IDIsIDB4MjB9LAorICAgICAgICAgIHsgMHgwNjggPDwgMiwgMHgyOH0sCisgICAgICAgICAgeyAweDA2OSA8PCAyLCAweDc4fSwKKyAgICAgICAgICB7IDB4MDZBIDw8IDIsIDB4MmN9LAorICAgICAgICAgIHsgMHgwNkIgPDwgMiwgMHhiOX0sCisgICAgICAgICAgeyAweDA2QyA8PCAyLCAweDVlfSwKKyAgICAgICAgICB7IDB4MDZEIDw8IDIsIDB4MDN9LAorICAgICAgICAgIHsgMHgwNkUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA2RiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDcwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNzEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA3MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjAwIDw8IDIsIDB4MDJ9LAorICAgICAgICAgIHsgMHgyMDEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIwMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjAzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMDQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIwNSA8PCAyLCAweDEwfSwKKyAgICAgICAgICB7IDB4MjA2IDw8IDIsIDB4ODR9LAorICAgICAgICAgIHsgMHgyMDcgPDwgMiwgMHgzY30sIAorICAgICAgICAgIHsgMHgyMDggPDwgMiwgMHhlMH0sCisgICAgICAgICAgeyAweDIxMCA8PCAyLCAweDIzfSwKKyAgICAgICAgICB7IDB4MjExIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMTIgPDwgMiwgMHg0MH0sCisgICAgICAgICAgeyAweDIxMyA8PCAyLCAweDA1fSwKKyAgICAgICAgICB7IDB4MjE0IDw8IDIsIDB4ZDB9LC8qICovCisgICAgICAgICAgeyAweDIxNSA8PCAyLCAweDE3fSwKKyAgICAgICAgICB7IDB4MjE2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMTcgPDwgMiwgMHg2OH0sCisgICAgICAgICAgeyAweDIxOCA8PCAyLCAweGYyfSwKKyAgICAgICAgICB7IDB4MjE5IDw8IDIsIDB4MWV9LAorICAgICAgICAgIHsgMHgyMUEgPDwgMiwgMHgxOH0sCisgICAgICAgICAgeyAweDIxQiA8PCAyLCAweDBkfSwKKyAgICAgICAgICB7IDB4MjFDIDw8IDIsIDB4MGN9LAorICAgICAgICAgIHsgMHgyMUQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIxRSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjFGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjIyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyNCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjI1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjI4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyQSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjJCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMkMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyRCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjJFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMkYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzMCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjMxIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMzIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzMyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjM0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMzUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzNiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjM3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMzggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzOSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjNBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyM0IgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzQyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjNEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyM0UgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzRiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNDEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNDQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQ2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNDcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0OCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQ5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNEEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0QiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjRDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNEQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0RSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjRGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNTAgPDwgMiwgMHg2MH0sCisgICAgICAgICAgeyAweDI1MSA8PCAyLCAweDBmfSwKKyAgICAgICAgICB7IDB4QTAwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMDEgPDwgMiwgMHgyMH0sCisgICAgICAgICAgeyAweEEwMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTAzIDw8IDIsIDB4NDB9LAorICAgICAgICAgIHsgMHhBMDQgPDwgMiwgMHgyNH0sCisgICAgICAgICAgeyAweEEwNSA8PCAyLCAweGFlfSwKKyAgICAgICAgICB7IDB4QTA2IDw8IDIsIDB4MTl9LAorICAgICAgICAgIHsgMHhBMDcgPDwgMiwgMHg0OX0sCisgICAgICAgICAgeyAweEEwOCA8PCAyLCAweDA0fSwKKyAgICAgICAgICB7IDB4QTA5IDw8IDIsIDB4ODN9LAorICAgICAgICAgIHsgMHhBMEEgPDwgMiwgMHg0Yn0sCisgICAgICAgICAgeyAweEEwQiA8PCAyLCAweGM1fSwKKyAgICAgICAgICB7IDB4QTBDIDw8IDIsIDB4MDF9LAorICAgICAgICAgIHsgMHhBMEQgPDwgMiwgMHgwM30sCisgICAgICAgICAgeyAweEEwRSA8PCAyLCAweDI4fSwKKyAgICAgICAgICB7IDB4QTBGIDw8IDIsIDB4OTh9LAorICAgICAgICAgIHsgMHhBMTAgPDwgMiwgMHgxOX0sCisgICAgICAgICAgeyAweEExMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTEyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMTMgPDwgMiwgMHg4MH0sCisgICAgICAgICAgeyAweEExNCA8PCAyLCAweGYwfSwKKyAgICAgICAgICB7IDB4QTE1IDw8IDIsIDB4ZDB9LAorICAgICAgICAgIHsgMHhBMTYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEExNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTMwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEzMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTMzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEzNSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTM2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEzOCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTM5IDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHhBM0EgPDwgMiwgMHhhMH0sCisgICAgICAgICAgeyAweEEzQiA8PCAyLCAweGEwfSwKKyAgICAgICAgICB7IDB4QTNDIDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHhBM0QgPDwgMiwgMHhhMH0sCisgICAgICAgICAgeyAweEEzRSA8PCAyLCAweGEwfSwKKyAgICAgICAgICB7IDB4QTNGIDw8IDIsIDB4NTR9LAorICAgICAgICAgIHsgMHhBNDAgPDwgMiwgMHg2Mn0sCisgICAgICAgICAgeyAweEE0MSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTQyIDw8IDIsIDB4ODB9LAorICAgICAgICAgIHsgMHhBNDMgPDwgMiwgMHg1OH0sCisgICAgICAgICAgeyAweEE0NCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTQ1IDw8IDIsIDB4NDR9LAorICAgICAgICAgIHsgMHhBNDYgPDwgMiwgMHg1Y30sCisgICAgICAgICAgeyAweEE0NyA8PCAyLCAweDg2fSwKKyAgICAgICAgICB7IDB4QTQ4IDw8IDIsIDB4OGR9LAorICAgICAgICAgIHsgMHhBNDkgPDwgMiwgMHhkMH0sCisgICAgICAgICAgeyAweEE0QSA8PCAyLCAweDA5fSwKKyAgICAgICAgICB7IDB4QTRCIDw8IDIsIDB4OTB9LAorICAgICAgICAgIHsgMHhBNEMgPDwgMiwgMHgwN30sCisgICAgICAgICAgeyAweEE0RCA8PCAyLCAweDQwfSwKKyAgICAgICAgICB7IDB4QTRFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNEYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1MCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTUxIDw8IDIsIDB4MjB9LAorICAgICAgICAgIHsgMHhBNTIgPDwgMiwgMHgzMn0sCisgICAgICAgICAgeyAweEE1MyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTU0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNTUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1NiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTU3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNTggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1OSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTVBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNUIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1QyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTVEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNUUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1RiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTYwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTYzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTY2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2OCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTY5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNkEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2QiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTZDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNkQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2RSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTZGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3MSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTcyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3NCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTc1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3NyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTc4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3QSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTdCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBN0MgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3RCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTdFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBN0YgPDwgMiwgMHhkOH0sCisgICAgICAgICAgeyAweEE4MCA8PCAyLCAweDFhfSwKKyAgICAgICAgICB7IDB4QTgxIDw8IDIsIDB4ZmZ9LAorICAgICAgICAgIHsgMHhBODIgPDwgMiwgMHgxMX0sCisgICAgICAgICAgeyAweEE4MyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTg0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBODUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE4NiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTg3IDw8IDIsIDB4ZjB9LAorICAgICAgICAgIHsgMHhBODggPDwgMiwgMHhmZn0sCisgICAgICAgICAgeyAweEE4OSA8PCAyLCAweGZmfSwKKyAgICAgICAgICB7IDB4QThBIDw8IDIsIDB4ZmZ9LAorICAgICAgICAgIHsgMHhBOEIgPDwgMiwgMHhmZn0sCisgICAgICAgICAgeyAweEE4QyA8PCAyLCAweDFjfSwKKyAgICAgICAgICB7IDB4QThEIDw8IDIsIDB4YzJ9LAorICAgICAgICAgIHsgMHhBOEUgPDwgMiwgMHhjM30sCisgICAgICAgICAgeyAweEE4RiA8PCAyLCAweDNmfSwKKyAgICAgICAgICB7IDB4QTkwIDw8IDIsIDB4MGF9LAorICAgICAgICAgIHsgMHhBOTEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE5MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTkzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBOTQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE5NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTk2IDw8IDIsIDB4Zjh9LAorICAgICAgICAgIHsgMHgwMDAgPDwgMiwgMHgwN30KKyAgICAgICAgfTsKKworI2lmIDAKKy8qIFRoaXMgaXMgNjBNaHogZXh0ZXJuYWwgcmVmIGNsb2NrIGNvbmZpZ3VyYXRpb24gd2hpY2ggaXMgbm90IHVzZWQgb24gdGhlIGJvYXJkIGN1cnJlbnRseSAqLworc3RhdGljIHN0cnVjdCBzZXJkZXNfcmVnc19zIHNhdGEwX3BoeV9yZWdfZmlsZVtdID0KKwl7CisgICAgCSAgeyAweDAwMCA8PCAyLCAweDA2fSwKKwkgIHsgMHgwMDEgPDwgMiwgMHgwMH0sCisJICB7IDB4MDAyIDw8IDIsIDB4ODB9LAorCSAgeyAweDAwMyA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMDQgPDwgMiwgMHgwMH0sCisJICB7IDB4MDA1IDw8IDIsIDB4MDB9LAorCSAgeyAweDAwNiA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMDcgPDwgMiwgMHgwMH0sCisJICB7IDB4MDA4IDw8IDIsIDB4MDB9LAorCSAgeyAweDAwOSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMEEgPDwgMiwgMHgwMH0sCisJICB7IDB4MDBCIDw8IDIsIDB4MDB9LAorCSAgeyAweDAwQyA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMEQgPDwgMiwgMHgwMH0sCisJICB7IDB4MDBFIDw8IDIsIDB4MDB9LAorCSAgeyAweDAwRiA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMTAgPDwgMiwgMHgwMH0sCisJICB7IDB4MDExIDw8IDIsIDB4MDB9LAorCSAgeyAweDAxMiA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMTMgPDwgMiwgMHgwMH0sCisJICB7IDB4MDE0IDw8IDIsIDB4MDB9LAorCSAgeyAweDAxNSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMTYgPDwgMiwgMHgwMH0sCisJICB7IDB4MDE3IDw8IDIsIDB4MDB9LAorCSAgeyAweDAxOCA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMTkgPDwgMiwgMHgwMH0sCisJICB7IDB4MDFBIDw8IDIsIDB4MDB9LAorCSAgeyAweDAxQiA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMUMgPDwgMiwgMHgwMH0sCisJICB7IDB4MDFEIDw8IDIsIDB4MDB9LAorCSAgeyAweDAxRSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMUYgPDwgMiwgMHgwMH0sCisJICB7IDB4MDIwIDw8IDIsIDB4MDB9LAorCSAgeyAweDAyMSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMjIgPDwgMiwgMHhhMH0sCisJICB7IDB4MDIzIDw8IDIsIDB4NjR9LAorCSAgeyAweDAyNCA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMjUgPDwgMiwgMHgwMH0sCisJICB7IDB4MDI2IDw8IDIsIDB4MDB9LAorCSAgeyAweDAyNyA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMjggPDwgMiwgMHgwMH0sCisJICB7IDB4MDI5IDw8IDIsIDB4MDB9LAorCSAgeyAweDAyQSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMkIgPDwgMiwgMHgwMH0sCisJICB7IDB4MDJDIDw8IDIsIDB4MDB9LAorCSAgeyAweDAyRCA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMkUgPDwgMiwgMHgwNH0sCisJICB7IDB4MDJGIDw8IDIsIDB4NTB9LAorCSAgeyAweDAzMCA8PCAyLCAweDcwfSwKKwkgIHsgMHgwMzEgPDwgMiwgMHgwMn0sCisJICB7IDB4MDMyIDw8IDIsIDB4MjV9LAorCSAgeyAweDAzMyA8PCAyLCAweDQwfSwKKwkgIHsgMHgwMzQgPDwgMiwgMHgwMX0sCisJICB7IDB4MDM1IDw8IDIsIDB4NDB9LAorCSAgeyAweDAzNiA8PCAyLCAweDAwfSwKKwkgIHsgMHgwMzcgPDwgMiwgMHgwMH0sCisJICB7IDB4MDM4IDw8IDIsIDB4MDB9LAorCSAgeyAweDAzOSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwM0EgPDwgMiwgMHgwMH0sCisJICB7IDB4MDNCIDw8IDIsIDB4MDB9LAorCSAgeyAweDAzQyA8PCAyLCAweDAwfSwKKwkgIHsgMHgwM0QgPDwgMiwgMHgwMH0sCisJICB7IDB4MDNFIDw8IDIsIDB4MDB9LAorCSAgeyAweDAzRiA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNDAgPDwgMiwgMHgwMH0sCisJICB7IDB4MDQxIDw8IDIsIDB4MDB9LAorCSAgeyAweDA0MiA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNDMgPDwgMiwgMHgwMH0sCisJICB7IDB4MDQ0IDw8IDIsIDB4MDB9LAorCSAgeyAweDA0NSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNDYgPDwgMiwgMHgwMH0sCisJICB7IDB4MDQ3IDw8IDIsIDB4MDB9LAorCSAgeyAweDA0OCA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNDkgPDwgMiwgMHgwMH0sCisJICB7IDB4MDRBIDw8IDIsIDB4MDB9LAorCSAgeyAweDA0QiA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNEMgPDwgMiwgMHgwMH0sCisJICB7IDB4MDREIDw8IDIsIDB4MDB9LAorCSAgeyAweDA0RSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNEYgPDwgMiwgMHgwMH0sCisJICB7IDB4MDUwIDw8IDIsIDB4MDB9LAorCSAgeyAweDA1MSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNTIgPDwgMiwgMHgwMH0sCisJICB7IDB4MDUzIDw8IDIsIDB4MDB9LAorCSAgeyAweDA1NCA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNTUgPDwgMiwgMHgwMH0sCisJICB7IDB4MDU2IDw8IDIsIDB4MDB9LAorCSAgeyAweDA1NyA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNTggPDwgMiwgMHgwMH0sCisJICB7IDB4MDU5IDw8IDIsIDB4MDB9LAorCSAgeyAweDA1QSA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNUIgPDwgMiwgMHgwMH0sCisJICB7IDB4MDVDIDw8IDIsIDB4MDB9LAorCSAgeyAweDA1RCA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNUUgPDwgMiwgMHgwMH0sCisJICB7IDB4MDVGIDw8IDIsIDB4MDB9LAorCSAgeyAweDA2MCA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNjEgPDwgMiwgMHgyZX0sCisJICB7IDB4MDYyIDw8IDIsIDB4MDB9LAorCSAgeyAweDA2MyA8PCAyLCAweDVlfSwKKwkgIHsgMHgwNjQgPDwgMiwgMHgwMH0sCisJICB7IDB4MDY1IDw8IDIsIDB4NDJ9LAorCSAgeyAweDA2NiA8PCAyLCAweGQxfSwKKwkgIHsgMHgwNjcgPDwgMiwgMHhhMH0sCisJICB7IDB4MDY4IDw8IDIsIDB4Mjh9LAorCSAgeyAweDA2OSA8PCAyLCAweDc4fSwKKwkgIHsgMHgwNkEgPDwgMiwgMHg0NH0sCisJICB7IDB4MDZCIDw8IDIsIDB4Y2V9LAorCSAgeyAweDA2QyA8PCAyLCAweDBifSwKKwkgIHsgMHgwNkQgPDwgMiwgMHgwMH0sCisJICB7IDB4MDZFIDw8IDIsIDB4MDB9LAorCSAgeyAweDA2RiA8PCAyLCAweDAwfSwKKwkgIHsgMHgwNzAgPDwgMiwgMHgwMH0sCisJICB7IDB4MDcxIDw8IDIsIDB4MDB9LAorCSAgeyAweDA3MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjAwIDw8IDIsIDB4MDJ9LAorCSAgeyAweDIwMSA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMDIgPDwgMiwgMHgwMH0sCisJICB7IDB4MjAzIDw8IDIsIDB4MDB9LAorCSAgeyAweDIwNCA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMDUgPDwgMiwgMHgxMH0sCisJICB7IDB4MjA2IDw8IDIsIDB4ODR9LAorCSAgeyAweDIwNyA8PCAyLCAweDA0fSwKKwkgIHsgMHgyMDggPDwgMiwgMHhlMH0sCisJICB7IDB4MjEwIDw8IDIsIDB4MjN9LAorCSAgeyAweDIxMSA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMTIgPDwgMiwgMHgwMH0sCisJICB7IDB4MjEzIDw8IDIsIDB4MDV9LAorCSAgeyAweDIxNCA8PCAyLCAweDM4fSwKKwkgIHsgMHgyMTUgPDwgMiwgMHgwNH0sCisJICB7IDB4MjE2IDw8IDIsIDB4MDB9LAorCSAgeyAweDIxNyA8PCAyLCAweDY4fSwKKwkgIHsgMHgyMTggPDwgMiwgMHhmMn0sCisJICB7IDB4MjE5IDw8IDIsIDB4MWV9LAorCSAgeyAweDIxQSA8PCAyLCAweDE4fSwKKwkgIHsgMHgyMUIgPDwgMiwgMHgwZH0sCisJICB7IDB4MjFDIDw8IDIsIDB4MGR9LAorCSAgeyAweDIxRCA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMUUgPDwgMiwgMHgwMH0sCisJICB7IDB4MjFGIDw8IDIsIDB4MDB9LAorCSAgeyAweDIyMCA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMjEgPDwgMiwgMHgwMH0sCisJICB7IDB4MjIyIDw8IDIsIDB4MDB9LAorCSAgeyAweDIyMyA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMjQgPDwgMiwgMHgwMH0sCisJICB7IDB4MjI1IDw8IDIsIDB4MDB9LAorCSAgeyAweDIyNiA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMjcgPDwgMiwgMHgwMH0sCisJICB7IDB4MjI4IDw8IDIsIDB4MDB9LAorCSAgeyAweDIyOSA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMkEgPDwgMiwgMHgwMH0sCisJICB7IDB4MjJCIDw8IDIsIDB4MDB9LAorCSAgeyAweDIyQyA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMkQgPDwgMiwgMHgwMH0sCisJICB7IDB4MjJFIDw8IDIsIDB4MDB9LAorCSAgeyAweDIyRiA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMzAgPDwgMiwgMHgwMH0sCisJICB7IDB4MjMxIDw8IDIsIDB4MDB9LAorCSAgeyAweDIzMiA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMzMgPDwgMiwgMHgwMH0sCisJICB7IDB4MjM0IDw8IDIsIDB4MDB9LAorCSAgeyAweDIzNSA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMzYgPDwgMiwgMHgwMH0sCisJICB7IDB4MjM3IDw8IDIsIDB4MDB9LAorCSAgeyAweDIzOCA8PCAyLCAweDAwfSwKKwkgIHsgMHgyMzkgPDwgMiwgMHgwMH0sCisJICB7IDB4MjNBIDw8IDIsIDB4MDB9LAorCSAgeyAweDIzQiA8PCAyLCAweDAwfSwKKwkgIHsgMHgyM0MgPDwgMiwgMHgwMH0sCisJICB7IDB4MjNEIDw8IDIsIDB4MDB9LAorCSAgeyAweDIzRSA8PCAyLCAweDAwfSwKKwkgIHsgMHgyM0YgPDwgMiwgMHgwMH0sCisJICB7IDB4MjQwIDw8IDIsIDB4MDB9LAorCSAgeyAweDI0MSA8PCAyLCAweDAwfSwKKwkgIHsgMHgyNDIgPDwgMiwgMHgwMH0sCisJICB7IDB4MjQzIDw8IDIsIDB4MDB9LAorCSAgeyAweDI0NCA8PCAyLCAweDAwfSwKKwkgIHsgMHgyNDUgPDwgMiwgMHgwMH0sCisJICB7IDB4MjQ2IDw8IDIsIDB4MDB9LAorCSAgeyAweDI0NyA8PCAyLCAweDAwfSwKKwkgIHsgMHgyNDggPDwgMiwgMHgwMH0sCisJICB7IDB4MjQ5IDw8IDIsIDB4MDB9LAorCSAgeyAweDI0QSA8PCAyLCAweDAwfSwKKwkgIHsgMHgyNEIgPDwgMiwgMHgwMH0sCisJICB7IDB4MjRDIDw8IDIsIDB4MDB9LAorCSAgeyAweDI0RCA8PCAyLCAweDAwfSwKKwkgIHsgMHgyNEUgPDwgMiwgMHgwMH0sCisJICB7IDB4MjRGIDw8IDIsIDB4MDB9LAorCSAgeyAweDI1MCA8PCAyLCAweDYwfSwKKwkgIHsgMHgyNTEgPDwgMiwgMHgwZn0sCisJICB7IDB4QTAwIDw8IDIsIDB4MDB9LAorCSAgeyAweEEwMSA8PCAyLCAweDIwfSwKKwkgIHsgMHhBMDIgPDwgMiwgMHgwMH0sCisJICB7IDB4QTAzIDw8IDIsIDB4NDB9LAorCSAgeyAweEEwNCA8PCAyLCAweDI0fSwKKwkgIHsgMHhBMDUgPDwgMiwgMHhhZX0sCisJICB7IDB4QTA2IDw8IDIsIDB4MTl9LAorCSAgeyAweEEwNyA8PCAyLCAweDQ5fSwKKwkgIHsgMHhBMDggPDwgMiwgMHgwNH0sCisJICB7IDB4QTA5IDw8IDIsIDB4MjN9LAorCSAgeyAweEEwQSA8PCAyLCAweDQ4fSwKKwkgIHsgMHhBMEIgPDwgMiwgMHhjNn0sCisJICB7IDB4QTBDIDw8IDIsIDB4MDF9LAorCSAgeyAweEEwRCA8PCAyLCAweDAzfSwKKwkgIHsgMHhBMEUgPDwgMiwgMHgyOH0sCisJICB7IDB4QTBGIDw8IDIsIDB4OTh9LAorCSAgeyAweEExMCA8PCAyLCAweDE5fSwKKwkgIHsgMHhBMTEgPDwgMiwgMHgwMH0sCisJICB7IDB4QTEyIDw8IDIsIDB4MDB9LAorCSAgeyAweEExMyA8PCAyLCAweDgwfSwKKwkgIHsgMHhBMTQgPDwgMiwgMHhmMH0sCisJICB7IDB4QTE1IDw8IDIsIDB4ZDB9LAorCSAgeyAweEExNiA8PCAyLCAweDAwfSwKKwkgIHsgMHhBMTcgPDwgMiwgMHgwMH0sCisJICB7IDB4QTMwIDw8IDIsIDB4MDB9LAorCSAgeyAweEEzMSA8PCAyLCAweDAwfSwKKwkgIHsgMHhBMzIgPDwgMiwgMHgwMH0sCisJICB7IDB4QTMzIDw8IDIsIDB4MDB9LAorCSAgeyAweEEzNCA8PCAyLCAweDAwfSwKKwkgIHsgMHhBMzUgPDwgMiwgMHgwMH0sCisJICB7IDB4QTM2IDw8IDIsIDB4MDB9LAorCSAgeyAweEEzNyA8PCAyLCAweDAwfSwKKwkgIHsgMHhBMzggPDwgMiwgMHgwMH0sCisJICB7IDB4QTM5IDw8IDIsIDB4YTB9LAorCSAgeyAweEEzQSA8PCAyLCAweGEwfSwKKwkgIHsgMHhBM0IgPDwgMiwgMHhhMH0sCisJICB7IDB4QTNDIDw8IDIsIDB4YTB9LAorCSAgeyAweEEzRCA8PCAyLCAweGEwfSwKKwkgIHsgMHhBM0UgPDwgMiwgMHhhMH0sCisJICB7IDB4QTNGIDw8IDIsIDB4YTB9LAorCSAgeyAweEE0MCA8PCAyLCAweDY0fSwKKwkgIHsgMHhBNDEgPDwgMiwgMHgwMH0sCisJICB7IDB4QTQyIDw8IDIsIDB4ODB9LAorCSAgeyAweEE0MyA8PCAyLCAweDU4fSwKKwkgIHsgMHhBNDQgPDwgMiwgMHgwMH0sCisJICB7IDB4QTQ1IDw8IDIsIDB4NDR9LAorCSAgeyAweEE0NiA8PCAyLCAweDVjfSwKKwkgIHsgMHhBNDcgPDwgMiwgMHg4Nn0sCisJICB7IDB4QTQ4IDw8IDIsIDB4OGR9LAorCSAgeyAweEE0OSA8PCAyLCAweGQwfSwKKwkgIHsgMHhBNEEgPDwgMiwgMHgwOX0sCisJICB7IDB4QTRCIDw8IDIsIDB4OTB9LAorCSAgeyAweEE0QyA8PCAyLCAweDA3fSwKKwkgIHsgMHhBNEQgPDwgMiwgMHg0MH0sCisJICB7IDB4QTRFIDw8IDIsIDB4MDB9LAorCSAgeyAweEE0RiA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNTAgPDwgMiwgMHgwMH0sCisJICB7IDB4QTUxIDw8IDIsIDB4MjB9LAorCSAgeyAweEE1MiA8PCAyLCAweDMyfSwKKwkgIHsgMHhBNTMgPDwgMiwgMHgwMH0sCisJICB7IDB4QTU0IDw8IDIsIDB4MDB9LAorCSAgeyAweEE1NSA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNTYgPDwgMiwgMHgwMH0sCisJICB7IDB4QTU3IDw8IDIsIDB4MDB9LAorCSAgeyAweEE1OCA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNTkgPDwgMiwgMHgwMH0sCisJICB7IDB4QTVBIDw8IDIsIDB4MDB9LAorCSAgeyAweEE1QiA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNUMgPDwgMiwgMHgwMH0sCisJICB7IDB4QTVEIDw8IDIsIDB4MDB9LAorCSAgeyAweEE1RSA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNUYgPDwgMiwgMHgwMH0sCisJICB7IDB4QTYwIDw8IDIsIDB4MDB9LAorCSAgeyAweEE2MSA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNjIgPDwgMiwgMHgwMH0sCisJICB7IDB4QTYzIDw8IDIsIDB4MDB9LAorCSAgeyAweEE2NCA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNjUgPDwgMiwgMHgwMH0sCisJICB7IDB4QTY2IDw8IDIsIDB4MDB9LAorCSAgeyAweEE2NyA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNjggPDwgMiwgMHgwMH0sCisJICB7IDB4QTY5IDw8IDIsIDB4MDB9LAorCSAgeyAweEE2QSA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNkIgPDwgMiwgMHgwMH0sCisJICB7IDB4QTZDIDw8IDIsIDB4MDB9LAorCSAgeyAweEE2RCA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNkUgPDwgMiwgMHgwMH0sCisJICB7IDB4QTZGIDw8IDIsIDB4MDB9LAorCSAgeyAweEE3MCA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNzEgPDwgMiwgMHgwMH0sCisJICB7IDB4QTcyIDw8IDIsIDB4MDB9LAorCSAgeyAweEE3MyA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNzQgPDwgMiwgMHgwMH0sCisJICB7IDB4QTc1IDw8IDIsIDB4MDB9LAorCSAgeyAweEE3NiA8PCAyLCAweDAwfSwKKwkgIHsgMHhBNzcgPDwgMiwgMHgwMH0sCisJICB7IDB4QTc4IDw8IDIsIDB4MDB9LAorCSAgeyAweEE3OSA8PCAyLCAweDAwfSwKKwkgIHsgMHhBN0EgPDwgMiwgMHgwMH0sCisJICB7IDB4QTdCIDw8IDIsIDB4MDB9LAorCSAgeyAweEE3QyA8PCAyLCAweDAwfSwKKwkgIHsgMHhBN0QgPDwgMiwgMHgwMH0sCisJICB7IDB4QTdFIDw8IDIsIDB4MDB9LAorCSAgeyAweEE3RiA8PCAyLCAweGQ4fSwKKwkgIHsgMHhBODAgPDwgMiwgMHgxYX0sCisJICB7IDB4QTgxIDw8IDIsIDB4ZmZ9LAorCSAgeyAweEE4MiA8PCAyLCAweDExfSwKKwkgIHsgMHhBODMgPDwgMiwgMHgwMH0sCisJICB7IDB4QTg0IDw8IDIsIDB4MDB9LAorCSAgeyAweEE4NSA8PCAyLCAweDAwfSwKKwkgIHsgMHhBODYgPDwgMiwgMHgwMH0sCisJICB7IDB4QTg3IDw8IDIsIDB4ZjB9LAorCSAgeyAweEE4OCA8PCAyLCAweGZmfSwKKwkgIHsgMHhBODkgPDwgMiwgMHhmZn0sCisJICB7IDB4QThBIDw8IDIsIDB4ZmZ9LAorCSAgeyAweEE4QiA8PCAyLCAweGZmfSwKKwkgIHsgMHhBOEMgPDwgMiwgMHgxY30sCisJICB7IDB4QThEIDw8IDIsIDB4YzJ9LAorCSAgeyAweEE4RSA8PCAyLCAweGMzfSwKKwkgIHsgMHhBOEYgPDwgMiwgMHgzZn0sCisJICB7IDB4QTkwIDw8IDIsIDB4MGF9LAorCSAgeyAweEE5MSA8PCAyLCAweDAwfSwKKwkgIHsgMHhBOTIgPDwgMiwgMHgwMH0sCisJICB7IDB4QTkzIDw8IDIsIDB4MDB9LAorCSAgeyAweEE5NCA8PCAyLCAweDAwfSwKKwkgIHsgMHhBOTUgPDwgMiwgMHgwMH0sCisJICB7IDB4QTk2IDw8IDIsIDB4Zjh9LAorCSAgeyAweDAwMCA8PCAyLCAweDA3fQorCX07CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzZXJkZXNfcmVnc19zIHBjaWVfcGh5X3JlZ19maWxlXzQ4W10gPQorCisvKiBQQ0llIFNFUkRFUyBpcyB1c2luZyBpbnRlcm5hbCBjbG9jayAqLworICAJeworCSAgLyogQ29tbW9uIENNVSBibG9jayAqLworICAJICB7IDB4MDAwIDw8IDIsIDB4MDZ9LAorICAJICB7IDB4MDAxIDw8IDIsIDB4MDB9LAorICAJICB7IDB4MDAyIDw8IDIsIDB4MDl9LCAvLworIAkgIHsgMHgwMDMgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAwNCA8PCAyLCAweDYwfSwgLy8KKyAJICB7IDB4MDA1IDw8IDIsIDB4MDl9LCAvLworIAkgIHsgMHgwMDYgPDwgMiwgMHgwZX0sIC8vCisgCSAgeyAweDAwNyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDA4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMDkgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAwQSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDBCIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMEMgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAwRCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDBFIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMEYgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxMCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDExIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMTIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxMyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDE0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMTUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxNiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDE3IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMTggPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxOSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDFBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMUIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxQyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDFEIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMUUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxRiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDIwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMjEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAyMiA8PCAyLCAweGEwfSwKKyAJICB7IDB4MDIzIDw8IDIsIDB4NmN9LCAvLworIAkgIHsgMHgwMjQgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAyNSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDI2IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMjcgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAyOCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDI5IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMkEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAyQiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDJDIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMkQgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAyRSA8PCAyLCAweDA0fSwKKyAJICB7IDB4MDJGIDw8IDIsIDB4NTB9LAorIAkgIHsgMHgwMzAgPDwgMiwgMHg3MH0sCisgCSAgeyAweDAzMSA8PCAyLCAweDAyfSwKKyAJICB7IDB4MDMyIDw8IDIsIDB4MjV9LAorIAkgIHsgMHgwMzMgPDwgMiwgMHg0MH0sCisgCSAgeyAweDAzNCA8PCAyLCAweDAxfSwKKyAJICB7IDB4MDM1IDw8IDIsIDB4NDB9LAorIAkgIHsgMHgwMzYgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAzNyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDM4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMzkgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAzQSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDNCIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwM0MgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAzRCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDNFIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwM0YgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0MCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDQxIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNDIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0MyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDQ0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNDUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0NiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDQ3IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNDggPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0OSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDRBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNEIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0QyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDREIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNEUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0RiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDUwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNTEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1MiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDUzIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNTQgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1NSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDU2IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNTcgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1OCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDU5IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNUEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1QiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDVDIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNUQgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1RSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDVGIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNjAgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA2MSA8PCAyLCAweDJlfSwKKyAJICB7IDB4MDYyIDw8IDIsIDB4MDh9LCAvLworIAkgIHsgMHgwNjMgPDwgMiwgMHg1ZX0sCisgCSAgeyAweDA2NCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDY1IDw8IDIsIDB4NDJ9LAorICAJICB7IDB4MDY2IDw8IDIsIDB4ZDF9LAorIAkgIHsgMHgwNjcgPDwgMiwgMHg5MH0sIC8vCisgCSAgeyAweDA2OCA8PCAyLCAweDA4fSwKKyAJICB7IDB4MDY5IDw8IDIsIDB4OTB9LCAvLworIAkgIHsgMHgwNkEgPDwgMiwgMHgyY30sIC8vCisgCSAgeyAweDA2QiA8PCAyLCAweDMyfSwgLy8KKyAJICB7IDB4MDZDIDw8IDIsIDB4NTl9LCAvLworIAkgIHsgMHgwNkQgPDwgMiwgMHgwM30sIC8vCisgCSAgeyAweDA2RSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDZGIDw8IDIsIDB4MDB9LAorICAJICB7IDB4MDcwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNzEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA3MiA8PCAyLCAweDAwfSwKKyAgCSAgLyogTGFuZTAgQmxvY2sgKi8KKyAgCSAgeyAweDIwMCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjAxIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMDIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIwMyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjA0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMDUgPDwgMiwgMHgxMH0sCisgCSAgeyAweDIwNiA8PCAyLCAweDg0fSwKKyAJICB7IDB4MjA3IDw8IDIsIDB4MDR9LAorIAkgIHsgMHgyMDggPDwgMiwgMHhlMH0sCisgCSAgeyAweDIxMCA8PCAyLCAweDIzfSwKKyAJICB7IDB4MjExIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMTIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIxMyA8PCAyLCAweDA0fSwgLy8KKyAJICB7IDB4MjE0IDw8IDIsIDB4YzB9LCAvLworIAkgIHsgMHgyMTUgPDwgMiwgMHgxOH0sIC8vCisgCSAgeyAweDIxNiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjE3IDw8IDIsIDB4Njh9LAorIAkgIHsgMHgyMTggPDwgMiwgMHhhMn0sCisgCSAgeyAweDIxOSA8PCAyLCAweDFlfSwKKyAJICB7IDB4MjFBIDw8IDIsIDB4MTh9LAorIAkgIHsgMHgyMUIgPDwgMiwgMHgwZH0sCisgCSAgeyAweDIxQyA8PCAyLCAweDBkfSwKKyAJICB7IDB4MjFEIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMUUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIxRiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjIwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMjEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyMiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjIzIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMjQgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyNSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjI2IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMjcgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyOCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjI5IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMkEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyQiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjJDIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMkQgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyRSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjJGIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMzAgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzMSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjMyIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMzMgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzNCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjM1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMzYgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzNyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjM4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMzkgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzQSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjNCIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyM0MgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzRCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjNFIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyM0YgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0MCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjQxIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNDIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0MyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjQ0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNDUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0NiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjQ3IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNDggPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0OSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjRBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNEIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0QyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjREIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNEUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0RiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjUwIDw8IDIsIDB4NjB9LAorIAkgIHsgMHgyNTEgPDwgMiwgMHgwZn0sCisJICAvKiBDb21tb24gTGFuZSBCbG9jayAqLworIAkgIHsgMHhBMDAgPDwgMiwgMHhjMH0sCisgCSAgeyAweEEwMSA8PCAyLCAweDkwfSwKKyAJICB7IDB4QTAyIDw8IDIsIDB4MDJ9LAorIAkgIHsgMHhBMDMgPDwgMiwgMHg0MH0sCisgCSAgeyAweEEwNCA8PCAyLCAweDNjfSwKKyAJICB7IDB4QTA1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMDYgPDwgMiwgMHgwMH0sCisgCSAgeyAweEEwNyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTA4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMDkgPDwgMiwgMHhjM30sIC8vCisgCSAgeyAweEEwQSA8PCAyLCAweGNhfSwgLy8KKyAJICB7IDB4QTBCIDw8IDIsIDB4YzZ9LAorIAkgIHsgMHhBMEMgPDwgMiwgMHgwMX0sCisgCSAgeyAweEEwRCA8PCAyLCAweDAzfSwKKyAJICB7IDB4QTBFIDw8IDIsIDB4Mjh9LAorIAkgIHsgMHhBMEYgPDwgMiwgMHg5OH0sCisgCSAgeyAweEExMCA8PCAyLCAweDE5fSwKKyAJICB7IDB4QTExIDw8IDIsIDB4Mjh9LAorIAkgIHsgMHhBMTIgPDwgMiwgMHg3OH0sCisgCSAgeyAweEExMyA8PCAyLCAweGUxfSwKKyAJICB7IDB4QTE0IDw8IDIsIDB4ZjB9LAorIAkgIHsgMHhBMTUgPDwgMiwgMHgxMH0sCisgCSAgeyAweEExNiA8PCAyLCAweGY0fSwKKyAJICB7IDB4QTE3IDw8IDIsIDB4MDB9LAorICAJICB7IDB4QTMwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMzEgPDwgMiwgMHgwMH0sCisgCSAgeyAweEEzMiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTMzIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMzQgPDwgMiwgMHgwMH0sCisgCSAgeyAweEEzNSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTM2IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMzcgPDwgMiwgMHgwMH0sCisgCSAgeyAweEEzOCA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTM5IDw8IDIsIDB4YTB9LAorIAkgIHsgMHhBM0EgPDwgMiwgMHhhMH0sCisgCSAgeyAweEEzQiA8PCAyLCAweGEwfSwKKyAJICB7IDB4QTNDIDw8IDIsIDB4YTB9LAorIAkgIHsgMHhBM0QgPDwgMiwgMHhhMH0sCisgCSAgeyAweEEzRSA8PCAyLCAweGEwfSwKKyAJICB7IDB4QTNGIDw8IDIsIDB4YTB9LAorIAkgIHsgMHhBNDAgPDwgMiwgMHg2Y30sIC8vCisgCSAgeyAweEE0MSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTQyIDw8IDIsIDB4YzB9LAorIAkgIHsgMHhBNDMgPDwgMiwgMHg5Zn0sCisgCSAgeyAweEE0NCA8PCAyLCAweDAxfSwKKyAJICB7IDB4QTQ1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNDYgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE0NyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTQ4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNDkgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE0QSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTRCIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNEMgPDwgMiwgMHgzMH0sCisgCSAgeyAweEE0RCA8PCAyLCAweDQxfSwKKyAJICB7IDB4QTRFIDw8IDIsIDB4N2V9LAorIAkgIHsgMHhBNEYgPDwgMiwgMHhkMH0sCisgCSAgeyAweEE1MCA8PCAyLCAweGNjfSwKKyAJICB7IDB4QTUxIDw8IDIsIDB4ODV9LAorIAkgIHsgMHhBNTIgPDwgMiwgMHg1Mn0sCisgCSAgeyAweEE1MyA8PCAyLCAweDkzfSwKKyAJICB7IDB4QTU0IDw8IDIsIDB4ZTB9LAorIAkgIHsgMHhBNTUgPDwgMiwgMHg0OX0sCisgCSAgeyAweEE1NiA8PCAyLCAweGRkfSwKKyAJICB7IDB4QTU3IDw8IDIsIDB4YjB9LAorIAkgIHsgMHhBNTggPDwgMiwgMHgwYn0sCisgCSAgeyAweEE1OSA8PCAyLCAweDAyfSwKKyAJICB7IDB4QTVBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNUIgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE1QyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTVEIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNUUgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE1RiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTYwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNjEgPDwgMiwgMHgwMH0sCisgIAkgIHsgMHhBNjIgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2MyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTY0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNjUgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2NiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTY3IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNjggPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2OSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTZBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNkIgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2QyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTZEIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNkUgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2RiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTcwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNzEgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3MiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTczIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNzQgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3NSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTc2IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNzcgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3OCA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTc5IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBN0EgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3QiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTdDIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBN0QgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3RSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTdGIDw8IDIsIDB4ZDh9LAorIAkgIHsgMHhBODAgPDwgMiwgMHgxYX0sCisgCSAgeyAweEE4MSA8PCAyLCAweGZmfSwKKyAJICB7IDB4QTgyIDw8IDIsIDB4MDF9LAorIAkgIHsgMHhBODMgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE4NCA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTg1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBODYgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE4NyA8PCAyLCAweGYwfSwKKyAJICB7IDB4QTg4IDw8IDIsIDB4ZmZ9LAorIAkgIHsgMHhBODkgPDwgMiwgMHhmZn0sCisgCSAgeyAweEE4QSA8PCAyLCAweGZmfSwKKyAJICB7IDB4QThCIDw8IDIsIDB4ZmZ9LAorIAkgIHsgMHhBOEMgPDwgMiwgMHgxY30sCisgCSAgeyAweEE4RCA8PCAyLCAweGMyfSwKKyAJICB7IDB4QThFIDw8IDIsIDB4YzN9LAorIAkgIHsgMHhBOEYgPDwgMiwgMHgzZn0sCisgCSAgeyAweEE5MCA8PCAyLCAweDBhfSwKKyAJICB7IDB4QTkxIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBOTIgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE5MyA8PCAyLCAweDAwfSwKKyAgCSAgeyAweEE5NCA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTk1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBOTYgPDwgMiwgMHhmOH0sCisgICAJICB7IDB4MDAwIDw8IDIsIDB4MDd9CisJfTsKKworc3RhdGljIHN0cnVjdCBzZXJkZXNfcmVnc19zIHBjaWVfcGh5X3JlZ19maWxlXzEwMFtdID0KKyAgICAgICAgeworICAgICAgICAgIC8qIENvbW1vbiBDTVUgYmxvY2sgKi8KKyAgICAgICAgIHsgMHgwMDAgPDwgMiwgMHgwNn0sCisgICAgICAgICAgeyAweDAwMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDAyIDw8IDIsIDB4MDl9LCAvLworICAgICAgICAgIHsgMHgwMDMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwNCA8PCAyLCAweDAwfSwgCisgICAgICAgICAgeyAweDAwNSA8PCAyLCAweDAwfSwgCisgICAgICAgICAgeyAweDAwNiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDA3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMDggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwOSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDBBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMEIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwQyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDBEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMEUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAwRiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDEwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMTEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDEzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMTQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxNSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDE2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMTcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxOCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDE5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMUEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxQiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDFDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMUQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAxRSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDFGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMjAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDIyIDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHgwMjMgPDwgMiwgMHg2NH0sIAorICAgICAgICAgIHsgMHgwMjQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyNSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDI2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMjcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyOCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDI5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMkEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyQiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDJDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMkQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAyRSA8PCAyLCAweDA0fSwKKyAgICAgICAgICB7IDB4MDJGIDw8IDIsIDB4NTB9LAorICAgICAgICAgIHsgMHgwMzAgPDwgMiwgMHg3MH0sCisgICAgICAgICAgeyAweDAzMSA8PCAyLCAweDAyfSwKKyAgICAgICAgICB7IDB4MDMyIDw8IDIsIDB4MjV9LAorICAgICAgICAgIHsgMHgwMzMgPDwgMiwgMHg0MH0sCisgICAgICAgICAgeyAweDAzNCA8PCAyLCAweDAxfSwKKyAgICAgICAgICB7IDB4MDM1IDw8IDIsIDB4NDB9LAorICAgICAgICAgIHsgMHgwMzYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAzNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDM4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwMzkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAzQSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDNCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwM0MgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDAzRCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDNFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwM0YgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0MCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQxIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNDIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0MyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQ0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNDUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0NiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDQ3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNDggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0OSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDRBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNEIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0QyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDREIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNEUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA0RiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDUwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDUzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDU2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNTcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1OCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDU5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNUEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1QiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDVDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNUQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA1RSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDVGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNjAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA2MSA8PCAyLCAweDJlfSwvL2ZvciBSZXYxIG1vZGlmaWVkIGluIGNvZGUKKyAgICAgICAgICB7IDB4MDYyIDw8IDIsIDB4MDB9LCAKKyAgICAgICAgICB7IDB4MDYzIDw8IDIsIDB4NWV9LAorICAgICAgICAgIHsgMHgwNjQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA2NSA8PCAyLCAweDQyfSwKKyAgICAgICAgICB7IDB4MDY2IDw8IDIsIDB4ZDF9LAorICAgICAgICAgIHsgMHgwNjcgPDwgMiwgMHg5MH0sIAorICAgICAgICAgIHsgMHgwNjggPDwgMiwgMHgwOH0sCisgICAgICAgICAgeyAweDA2OSA8PCAyLCAweDUwfSwgCisgICAgICAgICAgeyAweDA2QSA8PCAyLCAweDQ0fSwgCisgICAgICAgICAgeyAweDA2QiA8PCAyLCAweGNlfSwgCisgICAgICAgICAgeyAweDA2QyA8PCAyLCAweDBifSwgCisgICAgICAgICAgeyAweDA2RCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDZFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNkYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDA3MCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MDcxIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgwNzIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgLyogTGFuZTAgQmxvY2sgKi8KKyAgICAgICAgICB7IDB4MjAwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMDEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIwMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjAzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMDQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIwNSA8PCAyLCAweDEwfSwKKyAgICAgICAgICB7IDB4MjA2IDw8IDIsIDB4MDR9LAorICAgICAgICAgIHsgMHgyMDcgPDwgMiwgMHgxOH0sCisgICAgICAgICAgeyAweDIwOCA8PCAyLCAweGUwfSwKKyAgICAgICAgICB7IDB4MjEwIDw8IDIsIDB4MjN9LAorICAgICAgICAgIHsgMHgyMTEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIxMiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjEzIDw8IDIsIDB4MDN9LCAKKyAgICAgICAgICB7IDB4MjE0IDw8IDIsIDB4M0N9LCAKKyAgICAgICAgICB7IDB4MjE1IDw8IDIsIDB4MDR9LCAKKyAgICAgICAgICB7IDB4MjE2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMTcgPDwgMiwgMHg2OH0sCisgICAgICAgICAgeyAweDIxOCA8PCAyLCAweGEyfSwKKyAgICAgICAgICB7IDB4MjE5IDw8IDIsIDB4MWV9LAorICAgICAgICAgIHsgMHgyMUEgPDwgMiwgMHgxOH0sCisgICAgICAgICAgeyAweDIxQiA8PCAyLCAweDBkfSwKKyAgICAgICAgICB7IDB4MjFDIDw8IDIsIDB4MGR9LAorICAgICAgICAgIHsgMHgyMUQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIxRSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjFGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjIyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyNCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjI1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjI4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMjkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyQSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjJCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMkMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIyRCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjJFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMkYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzMCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjMxIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMzIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzMyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjM0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMzUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzNiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjM3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyMzggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzOSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjNBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyM0IgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzQyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjNEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyM0UgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDIzRiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQwIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNDEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0MiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNDQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQ2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNDcgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0OCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjQ5IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNEEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0QiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjRDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNEQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweDI0RSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4MjRGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHgyNTAgPDwgMiwgMHhmNn0sCisgICAgICAgICAgeyAweDI1MSA8PCAyLCAweDAzfSwKKyAgICAgICAgICAvKiBDb21tb24gTGFuZSBCbG9jayAqLworICAgICAgICAgIHsgMHhBMDAgPDwgMiwgMHhjMH0sCisgICAgICAgICAgeyAweEEwMSA8PCAyLCAweDkwfSwKKyAgICAgICAgICB7IDB4QTAyIDw8IDIsIDB4MDJ9LAorICAgICAgICAgIHsgMHhBMDMgPDwgMiwgMHg0MH0sCisgICAgICAgICAgeyAweEEwNCA8PCAyLCAweDNjfSwKKyAgICAgICAgICB7IDB4QTA1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMDYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEwNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTA4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMDkgPDwgMiwgMHg2M30sIC8vCisgICAgICAgICAgeyAweEEwQSA8PCAyLCAweDQ5fSwgLy8KKyAgICAgICAgICB7IDB4QTBCIDw8IDIsIDB4YzZ9LAorICAgICAgICAgIHsgMHhBMEMgPDwgMiwgMHgwMX0sCisgICAgICAgICAgeyAweEEwRCA8PCAyLCAweDAzfSwKKyAgICAgICAgICB7IDB4QTBFIDw8IDIsIDB4Mjh9LAorICAgICAgICAgIHsgMHhBMEYgPDwgMiwgMHg5OH0sCisgICAgICAgICAgeyAweEExMCA8PCAyLCAweDE5fSwKKyAgICAgICAgICB7IDB4QTExIDw8IDIsIDB4Mjh9LAorICAgICAgICAgIHsgMHhBMTIgPDwgMiwgMHg3OH0sCisgICAgICAgICAgeyAweEExMyA8PCAyLCAweGUxfSwKKyAgICAgICAgICB7IDB4QTE0IDw8IDIsIDB4ZjB9LAorICAgICAgICAgIHsgMHhBMTUgPDwgMiwgMHgxMH0sCisgICAgICAgICAgeyAweEExNiA8PCAyLCAweGY0fSwKKyAgICAgICAgICB7IDB4QTE3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEzMSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTMyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEzNCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTM1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEEzNyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTM4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBMzkgPDwgMiwgMHhhMH0sCisgICAgICAgICAgeyAweEEzQSA8PCAyLCAweGEwfSwKKyAgICAgICAgICB7IDB4QTNCIDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHhBM0MgPDwgMiwgMHhhMH0sCisgICAgICAgICAgeyAweEEzRCA8PCAyLCAweGEwfSwKKyAgICAgICAgICB7IDB4QTNFIDw8IDIsIDB4YTB9LAorICAgICAgICAgIHsgMHhBM0YgPDwgMiwgMHhhMH0sCisgICAgICAgICAgeyAweEE0MCA8PCAyLCAweDY0fSwKKyAgICAgICAgICB7IDB4QTQxIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNDIgPDwgMiwgMHhjMH0sCisgICAgICAgICAgeyAweEE0MyA8PCAyLCAweDlmfSwKKyAgICAgICAgICB7IDB4QTQ0IDw8IDIsIDB4MDF9LAorICAgICAgICAgIHsgMHhBNDUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE0NiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTQ3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNDggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE0OSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTRBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNEIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE0QyA8PCAyLCAweDMwfSwKKyAgICAgICAgICB7IDB4QTREIDw8IDIsIDB4NDF9LAorICAgICAgICAgIHsgMHhBNEUgPDwgMiwgMHg3ZX0sCisgICAgICAgICAgeyAweEE0RiA8PCAyLCAweGQwfSwKKyAgICAgICAgICB7IDB4QTUwIDw8IDIsIDB4Y2N9LAorICAgICAgICAgIHsgMHhBNTEgPDwgMiwgMHg4NX0sCisgICAgICAgICAgeyAweEE1MiA8PCAyLCAweDUyfSwKKyAgICAgICAgICB7IDB4QTUzIDw8IDIsIDB4OTN9LAorICAgICAgICAgIHsgMHhBNTQgPDwgMiwgMHhlMH0sCisgICAgICAgICAgeyAweEE1NSA8PCAyLCAweDQ5fSwKKyAgICAgICAgICB7IDB4QTU2IDw8IDIsIDB4ZGR9LAorICAgICAgICAgIHsgMHhBNTcgPDwgMiwgMHhiMH0sCisgICAgICAgICAgeyAweEE1OCA8PCAyLCAweDBifSwKKyAgICAgICAgICB7IDB4QTU5IDw8IDIsIDB4MDJ9LAorICAgICAgICAgIHsgMHhBNUEgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1QiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTVDIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNUQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE1RSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTVGIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjAgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2MSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTYyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2NCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTY1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2NyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTY4IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNjkgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2QSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTZCIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNkMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE2RCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTZFIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNkYgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3MCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTcxIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzIgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3MyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTc0IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzUgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3NiA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTc3IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBNzggPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3OSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTdBIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBN0IgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3QyA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTdEIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBN0UgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE3RiA8PCAyLCAweGQ4fSwKKyAgICAgICAgICB7IDB4QTgwIDw8IDIsIDB4MWF9LAorICAgICAgICAgIHsgMHhBODEgPDwgMiwgMHhmZn0sCisgICAgICAgICAgeyAweEE4MiA8PCAyLCAweDAxfSwKKyAgICAgICAgICB7IDB4QTgzIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBODQgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE4NSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTg2IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBODcgPDwgMiwgMHhmMH0sCisgICAgICAgICAgeyAweEE4OCA8PCAyLCAweGZmfSwKKyAgICAgICAgICB7IDB4QTg5IDw8IDIsIDB4ZmZ9LAorICAgICAgICAgIHsgMHhBOEEgPDwgMiwgMHhmZn0sCisgICAgICAgICAgeyAweEE4QiA8PCAyLCAweGZmfSwKKyAgICAgICAgICB7IDB4QThDIDw8IDIsIDB4MWN9LAorICAgICAgICAgIHsgMHhBOEQgPDwgMiwgMHhjMn0sCisgICAgICAgICAgeyAweEE4RSA8PCAyLCAweGMzfSwKKyAgICAgICAgICB7IDB4QThGIDw8IDIsIDB4M2Z9LAorICAgICAgICAgIHsgMHhBOTAgPDwgMiwgMHgwYX0sCisgICAgICAgICAgeyAweEE5MSA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTkyIDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBOTMgPDwgMiwgMHgwMH0sCisgICAgICAgICAgeyAweEE5NCA8PCAyLCAweDAwfSwKKyAgICAgICAgICB7IDB4QTk1IDw8IDIsIDB4MDB9LAorICAgICAgICAgIHsgMHhBOTYgPDwgMiwgMHhmOH0sCisgICAJICB7IDB4MDAwIDw8IDIsIDB4MDd9CisgICAgICAgIH07CisKKworc3RhdGljIHN0cnVjdCBzZXJkZXNfcmVnc19zIHBjaWVfcGh5X3JlZ19maWxlXzI0W10gPQorLyogUENJZSBTRVJERVMgaXMgdXNpbmcgaW50ZXJuYWwgY2xvY2sgKi8KKyAgCXsKKwkgIC8qIENvbW1vbiBDTVUgYmxvY2sgKi8KKyAgCSAgeyAweDAwMCA8PCAyLCAweDA2fSwKKyAgCSAgeyAweDAwMSA8PCAyLCAweDAwfSwKKyAgCSAgeyAweDAwMiA8PCAyLCAweDA5fSwgLy8KKyAJICB7IDB4MDAzIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMDQgPDwgMiwgMHg2MH0sIC8vCisgCSAgeyAweDAwNSA8PCAyLCAweDA5fSwgLy8KKyAJICB7IDB4MDA2IDw8IDIsIDB4MGV9LCAvLworIAkgIHsgMHgwMDcgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAwOCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDA5IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMEEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAwQiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDBDIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMEQgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAwRSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDBGIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMTAgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxMSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDEyIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMTMgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxNCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDE1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMTYgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxNyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDE4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMTkgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxQSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDFCIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMUMgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAxRCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDFFIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMUYgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAyMCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDIxIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMjIgPDwgMiwgMHhhMH0sCisgCSAgeyAweDAyMyA8PCAyLCAweDY4fSwgLy8KKyAJICB7IDB4MDI0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMjUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAyNiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDI3IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMjggPDwgMiwgMHgwMH0sCisgCSAgeyAweDAyOSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDJBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMkIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAyQyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDJEIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMkUgPDwgMiwgMHgwNH0sCisgCSAgeyAweDAyRiA8PCAyLCAweDUwfSwKKyAJICB7IDB4MDMwIDw8IDIsIDB4NzB9LAorIAkgIHsgMHgwMzEgPDwgMiwgMHgwMn0sCisgCSAgeyAweDAzMiA8PCAyLCAweDI1fSwKKyAJICB7IDB4MDMzIDw8IDIsIDB4NDB9LAorIAkgIHsgMHgwMzQgPDwgMiwgMHgwMX0sCisgCSAgeyAweDAzNSA8PCAyLCAweDQwfSwKKyAJICB7IDB4MDM2IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwMzcgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAzOCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDM5IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwM0EgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAzQiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDNDIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwM0QgPDwgMiwgMHgwMH0sCisgCSAgeyAweDAzRSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDNGIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNDAgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0MSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDQyIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNDMgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0NCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDQ1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNDYgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0NyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDQ4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNDkgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0QSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDRCIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNEMgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA0RCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDRFIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNEYgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1MCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDUxIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNTIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1MyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDU0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNTUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1NiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDU3IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNTggPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1OSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDVBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNUIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1QyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDVEIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNUUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA1RiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDYwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNjEgPDwgMiwgMHgyZX0sIC8vZm9yIFJldi1BMCBkZXZpY2UKKyAJICB7IDB4MDYyIDw8IDIsIDB4MDB9LCAvLworIAkgIHsgMHgwNjMgPDwgMiwgMHg1ZX0sCisgCSAgeyAweDA2NCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDY1IDw8IDIsIDB4NDJ9LAorICAJICB7IDB4MDY2IDw8IDIsIDB4OTF9LAorIAkgIHsgMHgwNjcgPDwgMiwgMHgxMH0sIC8vCisgCSAgeyAweDA2OCA8PCAyLCAweDQ4fSwKKyAJICB7IDB4MDY5IDw8IDIsIDB4OTB9LCAvLworIAkgIHsgMHgwNkEgPDwgMiwgMHgwY30sIC8vCisgCSAgeyAweDA2QiA8PCAyLCAweDRjfSwgLy8KKyAJICB7IDB4MDZDIDw8IDIsIDB4NzN9LCAvLworIAkgIHsgMHgwNkQgPDwgMiwgMHgwM30sIC8vCisgCSAgeyAweDA2RSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MDZGIDw8IDIsIDB4MDB9LAorICAJICB7IDB4MDcwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgwNzEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDA3MiA8PCAyLCAweDAwfSwKKyAgCSAgLyogTGFuZTAgQmxvY2sgKi8KKyAgCSAgeyAweDIwMCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjAxIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMDIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIwMyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjA0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMDUgPDwgMiwgMHgxMH0sCisgCSAgeyAweDIwNiA8PCAyLCAweDA0fSwKKyAJICB7IDB4MjA3IDw8IDIsIDB4MTh9LAorIAkgIHsgMHgyMDggPDwgMiwgMHhlMH0sCisgCSAgeyAweDIxMCA8PCAyLCAweDIzfSwKKyAJICB7IDB4MjExIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMTIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIxMyA8PCAyLCAweDA0fSwgLy8KKyAJICB7IDB4MjE0IDw8IDIsIDB4Mzh9LCAvLworIAkgIHsgMHgyMTUgPDwgMiwgMHgxMH0sIC8vCisgCSAgeyAweDIxNiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjE3IDw8IDIsIDB4Njh9LAorIAkgIHsgMHgyMTggPDwgMiwgMHhhMn0sCisgCSAgeyAweDIxOSA8PCAyLCAweDFlfSwKKyAJICB7IDB4MjFBIDw8IDIsIDB4MTh9LAorIAkgIHsgMHgyMUIgPDwgMiwgMHgwZH0sCisgCSAgeyAweDIxQyA8PCAyLCAweDBjfSwKKyAJICB7IDB4MjFEIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMUUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIxRiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjIwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMjEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyMiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjIzIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMjQgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyNSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjI2IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMjcgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyOCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjI5IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMkEgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyQiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjJDIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMkQgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIyRSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjJGIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMzAgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzMSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjMyIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMzMgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzNCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjM1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMzYgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzNyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjM4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyMzkgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzQSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjNCIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyM0MgPDwgMiwgMHgwMH0sCisgCSAgeyAweDIzRCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjNFIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyM0YgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0MCA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjQxIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNDIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0MyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjQ0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNDUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0NiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjQ3IDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNDggPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0OSA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjRBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNEIgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0QyA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjREIDw8IDIsIDB4MDB9LAorIAkgIHsgMHgyNEUgPDwgMiwgMHgwMH0sCisgCSAgeyAweDI0RiA8PCAyLCAweDAwfSwKKyAJICB7IDB4MjUwIDw8IDIsIDB4ZjZ9LAorIAkgIHsgMHgyNTEgPDwgMiwgMHgwM30sCisJICAvKiBDb21tb24gTGFuZSBCbG9jayAqLworIAkgIHsgMHhBMDAgPDwgMiwgMHhjMH0sCisgCSAgeyAweEEwMSA8PCAyLCAweDkwfSwKKyAJICB7IDB4QTAyIDw8IDIsIDB4MDJ9LAorIAkgIHsgMHhBMDMgPDwgMiwgMHg0MH0sCisgCSAgeyAweEEwNCA8PCAyLCAweDNjfSwKKyAJICB7IDB4QTA1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMDYgPDwgMiwgMHgwMH0sCisgCSAgeyAweEEwNyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTA4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMDkgPDwgMiwgMHg4M30sIC8vCisgCSAgeyAweEEwQSA8PCAyLCAweDhifSwgLy8KKyAJICB7IDB4QTBCIDw8IDIsIDB4YzZ9LAorIAkgIHsgMHhBMEMgPDwgMiwgMHgwMX0sCisgCSAgeyAweEEwRCA8PCAyLCAweDAzfSwKKyAJICB7IDB4QTBFIDw8IDIsIDB4Mjh9LAorIAkgIHsgMHhBMEYgPDwgMiwgMHg5OH0sCisgCSAgeyAweEExMCA8PCAyLCAweDE5fSwKKyAJICB7IDB4QTExIDw8IDIsIDB4Mjh9LAorIAkgIHsgMHhBMTIgPDwgMiwgMHg3OH0sCisgCSAgeyAweEExMyA8PCAyLCAweGUxfSwKKyAJICB7IDB4QTE0IDw8IDIsIDB4ZjB9LAorIAkgIHsgMHhBMTUgPDwgMiwgMHgxMH0sCisgCSAgeyAweEExNiA8PCAyLCAweGY0fSwKKyAJICB7IDB4QTE3IDw8IDIsIDB4MDB9LAorICAJICB7IDB4QTMwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMzEgPDwgMiwgMHgwMH0sCisgCSAgeyAweEEzMiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTMzIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMzQgPDwgMiwgMHgwMH0sCisgCSAgeyAweEEzNSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTM2IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBMzcgPDwgMiwgMHgwMH0sCisgCSAgeyAweEEzOCA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTM5IDw8IDIsIDB4YTB9LAorIAkgIHsgMHhBM0EgPDwgMiwgMHhhMH0sCisgCSAgeyAweEEzQiA8PCAyLCAweGEwfSwKKyAJICB7IDB4QTNDIDw8IDIsIDB4YTB9LAorIAkgIHsgMHhBM0QgPDwgMiwgMHhhMH0sCisgCSAgeyAweEEzRSA8PCAyLCAweGEwfSwKKyAJICB7IDB4QTNGIDw8IDIsIDB4YTB9LAorIAkgIHsgMHhBNDAgPDwgMiwgMHg2OH0sIC8vCisgCSAgeyAweEE0MSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTQyIDw8IDIsIDB4YzB9LAorIAkgIHsgMHhBNDMgPDwgMiwgMHg5Zn0sCisgCSAgeyAweEE0NCA8PCAyLCAweDAxfSwKKyAJICB7IDB4QTQ1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNDYgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE0NyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTQ4IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNDkgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE0QSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTRCIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNEMgPDwgMiwgMHgzMH0sCisgCSAgeyAweEE0RCA8PCAyLCAweDQxfSwKKyAJICB7IDB4QTRFIDw8IDIsIDB4N2V9LAorIAkgIHsgMHhBNEYgPDwgMiwgMHhkMH0sCisgCSAgeyAweEE1MCA8PCAyLCAweGNjfSwKKyAJICB7IDB4QTUxIDw8IDIsIDB4ODV9LAorIAkgIHsgMHhBNTIgPDwgMiwgMHg1Mn0sCisgCSAgeyAweEE1MyA8PCAyLCAweDkzfSwKKyAJICB7IDB4QTU0IDw8IDIsIDB4ZTB9LAorIAkgIHsgMHhBNTUgPDwgMiwgMHg0OX0sCisgCSAgeyAweEE1NiA8PCAyLCAweGRkfSwKKyAJICB7IDB4QTU3IDw8IDIsIDB4YjB9LAorIAkgIHsgMHhBNTggPDwgMiwgMHgwYn0sCisgCSAgeyAweEE1OSA8PCAyLCAweDAyfSwKKyAJICB7IDB4QTVBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNUIgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE1QyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTVEIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNUUgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE1RiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTYwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNjEgPDwgMiwgMHgwMH0sCisgIAkgIHsgMHhBNjIgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2MyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTY0IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNjUgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2NiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTY3IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNjggPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2OSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTZBIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNkIgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2QyA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTZEIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNkUgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE2RiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTcwIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNzEgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3MiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTczIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNzQgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3NSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTc2IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBNzcgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3OCA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTc5IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBN0EgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3QiA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTdDIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBN0QgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE3RSA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTdGIDw8IDIsIDB4ZDh9LAorIAkgIHsgMHhBODAgPDwgMiwgMHgxYX0sCisgCSAgeyAweEE4MSA8PCAyLCAweGZmfSwKKyAJICB7IDB4QTgyIDw8IDIsIDB4MDF9LAorIAkgIHsgMHhBODMgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE4NCA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTg1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBODYgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE4NyA8PCAyLCAweGYwfSwKKyAJICB7IDB4QTg4IDw8IDIsIDB4ZmZ9LAorIAkgIHsgMHhBODkgPDwgMiwgMHhmZn0sCisgCSAgeyAweEE4QSA8PCAyLCAweGZmfSwKKyAJICB7IDB4QThCIDw8IDIsIDB4ZmZ9LAorIAkgIHsgMHhBOEMgPDwgMiwgMHgxY30sCisgCSAgeyAweEE4RCA8PCAyLCAweGMyfSwKKyAJICB7IDB4QThFIDw8IDIsIDB4YzN9LAorIAkgIHsgMHhBOEYgPDwgMiwgMHgzZn0sCisgCSAgeyAweEE5MCA8PCAyLCAweDBhfSwKKyAJICB7IDB4QTkxIDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBOTIgPDwgMiwgMHgwMH0sCisgCSAgeyAweEE5MyA8PCAyLCAweDAwfSwKKyAgCSAgeyAweEE5NCA8PCAyLCAweDAwfSwKKyAJICB7IDB4QTk1IDw8IDIsIDB4MDB9LAorIAkgIHsgMHhBOTYgPDwgMiwgMHhmOH0sCisgICAJICB7IDB4MDAwIDw8IDIsIDB4MDd9CisJfTsKKworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9zZXJpYWwuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZWEzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9zZXJpYWwuaApAQCAtMCwwICsxLDY0IEBACisvKiBVQVJUICovCisjZGVmaW5lIExDUl9DSEFSX0xFTl81ICAgICAgICAgIDB4MDAgICAgICAvKiBkZWZhdWx0ICovCisjZGVmaW5lIExDUl9DSEFSX0xFTl82ICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTENSX0NIQVJfTEVOXzcgICAgICAgICAgMHgwMgorI2RlZmluZSBMQ1JfQ0hBUl9MRU5fOCAgICAgICAgICAweDAzCisjZGVmaW5lIExDUl9PTkVfU1RPUCAgICAgICAgICAgIDB4MDAgICAgICAvKiBPbmUgc3RvcCBiaXQhIC0gZGVmYXVsdCAqLworI2RlZmluZSBMQ1JfVFdPX1NUT1AgICAgICAgICAgICAweDA0ICAgICAgLyogVHdvIHN0b3AgYml0ISAqLworI2RlZmluZSBMQ1JfUEVOICAgICAgICAgICAgICAgICAweDA4ICAgICAgLyogUGFyaXR5IEVuYWJsZSAqLworI2RlZmluZSBMQ1JfUEFSSVRZX05PTkUgICAgICAgICAweDAwCisjZGVmaW5lIExDUl9FUFMgICAgICAgICAgICAgICAgIDB4MTAgICAgICAvKiBFdmVuIFBhcml0eSBTZWxlY3QgKi8KKyNkZWZpbmUgTENSX1BTICAgICAgICAgICAgICAgICAgMHgyMCAgICAgIC8qIEVuYWJsZSBQYXJpdHkgIFN0dWZmICovCisjZGVmaW5lIExDUl9TQlJLICAgICAgICAgICAgICAgIDB4NDAgIC8qIFN0YXJ0IEJyZWFrICovCisjZGVmaW5lIExDUl9QU0IgICAgICAgICAgICAgICAgIDB4ODAgICAgICAvKiBQYXJpdHkgU3R1ZmYgQml0ICovCisjZGVmaW5lIExDUl9ETEFCICAgICAgICAgICAgICAgIDB4ODAgIC8qIFVBUlQgMTY1NTAgRGl2aXNvciBMYXRjaCBBc3Nlc3MgKi8KKworI2RlZmluZSBMU1JfRklGT0UgICAgICAgICAgICAgICAoMSA8PCA3KSAgICAgICAgLyogRklGTyBFcnJvciBTdGF0dXMgKi8KKyNkZWZpbmUgTFNSX1RFTVQgICAgICAgICAgICAgICAgKDEgPDwgNikgICAgICAgIC8qIFRyYW5zbWl0dGVyIEVtcHR5ICovCisjZGVmaW5lIExTUl9URFJRICAgICAgICAgICAgICAgICgxIDw8IDUpICAgICAgICAvKiBUcmFuc21pdCBEYXRhIFJlcXVlc3QgKi8KKyNkZWZpbmUgTFNSX0JJICAgICAgICAgICAgICAgICAgKDEgPDwgNCkgICAgICAgIC8qIEJyZWFrIEludGVycnVwdCAqLworI2RlZmluZSBMU1JfRkUgICAgICAgICAgICAgICAgICAoMSA8PCAzKSAgICAgICAgLyogRnJhbWluZyBFcnJvciAqLworI2RlZmluZSBMU1JfUEUgICAgICAgICAgICAgICAgICAoMSA8PCAyKSAgICAgICAgLyogUGFyaXR5IEVycm9yICovCisjZGVmaW5lIExTUl9PRSAgICAgICAgICAgICAgICAgICgxIDw8IDEpICAgICAgICAvKiBPdmVycnVuIEVycm9yICovCisjZGVmaW5lIExTUl9EUiAgICAgICAgICAgICAgICAgICgxIDw8IDApICAgICAgICAvKiBEYXRhIFJlYWR5ICovCisKKyNkZWZpbmUgSUVSX0RNQUUgICAgICAgICAgICAgICAgKDEgPDwgNykgICAgICAgIC8qIERNQSBSZXF1ZXN0cyBFbmFibGUgKi8KKyNkZWZpbmUgSUVSX1VVRSAgICAgICAgICAgICAgICAgKDEgPDwgNikgICAgICAgIC8qIFVBUlQgVW5pdCBFbmFibGUgKi8KKyNkZWZpbmUgSUVSX05SWkUgICAgICAgICAgICAgICAgKDEgPDwgNSkgICAgICAgIC8qIE5SWiBjb2RpbmcgRW5hYmxlICovCisjZGVmaW5lIElFUl9SVElPRSAgICAgICAgICAgICAgICgxIDw8IDQpICAgICAgICAvKiBSZWNlaXZlciBUaW1lIE91dCBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIElFUl9NSUUgICAgICAgICAgICAgICAgICgxIDw8IDMpICAgICAgICAvKiBNb2RlbSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIElFUl9STFNFICAgICAgICAgICAgICAgICgxIDw8IDIpICAgICAgICAvKiBSZWNlaXZlciBMaW5lIFN0YXR1cyBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIElFUl9USUUgICAgICAgICAgICAgICAgICgxIDw8IDEpICAgICAgICAvKiBUcmFuc21pdCBEYXRhIHJlcXVlc3QgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBJRVJfUkFWSUUgICAgICAgICAgICAgICAoMSA8PCAwKSAgICAgICAgLyogUmVjZWl2ZXIgRGF0YSBBdmFpbGFibGUgSW50ZXJydXB0IEVuYWJsZSAqLworCisjZGVmaW5lIElJUl9GSUZPRVMxICAgICAgICAgICAgICgxIDw8IDcpICAgICAgICAvKiBGSUZPIE1vZGUgRW5hYmxlIFN0YXR1cyAqLworI2RlZmluZSBJSVJfRklGT0VTMCAgICAgICAgICAgICAoMSA8PCA2KSAgICAgICAgLyogRklGTyBNb2RlIEVuYWJsZSBTdGF0dXMgKi8KKyNkZWZpbmUgSUlSX1RPRCAgICAgICAgICAgICAgICAgKDEgPDwgMykgICAgICAgIC8qIFRpbWUgT3V0IERldGVjdGVkICovCisjZGVmaW5lIElJUl9JSUQyICAgICAgICAgICAgICAgICgxIDw8IDIpICAgICAgICAvKiBJbnRlcnJ1cHQgU291cmNlIEVuY29kZWQgKi8KKyNkZWZpbmUgSUlSX0lJRDEgICAgICAgICAgICAgICAgKDEgPDwgMSkgICAgICAgIC8qIEludGVycnVwdCBTb3VyY2UgRW5jb2RlZCAqLworI2RlZmluZSBJSVJfSVAgICAgICAgICAgICAgICAgICAoMSA8PCAwKSAgICAgICAgLyogSW50ZXJydXB0IFBlbmRpbmcgKGFjdGl2ZSBsb3cpICovCisKKy8qIFVBUlQgMTY1NTAgRklGTyBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEZDUl9GSUZPRU4gICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgRkNSX1JDVlJSRVMgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBGQ1JfWE1JVFJFUyAgICAgICAgICAgICAweDA0CisKKy8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKy8qIFVBUlQgMTY1NTAgKi8KKyNkZWZpbmUgSUVSX1JYVEggICAgICAgICAgICAgICAgMHgwMSAgICAvKiBFbmFibGUgUmVjZWl2ZWQgRGF0YSBBdmFpbGFibGUgSW50ZXJydXB0ICovCisjZGVmaW5lIElFUl9UWFRIICAgICAgICAgICAgICAgIDB4MDIgICAgLyogRW5hYmxlIFRyYW5zbWl0dGVyIEVtcHR5IEludGVycnVwdCAqLworCisjZGVmaW5lIFVBUlRfVEhSCQkweDAwCisjZGVmaW5lIFVBUlRfUkJSCQkweDAwCisjZGVmaW5lIFVBUlRfRExMCQkweDAwCisjZGVmaW5lIFVBUlRfSUVSCQkweDA0CisjZGVmaW5lIFVBUlRfRExICQkweDA0CisjZGVmaW5lIFVBUlRfSUlSCQkweDA4CisjZGVmaW5lIFVBUlRfRkNSCQkweDA4CisjZGVmaW5lIFVBUlRfTENSCQkweDBDCisjZGVmaW5lIFVBUlRfTUNSCQkweDEwCisjZGVmaW5lIFVBUlRfTFNSCQkweDE0CisjZGVmaW5lIFVBUlRfTVNSCQkweDE4CisjZGVmaW5lIFVBUlRfU0NSCQkweDFDCisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvc3BpLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjMwM2RkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvc3BpLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jb21jZXJ0by9pcnFzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LDIwMDUgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpZm5kZWYgX19BU01fQVJDSF9TUElfSAorI2RlZmluZSBfX0FTTV9BUkNIX1NQSV9ICisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX004NlhYKQorCSNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvc3BpLmg+CisjZWxzZQorCSNlcnJvciAiVW5zdXBwb3J0ZWQgQ1BVIgorI2VuZGlmCisKKyNlbmRpZiAgLyogX19BU01fQVJDSF9TUElfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvc3lzdGVtLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC9zeXN0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTBiNDZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvc3lzdGVtLmgKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jb21jZXJ0by9zeXN0ZW0uaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9fQVNNX0FSQ0hfU1lTVEVNX0gKKyNkZWZpbmUgX19BU01fQVJDSF9TWVNURU1fSAorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvY2xrLXJzdC5oPgorI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KKworc3RhdGljIGlubGluZSB2b2lkIGFyY2hfaWRsZSh2b2lkKQoreworCS8qCisJICogVGhpcyBzaG91bGQgZG8gYWxsIHRoZSBjbG9jayBzd2l0Y2hpbmcKKwkgKiBhbmQgd2FpdCBmb3IgaW50ZXJydXB0IHRyaWNrcworCSAqLworCWNwdV9kb19pZGxlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3Jlc2V0KGNoYXIgbW9kZSwgY29uc3QgY2hhciAqY21kKQoreworCWNvbWNlcnRvX3JzdF9jbnRybF9zZXQoUFdSX09OX1NPRlRfUlNUKTsKK30KKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3RpbWV4LmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC90aW1leC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YmE5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC90aW1leC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtY29tY2VydG8vdGltZXguaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfVElNRVhfSF9fCisjZGVmaW5lIF9fQVNNX0FSQ0hfVElNRVhfSF9fCisKKwkjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisJI2RlZmluZSBDTE9DS19USUNLX1JBVEUJCQlDT01DRVJUT19ERUZBVUxUQVhJQ0xLCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjBjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqICBsaW51eC9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jb21jZXJ0by91bmNvbXByZXNzLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LDIwMDggTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworI2lmbmRlZiBfX0FTTV9BUkNIX1VOQ09NUFJFU1NfSAorI2RlZmluZSBfX0FTTV9BUkNIX1VOQ09NUFJFU1NfSAorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2lmZGVmIENPTkZJR19DT01DRVJUT19VQVJUMV9TVVBQT1JUCisJI2RlZmluZSBVQVJUX0RSCQkoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopMHg5NjQwMDAwMCkKKwkjZGVmaW5lIFVBUlRfTFNSCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikweDk2NDAwMDE0KQorI2VsaWYgQ09ORklHX0NPTUNFUlRPX1VBUlQwX1NVUFBPUlQKKwkjZGVmaW5lIFVBUlRfRFIJCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikweDk2MzAwMDAwKQorCSNkZWZpbmUgVUFSVF9MU1IJKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKTB4OTYzMDAwMTQpCisjZWxzZQorCSNlcnJvciBubyB1YXJ0IGNvbmZpZ3VyZWQKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0YyhpbnQgYykKK3sKKwl3aGlsZSAoISggX19jcHVfdG9fbGUzMihVQVJUX0xTUikgJiAweDIwKSkKKwkJYmFycmllcigpOworCVVBUlRfRFIgPSBfX2NwdV90b19sZTMyKGMpOworfQorCitzdGF0aWMgdm9pZCBmbHVzaCh2b2lkKQoreworfQorCisvKgorICogbm90aGluZyB0byBkbworICovCisjZGVmaW5lIGFyY2hfZGVjb21wX3NldHVwKCkKKworI2RlZmluZSBhcmNoX2RlY29tcF93ZG9nKCkKKworI2VuZGlmIC8qIF9fQVNNX0FSQ0hfVU5DT01QUkVTU19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC92bWFsbG9jLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL2luY2x1ZGUvbWFjaC92bWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlZDU4MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogIGFyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3ZtYWxsb2MuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX004NlhYWCkKKyNkZWZpbmUgVk1BTExPQ19FTkQgICAgICAgKDB4RjAwMDAwMDApCisjZWxzZQorI2Vycm9yICJVbnN1cHBvcnRlZCBDUFUiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3dkdC5oIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9pbmNsdWRlL21hY2gvd2R0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5MDkwNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vaW5jbHVkZS9tYWNoL3dkdC5oCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtY29tY2VydG8vaXJxcy5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX0FSQ0hfV0RUX0gKKyNkZWZpbmUgX19BU01fQVJDSF9XRFRfSAorCisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX004NlhYWCkKKwkjaW5jbHVkZSA8bWFjaC9jb21jZXJ0by0yMDAwL3dkdC5oPgorI2Vsc2UKKwkjZXJyb3IgIm1hY2gvY29tY2VydG8tMjAwMC93ZHQuaCA6ICBVbmtub3duIGFyY2hpdGVjdHVyZSIgCisjZW5kaWYKKworI2VuZGlmICAvKiBfX0FTTV9BUkNIX1dEVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21lbWJ1Zi5jIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9tZW1idWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2QzNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9tZW1idWYuYwpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqICBsaW51eC9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21lbWJ1Zi5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDMzKQorI2RlZmluZSBzZ19wYWdlKHNnKQkoKHNnKS0+cGFnZSkKKworI2RlZmluZSBzZ192aXJ0KHNnKSAocGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2cpKSArIChzZyktPm9mZnNldCkKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9CVUZGRVJTCTQ4CisKKyNkZWZpbmUgTUVNQlVGX01JTk9SCQkwCisjZGVmaW5lIE1FTUJVRl9NSU5PUl9DT1VOVAkxCisjZGVmaW5lIE1FTUJVRl9ERVZfQ09VTlQJMQorCisjZGVmaW5lIE1FTUJVRl9ERUZBVUxUX1BHX09SREVSCTYKKworI2RlZmluZSBNRU1CVUZfRFJWX05BTUUJCSJtZW1idWYiCisKKworI2RlZmluZSBNRU1CVUZfR0VUX1NDQVRURVIgX0lPUignbScsIDEsIHN0cnVjdCB1c3Jfc2NhdHRlcl9saXN0KQorCitzdHJ1Y3QgdXNyX3NjYXR0ZXJfbGlzdAoreworCXU4IGVudHJpZXM7CisJdTggcGdfb3JkZXJbTUFYX0JVRkZFUlNdOworCXUzMiBhZGRyW01BWF9CVUZGRVJTXTsKK307CisKK3N0cnVjdCBtZW1idWYKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbTUFYX0JVRkZFUlNdOworCWludCBzZ19ucjsKKworCWludCBzaXplOwkvKiBUb3RhbCBtZW1vcnkgaW4gdXNlIGZvciB0aGUgYnVmZmVyIGRhdGEgKi8KKwlpbnQgcmVhbF9zaXplOwkvKiBUb3RhbCBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgc2NhdHRlciBsaXN0ICovCisKKwlpbnQgcGdfb3JkZXI7CisKKwljaGFyIG1hcHBlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVtYnVmX2RldgoreworCXN0cnVjdCBjZGV2IGRldjsKKwlpbnQgZGV2bm87Cit9IG1lbWJ1Zl9kZXY7CisKKworc3RhdGljIGludCBtZW1idWZfbWFwKHN0cnVjdCBtZW1idWYgKmJ1ZikKK3sKKwlpbnQgcmM7CisKKwlpZiAoYnVmLT5tYXBwZWQpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBidWZmZXIgYWxyZWFkeSBtYXBwZWRcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IGRtYV9tYXBfc2coTlVMTCwgYnVmLT5zZywgYnVmLT5zZ19uciwgRE1BX1RPX0RFVklDRSk7CisJaWYgKHJjICE9IGJ1Zi0+c2dfbnIpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRtYV9tYXBfc2coKSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwllbHNlCisJCWJ1Zi0+bWFwcGVkID0gMTsKKworb3V0OgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgbWVtYnVmX3VubWFwKHN0cnVjdCBtZW1idWYgKmJ1ZikKK3sKKwlpZiAoIWJ1Zi0+bWFwcGVkKQorCQlyZXR1cm47CisKKwlkbWFfdW5tYXBfc2coTlVMTCwgYnVmLT5zZywgYnVmLT5zZ19uciwgRE1BX1RPX0RFVklDRSk7CisKKwlidWYtPm1hcHBlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIG1lbWJ1Zl9mcmVlKHN0cnVjdCBtZW1idWYgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJZm9yIChpID0gMCwgc2cgPSBidWYtPnNnOyBpIDwgYnVmLT5zZ19ucjsgaSsrLCBzZysrKSB7CisJCV9fZnJlZV9wYWdlcyhzZ19wYWdlKHNnKSwgZ2V0X29yZGVyKHNnLT5sZW5ndGgpKTsKKwl9CisKKwlidWYtPnNnX25yID0gMDsKKwlidWYtPnNpemUgPSAwOworCWJ1Zi0+cmVhbF9zaXplID0gMDsKKwlidWYtPnBnX29yZGVyID0gTUVNQlVGX0RFRkFVTFRfUEdfT1JERVI7Cit9CisKK3N0YXRpYyB2b2lkIG1lbWJ1Zl9zeW5jKHN0cnVjdCBtZW1idWYgKmJ1ZikKK3sKKwlkbWFfc3luY19zZ19mb3JfZGV2aWNlKE5VTEwsIGJ1Zi0+c2csIGJ1Zi0+c2dfbnIsIERNQV9UT19ERVZJQ0UpOworfQorCitzdGF0aWMgaW50IG1lbWJ1Zl9leHBhbmQoc3RydWN0IG1lbWJ1ZiAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXZvaWQgKnBhZ2U7CisJaW50IGxlbjsKKworCW1lbWJ1Zl91bm1hcChidWYpOworCisJd2hpbGUgKHNpemUgPiAwKQorCXsKKwkJaWYgKGJ1Zi0+c2dfbnIgPj0gTUFYX0JVRkZFUlMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRvbyBtYW55IHNjYXR0ZXIgZW50cmllcyglZCkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgYnVmLT5zZ19ucik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJcmV0cnk6CisJCXBhZ2UgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTiwgYnVmLT5wZ19vcmRlcik7CisJCWlmICghcGFnZSkgeworCQkJaWYgKGJ1Zi0+cGdfb3JkZXItLSA+IDEpCisJCQkJZ290byByZXRyeTsKKworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogX19nZXRfZnJlZV9wYWdlcyglZCkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgYnVmLT5wZ19vcmRlcik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXNnID0gJmJ1Zi0+c2dbYnVmLT5zZ19ucl07CisKKwkJbGVuID0gUEFHRV9TSVpFICogKDEgPDwgYnVmLT5wZ19vcmRlcik7CisKKwkJc2dfc2V0X2J1ZihzZywgcGFnZSwgbGVuKTsKKworCQlidWYtPnNnX25yKys7CisKKwkJYnVmLT5yZWFsX3NpemUgKz0gbGVuOworCisJCWlmIChzaXplID4gbGVuKQorCQkJYnVmLT5zaXplICs9IGxlbjsKKwkJZWxzZQorCQkJYnVmLT5zaXplICs9IHNpemU7CisKKwkJc2l6ZSAtPSBsZW47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBnZXRfc2dfaW5kZXgoc3RydWN0IG1lbWJ1ZiAqYnVmLCBpbnQgKm9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJZm9yIChpID0gMCwgc2cgPSBidWYtPnNnOyBpIDwgYnVmLT5zZ19ucjsgaSsrLCBzZysrKSB7CisJCWlmICgqb2Zmc2V0IDwgc2ctPmxlbmd0aCkKKwkJCWJyZWFrOworCisJCSpvZmZzZXQgLT0gc2ctPmxlbmd0aDsKKwl9CisKKy8vCXByaW50ayhLRVJOX0lORk8gIiVkICVkXG4iLCBpLCAqb2Zmc2V0KTsKKworCXJldHVybiBpOworfQorCisKK3N0YXRpYyBzc2l6ZV90IG1lbWJ1Zl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmYpCit7CisJc3RydWN0IG1lbWJ1ZiAqYnVmID0gKHN0cnVjdCBtZW1idWYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgc2dfb2Zmc2V0LCBzZ19pOworCWludCBjb3VudF9ub3c7CisJaW50IG9mZnNldCA9IDA7CisJaW50IHJjOworCisvLwlwcmludGsoS0VSTl9JTkZPICIlZFxuIiwgKm9mZik7CisKKwlpZiAoKCpvZmYgKyBjb3VudCkgPiBidWYtPnJlYWxfc2l6ZSkgeworCisJCXJjID0gbWVtYnVmX2V4cGFuZChidWYsICgqb2ZmICsgY291bnQpIC0gYnVmLT5yZWFsX3NpemUpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZW1idWZfZXhwYW5kKCkgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXNnX29mZnNldCA9ICpvZmY7CisJc2dfaSA9IGdldF9zZ19pbmRleChidWYsICZzZ19vZmZzZXQpOworCXNnID0gJmJ1Zi0+c2dbc2dfaV07CisKKwl3aGlsZSAoY291bnQpIHsKKworCQljb3VudF9ub3cgPSBtaW4oc2ctPmxlbmd0aCAtIHNnX29mZnNldCwgY291bnQpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcihzZ192aXJ0KHNnKSArIHNnX29mZnNldCwgZGF0YSArIG9mZnNldCwgY291bnRfbm93KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY29weV9mcm9tX3VzZXIoKSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY291bnQgLT0gY291bnRfbm93OworCQlvZmZzZXQgKz0gY291bnRfbm93OworCQlzZysrOworCQlzZ19vZmZzZXQgPSAwOworCX0KKworCSpvZmYgKz0gb2Zmc2V0OworCXJjID0gb2Zmc2V0OworCitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgbG9mZl90IG1lbWJ1Zl9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJc3RydWN0IG1lbWJ1ZiAqYnVmID0gKHN0cnVjdCBtZW1idWYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJbG9mZl90IG5ld19vZmZzZXQ7CisJaW50IHJjOworCisJc3dpdGNoIChvcmlnaW4pIHsKKwljYXNlIDA6IC8qIFNFRUtfU0VUICovCisJCW5ld19vZmZzZXQgPSBvZmZzZXQ7CisJCWJyZWFrOworCisJY2FzZSAxOiAvKiBTRUVLX0NVUiAqLworCQluZXdfb2Zmc2V0ID0gZmlsZS0+Zl9wb3MgKyBvZmZzZXQ7CisJCWJyZWFrOworCisJY2FzZSAyOiAvKiBTRUVLX0VORCAqLworCQluZXdfb2Zmc2V0ID0gYnVmLT5zaXplICsgb2Zmc2V0OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKG5ld19vZmZzZXQgPiBidWYtPnJlYWxfc2l6ZSkgeworCQlyYyA9IG1lbWJ1Zl9leHBhbmQoYnVmLCBuZXdfb2Zmc2V0IC0gYnVmLT5yZWFsX3NpemUpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtZW1idWZfZXhwYW5kKCkgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCWZpbGUtPmZfcG9zID0gbmV3X29mZnNldDsKKworCXJldHVybiBuZXdfb2Zmc2V0OworCitlcnI6CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBsb25nIG1lbWJ1Zl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbWVtYnVmICpidWYgPSAoc3RydWN0IG1lbWJ1ZiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNyX3NjYXR0ZXJfbGlzdCB1c3Jfc2c7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE1FTUJVRl9HRVRfU0NBVFRFUjoKKworCQlpZiAoIWJ1Zi0+bWFwcGVkKQorCQl7CisJCQlyYyA9IG1lbWJ1Zl9tYXAoYnVmKTsKKwkJCWlmIChyYyA8IDApCisJCQkJYnJlYWs7CisJCX0KKworCQltZW1idWZfc3luYyhidWYpOworCisJCXVzcl9zZy5lbnRyaWVzID0gMDsKKwkJZm9yIChpID0gMCwgc2cgPSBidWYtPnNnOyBpIDwgYnVmLT5zZ19ucjsgaSsrLCBzZysrKSB7CisJCQl1c3Jfc2cuYWRkclt1c3Jfc2cuZW50cmllc10gPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCQl1c3Jfc2cucGdfb3JkZXJbdXNyX3NnLmVudHJpZXNdID0gZ2V0X29yZGVyKHNnX2RtYV9sZW4oc2cpKTsKKworLyoKKwkJCXByaW50ayhLRVJOX0lORk8gIiVkICV4ICV4ICV4ICV4ICVkXG4iLCBpLCBzZ192aXJ0KHNnKSwgc2dfcGh5cyhzZyksCisJCQkJCQkJCSBzZ19kbWFfYWRkcmVzcyhzZyksIHVzcl9zZy5wZ19vcmRlclt1c3Jfc2cuZW50cmllc10sCisJCQkJCQkJCSBzZy0+bGVuZ3RoKTsKKyovCisJCQl1c3Jfc2cuZW50cmllcysrOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZ1c3Jfc2csIHNpemVvZihzdHJ1Y3QgdXNyX3NjYXR0ZXJfbGlzdCkpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3B5X3RvX3VzZXIoKSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCXJjID0gLUVGQVVMVDsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5rbm93biBpb2N0bCglZClcbiIsIF9fZnVuY19fLCBjbWQpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworCisKK3N0YXRpYyBpbnQgbWVtYnVmX29wZW4oc3RydWN0IGlub2RlICppbiwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG1lbWJ1ZiAqYnVmOworCisJYnVmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1lbWJ1ZiksIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGttYWxsb2MoKSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYnVmLT5wZ19vcmRlciA9IE1FTUJVRl9ERUZBVUxUX1BHX09SREVSOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnVmOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBtZW1idWZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmluLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbWVtYnVmICpidWYgPSAoc3RydWN0IG1lbWJ1ZiAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCW1lbWJ1Zl91bm1hcChidWYpOworCW1lbWJ1Zl9mcmVlKGJ1Zik7CisKKwlrZnJlZShidWYpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWVtYnVmX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLndyaXRlID0gbWVtYnVmX3dyaXRlLAorCS5sbHNlZWsgPSBtZW1idWZfbGxzZWVrLAorCS51bmxvY2tlZF9pb2N0bCA9IG1lbWJ1Zl9pb2N0bCwKKwkub3BlbiA9IG1lbWJ1Zl9vcGVuLAorCS5yZWxlYXNlID0gbWVtYnVmX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtZW1idWZfaW5pdCh2b2lkKQoreworCWludCByYyA9IDA7CisKKwlyYyA9IGFsbG9jX2NocmRldl9yZWdpb24oJm1lbWJ1Zl9kZXYuZGV2bm8sIE1FTUJVRl9NSU5PUiwgTUVNQlVGX01JTk9SX0NPVU5ULCBNRU1CVUZfRFJWX05BTUUpOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYWxsb2NfY2hyZGV2X3JlZ2lvbigpIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjA7CisJfQorCisJY2Rldl9pbml0KCZtZW1idWZfZGV2LmRldiwgJm1lbWJ1Zl9mb3BzKTsKKwltZW1idWZfZGV2LmRldi5vd25lciA9IFRISVNfTU9EVUxFOworCisJcmMgPSBjZGV2X2FkZCAoJm1lbWJ1Zl9kZXYuZGV2LCBtZW1idWZfZGV2LmRldm5vLCBNRU1CVUZfREVWX0NPVU5UKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNkZXZfYWRkKCkgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogY3JlYXRlZCBtZW1idWYgZGV2aWNlKCVkLCAlZClcbiIsIF9fZnVuY19fLCBNQUpPUihtZW1idWZfZGV2LmRldm5vKSwgTUlOT1IobWVtYnVmX2Rldi5kZXZubykpOworCisJcmV0dXJuIDA7CisKK2VycjE6CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKG1lbWJ1Zl9kZXYuZGV2bm8sIE1FTUJVRl9ERVZfQ09VTlQpOworCitlcnIwOgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1lbWJ1Zl9leGl0KHZvaWQpCit7CisJY2Rldl9kZWwoJm1lbWJ1Zl9kZXYuZGV2KTsKKworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtZW1idWZfZGV2LmRldm5vLCBNRU1CVUZfREVWX0NPVU5UKTsKK30KKworCittb2R1bGVfaW5pdChtZW1idWZfaW5pdCk7Cittb2R1bGVfZXhpdChtZW1idWZfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vbXNwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTFhZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKKyMgTWFrZWZpbGUgQ29tY2VydG8gbmV0d29yayBmaXJtd2FyZSBkcml2ZXJzCitvYmoteSArPSB2ZWQubyBzbWkubyBtc3AubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9tc3AvbXNwLmMgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC9tc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTZhZmZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9tc3AvbXNwLmMKQEAgLTAsMCArMSw1MDggQEAKKy8qCisgKiAgYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9tc3AvbXNwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LDIwMDgsMjAxMiBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2ZpcS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSAidmVkLmgiCisjaW5jbHVkZSAibXNwLmgiCisKKyNkZWZpbmUgTVNQX1JFQURZX0RFTEFZICg4MDAwVUwpIC8qIG1zZWMgKi8KKyNkZWZpbmUgTVNQX1BST0NfU0VDVElPTiAibXNwX3Byb2MiCisjZGVmaW5lIFZPSVBfRU5UUllfU0VDVElPTiAidm9pcF9lbnRyaWVzIgorCisjZGVmaW5lIE1BR0lDX0xFTiAoMHgyNCkKKyNkZWZpbmUgTUFHSUNfT0ZGICgweDIwKQorCisjZGVmaW5lIE1BWF9TQVZFRF9BTEVSVCAoMjApCisKKyNkZWZpbmUgQ09NQ0VSVE9fQVRUUl9TSE9XKF9uYW1lKQkgIFwKKwlzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19zaG93XyMjX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsgXAorCXN0YXRpYyBERVZJQ0VfQVRUUihfbmFtZSwgMDQ0NCwgY29tY2VydG9fc2hvd18jI19uYW1lLCBOVUxMKQorCisjZGVmaW5lIENPTUNFUlRPX0FUVFJfU0VUKF9uYW1lKQkgIFwKKwlzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19zZXRfIyNfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7IFwKKwlzdGF0aWMgREVWSUNFX0FUVFIoX25hbWUsIDAyMDAsIE5VTEwsIGNvbWNlcnRvX3NldF8jI19uYW1lKQorCisjZGVmaW5lIENPTUNFUlRPX0FUVFIoX25hbWUpCSAgXAorCXN0YXRpYyBzc2l6ZV90IGNvbWNlcnRvX3Nob3dfIyNfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOyBcCisJc3RhdGljIHNzaXplX3QgY29tY2VydG9fc2V0XyMjX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOyBcCisJc3RhdGljIERFVklDRV9BVFRSKF9uYW1lLCAwNjQ0LCBjb21jZXJ0b19zaG93XyMjX25hbWUsIGNvbWNlcnRvX3NldF8jI19uYW1lKQorCitDT01DRVJUT19BVFRSX1NIT1cobXNwX2luZm8pOworQ09NQ0VSVE9fQVRUUl9TSE9XKGFsZXJ0X2luZm8pOworQ09NQ0VSVE9fQVRUUl9TSE9XKGFiaV9yZXYpOworCitzdHJ1Y3Qgdm9pcF9maXFfY29kZSB7CisJdTMyIGxlbjsKKwl1OCBkYXRhW01BR0lDX0xFTl07CSAgIC8qIHVzZSBoYXJkY29kZWQgaW5zdHJ1Y3Rpb24sIHNlZSBiZWxvdyAqLworfTsKKworc3RhdGljIGludCB2b2lwX2ZpcV9vcCh2b2lkICpwLCBpbnQgcmVsZWFzZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlxX2hhbmRsZXIgdm9pcF9maXFfaGFuZGxlciA9IHsKKwkubmFtZSA9ICJDb21jZXJ0byBWb0lQb0ZJUSIsCisJLmZpcV9vcCA9IHZvaXBfZmlxX29wLAorCS5kZXZfaWQgPSBOVUxMCit9OworCitzdGF0aWMgdm9pZCAoKnZvaXBfZW50cnkpKHZvaWQpOyAvKiBWb0lQIGNvZGUgZW50cnkgcG9pbnQgKi8KK3N0YXRpYyB2b2lkICgqdm9pcF9leGl0KSh2b2lkKTsgIC8qIFZvSVAgY29kZSBleGl0IHBvaW50ICovCisKK3N0YXRpYyB2b2lkIG1zcF9wb2xsKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3ZvaWQgdXBkYXRlX3BmZV9zdGF0dXNfZm9yX01TUCh2b2lkKTsKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgbXNwX2luZm8gKiBnbG9iYWxfbXNwX2luZm87CisKK3N0cnVjdCBwZmVfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBidWZfYmFzZWFkZHI7CisJdW5zaWduZWQgbG9uZyBjYnVzX2Jhc2VhZGRyOworCXZvaWQgKm93bmVyOworfTsKKworc3RydWN0IHRwZmVfc3RhdHVzIHsKKwl1bnNpZ25lZCBsb25nIHBmZV9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHBmZV92aXJ0OworCXVuc2lnbmVkIGxvbmcgYXhpX3ZpcnQ7CisJdm9pZCAqb3duZXI7Cit9IHBmZV9zdGF0dXM7CisKKy8qIFBGRSBpbmZvcm0gTVNQIGl0IGlzIHN0YXJ0ZWQgYW5kIGl0cyBwYXJhbWV0ZXJzKi8KK2ludCBtc3BfcmVnaXN0ZXJfcGZlKHN0cnVjdCBwZmVfaW5mbyAqcGZlX3N5bmNfaW5mbykKK3sKKwkvKiBzYXZlIFBGRSBzdGF0dXMgKi8KKwlwZmVfc3RhdHVzLnBmZV9zdGF0ZSA9IDE7CisJcGZlX3N0YXR1cy5wZmVfdmlydCA9IHBmZV9zeW5jX2luZm8tPmJ1Zl9iYXNlYWRkcjsKKwlwZmVfc3RhdHVzLmF4aV92aXJ0ID0gcGZlX3N5bmNfaW5mby0+Y2J1c19iYXNlYWRkcjsKKwlwZmVfc3RhdHVzLm93bmVyID0gcGZlX3N5bmNfaW5mby0+b3duZXI7CisKKwlpZiAoZ2xvYmFsX21zcF9pbmZvKSB7CisJCS8qIG1zcCBpcyBydW5uaW5nLCBsb2NrIFBGRSwgdXBkYXRlIFBGRSBzaGFyZWQgbWVtb3J5IGZvciBNU1AgKi8KKwkJdHJ5X21vZHVsZV9nZXQocGZlX3N0YXR1cy5vd25lcik7CisJCXVwZGF0ZV9wZmVfc3RhdHVzX2Zvcl9NU1AoKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobXNwX3JlZ2lzdGVyX3BmZSk7CisKK3ZvaWQgdXBkYXRlX3BmZV9zdGF0dXNfZm9yX01TUCh2b2lkKQoreworCWdsb2JhbF9tc3BfaW5mby0+cGZlX3JlYWR5ID0gcGZlX3N0YXR1cy5wZmVfc3RhdGU7CisJZ2xvYmFsX21zcF9pbmZvLT5wZmVfdmlydCA9IHBmZV9zdGF0dXMucGZlX3ZpcnQ7CisJZ2xvYmFsX21zcF9pbmZvLT5wZmVfcGh5cyA9IENPTUNFUlRPX1BGRV9ERFJfQkFTRTsKKwlnbG9iYWxfbXNwX2luZm8tPmF4aV92aXJ0ID0gcGZlX3N0YXR1cy5heGlfdmlydDsKKwlnbG9iYWxfbXNwX2luZm8tPmF4aV9waHlzID0gQ09NQ0VSVE9fQVhJX0VYUF9CQVNFOworCWdsb2JhbF9tc3BfaW5mby0+bXNwX3ZpcnQgPSBDT01DRVJUT19NU1BfVkFERFI7CisJZ2xvYmFsX21zcF9pbmZvLT5tc3BfcGh5cyA9IENPTUNFUlRPX01TUF9ERFJfQkFTRTsKK30KKworCisvKiBQRkUgaW5mb3JtIE1TUCBpdCBpcyBzdG9wcGVkICovCit2b2lkIG1zcF91bnJlZ2lzdGVyX3BmZSh2b2lkKQoreworCS8qIHNhdmUgUEZFIHN0YXR1cyAqLworCXBmZV9zdGF0dXMucGZlX3N0YXRlID0gMDsKKworCWlmIChnbG9iYWxfbXNwX2luZm8pIHsKKwkJdXBkYXRlX3BmZV9zdGF0dXNfZm9yX01TUCgpOworCX0KK30KK0VYUE9SVF9TWU1CT0wobXNwX3VucmVnaXN0ZXJfcGZlKTsKKworc3RhdGljIGludCB2b2lwX2ZpcV9vcCh2b2lkICpwLCBpbnQgcmVsZWFzZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBsb2FkX2VsZgorICoKKyAqCisgKi8KK3N0YXRpYyBpbnQgbG9hZF9lbGYoc3RydWN0IF9jb2RlX2luZm8gKmNvZGVfaW5mbykKK3sKKwlFbGYzMl9FaGRyICp0aGlzX2VsZl9oZWFkZXIgPSAoRWxmMzJfRWhkciAqKShjb2RlX2luZm8tPmNvZGUpOworCUVsZjMyX0hhbGYgbnVtYmVyX29mX3NlY3Rpb24gPSB0aGlzX2VsZl9oZWFkZXItPmVfc2hudW07CisJLyogcG9pbnRlciB0byB0aGUgc2VjdGlvbiBoZWFkZXIgKi8KKwlFbGYzMl9TaGRyICp0aGlzX3NlY3Rpb25faGVhZGVycyA9IChFbGYzMl9TaGRyICopKGNvZGVfaW5mby0+Y29kZSArIHRoaXNfZWxmX2hlYWRlci0+ZV9zaG9mZik7CisJRWxmMzJfT2ZmIHN0cmluZ19zZWN0aW9uX29mZnNldCA9IHRoaXNfc2VjdGlvbl9oZWFkZXJzW3RoaXNfZWxmX2hlYWRlci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0OworCWNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgaSA9IDA7CisKKwlpZiAoIW51bWJlcl9vZl9zZWN0aW9uKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXJyb3IgbG9hZGluZyBlbGY6IG51bWJlciBvZiBzZWN0aW9uIGlzIHplcm9cbiIpOworCQlyYyA9IC0xOworCisJCWdvdG8gb3V0OworCX0KKworCS8qIHBhcnNlIGFsbCBzZWN0aW9ucyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2Zfc2VjdGlvbjsgaSsrKSB7CisJCXNlY3Rpb25fbmFtZSA9IGNvZGVfaW5mby0+Y29kZSAgKyBzdHJpbmdfc2VjdGlvbl9vZmZzZXQgKyB0aGlzX3NlY3Rpb25faGVhZGVyc1tpXS5zaF9uYW1lOworCisJCWlmICghc3RybmNtcChzZWN0aW9uX25hbWUsIE1TUF9QUk9DX1NFQ1RJT04sIHN0cmxlbihNU1BfUFJPQ19TRUNUSU9OKSkpIHsKKwkJCWNvZGVfaW5mby0+cHJvY19hZGRyID0gdGhpc19zZWN0aW9uX2hlYWRlcnNbaV0uc2hfYWRkcjsKKwkJfQorCisJCWlmICghc3RybmNtcChzZWN0aW9uX25hbWUsIFZPSVBfRU5UUllfU0VDVElPTiwgc3RybGVuKFZPSVBfRU5UUllfU0VDVElPTikpKSB7CisJCQljb2RlX2luZm8tPnN5bV9hZGRyID0gdGhpc19zZWN0aW9uX2hlYWRlcnNbaV0uc2hfYWRkcjsKKwkJfQorCisJCS8qIHJldHJpZXZlIHRoZSBzZWN0aW9uIG5hbWUgZnJvbSB0aGUgRUxGIGJ1ZmZlciAqLworCisJCWlmICgodGhpc19zZWN0aW9uX2hlYWRlcnNbaV0uc2hfZmxhZ3MgIT0gU0hGX01JUFNfQUREUikKKwkJICAgICYmIHRoaXNfc2VjdGlvbl9oZWFkZXJzW2ldLnNoX2ZsYWdzCisJCQkmJiBzdHJuY21wKHNlY3Rpb25fbmFtZSwgIkNIRUNLU1VNIiwgOCkpCisJCXsKKwkJCS8qIHJldHJpZXZlIHRoZSBzZWN0aW9uIG5hbWUgZnJvbSB0aGUgRUxGIGJ1ZmZlciAqLworCisJCQlpZiAoKHRoaXNfc2VjdGlvbl9oZWFkZXJzW2ldLnNoX3R5cGUgJiAzKSA9PSBTSFRfUFJPR0JJVFMpIHsKKwkJCQltZW1jcHkoCisJCQkJCSh2b2lkICopdGhpc19zZWN0aW9uX2hlYWRlcnNbaV0uc2hfYWRkciwKKwkJCQkJKHZvaWQqKShjb2RlX2luZm8tPmNvZGUgKyB0aGlzX3NlY3Rpb25faGVhZGVyc1tpXS5zaF9vZmZzZXQpLAorCQkJCQl0aGlzX3NlY3Rpb25faGVhZGVyc1tpXS5zaF9zaXplKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChjb2RlX2luZm8tPnByb2NfYWRkciAmJiBjb2RlX2luZm8tPnN5bV9hZGRyKSB7CisJCWNvZGVfaW5mby0+cHJvZ3JhbV9hZGRyID0gdGhpc19lbGZfaGVhZGVyLT5lX2VudHJ5OworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXJyb3IgbG9hZGluZyBlbGY6IGNvdWxkIG5vdCBmaW5kICVzIG9yICVzXG4iLCBNU1BfUFJPQ19TRUNUSU9OLCBWT0lQX0VOVFJZX1NFQ1RJT04pOworCisJCXJjID0gLTE7CisJfQorCitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1zcF9yZWFkeShzdHJ1Y3QgY29tY2VydG9fbXNwICptc3AsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwkvKiB0aW1lb3V0IGlzIHBhc3NlZCBpbiBtcywgc2V0IGl0IGluIGppZmZpZXMgKi8KKwl0aW1lb3V0ID0gamlmZmllcyArICh0aW1lb3V0ICogSFopIC8gMTAwMDsKKworCXdoaWxlICghbXNwLT5pbmZvIHx8ICFtc3AtPmluZm8tPnJlYWR5KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSAmJiAoIW1zcC0+aW5mbyB8fCAhbXNwLT5pbmZvLT5yZWFkeSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZXJyb3I6IGNvdWxkIG5vdCByZWNlaXZlIGFjayBmcm9tIFZvSVBcbiIpOworCQkJbXNwLT5pbmZvID0gTlVMTDsKKworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKKworCitlcnI6CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBtc3Bfc3RhcnQoc3RydWN0IGNvbWNlcnRvX21zcCAqbXNwKQoreworCW1zcC0+c3RhdGUgPSBNU1BfU1RBUlRJTkc7CisJbXNwLT5hbGVydF9zZWVuID0gMDsKKworCWlmICghbXNwX3JlYWR5KG1zcCwgTVNQX1JFQURZX0RFTEFZKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZvSVAgc3RhcnRpbmcgZmFpbGVkXG4iKTsKKworCQlnb3RvIGVycjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJWb0lQIGhhcyBiZWVuIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKworCS8qIHN0YXJ0IGhlYXJ0IGJlYXQgdGltZXIgKi8KKwlpbml0X3RpbWVyKCZtc3AtPnRpbWVyX2V4cGlyZSk7CisJbXNwLT50aW1lcl9leHBpcmUuZnVuY3Rpb24gPSBtc3BfcG9sbDsKKwltc3AtPnRpbWVyX2V4cGlyZS5leHBpcmVzID0gamlmZmllcyArIDEgKiBIWjsgLyogMXNlYyAqLworCW1zcC0+dGltZXJfZXhwaXJlLmRhdGEgPSAodW5zaWduZWQgbG9uZyltc3A7CisJYWRkX3RpbWVyKCZtc3AtPnRpbWVyX2V4cGlyZSk7CisJbXNwLT5zdGF0ZSA9IE1TUF9SVU5OSU5HOworCWdsb2JhbF9tc3BfaW5mbyA9IG1zcC0+aW5mbzsKKworCWlmIChwZmVfc3RhdHVzLnBmZV9zdGF0ZSA9PSAxKSB7CisJCXRyeV9tb2R1bGVfZ2V0KHBmZV9zdGF0dXMub3duZXIpOworCQl1cGRhdGVfcGZlX3N0YXR1c19mb3JfTVNQKCk7CisJfQorCisJcmV0dXJuIDA7CisKKworZXJyOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgbXNwX2FsZXJ0KHN0cnVjdCBjb21jZXJ0b19tc3AgKm1zcCkKK3sKKwlzdHJ1Y3QgYWxlcnRfdHlwZSAqYWxlcnQgPSBOVUxMOworCWludCBpYWxlcnQgPSAwOworCisJaWYgKCFtc3AtPmluZm8pIHsKKwkJcmV0dXJuOworCX0KKworCXdoaWxlIChtc3AtPmluZm8tPmFsZXJ0X251bWJlciA+IG1zcC0+YWxlcnRfc2VlbikgeworCQlpZiAobXNwLT5hbGVydF9zZWVuID49IE1BWF9TQVZFRF9BTEVSVCkgeworCQkJaWFsZXJ0ID0gTUFYX1NBVkVEX0FMRVJUIC0gMTsKKwkJfSBlbHNlIHsKKwkJCWlhbGVydCA9IG1zcC0+YWxlcnRfc2VlbjsKKwkJfQorCisJCWFsZXJ0ID0gKHN0cnVjdCBhbGVydF90eXBlICopKG1zcC0+aW5mby0+c2F2ZV9hbGVydCkgKyBpYWxlcnQ7CisJCW1zcC0+YWxlcnRfc2VlbisrOworCisJCXByaW50ayhLRVJOX0VSUiAiVm9JUCBhbGVydDogY3VycmVudCBudW1iZXIgLyB0b3RhbCByZWNlaXZlZCA9ICVsdS8lbHVcbiIsIG1zcC0+YWxlcnRfc2VlbiwgbXNwLT5pbmZvLT5hbGVydF9udW1iZXIpOworCQlwcmludGsoS0VSTl9FUlIgIlx0dHlwZTogMHglMDJ4XG4iLCBhbGVydC0+dHlwZSAmIDB4ZmYpOworCQlwcmludGsoS0VSTl9FUlIgIlx0Y2hhbm5lbDogJWh1XG4iLCBhbGVydC0+Y2hhbm5lbCk7CisJCXByaW50ayhLRVJOX0VSUiAiXHRsaW5rIHJlZ2lzdGVyOiAweCUwOHhcbiIsIGFsZXJ0LT5hYm9ydF9scik7CisJCXByaW50ayhLRVJOX0VSUiAiXHR1bmlxdWUgSUQ6IDB4JTA0eFxuIiwgYWxlcnQtPnVuaXF1ZV9pZCk7CisJCXByaW50ayhLRVJOX0VSUiAiXHRhY3Rpb246IDB4JTA0eFxuIiwgYWxlcnQtPmFjdGlvbik7CisJCXByaW50ayhLRVJOX0VSUiAiXHRsb2NhbHRpbWU6IDB4JTA4eFxuIiwgYWxlcnQtPmxvY2FsdGltZSk7CisJCXByaW50ayhLRVJOX0VSUiAiXHR2YWwxOiAweCUwOHhcbiIsIGFsZXJ0LT52YWwxKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJcdHZhbDI6IDB4JTA4eFxuIiwgYWxlcnQtPnZhbDIpOworCX0KK30KKworc3RhdGljIHZvaWQgbXNwX3BvbGwodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGNvbWNlcnRvX21zcCAqbXNwID0gKHN0cnVjdCBjb21jZXJ0b19tc3AgKilhcmc7CisKKwlzd2l0Y2ggKG1zcC0+c3RhdGUpIHsKKwkJY2FzZSBNU1BfUkVTRVRUSU5HOgorCQljYXNlIE1TUF9SRVNFVDoKKwkJY2FzZSBNU1BfU1RBUlRJTkc6CisJCWNhc2UgTVNQX0NSQVNIRUQ6CisJCQlicmVhazsKKwkJY2FzZSBNU1BfUlVOTklORzogeworCQkJLyogY2hlY2sgZm9yIGFsZXJ0cyAqLworCQkJbXNwX2FsZXJ0KG1zcCk7CisKKwkJCWlmICghbXNwLT5pbmZvLT5oZWFydGJlYXQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlZvSVAgaGVhcnQgYmVhdCBmYWlsdXJlXG4iKTsKKwkJCQltc3AtPnN0YXRlID0gTVNQX0NSQVNIRUQ7CisJCQl9CisKKwkJCW1zcC0+aW5mby0+aGVhcnRiZWF0ID0gMDsKKwkJfSBicmVhazsKKwl9CisKKwltc3AtPnRpbWVyX2V4cGlyZS5leHBpcmVzID0gamlmZmllcyArIDEgKiBIWjsgLyogMXNlYyAqLworCWFkZF90aW1lcigmbXNwLT50aW1lcl9leHBpcmUpOworfQorCitpbnQgY29tY2VydG9fZG93bmxvYWRfdG9fbXNwKHN0cnVjdCBjb21jZXJ0b19tc3AgKm1zcCkKK3sKKwlzdHJ1Y3QgX2NvZGVfaW5mbyAqY29kZV9pbmZvID0gJm1zcC0+Y29kZV9pbmZvOworCXN0cnVjdCB2b2lwX3N5bSAqdm9pcF9zeW07CisJc3RydWN0IHZvaXBfZmlxX2NvZGUgdm9pcF9maXE7CisJdm9pZCAoKnJ0eGNfaGFuZGxlcikodm9pZCk7IC8qIEZJUSBoYW5kbGVyIGNvZGUgZW50cnkgcG9pbnQgKi8KKwlpbnQgcmMgPSAwOworCisJaWYgKGxvYWRfZWxmKGNvZGVfaW5mbykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWb0lQIGRvd25sb2FkIGZhaWxlZFxuIik7CisJCXJjID0gLUVJTlZBTDsKKworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBzYXZlIG1zcCBpbmZvIHBvaW50ZXIgKi8KKwltc3AtPmluZm8gPSAoc3RydWN0IG1zcF9pbmZvICopbXNwLT5jb2RlX2luZm8ucHJvY19hZGRyOworCXZvaXBfc3ltID0gKHN0cnVjdCB2b2lwX3N5bSAqKW1zcC0+Y29kZV9pbmZvLnN5bV9hZGRyOworCisJcnR4Y19oYW5kbGVyID0gdm9pcF9zeW0tPnJ0eGNfaGFuZGxlcjsKKwl2b2lwX2VudHJ5ID0gdm9pcF9zeW0tPnZvaXBfZW50cnk7CisJdm9pcF9leGl0ID0gdm9pcF9zeW0tPnZvaXBfZXhpdDsKKworCWlmICghdm9pcF9lbnRyeSB8fCAhdm9pcF9leGl0IHx8ICFydHhjX2hhbmRsZXIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgZXh0cmFjdCBzeW1ib2xcbiIpOworCQlyYyA9IC1FSU5WQUw7CisKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGNsYWltX2ZpcSgmdm9pcF9maXFfaGFuZGxlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3QgY2xhaW0gRklRXG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCisJCWdvdG8gZXJyOworCX0gZWxzZSB7CisJCS8qIGNvcHkgY29kZSB0byBJVlQgKi8KKwkJdW5zaWduZWQgaW50IGNvZGUgPSAweGU1OWZmMDE4OyAvKiBMRFIgcGMsIFtwYywgIzB4MjBdOyBoZXJlIDB4MjAgPT0gTUFHSUNfT0ZGLCBkbyBub3QgY2hhbmdlIGl0ICovCisKKwkJdm9pcF9maXEubGVuID0gTUFHSUNfTEVOOworCQltZW1jcHkodm9pcF9maXEuZGF0YSArIE1BR0lDX09GRiwgJnJ0eGNfaGFuZGxlciwgc2l6ZW9mKHJ0eGNfaGFuZGxlcikpOworCQltZW1jcHkodm9pcF9maXEuZGF0YSwgJmNvZGUsIHNpemVvZihjb2RlKSk7CisKKwkJLyogY29weSBjb2RlIHRvIElWVCAqLworCQlzZXRfZmlxX2hhbmRsZXIoJnZvaXBfZmlxLmRhdGFbMF0sIHZvaXBfZmlxLmxlbik7CisJfQorCitlcnI6CisJcmV0dXJuIHJjOworfQorCitpbnQgY29tY2VydG9fc3RhcnRfbXNwKHN0cnVjdCBjb21jZXJ0b19tc3AgKm1zcCkKK3sKKworI2lmZGVmIENPTkZJR19TTVAKKwlzdHJ1Y3QgY3B1bWFzayBpbl9tYXNrOworCWludCBjcHUgPSAwOworCWludCBwaWQgPSAwOworCisJLyogc3RhcnQgdm9pcCBvbiBjcHUgd2hlcmUgRklRIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCAqLworCWNwdW1hc2tfc2V0X2NwdShjcHUsICZpbl9tYXNrKTsKKwlzY2hlZF9zZXRhZmZpbml0eShwaWQsICZpbl9tYXNrKTsKKyNlbmRpZiAgLyogQ09ORklHX1NNUCAqLworCisJLyogZ2l2ZSBjb250cm9sIHRvIE1TUCAqLworCXZvaXBfZW50cnkoKTsKKworCXJldHVybiBtc3Bfc3RhcnQobXNwKTsKK30KKwordm9pZCBjb21jZXJ0b19zdG9wX21zcChzdHJ1Y3QgY29tY2VydG9fbXNwICptc3ApCit7CisJLyogc3RvcCBNU1AgZ2VudGx5ICovCisJdm9pcF9leGl0KCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJWb0lQIGhhcyBiZWVuIHN0b3BwZWRcbiIpOworCisJcmVsZWFzZV9maXEoJnZvaXBfZmlxX2hhbmRsZXIpOworCisJbXNwLT5zdGF0ZSA9IE1TUF9SRVNFVDsKKwlkZWxfdGltZXIoJm1zcC0+dGltZXJfZXhwaXJlKTsKKwltc3AtPmluZm8gPSBOVUxMOworCisJaWYgKGdsb2JhbF9tc3BfaW5mbyAmJiAocGZlX3N0YXR1cy5wZmVfc3RhdGUgPT0gMSkpIHsKKwkJbW9kdWxlX3B1dChwZmVfc3RhdHVzLm93bmVyKTsKKwl9CisKKwlnbG9iYWxfbXNwX2luZm8gPSAwOworfQorCitzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19zaG93X21zcF9pbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdmVkX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY29tY2VydG9fbXNwICptc3AgPSAmcHJpdi0+bXNwOworCWludCBsZW4gPSAwOworCisJaWYgKCFtc3AtPmluZm8pIHsKKwkJcmV0dXJuIHNwcmludGYoYnVmICsgbGVuLCAibm8gVm9JUCBpbmZvIGF2YWlsYWJsZVxuIik7CisJfQorCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiQUJJIHZlcnNpb246ICVsdVxuIiwgbXNwLT5pbmZvLT5hYmlfcmV2KTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJWb0lQIHZlcnNpb246ICVzXG4iLCBtc3AtPmluZm8tPm1zcF92ZXJzaW9uKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJEU1AgdmVyc2lvbjogJXNcbiIsIG1zcC0+aW5mby0+c3B1X3ZlcnNpb24pOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlZvSVAgZnJlcTogJWQgTWh6XG4iLCBtc3AtPmluZm8tPkFSTWZyZXEpOworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIkFNQkEgYnVzIGZyZXE6ICVkIE1IelxuIiwgbXNwLT5pbmZvLT5BTUJBZnJlcSk7CisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiQWxlcnQgbnVtYmVyOiAlbHVcbiIsIG1zcC0+YWxlcnRfc2Vlbik7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19zaG93X2FsZXJ0X2luZm8oc3RydWN0IGRldmljZSAqZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZlZF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNvbWNlcnRvX21zcCAqbXNwID0gJnByaXYtPm1zcDsKKwlzdHJ1Y3QgYWxlcnRfdHlwZSAqYWxlcnQ7CisJdW5zaWduZWQgbG9uZyBpYWxlcnQgPSAwOworCWludCBsZW4gPSAwOworCisJaWYgKCAhbXNwLT5pbmZvIHx8ICFtc3AtPmFsZXJ0X3NlZW4gKSB7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiArIGxlbiwgIm5vIFZvSVAgYWxlcnQgaW5mbyBhdmFpbGFibGVcbiIpOworCX0KKworCWlmIChtc3AtPmFsZXJ0X3NlZW4gPiBNQVhfU0FWRURfQUxFUlQpIHsKKwkJaWFsZXJ0ID0gTUFYX1NBVkVEX0FMRVJUOworCX0gZWxzZSB7CisJCWlhbGVydCA9IG1zcC0+YWxlcnRfc2VlbjsKKwl9CisKKwlmb3IgKDsgaWFsZXJ0ID4gMDsgaWFsZXJ0LS0pIHsKKwkJYWxlcnQgPSAoc3RydWN0IGFsZXJ0X3R5cGUgKikobXNwLT5pbmZvLT5zYXZlX2FsZXJ0KSArIGlhbGVydCAtIDE7CisKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiYWxlcnQgTm86ICVsdVxuIiwgKChpYWxlcnQgPT0gTUFYX1NBVkVEX0FMRVJUKSA/IG1zcC0+YWxlcnRfc2VlbiA6IGlhbGVydCkpOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcdHR5cGU6IDB4JTAyWFxuIiwgKGFsZXJ0LT50eXBlICYgMHhmZikpOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcdGNoYW5uZWw6ICVodVxuIiwgYWxlcnQtPmNoYW5uZWwpOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcdHVuaXF1ZSBJRDogMHglMDRYXG4iLCBhbGVydC0+dW5pcXVlX2lkKTsKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXHRhY3Rpb246IDB4JTA0WFxuIiwgYWxlcnQtPmFjdGlvbik7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlx0bGluayByZWdpc3RlcjogMHglMDhYXG4iLCBhbGVydC0+YWJvcnRfbHIpOworCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcdGxvY2FsdGltZTogMHglMDhYXG4iLCBhbGVydC0+bG9jYWx0aW1lKTsKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXHR2YWwxOiAweCUwOFhcbiIsIGFsZXJ0LT52YWwxKTsKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiXHR2YWwyOiAweCUwOFhcbiIsIGFsZXJ0LT52YWwyKTsKKworCQkvKiBNYWtlIHN1cmUgd2UgYXJlIG5vdCBnb2luZyBvdXQgb2YgYnVmZmVyLiBOdW1iZXIgdG8gYWRkIGlzCisJCSAgIGVtcGlyaWNhbCwgc28sIGNoYW5nZSBidWYgYWJvdmUgLSBjaGFuZ2UgbnVtYmVyIGJlbG93ICovCisJCWlmIChsZW4gKyAxNzUgPiBQQUdFX1NJWkUpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgY29tY2VydG9fc2hvd19hYmlfcmV2KHN0cnVjdCBkZXZpY2UgKmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHZlZF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNvbWNlcnRvX21zcCAqbXNwID0gJnByaXYtPm1zcDsKKwlpbnQgbGVuID0gMDsKKworCWlmICghbXNwLT5pbmZvKSB7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiArIGxlbiwgIm5vIFZvSVAgaW5mbyBhdmFpbGFibGVcbiIpOworCX0KKworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVsdVxuIiwgbXNwLT5pbmZvLT5hYmlfcmV2KTsKKworCXJldHVybiBsZW47Cit9CisKK2ludCBtc3BfaW5pdF9zeXNmcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX21zcF9pbmZvKQorCSAgICB8fCBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2FsZXJ0X2luZm8pCisJICAgIHx8IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfYWJpX3JldikpCisJeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBjcmVhdGUgVm9JUCBzeXNmcyBmaWxlc1xuIik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9tc3AvbXNwLmggYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC9tc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjFiMWYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9tc3AvbXNwLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiAgYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9tc3AvbXNwLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2LDIwMTIgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9DT01DRVJUT19NU1BfSAorI2RlZmluZSBfQ09NQ0VSVE9fTVNQX0gKKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKworI2RlZmluZSBTSEZfTUlQU19BRERSICgweDQwMDAwMDAwKQorCitlbnVtIG1zcF9zdGF0ZSB7CisJTVNQX1JFU0VUVElORyA9IDAsCisJTVNQX1JFU0VULAorCU1TUF9TVEFSVElORywKKwlNU1BfUlVOTklORywKKwlNU1BfQ1JBU0hFRAorfTsKKworc3RydWN0IG1zcF9zdGFja19mcmFtZSB7CisJdW5zaWduZWQgaW50IHIwOworCXVuc2lnbmVkIGludCByMTsKKwl1bnNpZ25lZCBpbnQgcjI7CisJdW5zaWduZWQgaW50IHIzOworCXVuc2lnbmVkIGludCByNDsKKwl1bnNpZ25lZCBpbnQgcjU7CisJdW5zaWduZWQgaW50IHI2OworCXVuc2lnbmVkIGludCByNzsKKwl1bnNpZ25lZCBpbnQgcjg7CisJdW5zaWduZWQgaW50IHI5OworCXVuc2lnbmVkIGludCByMTA7CisJdW5zaWduZWQgaW50IHIxMTsKKwl1bnNpZ25lZCBpbnQgcjEyOworCXVuc2lnbmVkIGludCBzcDsKKwl1bnNpZ25lZCBpbnQgbHI7CisJdW5zaWduZWQgaW50IHBjOworfTsKKworc3RydWN0IGFsZXJ0X3R5cGUgeworCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJdW5zaWduZWQgc2hvcnQgY2hhbm5lbDsKKwl1bnNpZ25lZCBzaG9ydCB1bmlxdWVfaWQ7CisJdW5zaWduZWQgc2hvcnQgYWN0aW9uOworCXVuc2lnbmVkIGludCBhYm9ydF9scjsKKwl1bnNpZ25lZCBpbnQgdmFsMTsKKwl1bnNpZ25lZCBpbnQgdmFsMjsKKwl1bnNpZ25lZCBpbnQgbG9jYWx0aW1lOworfTsKKworc3RydWN0IF9jb2RlX2luZm8geworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvZGU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJdW5zaWduZWQgbG9uZyBjaGVja3N1bV9wcm9ncmFtX2FkZHI7CisJdW5zaWduZWQgbG9uZyBwcm9ncmFtX2FkZHI7CisJdW5zaWduZWQgbG9uZyBwcm9jX2FkZHI7CisJdW5zaWduZWQgbG9uZyBzeW1fYWRkcjsKKwl1bnNpZ25lZCBsb25nIGNoZWNrc3VtOworfTsKKworc3RydWN0IG1zcF9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGFiaV9yZXY7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBsb2NrOworCXVuc2lnbmVkIGxvbmcgZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgcmV2aXNpb247CisJY2hhciBtc3BfdmVyc2lvblszMl07CisJY2hhciBzcHVfdmVyc2lvblsxNl07CisJLyogICovCisJdW5zaWduZWQgbG9uZyBDU1B0b01TUFF1ZXVlUGh5YWRkcjsKKwl1bnNpZ25lZCBsb25nIE1TUHRvQ1NQUXVldWVQaHlhZGRyOworCXVuc2lnbmVkIGxvbmcgU01SWENTUGh5YWRkcjsKKwl1bnNpZ25lZCBsb25nIFNNVFhDU1BoeWFkZHI7CisJdW5zaWduZWQgbG9uZyBTUERSVl9BQ1BfTVNQX1BoeWFkZHI7CisJLyogICovCisJdW5zaWduZWQgbG9uZyBFUkFNc2l6ZTsKKwl1bnNpZ25lZCBsb25nIEFSQU1zaXplOworCXVuc2lnbmVkIGxvbmcgSVJBTXNpemU7CisJdW5zaWduZWQgc2hvcnQgQVJNZnJlcTsKKwl1bnNpZ25lZCBzaG9ydCBBTUJBZnJlcTsKKwl1bnNpZ25lZCBzaG9ydCBTUFVmcmVxOworCXVuc2lnbmVkIGxvbmcgdm9pcF9pcGFkZHI7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBJUG9mZmxvYWQ7CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyByZWFkeTsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGhlYXJ0YmVhdDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGFsZXJ0X251bWJlcjsKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGFsZXJ0X2ZyYW1lOworCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgc2F2ZV9hbGVydDsKKwl1bnNpZ25lZCBsb25nIHBmZV9yZWFkeTsKKwl1bnNpZ25lZCBsb25nIHBmZV92aXJ0OworCXVuc2lnbmVkIGxvbmcgcGZlX3BoeXM7CisJdW5zaWduZWQgbG9uZyBheGlfdmlydDsKKwl1bnNpZ25lZCBsb25nIGF4aV9waHlzOworCXVuc2lnbmVkIGxvbmcgbXNwX3ZpcnQ7CisJdW5zaWduZWQgbG9uZyBtc3BfcGh5czsKK307CisKK3N0cnVjdCB2b2lwX3N5bSB7CisJdm9pZCAoKnJ0eGNfaGFuZGxlcikodm9pZCk7CisJdm9pZCAoKnZvaXBfZW50cnkpKHZvaWQpOworCXZvaWQgKCp2b2lwX2V4aXQpKHZvaWQpOworCXZvaWQgKCp2b2lwX2NyYXNoKSh2b2lkICopOworfTsKKworc3RydWN0IGNvbWNlcnRvX21zcCB7CisJdW5zaWduZWQgbG9uZyBhbGVydF9zZWVuOworCXVuc2lnbmVkIGxvbmcgbGFzdF90aWNrOworCWludCBzdGF0ZTsKKworCXZvbGF0aWxlIHN0cnVjdCBtc3BfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgX2NvZGVfaW5mbyBjb2RlX2luZm87CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBtc3BfbGlzdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcl9leHBpcmU7CisJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnN5c2N0bF9oZWFkZXI7CisJdm9pZCogX19pb21lbSB2ZWN0b3JzX2Jhc2U7Cit9OworCitpbnQgY29tY2VydG9fZG93bmxvYWRfdG9fbXNwKHN0cnVjdCBjb21jZXJ0b19tc3AgKm1zcCk7CitpbnQgY29tY2VydG9fc3RhcnRfbXNwKHN0cnVjdCBjb21jZXJ0b19tc3AgKm1zcCk7Cit2b2lkIGNvbWNlcnRvX3N0b3BfbXNwKHN0cnVjdCBjb21jZXJ0b19tc3AgKm1zcCk7CitpbnQgbXNwX2luaXRfc3lzZnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKyNlbmRpZiAgLyogX0NPTUNFUlRPX01TUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC9zbWkuYyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vbXNwL3NtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMzgyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC9zbWkuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogIGFyY2gvYXJtL21hY2gtY29tY2VydG8vbXNwL3NtaS5oCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMiBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInNtaS5oIgorI2luY2x1ZGUgIm1zcC5oIgorCit2b2lkICpzbWlfYWxsb2NfcGFydChzdHJ1Y3QgZmFzdHBhcnQgKmZwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXZvaWQgKnZhZGRyID0gTlVMTDsKKworCWZsYWdzID0gbXNwX2xvY2tfZnJxc2F2ZSgpOworCisJaWYgKGZwLT5mcmVlYmxrKSB7CisJCXZhZGRyID0gZnAtPmZyZWVibGs7CisJCWZwLT5mcmVlYmxrID0gKHUzMiAqIHZvbGF0aWxlKV9fcmF3X3JlYWRsKHZhZGRyKTsKKwl9CisKKwltc3BfdW5sb2NrX2ZycXJlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHZhZGRyOworfQorCit2b2lkIHNtaV9mcmVlX3BhcnQoc3RydWN0IGZhc3RwYXJ0ICpmcCwgdm9pZCAqdmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlmbGFncyA9IG1zcF9sb2NrX2ZycXNhdmUoKTsKKworCV9fcmF3X3dyaXRlbCgodW5zaWduZWQgbG9uZylmcC0+ZnJlZWJsaywgKHVuc2lnbmVkIGxvbmcpdmFkZHIpOworCWZwLT5mcmVlYmxrID0gdmFkZHI7CisKKwltc3BfdW5sb2NrX2ZycXJlc3RvcmUoZmxhZ3MpOworfQorCitzdHJ1Y3QgZmFzdHF1ZXVlICpzbWlfcXVldWVfaW5pdChzdHJ1Y3Qgc21pcXVldWUgKnBzbWlxLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKCpnZW5fbXNwX2lycSkodm9pZCkpCit7CisgICAgICAgIHN0cnVjdCBmYXN0cXVldWUgKmZwcSA9IChzdHJ1Y3QgZmFzdHF1ZXVlICopYWRkcjsKKworICAgICAgICBpZiAoZnBxKSB7CisgICAgICAgICAgICAgICAgcHNtaXEtPmZwcSA9IGZwcTsKKyAgICAgICAgICAgICAgICBwc21pcS0+c3RvcmFnZSA9IGZwcS0+c3RvcmFnZTsKKyAgICAgICAgICAgICAgICBwc21pcS0+Z2VuX21zcF9pcnEgPSBnZW5fbXNwX2lycTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmcHE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC9zbWkuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vbXNwL3NtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWIyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC9zbWkuaApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqICBhcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC9zbWkuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9DT01DRVJUT19TTUlfSAorI2RlZmluZSBfQ09NQ0VSVE9fU01JX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL3NlbWEuaD4KKworI2lmbmRlZiBDT01DRVJUT19JUlFfU0VUCisjZGVmaW5lIERJU1RSX0lOVF9TRVRfUEVORElORyAoQ09NQ0VSVE9fR0lDX0RJU1RfQkFTRSArIDB4MjAwKQorI2RlZmluZSBESVNUUl9DTEVBUl9QRU5ESU5HIChDT01DRVJUT19HSUNfRElTVF9CQVNFICsgMHgyODApCisjZGVmaW5lIENQVV9FTkRfT0ZfSU5UIChDT01DRVJUT19HSUNfQ1BVX0JBU0UgKyAweDEwKQorI2RlZmluZSBjb21jZXJ0b19zb2Z0aXJxX3NldChpcnEpCSAgXAorCSgqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopRElTVFJfSU5UX1NFVF9QRU5ESU5HICsgKChpcnEpID4+IDUpKSA9IDEgPDwgKChpcnEpICYgMHgxZikpCisjZGVmaW5lIGNvbWNlcnRvX3NvZnRpcnFfY2hlY2soaXJxKQkgIFwKKwkoKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilESVNUUl9JTlRfU0VUX1BFTkRJTkcgKyAoKGlycSkgPj4gNSkpID4+ICgoaXJxKSAmIDB4MWYpKSAmIDB4MDEpCisjZGVmaW5lIGNvbWNlcnRvX2lycV9hY2soaXJxKQkgIFwKKwkoKiAoKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgRElTVFJfQ0xFQVJfUEVORElORyArICgoaXJxKSA+PiA1KSkgPSAxIDw8ICgoaXJxKSAlIDMyKSkKKworLy8jZGVmaW5lIGNvbWNlcnRvX2lycV9hY2soaXJxKSAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopKENQVV9FTkRfT0ZfSU5UKSA9IGlycSkKKworI2VuZGlmICAvKiBDMjAwMCAqLworCisvKiBzaGFyZWQgc3RydWN0dXJlIChNU1AgdXNlcyB0aGUgc2FtZSB0eXBlKSAqLworc3RydWN0IGZhc3RxdWV1ZSB7CisJdTMyICpzdG9yYWdlOworCXUzMiBzZW1hOworCXZvbGF0aWxlIHUxNiBsb2NrOworCXZvbGF0aWxlIHUxNiBnZXQ7CisJdm9sYXRpbGUgdTE2IHB1dDsKKwl1MTYgc2l6ZTsKK307CisKKy8qIHByaXZhdGUgc3RydWN0dXJlIChDU1Agb25seSkgKi8KK3N0cnVjdCBzbWlxdWV1ZSB7CisJdTMyICpzdG9yYWdlOwkJCSAgLyogdmlydHVhbCBhZGRyZXNzIG9mIGZwcS0+c3RvcmFnZSAqLworCXN0cnVjdCBmYXN0cXVldWUgKmZwcTsJICAvKiBxdWV1ZSBwb2ludGVyICovCisJdm9pZCAoKmdlbl9tc3BfaXJxKSh2b2lkKTsgLyogQ1NQIHRvIE1TUCBnZW5lcmF0ZSBpbnRlcnJ1cHQgZnVuY3Rpb24gKi8KK307CisKK3N0cnVjdCBmYXN0cGFydCB7CisgICAgICAgIHZvbGF0aWxlIHU4IGxvY2s7CisgICAgICAgIHU4IHJlc2VydmVkMTsKKyAgICAgICAgdTMyICogdm9sYXRpbGUgZnJlZWJsazsKKyAgICAgICAgdTMyICpzdG9yYWdlOworICAgICAgICB1MzIgYmxrc3o7CisgICAgICAgIHUzMiBibGtjbnQ7CisgICAgICAgIHUzMiAqZW5kX29mX3N0b3JhZ2U7CisgICAgICAgIHUxNiByZXNlcnZlZDI7CisgICAgICAgIHUxNiByZXNlcnZlZDM7CisgICAgICAgIHUxNiBmcmVlY250OworfTsKKwordm9pZCAqc21pX2FsbG9jX3BhcnQoc3RydWN0IGZhc3RwYXJ0ICpmcCk7Cit2b2lkIHNtaV9mcmVlX3BhcnQoc3RydWN0IGZhc3RwYXJ0ICpmcCwgdm9pZCAqdik7CisKKworc3RydWN0IGZhc3RxdWV1ZSAqc21pX3F1ZXVlX2luaXQoc3RydWN0IHNtaXF1ZXVlICpwc21pcSwgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICgqZ2VuX21zcF9pcnEpKHZvaWQpKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNtaV9nZW5fbXNwX2lycSh2b2lkKQoreworCWNvbWNlcnRvX3NvZnRpcnFfc2V0KElSUV9QVFAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc21pX2VucXVldWUoc3RydWN0IHNtaXF1ZXVlICpwc21pcSwgdm9pZCAqdmFkZHIpCit7CisJc3RydWN0IGZhc3RxdWV1ZSAqZnBxID0gcHNtaXEtPmZwcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1MTYgcHV0ID0gMDsKKwlpbnQgcmMgPSAwOworCisJZmxhZ3MgPSBtc3BfbG9ja19mcnFzYXZlKCk7CisKKwlwdXQgPSBmcHEtPnB1dDsKKworCWlmICgrK3B1dCA+PSBmcHEtPnNpemUpIHsKKwkJcHV0ID0gMDsKKwl9CisKKwlpZiAocHV0ICE9IGZwcS0+Z2V0KSB7CisJCXBzbWlxLT5zdG9yYWdlW2ZwcS0+cHV0XSA9ICh1MzIpdmFkZHI7CisJCWZwcS0+cHV0ID0gcHV0OworCisJCWlmIChwc21pcS0+Z2VuX21zcF9pcnEpIHsKKwkJCXBzbWlxLT5nZW5fbXNwX2lycSgpOworCQl9CisKKwkJcmMgPSAxOworCX0KKworCW1zcF91bmxvY2tfZnJxcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc21pX2RlcXVldWUoc3RydWN0IHNtaXF1ZXVlICpwc21pcSkKK3sKKwlzdHJ1Y3QgZmFzdHF1ZXVlICpmcHEgPSBwc21pcS0+ZnBxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXUzMiBnZXQgPSAwOworCXZvaWQgKnZhZGRyID0gTlVMTDsKKworCWZsYWdzID0gbXNwX2xvY2tfZnJxc2F2ZSgpOworCisJZ2V0ID0gZnBxLT5nZXQ7CisKKwlpZiAoZnBxLT5wdXQgIT0gZ2V0KSB7CisJCXZhZGRyID0gKHZvaWQgKikocHNtaXEtPnN0b3JhZ2VbZ2V0KytdKTsKKworCQlpZiAoZ2V0ID09IGZwcS0+c2l6ZSkgeworCQkJZ2V0ID0gMDsKKwkJfQorCisJCWZwcS0+Z2V0ID0gZ2V0OworCX0KKworCW1zcF91bmxvY2tfZnJxcmVzdG9yZShmbGFncyk7CisKKwlyZXR1cm4gdmFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNtaV9pc19xdWV1ZV9lbXB0eShzdHJ1Y3QgZmFzdHF1ZXVlICpmcHEpCit7CisJcmV0dXJuIChmcHEtPmdldCA9PSBmcHEtPnB1dCk7Cit9CisKKyNlbmRpZiAvKiBfQ09NQ0VSVE9fU01JX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vbXNwL3ZlZC5jIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9tc3AvdmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmYzcwZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vbXNwL3ZlZC5jCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogIGFyY2gvYXJtL21hY2gtY29tY2VydG8vbXNwL3ZlZC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgInZlZC5oIgorCitzdGF0aWMgY2hhciBjdHJsX21hY1s2XSA9IHsgMHgwMCwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhFRSB9OworCisjZGVmaW5lIFZFRF9QT0xMX1dFSUdIVCAoMzIpCisjZGVmaW5lIElQX1NFQ19IRUFEUk9PTSAoNDApCisjZGVmaW5lIFBLVF9CVUZfU1ogKDE1NDAgKyBJUF9TRUNfSEVBRFJPT00pIC8qIHNpemUgb2YgZWFjaCByeCBidWZmZXIgKi8KKworc3RhdGljIGludCB2ZWRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqdmVkX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpcnFyZXR1cm5fdCB2ZWRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CitzdGF0aWMgaW50IHZlZF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCB2ZWRfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmVkX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCB2ZWRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGFkZHIsIGNvbnN0IHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgdmVkX3dyaXRlX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgdmVkX3JlYWRfcGFja2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBGRGVzYyAqIFRoaXNGZGVzYyk7CitzdGF0aWMgaW50IHZlZF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCk7CitzdGF0aWMgaW50IHN0YXJ0X3ZlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgc3RvcF92ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworc3RhdGljIGludCB2ZWRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZWRfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgdmVkX3ByaXYgKiluZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJjID0gdmVkX3dyaXRlX3BhY2tldChza2IsIGRldik7CisKKwlpZiAocmMpIHsKKwkJcHJpdi0+c3RhdHMudHhfZHJvcHBlZCsrOworCX0gZWxzZSB7CisJCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwkJcHJpdi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOyAvKiBzYXZlIHRoZSB0aW1lc3RhbXAgKi8KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZlZF9hY2tfbXNwKHZvaWQpCit7CisJY29tY2VydG9fc29mdGlycV9zZXQoSVJRX1BUUDEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdmVkX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgdmVkX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKworCWlmIChuYXBpX3NjaGVkdWxlX3ByZXAoJnByaXYtPm5hcGkpKSB7CisJCWNvbWNlcnRvX3NvZnRpcnFfc2V0KGlycSk7CisKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJCV9fbmFwaV9zY2hlZHVsZSgmcHJpdi0+bmFwaSk7CisJfSBlbHNlIHsKKwkJLyogRklYIGJ5IGRpc2FibGluZyBpbnRlcnJ1cHRzICovCisJCS8qIGRpc2FibGVfaXJxKGlycSk7ICovCisJfQorCisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgdmVkX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCisJbWVtY3B5KGV0aC0+aF9zb3VyY2UsIGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOworCW1lbWNweShldGgtPmhfZGVzdCwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7CisJZXRoLT5oX2Rlc3RbRVRIX0FMRU4gLSAxXSBePSAweDAxOwkvKiBkZXN0IGlzIHVzIHhvciAxICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZWRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGFkZHIsIGNvbnN0IHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBldGhoZHIgKmV0aCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisKKwlldGgtPmhfcHJvdG8gPSBodG9ucyh0eXBlKTsKKwltZW1jcHkoZXRoLT5oX3NvdXJjZSwgc2FkZHIgPyBzYWRkciA6IGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOworCW1lbWNweShldGgtPmhfZGVzdCwgZGFkZHIgPyBkYWRkciA6IGRldi0+ZGV2X2FkZHIsIGRldi0+YWRkcl9sZW4pOworCWV0aC0+aF9kZXN0W0VUSF9BTEVOIC0gMV0gXj0gMHgwMTsJLyogZGVzdCBpcyB1cyB4b3IgMSAqLworCisJcmV0dXJuIGRldi0+aGFyZF9oZWFkZXJfbGVuOworfQorCitzdGF0aWMgaW50IHZlZF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlZF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gcHJpdi0+cGRldjsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5OworCWNvbnN0IGNoYXIgZndfbmFtZVtdID0geyJ2b2lwLmF4ZiJ9OworCWludCByYyA9IDA7CisKKwkvKiBjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGFscmVhZHkgb3BlbmVkICovCisKKwlpZiAocHJpdi0+c3RhdGUgPT0gMSkgeworCQkvKiBpbnRlcmZhY2UgaXMgb3BlbmVkLCBub3RoaW5nIHRvIGJlIGRvbmUgKi8KKworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKHByaXYtPm1zcC5pbmZvKSB7CisJCS8qIHN0b3AgTVNQICovCisKKwkJZGVsX3RpbWVyKCZwcml2LT5tc3AudGltZXJfZXhwaXJlKTsKKwkJcHJpdi0+bXNwLmluZm8gPSBOVUxMOworCQlwcml2LT5tc3Auc3RhdGUgPSBNU1BfUkVTRVQ7CisJfQorCisJbWlnaHRfc2xlZXAoKTsKKworCW1lbXNldCgodm9pZCAqKUNPTUNFUlRPX01TUF9WQUREUiwgMHgwMCwgQ09NQ0VSVE9fTVNQX0REUl9TSVpFKTsKKworCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZmd19lbnRyeSwgKGNoYXIgKilmd19uYW1lLCAmcGRldi0+ZGV2KSkgeworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCBmaW5kIHRoZSBWb0lQIGZpcm13YXJlXG4iKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCisJCXJldHVybiByYzsKKwl9CisKKwlwcml2LT5tc3AuY29kZV9pbmZvLmNvZGUgPSBmd19lbnRyeS0+ZGF0YTsKKwlwcml2LT5tc3AuY29kZV9pbmZvLnNpemUgPSBmd19lbnRyeS0+c2l6ZTsKKworCWlmIChjb21jZXJ0b19kb3dubG9hZF90b19tc3AoJnByaXYtPm1zcCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgZG93bmxvYWQgVm9JUFxuIik7CisJCXJjID0gLUVSRU1PVEVJTzsKKworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY29tY2VydG9fc3RhcnRfbXNwKCZwcml2LT5tc3ApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHN0YXJ0IFZvSVBcbiIpOworCQlyYyA9IC1FUkVNT1RFSU87CisKKwkJZ290byBvdXQ7CisJfQorCisJc3RhcnRfdmVkKGRldik7CisJbmFwaV9lbmFibGUoJnByaXYtPm5hcGkpOworCisJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCB2ZWRfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwgImNvbWNlcnRvX3ZlZCIsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlcXVlc3QgaXJxIyVkXG4iLCBkZXYtPm5hbWUsIGRldi0+aXJxKTsKKworCQljb21jZXJ0b19zdG9wX21zcCgmcHJpdi0+bXNwKTsKKwkJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKKwkJc3RvcF92ZWQoZGV2KTsKKworCQlnb3RvIG91dDsKKwl9CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcHJpdi0+c3RhdGUgPSAxOworCisKK291dDoKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKKworCXJldHVybiByYzsKK30KKworaW50IHZlZF9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZlZF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIGRvIG5vdGhpbmcgaWYgaW50ZXJmYWNlIGlzIGFscmVhZHkgZG93biAqLworCisJaWYgKHByaXYtPnN0YXRlKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsgLyogY2FuJ3QgdHJhbnNtaXQgYW55IG1vcmUgKi8KKworCQluYXBpX2Rpc2FibGUoJnByaXYtPm5hcGkpOworCisJCS8qIGRpc2FibGUgaXJxICovCisJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCisJCS8qIHJlc2V0IE1TUCBkZXZpY2UgKi8KKwkJY29tY2VydG9fc3RvcF9tc3AoJnByaXYtPm1zcCk7CisJCXN0b3BfdmVkKGRldik7CisJCXByaXYtPnN0YXRlID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICp2ZWRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICYoKChzdHJ1Y3QgdmVkX3ByaXYgKiluZXRkZXZfcHJpdihkZXYpKS0+c3RhdHMpOworfQorCisvKioKKyAqCXZlZF9yZWFkX3BhY2tldCAtIHJlYWQgYW5kIHByb2Nlc3MgYW4gUkVBTFBBQ0tFVCAoRXRoZXJuZXQpIGZyYW1lCisgKglAZGV2OiBkZXZpY2UgaWQKKyAqCUBUaGlzRmRlc2M6IEZyYW1lIGRlc2NyaXB0b3IgdG8gcGFyc2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJlYWQgYW5kIHByb2Nlc3MgcmVjZWl2ZWQgZnJhbWUgZGVzY3JpcHRvciBub24gcHJlLXByb2Nlc3NlZCBieSBNU1AgLiAoZXRoZXJuZXQgZnJhbWVzKQorICovCitzdGF0aWMgaW50IHZlZF9yZWFkX3BhY2tldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgRkRlc2MgKlRoaXNGZGVzYykKK3sKKwlzdHJ1Y3QgdmVkX3ByaXYgKnByaXYgPSAoc3RydWN0IHZlZF9wcml2ICopbmV0ZGV2X3ByaXYoZGV2KTsKKwljaGFyICpkYXRhX2FkZHI7CisJaW50IGxlbmd0aCwgb2Zmc2V0LCByZWFzb247CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoUEtUX0JVRl9TWik7CisKKwlpZiAoIXNrYikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJubyBza2Igd2FzIGFsbG9jYXRlZDogcGFja2V0IGlzIGRyb3BwZWRcbiIpOworCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisKKwkJcmV0dXJuIDA7CisJfQorCisJbGVuZ3RoID0gVGhpc0ZkZXNjLT5MZW5ndGg7CisJb2Zmc2V0ID0gVGhpc0ZkZXNjLT5PZmZzZXQ7CisKKwlUaGlzRmRlc2MtPkZTdGF0dXMgPSAwOworCWRhdGFfYWRkciA9IChjaGFyICopKFRoaXNGZGVzYy0+UGF5bG9hZCArIG9mZnNldCk7CisKKwlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW5ndGgpLCBkYXRhX2FkZHIsIGxlbmd0aCk7CisJc2tiLT5kZXYgPSBkZXY7CisJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKworCWlmICgocmVhc29uID0gbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKSkpIHsKKwkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOworCX0KKworCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW5ndGg7CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHZlZF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKworCXN0cnVjdCB2ZWRfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgdmVkX3ByaXYsIG5hcGkpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5kZXY7CisJc3RydWN0IEZEZXNjICogVGhpc0ZkZXNjID0gTlVMTDsKKwlpbnQgZG9uZTsKKwlpbnQgcnhfd29ya19saW1pdCA9IGJ1ZGdldDsKKwlpbnQgcmVjZWl2ZWQgPSAwOworCityZXN0YXJ0X3BvbGw6CisJZG8geworCQljb21jZXJ0b19pcnFfYWNrKGRldi0+aXJxKTsKKworCQl3aGlsZSAoIXNtaV9pc19xdWV1ZV9lbXB0eShwcml2LT5yeF9zbWlxLmZwcSkpIHsKKwkJCWlmICgtLXJ4X3dvcmtfbGltaXQgPCAwKSB7CisJCQkJZ290byBub3RfZG9uZTsKKwkJCX0KKworCQkJVGhpc0ZkZXNjID0gc21pX2RlcXVldWUoJnByaXYtPnJ4X3NtaXEpOworCisJCQlkb25lID0gdmVkX3JlYWRfcGFja2V0KGRldiwgVGhpc0ZkZXNjKTsKKwkJCXNtaV9mcmVlX3BhcnQoVGhpc0ZkZXNjLT5mcGFydCwgVGhpc0ZkZXNjKTsKKworCQkJaWYgKCFkb25lKSB7CisJCQkJZ290byBub3RfZG9uZTsKKwkJCX0gZWxzZSB7CisJCQkJcmVjZWl2ZWQrKzsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChjb21jZXJ0b19zb2Z0aXJxX2NoZWNrKGRldi0+aXJxKSk7CisKKwkvKiB3ZSBhcmUgaGFwcHkvZG9uZSwgbm8gbW9yZSBwYWNrZXRzIG9uIHJpbmc7IHB1dCB1cyBiYWNrCisJICAgdG8gd2hlcmUgd2UgY2FuIHN0YXJ0IHByb2Nlc3NpbmcgaW50ZXJydXB0cyBhZ2FpbiAqLworCW5hcGlfY29tcGxldGUobmFwaSk7CisJLyogZW5hYmxlX2lycShkZXYtPmlycSk7ICovCisKKwkvKiBUaGUgbGFzdCBvcCBoYXBwZW5zIGFmdGVyIHBvbGwgY29tcGxldGlvbi4gV2hpY2ggbWVhbnMgdGhlIGZvbGxvd2luZzoKKwkgKiAxLiBpdCBjYW4gcmFjZSB3aXRoIGRpc2FibGluZyBpcnFzIGluIGlycSBoYW5kbGVyICh3aGljaCBhcmUgZG9uZSB0bworCSAqIHNjaGVkdWxlIHBvbGxzKQorCSAqIDIuIGl0IGNhbiByYWNlIHdpdGggZGlzL2VuYWJsaW5nIGlycXMgaW4gb3RoZXIgcG9sbCB0aHJlYWRzCisJICogMy4gaWYgYW4gaXJxIHJhaXNlZCBhZnRlciB0aGUgYmVnaW5pbmcgb2YgdGhlIG91dGVyICBiZWdpbm5pbmcKKwkgKiBsb29wKG1hcmtlZCBpbiB0aGUgY29kZSBhYm92ZSksIGl0IHdpbGwgYmUgaW1tZWRpYXRlbHkKKwkgKiB0cmlnZ2VyZWQgaGVyZS4KKwkgKgorCSAqIFN1bW1hcml6aW5nOiB0aGUgbG9naWMgbWF5IHJlc3VsdHMgaW4gc29tZSByZWR1bmRhbnQgaXJxcyBib3RoCisJICogZHVlIHRvIHJhY2VzIGluIG1hc2tpbmcgYW5kIGR1ZSB0byB0b28gbGF0ZSBhY2tpbmcgb2YgYWxyZWFkeQorCSAqIHByb2Nlc3NlZCBpcnFzLiBUaGUgZ29vZCBuZXdzOiBubyBldmVudHMgYXJlIGV2ZXIgbG9zdC4KKwkgKi8KKworCS8qIExldCdzIGhhdmUgYSBsYXN0IGNoYW5jZSB0byBwcm9jZXNzIGFueSBtaXNzaW5nIGludGVycnVwdHMgd2UgbWF5CisJICogd2UgbWF5IGhhdmUgbWlzc2VkIHdoaWxlIHRoZSBJUlFzIGxpbmUgd2FzIG1hc3F1ZWQuIEJlZm9yZSBsZWF2aW5nCisJICogcG9sbCBtb2RlLCB3ZSBjaGVjayBpZiBkYXRhIGhhdmUgYmVlbiBwb3N0ZWQgaW4gdGhlIHF1ZXVlIGZyb20gTVNQLgorCSAqIElmIHRydWUsIHRoZW4gdGhlIElSUSBsaW5lIGlzIGRpc2FibGVkIGFnYWluIGFuZCBhIG5ldyBsb29wIG9mIHBvbGxpbmcKKwkgKiBpcyBzY2hlZHVsZWQuIFRoaXMgZG91YmxlIGNoZWNrIHdvcmsgYXJyb3VuZCBpcyB3ZWxsIGtub3duIGluIE5BUEkKKwkgKiBiYXNlZCBpbXBsZW1lbnRhdGlvbiAoc2VlIGRvY3VtZW50YXRpb25zL05BUElfSE9XVE8udHh0IC0gYXBwZW5kaXgyKQorCSAqLworCisJaWYgKCFzbWlfaXNfcXVldWVfZW1wdHkocHJpdi0+cnhfc21pcS5mcHEpICYmIG5hcGlfcmVzY2hlZHVsZShuYXBpKSkgeworCQkvKiBkaXNhYmxlX2lycShkZXYtPmlycSk7ICovCisJCWdvdG8gcmVzdGFydF9wb2xsOworCX0KKworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCisJcmV0dXJuIDA7CisKK25vdF9kb25lOgorCWlmICghcmVjZWl2ZWQpIHsKKwkJcmVjZWl2ZWQgPSAxOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHZlZF93cml0ZV9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmVkX3ByaXYgKnByaXYgPSAoc3RydWN0IHZlZF9wcml2ICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgRkRlc2MgKlRoaXNGZGVzYzsKKwl1OCAqYnVmOworCXUzMiBvZmZzZXQ7CisKKwlUaGlzRmRlc2MgPSBzbWlfYWxsb2NfcGFydChwcml2LT50eF9zbWlwYXJ0KTsKKworCWlmICghVGhpc0ZkZXNjKSB7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvZmZzZXQgPSBORVRfSVBfQUxJR047CisJYnVmID0gVGhpc0ZkZXNjLT5QYXlsb2FkICsgb2Zmc2V0OworCisJbWVtY3B5KGJ1Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisKKwlUaGlzRmRlc2MtPk9mZnNldCA9IG9mZnNldDsKKworCVRoaXNGZGVzYy0+TmV4dCA9IE5VTEw7CisJVGhpc0ZkZXNjLT5MZW5ndGggPSAodTMyKShza2ItPmxlbik7CisJVGhpc0ZkZXNjLT5GU3RhdHVzID0gMDsKKwlUaGlzRmRlc2MtPnByb3RvY29sID0gcHJpdi0+ZGVmYXVsdF9wYWNrZXRfdHlwZTsKKworCS8qIGZyZWUgdGhlIG9yaWdpbmFsIHNrYiAobG9jYWwgZ2VuZXJhdGlvbikgKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlpZiAoIXNtaV9lbnF1ZXVlKCZwcml2LT50eF9zbWlxLCBUaGlzRmRlc2MpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNvdWxkIG5vdCBlbnF1ZXVlOiBxdWV1ZSBpcyBmdWxsOiAlI2x4XG4iLCAodW5zaWduZWQgbG9uZylUaGlzRmRlc2MpOworCisJCXNtaV9mcmVlX3BhcnQocHJpdi0+dHhfc21pcGFydCwgVGhpc0ZkZXNjKTsKKworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG9wX3ZlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0YXJ0X3ZlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZWRfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgdmVkX3ByaXYgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtc3BfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgbXNwX2luZm8gKilwcml2LT5tc3AuaW5mbzsKKworCWlmICghaW5mbykgeworCQlwcmludGsoS0VSTl9FUlIgIm5vIFZvSVAgaW5mbyBmb3VuZFxuIik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkRldmljZTogJWx4XG4iLCBpbmZvLT5kZXZpY2UpOworCXByaW50ayhLRVJOX0lORk8gIlJldmlzaW9uOiAlbHhcbiIsIGluZm8tPnJldmlzaW9uKTsKKwlwcmludGsoS0VSTl9JTkZPICJDU1B0b01TUFF1ZXVlUGh5YWRkcjogJSNseFxuIiwgaW5mby0+Q1NQdG9NU1BRdWV1ZVBoeWFkZHIpOworCXByaW50ayhLRVJOX0lORk8gIk1TUHRvQ1NQUXVldWVQaHlhZGRyOiAlI2x4XG4iLCBpbmZvLT5NU1B0b0NTUFF1ZXVlUGh5YWRkcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiU01SWENTUGh5YWRkcjogJSNseFxuIiwgaW5mby0+U01SWENTUGh5YWRkcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiU01UWENTUGh5YWRkcjogJSNseFxuIiwgaW5mby0+U01UWENTUGh5YWRkcik7CisKKwlwcmludGsoS0VSTl9JTkZPICJEU1AgdmVyc2lvbjogJXNcbiIsIGluZm8tPnNwdV92ZXJzaW9uKTsKKwlwcmludGsoS0VSTl9JTkZPICJWb0lQIHZlcnNpb246ICVzXG4iLCBpbmZvLT5tc3BfdmVyc2lvbik7CisKKwlwcml2LT50eF9zbWlwYXJ0ID0gKHN0cnVjdCBmYXN0cGFydCAqKShpbmZvLT5TTVRYQ1NQaHlhZGRyKTsKKwlwcml2LT5yeF9zbWlwYXJ0ID0gKHN0cnVjdCBmYXN0cGFydCAqKShpbmZvLT5TTVJYQ1NQaHlhZGRyKTsKKworCXNtaV9xdWV1ZV9pbml0KCZwcml2LT50eF9zbWlxLCBpbmZvLT5DU1B0b01TUFF1ZXVlUGh5YWRkciwgc21pX2dlbl9tc3BfaXJxKTsKKwlzbWlfcXVldWVfaW5pdCgmcHJpdi0+cnhfc21pcSwgaW5mby0+TVNQdG9DU1BRdWV1ZVBoeWFkZHIsIE5VTEwpOworCisJdmVkX2Fja19tc3AoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGN0cmxfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gPSB2ZWRfb3BlbiwKKwkubmRvX3N0b3AgPSB2ZWRfcmVsZWFzZSwKKwkubmRvX3N0YXJ0X3htaXQgPSB2ZWRfeG1pdCwKKwkubmRvX2dldF9zdGF0cyA9IHZlZF9nZXRfc3RhdHMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgY3RybF9oZWFkZXJfb3BzID0geworCS5jcmVhdGUgPSB2ZWRfaGVhZGVyLAorCS5yZWJ1aWxkID0gdmVkX3JlYnVpbGRfaGVhZGVyLAorfTsKKworc3RhdGljIGludCB2ZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgdmVkX3ByaXYgKnByaXY9IE5VTEw7CisJaW50IHJjOworCisJLyogY3JlYXRlIGFuIGV0aGVybmV0IGRldmljZSBpbnN0YW5jZSAqLworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mICgqcHJpdikpOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJnZW1hYyAlZCBkZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIHBkZXYtPmlkKTsKKwkJcmMgPSAtRU5PTUVNOworCisJCWdvdG8gZXJyMDsKKwl9CisKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW1lbXNldChwcml2LCAwLCBzaXplb2Yoc3RydWN0IHZlZF9wcml2KSk7CisKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisKKwkvKiBpbml0IHByaXZhdGUgc2VjdGlvbiAqLworCXByaXYtPmRlZmF1bHRfcGFja2V0X3R5cGUgPSBQUk9USURfRVRIOworCXByaXYtPnN0YXRlID0gMDsJCSAgLyogY2xvc2VkICovCisKKwlwcml2LT5wZGV2ID0gcGRldjsKKwlwcml2LT5kZXYgPSBkZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCS8qIGNvcHkgdGhlIHN0YXRpb24gYWRkcmVzcyBpbnRvIHRoZSBkZXYgc3RydWN0dXJlICovCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGN0cmxfbWFjLCBFVEhfQUxFTik7CisKKwlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBDVFJMKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCBhbGxvY2F0ZSBuZXQgZGV2aWNlIG5hbWUgJXNcbiIsIENUUkwpOworCQlyYyA9IC1FSU5WQUw7CisKKwkJZ290byBlcnIyOworCX0KKworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwkvKiBmaWxsIGluIGRldmljZSBzdHJ1Y3R1cmUgd2l0aCBldGhlcm5ldC1nZW5lcmljIHZhbHVlcyAqLworCWV0aGVyX3NldHVwKGRldik7CisKKwkvKiBpbml0aWFsaXplIHRoZSBkZXZpY2Ugc3RydWN0dXJlICovCisJZGV2LT5uZXRkZXZfb3BzID0gJmN0cmxfbmV0ZGV2X29wczsKKwlkZXYtPmhlYWRlcl9vcHMgPSAmY3RybF9oZWFkZXJfb3BzOworCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OworCisJLyogZmlsbCBpbiBkZXZpY2Ugc3RydWN0dXJlIHdpdGggZXRoZXJuZXQtZ2VuZXJpYyB2YWx1ZXMgKi8KKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisJZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7CisJZGV2LT5mbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKKwlkZXYtPmlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJpcnEiKTsKKworCW5ldGlmX25hcGlfYWRkKGRldiwgJnByaXYtPm5hcGksIHZlZF9wb2xsLCBWRURfUE9MTF9XRUlHSFQpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+bXNwLm1zcF9saXN0KTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3QgcmVnaXN0ZXIgbmV0IGRldmljZVxuIik7CisKKwkJZ290byBlcnIwOworCX0KKworCS8qIGNyZWF0ZSBhbGwgdGhlIHN5c2ZzIGZpbGVzICovCisJbXNwX2luaXRfc3lzZnMocGRldik7CisKKwlyZXR1cm4gMDsKKworCitlcnIyOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7CisKK2VycjA6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZlZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3RydWN0dXJlIGZvciBhIGRldmljZSBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHZlZF9kcml2ZXIgPSB7CisJLnByb2JlID0gdmVkX3Byb2JlLAorCS5yZW1vdmUgPSB2ZWRfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInZlZCIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHZlZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdmVkX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2ZWRfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2ZWRfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdCh2ZWRfaW5pdCk7Cittb2R1bGVfZXhpdCh2ZWRfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC92ZWQuaCBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vbXNwL3ZlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDdjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC92ZWQuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqICBhcmNoL2FybS9tYWNoLWNvbWNlcnRvL21zcC92ZWQuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTIgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9DT01DRVJUT19WRURfSAorI2RlZmluZSBfQ09NQ0VSVE9fVkVEX0gKKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSAic21pLmgiCisjaW5jbHVkZSAibXNwLmgiCisKKy8qIFByb3RvY29sIGluZGV4IGRlZmluaXRpb24gKi8KK2VudW0geworCVBST1RJRF9SQVcsCisJUFJPVElEX0VUSCwKKwlQUk9USURfUFBQLAorCVBST1RJRF9JUFY0LAorCVBST1RJRF9JUFY2LAorCVBST1RJRF9DU01FLAorCVBST1RJRF9BUlAsCisJUFJPVElEX1ZMQU4sCisJUFJPVElEX1VEUCwKKwlQUk9USURfVENQLAorCVBST1RJRF9JQ01QLAorCVBST1RJRF9DU01fQVBJLAorCU1BWF9QUk9UT0NPTCwKKwlQUk9UT19JTlZBTElECit9OworCisjZGVmaW5lIE1BWF9CREVTQ19OVU1CRVIgKDQpCisjZGVmaW5lIENUUkwgImV0aDEiCisKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHByaXZhdGUgdG8gZWFjaCBkZXZpY2UuIEl0IGlzIHVzZWQgdG8gcGFzcworICogcGFja2V0cyBpbiBhbmQgb3V0LCBzbyB0aGVyZSBpcyBwbGFjZSBmb3IgYSBwYWNrZXQKKyAqLworCitzdHJ1Y3QgdmVkX3ByaXYgeworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKKwlzcGlubG9ja190IGxvY2s7CisKKwlzdHJ1Y3QgX1NLQl9QT09MICpza2Jwb29sOyAvKiBza2IgcG9vbCBmb3IgTVNQIHRvIENTUCBidWZmZXIgKG1heCBNVFUgc2l6ZSkgKi8KKworCS8qIHNtaSAoc2hhcmUgbWVtb3J5IGludGVyZmFjZSkgKi8KKwlzdHJ1Y3QgZmFzdHBhcnQgKnR4X3NtaXBhcnQ7CS8qIENTUCB0byBNU1AgRmRlc2MgZmFzdCBwYXJ0ICovCisJc3RydWN0IGZhc3RwYXJ0ICpyeF9zbWlwYXJ0OwkvKiBNU1AgdG8gQ1NQIEZkZXNjIGZhc3QgcGFydCAqLworCXN0cnVjdCBzbWlxdWV1ZSB0eF9zbWlxOworCXN0cnVjdCBzbWlxdWV1ZSByeF9zbWlxOworCXUzMiBkZWZhdWx0X3BhY2tldF90eXBlOworCXN0cnVjdCBjb21jZXJ0b19tc3AgbXNwOworCWludCBzdGF0ZTsKK307CisKK3N0cnVjdCBCRGVzYyB7CisJdTggKkJQdHI7CisJdm9sYXRpbGUgdTMyIEJDb250cm9sOworfTsKKworc3RydWN0IEZEZXNjIHsKKwlzdHJ1Y3QgRkRlc2MgKk5leHQ7CisJdm9sYXRpbGUgdTMyIFN5c3RlbTsKKwl2b2xhdGlsZSB1MzIgRlN0YXR1czsKKwl2b2xhdGlsZSB1MzIgRkNvbnRyb2w7CisJc3RydWN0IEJEZXNjIEJEZXNjW01BWF9CREVTQ19OVU1CRVJdOworCisJdTE2IExlbmd0aDsKKwl1MTYgT2Zmc2V0OworCXUxNiBwcm90b2NvbDsKKwl1MTYgcHJvdG9jb2xfaGRyX2xlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBmYXN0cGFydCAqZnBhcnQ7CisJc3RydWN0IEZEZXNjICpUYWlsOworCXUzMiBuRkRlc2M7IC8qIG5GZGVzYyB1c2VkIGJ5IE1TUCBvciBsb2NhbCBwaHkgYWRkciBvZiBGREVTQworCSAgICAgICAgICAgICAqIChvbmx5IHVzZWQgaW4gZGlyZWN0IEVNQUMgY29udHJvbCBtb2RlKSAqLworCXZvaWQgKnBTRmRlc2M7IC8qIENTUCBtdXN0IG5vdCB0b3VjaCB0aGlzIHZhbHVlICovCisJdTggKlBheWxvYWQ7Cit9OworCisjZW5kaWYgLyogX0NPTUNFUlRPX1ZFRF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL3BjaWUtYzIwMDAuYyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vcGNpZS1jMjAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzAxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL3BjaWUtYzIwMDAuYwpAQCAtMCwwICsxLDE5NjQgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL3BjaWUtYzIwMDAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2lmIGRlZmluZWQoQ09ORklHX1BDSV9NU0kpCisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKyNpbmNsdWRlIDxtYWNoL3BjaWUtYzIwMDAuaD4KKyNpbmNsdWRlIDxtYWNoL3NlcmRlcy1jMjAwMC5oPgorI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvcG0uaD4KKy8vI2RlZmluZSBDT01DRVJUT19QQ0lFX0RFQlVHCisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorc3RhdGljIERFQ0xBUkVfQklUTUFQKG1zaV9pcnFfaW5fdXNlW05VTV9QQ0lFX1BPUlRTXSwgUENJRV9OVU1fTVNJX0lSUVMpOworc3RhdGljIGludCBjb21jZXJ0b19tc2lfaW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCk7CisjZW5kaWYKKworaW50IHBjaWVfZXh0ZXJuYWxfY2xrID0gMDsKK3N0YXRpYyBpbnQgX19pbml0IGdldF9wY2llX2Nsa19tb2RlKGNoYXIgKnN0cikKK3sKKyAgICAgICAgaWYgKCFzdHJjbXAoc3RyLCAieWVzIikpCisgICAgICAgICAgICAgICAgcGNpZV9leHRlcm5hbF9jbGsgPSAxOworCisgICAgICAgIHJldHVybiAxOworfQorCitfX3NldHVwKCJwY2llX2V4dGVybmFsX2Nsaz0iLCBnZXRfcGNpZV9jbGtfbW9kZSk7CisKK2ludCBwY2llX2dlbjFfb25seSA9IDA7CitzdGF0aWMgaW50IF9faW5pdCBnZXRfcGNpZV9nZW5fbW9kZShjaGFyICpzdHIpCit7CisgICAgICAgIGlmICghc3RyY21wKHN0ciwgInllcyIpKQorICAgICAgICAgICAgICAgIHBjaWVfZ2VuMV9vbmx5ID0gMTsKKworICAgICAgICByZXR1cm4gMTsKK30KKworX19zZXR1cCgicGNpZV9nZW4xX29ubHk9IiwgZ2V0X3BjaWVfZ2VuX21vZGUpOworCisKKy8qIERXQyBQQ0lFZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIG9mZnNldHMgb24gQVBCICovCitzdHJ1Y3QgcGNpZV9hcHBfcmVnIGFwcF9yZWdzW01BWF9QQ0lFX1BPUlRTXSA9IHsKKwkvKiBQQ0llMCAqLworCXsKKwkJMHgwMDAwMDAwMCwKKwkJMHgwMDAwMDAwNCwKKwkJMHgwMDAwMDAwOCwKKwkJMHgwMDAwMDAwQywKKwkJMHgwMDAwMDAxMCwKKwkJMHgwMDAwMDAxNCwKKwkJMHgwMDAwMDAxOCwKKwkJMHgwMDAwMDA0MCwKKwkJMHgwMDAwMDA0NCwKKwkJMHgwMDAwMDA0OCwKKwkJMHgwMDAwMDA1OCwKKwkJMHgwMDAwMDA4MCwKKwkJMHgwMDAwMDA4NCwKKwkJMHgwMDAwMDBDMCwKKwkJMHgwMDAwMDBDNCwKKwkJMHgwMDAwMDEwMCwKKwkJMHgwMDAwMDEwNCwKKwkJMHgwMDAwMDEwOCwKKwkJMHgwMDAwMDEwQworCX0sCisJLyogUENJZTEgKi8KKwl7CisJCTB4MDAwMDAwMjAsCisJCTB4MDAwMDAwMjQsCisJCTB4MDAwMDAwMjgsCisJCTB4MDAwMDAwMkMsCisJCTB4MDAwMDAwMzAsCisJCTB4MDAwMDAwMzQsCisJCTB4MDAwMDAwMzgsCisJCTB4MDAwMDAwNEMsCisJCTB4MDAwMDAwNTAsCisJCTB4MDAwMDAwNTQsCisJCTB4MDAwMDAwNUMsCisJCTB4MDAwMDAwODgsCisJCTB4MDAwMDAwOEMsCisJCTB4MDAwMDAwQzgsCisJCTB4MDAwMDAwQ0MsCisJCTB4MDAwMDAxMTAsCisJCTB4MDAwMDAxMTQsCisJCTB4MDAwMDAxMTgsCisJCTB4MDAwMDAxMUMKKwl9Cit9OworCisvKiBLZWVwaW5nIGFsbCBERFIgYXJlYSBvZiA1MTJNQiBhY2Nlc2libGUgZm9yIGluYm91bmQgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgSU5CT1VORF9BRERSX01BU0sJMHgxRkZGRkZGRgorCisKKyNkZWZpbmUgUENJRV9TRVRVUF9pQVRVX0lCX0VOVFJZKCBfcHAsIF92aWV3X3BvcnQsIF9iYXNlLCBfbGltaXQsIF9jdGwxLCBfY3RsMiwgX3RhcmdldCApIFwKK3tcCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhfcHAsIFBDSUVfaUFUVV9WSUVXX1BPUlQsIDQsICh1MzIpKF92aWV3X3BvcnR8aUFUVV9WSUVXX1BPUlRfSU5fQk9VTkQpKTsgXAorCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcoX3BwLCBQQ0lFX2lBVFVfQ1RSTDIsIDQsIDApOyBcCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhfcHAsIFBDSUVfaUFUVV9TUkNfTE9XLCA0LCAodTMyKV9iYXNlKTsgXAorCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcoX3BwLCBQQ0lFX2lBVFVfU1JDX0hJR0gsIDQsIDApOyBcCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhfcHAsIFBDSUVfaUFUVV9MSU1JVCwgNCwgKHUzMikoKF9iYXNlKSsoX2xpbWl0KSkpOyBcCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhfcHAsIFBDSUVfaUFUVV9UUkdUX0xPVywgNCwgKHUzMilfdGFyZ2V0KTsgXAorCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcoX3BwLCBQQ0lFX2lBVFVfVFJHVF9ISUdILCA0LCAodTMyKTApOyBcCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhfcHAsIFBDSUVfaUFUVV9DVFJMMSwgNCwgKHUzMilfY3RsMSk7IFwKKwljb21jZXJ0b19kYmlfd3JpdGVfcmVnKF9wcCwgUENJRV9pQVRVX0NUUkwyLCA0LCAodTMyKShfY3RsMiB8aUFUVV9DVFJMMl9JRF9FTikgKTsgXAorfQorCisjZGVmaW5lIFBDSUVfU0VUVVBfaUFUVV9PQl9FTlRSWSggX3BwLCBfdmlld19wb3J0LCBfYmFzZSwgX2xpbWl0LCBfY3RsMSwgX2N0bDIsIF90YXJnZXQgKSBcCit7XAorCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcoX3BwLCBQQ0lFX2lBVFVfVklFV19QT1JULCA0LCAodTMyKV92aWV3X3BvcnQpOyBcCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhfcHAsIFBDSUVfaUFUVV9DVFJMMiwgNCwgMCk7IFwKKwljb21jZXJ0b19kYmlfd3JpdGVfcmVnKF9wcCwgUENJRV9pQVRVX1NSQ19MT1csIDQsICh1MzIpX2Jhc2UpOyBcCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhfcHAsIFBDSUVfaUFUVV9TUkNfSElHSCwgNCwgKHUzMikwKTsgXAorCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcoX3BwLCBQQ0lFX2lBVFVfTElNSVQsIDQsICgodTMyKSgoX2Jhc2UpKyhfbGltaXQpKSkpOyBcCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhfcHAsIFBDSUVfaUFUVV9UUkdUX0xPVywgNCwgKHUzMilfdGFyZ2V0KTsgXAorCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcoX3BwLCBQQ0lFX2lBVFVfVFJHVF9ISUdILCA0LCAodTMyKTApOyBcCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhfcHAsIFBDSUVfaUFUVV9DVFJMMSwgNCwgKHUzMilfY3RsMSk7IFwKKwljb21jZXJ0b19kYmlfd3JpdGVfcmVnKF9wcCwgUENJRV9pQVRVX0NUUkwyLCA0LCAodTMyKShfY3RsMiB8aUFUVV9DVFJMMl9JRF9FTikgKTsgXAorfQorCisjZGVmaW5lIE1BWF9MSU5LX1VQX1dBSVRfSklGRklFUwlIWiAvKiAxIFNlY29uZCAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwY2llX2NuZl9iYXNlX2FkZHJbTUFYX1BDSUVfUE9SVFNdID0KKwkJeyBDT01DRVJUT19BWElfUENJZTBfQkFTRSwgQ09NQ0VSVE9fQVhJX1BDSWUxX0JBU0UgfTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjaWVfcmVtb3RlX2Jhc2VfYWRkcltNQVhfUENJRV9QT1JUU10gPQorCQl7IENPTUNFUlRPX0FYSV9QQ0llMF9TTEFWRV9CQVNFLCBDT01DRVJUT19BWElfUENJZTFfU0xBVkVfQkFTRSB9Oworc3RhdGljIGludCBwY2llX21zaV9iYXNlW01BWF9QQ0lFX1BPUlRTXSA9CisJCXsgUENJRTBfTVNJX0lOVF9CQVNFLCBQQ0lFMV9NU0lfSU5UX0JBU0UgfTsKK3N0YXRpYyBpbnQgcGNpZV9pbnR4X2Jhc2VbTUFYX1BDSUVfUE9SVFNdID0KKwkJeyBQQ0lFMF9JTlRYX0JBU0UsIFBDSUUxX0lOVFhfQkFTRSB9Oworc3RhdGljIGludCBwY2llX2lycXNbTUFYX1BDSUVfUE9SVFNdID0KKwkJeyBJUlFfUENJZTAsIElSUV9QQ0llMSB9OworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpZV9wb3J0IHBjaWVfcG9ydFtNQVhfUENJRV9QT1JUU107CisKK3N0YXRpYyBpbnQgcGNpZV9wb3J0X2lzX2hvc3QoIGludCBuciAgKQoreworCXN0cnVjdCBwY2llX3BvcnQgKnBwPSAmcGNpZV9wb3J0W25yXTsKKworCXJldHVybiAoIHBwLT5wb3J0X21vZGUgPT0gUENJRV9QT1JUX01PREVfUkMgKSA/IDEgOiAwOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyBQQ0llIHBvcnQgbW9kZS4KKyAqLworc3RhdGljIHZvaWQgcGNpZV9wb3J0X3NldF9tb2RlKCBpbnQgbnIsIGludCBtb2RlICApCit7CisJc3RydWN0IHBjaWVfcG9ydCAqcHA9ICZwY2llX3BvcnRbbnJdOworCisJd3JpdGVsKCAocmVhZGwocHAtPnZhX2FwcF9iYXNlICsgcHAtPmFwcF9yZWdzLT5jZmcwKSAmIH4weGYpIHwgbW9kZSwgcHAtPnZhX2FwcF9iYXNlICsgcHAtPmFwcF9yZWdzLT5jZmcwKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGdpdmVuIHBvcnQgbW9kZS4KKyAqIEBwYXJhbSBucglQQ0llIFBvcnQgbnVtYmVyLgorICovCitzdGF0aWMgaW50IHBjaWVfcG9ydF9nZXRfbW9kZSggaW50IG5yICApCit7CisJc3RydWN0IHBjaWVfcG9ydCAqcHA9ICZwY2llX3BvcnRbbnJdOworCisJcmV0dXJuICggcmVhZGwocHAtPnZhX2FwcF9iYXNlICsgcHAtPmFwcF9yZWdzLT5jZmcwKSAmCisJCQlEV0NfQ0ZHMF9ERVZfVFlQRV9NQVNLICk7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjaGVja3Mgd2hldGhlciBsaW5rIGlzIHVwIG9yIG5vdC4KKyAqIFJldHVybnMgdHJ1ZSBpZiBsaW5rIGlzIHVwIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICogQHBhcmFtIHBwCVBvaW50ZXIgdG8gUENJZSBQb3J0IGNvbnRyb2wgYmxvY2suCisgKi8KK3N0YXRpYyBpbnQgY29tY2VydG9fcGNpZV9saW5rX3VwKCBzdHJ1Y3QgcGNpZV9wb3J0ICpwcCAgKQoreworCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUgPSBqaWZmaWVzICsgTUFYX0xJTktfVVBfV0FJVF9KSUZGSUVTOworCisJZG8geworCQlpZiAocmVhZGwoIHBwLT52YV9hcHBfYmFzZSArIHBwLT5hcHBfcmVncy0+c3RzMCApICYgU1RTMF9SRExIX0xJTktfVVApIHsKKwkJCXJldHVybiAxOworCQl9CisKKwkJY29uZF9yZXNjaGVkKCk7CisJfSB3aGlsZSAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZGVhZGxpbmUpKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGJ1c190b19wb3J0KCkuCisgKgorICovCitzdGF0aWMgc3RydWN0IHBjaWVfcG9ydCAqYnVzX3RvX3BvcnQoaW50IGJ1cykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IE5VTV9QQ0lFX1BPUlRTIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaW50IHJidXMgPSBwY2llX3BvcnRbaV0ucm9vdF9idXNfbnI7CisJCWlmICggIXBjaWVfcG9ydF9pc19ob3N0KGkpICkKKwkJCWNvbnRpbnVlOworCQlpZiAocmJ1cyAhPSAtMSAmJiByYnVzIDw9IGJ1cykKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBpID49IDAgPyBwY2llX3BvcnQgKyBpIDogTlVMTDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVhZCBEQkkgcmVnaXN0ZXJzLgorICovCisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX2RiaV9yZWFkX3JlZyhzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwgaW50IHdoZXJlLCBpbnQgc2l6ZSwKKwkJdTMyICp2YWwpCit7CisJdTMyIHZhX2FkZHJlc3M7CisKKwl2YV9hZGRyZXNzID0gKHUzMilwcC0+dmFfZGJpX2Jhc2UgKyAod2hlcmUgJiB+MHgzKTsKKworCSp2YWwgPSByZWFkbF9yZWxheGVkKHZhX2FkZHJlc3MpOworCisJaWYgKHNpemUgPT0gMSkKKwkJKnZhbCA9ICgqdmFsID4+ICg4ICogKHdoZXJlICYgMykpKSAmIDB4ZmY7CisJZWxzZSBpZiAoc2l6ZSA9PSAyKQorCQkqdmFsID0gKCp2YWwgPj4gKDggKiAod2hlcmUgJiAzKSkpICYgMHhmZmZmOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB3cml0ZSBpbnRvIERCSSByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGNvbWNlcnRvX2RiaV93cml0ZV9yZWcoc3RydWN0IHBjaWVfcG9ydCAqcHAsIGludCB3aGVyZSwgaW50IHNpemUsCisJCXUzMiB2YWwpCit7CisJdTMyIHZhX2FkZHJlc3M7CisJaW50IHBvcywgdmFsMSwgbWFzayA9IDA7CisKKwl2YV9hZGRyZXNzID0gKHUzMilwcC0+dmFfZGJpX2Jhc2UgKyAod2hlcmUgJiB+MHgzKTsKKworCXBvcyA9ICh3aGVyZSAmIDB4MykgPDwgMzsKKworCWlmIChzaXplID09IDQpCisJCXZhbDEgPSB2YWw7CisJZWxzZQorCXsKKwkJaWYgKHNpemUgPT0gMikKKwkJCW1hc2sgPSAweGZmZmY7CisJCWVsc2UgaWYgKHNpemUgPT0gMSkKKwkJCW1hc2sgPSAweGZmOworCisJCXZhbDEgPSByZWFkbF9yZWxheGVkKHZhX2FkZHJlc3MpOworCQl2YWwxID0gKCB2YWwxICYgfiggbWFzayAgPDwgcG9zICkgKSB8ICggKHZhbCAmIG1hc2spIDw8IHBvcyApOworCX0KKworCXdyaXRlbF9yZWxheGVkKHZhbDEsIHZhX2FkZHJlc3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbm9wX2RlbGF5KHZvaWQpCit7CisgICAgICAgIGludCBrOworICAgICAgICBmb3IoayA9IDAgOyBrIDwgMTAwMDsgaysrKQorICAgICAgICAgICAgICAgIG5vcCgpOworfQorCitzdGF0aWMgaW50IGNvbWNlcnRvX3BjaWVfcmRfY29uZihzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwgaW50IGJ1c19uciwKKwkJdTMyIGRldmZuLCBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKK3sKKwl1MzIgYWRkcmVzczsKKwl1MzIgdGFyZ2V0X2FkZHJlc3MgPSAodTMyKShidXNfbnIgPDwgMjQpIHwgKFBDSV9TTE9UKGRldmZuKSA8PCAxOSkgfCAoUENJX0ZVTkMoZGV2Zm4pIDw8IDE2KTsKKworCS8qIEluaXRpYWxpemUgaUFUVSAqLworCWlmIChidXNfbnIgIT0gcHAtPnJvb3RfYnVzX25yKSB7CisKKwkJaWYgKHBwLT5jZmcxX3ByZXZfdGFkZHIgIT0gdGFyZ2V0X2FkZHJlc3MpIHsKKwkJCS8qIFR5cGUxIGNvbmZpZ3VyYXRpb24gcmVxdWVzdCAqLworCQkJUENJRV9TRVRVUF9pQVRVX09CX0VOVFJZKCBwcCwgaUFUVV9FTlRSWV9DTkYxLCAodTMyKWlBVFVfR0VUX0NGRzFfQkFTRShwcC0+cmVtb3RlX21lbV9iYXNlYWRkciksCisJCQkJaUFUVV9DRkcxX1NJWkUgLSAxLCAoQVhJX09QX1RZUEVfQ09ORklHX1JEUldfVFlQRTEgJiBpQVRVX0NUUkwxX1RZUEVfTUFTSyksCisJCQkJMCwgdGFyZ2V0X2FkZHJlc3MgKTsKKwkJCXBwLT5jZmcxX3ByZXZfdGFkZHIgPSB0YXJnZXRfYWRkcmVzczsKKwkJfQorCisJCWFkZHJlc3MgPSAodTMyKXBwLT52YV9jZmcxX2Jhc2UgfCh3aGVyZSAmIDB4RkZGQyk7CisJfSBlbHNlIHsKKwkJaWYgKHBwLT5jZmcwX3ByZXZfdGFkZHIgIT0gdGFyZ2V0X2FkZHJlc3MpIHsKKwkJCS8qIFR5cGUwIGNvbmZpZ3VyYXRpb24gcmVxdWVzdCAqLworCQkJUENJRV9TRVRVUF9pQVRVX09CX0VOVFJZKCBwcCwgaUFUVV9FTlRSWV9DTkYwLCAodTMyKWlBVFVfR0VUX0NGRzBfQkFTRShwcC0+cmVtb3RlX21lbV9iYXNlYWRkciksCisJCQkJaUFUVV9DRkcwX1NJWkUgLSAxLCAoQVhJX09QX1RZUEVfQ09ORklHX1JEUldfVFlQRTAgJiBpQVRVX0NUUkwxX1RZUEVfTUFTSyksCisJCQkJMCwgdGFyZ2V0X2FkZHJlc3MgKTsKKwkJCXBwLT5jZmcwX3ByZXZfdGFkZHIgPSB0YXJnZXRfYWRkcmVzczsKKwkJfQorCisJCWFkZHJlc3MgPSAodTMyKXBwLT52YV9jZmcwX2Jhc2UgfCh3aGVyZSAmIDB4RkZGQyk7CisJfQorCisKKwkqdmFsID0gcmVhZGxfcmVsYXhlZChhZGRyZXNzKTsKKworCS8qIEJlY2F1c2Ugb2YgdGhlIGltcHJlY2lzZSBleHRlcm5hbCBhYm9ydCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBhYmxlIHRvIGdldCB0aGUgZXhhY3QgaW5zdHJ1Y3Rpb24gCisgICAgICAgICAgIHdoaWNoIGNhdXNlZCB0aGUgYWJvcnQgYW5kIGhlbmNlIHdoZW4gdGhlIGFib3J0IGhhbmRsZXIgdHJpZXMgdG8gcmVzdG9yZSB0aGUgUEMgdG8gdGhlIG5leHQgCisgICAgICAgICAgIGluc3RydWN0aW9uIHRvIHJlc3VtZSBpdCBpcyBvZnRlbiB3cm9uZyBhbmQgaXQgcmVzdWx0cyBpbiBza2lwcGluZyBmZXcgaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIAorICAgICAgICAgICByZWFkbF9yZWxheGVkIHdoaWNoIGhhcyBjYXVzZWQgYWJvcnQuIFNvIG5vcCBpbnN0cnVjdGlvbnMgYXJlIGFkZGVkIGFmdGVyIHJlYWRsIHNvIHRoYXQgZXZlbiAKKyAgICAgICAgICAgaWYgdGhlIHNvbWUgaW5zdHJ1Y3Rpb25zIGFyZSBtaXNzZWQgb3V0IGl0IHdpbGwgbWlzcyB0aGUgbm9wIGluc3RydWN0aW9uIG9ubHkuCisJKi8KKwlub3BfZGVsYXkoKTsKKworCWlmIChzaXplID09IDEpCisJCSp2YWwgPSAoKnZhbCA+PiAoOCAqICh3aGVyZSAmIDMpKSkgJiAweGZmOworCWVsc2UgaWYgKHNpemUgPT0gMikKKwkJKnZhbCA9ICgqdmFsID4+ICg4ICogKHdoZXJlICYgMykpKSAmIDB4ZmZmZjsKKworI2lmZGVmIENPTUNFUlRPX1BDSUVfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGJ1czolZCBkZXY6JWQgd2hlcmU6JWQsIHNpemU6JWQgYWRkciA6ICV4IHZhbHVlOiV4XG4iLCBfX2Z1bmNfXywgYnVzX25yLCBkZXZmbiwgd2hlcmUsIHNpemUsIGFkZHJlc3MsICp2YWwpOworI2VuZGlmCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCBwY2llX3JlYWRfY29uZihzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1MzIgZGV2Zm4sIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQoreworCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gYnVzX3RvX3BvcnQoYnVzLT5udW1iZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCisjaWZkZWYgQ09NQ0VSVE9fUENJRV9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICIlczogYnVzOiVkIGRldjolZCB3aGVyZTolZCwgc2l6ZTolZFxuIiwgX19mdW5jX18sIGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUpOworI2VuZGlmCisKKworCS8qIE1ha2Ugc3VyZSB0aGF0IGxpbmsgaXMgdXAuCisJICogRmlsdGVyIGRldmljZSBudW1iZXJzLCB1bmxlc3MgaXQncyBhIHR5cGUxIGFjY2VzcworCSAqLworCWlmICggKCFwcC0+bGlua19zdGF0ZSl8fAorCQkJKChidXMtPm51bWJlciA9PSBwcC0+cm9vdF9idXNfbnIpICYmIChQQ0lfU0xPVChkZXZmbikgPiAwKSkgKSB7CisJCSp2YWwgPSAweGZmZmZmZmZmOworCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCX0KKworCUJVR19PTiAoKCh3aGVyZSAmIDB4MykgKyBzaXplKSA+IDQpOworCisJLyogRW50ZXIgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHAtPmNvbmZfbG9jaywgZmxhZ3MpOworCXJldCA9IGNvbWNlcnRvX3BjaWVfcmRfY29uZihwcCwgYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSwgc2l6ZSwgdmFsKTsKKwkvKiBFeGl0IGNyaXRpY2FsIHNlY3Rpb24uICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHAtPmNvbmZfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb21jZXJ0b19wY2llX3dyX2NvbmYoc3RydWN0IHBjaWVfcG9ydCAqcHAsIGludCBidXNfbnIsCisJCXUzMiBkZXZmbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKK3sKKwlpbnQgcmV0ID0gUENJQklPU19TVUNDRVNTRlVMOworCXUzMiBhZGRyZXNzOworCXUzMiB0YXJnZXRfYWRkcmVzcyA9ICh1MzIpKGJ1c19uciA8PCAyNCkgfCAoUENJX1NMT1QoZGV2Zm4pIDw8IDE5KSB8IChQQ0lfRlVOQyhkZXZmbikgPDwgMTYpOworCisJLyogSW5pdGlhbGl6ZSBpQVRVICovCisJaWYgKGJ1c19uciAhPSBwcC0+cm9vdF9idXNfbnIpIHsKKwkJaWYgKHBwLT5jZmcxX3ByZXZfdGFkZHIgIT0gdGFyZ2V0X2FkZHJlc3MpIHsKKwkJCS8qIFR5cGUxIGNvbmZpZ3VyYXRpb24gcmVxdWVzdCAqLworCQkJUENJRV9TRVRVUF9pQVRVX09CX0VOVFJZKCBwcCwgaUFUVV9FTlRSWV9DTkYxLCAodTMyKWlBVFVfR0VUX0NGRzFfQkFTRShwcC0+cmVtb3RlX21lbV9iYXNlYWRkciksCisJCQkJaUFUVV9DRkcxX1NJWkUgLSAxLCAoQVhJX09QX1RZUEVfQ09ORklHX1JEUldfVFlQRTEgJiBpQVRVX0NUUkwxX1RZUEVfTUFTSyksCisJCQkJMCwgdGFyZ2V0X2FkZHJlc3MgKTsKKwkJCXBwLT5jZmcxX3ByZXZfdGFkZHIgPSB0YXJnZXRfYWRkcmVzczsKKwkJfQorCisJCWFkZHJlc3MgPSAodTMyKXBwLT52YV9jZmcxX2Jhc2UgfCh3aGVyZSAmIDB4RkZGQyk7CisJfSBlbHNlIHsKKwkJaWYgKHBwLT5jZmcwX3ByZXZfdGFkZHIgIT0gdGFyZ2V0X2FkZHJlc3MpIHsKKwkJCS8qIFR5cGUwIGNvbmZpZ3VyYXRpb24gcmVxdWVzdCAqLworCQkJUENJRV9TRVRVUF9pQVRVX09CX0VOVFJZKCBwcCwgaUFUVV9FTlRSWV9DTkYwLCAodTMyKWlBVFVfR0VUX0NGRzBfQkFTRShwcC0+cmVtb3RlX21lbV9iYXNlYWRkciksCisJCQkJaUFUVV9DRkcwX1NJWkUgLSAxLCAoQVhJX09QX1RZUEVfQ09ORklHX1JEUldfVFlQRTAgJiBpQVRVX0NUUkwxX1RZUEVfTUFTSyksCisJCQkJMCwgdGFyZ2V0X2FkZHJlc3MgKTsKKwkJCXBwLT5jZmcwX3ByZXZfdGFkZHIgPSB0YXJnZXRfYWRkcmVzczsKKwkJfQorCisJCWFkZHJlc3MgPSAodTMyKXBwLT52YV9jZmcwX2Jhc2UgfCh3aGVyZSAmIDB4RkZGQyk7CisJfQorCisKKyNpZmRlZiBDT01DRVJUT19QQ0lFX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidXM6JWQgZGV2OiVkIHdoZXJlOiVkLCBzaXplOiVkIGFkZHIgOiAleCB2YWx1ZToleFxuIiwgX19mdW5jX18sIGJ1c19uciwgZGV2Zm4sIHdoZXJlLCBzaXplLCBhZGRyZXNzLCB2YWwpOworI2VuZGlmCisJaWYgKHNpemUgPT0gNCkKKwkJd3JpdGVsX3JlbGF4ZWQodmFsLCBhZGRyZXNzKTsKKwllbHNlIGlmIChzaXplID09IDIpCisJCXdyaXRld19yZWxheGVkKHZhbCwgYWRkcmVzcyArICh3aGVyZSAmIDIpKTsKKwllbHNlIGlmIChzaXplID09IDEpCisJCXdyaXRlYl9yZWxheGVkKHZhbCwgYWRkcmVzcyArICh3aGVyZSAmIDMpKTsKKwllbHNlCisJCXJldCA9IFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGNpZV93cml0ZV9jb25mKHN0cnVjdCBwY2lfYnVzICpidXMsIHUzMiBkZXZmbiwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IGJ1c190b19wb3J0KGJ1cy0+bnVtYmVyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKyNpZmRlZiBDT01DRVJUT19QQ0lFX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBidXM6JWQgZGV2OiVkIHdoZXJlOiVkLCBzaXplOiVkIHZhbDolZFxuIiwgX19mdW5jX18sIGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbCk7CisjZW5kaWYKKworCS8qIE1ha2Ugc3VyZSB0aGF0IGxpbmsgaXMgdXAuCisJICogRmlsdGVyIGRldmljZSBudW1iZXJzLCB1bmxlc3MgaXQncyBhIHR5cGUxIGFjY2VzcworCSAqLworCWlmICggKCFwcC0+bGlua19zdGF0ZSl8fAorCQkJKChidXMtPm51bWJlciA9PSBwcC0+cm9vdF9idXNfbnIpICYmIChQQ0lfU0xPVChkZXZmbikgPiAwKSkgKSB7CisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJfQorCisJQlVHX09OICgoKHdoZXJlICYgMHgzKSArIHNpemUpID4gNCk7CisKKwkvKiBFbnRlciBjcml0aWNhbCBzZWN0aW9uLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwcC0+Y29uZl9sb2NrLCBmbGFncyk7CisJcmV0ID0gY29tY2VydG9fcGNpZV93cl9jb25mKHBwLCBidXMtPm51bWJlciwgZGV2Zm4sIHdoZXJlLCBzaXplLCB2YWwpOworCWlmICh3aGVyZSA9PSBQQ0lfQ09NTUFORCkKKwkJcHAtPmNtZF9yZWdfdmFsID0gdmFsICYgMHhmZmZmOworCS8qIEV4aXQgY3JpdGljYWwgc2VjdGlvbi4gKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcC0+Y29uZl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIHU4IF9faW5pdCBjb21jZXJ0b19wY2llX3N3aXp6bGUoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggKnBpbikKK3sKKwlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbWNlcnRvX3BjaWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBidXNfdG9fcG9ydChkZXYtPmJ1cy0+bnVtYmVyKTsKKwlpbnQgaXJxID0gKFBDSUUwX0lOVFhfQkFTRSArIHBwLT5wb3J0ICogUENJRV9OVU1fSU5UWF9JUlFTICsgcGluIC0gMSk7CisKKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjb21jZXJ0b19wY2llX3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQoreworCXN0cnVjdCBwY2llX3BvcnQgKnBwOworCXN0cnVjdCBwY2llX2FwcF9yZWcgKmFwcF9yZWc7CisJdTMyIHZhbDsKKworCisJaWYgKChuciA+PSBOVU1fUENJRV9QT1JUUykgfHwgIXBjaWVfcG9ydF9pc19ob3N0KG5yKSkKKwkJcmV0dXJuIDA7CisKKyNpZmRlZiBDT01DRVJUT19QQ0lFX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVkIG5yOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIG5yKTsKKyNlbmRpZgorCisKKwlwcCA9ICZwY2llX3BvcnRbbnJdOworCisJaWYgKCFwcC0+bGlua19zdGF0ZSkKKwkJcmV0dXJuIDA7CisKKwlwcC0+cm9vdF9idXNfbnIgPSBzeXMtPmJ1c25yOworCWFwcF9yZWcgPSBwcC0+YXBwX3JlZ3M7CisKKwkvKiBBbGxvY2F0ZSBkZXZpY2UgbWVtb3J5IG1hcHBlZCBhbmQgSU8gbWFwcGVkIHJlZ2lvbnMgKi8KKwlzbnByaW50ZihwcC0+bWVtX3NwYWNlX25hbWUsIHNpemVvZihwcC0+bWVtX3NwYWNlX25hbWUpLAorCQkJIlBDSWUgJWQgTUVNIiwgcHAtPnBvcnQpOworCXBwLT5tZW1fc3BhY2VfbmFtZVtzaXplb2YocHAtPm1lbV9zcGFjZV9uYW1lKSAtIDFdID0gMDsKKwlwcC0+cmVzWzBdLm5hbWUgPSBwcC0+bWVtX3NwYWNlX25hbWU7CisJcHAtPnJlc1swXS5zdGFydCA9IGlBVFVfR0VUX01FTV9CQVNFKHBwLT5yZW1vdGVfbWVtX2Jhc2VhZGRyKTsKKwlwcC0+cmVzWzBdLmVuZCA9IHBwLT5yZXNbMF0uc3RhcnQgKyBpQVRVX01FTV9TSVpFIC0gMTsKKwlwcC0+cmVzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07CisKKwlzbnByaW50ZihwcC0+aW9fc3BhY2VfbmFtZSwgc2l6ZW9mKHBwLT5pb19zcGFjZV9uYW1lKSwKKwkJCSJQQ0llICVkIEkvTyIsIHBwLT5wb3J0KTsKKwlwcC0+aW9fc3BhY2VfbmFtZVtzaXplb2YocHAtPmlvX3NwYWNlX25hbWUpIC0gMV0gPSAwOworCXBwLT5yZXNbMV0ubmFtZSA9IHBwLT5pb19zcGFjZV9uYW1lOworCXBwLT5yZXNbMV0uc3RhcnQgPSBpQVRVX0dFVF9JT19CQVNFKHBwLT5yZW1vdGVfbWVtX2Jhc2VhZGRyKTsKKwlwcC0+cmVzWzFdLmVuZCA9IHBwLT5yZXNbMV0uc3RhcnQgKyBpQVRVX0lPX1NJWkUgLSAxOworCXBwLT5yZXNbMV0uZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCisKKwlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZwcC0+cmVzWzBdKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6Y2FuJ3QgYWxsb2NhdGUgUENJZSBNZW1vcnkgc3BhY2UiLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnBwLT5yZXNbMV0pKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczpjYW4ndCBhbGxvY2F0ZSBQQ0llIElPIHNwYWNlIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBHZW5lcmljIFBDSWUgdW5pdCBzZXR1cC4qLworCisJLyogRW5hYmxlIG93biBCTUUuIEl0IGlzIG5lY2Vzc2FyeSB0byBlbmFibGUgb3duIEJNRSB0byBkbyBhCisJICogbWVtb3J5IHRyYW5zYWN0aW9uIG9uIGEgZG93bnN0cmVhbSBkZXZpY2UKKwkgKi8KKwljb21jZXJ0b19kYmlfcmVhZF9yZWcocHAsIFBDSV9DT01NQU5ELCAyLCAmdmFsKTsKKwl2YWwgfD0gKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSCisJCQl8IFBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX1NFUlIpOworCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcocHAsIFBDSV9DT01NQU5ELCAyLCB2YWwpOworCisJLyogTmVlZCB0byBjb21lIGJhY2sgaGVyZSovCisKKwlzeXMtPnJlc291cmNlWzBdID0gJnBwLT5yZXNbMF07CisJc3lzLT5yZXNvdXJjZVsxXSA9ICZwcC0+cmVzWzFdOworCXN5cy0+cmVzb3VyY2VbMl0gPSBOVUxMOworCisJcHAtPmNmZzBfcHJldl90YWRkciA9IDB4ZmZmZmZmZmY7CisJcHAtPmNmZzFfcHJldl90YWRkciA9IDB4ZmZmZmZmZmY7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIHBjaWVfb3BzID0geworCS5yZWFkID0gcGNpZV9yZWFkX2NvbmYsCisJLndyaXRlID0gcGNpZV93cml0ZV9jb25mLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfYnVzICpfX2luaXQgY29tY2VydG9fcGNpZV9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOworCisJaWYgKChuciA8IE5VTV9QQ0lFX1BPUlRTKSAmJiAocGNpZV9wb3J0X2lzX2hvc3QobnIpKSkgeworCisJCWJ1cyA9IHBjaV9zY2FuX2J1cyhzeXMtPmJ1c25yLCAmcGNpZV9vcHMsIHN5cyk7CisJfSBlbHNlIHsKKwkJYnVzID0gTlVMTDsKKwkJQlVHKCk7CisJfQorCisJcmV0dXJuIGJ1czsKK30KKworc3RhdGljIHN0cnVjdCBod19wY2kgY29tY2VydG9fcGNpZSBfX2luaXRkYXRhID0geworCS5ucl9jb250cm9sbGVycwk9IE5VTV9QQ0lFX1BPUlRTLAorCS5zd2l6emxlID0gY29tY2VydG9fcGNpZV9zd2l6emxlLAorCS5tYXBfaXJxID0gY29tY2VydG9fcGNpZV9tYXBfaXJxLAorCS5zZXR1cCA9IGNvbWNlcnRvX3BjaWVfc2V0dXAsCisJLnNjYW4gPSBjb21jZXJ0b19wY2llX3NjYW5fYnVzLAorfTsKKworCisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorLyogTVNJIGludCBoYW5kbGVyCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9tc2koc3RydWN0IHBjaWVfcG9ydCAqcHApCit7CisJdW5zaWduZWQgbG9uZyB2YWwsIG1hc2s7CisJdW5zaWduZWQgaW50IHBvcywgbWFzazA7CisKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQocHAtPnZhX2RiaV9iYXNlICsgUENJRV9NU0lfSU5UUjBfU1RBVFVTKTsKKworY29udGludWVfaGFuZGxlOgorCisJcG9zID0gMDsKKworCXdoaWxlICh2YWwpIHsKKwkJbWFzazAgPSAxIDw8IHBvczsKKworCQlpZiAodmFsICYgbWFzazApIHsKKwkJCS8qIEZJWE1FIDogV0EgZm9yIGJ6Njk1MjAKKwkJCSAqIFRvIGF2b2lkIHJhY2UgY29uZGl0aW9uIGR1cmluZyBhdmsgdGhlIGludGVycnVwdCBkaXNhYmxpbmcgaW50ZXJydXB0IGJlZm9yZQorCQkJICogQWNrIGFuZCBlbmFibGluZyBhZnRlciBBY2suCisJCQkgKi8KKwkJCXNwaW5fbG9jaygmcHAtPmludHJfbG9jayk7CisJCQltYXNrID0gcmVhZGxfcmVsYXhlZChwcC0+dmFfZGJpX2Jhc2UgKyBQQ0lFX01TSV9JTlRSMF9FTkFCTEUpOworCQkJd3JpdGVsX3JlbGF4ZWQobWFzayAmIH5tYXNrMCwgcHAtPnZhX2RiaV9iYXNlICsgUENJRV9NU0lfSU5UUjBfRU5BQkxFKTsKKwkJCXdyaXRlbF9yZWxheGVkKG1hc2swLCBwcC0+dmFfZGJpX2Jhc2UgKyBQQ0lFX01TSV9JTlRSMF9TVEFUVVMpOworCQkJd3JpdGVsX3JlbGF4ZWQobWFzaywgcHAtPnZhX2RiaV9iYXNlICsgUENJRV9NU0lfSU5UUjBfRU5BQkxFKTsKKwkJCXNwaW5fdW5sb2NrKCZwcC0+aW50cl9sb2NrKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShwcC0+bXNpX2Jhc2UJKyBwb3MpOworCQkJdmFsID0gdmFsICYgfm1hc2swOworCQl9CisJCXBvcysrOworCX0KKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQocHAtPnZhX2RiaV9iYXNlICsgUENJRV9NU0lfSU5UUjBfU1RBVFVTKTsKKwlpZih2YWwpCisJCWdvdG8gY29udGludWVfaGFuZGxlOworCisjaWYgMAorCWZvciAoaSA9IDA7IGkgPCAoUENJRV9OVU1fTVNJX0lSUVMgPj4gNSk7IGkrKykgeworCQl2YWwgPSByZWFkbF9yZWxheGVkKHBwLT52YV9kYmlfYmFzZSArIFBDSUVfTVNJX0lOVFIwX1NUQVRVUyArIChpICogMTIpKTsKKwkJaWYgKHZhbCkgeworCQkJcG9zID0gMDsKKwkJCXdoaWxlICgocG9zID0gZmluZF9uZXh0X2JpdCgmdmFsLCAzMiwgcG9zKSkgIT0gMzIpIHsKKwkJCQkvKiBGSVhNRSA6IFdBIGZvciBiejY5NTIwCisJCQkJICogVG8gYXZvaWQgcmFjZSBjb25kaXRpb24gZHVyaW5nIGF2ayB0aGUgaW50ZXJydXB0IGRpc2FibGluZyBpbnRlcnJ1cHQgYmVmb3JlCisJCQkJICogQWNrIGFuZCBlbmFibGluZyBhZnRlciBBY2suCisJCQkJICovCisJCQkJc3Bpbl9sb2NrKCZwcC0+aW50cl9sb2NrKTsKKwkJCQltYXNrID0gcmVhZGxfcmVsYXhlZChwcC0+dmFfZGJpX2Jhc2UgKyBQQ0lFX01TSV9JTlRSMF9FTkFCTEUgKyAoaSAqIDEyKSk7CisJCQkJd3JpdGVsX3JlbGF4ZWQobWFzayAmIH4oMSA8PCBwb3MpLCBwcC0+dmFfZGJpX2Jhc2UgKyBQQ0lFX01TSV9JTlRSMF9FTkFCTEUgKyAoaSAqIDEyKSk7CisJCQkJd3JpdGVsX3JlbGF4ZWQoKDEgPDwgcG9zKSwgcHAtPnZhX2RiaV9iYXNlICsgUENJRV9NU0lfSU5UUjBfU1RBVFVTICsgKGkgKiAxMikpOworCQkJCXdyaXRlbF9yZWxheGVkKG1hc2sgJiAoMSA8PCBwb3MpLCBwcC0+dmFfZGJpX2Jhc2UgKyBQQ0lFX01TSV9JTlRSMF9FTkFCTEUgKyAoaSAqIDEyKSk7CisJCQkJc3Bpbl91bmxvY2soJnBwLT5pbnRyX2xvY2spOworCQkJCWdlbmVyaWNfaGFuZGxlX2lycShwcC0+bXNpX2Jhc2UJKyAoaSAqIDMyKSArIHBvcyk7CisJCQkJcG9zKys7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBoYW5kbGVfbXNpKHN0cnVjdCBwY2llX3BvcnQgKnBwKQoreworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3BjaWVfaW50X2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gaXJxX2dldF9oYW5kbGVyX2RhdGEoaXJxKTsKKwlzdHJ1Y3QgcGNpZV9hcHBfcmVnICphcHBfcmVnID0gcHAtPmFwcF9yZWdzOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcDsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWludCBwb3MsIGlpOworCisJY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOworCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOworCXN0YXR1cyA9IHJlYWRsX3JlbGF4ZWQocHAtPnZhX2FwcF9iYXNlICsgYXBwX3JlZy0+aW50cl9zdHMpOworCisJaWYgKHN0YXR1cyAmIElOVFJfQ1RSTF9NU0kpIHsKKwkJd3JpdGVsX3JlbGF4ZWQoSU5UUl9DVFJMX01TSSwgKHBwLT52YV9hcHBfYmFzZSArIGFwcF9yZWctPmludHJfc3RzKSk7CisJCXN0YXR1cyAmPSB+KElOVFJfQ1RSTF9NU0kpOworCQloYW5kbGVfbXNpKHBwKTsKKwl9CisKKwlmb3IgKGlpID0gMDsgKGlpIDwgUENJRV9OVU1fSU5UWF9JUlFTKSAmJiBzdGF0dXM7IGlpKyspIHsKKwkJcG9zID0gaWkgPDwgMTsKKworCQkvKiBIYW5kbGUgSU5UeCBBc3NlcnQgKi8KKwkJaWYgKHN0YXR1cyAmIChJTlRSX0NUUkxfSU5UQV9BU1NFUlQgPDwgcG9zKSkgeworCQkJc3RhdHVzICY9IH4oSU5UUl9DVFJMX0lOVEFfQVNTRVJUIDw8IHBvcyk7CisJCQl3cml0ZWxfcmVsYXhlZCgoSU5UUl9DVFJMX0lOVEFfQVNTRVJUIDw8IHBvcyksIChwcC0+dmFfYXBwX2Jhc2UgKyBhcHBfcmVnLT5pbnRyX3N0cykpOworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHBwLT5pbnR4X2Jhc2UgKyBpaSk7CisJCX0KKworCQkvKkZJWE1FIDogTm8gbmVlZCB0byBoYW5kbGUgREVBU1NFUlQsIHNpbXBseSBjbGVhciB0aGUgaW50ZXJydXB0ICovCisJCXN0YXR1cyAmPSB+KElOVFJfQ1RSTF9JTlRBX0RFQVNTRVJUIDw8IHBvcyk7CisjaWYgMAorCQkvKiBIYW5kbGUgSU5UeCBEZWFzZXJ0ICovCisJCWlmIChzdGF0dXMgJiAoSU5UUl9DVFJMX0lOVEFfREVBU1NFUlQgPDwgcG9zKSkgeworCQkJc3RhdHVzICY9IH4oSU5UUl9DVFJMX0lOVEFfREVBU1NFUlQgPDwgcG9zKTsKKwkJCXdyaXRlbF9yZWxheGVkKChJTlRSX0NUUkxfSU5UQV9ERUFTU0VSVCA8PCBwb3MpLCAocHAtPnZhX2FwcF9iYXNlICsgYXBwX3JlZy0+aW50cl9zdHMpKTsKKwkJfQorI2VuZGlmCisJfQorCisJaWYgKHN0YXR1cykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczpVbmhhbmRsZWQgaW50ZXJydXB0ICV4XG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJLyogRklYTUU6IEhQLCBBRVIsIFBNRSBpbnRlcnJ1cHRzIG5lZWQgdG8gYmUgaGFuZGxlZCAqLworCQl3cml0ZWxfcmVsYXhlZChzdGF0dXMsIChwcC0+dmFfYXBwX2Jhc2UgKyBhcHBfcmVnLT5pbnRyX3N0cykpOworCX0KKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKKworc3RhdGljIHZvaWQgcGNpZV9ub3BfaW50eF9pcnEoc3RydWN0IGlycV9kYXRhICpkYXRhICkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHBjaWVfdW5tYXNrX2ludHhfaXJxKCBzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEgKQoreworCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gZGF0YS0+Y2hpcF9kYXRhOworCisJc3Bpbl9sb2NrKCZwcC0+Y29uZl9sb2NrKTsKKwljb21jZXJ0b19wY2llX3dyX2NvbmYocHAsIHBwLT5yb290X2J1c19uciwgMCwgUENJX0NPTU1BTkQsIDIsIChwcC0+Y21kX3JlZ192YWwgJiB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSk7CisJc3Bpbl91bmxvY2soJnBwLT5jb25mX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBwY2llX2VuYWJsZV9pbnR4X2lycSggc3RydWN0IGlycV9kYXRhICpkYXRhICkKK3sKKwlpbnQgaXJxID0gZGF0YS0+aXJxOworCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gZGF0YS0+Y2hpcF9kYXRhOworCWludCBpcnFfb2Zmc2V0ID0gaXJxIC0gcHAtPmludHhfYmFzZTsKKwlzdHJ1Y3QgcGNpZV9hcHBfcmVnICphcHBfcmVnID0gKHN0cnVjdCBwY2llX2FwcF9yZWcgKilwcC0+YXBwX3JlZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmKCBpcnFfb2Zmc2V0ID49IFBDSUVfTlVNX0lOVFhfSVJRUyApCisJCXJldHVybjsKKworCS8qCisJICogSW4gaW50ZXJydXB0IHN0cy9tYXNrIHJlZ2lzdGVyIGVhY2ggaW50ZXJydXB0IGhhcyB0d28KKwkgKiBjb25zZWN1dGl2ZSBiaXRzLCBvbmUgZm9yIGFzc2VydCBhbmQgYW5vdGhlciBmb3IgZGVzc2VydC4KKwkgKi8KKwlpcnFfb2Zmc2V0ID0gaXJxX29mZnNldCA8PCAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBwLT5pbnRyX2xvY2ssIGZsYWdzKTsKKwl3cml0ZWxfcmVsYXhlZChyZWFkbF9yZWxheGVkKHBwLT52YV9hcHBfYmFzZSArIGFwcF9yZWctPmludHJfZW4pIHwgKCBJTlRSX0NUUkxfSU5UQV9BU1NFUlQgPDwgaXJxX29mZnNldCksCisJCQkocHAtPnZhX2FwcF9iYXNlICsgYXBwX3JlZy0+aW50cl9lbikgKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcC0+aW50cl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHBjaWVfbWFza19pbnR4X2lycSggc3RydWN0IGlycV9kYXRhICpkYXRhICkKK3sKKwlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IGRhdGEtPmNoaXBfZGF0YTsKKworCXNwaW5fbG9jaygmcHAtPmNvbmZfbG9jayk7CisJY29tY2VydG9fcGNpZV93cl9jb25mKHBwLCBwcC0+cm9vdF9idXNfbnIsIDAsIFBDSV9DT01NQU5ELCAyLCAocHAtPmNtZF9yZWdfdmFsIHwgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSk7CisJc3Bpbl91bmxvY2soJnBwLT5jb25mX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBwY2llX2Rpc2FibGVfaW50eF9pcnEoIHN0cnVjdCBpcnFfZGF0YSAqZGF0YSApCit7CisJaW50IGlycSA9IGRhdGEtPmlycTsKKwlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IGRhdGEtPmNoaXBfZGF0YTsKKwlpbnQgaXJxX29mZnNldCA9IGlycSAtIHBwLT5pbnR4X2Jhc2U7CisJc3RydWN0IHBjaWVfYXBwX3JlZyAqYXBwX3JlZyA9IChzdHJ1Y3QgcGNpZV9hcHBfcmVnICopcHAtPmFwcF9yZWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiggaXJxX29mZnNldCA+PSBQQ0lFX05VTV9JTlRYX0lSUVMgKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEluIGludGVycnVwdCBzdHMvbWFzayByZWdpc3RlciBlYWNoIGludGVycnVwdCBoYXMgdHdvCisJICogY29uc2VjdXRpdmUgYml0cywgb25lIGZvciBhc3NlcnQgYW5kIGFub3RoZXIgZm9yIGRlc3NlcnQuCisJICovCisJaXJxX29mZnNldCA9IGlycV9vZmZzZXQgPDwgMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcC0+aW50cl9sb2NrLCBmbGFncyk7CisJd3JpdGVsX3JlbGF4ZWQoIHJlYWRsX3JlbGF4ZWQocHAtPnZhX2FwcF9iYXNlICsgYXBwX3JlZy0+aW50cl9lbikgJiB+KCBJTlRSX0NUUkxfSU5UQV9BU1NFUlQgPDwgaXJxX29mZnNldCksCisJCQkocHAtPnZhX2FwcF9iYXNlICsgYXBwX3JlZy0+aW50cl9lbikgKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcC0+aW50cl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcGNpZV9pbnR4X2NoaXAgPSB7CisJLm5hbWUgPSAiUENJZSBJTlR4IiwKKwkuaXJxX2FjayA9IHBjaWVfbm9wX2ludHhfaXJxLAorCS5pcnFfZW5hYmxlID0gcGNpZV9lbmFibGVfaW50eF9pcnEsCisJLmlycV9kaXNhYmxlID0gcGNpZV9kaXNhYmxlX2ludHhfaXJxLAorCS5pcnFfbWFzayA9IHBjaWVfbWFza19pbnR4X2lycSwKKwkuaXJxX3VubWFzayA9IHBjaWVfdW5tYXNrX2ludHhfaXJxLAorfTsKKworc3RhdGljIGludCBjb21jZXJ0b19wY2llX2ludHhfaW5pdChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCkKK3sKKwlpbnQgaSwgaXJxOworCXN0cnVjdCBwY2llX2FwcF9yZWcgKmFwcF9yZWc7CisKKwkvKiBEaXNhYmxlIElOVFggaW50ZXJydXB0Ki8KKwlhcHBfcmVnID0gcHAtPmFwcF9yZWdzOworCisJd3JpdGVsKHJlYWRsKHBwLT52YV9hcHBfYmFzZSArIGFwcF9yZWctPmludHJfZW4pICYKKwkJCX4oSU5UUl9DVFJMX0lOVEFfQVNTRVJUIHwKKwkJCQlJTlRSX0NUUkxfSU5UQl9BU1NFUlQgfAorCQkJCUlOVFJfQ1RSTF9JTlRDX0FTU0VSVCB8CisJCQkJSU5UUl9DVFJMX0lOVERfQVNTRVJUKSwKKwkJCXBwLT52YV9hcHBfYmFzZSArIGFwcF9yZWctPmludHJfZW4gKTsKKworCS8qIGluaXRpbGl6ZSBJTlRYIGNoaXAgaGVyZSBvbmx5LiBNU0kgY2hpcCB3aWxsIGJlCisJICogaW5pdGlsaXplZCBkeW5hbWljYWxseS4qLworCWlycSA9IHBwLT5pbnR4X2Jhc2U7CisJZm9yIChpID0gMDsgaSA8IFBDSUVfTlVNX0lOVFhfSVJRUzsgaSsrKSB7CisJCWlycV9zZXRfY2hpcF9kYXRhKGlycSArIGksIHBwKTsKKwkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSArIGksICZwY2llX2ludHhfY2hpcCwKKwkJCQloYW5kbGVfbGV2ZWxfaXJxKTsKKwkJc2V0X2lycV9mbGFncyhpcnEgKyBpLCBJUlFGX1ZBTElEKTsKKwl9CisKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShwcC0+aXJxLCBwcCk7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIocHAtPmlycSwgY29tY2VydG9fcGNpZV9pbnRfaGFuZGxlcik7CisKKwkvKiBGSVhNRSBBZGRlZCBmb3IgZGVidWdpbmcgKi8KKwl3cml0ZWwocmVhZGwocHAtPnZhX2FwcF9iYXNlICsgYXBwX3JlZy0+aW50cl9lbikgJgorCQkJfihJTlRSX0NUUkxfQUVSIHwgIElOVFJfQ1RSTF9QTUUgfAorIAkJCSBJTlRSX0NUUkxfSFAgIHwgIElOVFJfQ1RSTF9MSU5LX0FVVE9fQlcgKSwKKwkJCXBwLT52YV9hcHBfYmFzZSArIGFwcF9yZWctPmludHJfZW4gKTsKKworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tY2VydG9fcGNpZV9yY19pbnRfaW5pdCggc3RydWN0IHBjaWVfcG9ydCAqcHAgKQoreworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXNcbiIsX19mdW5jX18pOworCisJY29tY2VydG9fcGNpZV9pbnR4X2luaXQocHApOworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwljb21jZXJ0b19tc2lfaW5pdChwcCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKK3N0YXRpYyBpbnQgZmluZF92YWxpZF9wb3MwKGludCBwb3J0LCBpbnQgbnZlYywgaW50IHBvcywgaW50ICpwb3MwKQoreworCWludCBmbGFnID0gMTsKKwlkbyB7CisJCXBvcyA9IGZpbmRfbmV4dF96ZXJvX2JpdChtc2lfaXJxX2luX3VzZVtwb3J0XSwKKwkJCQlQQ0lFX05VTV9NU0lfSVJRUywgcG9zKTsKKwkJLyppZiB5b3UgaGF2ZSByZWFjaGVkIHRvIHRoZSBlbmQgdGhlbiBnZXQgb3V0IGZyb20gaGVyZS4qLworCQlpZiAocG9zID09IFBDSUVfTlVNX01TSV9JUlFTKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCS8qIENoZWNrIGlmIHRoaXMgcG9zaXRpb24gaXMgYXQgY29ycmVjdCBvZmZzZXQubnZlYyBpcyBhbHdheXMgYQorCQkgKiBwb3dlciBvZiB0d28uIHBvczAgbXVzdCBiZSBudmVjIGJpdCBhbGxpZ25lZC4KKwkJICovCisJCWlmIChwb3MgJSBudmVjKQorCQkJcG9zICs9IG52ZWMgLSAocG9zICUgbnZlYyk7CisJCWVsc2UKKwkJCWZsYWcgPSAwOworCX0gd2hpbGUgKGZsYWcpOworCisJKnBvczAgPSBwb3M7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgR0VUX01TSV9JTlRfUkVHX1BPUyhfaXJxKSAoKF9pcnEgPj4gNSkgKiAxMikKKyNkZWZpbmUgR0VUX01TSV9JTlRfT0ZTVChfaXJxKSAoX2lycSAmIDB4MUYpCisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX21zaV9ub3Aoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9fbXNpX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHBjaWVfcG9ydCAqcHAgPSBkYXRhLT5jaGlwX2RhdGE7CisJaW50IGlycSA9IGRhdGEtPmlycSAtIHBwLT5tc2lfYmFzZTsKKwlpbnQgb2ZzdCwgcG9zOworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmKCBpcnEgPj0gUENJRV9OVU1fTVNJX0lSUVMgKQorCQlyZXR1cm47CisKKwlwb3MgPSBHRVRfTVNJX0lOVF9SRUdfUE9TKGlycSk7CisJb2ZzdCA9IEdFVF9NU0lfSU5UX09GU1QoaXJxKTsKKyNpZmRlZiBDT01DRVJUT19QQ0lFX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAleDoleFxuIixfX2Z1bmNfXywgcG9zLCBvZnN0KTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBwLT5pbnRyX2xvY2ssIGZsYWdzKTsKKwljb21jZXJ0b19kYmlfcmVhZF9yZWcocHAsIFBDSUVfTVNJX0lOVFIwX01BU0sgKyBwb3MsIDQsICZ2YWwpOworCXZhbCAmPSB+KDEgPDwgb2ZzdCk7CisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9NU0lfSU5UUjBfTUFTSyArIHBvcywgNCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcC0+aW50cl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX21zaV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IGRhdGEtPmNoaXBfZGF0YTsKKwlpbnQgaXJxID0gZGF0YS0+aXJxIC0gcHAtPm1zaV9iYXNlOworCWludCBvZnN0LCBwb3M7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYoIGlycSA+PSBQQ0lFX05VTV9NU0lfSVJRUyApCisJCXJldHVybjsKKworCXBvcyA9IEdFVF9NU0lfSU5UX1JFR19QT1MoaXJxKTsKKwlvZnN0ID0gR0VUX01TSV9JTlRfT0ZTVChpcnEpOworI2lmZGVmIENPTUNFUlRPX1BDSUVfREVCVUcKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICV4OiV4XG4iLF9fZnVuY19fLCBwb3MsIG9mc3QpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHAtPmludHJfbG9jaywgZmxhZ3MpOworCWNvbWNlcnRvX2RiaV9yZWFkX3JlZyhwcCwgUENJRV9NU0lfSU5UUjBfTUFTSyArIHBvcywgNCwgJnZhbCk7CisJdmFsIHw9ICgxIDw8IG9mc3QpOworCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcocHAsIFBDSUVfTVNJX0lOVFIwX01BU0sgKyBwb3MsIDQsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHAtPmludHJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuOworfQorCisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX21zaV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gZGF0YS0+Y2hpcF9kYXRhOworCWludCBpcnEgPSBkYXRhLT5pcnEgLSBwcC0+bXNpX2Jhc2U7CisJaW50IG9mc3QsIHBvczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiggaXJxID49IFBDSUVfTlVNX01TSV9JUlFTICkKKwkJcmV0dXJuOworCisJcG9zID0gR0VUX01TSV9JTlRfUkVHX1BPUyhpcnEpOworCW9mc3QgPSBHRVRfTVNJX0lOVF9PRlNUKGlycSk7CisKKyNpZmRlZiBDT01DRVJUT19QQ0lFX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAleDoleFxuIixfX2Z1bmNfXywgcG9zLCBvZnN0KTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBwLT5pbnRyX2xvY2ssIGZsYWdzKTsKKwljb21jZXJ0b19kYmlfcmVhZF9yZWcocHAsIFBDSUVfTVNJX0lOVFIwX0VOQUJMRSArIHBvcywgNCwgJnZhbCk7CisJdmFsIHw9ICgxIDw8IG9mc3QpOworCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcocHAsIFBDSUVfTVNJX0lOVFIwX0VOQUJMRSArIHBvcywgNCwgdmFsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcC0+aW50cl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQgY29tY2VydG9fbXNpX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gZGF0YS0+Y2hpcF9kYXRhOworCWludCBpcnEgPSBkYXRhLT5pcnEgLSBwcC0+bXNpX2Jhc2U7CisJaW50IG9mc3QsIHBvczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiggaXJxID49IFBDSUVfTlVNX01TSV9JUlFTICkKKwkJcmV0dXJuOworCisJcG9zID0gR0VUX01TSV9JTlRfUkVHX1BPUyhpcnEpOworCW9mc3QgPSBHRVRfTVNJX0lOVF9PRlNUKGlycSk7CisjaWZkZWYgQ09NQ0VSVE9fUENJRV9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICIlczogJXg6JXhcbiIsX19mdW5jX18sIHBvcywgb2ZzdCk7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcC0+aW50cl9sb2NrLCBmbGFncyk7CisJY29tY2VydG9fZGJpX3JlYWRfcmVnKHBwLCBQQ0lFX01TSV9JTlRSMF9FTkFCTEUgKyBwb3MsIDQsICZ2YWwpOworCXZhbCAmPSB+KDEgPDwgb2ZzdCk7CisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9NU0lfSU5UUjBfRU5BQkxFICsgcG9zLCA0LCB2YWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBwLT5pbnRyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBjb21jZXJ0b19tc2lfY2hpcCA9IHsKKwkubmFtZSA9ICJQQ0ktTVNJIiwKKwkuaXJxX2FjayA9IGNvbWNlcnRvX21zaV9ub3AsCisJLmlycV9lbmFibGUgPSBjb21jZXJ0b19tc2lfZW5hYmxlLAorCS5pcnFfZGlzYWJsZSA9IGNvbWNlcnRvX21zaV9kaXNhYmxlLAorCS5pcnFfbWFzayA9IGNvbWNlcnRvX21zaV9tYXNrLAorCS5pcnFfdW5tYXNrID0gY29tY2VydG9fbXNpX3VubWFzaywKK307CisKKy8qCisgKiBEeW5hbWljIGlycSBhbGxvY2F0ZSBhbmQgZGVhbGxvY2F0aW9uCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2lycShpbnQgbnZlYywgc3RydWN0IG1zaV9kZXNjICpkZXNjLCBpbnQgKnBvcykKK3sKKwlpbnQgaXJxLCBwb3MwLCBwb3MxLCBpOworCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gYnVzX3RvX3BvcnQoZGVzYy0+ZGV2LT5idXMtPm51bWJlcik7CisKKwlwb3MwID0gZmluZF9maXJzdF96ZXJvX2JpdChtc2lfaXJxX2luX3VzZVtwcC0+cG9ydF0sCisJCQlQQ0lFX05VTV9NU0lfSVJRUyk7CisJaWYgKHBvczAgJSBudmVjKSB7CisJCWlmIChmaW5kX3ZhbGlkX3BvczAocHAtPnBvcnQsIG52ZWMsIHBvczAsICZwb3MwKSkKKwkJCWdvdG8gbm9fdmFsaWRfaXJxOworCX0KKwlpZiAobnZlYyA+IDEpIHsKKwkJcG9zMSA9IGZpbmRfbmV4dF9iaXQobXNpX2lycV9pbl91c2VbcHAtPnBvcnRdLAorCQkJCVBDSUVfTlVNX01TSV9JUlFTLCBwb3MwKTsKKwkJLyogdGhlcmUgbXVzdCBiZSBudmVjIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmcmVlIGJpdHMgKi8KKwkJd2hpbGUgKChwb3MxIC0gcG9zMCkgPCBudmVjKSB7CisJCQlpZiAoZmluZF92YWxpZF9wb3MwKHBwLT5wb3J0LCBudmVjLCBwb3MxLCAmcG9zMCkpCisJCQkJZ290byBub192YWxpZF9pcnE7CisJCQlwb3MxID0gZmluZF9uZXh0X2JpdChtc2lfaXJxX2luX3VzZVtwcC0+cG9ydF0sCisJCQkJCVBDSUVfTlVNX01TSV9JUlFTLCBwb3MwKTsKKwkJfQorCX0KKworCWlycSA9IHBwLT5tc2lfYmFzZSArIHBvczA7CisKKwlpZiAoKGlycSArIG52ZWMpID4gKHBwLT5tc2lfYmFzZSArIFBDSUVfTlVNX01TSV9JUlFTKSkKKwkJZ290byBub192YWxpZF9pcnE7CisKKwlpID0gMDsKKwl3aGlsZSAoaSA8IG52ZWMpIHsKKwkJc2V0X2JpdChwb3MwICsgaSwgbXNpX2lycV9pbl91c2VbcHAtPnBvcnRdKTsKKwkJZHluYW1pY19pcnFfaW5pdChpcnEgKyBpKTsKKwkJaXJxX3NldF9jaGlwX2RhdGEoaXJxICsgaSwgcHApOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxICsgaSwgJmNvbWNlcnRvX21zaV9jaGlwLAorCQkJCWhhbmRsZV9zaW1wbGVfaXJxKTsKKwkJc2V0X2lycV9mbGFncyhpcnEgKyBpLCBJUlFGX1ZBTElEKTsKKwkJaSsrOworCX0KKworCWlycV9zZXRfbXNpX2Rlc2MoaXJxLCBkZXNjKTsKKworCSpwb3MgPSBwb3MwOworCXJldHVybiBpcnE7Citub192YWxpZF9pcnE6CisJcHJpbnRrKEtFUk5fRVJSICIlcyA6IE1TSSBpbnRlcnJ1cHQgYWxsb2NhdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJKnBvcyA9IHBvczA7CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFuX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCByZXMsIGJpdCwgdmFsLCBwb3M7CisJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2dldF9pcnFfZGF0YShpcnEpOworCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gZGF0YS0+Y2hpcF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiggIXBwICkKKwkJcmV0dXJuOworCisJcG9zID0gaXJxIC0gcHAtPm1zaV9iYXNlOworCisJZHluYW1pY19pcnFfY2xlYW51cChpcnEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBwLT5tc2lfbWFwX2xvY2ssIGZsYWdzKTsKKwljbGVhcl9iaXQocG9zLCBtc2lfaXJxX2luX3VzZVtwcC0+cG9ydF0pOworCisJLyogRGlzYWJsZSBjb3JyZXNwb25kaW5nIGludGVycnVwdCBvbiBNU0kgaW50ZXJydXB0CisJICogY29udHJvbGxlci4KKwkgKi8KKwlyZXMgPSAocG9zIC8gMzIpICogMTI7CisJYml0ID0gcG9zICUgMzI7CisJY29tY2VydG9fZGJpX3JlYWRfcmVnKHBwLCBQQ0lFX01TSV9JTlRSMF9FTkFCTEUgKyByZXMsIDQsICZ2YWwpOworCXZhbCAmPSB+KDEgPDwgYml0KTsKKwljb21jZXJ0b19kYmlfd3JpdGVfcmVnKHBwLCBQQ0lFX01TSV9JTlRSMF9FTkFCTEUgKyByZXMsIDQsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHAtPm1zaV9tYXBfbG9jaywgZmxhZ3MpOworCit9CisKK2ludCBhcmNoX3NldHVwX21zaV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBtc2lfZGVzYyAqZGVzYykKK3sKKwlpbnQgaXJxLCBwb3M7CisJc3RydWN0IG1zaV9tc2cgbXNnOworCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gYnVzX3RvX3BvcnQocGRldi0+YnVzLT5udW1iZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHAtPm1zaV9tYXBfbG9jaywgZmxhZ3MpOworCWlycSA9IGdldF9pcnEoMSwgZGVzYywgJnBvcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHAtPm1zaV9tYXBfbG9jaywgZmxhZ3MpOworCisKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCWRlc2MtPm1zaV9hdHRyaWIubXVsdGlwbGUgPSAwOworCisJLyogQW4gRVAgd2lsbCBtb2RpZnkgbG93ZXIgOCBiaXRzKG1heCkgb2YgbXNpIGRhdGEgd2hpbGUKKwkgKiBzZW5kaW5nIGFueSBtc2kgaW50ZXJydXB0CisJICovCisJbXNnLmFkZHJlc3NfaGkgPSAweDA7CisJbXNnLmFkZHJlc3NfbG8gPSBwcC0+bXNpX21ib3hfaGFuZGxlOworCW1zZy5kYXRhID0gcG9zOworCXdyaXRlX21zaV9tc2coaXJxLCAmbXNnKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGFyY2hfdGVhcmRvd25fbXNpX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWNsZWFuX2lycShpcnEpOworfQorCitzdGF0aWMgaW50IGNvbWNlcnRvX21zaV9pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQoreworCXN0cnVjdCBwY2llX2FwcF9yZWcgKmFwcF9yZWcgPSAoc3RydWN0IHBjaWVfYXBwX3JlZyAqKXBwLT5hcHBfcmVnczsKKworCXBwLT5tc2lfbWJveF9iYXNlYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBzaXplb2YodTMyKSwgJnBwLT5tc2lfbWJveF9oYW5kbGUsIEdGUF9LRVJORUwpOworCWlmICghcHAtPm1zaV9tYm94X2Jhc2VhZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUENJZSglZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSBtc2kgbWFpbGJveCBjb2hlcmVudCBtZW1vcnlcbiIsIHBwLT5wb3J0KTsKKwkJZ290byBlcnI7CisJfQorCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9NU0lfQUREUl9MTywgNCwgcHAtPm1zaV9tYm94X2hhbmRsZSk7CisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9NU0lfQUREUl9ISSwgNCwgMCk7CisJLyogRW5iYWxlIE1TSSBpbnRlcnJ1cHQqLworCXdyaXRlbChyZWFkbChwcC0+dmFfYXBwX2Jhc2UgKyBhcHBfcmVnLT5pbnRyX2VuKSB8IElOVFJfQ1RSTF9NU0ksCisJCQlwcC0+dmFfYXBwX2Jhc2UgKyBhcHBfcmVnLT5pbnRyX2VuKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCXJldHVybiAtMTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb21jZXJ0b19wY2llX3JjX2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHApCit7CisJc3RydWN0IHBjaWVfYXBwX3JlZyAqYXBwX3JlZyA9IHBwLT5hcHBfcmVnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisKKwkvL0ZJWE1FIDogQml0OjI3IGRlZmluaXRpb24gaXMgbm90IGNsZWFyIGZyb20gZG9jdW1lbnQKKwkvLwkgIFRoaXMgcmVnaXN0ZXIgc2V0dGluZyBpcyBjb3BpZWQgZnJvbSBzaW11bGF0aW9uIGNvZGUuCisJd3JpdGVsKHJlYWRsKHBwLT52YV9hcHBfYmFzZSArIGFwcF9yZWctPmNmZzApIHwgMHgwODAwN0ZGMCwKKwkJCXBwLT52YV9hcHBfYmFzZSArIGFwcF9yZWctPmNmZzApOworCisKKwkvKioKKwkgKkZJWE1FIDogQml0OjE1IGRlZmluaXRpb24gaXMgbm90IGNsZWFyIGZyb20gZG9jdW1lbnQKKwkgKgkgIFRoaXMgcmVnaXN0ZXIgc2V0dGluZyBpcyBjb3BpZWQgZnJvbSBzaW11bGF0aW9uIGNvZGUuCisJICovCisJd3JpdGVsKHJlYWRsKHBwLT52YV9hcHBfYmFzZSArIGFwcF9yZWctPmNmZzQpIHwgMHgwMDAwODAwMCwKKwkJCXBwLT52YV9hcHBfYmFzZSArIGFwcF9yZWctPmNmZzQpOworCisJY29tY2VydG9fZGJpX3JlYWRfcmVnKHBwLCBQQ0lFX0FGTDBMMV9SRUcsIDQsICZ2YWwpOworCXZhbCAmPSB+KDB4MDBGRkZGMDApOworCXZhbCB8PSAweDAwRjFGMTAwOworCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcocHAsIFBDSUVfQUZMMEwxX1JFRywgNCwgdmFsKTsKKworCWlmKHBjaWVfZ2VuMV9vbmx5KQorCXsKKwkJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9MQ05UMl9SRUcsIDQsIDB4MSk7CisJCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcocHAsIFBDSUVfTENBUF9SRUcsIDQsIDB4MSk7CisJfQorCWVsc2UKKwl7CisJCWNvbWNlcnRvX2RiaV9yZWFkX3JlZyhwcCwgUENJRV9HMkNUUkxfUkVHLCA0LCAmdmFsKTsKKwkJdmFsICY9IH4oMHhGRik7CisJCXZhbCB8PSAweEYxOworCQljb21jZXJ0b19kYmlfd3JpdGVfcmVnKHBwLCBQQ0lFX0cyQ1RSTF9SRUcsIDQsIHZhbCk7CisKKwkJLy8gaW5zdHJ1Y3QgcGNpZSB0byBzd2l0Y2ggdG8gZ2VuMiBhZnRlciBpbml0CisJCWNvbWNlcnRvX2RiaV9yZWFkX3JlZyhwcCwgUENJRV9HMkNUUkxfUkVHLCA0LCAmdmFsKTsKKwkJdmFsIHw9ICgxIDw8IDE3KTsKKwkJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9HMkNUUkxfUkVHLCA0LCB2YWwpOworCX0KKworCS8qc2V0dXAgaUFUVSBmb3Igb3V0Ym91bmQgdHJhbnNsYXRpb24gKi8KKwlQQ0lFX1NFVFVQX2lBVFVfT0JfRU5UUlkoIHBwLCBpQVRVX0VOVFJZX01FTSwgaUFUVV9HRVRfTUVNX0JBU0UocHAtPnJlbW90ZV9tZW1fYmFzZWFkZHIpLAorCQkJaUFUVV9NRU1fU0laRSAtIDEsIDAsIDAsIHBwLT5yZW1vdGVfbWVtX2Jhc2VhZGRyICk7CisJUENJRV9TRVRVUF9pQVRVX09CX0VOVFJZKCBwcCwgaUFUVV9FTlRSWV9JTywgaUFUVV9HRVRfSU9fQkFTRShwcC0+cmVtb3RlX21lbV9iYXNlYWRkciksCisJCQlpQVRVX0lPX1NJWkUgLSAxLCAoQVhJX09QX1RZUEVfSU9fUkRSVyAmIGlBVFVfQ1RSTDFfVFlQRV9NQVNLKSwKKwkJCTAsIGlBVFVfR0VUX0lPX0JBU0UocHAtPnJlbW90ZV9tZW1fYmFzZWFkZHIpICk7CisJUENJRV9TRVRVUF9pQVRVX09CX0VOVFJZKCBwcCwgaUFUVV9FTlRSWV9NU0csIGlBVFVfR0VUX01TR19CQVNFKHBwLT5yZW1vdGVfbWVtX2Jhc2VhZGRyKSwKKwkJCWlBVFVfTVNHX1NJWkUgLSAxLCAoQVhJX09QX1RZUEVfTVNHX1JFUSAmIGlBVFVfQ1RSTDFfVFlQRV9NQVNLKSwKKwkJCTAsIGlBVFVfR0VUX01TR19CQVNFKHBwLT5yZW1vdGVfbWVtX2Jhc2VhZGRyKSApOworCVBDSUVfU0VUVVBfaUFUVV9JQl9FTlRSWSggcHAsIDAsIDAsCisJCQlJTkJPVU5EX0FERFJfTUFTSywgMCwgMCwgQ09NQ0VSVE9fQVhJX0REUl9CQVNFKTsKKworfQorCitzdGF0aWMgaW50IHBjaWVfYXBwX2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHAsIGludCBuciwgaW50IG1vZGUpCit7CisKKwlpZiAobnIgPiBNQVhfUENJRV9QT1JUUykgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHBvcnRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnIwOworCX0KKworCWlmIChtb2RlICE9IENGRzBfREVWX1RZUEVfUkMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5zdXBwb3J0ZWQgbW9kZSBzZWxlY3RlZCBtb2RlOiAlZC4gXG4iLCBfX2Z1bmNfXywgbW9kZSk7CisJCWdvdG8gZXJyMDsKKwl9CisKKyAgICAgICAgbWVtc2V0KHBwLCAwLCBzaXplb2Yoc3RydWN0IHBjaWVfcG9ydCkpOworCisJcHAtPnBvcnQgPSBucjsKKyAgICAgICAgcHAtPmFwcF9yZWdzID0gJmFwcF9yZWdzW25yXTsKKyAgICAgICAgcHAtPnJvb3RfYnVzX25yID0gbnI7CisgICAgICAgIHBwLT5iYXNlID0gcGNpZV9jbmZfYmFzZV9hZGRyW25yXTsKKyAgICAgICAgcHAtPmFwcF9iYXNlID0gKHVuc2lnbmVkIGxvbmcpQ09NQ0VSVE9fQVBCX1BDSV9TQVRBX1VTQl9DVFJMX0JBU0U7CisJcHAtPnZhX2FwcF9iYXNlID0gKHZvaWQgX19pb21lbSAqKUFQQl9WQUREUihDT01DRVJUT19BUEJfUENJX1NBVEFfVVNCX0NUUkxfQkFTRSk7CisgICAgICAgIHBwLT5yZW1vdGVfbWVtX2Jhc2VhZGRyID0gcGNpZV9yZW1vdGVfYmFzZV9hZGRyW25yXTsKKworCWlmICghbnIpCisJCXBwLT52YV9kYmlfYmFzZSA9ICh2b2lkIF9faW9tZW0gKikgQ09NQ0VSVE9fQVhJX1BDSWUwX1ZBRERSX0JBU0U7CisJZWxzZQorCQlwcC0+dmFfZGJpX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopIENPTUNFUlRPX0FYSV9QQ0llMV9WQUREUl9CQVNFOworCisJcHAtPnZhX2NmZzBfYmFzZSA9ICh2b2lkIF9faW9tZW0gKikKKwkJaW9yZW1hcCggaUFUVV9HRVRfQ0ZHMF9CQVNFKHBwLT5yZW1vdGVfbWVtX2Jhc2VhZGRyKSwgaUFUVV9DRkcwX1NJWkUpOworCWlmICghcHAtPnZhX2NmZzBfYmFzZSkgeworCQlwcl9lcnIoImVycm9yIHdpdGggaW9yZW1hcCBpbiBmdW5jdGlvbiAlc1xuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjA7CisJfQorCXBwLT52YV9jZmcxX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopCisJCWlvcmVtYXAoIGlBVFVfR0VUX0NGRzFfQkFTRShwcC0+cmVtb3RlX21lbV9iYXNlYWRkcikgLCBpQVRVX0NGRzFfU0laRSk7CisJaWYgKCFwcC0+dmFfY2ZnMV9iYXNlKSB7CisJCXByX2VycigiZXJyb3Igd2l0aCBpb3JlbWFwIGluIGZ1bmN0aW9uICVzXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyMTsKKwl9CisKKwlwcC0+aW50eF9iYXNlID0gcGNpZV9pbnR4X2Jhc2VbbnJdOworCXBwLT5tc2lfYmFzZSA9IHBjaWVfbXNpX2Jhc2VbbnJdOworCXBwLT5pcnEgPSBwY2llX2lycXNbbnJdOworCXNwaW5fbG9ja19pbml0KCZwcC0+Y29uZl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHAtPmludHJfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnBwLT5tc2lfbWFwX2xvY2spOworCW1lbXNldChwcC0+cmVzLCAwLCBzaXplb2YocHAtPnJlcykpOworCisJLyogR2V0IHRoZSByZWZlcmVuY2UgY2xvY2sgdG8gUENJZSBwb3J0Ki8KKwlzd2l0Y2ggKG5yKSB7CisJCWNhc2UgMDoKKwkJCXBwLT5yZWZfY2xvY2sgPSBjbGtfZ2V0KE5VTEwsICJwY2llMCIpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXBwLT5yZWZfY2xvY2sgPSBjbGtfZ2V0KE5VTEwsICJwY2llMSIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBJbnZhbGlkIHBvcnRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZXJyMjsKKwl9CisJaWYgKElTX0VSUihwcC0+cmVmX2Nsb2NrKSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gb2J0YWluIHBjaWUlZCBjbG9jazogJWxkXG4iLCBfX2Z1bmNfXywgbnIsIFBUUl9FUlIocGNpZV9wb3J0W25yXS5yZWZfY2xvY2spKTsKKwkJZ290byBlcnIyOworCX0KKworCS8qIEVuYWJsZSB0aGUgUENJRV9PQ0MgY2xvY2sgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19QQ0lFX09DQ19DTE9DSykKKwlwcC0+b2NjX2Nsb2NrID0gY2xrX2dldChOVUxMLCJwY2llX29jYyIpOworCWlmIChJU19FUlIocHAtPm9jY19jbG9jaykpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIG9idGFpbiBwY2llX29jYyBjbG9jazogJWxkXG4iLCBfX2Z1bmNfXywgUFRSX0VSUihwcC0+b2NjX2Nsb2NrKSk7CisJCWdvdG8gZXJyX29jY19jbG9jazsKKwl9CisjZW5kaWYKKwlwY2llX3BvcnRfc2V0X21vZGUobnIsIG1vZGUpOworCQorCXJldHVybiAwOworCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fUENJRV9PQ0NfQ0xPQ0spCitlcnJfb2NjX2Nsb2NrOgorCWNsa19wdXQocHAtPm9jY19jbG9jayk7CisjZW5kaWYKKworZXJyMjoKKwlpb3VubWFwKHBwLT52YV9jZmcxX2Jhc2UpOworZXJyMToKKwlpb3VubWFwKHBwLT52YV9jZmcwX2Jhc2UpOworZXJyMDoKKwlyZXR1cm4gLTE7CisKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0MyS19FVk0pIHx8IGRlZmluZWQoQ09ORklHX0MyS19BU0lDKQorI2RlZmluZSBQQ0lFX0RFVl9FWFRfUkVTRVRfREVBU1NFUlQoX2lkKSBcCisJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fT1VUUFVUX1JFRykgJiB+KEdQSU9fUElOXzI3KSwgQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHKTsKKworI2RlZmluZSBQQ0lFX0RFVl9FWFRfUkVTRVRfQVNTRVJUKF9pZCkgXAorCXdyaXRlbChyZWFkbChDT01DRVJUT19HUElPX09VVFBVVF9SRUcpIHwgKEdQSU9fUElOXzI3KSwgQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHKTsKKyNlbHNlCisvKiBCb2FyZCBzcGVjaWZpYyAqLworI2RlZmluZSBQQ0lFX0RFVl9FWFRfUkVTRVRfREVBU1NFUlQoX2lkKQorI2RlZmluZSBQQ0lFX0RFVl9FWFRfUkVTRVRfQVNTRVJUKF9pZCkKKyNlbmRpZgorCitzdGF0aWMgaW50IGNvbWNlcnRvX3BjaWVfZGV2aWNlX3Jlc2V0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQoreworCWludCBpaTsKKwlzdHJ1Y3QgcGNpZV9wb3J0ICpsX3BwID0gcHA7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRU5URVI6IEJyaW5naW5nIFBDSWUlZCBkZXZpY2UgcmVzZXRcbiIsIHBwLT5wb3J0KTsKKwlpZiAoIXBwLT5saW5rX3N0YXRlKQorCQlyZXR1cm4gLTE7CisKKwkvKiBPbiBDMktFVk0gYW5kIEFTSUMgc2FtZSByZXNldCBpcyBjb25uZWN0ZWQgdG8gUENJZTAvMS4KKyAgICAgICAgICogU28sIGRldmljZSBtaWdodCBoYXZlIGtlcHQgaW4gcmVzZXQsIHVzaW5nIG90aGVyIFBDSWUgaG9zdC4KKwkgKi8KKwlpZiAoIWNvbWNlcnRvX3BjaWVfbGlua191cChwcCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgOiBEZXZpY2UgaXMgYWxyZWFkeSBsaW5rIGRvd24gc3RhdGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwkvKkZJWE1FIDogQmVsb3cgY29kZSBtaWdodCBiZSByZXF1aXJlZCBpZiB3ZSB3YW50IHRvIHJlc2V0IHBjaWUgZGV2aWNlLCB3aXRob3V0CisgICAgICAgICAqICAgICAgICBpbnZva2luZyBwY2llIGRldmljZSBzdXBlbmQuIElmIHdlIGludm9rZSBwY2llIGRldmljZSBzdXNwZW5kIGl0IHdpbGwKKwkgKgkgIHRha2UgY2FyZSBvZiBzYXZpbmcgcGNpZSBjb25maWcgc3BhY2UuCisgICAgICAgICAqLworI2lmIDAKKwkvKiBOb3cgc2F2ZSB0aGUgUENJZSBkZXZpY2UgY29uZmlndXJhdGlvbiBzcGFjZS4qLworCXdoaWxlKChwY2lfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpKSB7CisJCWlmIChwcC0+cm9vdF9idXNfbnIgPT0gcGNpX2Rldi0+YnVzLT5udW1iZXIpIHsKKwkJCXBjaV9zYXZlX3N0YXRlKHBjaV9kZXYpOworCQl9CisJfQorCisJLyogT24gQzJLRVZNL0FTSUMsIHNpbmNlIHNhbWUgR1BJTzI3IGlzIHVzZWQgdG8gcmVzZXQgUENJZTAvUENJZTEgZGV2aWNlcywKKwkgKiBzYXZlIGNvbmZpZ3VyYXRpb24gb2YgZGV2aWNlcyBvbiBvdGhlciBQQ0llIGFsc28uCisJICogVGhpcyBtYXkgbm90IGJlIGFwcGxpY2FibGUgZm9yIG90aGVyIGN1dG9tZXIgYm9hcmRzLgorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0MyS19FVk0pIHx8IGRlZmluZWQoQ09ORklHX0MyS19BU0lDKQorCWxfcHAgPSAmcGNpZV9wb3J0WyFwcC0+cG9ydF07CisJcGNpX2RldiA9IE5VTEw7CisKKwlpZiAobF9wcC0+bGlua19zdGF0ZSkgeworCQl3aGlsZSgocGNpX2RldiA9IHBjaV9nZXRfc3Vic3lzKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXYpKSkgeworCQkJaWYgKGxfcHAtPnJvb3RfYnVzX25yID09IHBjaV9kZXYtPmJ1cy0+bnVtYmVyKSB7CisJCQkJcGNpX3NhdmVfc3RhdGUocGNpX2Rldik7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKyNlbmRpZgorCisJLyoqKioqKioqKioqKioqIFJlYWR5IHRvIGlzc3VlIHJlc3QgKioqKioqKioqKioqKioqKiovCisJLyogRGUtYXNzZXJ0IGV4dGVybmFsIHJlc2V0IChHUElPLTI3KSAqLworCVBDSUVfREVWX0VYVF9SRVNFVF9ERUFTU0VSVChwcC0+cG9ydCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiRVhJVDogQnJpbmdpbmcgUENJZSVkIGRldmljZSByZXNldFxuIiwgcHAtPnBvcnQpOworCisJcmV0dXJuIDA7CisKK30KKworCitzdGF0aWMgaW50IGNvbWNlcnRvX3BjaWVfZGV2aWNlX3Jlc2V0X2V4aXQoc3RydWN0IHBjaWVfcG9ydCAqcHApCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKworCXByaW50ayhLRVJOX0lORk8gIkVOVEVSOiBCcmluZ2luZyBQQ0llJWQgZGV2aWNlIG91dC1vZi1yZXNldFxuIiwgcHAtPnBvcnQpOworCisJaWYgKCFwcC0+bGlua19zdGF0ZSAmJiBwcC0+cmVzZXQpCisJCXJldHVybiAtMTsKKworCS8qIFB1bGwgdXAgZXh0ZXJuYWwgcmVzZXQgKi8KKwkvKiBhc3NlcnQgZXh0ZXJuYWwgcmVzZXQgKEdQSU8tMjcpICovCisJUENJRV9ERVZfRVhUX1JFU0VUX0FTU0VSVChwcC0+cG9ydCk7CisKKwl1ZGVsYXkoMTAwMCk7CisJdWRlbGF5KDEwMDApOworCXVkZWxheSgxMDAwKTsKKwl1ZGVsYXkoMTAwMCk7CisJdWRlbGF5KDEwMDApOworCXVkZWxheSgxMDAwKTsKKwl1ZGVsYXkoMTAwMCk7CisKKwkvKiBSZXN0b3JlIHRoZSBSQyBjb25maWd1cmF0aW9uICovCisJY29tY2VydG9fZGJpX3JlYWRfcmVnKHBwLCBQQ0lFX0FGTDBMMV9SRUcsIDQsICZ2YWwpOworCXZhbCAmPSB+KDB4MDBGRkZGMDApOworCXZhbCB8PSAweDAwRjFGMTAwOworCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcocHAsIFBDSUVfQUZMMEwxX1JFRywgNCwgdmFsKTsKKworCWlmKHBjaWVfZ2VuMV9vbmx5KQorCXsKKwkJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9MQ05UMl9SRUcsIDQsIDB4MSk7CisJCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcocHAsIFBDSUVfTENBUF9SRUcsIDQsIDB4MSk7CisJfQorCWVsc2UKKwl7CisJCWNvbWNlcnRvX2RiaV9yZWFkX3JlZyhwcCwgUENJRV9HMkNUUkxfUkVHLCA0LCAmdmFsKTsKKwkJdmFsICY9IH4oMHhGRik7CisJCXZhbCB8PSAweEYxOworCQljb21jZXJ0b19kYmlfd3JpdGVfcmVnKHBwLCBQQ0lFX0cyQ1RSTF9SRUcsIDQsIHZhbCk7CisJfQorCisJLy8gaW5zdHJ1Y3QgcGNpZSB0byBzd2l0Y2ggdG8gZ2VuMiBhZnRlciBpbml0CisJY29tY2VydG9fZGJpX3JlYWRfcmVnKHBwLCBQQ0lFX0cyQ1RSTF9SRUcsIDQsICZ2YWwpOworCXZhbCB8PSAoMSA8PCAxNyk7CisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9HMkNUUkxfUkVHLCA0LCB2YWwpOworCisJLypzZXR1cCBpQVRVIGZvciBvdXRib3VuZCB0cmFuc2xhdGlvbiAqLworCVBDSUVfU0VUVVBfaUFUVV9PQl9FTlRSWSggcHAsIGlBVFVfRU5UUllfTUVNLCBpQVRVX0dFVF9NRU1fQkFTRShwcC0+cmVtb3RlX21lbV9iYXNlYWRkciksCisJCQlpQVRVX01FTV9TSVpFIC0gMSwgMCwgMCwgcHAtPnJlbW90ZV9tZW1fYmFzZWFkZHIgKTsKKwlQQ0lFX1NFVFVQX2lBVFVfT0JfRU5UUlkoIHBwLCBpQVRVX0VOVFJZX0lPLCBpQVRVX0dFVF9JT19CQVNFKHBwLT5yZW1vdGVfbWVtX2Jhc2VhZGRyKSwKKwkJCWlBVFVfSU9fU0laRSAtIDEsIChBWElfT1BfVFlQRV9JT19SRFJXICYgaUFUVV9DVFJMMV9UWVBFX01BU0spLAorCQkJMCwgaUFUVV9HRVRfSU9fQkFTRShwcC0+cmVtb3RlX21lbV9iYXNlYWRkcikgKTsKKwlQQ0lFX1NFVFVQX2lBVFVfT0JfRU5UUlkoIHBwLCBpQVRVX0VOVFJZX01TRywgaUFUVV9HRVRfTVNHX0JBU0UocHAtPnJlbW90ZV9tZW1fYmFzZWFkZHIpLAorCQkJaUFUVV9NU0dfU0laRSAtIDEsIChBWElfT1BfVFlQRV9NU0dfUkVRICYgaUFUVV9DVFJMMV9UWVBFX01BU0spLAorCQkJMCwgaUFUVV9HRVRfTVNHX0JBU0UocHAtPnJlbW90ZV9tZW1fYmFzZWFkZHIpICk7CisJUENJRV9TRVRVUF9pQVRVX0lCX0VOVFJZKCBwcCwgMCwgMCwKKwkJCUlOQk9VTkRfQUREUl9NQVNLLCAwLCAwLCBDT01DRVJUT19BWElfRERSX0JBU0UpOworCisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9NU0lfQUREUl9MTywgNCwgcHAtPm1zaV9tYm94X2hhbmRsZSk7CisJY29tY2VydG9fZGJpX3dyaXRlX3JlZyhwcCwgUENJRV9NU0lfQUREUl9ISSwgNCwgMCk7CisKKwl3cml0ZWxfcmVsYXhlZCgweDcsIHBwLT52YV9hcHBfYmFzZSArIHBwLT5hcHBfcmVncy0+Y2ZnNSk7CisKKwkvKiBHZW5lcmljIFBDSWUgdW5pdCBzZXR1cC4qLworCisJLyogRW5hYmxlIG93biBCTUUuIEl0IGlzIG5lY2Vzc2FyeSB0byBlbmFibGUgb3duIEJNRSB0byBkbyBhCisJICogbWVtb3J5IHRyYW5zYWN0aW9uIG9uIGEgZG93bnN0cmVhbSBkZXZpY2UKKwkgKi8KKwljb21jZXJ0b19kYmlfcmVhZF9yZWcocHAsIFBDSV9DT01NQU5ELCAyLCAmdmFsKTsKKwl2YWwgfD0gKFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSCisJCQl8IFBDSV9DT01NQU5EX1BBUklUWSB8IFBDSV9DT01NQU5EX1NFUlIpOworCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcocHAsIFBDSV9DT01NQU5ELCAyLCB2YWwpOworCisJcHAtPmNmZzBfcHJldl90YWRkciA9IDB4ZmZmZmZmZmY7CisJcHAtPmNmZzFfcHJldl90YWRkciA9IDB4ZmZmZmZmZmY7CisKKwkvL3VkZWxheSgxMDAwKTsKKworCWlmKGNvbWNlcnRvX3BjaWVfbGlua191cChwcCkpIHsKKwlwcmludGsoS0VSTl9JTkZPICIgQnJpbmdpbmcgUENJZSVkIGRldmljZSBvdXQtb2YtcmVzZXQgOiBMaW5rIFVwXG4iLCBwcC0+cG9ydCk7CisJLypGSVhNRSA6IEJlbG93IGNvZGUgbWlnaHQgYmUgcmVxdWlyZWQgaWYgd2Ugd2FudCB0byBicmluZyBwY2llIGRldmljZSBvdXQtb2YtcmVzZXQsCisgICAgICAgICAqCSAgd2l0aG91dCBpbnZva2luZyBwY2llIGRldmljZSBzdXBlbmQuIElmIHdlIGludm9rZSBwY2llIGRldmljZSByZXN1bWUgaXQgd2lsbAorCSAqCSAgdGFrZSBjYXJlIG9mIHJlc3RvcmluZywgc2F2ZWQgcGNpZSBjb25maWcgc3BhY2UuCisgICAgICAgICAqLworI2lmIDAKKwkJcGNpX2RldiA9IE5VTEw7CisJCXdoaWxlKChwY2lfZGV2ID0gcGNpX2dldF9zdWJzeXMoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpKSB7CisJCQlpZiAocHAtPnJvb3RfYnVzX25yID09IHBjaV9kZXYtPmJ1cy0+bnVtYmVyKSB7CisJCQkJcGNpX3Jlc3RvcmVfc3RhdGUocGNpX2Rldik7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKworCXByaW50ayhLRVJOX0lORk8gIkVYSVQ6IEJyaW5naW5nIFBDSWUlZCBkZXZpY2Ugb3V0LW9mLXJlc2V0XG4iLCBwcC0+cG9ydCk7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIHNzaXplX3QgY29tY2VydG9fcGNpZV9zaG93X3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisgICAgICAgIHN0cnVjdCBwY2llX3BvcnQgKnBwID0gJnBjaWVfcG9ydFtwZGV2LT5pZF07CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHAtPnJlc2V0KTsKK30KKworc3RhdGljIHNzaXplX3QgY29tY2VydG9fcGNpZV9zZXRfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworICAgICAgICBzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9ICZwY2llX3BvcnRbcGRldi0+aWRdOworCWludCByZXNldCA9IDAsIHJjOworCisJaWYgKCFwY2llX3BvcnRfaXNfaG9zdChwZGV2LT5pZCkgfHwgICEocHAtPmxpbmtfc3RhdGUpKQorCQkJcmV0dXJuIGNvdW50OworCisJc3NjYW5mKGJ1ZiwgIiVkIiwgJnJlc2V0KTsKKworCXJlc2V0ID0gcmVzZXQgPyAxOjA7CisKKwlpZiAocHAtPnJlc2V0ID09IHJlc2V0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBbHJlYWR5IGluIHNhbWUgc3RhdGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCisJaWYgKHJlc2V0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIkVOVEVSIDogUHV0dGluZyBQQ0llJWQgZGV2aWNlIGludG8gcmVzZXRcbiIsIHBkZXYtPmlkKTsKKworCQlpZiAoIWNvbWNlcnRvX3BjaWVfZGV2aWNlX3Jlc2V0KHBwKSkgeworCQkJaW50IGlpID0gMTA7CisKKwkJCS8qIFdhaXQgZm9yIGxpbmtfcmVxX3JzdF9ub3QsIHRvIGJlIGRlLWFzc2V0ZWQgKi8KKwkJCXdoaWxlIChpaS0tKSB7CisKKwkJCQlpZiAoIShyZWFkbCggcHAtPnZhX2FwcF9iYXNlICsgcHAtPmFwcF9yZWdzLT5zdHMwICkgJiBTVFMwX0xJTktfUkVRX1JTVF9OT1QpKSB7CisJCQkJCXByaW50ayhLRVJOX0lORk8gIiVzIDogKFBDSWUlZCkgbGlua19yZXFfcnN0X25vdCBpcyBkZS1hc3NldGVkXG4iLCBfX2Z1bmNfXywgcHAtPnBvcnQpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQl1ZGVsYXkoMTAwMCk7CisJCQl9CisKKwkJCWlmIChpaSA9PSAxMCkgCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgOiAoUENJZSVkKSBsaW5rX3JlcV9yc3Rfbm90IGlzIG5vdCBkZS1hc3NldGVkIFxuIiwgX19mdW5jX18sIHBwLT5wb3J0KTsKKworCQkJcHAtPnJlc2V0ID0gMTsKKwkJCS8qIERpc2FibGUgTFRTU00gYW5kIGluaXRpYXRlIGxpbmtkb3duIHJlc2V0ICovCisJCQl3cml0ZWwoKHJlYWRsKHBwLT52YV9hcHBfYmFzZSArIHBwLT5hcHBfcmVncy0+Y2ZnNSkgJgorCQkJCQkJfihDRkc1X0xUU1NNX0VOQUJMRSkpIHwgQ0ZHNV9MSU5LX0RPV05fUlNULAorCQkJCQkJIHBwLT52YV9hcHBfYmFzZSArIHBwLT5hcHBfcmVncy0+Y2ZnNSk7CisJCQl1ZGVsYXkoMTAwMCk7CisJCX0KKworCQlwcmludGsoS0VSTl9JTkZPICJEaXNhYmxpbmcgUENJZSVkIENvbnRyb2xlciBDbG9ja1xuIiwgcGRldi0+aWQpOworCisJCWlmIChwY2llX3BvcnRbcGRldi0+aWRdLnBvcnRfbW9kZSAhPSBQQ0lFX1BPUlRfTU9ERV9OT05FKQorCQkJY2xrX2Rpc2FibGUocGNpZV9wb3J0W3BkZXYtPmlkXS5yZWZfY2xvY2spOworCisJCXByaW50ayhLRVJOX0lORk8gIkVYSVQgOiBQdXR0aW5nIFBDSWUlZCBkZXZpY2UgaW50byByZXNldFxuIiwgcGRldi0+aWQpOworCX0KKwllbHNlIHsKKworCQlwcmludGsoS0VSTl9JTkZPICJFTlRFUjogQnJpbmdpbmcgUENJZSVkIGRldmljZSBvdXRvZiByZXNldFxuIiwgcGRldi0+aWQpOworCisJCXByaW50ayhLRVJOX0lORk8gIkVuYWJsaW5nIFBDSWUlZCBDb250cm9sZXIgQ2xvY2tcbiIsIHBkZXYtPmlkKTsKKworCQlpZihwY2llX3BvcnRbcGRldi0+aWRdLnBvcnRfbW9kZSAhPSBQQ0lFX1BPUlRfTU9ERV9OT05FKSB7CisJCQlyYyA9IGNsa19lbmFibGUocGNpZV9wb3J0W3BkZXYtPmlkXS5yZWZfY2xvY2spOworCQkJaWYgKHJjKQorCQkJCXByX2VycigiJXM6IFBDSWUlZCBjbG9jayBlbmFibGUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgcGRldi0+aWQpOworCQl9CisKKwkJaWYgKCFjb21jZXJ0b19wY2llX2RldmljZV9yZXNldF9leGl0KHBwKSkgeworCQkJcHAtPnJlc2V0ID0gMDsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGRldmljZV9yZXNldCwgMDY0NCwgY29tY2VydG9fcGNpZV9zaG93X3Jlc2V0LCBjb21jZXJ0b19wY2llX3NldF9yZXNldCk7CisKKworc3RhdGljIHNzaXplX3QgY29tY2VydG9fcGNpZV9zZXJkZXNfcGQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworICAgICAgICBzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9ICZwY2llX3BvcnRbcGRldi0+aWRdOworCWludCByZXNldCA9IDAsIHJjOworCisJc3NjYW5mKGJ1ZiwgIiVkIiwgJnJlc2V0KTsKKworCXJlc2V0ID0gcmVzZXQgPyAxOjA7CisKKwlpZiAocmVzZXQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFB1dHRpbmcgU2VyZGVzIHRvIExvdyBQb3dlciBhbmQgQ01VIFBvd2VyIE9mZlxuIiwgX19mdW5jX18pOworCisJCWlmIChwZGV2LT5pZCkKKwkJCXdyaXRlbChyZWFkbChVU0JQSFlfU0VSREVTX1NUQVRfQkFTRSsweDQ0KSB8ICgoMHgzIDw8IDIpfCgweDEgPDwgNykpICwgVVNCUEhZX1NFUkRFU19TVEFUX0JBU0UrMHg0NCk7CisJCWVsc2UKKwkJCXdyaXRlbChyZWFkbChVU0JQSFlfU0VSREVTX1NUQVRfQkFTRSsweDM0KSB8ICgoMHgzIDw8IDIpfCgweDEgPDwgNykpICwgVVNCUEhZX1NFUkRFU19TVEFUX0JBU0UrMHgzNCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEdldHRpbmcgU2VyZGVzIG91dCBvZiBMb3cgUG93ZXIgYW5kIENNVSBQb3dlciBPblxuIiwgX19mdW5jX18pOworCisJCWlmIChwZGV2LT5pZCkKKwkJCXdyaXRlbChyZWFkbChVU0JQSFlfU0VSREVTX1NUQVRfQkFTRSsweDQ0KSAmIH4oKDB4MyA8PCAyKXwoMHgxIDw8IDcpKSAsIFVTQlBIWV9TRVJERVNfU1RBVF9CQVNFKzB4NDQpOworCQllbHNlCisJCQl3cml0ZWwocmVhZGwoVVNCUEhZX1NFUkRFU19TVEFUX0JBU0UrMHgzNCkgJiB+KCgweDMgPDwgMil8KDB4MSA8PCA3KSkgLCBVU0JQSFlfU0VSREVTX1NUQVRfQkFTRSsweDM0KTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihzZXJkZXNfcGQsIDA2NDQsIE5VTEwsIGNvbWNlcnRvX3BjaWVfc2VyZGVzX3BkKTsKKworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG5vX2lycV9yZXN1bWUgOworCitzdGF0aWMgaW50IGNvbWNlcnRvX3BjaWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IHZhbCwgaTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogcGNpZSBkZXZpY2UgJXAgKGlkID0gJWQpOlxuIiwKKwkJCSBfX2Z1bmNfXywgcGRldiwgcGRldi0+aWQpOworCisJLyogQ2hlY2sgZm9yIHRoZSBCaXRNYXNrIGJpdCBmb3IgUENJZSwgaWYgaXQgaXMgZW5hYmxlZAorCSAqIHRoZW4gd2UgYXJlIG5vdCBnb2luZyBzdXNwZW5kIHRoZSBQQ0llIGRldmljZSAsIGFzIGJ5CisJICogdGhpcyBkZXZpY2UgLCB3ZSB3aWxsIHdha2UgZnJvbSBTeXN0ZW0gUmVzdW1lLgorCSAqLworCWlmICggIShob3N0X3V0aWxwZV9zaGFyZWRfcG11X2JpdG1hc2sgJiBQQ0llMF9JUlEpIHx8ICEoaG9zdF91dGlscGVfc2hhcmVkX3BtdV9iaXRtYXNrICYgUENJZTFfSVJRKSApeworIAkJLyogV2Ugd2lsbCBKdXN0IHJldHVybiBmcm9tIGhlcmUgKi8KKwkJcmV0dXJuIDA7CisJfQorCWlmIChwY2llX3BvcnRbcGRldi0+aWRdLnBvcnRfbW9kZSAhPSBQQ0lFX1BPUlRfTU9ERV9OT05FKSB7CisJCWlmIChjb21jZXJ0b19wY2llX2xpbmtfdXAoJnBjaWVfcG9ydFtwZGV2LT5pZF0pKXsKKwkJCS8qIEVuYWJsZSBQTUUgdG8gcm9vdCBQb3J0ICovCisJCQljb21jZXJ0b19kYmlfcmVhZF9yZWcoJnBjaWVfcG9ydFtwZGV2LT5pZF0sIChQQ0lfQ0FQX1BNICsgUENJX1BNX0NUUkwpLCA0LCAmdmFsKTsKKwkJCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcoJnBjaWVfcG9ydFtwZGV2LT5pZF0sIChQQ0lfQ0FQX1BNICsgUENJX1BNX0NUUkwpLCA0LCB2YWwgfCBQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLKTsKKwkJCS8qIFJlcXVpcmVkIFBNIERlbGF5ICovCisJCQlmb3IgKGkgPSAwIDsgaSA8IDQwIDsgaSsrKQorCQkJCXVkZWxheSg1MDApOworCQl9CisJfQorCW5vX2lycV9yZXN1bWUgPTAgOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbWNlcnRvX3BjaWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsLCBpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBwY2llIGRldmljZSAlcCAoaWQgPSAlZClcbiIsIAorCQlfX2Z1bmNfXywgcGRldiwgcGRldi0+aWQpOworIAkvKiBDaGVjayBmb3IgdGhlIEJpdF9NYXNrIGJpdCBmb3IgUENJZSwgaWYgaXQgaXMgZW5hYmxlZAorIAkgKiB0aGVuIHdlIGFyZSBub3QgZ29pbmcgc3VzcGVuZCB0aGUgUENJZSBkZXZpY2UgLCBhcyBieQorCSAqIHRoaXMgZGV2aWNlICwgd2Ugd2lsbCB3YWtlIGZyb20gU3lzdGVtIFJlc3VtZS4KKyAJKi8KKwlpZiAoICEoaG9zdF91dGlscGVfc2hhcmVkX3BtdV9iaXRtYXNrICYgUENJZTBfSVJRKSB8fCAhKGhvc3RfdXRpbHBlX3NoYXJlZF9wbXVfYml0bWFzayAmIFBDSWUxX0lSUSkgKXsKKworIAkJLyogV2Ugd2lsbCBKdXN0IHJldHVybgorIAkJKi8KKwkJcmV0dXJuIDA7CisJfQorCWlmKCBub19pcnFfcmVzdW1lID09IDApCisgICAgICAgCXsKKwkJaWYocGNpZV9wb3J0W3BkZXYtPmlkXS5wb3J0X21vZGUgIT0gUENJRV9QT1JUX01PREVfTk9ORSkgeworCQkJaWYgKGNvbWNlcnRvX3BjaWVfbGlua191cCgmcGNpZV9wb3J0W3BkZXYtPmlkXSkpeworCQkgICAgCQkvKiBQdXQgSW4gRDAgU3RhdGUgKi8KKwkJICAgIAkJY29tY2VydG9fZGJpX3JlYWRfcmVnKCZwY2llX3BvcnRbcGRldi0+aWRdLCAoUENJX0NBUF9QTSArIFBDSV9QTV9DVFJMKSwgNCwgJnZhbCk7CisJCSAgICAJCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcoJnBjaWVfcG9ydFtwZGV2LT5pZF0sIChQQ0lfQ0FQX1BNICsgUENJX1BNX0NUUkwpLCA0LCB2YWwgJiAoflBDSV9QTV9DVFJMX1NUQVRFX01BU0spKTsKKworCQkJCS8qIFJlcXVpcmVkIFBNIERlbGF5ICovCisJCSAgICAJCWZvciAoaSA9IDAgOyBpIDwgNDAgOyBpKyspCisJCQkgICAgCQl1ZGVsYXkoNTAwKTsKKwkgICAgCQl9CQorCQl9CQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb21jZXJ0b19wY2llX25vaXJxX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHZhbCxpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBwY2llIGRldmljZSAlcCAoaWQgPSAlZClcbiIsCisJCQkgX19mdW5jX18sIHBkZXYsIHBkZXYtPmlkKTsKKworCS8qIENoZWNrIGZvciB0aGUgQml0X01hc2sgYml0IGZvciBQQ0llLCBpZiBpdCBpcyBlbmFibGVkCisJICogdGhlbiB3ZSBhcmUgbm90IGdvaW5nIHN1c3BlbmQgdGhlIFBDSWUgZGV2aWNlICwgYXMgYnkKKwkgKiB0aGlzIGRldmljZSAsIHdlIHdpbGwgd2FrZSBmcm9tIFN5c3RlbSBSZXN1bWUuCisJICovCisJaWYgKCAhKGhvc3RfdXRpbHBlX3NoYXJlZF9wbXVfYml0bWFzayAmIFBDSWUwX0lSUSkgfHwgIShob3N0X3V0aWxwZV9zaGFyZWRfcG11X2JpdG1hc2sgJiBQQ0llMV9JUlEpICl7CisgICAgICAgICAgICAgICAvKiBXZSB3aWxsIEp1c3QgcmV0dXJuCisgICAgICAgICAgICAgICAgKi8KKwkJcmV0dXJuIDA7CisJfQorCWlmKHBjaWVfcG9ydFtwZGV2LT5pZF0ucG9ydF9tb2RlICE9IFBDSUVfUE9SVF9NT0RFX05PTkUpIHsKKwkJaWYgKGNvbWNlcnRvX3BjaWVfbGlua191cCgmcGNpZV9wb3J0W3BkZXYtPmlkXSkpeworCQkJLyogUHV0IEluIEQwIFN0YXRlICovCisJCQljb21jZXJ0b19kYmlfcmVhZF9yZWcoJnBjaWVfcG9ydFtwZGV2LT5pZF0sIChQQ0lfQ0FQX1BNICsgUENJX1BNX0NUUkwpLCA0LCAmdmFsKTsKKwkJCWNvbWNlcnRvX2RiaV93cml0ZV9yZWcoJnBjaWVfcG9ydFtwZGV2LT5pZF0sIChQQ0lfQ0FQX1BNICsgUENJX1BNX0NUUkwpLCA0LCB2YWwgJiAoflBDSV9QTV9DVFJMX1NUQVRFX01BU0spKTsKKwkJCS8qIFJlcXVpcmVkIFBNIERlbGF5ICovCisJCQlmb3IgKGkgPSAwIDsgaSA8IDQwIDsgaSsrKQorCQkJCXVkZWxheSg1MDApOworCSAgICAJfQorCX0JCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBwY2llX3BsYXRmb3JtX3BtX29wcyA9IHsKKwkuc3VzcGVuZCA9IGNvbWNlcnRvX3BjaWVfc3VzcGVuZCwKKwkucmVzdW1lID0gY29tY2VydG9fcGNpZV9yZXN1bWUsCisJLnJlc3VtZV9ub2lycSA9IGNvbWNlcnRvX3BjaWVfbm9pcnFfcmVzdW1lLAorfTsKKworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjb21jZXJ0b19wY2llX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJwY2llIiwKKwkJLnBtICAgPSAmcGNpZV9wbGF0Zm9ybV9wbV9vcHMsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwY2llX3B3cjAgPSB7CisJLm5hbWUgPSAicGNpZSIsCisJLmlkID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBjaWVfcHdyMSA9IHsKKwkubmFtZSA9ICJwY2llIiwKKwkuaWQgPSAxLAorfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjb21jZXJ0b19zZXJkZXNfc2V0X3BvbGFyaXR5KHN0cnVjdCBzZXJkZXNfcmVnc19zICpwX3BjaWVfcGh5X3JlZ19maWxlLCBpbnQgY3VycmVudF9wb2xhcml0eSkKK3sKKwlzd2l0Y2goY3VycmVudF9wb2xhcml0eSkKKwl7CisJCWNhc2UgMDoKKwkJCXBfcGNpZV9waHlfcmVnX2ZpbGVbMHg3M10udmFsID0gMHgwOworCQkJcF9wY2llX3BoeV9yZWdfZmlsZVsweDc1XS52YWwgPSAweDA7CisJCQlicmVhazsKKwkJY2FzZSAxOiAKKwkJCXBfcGNpZV9waHlfcmVnX2ZpbGVbMHg3M10udmFsID0gMHg4OworCQkJcF9wY2llX3BoeV9yZWdfZmlsZVsweDc1XS52YWwgPSAweDI7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcF9wY2llX3BoeV9yZWdfZmlsZVsweDczXS52YWwgPSAweDA7CisJCQlwX3BjaWVfcGh5X3JlZ19maWxlWzB4NzVdLnZhbCA9IDB4MjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlwX3BjaWVfcGh5X3JlZ19maWxlWzB4NzNdLnZhbCA9IDB4ODsKKwkJCXBfcGNpZV9waHlfcmVnX2ZpbGVbMHg3NV0udmFsID0gMHgwOworCQkJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyBpbnQgY29tY2VydG9fcGNpZV9ic3BfbGlua19pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwLCBpbnQgbnIsIHN0cnVjdCBzZXJkZXNfcmVnc19zICpwX3BjaWVfcGh5X3JlZ19maWxlLCBpbnQgc2VyZGVzX3JlZ19zaXplLCBpbnQgY3VycmVudF9wb2xhcml0eSkKK3sKKwlpbnQgYXhpX3BjaWVfY29tcG9uZW50OworCWludCBwY2llX2NvbXBvbmVudDsKKwlpbnQgc2VyZGVzX2NvbXBvbmVudDsKKwlpbnQgcmM7CisJaW50IGlmX2VyciA9IDE7CisKKwljb21jZXJ0b19zZXJkZXNfc2V0X3BvbGFyaXR5KHBfcGNpZV9waHlfcmVnX2ZpbGUsIGN1cnJlbnRfcG9sYXJpdHkpOworCisJaWYobnIgPT0gMCkKKwl7CisJCWF4aV9wY2llX2NvbXBvbmVudCA9IENPTVBPTkVOVF9BWElfUENJRTA7CisJCXBjaWVfY29tcG9uZW50ID0gQ09NUE9ORU5UX1NFUkRFU19QQ0lFMDsJCisJCXNlcmRlc19jb21wb25lbnQgPSBDT01QT05FTlRfU0VSREVTMDsKKwl9CisJZWxzZQorCXsKKwkJYXhpX3BjaWVfY29tcG9uZW50ID0gQ09NUE9ORU5UX0FYSV9QQ0lFMTsKKwkJcGNpZV9jb21wb25lbnQgPSBDT01QT05FTlRfU0VSREVTX1BDSUUxOwkKKwkJc2VyZGVzX2NvbXBvbmVudCA9IENPTVBPTkVOVF9TRVJERVMxOworCX0KKworCS8vQnJpbmcgc2VyZGVzIG91dCBvZiByZXNldAorCWMyMDAwX2Jsb2NrX3Jlc2V0KGF4aV9wY2llX2NvbXBvbmVudCwwKTsKKwljMjAwMF9ibG9ja19yZXNldChzZXJkZXNfY29tcG9uZW50LDApOworCisJLyogU1cgc2VsZWN0IGZvciBja19zb2NfZGl2X2kgU09DIGNsb2NrICovCisJd3JpdGVsKDB4RkYzQywgQ09NQ0VSVE9fU0VSREVTX0RXQ19DRkdfUkVHKCBuciwgU0RfUEhZX0NUUkwzX1JFR19PRlNUICkpOworCXdyaXRlbChyZWFkbChDT01DRVJUT19TRVJERVNfRFdDX0NGR19SRUcoIG5yLCBTRF9QSFlfQ1RSTDJfUkVHX09GU1QgKSkgJiB+MHgzLAorCQkJQ09NQ0VSVE9fU0VSREVTX0RXQ19DRkdfUkVHKCBuciwgU0RfUEhZX0NUUkwyX1JFR19PRlNUICkpOworCisJcmMgPSBjbGtfZW5hYmxlKHBwLT5yZWZfY2xvY2spOworCWlmIChyYyl7CisJCXByX2VycigiJXM6IFBDSWUlZCBjbG9jayBlbmFibGUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgbnIpOworCQlnb3RvIGVycjE7CisJfQorCQorCS8qIEVuYWJsZSB0aGUgUENJRV9PQ0MgY2xvY2sgKi8JCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fUENJRV9PQ0NfQ0xPQ0spCisJcmMgPSAgY2xrX2VuYWJsZShwcC0+b2NjX2Nsb2NrKTsKKwlpZiAocmMpeworCQlwcl9lcnIoIiVzOiBQQ0llX29jYyBjbG9jayBlbmFibGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX29jY19jbG9jazsKKwl9CisjZW5kaWYKKworCS8qIFNlcmRlcyBJbml0aWFsaXphdGlvbi4gKi8KKwlpZiggc2VyZGVzX3BoeV9pbml0KG5yLCAgcF9wY2llX3BoeV9yZWdfZmlsZSwKKwkJCQlzZXJkZXNfcmVnX3NpemUvIHNpemVvZihzZXJkZXNfcmVnc190KSwKKwkJCQlTRF9ERVZfVFlQRV9QQ0lFKSApCisJeworCQlwcC0+cG9ydF9tb2RlID0gUENJRV9QT1JUX01PREVfTk9ORTsKKwkJcHJfZXJyKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgc2VyZGVzICglZClcbiIsIF9fZnVuY19fLCBuciApOworCQlnb3RvIGVycl9waHlfbGluazsKKwl9CisKKwltZGVsYXkoMSk7IC8vQWZ0ZXIgQ01VIGxvY2tzIHdhaXQgZm9yIHNvbWV0aW1lCisKKyNpZiBkZWZpbmVkKENPTkZJR19DMktfTUZDTl9FVk0pCisJaWYobnIgPT0gMCl7CisJCUdQSU9fcmVzZXRfZXh0ZXJuYWxfZGV2aWNlKENPTVBPTkVOVF9QQ0lFMCwwKTsKKwl9ZWxzZXsKKwkJR1BJT19yZXNldF9leHRlcm5hbF9kZXZpY2UoQ09NUE9ORU5UX1BDSUUxLDApOworCX0KKworCW1kZWxheSgxKTsKKyNlbmRpZgorCS8vQnJpbmcgUENJZSBvdXQgb2YgcmVzZXQKKwljMjAwMF9ibG9ja19yZXNldChwY2llX2NvbXBvbmVudCwwKTsKKworCS8vSG9sZCB0aGUgTFRTU00gaW4gZGV0ZWN0IHN0YXRlCisJd3JpdGVsKHJlYWRsKHBwLT52YV9hcHBfYmFzZSArIHBwLT5hcHBfcmVncy0+Y2ZnNSkgJiB+Q0ZHNV9MVFNTTV9FTkFCTEUsCisJCQlwcC0+dmFfYXBwX2Jhc2UgKyBwcC0+YXBwX3JlZ3MtPmNmZzUpOworCisJY29tY2VydG9fcGNpZV9yY19pbml0KHBwKTsKKworCS8vRW5hYmxlIExUU1NNIHRvIHN0YXJ0IGxpbmsgaW5pdGlhbGl6YXRpb24KKwl3cml0ZWwocmVhZGwocHAtPnZhX2FwcF9iYXNlICsgcHAtPmFwcF9yZWdzLT5jZmc1KSB8IChDRkc1X0FQUF9JTklUX1JTVCB8IENGRzVfTFRTU01fRU5BQkxFKSwKKwkJCXBwLT52YV9hcHBfYmFzZSArIHBwLT5hcHBfcmVncy0+Y2ZnNSk7CisKKwlwcC0+bGlua19zdGF0ZSA9IGNvbWNlcnRvX3BjaWVfbGlua191cCggJnBjaWVfcG9ydFtucl0gKTsKKworCWlmKCFwcC0+bGlua19zdGF0ZSkKKwl7CisJCWlmX2VyciA9IDA7CisJCWdvdG8gZXJyX3BoeV9saW5rOworCX0KKworCXJldHVybiAwOworCitlcnJfcGh5X2xpbms6CisJY2xrX2Rpc2FibGUocHAtPnJlZl9jbG9jayk7CisJY2xrX3B1dChwcC0+cmVmX2Nsb2NrKTsKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19QQ0lFX09DQ19DTE9DSykKK2Vycl9vY2NfY2xvY2s6CisJY2xrX2Rpc2FibGUocHAtPm9jY19jbG9jayk7CisJY2xrX3B1dChwcC0+b2NjX2Nsb2NrKTsKKyNlbmRpZgorCitlcnIxOgorCS8vUHV0IGFsbCB0byByZXNldAorCWMyMDAwX2Jsb2NrX3Jlc2V0KGF4aV9wY2llX2NvbXBvbmVudCwxKTsKKwljMjAwMF9ibG9ja19yZXNldChzZXJkZXNfY29tcG9uZW50LDEpOworCWMyMDAwX2Jsb2NrX3Jlc2V0KHBjaWVfY29tcG9uZW50LDEpOworCisJaWYoaWZfZXJyKQorCQlyZXR1cm4gLTE7CisJZWxzZQorCQlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGNvbWNlcnRvX3BjaWVfYnNwX2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHAsIGludCBucikKK3sKKwlzdHJ1Y3Qgc2VyZGVzX3JlZ3NfcyAqcF9wY2llX3BoeV9yZWdfZmlsZTsKKwlpbnQgc2VyZGVzX3JlZ3Nfc2l6ZTsKKwlpbnQgcG9sYXJpdHlfbWF4ID0gNDsKKwlpbnQgcG9sYXJpdHk7CisJaW50IHJldDsKKworCisJaWYgKG5yID49IE5VTV9QQ0lFX1BPUlRTKSB7CisJCXByaW50aygiJXMgOiBJbnZhbGlkIFBDSWUgcG9ydCBudW1iZXJcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnIwOworCX0KKworCXJldCA9IHBjaWVfYXBwX2luaXQocHAsIG5yLCBDRkcwX0RFVl9UWVBFX1JDKTsKKwlpZihyZXQgPT0gLTEpCisJCWdvdG8gZXJyMDs7CisKKwlwcC0+cG9ydF9tb2RlID0gcGNpZV9wb3J0X2dldF9tb2RlKG5yKTsKKworCWlmKHBjaWVfZXh0ZXJuYWxfY2xrKQorCXsKKwkJcF9wY2llX3BoeV9yZWdfZmlsZSA9ICZwY2llX3BoeV9yZWdfZmlsZV8xMDBbMF07CisJCXNlcmRlc19yZWdzX3NpemUgPSBzaXplb2YocGNpZV9waHlfcmVnX2ZpbGVfMTAwKTsKKwl9CisJZWxzZQorCXsKKwkJaWYoSEFMX2dldF9yZWZfY2xrKCkgPT0gUkVGX0NMS18yNE1IWikKKwkJeworICAgICAgICAgICAgICAgICAgICAgICAgcF9wY2llX3BoeV9yZWdfZmlsZSA9ICZwY2llX3BoeV9yZWdfZmlsZV8yNFswXTsKKwkJCXNlcmRlc19yZWdzX3NpemUgPSBzaXplb2YocGNpZV9waHlfcmVnX2ZpbGVfMjQpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJZTogUmVmIGNsayAyNE1oelxuIik7CisJCX0KKyAgICAgICAgICAgICAgICBlbHNlCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfcGNpZV9waHlfcmVnX2ZpbGUgPSAmcGNpZV9waHlfcmVnX2ZpbGVfNDhbMF07CisJCQlzZXJkZXNfcmVnc19zaXplID0gc2l6ZW9mKHBjaWVfcGh5X3JlZ19maWxlXzQ4KTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlBDSWU6IFJlZiBjbGsgNDhNaHpcbiIpOworCQl9CisgICAgICAgIH0KKworCWlmIChzeXN0ZW1fcmV2ID09IDEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJZTogRGV0ZWN0ZWQgQzJLIFJldkExIGRldmljZSBzZXJkZXMgY2xrIGRldmlkZXIgb2xkOm5ldz0leDoleFxuIiwKKwkJCQlwX3BjaWVfcGh5X3JlZ19maWxlWzB4NjFdLnZhbCwgMHgwNik7CisJCXBfcGNpZV9waHlfcmVnX2ZpbGVbMHg2MV0udmFsID0gMHg2OworCX0KKworCWZvcihwb2xhcml0eSA9IDAgOyBwb2xhcml0eSA8IHBvbGFyaXR5X21heDsgcG9sYXJpdHkrKykKKwl7CisKKwkJcmV0ID0gY29tY2VydG9fcGNpZV9ic3BfbGlua19pbml0KHBwLCBuciwgcF9wY2llX3BoeV9yZWdfZmlsZSwgc2VyZGVzX3JlZ3Nfc2l6ZSwgcG9sYXJpdHkpOworCQlpZihyZXQgPT0gLTEpCisJCQlnb3RvIGVycjE7OworCisJCWlmIChwcC0+bGlua19zdGF0ZSkKKwkJCWdvdG8gbGlua3VwOworCisJCWlmKCFwY2llX3BvcnRfaXNfaG9zdChucikpCisJCQlyZXR1cm4gMDsgLy9FbmRwb2ludCwgc28gbm8gbmVlZCB0byBjaGFuZ2UgcG9sYXJpdHkKKworCX0KKwkKKwlwcmludGsoS0VSTl9JTkZPICJQQ0llJWQ6IExpbmsgVXAgRmFpbGVkIFxuIixucik7CisKK2VycjE6IAkKKwlpb3VubWFwKHBwLT52YV9jZmcwX2Jhc2UpOworCWlvdW5tYXAocHAtPnZhX2NmZzFfYmFzZSk7CisJcHAtPnBvcnRfbW9kZSA9IFBDSUVfUE9SVF9NT0RFX05PTkU7CitlcnIwOgorCXJldHVybiAtMTsKKworbGlua3VwOgorCXByaW50ayhLRVJOX0lORk8gIlBDSWUlZDogTGluayBVcCBTdWNjZXNzIFxuIixucik7CisJcHJpbnRrKEtFUk5fSU5GTyAiUENJZSVkOiBQb2xhcml0eTogJWQgR2VuMSBtb2RlOiAlZCBFeHRlcm5hbCBDbGs6ICVkXG4iLG5yLCBwb2xhcml0eSwgcGNpZV9nZW4xX29ubHkscGNpZV9leHRlcm5hbF9jbGspOworCWlmIChwY2llX3BvcnRfaXNfaG9zdChucikpCisJCWNvbWNlcnRvX3BjaWVfcmNfaW50X2luaXQocHApOwkKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGNvbWNlcnRvX3BjaWVfYWJvcnRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBmc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBpZiAoZnNyICYgKDEgPDwgMTApKQorICAgICAgICAgICAgICAgIHJlZ3MtPkFSTV9wYyArPSA0OworICAgICAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBjb21jZXJ0b19wY2llX2luaXQodm9pZCkKK3sKKyAgICAgICAgc3RydWN0IHBjaWVfcG9ydCAqcHA7CisJaW50IGksIHJjOworCWludCBudW1fcGNpZV9wb3J0ID0gMTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisKKworICAgICAgICBwcCA9ICZwY2llX3BvcnRbMF07CisJY29tY2VydG9fcGNpZV9ic3BfaW5pdChwcCwgMCk7CisKKwlpZiAoIChOVU1fUENJRV9QT1JUUyA9PSAyKSAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICEocmVhZGwoQ09NQ0VSVE9fR1BJT19TWVNURU1fQ09ORklHKSAmIEJPT1RfU0VSREVTMV9DTkZfU0FUQTApICkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIG51bV9wY2llX3BvcnQgPSAyOworCQlwcCA9ICZwY2llX3BvcnRbMV07CisJCWNvbWNlcnRvX3BjaWVfYnNwX2luaXQocHAsIDEpOworICAgICAgICB9CisKKwljb21jZXJ0b19wY2llLm5yX2NvbnRyb2xsZXJzID0gbnVtX3BjaWVfcG9ydDsKKworCXBjaWJpb3NfbWluX2lvID0gaUFUVV9HRVRfSU9fQkFTRShDT01DRVJUT19BWElfUENJZTBfU0xBVkVfQkFTRSk7CisJcGNpYmlvc19taW5fbWVtID0gQ09NQ0VSVE9fQVhJX1BDSWUwX1NMQVZFX0JBU0U7CisJcGNpX2FkZF9mbGFncyhQQ0lfUkVBU1NJR05fQUxMX1JTUkMpOworCisJaG9va19mYXVsdF9jb2RlKDE2ICsgNiwgY29tY2VydG9fcGNpZV9hYm9ydF9oYW5kbGVyLCBTSUdCVVMsIDAsICJpbXByZWNpc2UgZXh0ZXJuYWwgYWJvcnQiKTsKKworCXBjaV9jb21tb25faW5pdCgmY29tY2VydG9fcGNpZSk7CisKKwlmb3IgKCBpID0gMDsgaSA8IG51bV9wY2llX3BvcnQ7IGkrKyApCisJeworCisJCWlmICghcGNpZV9wb3J0X2lzX2hvc3QoaSkgfHwgICEocGNpZV9wb3J0W2ldLmxpbmtfc3RhdGUpKQorCQkJY29udGludWU7CisKKwkJd2hpbGUoKHBkZXYgPSBwY2lfZ2V0X3N1YnN5cyhQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkpIHsKKwkJCWlmIChwY2llX3BvcnRbaV0ucm9vdF9idXNfbnIgPT0gcGRldi0+YnVzLT5udW1iZXIpIHsKKwkJCQlpZiggKHJjID0gcGNpZV9nZXRfcmVhZHJxKHBkZXYpKSA+IDUxMiApIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJZSVkIERldmljZSByZHJlcSBzaXplICglZCkgaXMgbW9yZSB0aGFuIHN1cHBvcnRlZFxuIiwgaSwgcmMpOworCQkJCQlwY2llX3NldF9yZWFkcnEocGRldiwgNTEyKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKworI2lmZGVmIENPTkZJR19QTQorCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcGNpZV9wd3IwKTsKKworCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJnBjaWVfcHdyMC5kZXYsICZkZXZfYXR0cl9kZXZpY2VfcmVzZXQpKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gY3JlYXRlIHBjaWUwIHJlc2V0IHN5c2ZzIGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZwY2llX3B3cjAuZGV2LCAmZGV2X2F0dHJfc2VyZGVzX3BkKSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGNyZWF0ZSBwY2llMCBzZXJkZXNfcGQgc3lzZnMgZW50cnlcbiIsIF9fZnVuY19fKTsKKworCWlmKG51bV9wY2llX3BvcnQgPiAxKSB7CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcGNpZV9wd3IxKTsKKworCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZwY2llX3B3cjEuZGV2LCAmZGV2X2F0dHJfZGV2aWNlX3Jlc2V0KSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBjcmVhdGUgcGNpZTEgcmVzZXQgc3lzZnMgZW50cnlcbiIsIF9fZnVuY19fKTsKKworCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKCZwY2llX3B3cjEuZGV2LCAmZGV2X2F0dHJfc2VyZGVzX3BkKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBjcmVhdGUgcGNpZTEgc2VyZGVzX3BkIHN5c2ZzIGVudHJ5XG4iLCBfX2Z1bmNfXyk7CisJfQorCisJcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjb21jZXJ0b19wY2llX2RyaXZlcik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKGNvbWNlcnRvX3BjaWVfaW5pdCk7CisKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9wbGF0c21wLmMgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL3BsYXRzbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBjNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9wbGF0c21wLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiAgYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9wbGF0c21wLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zbXBfc2N1Lmg+CisjaW5jbHVkZSA8YXNtL3VuaWZpZWQuaD4KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+ICAvLyBmb3IgdGhyZWFkcworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+ICAvLyBmb3IgdGFza19zdHJ1Y3QKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+ICAgLy8gZm9yIHVzaW5nIGppZmZpZXMKKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorCisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpZC5oPgorCisKK2V4dGVybiB2b2lkIGNvbWNlcnRvX3NlY29uZGFyeV9zdGFydHVwKHZvaWQpOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzY3VfYmFzZV9hZGRyKHZvaWQpCit7CisJcmV0dXJuICh2b2lkICopQ09NQ0VSVE9fU0NVX1ZBRERSOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgQ1BVIHBvc3NpYmxlIG1hcCBlYXJseSAtIHRoaXMgZGVzY3JpYmVzIHRoZSBDUFVzCisgKiB3aGljaCBtYXkgYmUgcHJlc2VudCBvciBiZWNvbWUgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgorICovCit2b2lkIF9faW5pdCBzbXBfaW5pdF9jcHVzKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICpzY3VfYmFzZSA9IHNjdV9iYXNlX2FkZHIoKTsKKwl1bnNpZ25lZCBpbnQgaSwgbmNvcmVzOworCisJbmNvcmVzID0gc2N1X2Jhc2UgPyBzY3VfZ2V0X2NvcmVfY291bnQoc2N1X2Jhc2UpIDogMTsKKworCWlmIChuY29yZXMgPiBOUl9DUFVTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJDb21jZXJ0bzogbm8uIG9mIGNvcmVzICglZCkgZ3JlYXRlciB0aGFuIGNvbmZpZ3VyZWQgIgorCQkgICAgICAgIm1heGltdW0gb2YgJWQgLSBjbGlwcGluZ1xuIiwKKwkJICAgICAgIG5jb3JlcywgTlJfQ1BVUyk7CisJCW5jb3JlcyA9IE5SX0NQVVM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5jb3JlczsgaSsrKQorCQlzZXRfY3B1X3Bvc3NpYmxlKGksIHRydWUpOworCisJc2V0X3NtcF9jcm9zc19jYWxsKGdpY19yYWlzZV9zb2Z0aXJxKTsKK30KKworI2RlZmluZSBKVU1QX1RPX0tFUk5FTF9TVEFSVF8xCQkweGUzYTAwMDIwIAkvKiBtb3YJcjAsICMzMiAqLworI2RlZmluZSBKVU1QX1RPX0tFUk5FTF9TVEFSVF8yCQkweGU1OTBmMDAwIAkvKiBsZHIJcGMsIFtyMF0gKi8KKworLyogQ3JlYXRpbmcgVGFzayBmb3IgQ3B1LTEgSG90cGx1ZyAqLworc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQxPU5VTEw7CisKK0RFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGNwdTFfaG90cGx1Zyk7CisKKy8qCisgKiBIb3RwbHVnIHNpZ25hbCBmcm9tIENQVSBIb3RwbHVnIGZyYW1ld29yaworICogdG8gaW52b2tlIHRoZSBIb3RwbHVnIHRhc2sKKyAqLwordTMyIGNwdTFfaG90cGx1Z19kb25lOworCisvKiBDcHUtMSBIb3RwbHVnIFRhc2sgKi8KK3ZvaWQgaG90cGx1Z19jcHUxX2RpZSh2b2lkKQoreworCXVuc2lnbmVkIGludCByZXNldDsKKwlzdHJ1Y3QgY3B1bWFzayBpbl9tYXNrOworCWludCBjcHUgPSAwOworCWludCBwaWQgPSAwOworCisJY3B1bWFza19zZXRfY3B1KGNwdSwgJmluX21hc2spOworCXNjaGVkX3NldGFmZmluaXR5KHBpZCwgJmluX21hc2spOworCit3YWl0X2Zvcl9jcHUxX2hvdHBsdWdfZG9uZToKKworCS8qIFdhaXRpbmcgZm9yIGhvdHBsdWcgZXZlbnQgaW52b2tlZCBieSBDUFUgaG90cGx1ZyBmcmFtZXdvcmsgKi8KKwl3YWl0X2V2ZW50KGNwdTFfaG90cGx1ZywgY3B1MV9ob3RwbHVnX2RvbmU+MCk7CisKKyNpZmRlZiBDT05GSUdfTkVPTgorCV9fcmF3X3dyaXRlbCgoX19yYXdfcmVhZGwoQTlEUF9DUFVfQ0xLX0NOVFJMKSAmIH5ORU9OMV9DTEtfRU5BQkxFKSwgQTlEUF9DUFVfQ0xLX0NOVFJMKTsKKwlfX3Jhd193cml0ZWwoKF9fcmF3X3JlYWRsKEE5RFBfQ1BVX1JFU0VUKSB8IE5FT04xX1JTVCksIEE5RFBfQ1BVX1JFU0VUKTsKKyNlbmRpZgorCV9fcmF3X3dyaXRlbCgoX19yYXdfcmVhZGwoQTlEUF9DUFVfQ0xLX0NOVFJMKSAmIH5DUFUxX0NMS19FTkFCTEUpLCBBOURQX0NQVV9DTEtfQ05UUkwpOworCV9fcmF3X3dyaXRlbCgoX19yYXdfcmVhZGwoQTlEUF9QV1JfQ05UUkwpIHwgQ0xBTVBfQ09SRTEpLCBBOURQX1BXUl9DTlRSTCk7CisJX19yYXdfd3JpdGVsKChfX3Jhd19yZWFkbChBOURQX1BXUl9DTlRSTCkgfCBDT1JFX1BXUkRXTjEpLCBBOURQX1BXUl9DTlRSTCk7CisJX19yYXdfd3JpdGVsKChfX3Jhd19yZWFkbChBOURQX0NQVV9SRVNFVCkgfCBDUFUxX1JTVCksIEE5RFBfQ1BVX1JFU0VUKTsKKwlfX3Jhd193cml0ZWwoKF9fcmF3X3JlYWRsKEE5RFBfUFdSX0NOVFJMKSAmIH5DT1JFX1BXUkRXTjEpLCBBOURQX1BXUl9DTlRSTCk7CisKKwljcHUxX2hvdHBsdWdfZG9uZSA9IDA7CisJZ290byB3YWl0X2Zvcl9jcHUxX2hvdHBsdWdfZG9uZTsKKworCXJldHVybjsKK30KKwordm9pZCBfX2luaXQgcGxhdGZvcm1fc21wX3ByZXBhcmVfY3B1cyh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJaW50IGk7CisJY2hhciBvdXJfdGhyZWFkWzI1XT0iY3B1MV9ob3RwbHVnX3RocmVhZCI7CisKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIHByZXNlbnQgbWFwLCB3aGljaCBkZXNjcmliZXMgdGhlIHNldCBvZiBDUFVzCisJICogYWN0dWFsbHkgcG9wdWxhdGVkIGF0IHRoZSBwcmVzZW50IHRpbWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IG1heF9jcHVzOyBpKyspCisJCXNldF9jcHVfcHJlc2VudChpLCB0cnVlKTsKKworCXNjdV9lbmFibGUoc2N1X2Jhc2VfYWRkcigpKTsKKworICAgICAgICAvKiBDcmVhdGUgY3B1MV9ob3RwbHVnX3RocmVhZCAqLworCisJcHJpbnRrKCIgQ3JlYXRpbmcgY3B1MV9ob3RwbHVnX3RocmVhZC4uLi5cbiIpOworCWNwdTFfaG90cGx1Z19kb25lID0gMDsKKwl0aHJlYWQxID0ga3RocmVhZF9jcmVhdGUoaG90cGx1Z19jcHUxX2RpZSxOVUxMLG91cl90aHJlYWQpOworCisJaWYoKHRocmVhZDEpKQorCQl7CisJCXByaW50aygiIGNwdTFfaG90cGx1Z190aHJlYWQgQ3JlYXRlZFxuIik7CisJCXdha2VfdXBfcHJvY2Vzcyh0aHJlYWQxKTsKKwkJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjb250cm9sIGZvciB3aGljaCBjb3JlIGlzIHRoZSBuZXh0IHRvIGNvbWUgb3V0IG9mIHRoZSBzZWNvbmRhcnkKKyAqIGJvb3QgImhvbGRpbmcgcGVuIgorICovCit2b2xhdGlsZSBpbnQgX19jcHVpbml0ZGF0YSBwZW5fcmVsZWFzZSA9IC0xOworCisvKgorICogV3JpdGUgcGVuX3JlbGVhc2UgaW4gYSB3YXkgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIHZpc2libGUgdG8gYWxsCisgKiBvYnNlcnZlcnMsIGlycmVzcGVjdGl2ZSBvZiB3aGV0aGVyIHRoZXkncmUgdGFraW5nIHBhcnQgaW4gY29oZXJlbmN5CisgKiBvciBub3QuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIGhvdHBsdWcgY29kZSB0byB3b3JrIHJlbGlhYmx5LgorICovCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgd3JpdGVfcGVuX3JlbGVhc2UoaW50IHZhbCkKK3sKKwlwZW5fcmVsZWFzZSA9IHZhbDsKKwlzbXBfd21iKCk7CisJX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKCh2b2lkICopJnBlbl9yZWxlYXNlLCBzaXplb2YocGVuX3JlbGVhc2UpKTsKKwlvdXRlcl9jbGVhbl9yYW5nZShfX3BhKCZwZW5fcmVsZWFzZSksIF9fcGEoJnBlbl9yZWxlYXNlICsgMSkpOworfQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJvb3RfbG9jayk7CisKK3ZvaWQgX19jcHVpbml0IHBsYXRmb3JtX3NlY29uZGFyeV9pbml0KHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiBpZiBhbnkgaW50ZXJydXB0cyBhcmUgYWxyZWFkeSBlbmFibGVkIGZvciB0aGUgcHJpbWFyeQorCSAqIGNvcmUgKGUuZy4gdGltZXIgaXJxKSwgdGhlbiB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBlbmFibGVkCisJICogZm9yIHVzOiBkbyBzbworCSAqLworCWdpY19zZWNvbmRhcnlfaW5pdCgwKTsKKworCS8qCisJICogbGV0IHRoZSBwcmltYXJ5IHByb2Nlc3NvciBrbm93IHdlJ3JlIG91dCBvZiB0aGUKKwkgKiBwZW4sIHRoZW4gaGVhZCBvZmYgaW50byB0aGUgQyBlbnRyeSBwb2ludAorCSAqLworCXdyaXRlX3Blbl9yZWxlYXNlKC0xKTsKKworCS8qCisJICogU3luY2hyb25pc2Ugd2l0aCB0aGUgYm9vdCB0aHJlYWQuCisJICovCisJc3Bpbl9sb2NrKCZib290X2xvY2spOworCXNwaW5fdW5sb2NrKCZib290X2xvY2spOworfQorCitpbnQgX19jcHVpbml0IGJvb3Rfc2Vjb25kYXJ5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgaW50ICpsb29wID0gKHVuc2lnbmVkIGludCAqKXBoeXNfdG9fdmlydCgweDA4KTsKKworCS8qCisJICogSW5zdGFsbCB0aGUgY29tY2VydG9fc2Vjb25kYXJ5X3N0YXJ0dXAgcG9pbnRlciBhdCAweDIwCisJICogUGh5c2ljYWwgQWRkcmVzcworCSAqLworCV9fcmF3X3dyaXRlbChCU1lNKHZpcnRfdG9fcGh5cyhjb21jZXJ0b19zZWNvbmRhcnlfc3RhcnR1cCkpLCBwaHlzX3RvX3ZpcnQoMHgyMCkpOworCV9fcmF3X3dyaXRlbCgodW5zaWduZWQgaW50KUpVTVBfVE9fS0VSTkVMX1NUQVJUXzEgLCBwaHlzX3RvX3ZpcnQoMHgwMCkpOworCV9fcmF3X3dyaXRlbCgodW5zaWduZWQgaW50KUpVTVBfVE9fS0VSTkVMX1NUQVJUXzIgLCBwaHlzX3RvX3ZpcnQoMHgwNCkpOworCXNtcF93bWIoKTsKKwlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEoKHZvaWQgKilwaHlzX3RvX3ZpcnQoMHgwMCksIDB4MjQpOworCW91dGVyX2NsZWFuX3JhbmdlKF9fcGEocGh5c190b192aXJ0KDB4MDApKSwgX19wYShwaHlzX3RvX3ZpcnQoMHgyNCkpKTsKKworCS8qIEdldCBDUFUgMSBvdXQgb2YgcmVzZXQgKi8KKwlfX3Jhd193cml0ZWwoKF9fcmF3X3JlYWRsKEE5RFBfQ1BVX1JFU0VUKSAmIH5DUFUxX1JTVCksIEE5RFBfQ1BVX1JFU0VUKTsKKwlfX3Jhd193cml0ZWwoKF9fcmF3X3JlYWRsKEE5RFBfUFdSX0NOVFJMKSAmIH5DTEFNUF9DT1JFMSksIEE5RFBfUFdSX0NOVFJMKTsKKwlfX3Jhd193cml0ZWwoKF9fcmF3X3JlYWRsKEE5RFBfQ1BVX0NMS19DTlRSTCkgfCBDUFUxX0NMS19FTkFCTEUpLCBBOURQX0NQVV9DTEtfQ05UUkwpOworCisjaWZkZWYgQ09ORklHX05FT04KKwkvKiBHZXQgTkVPTiAxIG91dCBvZiByZXNldCAqLworCV9fcmF3X3dyaXRlbCgoX19yYXdfcmVhZGwoQTlEUF9DUFVfUkVTRVQpICYgfk5FT04xX1JTVCksIEE5RFBfQ1BVX1JFU0VUKTsKKwlfX3Jhd193cml0ZWwoKF9fcmF3X3JlYWRsKEE5RFBfQ1BVX0NMS19DTlRSTCkgfCBORU9OMV9DTEtfRU5BQkxFKSwgQTlEUF9DUFVfQ0xLX0NOVFJMKTsKKyNlbmRpZgorCS8qCisJICogU2V0IHN5bmNocm9uaXNhdGlvbiBzdGF0ZSBiZXR3ZWVuIHRoaXMgYm9vdCBwcm9jZXNzb3IKKwkgKiBhbmQgdGhlIHNlY29uZGFyeSBvbmUKKwkgKi8KKwlzcGluX2xvY2soJmJvb3RfbG9jayk7CisKKwkvKgorCSAqIFRoaXMgaXMgcmVhbGx5IGJlbHQgYW5kIGJyYWNlczsgd2UgaG9sZCB1bmludGVuZGVkIHNlY29uZGFyeQorCSAqIENQVXMgaW4gdGhlIGhvbGRpbmcgcGVuIHVudGlsIHdlJ3JlIHJlYWR5IGZvciB0aGVtLiAgSG93ZXZlciwKKwkgKiBzaW5jZSB3ZSBoYXZlbid0IHNlbnQgdGhlbSBhIHNvZnQgaW50ZXJydXB0LCB0aGV5IHNob3VsZG4ndAorCSAqIGJlIHRoZXJlLgorCSAqLworCXdyaXRlX3Blbl9yZWxlYXNlKGNwdSk7CisKKwkvKgorCSAqIFNlbmQgdGhlIHNlY29uZGFyeSBDUFUgYSBzb2Z0IGludGVycnVwdCwgdGhlcmVieSBjYXVzaW5nCisJICogdGhlIGJvb3QgbW9uaXRvciB0byByZWFkIHRoZSBzeXN0ZW0gd2lkZSBmbGFncyByZWdpc3RlciwKKwkgKiBhbmQgYnJhbmNoIHRvIHRoZSBhZGRyZXNzIGZvdW5kIHRoZXJlLgorCSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgKDEgKiBIWik7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCXNtcF9ybWIoKTsKKwkJaWYgKHBlbl9yZWxlYXNlID09IC0xKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwkvKgorCSAqIG5vdyB0aGUgc2Vjb25kYXJ5IGNvcmUgaXMgc3RhcnRpbmcgdXAgbGV0IGl0IHJ1biBpdHMKKwkgKiBjYWxpYnJhdGlvbnMsIHRoZW4gd2FpdCBmb3IgaXQgdG8gZmluaXNoCisJICovCisJc3Bpbl91bmxvY2soJmJvb3RfbG9jayk7CisKKwlyZXR1cm4gcGVuX3JlbGVhc2UgIT0gLTEgPyAtRU5PU1lTIDogMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vcG0uYyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjhlZTlkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9wbS5jCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9wbS5jCisgKiBDMksgUG93ZXIgTWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBNaW5kc3BlZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKworCisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9naWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9zbXBfc2N1Lmg+CisjaW5jbHVkZSA8bWFjaC9jb21jZXJ0by0yMDAwL3BtLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCit1bnNpZ25lZCBpbnQgaG9zdF91dGlscGVfc2hhcmVkX3BtdV9iaXRtYXNrOworCisvKiBFeHRlcm5zICovCitleHRlcm4gdm9pZCBjb21jZXJ0b19jcHVfc3VzcGVuZChpbnQgc2F2ZV9zdGF0ZSk7CitleHRlcm4JdW5zaWduZWQgaW50ICogYzJrX2dldF9yZXN0b3JlX3BvaW50ZXIodm9pZCk7CitleHRlcm4gdm9pZCBjb21jZXJ0b19jcHVfcmVzdG9yZSAodm9pZCk7CisKK3Vuc2lnbmVkIGludCBjMmtfcG1fYml0bWFza19zaG93KHZvaWQpCit7CisJcmV0dXJuIGhvc3RfdXRpbHBlX3NoYXJlZF9wbXVfYml0bWFzazsKK30KKwordm9pZCBjMmtfcG1fYml0bWFza19zdG9yZSh1bnNpZ25lZCBpbnQgYml0bWFza192YWx1ZSkKK3sKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHNoYXJlZCBwbXUgYml0bWFzaworCSAqIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIGNvbmZpZ3VyYWJsZSBydW4gdGltZS4KKwkgKiBDYW4gYmUgcGFzc2VkIGZyb20gYm9vdGxvYWRlciBhbHNvIChOb3QgSW1wbGltZW50ZWQgWWV0KQorCSAqLworCS8vaG9zdF91dGlscGVfc2hhcmVkX3BtdV9iaXRtYXNrID0gMHhGRkU3RkZGRjsKKwlob3N0X3V0aWxwZV9zaGFyZWRfcG11X2JpdG1hc2sgPSBiaXRtYXNrX3ZhbHVlOworCisJLyogUGFzcyB0aGUgYml0bWFzayBpbmZvIHRvIFV0aWxQRSAqLworCSooKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikoSE9TVF9VVElMUEVfU0hBUkVEX0FERFJFU1MpKSs0KSA9IGhvc3RfdXRpbHBlX3NoYXJlZF9wbXVfYml0bWFzazsKK30KKworCitzdGF0aWMgaW50IGNvbWNlcnRvX2RvX3NyYW1faWRsZSh1bnNpZ25lZCBsb25nIHNhdmVfc3RhdGUpCit7CisJY29tY2VydG9fY3B1X3N1c3BlbmQoc2F2ZV9zdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMMiBDYWNoZSBhbmQgU0NVIFNhdmUgUmVzdW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBTQ1VfREFUQV9TSVpFICAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIEwyX0RBVEFfU0laRSAgICAgICAgICAgICAgICAgOTYKKworZXh0ZXJuIHZvaWQgcGwzMTBfc2F2ZSh2b2lkKTsKK2V4dGVybiB2b2lkIHBsMzEwX3Jlc3VtZSh2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiAweDAwICovICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgY29udHJvbDsKKyAgICAvKiAweDA0ICovICBjb25zdCB1bnNpZ25lZCBpbnQgY29uZmlndXJhdGlvbjsKKyAgICAvKiAweDA4ICovICB1bmlvbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgdW5zaWduZWQgaW50IHc7CisgICAgICAgICAgICAgICAgICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgYls0XTsKKyAgICAgICAgICAgICAgICB9IHBvd2VyX3N0YXR1czsKKyAgICAvKiAweDBjICovICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgaW52YWxpZGF0ZV9hbGw7CisgICAgICAgICAgICAgICAgY2hhciBwYWRkaW5nMVs0OF07CisgICAgLyogMHg0MCAqLyAgdm9sYXRpbGUgdW5zaWduZWQgaW50IGZpbHRlcmluZ19zdGFydDsKKyAgICAvKiAweDQ0ICovICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgZmlsdGVyaW5nX2VuZDsKKyAgICAgICAgICAgICAgICBjaGFyIHBhZGRpbmcyWzhdOworICAgIC8qIDB4NTAgKi8gIHZvbGF0aWxlIHVuc2lnbmVkIGludCBhY2Nlc3NfY29udHJvbDsKKyAgICAvKiAweDU0ICovICB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgbnNfYWNjZXNzX2NvbnRyb2w7Cit9IGE5X3NjdV9yZWdpc3RlcnM7CisKKwordm9pZCBzYXZlX2E5X3NjdSh1MzIgKnBvaW50ZXIsIHVuc2lnbmVkIHNjdV9hZGRyZXNzKQoreworICAgIGE5X3NjdV9yZWdpc3RlcnMgKnNjdSA9IChhOV9zY3VfcmVnaXN0ZXJzICopc2N1X2FkZHJlc3M7CisKKyAgICBwb2ludGVyWzBdID0gc2N1LT5jb250cm9sOworICAgIHBvaW50ZXJbMV0gPSBzY3UtPnBvd2VyX3N0YXR1cy53OworICAgIHBvaW50ZXJbMl0gPSBzY3UtPmZpbHRlcmluZ19zdGFydDsKKyAgICBwb2ludGVyWzNdID0gc2N1LT5maWx0ZXJpbmdfZW5kOworICAgIHBvaW50ZXJbNF0gPSBzY3UtPmFjY2Vzc19jb250cm9sOworICAgIHBvaW50ZXJbNV0gPSBzY3UtPm5zX2FjY2Vzc19jb250cm9sOworfQorCit2b2lkIHJlc3RvcmVfYTlfc2N1KHUzMiAqcG9pbnRlciwgdW5zaWduZWQgc2N1X2FkZHJlc3MpCit7CisgICAgYTlfc2N1X3JlZ2lzdGVycyAqc2N1ID0gKGE5X3NjdV9yZWdpc3RlcnMgKilzY3VfYWRkcmVzczsKKworICAgIHNjdS0+aW52YWxpZGF0ZV9hbGwgPSAweGZmZmY7CisgICAgc2N1LT5maWx0ZXJpbmdfc3RhcnQgPSBwb2ludGVyWzJdOworICAgIHNjdS0+ZmlsdGVyaW5nX2VuZCA9IHBvaW50ZXJbM107CisgICAgc2N1LT5hY2Nlc3NfY29udHJvbCA9IHBvaW50ZXJbNF07CisgICAgc2N1LT5uc19hY2Nlc3NfY29udHJvbCA9IHBvaW50ZXJbNV07CisgICAgc2N1LT5wb3dlcl9zdGF0dXMudyA9IHBvaW50ZXJbMV07CisgICAgc2N1LT5jb250cm9sID0gcG9pbnRlclswXTsKK30KKworCitzdHJ1Y3QgbG9ja2Rvd25fcmVncworeworICAgIHVuc2lnbmVkIGludCBkLCBpOworfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiAweDAwMCAqLyBjb25zdCB1bnNpZ25lZCBjYWNoZV9pZDsKKyAgICAvKiAweDAwNCAqLyBjb25zdCB1bnNpZ25lZCBjYWNoZV90eXBlOworICAgICAgICAgICAgICAgIGNoYXIgcGFkZGluZzFbMHgwRjhdOworICAgIC8qIDB4MTAwICovIHZvbGF0aWxlIHVuc2lnbmVkIGNvbnRyb2w7CisgICAgLyogMHgxMDQgKi8gdm9sYXRpbGUgdW5zaWduZWQgYXV4X2NvbnRyb2w7CisgICAgLyogMHgxMDggKi8gdm9sYXRpbGUgdW5zaWduZWQgdGFnX3JhbV9jb250cm9sOworICAgIC8qIDB4MTBDICovIHZvbGF0aWxlIHVuc2lnbmVkIGRhdGFfcmFtX2NvbnRyb2w7CisgICAgICAgICAgICAgICAgY2hhciBwYWRkaW5nMlsweDBGMF07CisgICAgLyogMHgyMDAgKi8gdm9sYXRpbGUgdW5zaWduZWQgZXZfY291bnRlcl9jdHJsOworICAgIC8qIDB4MjA0ICovIHZvbGF0aWxlIHVuc2lnbmVkIGV2X2NvdW50ZXIxX2NmZzsKKyAgICAvKiAweDIwOCAqLyB2b2xhdGlsZSB1bnNpZ25lZCBldl9jb3VudGVyMF9jZmc7CisgICAgLyogMHgyMEMgKi8gdm9sYXRpbGUgdW5zaWduZWQgZXZfY291bnRlcjE7CisgICAgLyogMHgyMTAgKi8gdm9sYXRpbGUgdW5zaWduZWQgZXZfY291bnRlcjA7CisgICAgLyogMHgyMTQgKi8gdm9sYXRpbGUgdW5zaWduZWQgaW50X21hc2s7CisgICAgLyogMHgyMTggKi8gY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgaW50X21hc2tfc3RhdHVzOworICAgIC8qIDB4MjFDICovIGNvbnN0IHZvbGF0aWxlIHVuc2lnbmVkIGludF9yYXdfc3RhdHVzOworICAgIC8qIDB4MjIwICovIHZvbGF0aWxlIHVuc2lnbmVkIGludF9jbGVhcjsKKyAgICAgICAgICAgICAgICBjaGFyIHBhZGRpbmczWzB4NTBDXTsKKyAgICAvKiAweDczMCAqLyB2b2xhdGlsZSB1bnNpZ25lZCBjYWNoZV9zeW5jOworICAgICAgICAgICAgICAgIGNoYXIgcGFkZGluZzRbMHgwM0NdOworICAgIC8qIDB4NzcwICovIHZvbGF0aWxlIHVuc2lnbmVkIGludl9wYTsKKyAgICAgICAgICAgICAgICBjaGFyIHBhZGRpbmc1WzB4MDA4XTsKKyAgICAvKiAweDc3QyAqLyB2b2xhdGlsZSB1bnNpZ25lZCBpbnZfd2F5OworICAgICAgICAgICAgICAgIGNoYXIgcGFkZGluZzZbMHgwMzBdOworICAgIC8qIDB4N0IwICovIHZvbGF0aWxlIHVuc2lnbmVkIGNsZWFuX3BhOworICAgICAgICAgICAgICAgIGNoYXIgcGFkZGluZzdbMHgwMDRdOworICAgIC8qIDB4N0I4ICovIHZvbGF0aWxlIHVuc2lnbmVkIGNsZWFuX2luZGV4OworICAgIC8qIDB4N0JDICovIHZvbGF0aWxlIHVuc2lnbmVkIGNsZWFuX3dheTsKKyAgICAgICAgICAgICAgICBjaGFyIHBhZGRpbmc4WzB4MDMwXTsKKyAgICAvKiAweDdGMCAqLyB2b2xhdGlsZSB1bnNpZ25lZCBjbGVhbl9pbnZfcGE7CisgICAgICAgICAgICAgICAgY2hhciBwYWRkaW5nOVsweDAwNF07CisgICAgLyogMHg3RjggKi8gdm9sYXRpbGUgdW5zaWduZWQgY2xlYW5faW52X2luZGV4OworICAgIC8qIDB4N0ZDICovIHZvbGF0aWxlIHVuc2lnbmVkIGNsZWFuX2ludl93YXk7CisgICAgICAgICAgICAgICAgY2hhciBwYWRkaW5nYVsweDEwMF07CisgICAgLyogMHg5MDAgKi8gdm9sYXRpbGUgc3RydWN0IGxvY2tkb3duX3JlZ3MgbG9ja2Rvd25bOF07CisgICAgICAgICAgICAgICAgY2hhciBwYWRkaW5nYlsweDAxMF07CisgICAgLyogMHg5NTAgKi8gdm9sYXRpbGUgdW5zaWduZWQgbG9ja19saW5lX2VuOworICAgIC8qIDB4OTU0ICovIHZvbGF0aWxlIHVuc2lnbmVkIHVubG9ja193YXk7CisgICAgICAgICAgICAgICAgY2hhciBwYWRkaW5nY1sweDJBOF07CisgICAgLyogMHhDMDAgKi8gdm9sYXRpbGUgdW5zaWduZWQgYWRkcl9maWx0ZXJpbmdfc3RhcnQ7CisgICAgLyogMHhDMDQgKi8gdm9sYXRpbGUgdW5zaWduZWQgYWRkcl9maWx0ZXJpbmdfZW5kOworICAgICAgICAgICAgICAgIGNoYXIgcGFkZGluZ2RbMHgzMzhdOworICAgIC8qIDB4RjQwICovIHZvbGF0aWxlIHVuc2lnbmVkIGRlYnVnX2N0cmw7CisgICAgICAgICAgICAgICAgY2hhciBwYWRkaW5nZVsweDAxQ107CisgICAgLyogMHhGNjAgKi8gdm9sYXRpbGUgdW5zaWduZWQgcHJlZmV0Y2hfY3RybDsKKyAgICAgICAgICAgICAgICBjaGFyIHBhZGRpbmdmWzB4MDFDXTsKKyAgICAvKiAweEY4MCAqLyB2b2xhdGlsZSB1bnNpZ25lZCBwb3dlcl9jdHJsOworfSBwbDMxMF9yZWdpc3RlcnM7CisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBpbnQgYXV4X2NvbnRyb2w7CisgICAgdW5zaWduZWQgaW50IHRhZ19yYW1fY29udHJvbDsKKyAgICB1bnNpZ25lZCBpbnQgZGF0YV9yYW1fY29udHJvbDsKKyAgICB1bnNpZ25lZCBpbnQgZXZfY291bnRlcl9jdHJsOworICAgIHVuc2lnbmVkIGludCBldl9jb3VudGVyMV9jZmc7CisgICAgdW5zaWduZWQgaW50IGV2X2NvdW50ZXIwX2NmZzsKKyAgICB1bnNpZ25lZCBpbnQgZXZfY291bnRlcjE7CisgICAgdW5zaWduZWQgaW50IGV2X2NvdW50ZXIwOworICAgIHVuc2lnbmVkIGludCBpbnRfbWFzazsKKyAgICB1bnNpZ25lZCBpbnQgbG9ja19saW5lX2VuOworICAgIHN0cnVjdCBsb2NrZG93bl9yZWdzIGxvY2tkb3duWzhdOworICAgIHVuc2lnbmVkIGludCB1bmxvY2tfd2F5OworICAgIHVuc2lnbmVkIGludCBhZGRyX2ZpbHRlcmluZ19zdGFydDsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcl9maWx0ZXJpbmdfZW5kOworICAgIHVuc2lnbmVkIGludCBkZWJ1Z19jdHJsOworICAgIHVuc2lnbmVkIGludCBwcmVmZXRjaF9jdHJsOworICAgIHVuc2lnbmVkIGludCBwb3dlcl9jdHJsOworfSBwbDMxMF9jb250ZXh0OworCisKK3ZvaWQgc2F2ZV9wbDMxMCh1MzIgKnBvaW50ZXIsIHVuc2lnbmVkIGludCBwbDMxMF9hZGRyZXNzKQoreworICAgIHBsMzEwX3JlZ2lzdGVycyAqcGwzMTAgPSAocGwzMTBfcmVnaXN0ZXJzICopcGwzMTBfYWRkcmVzczsKKyAgICBwbDMxMF9jb250ZXh0ICpjb250ZXh0ID0gKHBsMzEwX2NvbnRleHQgKilwb2ludGVyOworICAgIGludCBpOworCisgICAgLyogVE9ETzogYXJlIGFsbCB0aGVzZSByZWdpc3RlcnMgYXJlIHByZXNlbnQgaW4gZWFybGllciBQTDMxMCB2ZXJzaW9ucz8gKi8KKyAgICBjb250ZXh0LT5hdXhfY29udHJvbCA9IHBsMzEwLT5hdXhfY29udHJvbDsKKyAgICBjb250ZXh0LT50YWdfcmFtX2NvbnRyb2wgPSBwbDMxMC0+dGFnX3JhbV9jb250cm9sOworICAgIGNvbnRleHQtPmRhdGFfcmFtX2NvbnRyb2wgPSBwbDMxMC0+ZGF0YV9yYW1fY29udHJvbDsKKyAgICBjb250ZXh0LT5ldl9jb3VudGVyX2N0cmwgPSBwbDMxMC0+ZXZfY291bnRlcl9jdHJsOworICAgIGNvbnRleHQtPmV2X2NvdW50ZXIxX2NmZyA9IHBsMzEwLT5ldl9jb3VudGVyMV9jZmc7CisgICAgY29udGV4dC0+ZXZfY291bnRlcjBfY2ZnID0gcGwzMTAtPmV2X2NvdW50ZXIwX2NmZzsKKyAgICBjb250ZXh0LT5ldl9jb3VudGVyMSA9IHBsMzEwLT5ldl9jb3VudGVyMTsKKyAgICBjb250ZXh0LT5ldl9jb3VudGVyMCA9IHBsMzEwLT5ldl9jb3VudGVyMDsKKyAgICBjb250ZXh0LT5pbnRfbWFzayA9IHBsMzEwLT5pbnRfbWFzazsKKyAgICBjb250ZXh0LT5sb2NrX2xpbmVfZW4gPSBwbDMxMC0+bG9ja19saW5lX2VuOworCisgICAgZm9yIChpPTA7IGk8ODsgKytpKQorICAgIHsKKyAgICAgICAgY29udGV4dC0+bG9ja2Rvd25baV0uZCA9IHBsMzEwLT5sb2NrZG93bltpXS5kOworICAgICAgICBjb250ZXh0LT5sb2NrZG93bltpXS5pID0gcGwzMTAtPmxvY2tkb3duW2ldLmk7CisgICAgfQorICAgIGNvbnRleHQtPmFkZHJfZmlsdGVyaW5nX3N0YXJ0ID0gcGwzMTAtPmFkZHJfZmlsdGVyaW5nX3N0YXJ0OworICAgIGNvbnRleHQtPmFkZHJfZmlsdGVyaW5nX2VuZCA9IHBsMzEwLT5hZGRyX2ZpbHRlcmluZ19lbmQ7CisgICAgY29udGV4dC0+ZGVidWdfY3RybCA9IHBsMzEwLT5kZWJ1Z19jdHJsOworICAgIGNvbnRleHQtPnByZWZldGNoX2N0cmwgPSBwbDMxMC0+cHJlZmV0Y2hfY3RybDsKKyAgICBjb250ZXh0LT5wb3dlcl9jdHJsID0gcGwzMTAtPnBvd2VyX2N0cmw7Cit9CisKK3ZvaWQgcmVzdG9yZV9wbDMxMCh1MzIgKnBvaW50ZXIsIHVuc2lnbmVkIGludCBwbDMxMF9hZGRyZXNzKQoreworICAgIHBsMzEwX3JlZ2lzdGVycyAqcGwzMTAgPSAocGwzMTBfcmVnaXN0ZXJzICopcGwzMTBfYWRkcmVzczsKKyAgICBwbDMxMF9jb250ZXh0ICpjb250ZXh0ID0gKHBsMzEwX2NvbnRleHQgKilwb2ludGVyOworICAgIGludCBpOworCisgICAgLyogV2UgbWF5IG5lZWQgdG8gZGlzYWJsZSB0aGUgUEwzMTAgaWYgdGhlIGJvb3QgY29kZSBoYXMgdHVybmVkIGl0IG9uICovCisgICAgaWYgKHBsMzEwLT5jb250cm9sKQorICAgIHsKKyAgICAgICAgLyogV2FpdCBmb3IgdGhlIGNhY2hlIHRvIGJlIGlkbGUsIHRoZW4gZGlzYWJsZSAqLworICAgICAgICBwbDMxMC0+Y2FjaGVfc3luYyA9IDA7CisgICAgICAgIGRzYigpOworICAgICAgICBwbDMxMC0+Y29udHJvbCA9IDA7CisgICAgfQorCisgICAgLyogVE9ETzogYXJlIGFsbCB0aGVzZSByZWdpc3RlcnMgcHJlc2VudCBpbiBlYXJsaWVyIFBMMzEwIHZlcnNpb25zPyAqLworICAgIHBsMzEwLT5hdXhfY29udHJvbCA9IGNvbnRleHQtPmF1eF9jb250cm9sOworICAgIHBsMzEwLT50YWdfcmFtX2NvbnRyb2wgPSBjb250ZXh0LT50YWdfcmFtX2NvbnRyb2w7CisgICAgcGwzMTAtPmRhdGFfcmFtX2NvbnRyb2wgPSBjb250ZXh0LT5kYXRhX3JhbV9jb250cm9sOworICAgIHBsMzEwLT5ldl9jb3VudGVyX2N0cmwgPSBjb250ZXh0LT5ldl9jb3VudGVyX2N0cmw7CisgICAgcGwzMTAtPmV2X2NvdW50ZXIxX2NmZyA9IGNvbnRleHQtPmV2X2NvdW50ZXIxX2NmZzsKKyAgICBwbDMxMC0+ZXZfY291bnRlcjBfY2ZnID0gY29udGV4dC0+ZXZfY291bnRlcjBfY2ZnOworICAgIHBsMzEwLT5ldl9jb3VudGVyMSA9IGNvbnRleHQtPmV2X2NvdW50ZXIxOworICAgIHBsMzEwLT5ldl9jb3VudGVyMCA9IGNvbnRleHQtPmV2X2NvdW50ZXIwOworICAgIHBsMzEwLT5pbnRfbWFzayA9IGNvbnRleHQtPmludF9tYXNrOworICAgIHBsMzEwLT5sb2NrX2xpbmVfZW4gPSBjb250ZXh0LT5sb2NrX2xpbmVfZW47CisgICAgZm9yIChpPTA7IGk8ODsgKytpKQorICAgIHsKKyAgICAgICAgcGwzMTAtPmxvY2tkb3duW2ldLmQgPSBjb250ZXh0LT5sb2NrZG93bltpXS5kOworICAgICAgICBwbDMxMC0+bG9ja2Rvd25baV0uaT0gY29udGV4dC0+bG9ja2Rvd25baV0uaTsKKyAgICB9CisgICAgcGwzMTAtPmFkZHJfZmlsdGVyaW5nX3N0YXJ0ID0gY29udGV4dC0+YWRkcl9maWx0ZXJpbmdfc3RhcnQ7CisgICAgcGwzMTAtPmFkZHJfZmlsdGVyaW5nX2VuZCA9IGNvbnRleHQtPmFkZHJfZmlsdGVyaW5nX2VuZDsKKyAgICBwbDMxMC0+ZGVidWdfY3RybCA9IGNvbnRleHQtPmRlYnVnX2N0cmw7CisgICAgcGwzMTAtPnByZWZldGNoX2N0cmwgPSBjb250ZXh0LT5wcmVmZXRjaF9jdHJsOworICAgIHBsMzEwLT5wb3dlcl9jdHJsID0gY29udGV4dC0+cG93ZXJfY3RybDsKKyAgICBkc2IoKTsKKyAgICBwbDMxMC0+Y29udHJvbCA9IDE7CisgICAgZHNiKCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMMiBDYWNoZSBhbmQgU0NVIFNhdmUgUmVzdW1lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgdm9pZCBDMmtfcG1fc3VzcGVuZCh2b2lkKQoreworCS8qIFZhcmlhYmxlIHRvIHRlbGwgd2hhdCBuZWVkcyB0byBiZSBzYXZlZCBhbmQgcmVzdG9yZWQKKyAgICAgCSAqIGluIEMya19wbV9zdXNwZW5kX25ldyAqLworCisJLyogc2F2ZV9zdGF0ZSA9IDAgPT4gTm90aGluZyB0byBzYXZlIGFuZCByZXN0b3JlZCAqLworCS8qIHNhdmVfc3RhdGUgPSAxID0+IE9ubHkgTDEgYW5kIGxvZ2ljIGxvc3QgKi8KKwkvKiBzYXZlX3N0YXRlID0gMiA9PiBPbmx5IEwyIGxvc3QgKi8KKwkvKiBzYXZlX3N0YXRlID0gMyA9PiBMMSwgTDIgYW5kIGxvZ2ljIGxvc3QgKi8KKyAJaW50IHNhdmVfc3RhdGUgPSAzOworCXVuc2lnbmVkIGludCAqIHAwOworCisJdW5zaWduZWQgaW50IHNjdV9kYXRhW1NDVV9EQVRBX1NJWkVdOworCXVuc2lnbmVkIGludCBwbDMxMF9kYXRhW0wyX0RBVEFfU0laRV07CisKKworCXByaW50ayhLRVJOX0lORk8gIlBNOiBDMjAwMCBEZXZpY2UgaXMgdHJ5aW5nIHRvIGVudGVyIFN1c3BlbmQgbW9kZSAuLi5cbiIpOworCisJcDAgPSAodW5zaWduZWQgaW50ICopIGNvbWNlcnRvX2NwdV9yZXN0b3JlOworCisJX19yYXdfd3JpdGVsKHZpcnRfdG9fcGh5cygodW5zaWduZWQgaW50KXAwKSwgcGh5c190b192aXJ0KDB4MjApKTsKKwlfX3Jhd193cml0ZWwoKHVuc2lnbmVkIGludClKVU1QX1RPX1JFU1VNRV8xICwgcGh5c190b192aXJ0KDB4MDApKTsKKwlfX3Jhd193cml0ZWwoKHVuc2lnbmVkIGludClKVU1QX1RPX1JFU1VNRV8yICwgcGh5c190b192aXJ0KDB4MDQpKTsKKwlzbXBfd21iKCk7CisJX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKCh2b2lkICopcGh5c190b192aXJ0KDB4MDApLCAweDI0KTsKKwlvdXRlcl9jbGVhbl9yYW5nZShfX3BhKHBoeXNfdG9fdmlydCgweDAwKSksIF9fcGEocGh5c190b192aXJ0KDB4MjQpKSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJQTTogQzIwMDAgSnVtcCBMb2NhdGlvbiBJbnN0YWxsZWQgLi4uIC0tIDB4JXggIC0tIDB4JXggIC0tIDB4JXggXG4iLCAodW5zaWduZWQgaW50KXAwLCAodW5zaWduZWQgaW50KWNvbWNlcnRvX2NwdV9yZXN0b3JlLCB2aXJ0X3RvX3BoeXMoKHVuc2lnbmVkIGludClwMCkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUE06IFNhdmluZyBTQ1UgQ29udGV4dCAuLi5cbiIpOworCXNhdmVfYTlfc2N1KCZzY3VfZGF0YVswXSwgKHVuc2lnbmVkIGludCAqKUNPTUNFUlRPX1NDVV9WQUREUik7CisKKwlwcmludGsoS0VSTl9JTkZPICJQTTogU2F2aW5nIEwyIENhY2hlIENvbnRleHQgLi4uXG4iKTsKKwlzYXZlX3BsMzEwKCZwbDMxMF9kYXRhWzBdLCAodW5zaWduZWQgaW50ICopQ09NQ0VSVE9fTDMxMF9WQUREUik7CisKKwkvKiBQYXNzIHRoZSBiaXRtYXNrIGluZm9ybWF0aW9uIHRvIHRoZSB1VGlsUEUgKi8KKwkqKCgodm9sYXRpbGUgdW5zaWduZWQgaW50ICopKEhPU1RfVVRJTFBFX1NIQVJFRF9BRERSRVNTKSkrNCkgPSBob3N0X3V0aWxwZV9zaGFyZWRfcG11X2JpdG1hc2s7CisKKwlwcmludGsoS0VSTl9JTkZPICJQTTogR29pbmcgdG8gU3VzcGVuZCAuLi5cbiIpOworCisJY3B1X3N1c3BlbmQoc2F2ZV9zdGF0ZSwgY29tY2VydG9fZG9fc3JhbV9pZGxlKTsKKworCXJlc3RvcmVfYTlfc2N1KCZzY3VfZGF0YVswXSwgKHVuc2lnbmVkIGludCAqKUNPTUNFUlRPX1NDVV9WQUREUik7CisJcmVzdG9yZV9wbDMxMCgmcGwzMTBfZGF0YVswXSwgKHVuc2lnbmVkIGludCAqKUNPTUNFUlRPX0wzMTBfVkFERFIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUE06IEMyMDAwICBpcyByZS1zdGFydGluZyBmcm9tIFN1c3BlbmQgU3RhdGUgLi4uXG4iKTsKKworCXJldHVybjsKK30KKworLyogIEMya19wbV9lbnRlcgorICogIEBzdGF0ZTogICAgICAgICBTdGF0ZSB3ZSdyZSBlbnRlcmluZy4KKyAqLworCitzdGF0aWMgaW50IEMya19wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJc3dpdGNoKHN0YXRlKQorCXsKKworCWNhc2UgUE1fU1VTUEVORF9TVEFOREJZOgorCWNhc2UgUE1fU1VTUEVORF9NRU06CisJCUMya19wbV9zdXNwZW5kKCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwcl9pbmZvKCJQTTogQzIwMDAgTGVhdmluZyBDMmtfcG1fZW50ZXIgXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBDMmtfcG1fdmFsaWRfc3RhdGUoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBQTV9TVVNQRU5EX09OOgorCQljYXNlIFBNX1NVU1BFTkRfU1RBTkRCWToKKwkJY2FzZSBQTV9TVVNQRU5EX01FTToKKwkJCXJldHVybiAxOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgc3VzcGVuZF9zdGF0ZV90IHRhcmdldF9zdGF0ZTsKKworLyoKKyAqIENhbGxlZCBhZnRlciBwcm9jZXNzZXMgYXJlIGZyb3plbiwgYnV0IGJlZm9yZSB3ZSBzaHV0ZG93biBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IEMya19wbV9iZWdpbihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJdGFyZ2V0X3N0YXRlID0gc3RhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxsZWQgcmlnaHQgcHJpb3IgdG8gdGhhd2luZyBwcm9jZXNzZXMuCisgKi8KK3N0YXRpYyB2b2lkIEMya19wbV9maW5pc2godm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJTdXNwZW5kIHByb2Nlc3MgaXMgY29tcGxldGVkLCBXYWl0IGZvciBDMjAwMCBkZXZpY2UgdG8gcmVzdW1lIFxuIik7Cit9CisKKworLyoKKyAqIENhbGxlZCByaWdodCBwcmlvciB0byB0aGF3aW5nIHByb2Nlc3Nlcy4KKyAqLworc3RhdGljIHZvaWQgQzJrX3BtX2VuZCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlJlc3VtZSBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgQzIwMDAgZGV2aWNlIGlzIFBvd2VyIG9uIEFnYWluIFxuIik7CisgICAgICAgIHRhcmdldF9zdGF0ZSA9IFBNX1NVU1BFTkRfT047Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9zdXNwZW5kX29wcyBDMmtfcG1fb3BzID0geworCS52YWxpZAkgICA9IEMya19wbV92YWxpZF9zdGF0ZSwKKwkuYmVnaW4gICAgID0gQzJrX3BtX2JlZ2luLAorCS5lbnRlciAgICAgPSBDMmtfcG1fZW50ZXIsCisJLmZpbmlzaCAgICA9IEMya19wbV9maW5pc2gsCisJLmVuZCAgICAgICA9IEMya19wbV9lbmQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBDMmtfcG1faW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlBvd2VyIE1hbmFnZW1lbnQgTW9kZSBTdXBwb3J0IEZvciBDMjAwMDogXG4iKTsKKworCXN1c3BlbmRfc2V0X29wcygmQzJrX3BtX29wcyk7CisgICAgICAgIHJldHVybiAwOworfQorYXJjaF9pbml0Y2FsbChDMmtfcG1faW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vcmVzZXQuYyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vcmVzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODczMzNhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9yZXNldC5jCkBAIC0wLDAgKzEsNTMwIEBACisvKgorICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY29tY2VydG8vcmVzZXQuYworICoKKyAqICBkcml2ZXIgZm9yIGJsb2NrIHJlc2V0IGZvciBhbGwgdGhlIGRldmljZXMgYXZhaWxibGUgaW4gdGhlIAorICogIGMyMDAwIGRldmljZS4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworc3RhdGljIGNoYXIgaTJjc3BpX3N0YXRlWzJdLGR1c19zdGF0ZVszXTsKK3NwaW5sb2NrX3QgcmVzZXRfbG9jazsKK3N0YXRpYyBzcGlubG9ja190IGdwaW9fbG9jazsKKworCit2b2lkIGNvbWNlcnRvX3JzdF9jbnRybF9zZXQodW5zaWduZWQgaW50IGRldl9yc3RfY250cmxfYml0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJlc2V0X2xvY2ssIGZsYWdzKTsKKworCV9fcmF3X3dyaXRlbCgoZGV2X3JzdF9jbnRybF9iaXQgfCBfX3Jhd19yZWFkbChERVZJQ0VfUlNUX0NOVFJMKSksIERFVklDRV9SU1RfQ05UUkwpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVzZXRfbG9jayxmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGNvbWNlcnRvX3JzdF9jbnRybF9zZXQpOworCisvKiBAIGludCBibG9jayA6IElkIG9mIGRldmljZSBibG9jayB0byBiZSBwdXQgaW4gcmVzZXQKKyAqIEAgaW50IHN0YXRlIDogU3RhdGUgdmFsdWUgMC0+T1VULU9GLVJFU0VUICwgMS0+UkVTRVQuCisgKiBBUEkgZm9yIGJsb2NrIHJlc2V0IHRvIGFsbCB0aGUgZGV2aWNlIGJsb2NrcworICogYXZhaWxhYmxlIGZvciBDMjAwMCBkZXZpY2VzLgorICovCit2b2lkIGMyMDAwX2Jsb2NrX3Jlc2V0KGludCBibG9jayxpbnQgc3RhdGUpCit7Cit1bnNpZ25lZCBsb25nIGZsYWdzOworc3Bpbl9sb2NrX2lycXNhdmUoJnJlc2V0X2xvY2ssIGZsYWdzKTsKKworaWYoc3RhdGUpeworCS8qICBDb2RlIGlzIHRvIHB1dCB0aGUgZGV2aWNlIGJsb2NrIGluIFJFU0VUICovCisJc3dpdGNoIChibG9jaykKKwl7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9SVEM6CisJCQkvKiBQdXQgdGhlIFRpbWVyIGRldmljZShBWEkgY2xvY2sgZG9tYWluKSBpbiByZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKEFYSV9SRVNFVF8xKSB8IFJUQ19BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMSk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX0kyQzoKKwkJCWkyY3NwaV9zdGF0ZVswXT0xOworCQkJZ290byBpMmNzcGlfcnN0OworCQljYXNlIENPTVBPTkVOVF9BWElfTEVHQUNZX1NQSToKKwkJCWkyY3NwaV9zdGF0ZVsxXT0xOworCQlpMmNzcGlfcnN0OgorCQkJaWYoaTJjc3BpX3N0YXRlWzBdID09IDEgJiYgaTJjc3BpX3N0YXRlWzFdID09IDEpCisJCQkJLyogUHV0IHRoZSBJMkMgYW5kIExFR0FDWSBTUEkoQVhJIGNsb2NrIGRvbWFpbikgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQkJd3JpdGVsKHJlYWRsKEFYSV9SRVNFVF8xKSB8IEkyQ1NQSV9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMSk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX0RNQToKKwkJCWR1c19zdGF0ZVswXT0xOworCQkJZ290byBkdXNfcnN0OworCQljYXNlIENPTVBPTkVOVF9BWElfRkFTVF9VQVJUOgorCQkJZHVzX3N0YXRlWzFdPTE7CisJCQlnb3RvIGR1c19yc3Q7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9GQVNUX1NQSToKKwkJCWR1c19zdGF0ZVsyXT0xOworCQlkdXNfcnN0OgorCQkJaWYoZHVzX3N0YXRlWzBdID09IDEgJiYgZHVzX3N0YXRlWzFdID09IDEgJiYgZHVzX3N0YXRlWzJdID09IDEpCisJCQkJLyogUHV0IHRoZSBEVVMgKEFYSSBjbG9jayBkb21haW4pIGRldmljZSBpbiByZXNldCBzdGF0ZSAqLworCQkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMSkgfCBEVVNfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzEpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9URE06CisJCQkvKiBQdXQgdGhlIFRETShBWEkgY2xvY2sgZG9tYWluKSBkZXZpY2UgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMSkgfCBURE1fQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzEpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1BGRV9TWVM6CisJCQkvKiBQdXQgdGhlIFBGRSBkZXZpY2UgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMSkgfCBQRkVfU1lTX0FYSV9SRVNFVF9CSVQsIEFYSV9SRVNFVF8xKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9BWElfSVBTRUNfRUFQRToKKwkJCS8qIFB1dCB0aGUgSVBTRUMgRUFQRSAoQVhJIGNsb2NrIGRvbWFpbikgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzEpIHwgSVBTRUNfRUFQRV9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMSk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX0lQU0VDX1NQQUNDOgorCQkJLyogUHV0IHRoZSBJUFNFQyBTUEFDQyAoQVhJIGNsb2NrIGRvbWFpbikgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzEpIHwgSVBTRUNfU1BBQ0NfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzEpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9EUElfQ0lFOgorCQkJLyogUHV0IHRoZSBEUEkgQ0lFIChBWEkgY2xvY2sgZG9tYWluKSBkZXZpY2UgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMCkgfCBEUElfQ0lFX0FYSV9SRVNFVF9CSVQsIEFYSV9SRVNFVF8wKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9BWElfRFBJX0RFQ09NUDoKKwkJCS8qIFB1dCB0aGUgRFBJIERFQ09NUCAoQVhJIGNsb2NrIGRvbWFpbikgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzApIHwgRFBJX0RFQ09NUF9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX1VTQjA6CisJCQkvKiBQdXQgdGhlIFVTQjAgZGV2aWNlKEFYSSBjbG9jayBkb21haW4pIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzIpIHwgVVNCMF9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMik7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfVVRNSV9VU0IwOgorCQkJLyogUHV0IHRoZSBVU0IwIGRldmljZShVVE1JIGNsb2NrIGRvbWFpbikgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChVU0JfUlNUX0NOVFJMKSB8IFVTQjBfVVRNSV9SRVNFVF9CSVQsIFVTQl9SU1RfQ05UUkwpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1VTQjBfUEhZOgorCQkJLyogUHV0IHRoZSBVU0IwX1BIWSBkZXZpY2UgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChVU0JfUlNUX0NOVFJMKSB8IFVTQjBfUEhZX1JFU0VUX0JJVCwgVVNCX1JTVF9DTlRSTCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX1VTQjE6CisJCQkvKiBQdXQgdGhlIFVTQjEgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzIpIHwgVVNCMV9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMik7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfVVRNSV9VU0IxOgorCQkJLyogUHV0IHRoZSBVU0IxIGRldmljZShVVE1JIGNsb2NrIGRvbWFpbikgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChVU0JfUlNUX0NOVFJMKSB8IFVTQjFfVVRNSV9SRVNFVF9CSVQsIFVTQl9SU1RfQ05UUkwpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1VTQjFfUEhZOgorCQkJLyogUHV0IHRoZSBVU0IxX1BIWSBkZXZpY2UgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChVU0JfUlNUX0NOVFJMKSB8IFVTQjFfUEhZX1JFU0VUX0JJVCwgVVNCX1JTVF9DTlRSTCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX1NBVEE6CisJCQkvKiBQdXQgdGhlIFNBVEEgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzIpIHwgU0FUQV9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMik7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX1BDSUUwOgorCQkJLyogUHV0IHRoZSBQQ0lFMCBkZXZpY2UgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMikgfCBQQ0lFMF9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMik7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX1BDSUUxOgorCQkJLyogUHV0IHRoZSBQQ0lFMSAgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzIpIHwgUENJRTFfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzIpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1BGRV9DT1JFOgorCQkJLyogUHV0IHRoZSBQRkUgY29yZSAgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoUEZFX1JFU0VUKSB8IFBGRV9DT1JFX1JFU0VUX0JJVCwgUEZFX1JFU0VUKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9JUFNFQ19FQVBFX0NPUkU6CisJCQkvKiBQdXQgdGhlIElQU0VDIEVBUEUgIGNvcmUgIGRldmljZSBpbiByZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKElQU0VDX1JFU0VUKSB8IElQU0VDX0VBUEVfQ09SRV9SRVNFVF9CSVQsIElQU0VDX1JFU0VUKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9HRU1UWDoKKwkJCS8qIFB1dCB0aGUgR0VNVFggZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoR0VNVFhfUkVTRVQpIHwgR0VNVFhfUkVTRVRfQklUICwgR0VNVFhfUkVTRVQpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0RFQ1Q6CisJCQkvKiBQdXQgdGhlIERFQ1QgZGV2aWNlIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoREVDVF9SRVNFVCkgfCBERUNUX1JFU0VUX0JJVCAsIERFQ1RfUkVTRVQpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0REUl9DTlRMUjoKKwkJCS8qIFB1dCB0aGUgRERSIGNvbnRyb2xsZXIgIGRldmljZSBpbiByZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKEREUl9SRVNFVCkgfCBERFJfQ05UUkxfUkVTRVRfQklUICwgRERSX1JFU0VUKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9ERFJfUEhZOgorCQkJLyogUHV0IHRoZSBERFIgUEhZICBkZXZpY2UgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChERFJfUkVTRVQpIHwgRERSX1BIWV9SRVNFVF9CSVQgLCBERFJfUkVTRVQpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1NFUkRFUzA6CisJCQkvKiBQdXQgIFNFUkRFUzAgY29udHJvbGxlciAgaW4gUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChTRVJERVNfUlNUX0NOVFJMKSB8IFNFUkRFUzBfUkVTRVRfQklUICxTRVJERVNfUlNUX0NOVFJMKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9TRVJERVNfUENJRTA6CisJCQkvKiBQdXQgdGhlIFBDSUUwIFNFUkRFUyBjb250cm9sbGVyIGluIFJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoUENJZV9TQVRBX1JTVF9DTlRSTCkgfCBTRVJERVNfUENJRTBfUkVTRVRfQklULCBQQ0llX1NBVEFfUlNUX0NOVFJMKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9TRVJERVMxOgorCQkJLyogUHV0IFNFUkRFUzEgY29udHJsbGVyIDEgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChTRVJERVNfUlNUX0NOVFJMKSB8IFNFUkRFUzFfUkVTRVRfQklUICxTRVJERVNfUlNUX0NOVFJMKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9TRVJERVNfUENJRTE6IAorCQkJLyogUHV0IFBDSUUxIHNlcmRlcyBjb250cm9sbGVyIGluIHJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoUENJZV9TQVRBX1JTVF9DTlRSTCkgfCBTRVJERVNfUENJRTFfUkVTRVRfQklUICwgUENJZV9TQVRBX1JTVF9DTlRSTCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfU0VSREVTX1NBVEEwOiAKKwkJCS8qIFB1dCBTQVRBMCBzZXJkZXMgY29udHJvbGxlciBpbiByZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKFBDSWVfU0FUQV9SU1RfQ05UUkwpIHwgKFNFUkRFU19TQVRBMF9SRVNFVF9CSVQpLCBQQ0llX1NBVEFfUlNUX0NOVFJMKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9TRVJERVMyOgorCQkJLyogUHV0IFNFUkRFUzIgY29udHJsbGVyICBpbiByZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKFNFUkRFU19SU1RfQ05UUkwpIHwgU0VSREVTMl9SRVNFVF9CSVQgLFNFUkRFU19SU1RfQ05UUkwpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1NFUkRFU19TQVRBMTogCisJCQkvKiBQdXQgU0FUQTEgc2VyZGVzIGNvbnRyb2xsZXIgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChQQ0llX1NBVEFfUlNUX0NOVFJMKSB8IFNFUkRFU19TQVRBMV9SRVNFVF9CSVQgLCBQQ0llX1NBVEFfUlNUX0NOVFJMKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9TR01JSTogCisJCQkvKiBQdXQgU0dNSUkgc2VyZGVzIGNvbnRyb2xsZXIgaW4gcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChTR01JSV9PQ0NfUkVTRVQpIHwgKFNHTUlJX1JFU0VUX0JJVCksIFNHTUlJX09DQ19SRVNFVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfU0FUQV9QTVU6CisJCQkvKiBQdXQgdGhlIFNBVEEgUE1VKEtlZXAgQWxpdmUgY2xvY2spIGluIFJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoU0FUQV9QTVVfUkVTRVQpIHwgU0FUQV9QTVVfUkVTRVRfQklULCBTQVRBX1BNVV9SRVNFVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfU0FUQV9PT0I6CisJCQkvKiBQdXQgdGhlIFNBVEEgT09CIGluIFJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoU0FUQV9PT0JfUkVTRVQpIHwgU0FUQV9PT0JfUkVTRVRfQklULCBTQVRBX09PQl9SRVNFVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfVERNTlRHOgorCQkJLyogUHV0IHRoZSBURE1OVEcgIGluIFJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoVERNTlRHX1JFU0VUKSB8IFRETU5UR19SRVNFVF9CSVQsIFRETU5UR19SRVNFVCk7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQlicmVhazsKKwl9CQorfWVsc2V7CisJLyogQ29kZSBpcyB0byBwdXQgdGhlIGRldmljZSBibG9jayB0byBPdXQgb2YgcmVzZXQgKi8KKwlzd2l0Y2ggKGJsb2NrKQorCXsKKwkJY2FzZSBDT01QT05FTlRfQVhJX1JUQzoKKwkJCS8qIFB1dCB0aGUgVGltZXIgZGV2aWNlIGluIE91dC1PZi1SZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKEFYSV9SRVNFVF8xKSAmIH5SVENfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzEpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9JMkM6CisJCQlpMmNzcGlfc3RhdGVbMF09MDsKKwkJCWdvdG8gaTJjc3BpX291dHJzdDsKKwkJY2FzZSBDT01QT05FTlRfQVhJX0xFR0FDWV9TUEk6CisJCQlpMmNzcGlfc3RhdGVbMV09MDsKKwkJaTJjc3BpX291dHJzdDoKKwkJCS8qIFB1dCB0aGUgSTJDL1NQSSBkZXZpY2UgaW4gT3V0LU9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzEpICYgfkkyQ1NQSV9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMSk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX0RNQToKKwkJCWR1c19zdGF0ZVswXT0wOworCQkJZ290byBkdXNfb3V0cnN0OworCQljYXNlIENPTVBPTkVOVF9BWElfRkFTVF9VQVJUOgorCQkJZHVzX3N0YXRlWzFdPTA7CisJCQlnb3RvIGR1c19vdXRyc3Q7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9GQVNUX1NQSToKKwkJCWR1c19zdGF0ZVsyXT0wOworCQlkdXNfb3V0cnN0OgorCQkJLyogUHV0IHRoZSBEVVMgZGV2aWNlcyBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMSkgJiB+RFVTX0FYSV9SRVNFVF9CSVQgLCBBWElfUkVTRVRfMSk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX1RETToKKwkJCS8qIFB1dCB0aGUgVERNIGRldmljZSBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMSkgJiB+VERNX0FYSV9SRVNFVF9CSVQsIEFYSV9SRVNFVF8xKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9QRkVfU1lTOgorCQkJLyogUHV0IHRoZSBQRkUgU3lzdGVtIGRldmljZXMgaW4gT3V0LU9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzEpICYgflBGRV9TWVNfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzEpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9JUFNFQ19FQVBFOgorCQkJLyogUHV0IHRoZSBJUFNFQyBFQVBFIGRldmljZXMgaW4gT3V0LU9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzEpICYgfklQU0VDX0VBUEVfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzEpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9JUFNFQ19TUEFDQzoKKwkJCS8qIFB1dCB0aGUgSVBTRUMgU1BBQ0MgZGV2aWNlcyBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMSkgJiB+SVBTRUNfU1BBQ0NfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzEpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9EUElfQ0lFOgorCQkJLyogUHV0IHRoZSBEUEkgQ0lFIGRldmljZXMgaW4gT3V0LU9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzApICYgfkRQSV9DSUVfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzApOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9EUElfREVDT01QOgorCQkJLyogUHV0IHRoZSBEUEkgREVDT01QIGRldmljZXMgaW4gT3V0LU9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzApICYgfkRQSV9ERUNPTVBfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzApOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9VU0IwOgorCQkJLyogUHV0IHRoZSBVU0IwIGRldmljZSBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMikgJiB+VVNCMF9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMik7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfVVRNSV9VU0IwOgorCQkJLyogUHV0IHRoZSBVU0IwIGRldmljZShVVE1JIGNsb2NrIGRvbWFpbikgaW4gT3V0LU9mLXJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoVVNCX1JTVF9DTlRSTCkgJiB+VVNCMF9VVE1JX1JFU0VUX0JJVCwgVVNCX1JTVF9DTlRSTCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfVVNCMF9QSFk6CisJCQkvKiBQdXQgdGhlIFVTQjBfUEhZIGRldmljZXMgaW4gT3V0LU9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoVVNCX1JTVF9DTlRSTCkmIH5VU0IwX1BIWV9SRVNFVF9CSVQsIFVTQl9SU1RfQ05UUkwpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9VU0IxOgorCQkJLyogUHV0IHRoZSBVU0IxIGRldmljZSBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMikgJiB+VVNCMV9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMik7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfVVRNSV9VU0IxOgorCQkJLyogUHV0IHRoZSBVU0IxIGRldmljZShVVE1JIGNsb2NrIGRvbWFpbikgaW4gT3V0LU9mLXJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoVVNCX1JTVF9DTlRSTCkgJiB+VVNCMV9VVE1JX1JFU0VUX0JJVCwgVVNCX1JTVF9DTlRSTCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfVVNCMV9QSFk6CisJCQkvKiBQdXQgdGhlIFVTQjFfUEhZIGRldmljZXMgaW4gT3V0LU9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoVVNCX1JTVF9DTlRSTCkmIH5VU0IxX1BIWV9SRVNFVF9CSVQsIFVTQl9SU1RfQ05UUkwpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0FYSV9TQVRBOgorCQkJLyogUHV0IHRoZSBTQVRBIGRldmljZSBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMikgJiB+U0FUQV9BWElfUkVTRVRfQklULCBBWElfUkVTRVRfMik7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfQVhJX1BDSUUwOgorCQkJLyogUHV0IHRoZSBQQ0lFMCBkZXZpY2UgaW4gT3V0LU9mLXJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoQVhJX1JFU0VUXzIpICYgflBDSUUwX0FYSV9SRVNFVF9CSVQsIEFYSV9SRVNFVF8yKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9BWElfUENJRTE6CisJCQkvKiBQdXQgdGhlIFBDSUUxIGRldmljZSBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChBWElfUkVTRVRfMikgJiB+UENJRTFfQVhJX1JFU0VUX0JJVCwgQVhJX1JFU0VUXzIpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1BGRV9DT1JFOgorCQkJLyogUHV0IHRoZSBQRkUgY29yZSAgZGV2aWNlIE91dC1PZi1SZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKFBGRV9SRVNFVCkgJiB+UEZFX0NPUkVfUkVTRVRfQklULCBQRkVfUkVTRVQpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0lQU0VDX0VBUEVfQ09SRToKKwkJCS8qIFB1dCB0aGUgSVBTRUMgRUFQRSAgY29yZSAgZGV2aWNlIGluIE91dC1PZi1SZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKElQU0VDX1JFU0VUKSAmIH5JUFNFQ19FQVBFX0NPUkVfUkVTRVRfQklULCBJUFNFQ19SRVNFVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfR0VNVFg6CisJCQkvKiBQdXQgdGhlIEdFTVRYIGRldmljZSBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChHRU1UWF9SRVNFVCkgJiB+R0VNVFhfUkVTRVRfQklUICwgR0VNVFhfUkVTRVQpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0RFQ1Q6CisJCQkvKiBQdXQgdGhlIERFQ1QgZGV2aWNlIGluIE91dC1PZi1SZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKERFQ1RfUkVTRVQpICYgfkRFQ1RfUkVTRVRfQklUICwgREVDVF9SRVNFVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfRERSX0NOVExSOgorCQkJLyogUHV0IHRoZSBERFIgY29udHJvbGxlciAgZGV2aWNlIGluIE91dC1PZi1SZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKEREUl9SRVNFVCkgJiB+RERSX0NOVFJMX1JFU0VUX0JJVCAsIEREUl9SRVNFVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfRERSX1BIWToKKwkJCS8qIFB1dCB0aGUgRERSIFBIWSAgZGV2aWNlIGluIE91dC1PZi1SZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKEREUl9SRVNFVCkgJiB+RERSX1BIWV9SRVNFVF9CSVQgLCBERFJfUkVTRVQpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1NFUkRFUzA6CisJCQkvKiBwdXQgdGhlIFNFUkRFUzAgY29udHJvbGxlciAgaW4gT3V0LW9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoU0VSREVTX1JTVF9DTlRSTCkgJiB+U0VSREVTMF9SRVNFVF9CSVQgLFNFUkRFU19SU1RfQ05UUkwpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1NFUkRFU19QQ0lFMDoKKwkJCS8qIFB1dCB0aGUgUENJRTAgU0VSREVTIGNvbnRyb2xsZXIgaW4gT3V0LU9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoUENJZV9TQVRBX1JTVF9DTlRSTCkgJiB+U0VSREVTX1BDSUUwX1JFU0VUX0JJVCwgUENJZV9TQVRBX1JTVF9DTlRSTCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfU0VSREVTMToKKwkJCS8qIFB1dCBTRURFUzEgY29udHJvbGxlciBpbiBPdXQtT2YtcmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChTRVJERVNfUlNUX0NOVFJMKSYgflNFUkRFUzFfUkVTRVRfQklUICxTRVJERVNfUlNUX0NOVFJMKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9TRVJERVNfUENJRTE6IAorCQkJLyogUHV0IFBDSUUxIHNlcmRlcyBjb250cm9sbGVyIGluIE91dC1PZi1SZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKFBDSWVfU0FUQV9SU1RfQ05UUkwpICYgflNFUkRFU19QQ0lFMV9SRVNFVF9CSVQgLCBQQ0llX1NBVEFfUlNUX0NOVFJMKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9TRVJERVNfU0FUQTA6IAorCQkJd3JpdGVsKHJlYWRsKFBDSWVfU0FUQV9SU1RfQ05UUkwpICYgflNFUkRFU19TQVRBMF9SRVNFVF9CSVQsIFBDSWVfU0FUQV9SU1RfQ05UUkwpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1NFUkRFUzI6CisJCQkvKiBQdXQgU2VyZGVzIGNvbnRybGxlciAxIGluIE91dC1PZi1SZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKFNFUkRFU19SU1RfQ05UUkwpICYgflNFUkRFUzJfUkVTRVRfQklUICxTRVJERVNfUlNUX0NOVFJMKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9TRVJERVNfU0FUQTE6IAorCQkJLyogUHV0IFNBVEExIHNlcmRlcyBjb250cm9sbGVyIGluIE91dC1PZi1yZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKFBDSWVfU0FUQV9SU1RfQ05UUkwpICYgflNFUkRFU19TQVRBMV9SRVNFVF9CSVQgLCBQQ0llX1NBVEFfUlNUX0NOVFJMKTsKKwkJCWJyZWFrOworCQljYXNlIENPTVBPTkVOVF9TR01JSTogCisJCQkvKiBQdXQgdGhlIFNHTUlJIGNvbnRyb2xsZXIgaW4gT3V0LU9mLVJlc2V0IHN0YXRlICovCisJCQl3cml0ZWwocmVhZGwoU0dNSUlfT0NDX1JFU0VUKSAmIH5TR01JSV9SRVNFVF9CSVQsIFNHTUlJX09DQ19SRVNFVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfU0FUQV9QTVU6CisJCQkvKiBQdXQgdGhlIFNBVEEgUE1VKEtFRVAgQUxJVkUgY2xvY2spIGluIE91dC1PZi1SZXNldCBzdGF0ZSAqLworCQkJd3JpdGVsKHJlYWRsKFNBVEFfUE1VX1JFU0VUKSAmIH5TQVRBX1BNVV9SRVNFVF9CSVQgLCBTQVRBX1BNVV9SRVNFVCk7CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfU0FUQV9PT0I6CisJCQkvKiBQdXQgdGhlIFNBVEEgT09CICBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChTQVRBX09PQl9SRVNFVCkgJiB+U0FUQV9PT0JfUkVTRVRfQklUICwgU0FUQV9PT0JfUkVTRVQpOworCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1RETU5URzoKKwkJCS8qIFB1dCB0aGUgVERNTlRHICBpbiBPdXQtT2YtUmVzZXQgc3RhdGUgKi8KKwkJCXdyaXRlbChyZWFkbChURE1OVEdfUkVTRVQpICYgflRETU5UR19SRVNFVF9CSVQsIFRETU5UR19SRVNFVCk7CisJCQlicmVhazsKKwkJZGVmYXVsdCA6CisJCQlicmVhazsKKwl9Cit9CitzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXNldF9sb2NrLGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woYzIwMDBfYmxvY2tfcmVzZXQpOworCisjaWYgZGVmaW5lZChDT05GSUdfQzJLX01GQ05fRVZNKQordm9pZCBHUElPX3Jlc2V0X2V4dGVybmFsX2RldmljZShpbnQgYmxvY2ssaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCisJLyogQmxvY2tzIHRvIGJlIHB1dCBpbiBvdXQgb2YgUmVzZXQgYW5kIHJlc2V0IG1vZGUKKwkgKiAwIC0tLS0+IG91dCBvZiByZXNldAorCSAqIDEgLS0tLT4gcmVzZXQKKwkgKi8KKwlzd2l0Y2ggKGJsb2NrKXsKKwkJY2FzZSBDT01QT05FTlRfQVRIRVJPU19TV0lUQ0g6CisJCQlpZihncGlvX3JlcXVlc3Rfb25lKEdQSU9fUElOX05VTV81LCBHUElPRl9PVVRfSU5JVF9ISUdILCBHUElPX1BJTl9ERVNDXzUpKXsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiVkOiBDYW5ub3QgcmVxdWVzdCBncGlvIGZvciBncGlvLSVkXG4iLCBcCisJCQkJCQlfX2Z1bmNfXywgX19MSU5FX18sIEdQSU9fUElOX05VTV80KTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWlmIChzdGF0ZSl7CisJCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19QSU5fTlVNXzUsIEdQSU9fU0VUXzApOworCisJCQkJZ3Bpb19kaXJlY3Rpb25faW5wdXQoR1BJT19QSU5fTlVNXzUpOworCQkJfWVsc2V7CisJCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19QSU5fTlVNXzUsIEdQSU9fU0VUXzApOworCisJCQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KEdQSU9fUElOX05VTV81LCBHUElPX1NFVF8wKTsKKworCQkJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUElOX05VTV81LCBHUElPX1NFVF8xKTsKKwkJCX0KKworCQkJZ3Bpb19mcmVlKEdQSU9fUElOX05VTV81KTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDT01QT05FTlRfU0xJQzoKKwkJCWlmKGdwaW9fcmVxdWVzdF9vbmUoR1BJT19QSU5fTlVNXzQsIEdQSU9GX09VVF9JTklUX0hJR0gsIEdQSU9fUElOX0RFU0NfNCkpeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6JWQ6IENhbm5vdCByZXF1ZXN0IGdwaW8gZm9yIGdwaW8tJWRcbiIsIFwKKwkJCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgR1BJT19QSU5fTlVNXzQpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKHN0YXRlKXsKKwkJCQlncGlvX3NldF92YWx1ZShHUElPX1BJTl9OVU1fNCwgR1BJT19TRVRfMCk7CisKKwkJCQlncGlvX2RpcmVjdGlvbl9pbnB1dChHUElPX1BJTl9OVU1fNCk7CisJCQl9ZWxzZXsKKwkJCQlncGlvX3NldF92YWx1ZShHUElPX1BJTl9OVU1fNCwgR1BJT19TRVRfMCk7CisKKwkJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoR1BJT19QSU5fTlVNXzQsIEdQSU9fU0VUXzApOworCisJCQkJZ3Bpb19zZXRfdmFsdWUoR1BJT19QSU5fTlVNXzQsIEdQSU9fU0VUXzEpOworCQkJfQorCisJCQlncGlvX2ZyZWUoR1BJT19QSU5fTlVNXzQpOworCisJCQlicmVhazsKKworCQljYXNlIENPTVBPTkVOVF9QQ0lFMDoKKwkJCWlmIChzdGF0ZSl7CisJCQkJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVCkgJiB+R1BJT19QSU5fNDgsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVCk7CisJCQkJd3JpdGVsKCByZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVRfRU4pIHwgR1BJT19QSU5fNDgsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTik7CisJCQkJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCkgJiB+R1BJT19QSU5fNDgsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCk7CisJCQl9ZWxzZXsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKSAmIH5HUElPX1BJTl80OCwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKTsKKwkJCQl3cml0ZWwoIHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTikgJiB+R1BJT19QSU5fNDgsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTik7CisJCQkJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVCkgfCBHUElPX1BJTl80OCwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKTsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKSB8IEdQSU9fUElOXzQ4LCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX1BDSUUxOgorCQkJaWYgKHN0YXRlKXsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKSAmIH5HUElPX1BJTl80NywgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKTsKKwkJCQl3cml0ZWwoIHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTikgfCBHUElPX1BJTl80NywgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKTsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKSAmIH5HUElPX1BJTl80NywgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKTsKKwkJCX1lbHNleworCQkJCXdyaXRlbChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpICYgfkdQSU9fUElOXzQ3LCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpOworCQkJCXdyaXRlbCggcmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKSAmIH5HUElPX1BJTl80NywgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKTsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKSB8IEdQSU9fUElOXzQ3LCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpOworCQkJCXdyaXRlbChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QpIHwgR1BJT19QSU5fNDcsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfVVNCX0hVQjoKKwkJCWlmIChzdGF0ZSl7CisJCQkJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVCkgJiB+R1BJT19QSU5fNTAsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVCk7CisJCQkJd3JpdGVsKCByZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVRfRU4pIHwgR1BJT19QSU5fNTAsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTik7CisJCQkJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCkgJiB+R1BJT19QSU5fNTAsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCk7CisJCQl9ZWxzZXsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKSAmIH5HUElPX1BJTl81MCwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKTsKKwkJCQl3cml0ZWwoIHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTikgJiB+R1BJT19QSU5fNTAsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTik7CisJCQkJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVCkgfCBHUElPX1BJTl81MCwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKTsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKSB8IEdQSU9fUElOXzUwLCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ09NUE9ORU5UX0VYUF9EQVVHVEhFUl9DQVJEOgorCQkJaWYgKHN0YXRlKXsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKSAmIH5HUElPX1BJTl80OSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKTsKKwkJCQl3cml0ZWwoIHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTikgfCBHUElPX1BJTl80OSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKTsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKSAmIH5HUElPX1BJTl80OSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKTsKKwkJCX1lbHNleworCQkJCXdyaXRlbChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpICYgfkdQSU9fUElOXzQ5LCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpOworCQkJCXdyaXRlbCggcmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKSAmIH5HUElPX1BJTl80OSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKTsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKSB8IEdQSU9fUElOXzQ5LCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpOworCQkJCXdyaXRlbChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QpIHwgR1BJT19QSU5fNDksIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfUkdNSUkwOgorCQkJaWYgKHN0YXRlKXsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKSAmIH5HUElPX1BJTl80NiwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKTsKKwkJCQl3cml0ZWwoIHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTikgfCBHUElPX1BJTl80NiwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKTsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKSAmIH5HUElPX1BJTl80NiwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKTsKKwkJCX1lbHNleworCQkJCXdyaXRlbChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpICYgfkdQSU9fUElOXzQ2LCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpOworCQkJCXdyaXRlbCggcmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKSAmIH5HUElPX1BJTl80NiwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKTsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKSB8IEdQSU9fUElOXzQ2LCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpOworCQkJCXdyaXRlbChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QpIHwgR1BJT19QSU5fNDYsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDT01QT05FTlRfUkdNSUkxOgorCQkJaWYgKHN0YXRlKXsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKSAmIH5HUElPX1BJTl80NSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKTsKKwkJCQl3cml0ZWwoIHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTikgfCBHUElPX1BJTl80NSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKTsKKwkJCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKSYgfkdQSU9fUElOXzQ1LCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9TRUxFQ1QpOworCQkJfWVsc2V7CisJCQkJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVCkgJiB+R1BJT19QSU5fNDUsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVCk7CisJCQkJd3JpdGVsKCByZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVRfRU4pICYgfkdQSU9fUElOXzQ1LCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVRfRU4pOworCQkJCXdyaXRlbChyZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpIHwgR1BJT19QSU5fNDUsIENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVCk7CisJCQkJd3JpdGVsKHJlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX1NFTEVDVCkgfCBHUElPX1BJTl80NSwgQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fU0VMRUNUKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woR1BJT19yZXNldF9leHRlcm5hbF9kZXZpY2UpOworI2VuZGlmCisKK3ZvaWQgcmVzZXRfaW5pdCh2b2lkKXsKKworCS8qSW5pdGlsaXplIHRoZSBEVVMgLHNlcmRlMC8xLzIgYW5kIEkyQ1NQSSBkZXBlbmRhbmN5IHZhbHVlcyAqLworCWkyY3NwaV9zdGF0ZVswXT1pMmNzcGlfc3RhdGVbMV09ZHVzX3N0YXRlWzBdPWR1c19zdGF0ZVsxXT1kdXNfc3RhdGVbMl09MDsKKworICAgICAgICBzcGluX2xvY2tfaW5pdCgmcmVzZXRfbG9jayk7CisKKwkvKiBEbyBBbnkgYm9vdHRpbWUgUmVzZXQvT3V0LU9mLVJlc2V0IHRvIGRldmljZXMgaWYgcmVxdWlyZWQqLworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9zZXJkZXMtYzIwMDAuYyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vc2VyZGVzLWMyMDAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1ZjFjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vc2VyZGVzLWMyMDAwLmMKQEAgLTAsMCArMSwxOTAgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLiAyMDExLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCisgKiBwcm9qZWN0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqIEBmaWxlIHNlcmRlcy5jCisgKiBAYnJpZWYgdGhpcyBDIGZpbGUgd2lsbCBjb250YWluIGFsbCByZXF1aXJlZCBmdW5jdGlvbnMgdG8gcHJvZ3JhbQorICogICAgICAgIFNub3didXNoIFNlckRlcyBQSFkgaW50ZXJmYWNlLgorICogQGRhdGUgMTAvMDIvMjAxMQorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPG1hY2gvc2VyZGVzLWMyMDAwLmg+CisKKyNkZWZpbmUgTUFYX0xBTkVfT0tfV0FJVF9KSUZGSUVTCSgyMDAgKiBIWikgLyAxMDAwICAgIC8qIDIwMG1zICovCisjZGVmaW5lIE1BWF9DTVVfT0tfV0FJVF9KSUZGSUVTCQkoMjAwMCAqIEhaKSAvIDEwMDAgICAvKiAyIFNlY29uZHMgKi8KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIFdhaXQgZm9yIHRoZSAnTGFuZSBPSycgdG8gYmUgc2lnbmFsZWQgYnkgdGhlIAorICogU25vd2J1c2ggU2VyZGVzIFBIWS4KKyAqIEBwYXJhbSBzYnBoeV9udW0JU2VyRGVzIFBIWSBpbnRlZnJhY2UgbnVtYmVyLgorICovCitzdGF0aWMgaW50IHdhaXRfbGFuZV9vayh1MzIgc2JwaHlfbnVtKQoreworCXUzMiByZF9kYXRhID0gMCwgbWFza2VkX2RhdGEgPSAwOworCXUzMiBsYW5lX29rX2R0Y3RkX21hc2sgPSAweDAwMDAxMDAwOworCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUgPSBqaWZmaWVzICsgTUFYX0xBTkVfT0tfV0FJVF9KSUZGSUVTOworCisJLyogS2VlcCBsb29waW5nIHVudGlsIHlvdSBzZWUgdGhlIGxhbmVfb2tfbyBvZiBTZXJkZXMgKi8KKwlkbworCXsKKwkJcmRfZGF0YSA9IHJlYWRsKENPTUNFUlRPX1NFUkRFU19EV0NfQ0ZHX1JFRyggc2JwaHlfbnVtLCBTRF9QSFlfU1RTX1JFR19PRlNUKSk7CisKKwkJLyogTWFzayBsYW5lX29rIFN0YXR1cyAqLworCQltYXNrZWRfZGF0YSA9IHJkX2RhdGEgJiBsYW5lX29rX2R0Y3RkX21hc2s7CisKKwkJaWYobWFza2VkX2RhdGEgPT0gbGFuZV9va19kdGN0ZF9tYXNrKSB7CisJCQkvKiBMYW5lIE9LIERldGVjdGVkIG9uIFNlcmRlcyBQb3J0ICovCisJCQlwcmludGsoS0VSTl9JTkZPICJTZXJkZXMlZDogTGFuZSBPSyBQYXNzZWRcbiIsc2JwaHlfbnVtKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJY29uZF9yZXNjaGVkKCk7CisKKwl9IHdoaWxlICghdGltZV9hZnRlcl9lcShqaWZmaWVzLCBkZWFkbGluZSkpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiU2VyZGVzJWQ6IExhbmUgT0sgRmFpbGVkXG4iLHNicGh5X251bSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHdhaXQgZm9yIHRoZSAnQ01VIE9LJyB0byBiZSBzaWduYWxlZCBieSB0aGUKKyAqIFNub3didXNoIFNlcmRlcyBQSFkuCisgKiBAcGFyYW0gc2JwaHlfbnVtCVNlckRlcyBQSFkgaW50ZWZyYWNlIG51bWJlci4KKyAqLworc3RhdGljIGludCB3YWl0X2NtdV9vayh1MzIgc2JwaHlfbnVtKQoreworCXUzMiByZF9kYXRhID0gMCwgbWFza2VkX2RhdGEgPSAwOworCXUzMiBjbXVfb2tfZHRjdGRfbWFzayA9IDB4MDAwMDQwMDA7CisJaW50IENNVV9PZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBkZWFkbGluZSA9IGppZmZpZXMgKyBNQVhfQ01VX09LX1dBSVRfSklGRklFUzsKKworCUNNVV9PZmZzZXQgPSBDT01DRVJUT19TRVJERVNfRFdDX0NGR19SRUcoIHNicGh5X251bSwgU0RfUEhZX1NUU19SRUdfT0ZTVCApOworCisKKwkvKiBLZWVwIGxvb3BpbmcgdW50aWwgeW91IHNlZSB0aGUgY211X29rX28gb2YgU2VyZGVzICovCisJZG8KKwl7CisJCXJkX2RhdGEgPSByZWFkbChDTVVfT2Zmc2V0KTsKKworCQkvKiBNYXNrIGNtdV9vayBTdGF0dXMgKi8KKwkJbWFza2VkX2RhdGEgPSByZF9kYXRhICYgY211X29rX2R0Y3RkX21hc2s7CisKKwkJaWYobWFza2VkX2RhdGEgPT0gY211X29rX2R0Y3RkX21hc2spIHsKKwkJCS8qIENNVSBPSyBEZXRlY3RlZCBvbiBTZXJkZXMgUG9ydCAqLworCQkJLy9wcmludGsoS0VSTl9JTkZPICJTZXJkZXMlZDogQ01VIE9LIFBhc3NlZFxuIixzYnBoeV9udW0pOworCQkJcmV0dXJuIDE7CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKworCX0gd2hpbGUgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGRlYWRsaW5lKSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJTZXJkZXMlZDogQ01VIE9LIEZhaWxlZFxuIixzYnBoeV9udW0pOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgY29uZmlndXJlZCBTbm93YnVzaCBQSFkKKyAqIChTZXJkZXMpIHRvIGlzc3VlIGl0J3MgQ01VLU9LLCBhbmQgaXQncyBMYW5lIHRvIGJlY29tZSBSZWFkeQorICogYWZ0ZXIgcmVsZWFzaW5nIHRoZSBDTVUgJiBMYW5lIHJlc2V0cy4KKyAqIEBwYXJhbSBzYnBoeV9udW0JU2VyRGVzIFBIWSBpbnRlZnJhY2UgbnVtYmVyLgorICovCitzdGF0aWMgaW50IHdhaXRfc2JfY211X2xhbmVfcmR5KHUzMiBzYnBoeV9udW0sIHUzMiB0eXBlKQoreworCXUzMiBzZF9jdGwyX3JlZ19vZmZzZXQ7CisJdTMyIGNtdV9yc3RfbWFzayA9IDB4MDAwMTAwMDA7CisJdTMyIGxhbmVfcnN0X21hc2sgPSAweDAwMDAwMDQwOworCXUzMiB0bXAgPSAwOworCisJc2RfY3RsMl9yZWdfb2Zmc2V0ID0gQ09NQ0VSVE9fU0VSREVTX0RXQ19DRkdfUkVHKCBzYnBoeV9udW0sIFNEX1BIWV9DVFJMMl9SRUdfT0ZTVCApOworCisJLyogUmVsZWFzaW5nIHRoZSBDTVUgUmVzZXQgKi8KKwl0bXAgPSByZWFkbChzZF9jdGwyX3JlZ19vZmZzZXQpOworCXRtcCA9IHRtcCAmICh+Y211X3JzdF9tYXNrKTsKKwl0bXAgPSB0bXAgfCBjbXVfcnN0X21hc2s7CisKKwl3cml0ZWwodG1wLCBzZF9jdGwyX3JlZ19vZmZzZXQgKTsKKworCS8qIFdhaXRpbmcgZm9yIENNVSBPSyAqLworCWlmKCAhd2FpdF9jbXVfb2soc2JwaHlfbnVtKSApCisJCXJldHVybiAtMTsKKworCWlmICggdHlwZSA9PSBTRF9ERVZfVFlQRV9QQ0lFICkKKwkJd3JpdGVsKDB4QzMsIENPTUNFUlRPX1NFUkRFU19SRUcoc2JwaHlfbnVtLCAoU0RfQ09NTU9OX0xBTkUgPDwgMikpKTsKKwllbHNlCisJCXdyaXRlbCgweDAzLCBDT01DRVJUT19TRVJERVNfUkVHKHNicGh5X251bSwgKFNEX0NPTU1PTl9MQU5FIDw8IDIpKSk7CisKKwkvKiBSZWxlYXNpbmcgdGhlIExhbmUgUmVzZXQgKi8KKwl0bXAgPSByZWFkbChzZF9jdGwyX3JlZ19vZmZzZXQpOworCXRtcCA9IHRtcCAmICh+bGFuZV9yc3RfbWFzayk7CisJdG1wID0gdG1wIHwgbGFuZV9yc3RfbWFzazsKKworCXdyaXRlbCh0bXAsIHNkX2N0bDJfcmVnX29mZnNldCk7CisKKwkvKiBXYWl0aW5nIGZvciB0aGUgTGFuZSBSZWFkeSAqLworCWlmICh0eXBlICE9IFNEX0RFVl9UWVBFX1BDSUUpIHsKKwkJaWYoICF3YWl0X2xhbmVfb2soc2JwaHlfbnVtKSApCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIFNub3didXNoIFBIWSAoU2VyZGVzKSBmb3Igb3BlcmF0aW9uCisgKiB3aXRoIHRoZSBvbmUgb2YgdGhlIFBDSUUsU0FUQSBvciBTR01JSSBJUCBibG9ja3MsIGFuZCB0aGVuIHdhaXRpbmcKKyAqIHVudGlsIGl0IGlzc3VlIGl0J3MgQ01VLU9LLCBhbmQgaXQncyAgTGFuZSB0byBiZWNvbWUgUmVhZHkgYWZ0ZXIKKyAqIHJlbGVhc2luZyB0aGUgQ01VICYgTGFuZSBSZXNldHMuCisgKiBAcGFyYW0gcGh5X251bQlTZXJEZXMgUEhZIGludGVmcmFjZSBudW1iZXIuCisgKiBAcGFyYW0gKnJlZ3MJCVJlZ2lzdGVyIGZpbGUgKEFycmF5IG9mIHJlZ2lzdGVycyBhbmQgY29yZXNwb25kaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgdG8gYmUgcHJvZ3JhbW1lZCkuCisgKiBAcGFyYW0gc2l6ZQkJTnVtYmVyIG9mIHJlZ2lzdGVycyB0byBiZSBwcm9ncmFtbWVkLgorICovCitpbnQgc2VyZGVzX3BoeV9pbml0KGludCBwaHlfbnVtLCBzdHJ1Y3Qgc2VyZGVzX3JlZ3NfcyAqcmVncywgaW50IHNpemUsIGludCB0eXBlKQoreworCWludCBpaTsKKworCS8qIEluaXRpbGl6ZSBzZXJkZXMgcGh5IHJlZ2lzdGVycyAqLworCWZvciggaWkgPSAwOyBpaSA8IHNpemU7IGlpKysgKQorCQl3cml0ZWwocmVnc1tpaV0udmFsLCBDT01DRVJUT19TRVJERVNfUkVHKHBoeV9udW0sIHJlZ3NbaWldLm9mc3QpKTsKKworCS8qIFdhaXQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBvZiBTZXJkZXMtMSBQb3J0L0xhbmUgdG8gYmVjb21lIFJlYWR5ICovCisJcmV0dXJuIHdhaXRfc2JfY211X2xhbmVfcmR5KHBoeV9udW0sIHR5cGUpOworfQorCitFWFBPUlRfU1lNQk9MKHNlcmRlc19waHlfaW5pdCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY29tY2VydG8vc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtY29tY2VydG8vc2xlZXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTVjMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9zbGVlcC5TCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9zbGVlcC5TCisgKgorICogQXV0aG9yOiBNYWthcmFuZCBQYXdhZ2kKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDAzIEFSTSBMaW1pdGVkCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KKworI2RlZmluZSBTQ1JBVENIUEFEX1NVU1BFTkRfSU5ESUNBVE9SX0xPQyAgICAoMHhmMDgwMDAwMCArIDB4MjQwMCkKKyNkZWZpbmUgU0NSQVRDSFBBRF9CQVNFX1AgICAgICAgKDB4ZjA4MDAwMDArMHgyNDAwKzB4MTAwKSAvKklSQU1fTUVNT1JZX1ZBRERSICsgT2Zmc2V0Ki8KKyNkZWZpbmUgU0NSQVRDSFBBRF9DUFVfQ09OVEVYVF9MT0NfT0ZGU0VUIDB4NzAKKyNkZWZpbmUgU0NSQVRDSFBBRF9DUFVfQ09OVEVYVF9MT0MgICAgIFNDUkFUQ0hQQURfQkFTRV9QICsgU0NSQVRDSFBBRF9DUFVfQ09OVEVYVF9MT0NfT0ZGU0VUCisKKworCS50ZXh0CisvKiBGdW5jdGlvbiBjYWxsIHRvIGdldCB0aGUgcmVzdG9yZSBwb2ludGVyIGZvciByZXN1bWUgZnJvbSBPRkYgKi8KK0VOVFJZKGMya19nZXRfcmVzdG9yZV9wb2ludGVyKQorICAgICAgICBzdG1mZCAgIHNwISwge2xyfSAgICAgQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjaworCUFSTSAoIGFkcglyMCwgY29tY2VydG9fY3B1X3Jlc3RvcmUgKQorICAgICAgICBiaWMgICAgIHIwLCAjUEFHRV9PRkZTRVQKKyAgICAgICAgbGRtZmQgICBzcCEsIHtwY30gICAgIEAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KK0VOVFJZKGdldF9yZXN0b3JlX3BvaW50ZXJfc3opCisgICAgICAgIC53b3JkICAgLiAtIGdldF9yZXN0b3JlX3BvaW50ZXJfc3oKKworCisKKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqID09IElkbGUgZW50cnkgcG9pbnQgPT0KKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogRm9yY2VzIEMySyBpbnRvIGlkbGUgc3RhdGUKKyAqCisgKiBjb21jZXJ0b19jcHVfc3VzcGVuZCgpIC0gVGhpcyBiaXQgb2YgY29kZSBzYXZlcyB0aGUgQ1BVIGNvbnRleHQgaWYgbmVlZGVkCisgKiBhbmQgZXhlY3V0ZXMgdGhlIFdGSSBpbnN0cnVjdGlvbi4gQ2FsbGluZyBXRkkgZWZmZWN0aXZlbHkgY2hhbmdlcyB0aGUKKyAqIHBvd2VyIGRvbWFpbnMgc3RhdGVzIHRvIHRoZSBkZXNpcmVkIHRhcmdldCBwb3dlciBzdGF0ZXMuCisgKi8KKwkuYWxpZ24JMworRU5UUlkoY29tY2VydG9fY3B1X3N1c3BlbmQpCisJc3RtZmQJc3AhLCB7cjQgLSByMTEsIGxyfQlAIHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCisKKwkvKgorCSAqIHIwIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHNhdmluZyBjb250ZXh0OgorCSAqICAgMCAtIE5vIGNvbnRleHQgbG9zdAorCSAqICAgMSAtIE9ubHkgTDEgYW5kIGxvZ2ljIGxvc3QKKwkgKiAgIDIgLSBPbmx5IEwyIGxvc3QgKEV2ZW4gTDEgaXMgcmV0YWluZWQgd2UgY2xlYW4gaXQgYWxvbmcgd2l0aCBMMikKKwkgKiAgIDMgLSBCb3RoIEwxIGFuZCBMMiBsb3N0IGFuZCBsb2dpYyBsb3N0CisJICovCisKKwkvKgorCSAqIEZvciBPRkYgbW9kZTogc2F2ZSBjb250ZXh0IGFuZCBqdW1wIHRvIFdGSSAoY29tY2VydG9fZG9fd2ZpKQorCSAqLworCWNtcAlyMCwgIzB4MAkJQCBJZiBubyBjb250ZXh0IHNhdmUgcmVxdWlyZWQsCisJYmVxCWNvbWNlcnRvX2RvX3dmaQkJQCAganVtcCB0byB0aGUgV0ZJCisKKworCS8qIE90aGVyd2lzZSBmYWxsIHRocm91Z2ggdG8gdGhlIHNhdmUgY29udGV4dCBjb2RlICovCitjb21jZXJ0b19zYXZlX2NvbnRleHRfd2ZpOgorCS8qCisJICoganVtcCBvdXQgdG8ga2VybmVsIGZsdXNoIHJvdXRpbmUKKwkgKiAgLSByZXVzZSB0aGF0IGNvZGUgaXMgYmV0dGVyCisJICogIC0gaXQgZXhlY3V0ZXMgaW4gYSBjYWNoZWQgc3BhY2Ugc28gaXMgZmFzdGVyIHRoYW4gcmVmZXRjaCBwZXItYmxvY2sKKwkgKiAgLSBzaG91bGQgYmUgZmFzdGVyIGFuZCB3aWxsIGNoYW5nZSB3aXRoIGtlcm5lbAorCSAqICAtICdtaWdodCcgaGF2ZSB0byBjb3B5IGFkZHJlc3MsIGxvYWQgYW5kIGp1bXAgdG8gaXQKKwkgKiBGbHVzaCBhbGwgZGF0YSBmcm9tIHRoZSBMMSBkYXRhIGNhY2hlIGJlZm9yZSBkaXNhYmxpbmcKKwkgKiBTQ1RMUi5DIGJpdC4KKwkgKi8KKwlsZHIJcjEsIGtlcm5lbF9mbHVzaAorCW1vdglsciwgcGMKKwlieAlyMQorCisJLyoKKwkgKiBDbGVhciB0aGUgU0NUTFIuQyBiaXQgdG8gcHJldmVudCBmdXJ0aGVyIGRhdGEgY2FjaGUKKwkgKiBhbGxvY2F0aW9uLiBDbGVhcmluZyBTQ1RMUi5DIHdvdWxkIG1ha2UgYWxsIHRoZSBkYXRhIGFjY2Vzc2VzCisJICogc3Ryb25nbHkgb3JkZXJlZCBhbmQgd291bGQgbm90IGhpdCB0aGUgY2FjaGUuCisJICovCisJQVJNICggbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMCApCisJQVJNICggYmljCXIwLCByMCwgIygxIDw8IDIpICkJQCBEaXNhYmxlIHRoZSBDIGJpdAorCUFSTSAoIG1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAgKQorCUFSTSAoIGlzYiApCisKKwkvKgorCSAqIEludmFsaWRhdGUgTDEgZGF0YSBjYWNoZS4gRXZlbiB0aG91Z2ggb25seSBpbnZhbGlkYXRlIGlzCisJICogbmVjZXNzYXJ5IGV4cG9ydGVkIGZsdXNoIEFQSSBpcyB1c2VkIGhlcmUuIERvaW5nIGNsZWFuCisJICogb24gYWxyZWFkeSBjbGVhbiBjYWNoZSB3b3VsZCBiZSBhbG1vc3QgTk9QLgorCSAqLworCWxkcglyMSwga2VybmVsX2ZsdXNoCisJYmx4CXIxCisJLyoKKwkgKiBUaGUga2VybmVsIGRvZXNuJ3QgaW50ZXJ3b3JrOiB2N19mbHVzaF9kY2FjaGVfYWxsIGluIHBhcnRpY2x1YXIgd2lsbAorCSAqIGFsd2F5cyByZXR1cm4gaW4gVGh1bWIgc3RhdGUgd2hlbiBDT05GSUdfVEhVTUIyX0tFUk5FTCBpcyBlbmFibGVkLgorCSAqIFRoaXMgc2VxdWVuY2Ugc3dpdGNoZXMgYmFjayB0byBBUk0uICBOb3RlIHRoYXQgLmFsaWduIG1heSBpbnNlcnQgYQorCSAqIG5vcDogYnggcGMgbmVlZHMgdG8gYmUgd29yZC1hbGlnbmVkIGluIG9yZGVyIHRvIHdvcmsuCisJICovCisgVEhVTUIoCS50aHVtYgkJKQorIFRIVU1CKAkuYWxpZ24JCSkKKyBUSFVNQigJYngJcGMJKQorIFRIVU1CKAlub3AJCSkKKwkuYXJtCisKKwliCWNvbWNlcnRvX2RvX3dmaQorCisvKgorICogTG9jYWwgdmFyaWFibGVzCisgKi8KK2tlcm5lbF9mbHVzaDoKKwkud29yZCB2N19mbHVzaF9kY2FjaGVfYWxsCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqID09IFdGSSBpbnN0cnVjdGlvbiA9PiBFbnRlciBpZGxlID09CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiBEbyBXRkkgaW5zdHJ1Y3Rpb24KKyAqIEluY2x1ZGVzIHRoZSByZXN1bWUgcGF0aCBmb3Igbm9uLU9GRiBtb2RlcyBbVEJEXQorICovCisJLmFsaWduCTMKK0VOVFJZKGNvbWNlcnRvX2RvX3dmaSkKKworCS8qIFN0b3JlIGNwc3IgYW5kIHNwc3IgKi8KKyAgICAgICAgbGRyIAlyNywgc2NyYXRjaHBhZF9jcHVfY29udGV4dF9sb2MKKworCS8qbXJzCXI0LCBjcHNyCisJbXJzCXI1LCBzcHNyCisJc3RtaWEJcjchLCB7cjQtcjV9Ki8KKworCisKKwkvKiBTYXZpbmcgYWxsIHRoZSBiYW5rZWQgcmVnaXN0ZXJzICovCisgICAgICAgIG1ycyAgICAgcjAsIGNwc3IKKworICAgICAgICAvKiBTYXZlIHRoZSBVbmRlZiBtb2RlIHJlaXN0ZXJzICovCisgICAgICAgIGJpYyAgICAgcjEsIHIwLCAjMHgxZgorICAgICAgICBvcnIgICAgIHIxLCByMSwgIzB4MWIKKyAgICAgICAgbXNyICAgICBjcHNyX2MsIHIxCisJQVJNICggc3RtaWEJcjchLCB7cjEzLXIxNH0gKQorCW1ycwlyMTMsIHNwc3IKKwlzdG1pYQlyNyEsIHtyMTN9CisKKyAgICAgICAgLyogU2F2ZSB0aGUgQWJvcnQgbW9kZSByZWlzdGVycyAqLworICAgICAgICBiaWMgICAgIHIxLCByMCwgIzB4MWYKKyAgICAgICAgb3JyICAgICByMSwgcjEsICMweDE3CisgICAgICAgIG1zciAgICAgY3Bzcl9jLCByMQorCUFSTSAoIHN0bWlhCXI3ISwge3IxMy1yMTR9ICkKKwltcnMJcjEzLCBzcHNyCisJc3RtaWEJcjchLCB7cjEzfQorCisgICAgICAgIC8qIFNhdmUgdGhlIElSUSBtb2RlIHJlaXN0ZXJzICovCisgICAgICAgIGJpYyAgICAgcjEsIHIwLCAjMHgxZgorICAgICAgICBvcnIgICAgIHIxLCByMSwgIzB4MTIKKyAgICAgICAgbXNyICAgICBjcHNyX2MsIHIxCisJQVJNICggc3RtaWEJcjchLCB7cjEzLXIxNH0gKQorCW1ycwlyMTMsIHNwc3IKKwlzdG1pYQlyNyEsIHtyMTN9CisKKyAgICAgICAgLyogU2F2ZSB0aGUgRklRIG1vZGUgcmVpc3RlcnMgKi8KKyAgICAgICAgYmljICAgICByMSwgcjAsICMweDFmCisgICAgICAgIG9yciAgICAgcjEsIHIxLCAjMHgxMQorICAgICAgICBtc3IgICAgIGNwc3JfYywgcjEKKwlBUk0gKCBzdG1pYQlyNyEsIHtyOC1yMTR9ICkKKwlUSFVNQiAoIHN0bWlhCXI3ISwge3I4LXIxMn0gKQorCW1ycwlyMTMsIHNwc3IKKwlzdG1pYQlyNyEsIHtyMTN9CisKKyAgICAgICAgLyogUmV0dXJuIHRvIHRoZSBvcmlnaW5hbCBtb2RlICovCisgICAgICAgIG1zciAgICAgY3Bzcl9jLCByMAorCisJLyogV2UgY2FuIFB1dCBERFIgaW4gc2VsZiByZWZyZXNoIG1vZGUgaGVyZSBbVEJEXSAqLworCisJLyogUGFzcyBjb250cm9sIHRvIFV0aWxQRSAqLworICAgICAgICBsZHIgcjQsIHNjcmF0Y2hwYWRfcmVib290X2luZGljYXRvcl9sb2MKKyAgICAgICAgbW92IHI1LCAjMHhGRgorICAgICAgICBzdHIgcjUsIFtyNF0KKworCS8qIERhdGEgbWVtb3J5IGJhcnJpZXIgYW5kIERhdGEgc3luYyBiYXJyaWVyICovCisJZHNiCisJZG1iCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogPT0gV0ZJIGluc3RydWN0aW9uID0+IEVudGVyIGlkbGUgPT0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKwl3ZmkJCQkJQCB3YWl0IGZvciBpbnRlcnJ1cHQKKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9PSAgUmVzdW1lIHBhdGggZm9yIG5vbi1PRkYgbW9kZXMgVEJEICA9PQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCW5vcAorCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFRCRAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiA9PSBSZXN1bWUgcGF0aCBmb3IgT0ZGIG1vZGUgPT0KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiBUaGUgcmVzdG9yZSBmdW5jdGlvbiBpcyBpbnN0YWxlZWQgYXQgMHgwIGxvY2F0aW9uCisgKiBvZiBERFIuCisgKi8KKworRU5UUlkoY29tY2VydG9fY3B1X3Jlc3RvcmUpCisJbGRyCXIxLCBsMmRpc18zNjMwCisJY21wCXIxLCAjMHgxCQkvKkAgVGVzdCBpZiBMMiByZS1lbmFibGUgbmVlZGVkIG9uIDM2MzAqLworCWJuZQlza2lwbDJyZWVuCisJbXJjCXAxNSwgMCwgcjEsIGMxLCBjMCwgMQorCW9ycglyMSwgcjEsICMyCQkvKkAgcmUtZW5hYmxlIEwyIGNhY2hlKi8KKwltY3IJcDE1LCAwLCByMSwgYzEsIGMwLCAxCitza2lwbDJyZWVuOgorCisKKwkvKiBOb3cgYnJhbmNoIHRvIHRoZSBjb21tb24gQ1BVIHJlc3VtZSBmdW5jdGlvbiAqLworCWJseAljcHVfcmVzdW1lCisKKwkubHRvcmcKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlcworICovCisKK2wyZGlzXzM2MzA6CisJLndvcmQKKworCitFTlRSWShjb3B5X3dvcmRzKQorCWNtcAlyMiwgIzAKKwliZXEJZjEKK2IwOgorCWxkcglyMywgW3IxXSwgIzQKKwlzdHIJcjMsIFtyMF0sICM0CisJc3VicwlyMiwgcjIsICMxCisJYm5lCWIwCitmMToKKwlieAlscgorCisKKworCitzY3JhdGNocGFkX2NwdV9jb250ZXh0X2xvYzoKKyAgICAgICAgLndvcmQgICBTQ1JBVENIUEFEX0NQVV9DT05URVhUX0xPQworc2NyYXRjaHBhZF9yZWJvb3RfaW5kaWNhdG9yX2xvYzoKKyAgICAgICAgLndvcmQgICBTQ1JBVENIUEFEX1NVU1BFTkRfSU5ESUNBVE9SX0xPQwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9zeXNmc3RkbS5jIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by9zeXNmc3RkbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNTAwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL3N5c2ZzdGRtLmMKQEAgLTAsMCArMSw1NTIgQEAKKyAvKgorICAqICBDb3B5cmlnaHQgKEMpIDIwMDggTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICAqCisgICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgKgorICAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICoKKyAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8bWFjaC9jb21jZXJ0by1jb21tb24uaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvY2xrLXJzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KKworLyogRGVmYWx1bHQgUmF0ZSB2YWx1ZSBpcyBpbiBIeiovCisjZGVmaW5lIFRETU5UR19ERUZBVUxUX1JFRl9DTEsgNTAwMDAwMDAwCisKKy8qIHNpbmNlICdwcG0nIG1lYW5zIHBhcnRzLXBlci1taWxsaW9uICovCisjZGVmaW5lIE1JTExJT04gKDEwMDAwMDBVTCkKKworLyogTlRHIHRvIFRETSBjbG9jayBkaXZpZGVycyAqLworI2RlZmluZSBDT01DRVJUT19CTE9DS19URE1fRElWCTEKKyNkZWZpbmUgQ09NQ0VSVE9fQkxPQ0tfWkRTX0RJVgkyNAorI2RlZmluZSBDT01DRVJUT19CTE9DS19HUElPX0RJVgkxCisjZGVmaW5lIENPTUNFUlRPX0JMT0NLX01TSUZfRElWCTEyCitzdGF0aWMgaW50IGNvbWNlcnRvX2Jsb2NrX2Nsa19kaXYgWzRdID0ge0NPTUNFUlRPX0JMT0NLX1RETV9ESVYsIENPTUNFUlRPX0JMT0NLX1pEU19ESVYsIENPTUNFUlRPX0JMT0NLX0dQSU9fRElWLCBDT01DRVJUT19CTE9DS19NU0lGX0RJVn07CitzdGF0aWMgaW50IGJsb2NrX3NlbGVjdGVkOworc3RhdGljIGludCBibG9ja19zZWxfY250ID0gMDsKK3N0YXRpYyBzcGlubG9ja190IGJsb2NrX2xvY2s7CisKKy8qbnRncmVmIGNsb2NrKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfbnRnX3JlZjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRkbW50Z19yZWZfY2xrOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBCYXNlQ2xvY2sgPSAwOyAvKiBmcmVxdWVuY3kgaXMgc2V0IGJ5IGNsb2NrX2ZyZXF1ZW5jeV9zZXQoKSAqLworCitzdGF0aWMgdm9pZCBmc3luY19vdXRwdXRfc2V0KHVuc2lnbmVkIGludCBmc291dHB1dCkKK3sKKwlpZiAoZnNvdXRwdXQpCisJeworCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT19URE1fTVVYKSB8ICgxIDw8IDApLCBDT01DRVJUT19HUElPX1RETV9NVVgpOworCQl3cml0ZWwocmVhZGwoVERNX0ZTWU5DX0dFTl9DVFJMKSB8ICgxIDw8IDApLCBURE1fRlNZTkNfR0VOX0NUUkwpOworCX0KKwllbHNlCisJeworCQl3cml0ZWwocmVhZGwoQ09NQ0VSVE9fR1BJT19URE1fTVVYKSAmIH4oMSA8PCAwKSwgQ09NQ0VSVE9fR1BJT19URE1fTVVYKTsKKwkJd3JpdGVsKHJlYWRsKFRETV9GU1lOQ19HRU5fQ1RSTCkgJiB+KDEgPDwgMCksIFRETV9GU1lOQ19HRU5fQ1RSTCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmc3luY19wb2xhcml0eV9zZXQodW5zaWduZWQgaW50IGZzcG9sYXJpdHkpCit7CisJLyogMjggRlNZTkNfRkFMTChSSVNFKV9FREdFICovCisJaWYgKGZzcG9sYXJpdHkpCisJCXdyaXRlbChyZWFkbChURE1fRlNZTkNfR0VOX0NUUkwpIHwgRlNZTkNfRkFMTF9FREdFLCBURE1fRlNZTkNfR0VOX0NUUkwpOworCWVsc2UKKwkJd3JpdGVsKHJlYWRsKFRETV9GU1lOQ19HRU5fQ1RSTCkgJiB+RlNZTkNfRkFMTF9FREdFLCBURE1fRlNZTkNfR0VOX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCBmc3luY19scGhhc2Vfc2V0KHUzMiBmc2x3aWR0aCkKK3sKKwkvKiBMb3dfUGhhc2VfV2lkdGggN2ZmLSBtYXhpbXVtICovCisJaWYgKGZzbHdpZHRoID4gMHg3RkYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTG93IFBoYXNlIHdpZHRoIHZhbHVlIGlzIG91dCBvZiByYW5nZSAlI3ggPiAweDdGRlxuIiwgX19mdW5jX18sIGZzbHdpZHRoKTsKKwkJcmV0dXJuOworCX0KKworCXdyaXRlbChmc2x3aWR0aCwgVERNX0ZTWU5DX0xPVyk7Cit9CisKK3N0YXRpYyB2b2lkIGZzeW5jX2hwaGFzZV9zZXQodTMyIGZzaHdpZHRoKQoreworCS8qIEhpZ2hfUGhhc2VfV2lkdGggN2ZmLSBtYXhpbXVtICovCisgICAgICAgIGlmIChmc2h3aWR0aCA+IDB4N0ZGKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEhpZ2ggUGhhc2Ugd2lkdGggdmFsdWUgaXMgb3V0IG9mIHJhbmdlICUjeCA+IDB4N0ZGXG4iLCBfX2Z1bmNfXywgZnNod2lkdGgpOworCQlyZXR1cm47CisJfQorCisJd3JpdGVsKGZzaHdpZHRoLCBURE1fRlNZTkNfSElHSCk7Cit9CisKK3N0YXRpYyB2b2lkIGNsb2NrX2ZyZXF1ZW5jeV9zZXQodW5zaWduZWQgbG9uZyBjbG9ja2h6KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBudGdfaW5jciA7CisKKwlCYXNlQ2xvY2sgPSBjbG9ja2h6OworCisJLyogQ2FsY3VsYXRlIE5URyBjbG9jazogbXVsdGlwbHkgVERNIGJhc2UgY2xvY2sgd2l0aCBibG9jayBkaXZpZGVyICovCQorCS8qIGNsb2NrX2ZyZXF1ZW5jeV9zZXQoKSBpcyBjYWxsZWQgd2l0aCBibG9ja19sb2NrIHRha2VuICovCisJbnRnX2luY3IgPSAgY29tY2VydG9fYmxvY2tfY2xrX2RpdltibG9ja19zZWxlY3RlZF0gKiBjbG9ja2h6OworCS8qIGdldCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBvbiBhbiAzMi1iaXQgYWNjdW11bGF0b3IgKi8KKwludGdfaW5jciA9IG50Z19pbmNyICogKDFVTEwgPDwgMzIpICsgdGRtbnRnX3JlZl9jbGsgLyAyOworCWRvX2RpdihudGdfaW5jciwgdGRtbnRnX3JlZl9jbGspOworCXByaW50ayhLRVJOX0lORk8gIiVzOiAoJWQ6JWQpIE5URyBJTkNSIHZhbHVlIGlzICVsbHVcbiIsIF9fZnVuY19fLCBibG9ja19zZWxlY3RlZCwgY29tY2VydG9fYmxvY2tfY2xrX2RpdltibG9ja19zZWxlY3RlZF0sIG50Z19pbmNyKTsKKworCS8qIG50Z19pbmNyID0gMHgxMEM2RjdBIGZvciAyLjA0OCBNSHogKi8KKwkvKiBudGdfaW5jciA9IDB4Qzk1Mzk2OSBmb3IgMjQuNTc2IE1IeiAqLworCS8qIG50Z19pbmNyID0gMHgxOTJBNzM3MSBmb3IgNDkuMTUyIE1IeiAqLworCXdyaXRlbChudGdfaW5jciwgVERNX05UR19JTkNSKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xvY2tfZnJlcXVlbmN5X2dldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjbGNfZGF0YTsKKworCS8qIEFjY29yZGluZyB0byB0aGUgZGVzaXJlZCBURE0gY2xvY2sgb3V0cHV0IGZyZXF1ZW5jeSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgY29uZmlndXJlZCAqLworCWNsY19kYXRhID0gKHJlYWRsKFRETV9OVEdfSU5DUikgJiAweDNGRkZGRkZGKTsvKiBnZXQgZnJlcXVlbmN5IGZyb20gcmVzb2x1dGlvbiBvbiBhbiAzMi1iaXQgYWNjdW11bGF0b3IgKi8KKwljbGNfZGF0YSA9IChjbGNfZGF0YSAqIHRkbW50Z19yZWZfY2xrICsgKDFVTEwgPDwgMzEpKSA+PiAzMjsKKwkvKiBEaXZpZGUgZG93biB0aGUgRGF0YSB3aXRoIFRETSBibG9jayBkaXZpZGVyICovCisJZG9fZGl2KGNsY19kYXRhLCBjb21jZXJ0b19ibG9ja19jbGtfZGl2W2Jsb2NrX3NlbGVjdGVkXSk7IC8qIGRvX2RpdiBiZWNhdXNlIG9mIDY0IGJpdCBvcGVyYXRpb24qLworCXJldHVybiAodW5zaWduZWQgbG9uZykoY2xjX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCBjbG9ja19vdXRwdXRfc2V0KHVuc2lnbmVkIGxvbmcgY2xvY2tvdXQpCit7CisJc3dpdGNoIChjbG9ja291dCkgeworCWNhc2UgMDoKKwkJd3JpdGVsKCgweDIgPDwgMTIpIHwgKHJlYWRsKENPTUNFUlRPX0dQSU9fQk9PVFNUUkFQX09WRVJSSURFKSAmIH4oMHgzIDw8IDEyKSksIENPTUNFUlRPX0dQSU9fQk9PVFNUUkFQX09WRVJSSURFKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl3cml0ZWwoKDB4MyA8PCAxMikgfCAocmVhZGwoQ09NQ0VSVE9fR1BJT19CT09UU1RSQVBfT1ZFUlJJREUpICYJfigweDMgPDwgMTIpKSwgQ09NQ0VSVE9fR1BJT19CT09UU1RSQVBfT1ZFUlJJREUpOworCQlicmVhazsKKwljYXNlIDI6CisJCXdyaXRlbCgoMHgwIDw8IDEyKSB8IChyZWFkbChDT01DRVJUT19HUElPX0JPT1RTVFJBUF9PVkVSUklERSkgJgl+KDB4MyA8PCAxMikpLCBDT01DRVJUT19HUElPX0JPT1RTVFJBUF9PVkVSUklERSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVua25vd24gY2xvY2sgb3V0cHV0IHZhbHVlXG4iLCBfX2Z1bmNfXyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbG9ja19wcG1fYWRqdXN0KGxvbmcgcHBtKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjbGNfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZyZXFfc2V0ID0gQmFzZUNsb2NrOworCWludCBuc2lnbiA9IDA7CisKKwlpZiAoIWZyZXFfc2V0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiKCVzKTogQ291bGQgbm90IGFkanVzdCBmcmVxdWVuY3k6IHlvdSBzaG91bGQgc2V0IGl0IGJlZm9yZVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHBwbSA8IDApIHsKKwkJbnNpZ24gPSAxOworCQlwcG0gPSAtcHBtOworCX0KKworCWlmIChuc2lnbiAmJiAocHBtID49IE1JTExJT04pKSB7CisJCS8qIG92ZXJmbG93IGRhbmdlcm91cyAqLworCQlwcmludGsoS0VSTl9FUlIgIiglcyk6IFRoaXMgaXMgdG9vIG11Y2ggcHBtOiAtJWx1XG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcpcHBtKTsKKwkJcmV0dXJuOworCX0KKworCWNsY19kYXRhID0gcHBtICogKDFVTEwgPDwgMzIpOworCisJZG9fZGl2KGNsY19kYXRhLCBNSUxMSU9OKTsKKworCWlmIChuc2lnbikgeworCQljbGNfZGF0YSA9ICgxVUxMIDw8IDMyKSAtIGNsY19kYXRhOworCX0gZWxzZSB7CisJCWNsY19kYXRhID0gKDFVTEwgPDwgMzIpICsgY2xjX2RhdGE7CisJfQorCisJY2xjX2RhdGEgPSBjbGNfZGF0YSAqIGZyZXFfc2V0ICsgdGRtbnRnX3JlZl9jbGsgLyAyOyAvKiB3aXRoIHJvdW5kaW5nIHRvIG5lYXJlc3QgaW50ZWdlciAqLworCWNsY19kYXRhICo9IGNvbWNlcnRvX2Jsb2NrX2Nsa19kaXZbYmxvY2tfc2VsZWN0ZWRdOworCWRvX2RpdihjbGNfZGF0YSwgdGRtbnRnX3JlZl9jbGspOworCisJaWYgKGNsY19kYXRhICYgfjB4M0ZGRkZGRkYpIHsKKwkJLyogdW5hY2NvdW50ZWQgYml0cyBkYW5nZXJvdXMgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICIoJXMpOiBUaGlzIGlzIHRvbyBtdWNoIHBwbTogJWx1XG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcpcHBtKTsKKwkJcmV0dXJuOworCX0KKworCXdyaXRlbCgoY2xjX2RhdGEgJiAweDNGRkZGRkZGKSB8IChyZWFkbChURE1fTlRHX0lOQ1IpICYgfjB4M0ZGRkZGRkYpLCBURE1fTlRHX0lOQ1IpOworfQorCitzdGF0aWMgbG9uZyBjbG9ja19wcG1fZ2V0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmcmVxX3NldCA9IEJhc2VDbG9jazsKKwl1bnNpZ25lZCBsb25nIGZyZXEgPSBjbG9ja19mcmVxdWVuY3lfZ2V0KCk7CisJdW5zaWduZWQgbG9uZyBsb25nIHBwbTsKKworCWlmIChmcmVxID4gZnJlcV9zZXQpIHsKKwkJcHBtID0gKGZyZXEgLSBmcmVxX3NldCkgKiBNSUxMSU9OICsgKGZyZXFfc2V0ID4+IDEpOworCQlkb19kaXYocHBtLCBmcmVxX3NldCk7CisJCXJldHVybiAobG9uZylwcG07CisJfSBlbHNlIHsKKwkJcHBtID0gKGZyZXFfc2V0IC0gZnJlcSkgKiBNSUxMSU9OICsgKGZyZXFfc2V0ID4+IDEpOworCQlkb19kaXYocHBtLCBmcmVxX3NldCk7CisJCXJldHVybiAoLTEgKiAobG9uZylwcG0pOworCX0KK30KKworI2RlZmluZSBURE1fQ1RSTF9TTElDX1JFU0VUIAkweDgwCisjZGVmaW5lIFRETV9DVFJMX0NMS19ESVZfQllQQVNTCTB4NDAKKyNkZWZpbmUgVERNX0NUUkxfREVGX0RJViAJMHgyCisjZGVmaW5lIFRETV9DVExSX1JFU0VUX0JZUEFTUyBURE1fQ1RSTF9TTElDX1JFU0VUIHwgVERNX0NUUkxfQ0xLX0RJVl9CWVBBU1MgfCBURE1fQ1RSTF9ERUZfRElWCisKK3N0YXRpYyB2b2lkIHRkbV9tdXhfc2V0KHUzMiB0ZG1tdXgpCit7CisJYmxvY2tfc2VsZWN0ZWQgPSB0ZG1tdXg7CisJLyogVERNIGludGVyZmFjZSBNdXhpbmcgWzU6NF0KKwkwMAlURE0gYmxvY2sgaXMgc2VsZWN0ZWQKKwkwMQlaRFMgYmxvY2sgKFphcmxpbmspIGlzIHNlbGVjdGVkCisJMTAJR1BJT1s2Mzo2MF0gc2lnbmFscyBhcmUgc2VsZWN0ZWQKKwkxMQlNU0lGIGJsb2NrIChTaUxhYnMpIGlzIHNlbGVjdGVkICovCisKKwlzd2l0Y2ggKGJsb2NrX3NlbGVjdGVkKXsKKwljYXNlIDA6CisJCS8qIFRETSBibG9jayBzZWxlY3RlZCAoU2lMYWJzIHNpMzIyNykgKi8KKwkJd3JpdGVsKFRETV9DVExSX1JFU0VUX0JZUEFTUywgVERNX0NMS19DTlRSTCk7ICAgIC8qIGJ5cGFzcyBURE0gZGl2aWRlciAtLT4gVERNID0gTlRHIG91dCwga2VlbiBaRFMvTVNJRiBTbGljIHJlc2V0ICovCisJCXdyaXRlbCgoMHgwIDw8IDQpIHwocmVhZGwoQ09NQ0VSVE9fR1BJT19NSVNDX1BJTl9TRUxFQ1QpICYgfigweDMgPDwgNCkpLCBDT01DRVJUT19HUElPX01JU0NfUElOX1NFTEVDVCk7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQkvKiBaRFMgYmxvY2sgc2VsZWN0ZWQgKFphcmxpbmsgbGU4ODI2NCkgKi8KKwkJd3JpdGVsKFRETV9DVFJMX1NMSUNfUkVTRVQgfCBDT01DRVJUT19CTE9DS19aRFNfRElWLCBURE1fQ0xLX0NOVFJMKTsgLyogVERNID0gTlRHIG91dCAvIDI0Ki8KKwkJd3JpdGVsKCgweDEgPDwgNCkgfChyZWFkbChDT01DRVJUT19HUElPX01JU0NfUElOX1NFTEVDVCkgJiB+KDB4MyA8PCA0KSksIENPTUNFUlRPX0dQSU9fTUlTQ19QSU5fU0VMRUNUKTsKKwkJd3JpdGVsKENPTUNFUlRPX0JMT0NLX1pEU19ESVYsIFRETV9DTEtfQ05UUkwpOyAvKiBSZW1vdmUgb3V0IG9mIHJlc2V0ICovCisJCWJyZWFrOworCisJY2FzZSAyOgorCQkvKiBHUElPWzYzOjYwXSBzaWduYWxzIHNlbGVjdGVkICovCisJCXdyaXRlbChURE1fQ1RMUl9SRVNFVF9CWVBBU1MsIFRETV9DTEtfQ05UUkwpOyAvKiBieXBhc3MgVERNIGRpdmlkZXIgLS0+IFRETSA9IE5URyBvdXQsIGtlZW4gWkRTL01TSUYgU2xpYyByZXNldCAqLworCQl3cml0ZWwoKDB4MiA8PCA0KSB8KHJlYWRsKENPTUNFUlRPX0dQSU9fTUlTQ19QSU5fU0VMRUNUKSAmIH4oMHgzIDw8IDQpKSwgQ09NQ0VSVE9fR1BJT19NSVNDX1BJTl9TRUxFQ1QpOworCQlicmVhazsKKworCWNhc2UgMzoKKwkJLyogTVNJRiBibG9jayBzZWxlY3RlZCAoU2lMYWJzIHNpMzIyNjgpICovCisJCXdyaXRlbChURE1fQ1RSTF9TTElDX1JFU0VUIHwgQ09NQ0VSVE9fQkxPQ0tfTVNJRl9ESVYsIFRETV9DTEtfQ05UUkwpOyAvKiBURE0gPSBOVEcgb3V0IC8gMTIgKi8KKwkJd3JpdGVsKCgweDMgPDwgNCkgfChyZWFkbChDT01DRVJUT19HUElPX01JU0NfUElOX1NFTEVDVCkgJiB+KDB4MyA8PCA0KSksIENPTUNFUlRPX0dQSU9fTUlTQ19QSU5fU0VMRUNUKTsKKwkJd3JpdGVsKENPTUNFUlRPX0JMT0NLX01TSUZfRElWLCBURE1fQ0xLX0NOVFJMKTsgLyogUmVtb3ZlIG91dCBvZiByZXNldCAqLworCisJCS8qIERlbGF5IDEwMHVzIGFmdGVyIEMyayBURE0gYmxvY2sgaGFzIGJlZW4gdW4tcmVzZXQsIGJlZm9yZSBTTElDIGlzIHVuLXJlc2V0LgorCQkgICBFbnN1cmVzIE1TSUYgaW50ZXJmYWNlIGNsb2NrIGlzIGFjdGl2ZSB3ZWxsIGJlZm9yZSBTTElDIGlzIHVuLXJlc2V0IChTaUxhYnMgc3BlYykuIAorCQkqLworCQl1ZGVsYXkoMTAwKTsKKworCQl3cml0ZWwoMHgxIDw8IDMwLCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpOyAvKiByZW1vdmUgc2xpYyBvdXQgb2YgcmVzZXQgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmtub3duIFRETSBNVVggdmFsdWVcbiIsIF9fZnVuY19fKTsKKwl9Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCB0ZG1fZHJfc2V0KHUzMiB0ZG1kcikKK3sKKwlpZih0ZG1kciA+IDB4M0YpCisJeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBURE1fRFIgdmFsdWUgaXMgb3V0IG9mIHJhbmdlICUjeCA+CTB4M0ZcbiIsIAlfX2Z1bmNfXywgdGRtZHIpOworCQlyZXR1cm47CisJfQorCisJd3JpdGVsKCh0ZG1kciA8PCAyNCkgfChyZWFkbChDT01DRVJUT19HUElPX1BBRF9DT05GSUcwKSAmIH4oMHgzRiA8PCAyNCkpLCBDT01DRVJUT19HUElPX1BBRF9DT05GSUcwKTsKK30KKworc3RhdGljIHZvaWQgdGRtX2R4X3NldCh1MzIgdGRtZHgpCit7CisJaWYodGRtZHggPiAweDNGKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVERNX0RYIHZhbHVlIGlzIG91dCBvZiByYW5nZSAlI3ggPiAweDNGXG4iLCBfX2Z1bmNfXywgdGRtZHgpOworCQlyZXR1cm47CisJfQorCisJd3JpdGVsKCh0ZG1keCA8PCAxOCkgfChyZWFkbChDT01DRVJUT19HUElPX1BBRF9DT05GSUcwKSAmIH4oMHgzRiA8PCAxOCkpLCBDT01DRVJUT19HUElPX1BBRF9DT05GSUcwKTsKK30KKworc3RhdGljIHZvaWQgdGRtX2ZzX3NldCh1MzIgdGRtZnMpCit7CisJaWYodGRtZnMgPiAweDNGKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVERNX0ZTIHZhbHVlIGlzIG91dCBvZiByYW5nZSAlI3ggPiAweDNGXG4iLCBfX2Z1bmNfXywgdGRtZnMpOworCQlyZXR1cm47CisJfQorCisJd3JpdGVsKCh0ZG1mcyA8PCAxMikgfChyZWFkbChDT01DRVJUT19HUElPX1BBRF9DT05GSUcwKSAmIH4oMHgzRiA8PCAxMikpLCBDT01DRVJUT19HUElPX1BBRF9DT05GSUcwKTsKK30KKworc3RhdGljIHZvaWQgdGRtX2NrX3NldCh1MzIgdGRtY2spCit7CisJaWYodGRtY2sgPiAweDNGKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogVERNX0NLIHZhbHVlIGlzIG91dCBvZiByYW5nZSAlI3ggPiAweDNGXG4iLCBfX2Z1bmNfXywgdGRtY2spOworCQlyZXR1cm47CisJfQorCisJd3JpdGVsKCh0ZG1jayA8PCA2KSB8KHJlYWRsKENPTUNFUlRPX0dQSU9fUEFEX0NPTkZJRzApICYgfigweDNGIDw8IDYpKSwgQ09NQ0VSVE9fR1BJT19QQURfQ09ORklHMCk7Cit9CisjZW5kaWYKKworaW50IHRkbV9nZXRfYmxvY2sodW5zaWduZWQgaW50IGJsb2NrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCS8qIDB4MCAtIFRETSBibG9jaywgMHgxIC0gWkRTIGJsb2NrLCAweDIgLSBHUElPWzYzOjYwXSBzaWduYWxzIGFuZCAweDMgLSBNU0lGIGJsb2NrICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGdldCBibG9jayAlZCAoc2VsZWN0ZWQgJWQpXG4iLCBfX2Z1bmNfXywgYmxvY2ssIGJsb2NrX3NlbGVjdGVkKTsKKwlpZiAoYmxvY2sgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibG9ja19sb2NrLCBmbGFncyk7CisKKwlpZihibG9jayA9PSBibG9ja19zZWxlY3RlZCkKKwl7CisJCWJsb2NrX3NlbF9jbnQrKzsKKwl9CisJZWxzZQorCXsKKwkJaWYgKGJsb2NrX3NlbF9jbnQpCisJCXsKKwkJCXJjID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKworCQlibG9ja19zZWxfY250Kys7CisJCS8qIFNlbGVjdGVkIGJsb2NrIGdsb2JhbCB2YXJpYWJsZSB3aWxsIGJlIHVwZGF0ZWQgKi8KKwkJdGRtX211eF9zZXQoYmxvY2spOworCQkvKiBDbG9jayB0byBiZSByZWNhbGN1bGF0ZWQgYWNjb3JkaW5nbHkgdG8gc2VsZWN0ZWQgYmxvY2sgKi8KKwkJY2xvY2tfZnJlcXVlbmN5X3NldChCYXNlQ2xvY2spOworCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsb2NrX2xvY2ssZmxhZ3MpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGdldCBibG9jayByZXN1bHQgJWRcbiIsIF9fZnVuY19fLCByYyk7CisJcmV0dXJuIHJjOworfQorCit2b2lkIHRkbV9wdXRfYmxvY2sodW5zaWduZWQgaW50IGJsb2NrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsb2NrX2xvY2ssIGZsYWdzKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBwdXQgYmxvY2sgJWQgKHNlbGVjdGVkICVkLCBjbnQgJWQpXG4iLCAKKwkJX19mdW5jX18sIGJsb2NrLCBibG9ja19zZWxlY3RlZCwgYmxvY2tfc2VsX2NudCk7CisKKwlpZiAoYmxvY2sgPT0gYmxvY2tfc2VsZWN0ZWQpCisJeworCQlpZiAoYmxvY2tfc2VsX2NudCkKKwkJCWJsb2NrX3NlbF9jbnQtLTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSICIlczogYmxvY2sgaGFzbid0IHNlbGVjdGVkIHlldFxuIiwgX19mdW5jX18pOworCX0KKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEludmFsaWQgYmxvY2tcbiIsIF9fZnVuY19fKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsb2NrX2xvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgc3NpemVfdCB0ZG1fZGF0YV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaWYgKHN0cmNtcCgiZnNfcG9sYXJpdHkiLCBhdHRyLT5hdHRyLm5hbWUpID09IDApIC8qIEZTWU5DX0ZBTEwoUklTRSlfRURHRSAqLworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKHJlYWRsKFRETV9GU1lOQ19HRU5fQ1RSTCkgPj4gMSkgJiAweDEpOworCWVsc2UgaWYgKHN0cmNtcCgiZnNfbHdpZHRoIiwgYXR0ci0+YXR0ci5uYW1lKSA9PSAwKSAvKiBMb3dfUGhhc2VfV2lkdGggKi8KKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIChyZWFkbChURE1fRlNZTkNfTE9XKSAmIDB4M0ZGKSk7CisJZWxzZSBpZiAoc3RyY21wKCJmc19od2lkdGgiLCBhdHRyLT5hdHRyLm5hbWUpID09IDApIC8qIEhpZ2hfUGhhc2VfV2lkdGggKi8KKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXhcbiIsIChyZWFkbChURE1fRlNZTkNfSElHSCkgJiAweDNGRikpOworCWVsc2UgaWYgKHN0cmNtcCgiZnNfb3V0cHV0IiwgYXR0ci0+YXR0ci5uYW1lKSA9PSAwKSAvKiBHZW5lcmljIFBhZCBDb250cm9sIGFuZCBWZXJzaW9uIElEIFJlZ2lzdGVyWzJdICovCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZWFkbChDT01DRVJUT19HUElPX1RETV9NVVgpICYgMHgxKTsKKwllbHNlIGlmIChzdHJjbXAoImNsb2NrX3BwbXNoaWZ0IiwgYXR0ci0+YXR0ci5uYW1lKSA9PSAwKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGNsb2NrX3BwbV9nZXQoKSk7CisJZWxzZSBpZiAoc3RyY21wKCJjbG9ja19vdXRwdXQiLCBhdHRyLT5hdHRyLm5hbWUpID09IDApCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAocmVhZGwoQ09NQ0VSVE9fR1BJT19TWVNURU1fQ09ORklHKQk+PiAzKSAmIDB4MSk7CisJZWxzZSBpZiAoc3RyY21wKCJjbG9ja19oeiIsIGF0dHItPmF0dHIubmFtZSkgPT0gMCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBjbG9ja19mcmVxdWVuY3lfZ2V0KCkpOworCWVsc2UgaWYgKHN0cmNtcCgidGRtX211eCIsIGF0dHItPmF0dHIubmFtZSkgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIChyZWFkbChDT01DRVJUT19HUElPX01JU0NfUElOX1NFTEVDVCkgPj4gNCkgJiAweDMpOworCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVua25vd24gZmlsZSBhdHRyaWJ1dGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KK30KKworc3RhdGljIHNzaXplX3QgdGRtX2RhdGFfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyB0ZG1fZGF0YSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisKKwlpZiAoc3RyY21wKCJmc19wb2xhcml0eSIsIGF0dHItPmF0dHIubmFtZSkgPT0gMCkKKwkJZnN5bmNfcG9sYXJpdHlfc2V0KHRkbV9kYXRhKTsKKwllbHNlIGlmIChzdHJjbXAoImZzX2x3aWR0aCIsIGF0dHItPmF0dHIubmFtZSkgPT0gMCkKKwkJZnN5bmNfbHBoYXNlX3NldCh0ZG1fZGF0YSk7CisJZWxzZSBpZiAoc3RyY21wKCJmc19od2lkdGgiLCBhdHRyLT5hdHRyLm5hbWUpID09IDApCisJCWZzeW5jX2hwaGFzZV9zZXQodGRtX2RhdGEpOworCWVsc2UgaWYgKHN0cmNtcCgiZnNfb3V0cHV0IiwgYXR0ci0+YXR0ci5uYW1lKSA9PSAwKQorCQlmc3luY19vdXRwdXRfc2V0KHRkbV9kYXRhKTsKKwllbHNlIGlmIChzdHJjbXAoImNsb2NrX2h6IiwgYXR0ci0+YXR0ci5uYW1lKSA9PSAwKQorCQljbG9ja19mcmVxdWVuY3lfc2V0KHRkbV9kYXRhKTsKKwllbHNlIGlmIChzdHJjbXAoImNsb2NrX291dHB1dCIsIGF0dHItPmF0dHIubmFtZSkgPT0gMCkKKwkJY2xvY2tfb3V0cHV0X3NldCh0ZG1fZGF0YSk7CisJZWxzZSBpZiAoc3RyY21wKCJjbG9ja19wcG1zaGlmdCIsIGF0dHItPmF0dHIubmFtZSkgPT0gMCkKKwkJY2xvY2tfcHBtX2FkanVzdChzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMCkpOworCWVsc2UgaWYgKHN0cmNtcCgidGRtX211eCIsIGF0dHItPmF0dHIubmFtZSkgPT0gMCkgeworCQlpZiAodGRtX2RhdGEgIT0gYmxvY2tfc2VsZWN0ZWQpCisJCXsKKwkJCXRkbV9wdXRfYmxvY2soYmxvY2tfc2VsZWN0ZWQpOworCQkJdGRtX2dldF9ibG9jayh0ZG1fZGF0YSk7CisJCX0KKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFRETSBibG9jayAlZCBpcyBhbHJlYWR5IHNlbGVjdGVkXG4iLCBfX2Z1bmNfXywgYmxvY2tfc2VsZWN0ZWQpOworCX0KKwllbHNlCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVua25vd24gZmlsZSBhdHRyaWJ1dGUgXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBmc291dHB1dF9hdHRyID0gX19BVFRSKGZzX291dHB1dCwgMDY0NCwgdGRtX2RhdGFfcmVhZCwgdGRtX2RhdGFfd3JpdGUpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGZzcG9sYXJpdHlfYXR0ciA9IF9fQVRUUihmc19wb2xhcml0eSwgMDY0NCwgdGRtX2RhdGFfcmVhZCwgdGRtX2RhdGFfd3JpdGUpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGZzaHdpZHRoX2F0dHIgPSBfX0FUVFIoZnNfaHdpZHRoLCAwNjQ0LCB0ZG1fZGF0YV9yZWFkLCB0ZG1fZGF0YV93cml0ZSk7CitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZnNsd2lkdGhfYXR0ciA9IF9fQVRUUihmc19sd2lkdGgsIDA2NDQsIHRkbV9kYXRhX3JlYWQsIHRkbV9kYXRhX3dyaXRlKTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBjbG9ja2h6X2F0dHIgPSBfX0FUVFIoY2xvY2tfaHosIDA2NDQsIHRkbV9kYXRhX3JlYWQsIHRkbV9kYXRhX3dyaXRlKTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBjbG9ja291dF9hdHRyID0gX19BVFRSKGNsb2NrX291dHB1dCwgMDY0NCwgdGRtX2RhdGFfcmVhZCwgdGRtX2RhdGFfd3JpdGUpOworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGNsb2NrcHBtX2F0dHIgPSBfX0FUVFIoY2xvY2tfcHBtc2hpZnQsIDA2NDQsIHRkbV9kYXRhX3JlYWQsIHRkbV9kYXRhX3dyaXRlKTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB0ZG1tdXhfYXR0ciA9IF9fQVRUUih0ZG1fbXV4LCAwNjQ0LCB0ZG1fZGF0YV9yZWFkLCB0ZG1fZGF0YV93cml0ZSk7CisKK3N0YXRpYyBpbnQgY29tY2VydG9fdGRtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNvbWNlcnRvX3RkbV9kYXRhICpwZGF0YSA9IChzdHJ1Y3QgY29tY2VydG9fdGRtX2RhdGEgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwkKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pbml0KCZibG9ja19sb2NrKTsKKwkKKwkvKiBHZXQgdGhlIHJlZmVyZW5jZSB0byBudGdyZWYgY2xvY2sgc3RydWN0dXJlKi8KKwljbGtfbnRnX3JlZiA9IGNsa19nZXQoTlVMTCwibnRncmVmIik7CisJCisJLyogRXJyb3IgSGFuZGxpbmcgLCBpZiBubyBudGdyZWYgY2xvY2sgcmVmZXJlbmNlOiByZXR1cm4gZXJyb3IgKi8KKwlpZiAoSVNfRVJSKGNsa19udGdfcmVmKSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gb2J0YWluIG50Z3JlZiBjbG9jazogJWxkXG4iLF9fZnVuY19fLFBUUl9FUlIoY2xrX250Z19yZWYpKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2xrX250Z19yZWYpOworCX0KKworCS8qIFRha2UgVERNIE5URyBvdXQgb2YgcmVzZXQqLworCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9URE1OVEcsMCk7CisKKwkvKkVuYWJsZSB0aGUgVERNTlRHX1JFRiAgY2xvY2sqLyAKKyAgICAgICAgcmV0ID0gY2xrX2VuYWJsZShjbGtfbnRnX3JlZik7CisJCisJaWYgKHJldCl7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBlbmFibGUgbnRncmVmIGNsb2NrIFxuIixfX2Z1bmNfXyk7IAorCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFNldCB0aGUgcmF0ZSB2YWx1ZSB0byA1MDAwMDAwMDAgSHogZm9yIHRoZSByZWYgY2xvY2sgKi8gCisJY2xrX3NldF9yYXRlKGNsa19udGdfcmVmLFRETU5UR19ERUZBVUxUX1JFRl9DTEspOworCisgCS8qSW5pdGlhbGl6ZSB0aGUgdGRtbnRncmVmIGNsb2NrIHJhdGUgdmFsdWUgKi8gCQorCXRkbW50Z19yZWZfY2xrID0gY2xrX2dldF9yYXRlKGNsa19udGdfcmVmKTsKKworCXdyaXRlbCgoTlRHX0RJVl9SU1RfTiB8IE5UR19FTiksIFRETV9OVEdfQ0xLX0NUUkwpOworCisJLyogSW5pdGFsIGNvbmZpZ3VyYXRpb24gb2YgdGRtIGJ1cyAqLworCXRkbV9tdXhfc2V0KHBkYXRhLT50ZG1tdXgpOworCWZzeW5jX3BvbGFyaXR5X3NldChwZGF0YS0+ZnNwb2xhcml0eSk7CisJZnN5bmNfbHBoYXNlX3NldChwZGF0YS0+ZnNsd2lkdGgpOworCWZzeW5jX2hwaGFzZV9zZXQocGRhdGEtPmZzaHdpZHRoKTsKKwljbG9ja19mcmVxdWVuY3lfc2V0KHBkYXRhLT5jbG9ja2h6KTsKKwljbG9ja19vdXRwdXRfc2V0KHBkYXRhLT5jbG9ja291dCk7CisJZnN5bmNfb3V0cHV0X3NldChwZGF0YS0+ZnNvdXRwdXQpOworCisjaWYgMCAvLyBUaGUgZGVmYXVsdCBwYXJhbXRlcnMgYXJlIGdvb2QKKwl0ZG1fZHJfc2V0KHBkYXRhLT50ZG1kcik7CisJdGRtX2R4X3NldChwZGF0YS0+dGRtZHgpOworCXRkbV9mc19zZXQocGRhdGEtPnRkbWZzKTsKKwl0ZG1fY2tfc2V0KHBkYXRhLT50ZG1jayk7CisjZW5kaWYKKworCS8qIENyZWF0aW5nIHN5c2ZzIGZpbGVzICovCisJcmV0IHw9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZnNvdXRwdXRfYXR0cik7CisJcmV0IHw9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZnNwb2xhcml0eV9hdHRyKTsKKwlyZXQgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZmc2h3aWR0aF9hdHRyKTsKKwlyZXQgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZmc2x3aWR0aF9hdHRyKTsKKwlyZXQgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZjbG9ja2h6X2F0dHIpOworCXJldCB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmNsb2Nrb3V0X2F0dHIpOworCXJldCB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmNsb2NrcHBtX2F0dHIpOworCXJldCB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJnRkbW11eF9hdHRyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29tY2VydG9fdGRtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCS8qIERpc2FibGUgdGhlIFRETU5UR19SRUZjbG9jayAqLworCWNsa19kaXNhYmxlKGNsa19udGdfcmVmKTsKKwljbGtfcHV0KGNsa19udGdfcmVmKTsKKwkKKwkvKiBQdXV0aW5nIFRETU5URyBpcyByZXNldCBtb2RlICovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1RETU5URywxKTsKKworCS8qIFJlbW92ZSB0aGUgRGV2aWNlICBGaWxlICAqLworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZnNvdXRwdXRfYXR0cik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmc3BvbGFyaXR5X2F0dHIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZnNod2lkdGhfYXR0cik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZmc2x3aWR0aF9hdHRyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmNsb2NraHpfYXR0cik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZjbG9ja291dF9hdHRyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmNsb2NrcHBtX2F0dHIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmdGRtbXV4X2F0dHIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFN0cnVjdHVyZSBmb3IgYSBkZXZpY2UgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjb21jZXJ0b190ZG1fZHJpdmVyID0geworCS5wcm9iZSA9IGNvbWNlcnRvX3RkbV9wcm9iZSwKKwkucmVtb3ZlID0gY29tY2VydG9fdGRtX3JlbW92ZSwKKwkuZHJpdmVyCT0geworCQkubmFtZSA9ICJjb21jZXJ0by10ZG0iLAorCX0sCit9OworCitzdGF0aWMgaW50ICBjb21jZXJ0b190ZG1faW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjb21jZXJ0b190ZG1fZHJpdmVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkICBjb21jZXJ0b190ZG1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjb21jZXJ0b190ZG1fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY29tY2VydG9fdGRtX2luaXQpOworbW9kdWxlX2V4aXQoY29tY2VydG9fdGRtX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWNlcnRvIFRETSBEcml2ZXIiKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWNvbWNlcnRvL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWUzOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by90aW1lLmMKQEAgLTAsMCArMSw2MDMgQEAKKy8qCisgKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jb21jZXJ0by90aW1lLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEyIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vc21wX3R3ZC5oPgorI2luY2x1ZGUgPGFzbS9zY2hlZF9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9sb2NhbHRpbWVyLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvY2xvY2suaD4KKworLyogS2VybmVsIG5lZWRzIGEgdGltZXIgY2FkZW5jZWQgdG8gMTBtcyAqLworI2RlZmluZSBDT01DRVJUT19LRVJORUxfVElNRVJfVkFMVUUJKENPTUNFUlRPX0FIQkNMSyAvIEhaKQorI2RlZmluZSBtYWNoaW5lY3ljbGVzX3RvX3VzZWNzKHRpY2tzKSAoKCh0aWNrcykgKiAxMCkvIChDT01DRVJUT19BSEJDTEsvMTAwMDAwKSkKKworLyoKKyAqIEhBUkRXQVJFIFRJTUVSCisgKiBDYW4gYmUgdXNlIGJ5IGFueSBkcml2ZXIgZm9yIGl0cyBvd24gbmVlZAorICovCisKKyNkZWZpbmUgQ09NQ0VSVE9fVElNRVJfREVCVUcJMQorI2RlZmluZSBUSU1FUl9TVEFUVVNfRU5BQkxFRAkoMSA8PCAwKQorI2RlZmluZSBUSU1FUl9TVEFUVVNfRlJFRQkoMSA8PCAxKQorI2RlZmluZSBDT01DRVJUT19NQVhfVElNRVJTCTYKKworLyoKKyAqIEhBUkRXQVJFIFRJTUVSCisgKiBDYW4gYmUgdXNlIGJ5IGFueSBkcml2ZXIgZm9yIGl0cyBvd24gbmVlZAorICovCisKKy8qIExpc3Qgb2YgYXZhaWxhYmxlIHRpbWVycyAqLworc3RydWN0IHRpbWVyX2h3IHsKKwl1OCBpZDsKKwl1OCBzdGF0dXM7CisJc3RydWN0IGNvbWNlcnRvX3RpbWVyICp0OworfTsKK3N0cnVjdCB0aW1lcl9odyB0aW1lcl9odyBbQ09NQ0VSVE9fTUFYX1RJTUVSU10gPSB7CisJezAsIDAsIE5VTEx9LCAvKiAgTVNQIHRpbWVyICAgICovCisJezEsIDAsIE5VTEx9LCAvKiAgQ2xvY2sgZXZlbnQgICovCisJezIsIDAsIE5VTEx9LCAvKiAgQ0xvY2sgc291cmNlICsgU2NoZWQgY2xvY2sgKi8KKwl7MywgVElNRVJfU1RBVFVTX0ZSRUUsIE5VTEx9LAorCXs0LCBUSU1FUl9TVEFUVVNfRlJFRSwgTlVMTH0sCisJezUsIFRJTUVSX1NUQVRVU19GUkVFLCBOVUxMfQorfTsKKworc3RhdGljIHNwaW5sb2NrX3QgY29tY2VydG9fdGltZXJfbG9jazsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgQ09NQ0VSVE9fQUhCQ0xLOworCitzdGF0aWMgdm9pZCBjb21jZXJ0b190aW1lcl9kaXNhYmxlKGludCB0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29tY2VydG9fdGltZXJfbG9jaywgZmxhZ3MpOworCV9fY29tY2VydG9fdGltZXJfZGlzYWJsZSh0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21jZXJ0b190aW1lcl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fY29tY2VydG9fdGltZXJfZ2V0KGludCBpZCkKK3sKKwlpZiAoaWQgPT0gMSkKKwl7CisJCXJldHVybiBjb21jZXJ0b190aW1lcjFfZ2V0KCk7CisJfQorCWVsc2UgaWYgKGlkID09IDIpCisJeworCQlyZXR1cm4gY29tY2VydG9fdGltZXIyX2dldCgpOworCX0KKwllbHNlIGlmIChpZCA9PSAzKQorCXsKKwkJcmV0dXJuIGNvbWNlcnRvX3RpbWVyM19nZXQoKTsKKwl9CisJZWxzZSBpZiAoaWQgPT0gNCkKKwl7CisJCXJldHVybiBjb21jZXJ0b190aW1lcjRfZ2V0KCk7CisJfQorCWVsc2UgaWYgKGlkID09IDUpCisJeworCQlyZXR1cm4gY29tY2VydG9fdGltZXI1X2dldCgpOworCX0KKwllbHNlCisJCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2NvbWNlcnRvX3RpbWVyX3NldChpbnQgaWQsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJaWYgKGlkID09IDEpCisJeworCQljb21jZXJ0b190aW1lcjFfc2V0KGNvdW50KTsKKwl9CisJZWxzZSBpZiAoaWQgPT0gMikKKwl7CisJCWNvbWNlcnRvX3RpbWVyMl9zZXQoMCwgY291bnQsIDApOworCX0KKwllbHNlIGlmIChpZCA9PSAzKQorCXsKKwkJY29tY2VydG9fdGltZXIzX3NldCgwLCBjb3VudCwgMCk7CisJfQorCWVsc2UgaWYgKGlkID09IDQpCisJeworCQljb21jZXJ0b190aW1lcjRfc2V0KGNvdW50KTsKKwl9CisJZWxzZSBpZiAoaWQgPT0gNSkKKwl7CisJCWNvbWNlcnRvX3RpbWVyNV9zZXQoMCwgY291bnQsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgX190aW1lcl9zdGFydChzdHJ1Y3QgdGltZXJfaHcgKnRodywgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl0aHctPnN0YXR1cyB8PSBUSU1FUl9TVEFUVVNfRU5BQkxFRDsKKworCV9fY29tY2VydG9fdGltZXJfc2V0KHRody0+aWQsIGNvdW50KTsKKworCV9fY29tY2VydG9fdGltZXJfZW5hYmxlKHRody0+aWQpOworfQorCitzdGF0aWMgdm9pZCB0aW1lcl9zdGFydChzdHJ1Y3QgdGltZXJfaHcgKnRodywgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbWNlcnRvX3RpbWVyX2xvY2ssIGZsYWdzKTsKKwlfX3RpbWVyX3N0YXJ0KHRodywgY291bnQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbWNlcnRvX3RpbWVyX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgX190aW1lcl9zdG9wKHN0cnVjdCB0aW1lcl9odyAqdGh3KQoreworCV9fY29tY2VydG9fdGltZXJfZGlzYWJsZSh0aHctPmlkKTsKKwl0aHctPnN0YXR1cyAmPSB+IFRJTUVSX1NUQVRVU19FTkFCTEVEOworfQorCitzdGF0aWMgdm9pZCB0aW1lcl9zdG9wKHN0cnVjdCB0aW1lcl9odyAqdGh3KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29tY2VydG9fdGltZXJfbG9jaywgZmxhZ3MpOworCV9fdGltZXJfc3RvcCh0aHcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbWNlcnRvX3RpbWVyX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgX190aW1lcl9mcmVlKHN0cnVjdCB0aW1lcl9odyAqdGh3KQoreworCXRody0+c3RhdHVzIHw9IFRJTUVSX1NUQVRVU19GUkVFOworCXRody0+dC0+dGh3ID0gKHVuc2lnbmVkIGxvbmcpIE5VTEw7CisJdGh3LT50ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdGltZXJfZnJlZShzdHJ1Y3QgdGltZXJfaHcgKnRodykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbWNlcnRvX3RpbWVyX2xvY2ssIGZsYWdzKTsKKwlfX3RpbWVyX2ZyZWUodGh3KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21jZXJ0b190aW1lcl9sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHN0cnVjdCB0aW1lcl9odyAqX190aW1lcl9hbGxvYyhzdHJ1Y3QgY29tY2VydG9fdGltZXIgKnQpCit7CisJc3RydWN0IHRpbWVyX2h3ICp0aHc7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09NQ0VSVE9fTUFYX1RJTUVSUzsgaSsrKQorCXsKKwkJdGh3ID0gJnRpbWVyX2h3W2ldOworCQlpZiAodGh3LT5zdGF0dXMgJiBUSU1FUl9TVEFUVVNfRlJFRSkKKwkJeworCQkJdGh3LT5zdGF0dXMgJj0gfiBUSU1FUl9TVEFUVVNfRlJFRTsKKwkJCXQtPnRodyA9ICh1bnNpZ25lZCBsb25nKSB0aHc7CisJCQl0aHctPnQgPSB0OworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworZm91bmQ6CisJcmV0dXJuIHRodzsKK30KKworc3RhdGljIHN0cnVjdCB0aW1lcl9odyAqdGltZXJfYWxsb2Moc3RydWN0IGNvbWNlcnRvX3RpbWVyICp0KQoreworCXN0cnVjdCB0aW1lcl9odyAqdGh3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29tY2VydG9fdGltZXJfbG9jaywgZmxhZ3MpOworCXRodyA9IF9fdGltZXJfYWxsb2ModCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tY2VydG9fdGltZXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHRodzsKK30KKworaW50IGNvbWNlcnRvX3RpbWVyX3N0YXJ0KHN0cnVjdCBjb21jZXJ0b190aW1lciAqdCkKK3sKKwlzdHJ1Y3QgdGltZXJfaHcgKnRodzsKKworCXRodyA9IChzdHJ1Y3QgdGltZXJfaHcgKikgdC0+dGh3OworCWlmICghdGh3KSB7CisJCXRodyA9IHRpbWVyX2FsbG9jKHQpOworCQlpZiAoIXRodykgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiQ29tY2VydG8gdGltZXI6IHVuYWJsZSB0byBhbGxvY2F0ZSBoYXJkd2FyZSB0aW1lclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKyNpZmRlZiBDT01DRVJUT19USU1FUl9ERUJVRworCWlmICh0aHctPnQgIT0gdCkgeworCQlwcmludGsgKEtFUk5fRVJSICJDb21jZXJ0byB0aW1lcjogdGltZXIgY29ycnVwdGlvbiAlI2x4ICUjbHggJSNseFxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpIHRodywgKHVuc2lnbmVkIGxvbmcpIHRody0+dCwgKHVuc2lnbmVkIGxvbmcpIHQpOworCisJCWdvdG8gZXJyOworCX0KKyNlbmRpZiAvKiBDT01DRVJUT19USU1FUl9ERUJVRyAqLworCisJLyogdGltZW91dCBpbiB1cyAqLworCXRpbWVyX3N0YXJ0KHRodywgKHQtPnRpbWVvdXQgKiAoQ09NQ0VSVE9fQUhCQ0xLIC8gMTAwMDAwKSkgLyAxMCk7CisKKwlyZXR1cm4gMDsKKworICBlcnI6CisJcmV0dXJuIC0xOworfQorCitpbnQgY29tY2VydG9fdGltZXJfc3RvcChzdHJ1Y3QgY29tY2VydG9fdGltZXIgKnQpCit7CisJc3RydWN0IHRpbWVyX2h3ICp0aHc7CisKKwl0aHcgPSAoc3RydWN0IHRpbWVyX2h3ICopIHQtPnRodzsKKwlpZiAoIXRodykKKwkJZ290byBlcnI7CisKKyNpZmRlZiBDT01DRVJUT19USU1FUl9ERUJVRworCWlmICh0aHctPnQgIT0gdCkgeworCQlwcmludGsgKEtFUk5fRVJSICJDb21jZXJ0byB0aW1lcjogdGltZXIgY29ycnVwdGlvbiAlI2x4ICUjbHggJSNseFxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpIHRodywgKHVuc2lnbmVkIGxvbmcpIHRody0+dCwgKHVuc2lnbmVkIGxvbmcpIHQpOworCisJCWdvdG8gZXJyOworCX0KKyNlbmRpZiAvKiBDT01DRVJUT19USU1FUl9ERUJVRyAqLworCisJdGltZXJfc3RvcCh0aHcpOworCXRpbWVyX2ZyZWUodGh3KTsKKworCXJldHVybiAwOworCisgIGVycjoKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBjb21jZXJ0b190aW1lcl9yZWFkKHN0cnVjdCBjb21jZXJ0b190aW1lciAqdCkKK3sKKwlzdHJ1Y3QgdGltZXJfaHcgKnRodzsKKworCXRodyA9IChzdHJ1Y3QgdGltZXJfaHcgKikgdC0+dGh3OworCWlmICghdGh3KQorCQlnb3RvIGVycjsKKworI2lmZGVmIENPTUNFUlRPX1RJTUVSX0RFQlVHCisJaWYgKHRody0+dCAhPSB0KSB7CisJCXByaW50ayAoS0VSTl9FUlIgIkNvbWNlcnRvIHRpbWVyOiB0aW1lciBjb3JydXB0aW9uICUjbHggJSNseCAlI2x4XG4iLAorCQkJCQkodW5zaWduZWQgbG9uZykgdGh3LCAodW5zaWduZWQgbG9uZykgdGh3LT50LCAodW5zaWduZWQgbG9uZykgdCk7CisKKwkJZ290byBlcnI7CisJfQorI2VuZGlmIC8qIENPTUNFUlRPX1RJTUVSX0RFQlVHICovCisKKwlyZXR1cm4gKChfX2NvbWNlcnRvX3RpbWVyX2dldCh0aHctPmlkKSAqIDEwKSAvIChDT01DRVJUT19BSEJDTEsgLyAxMDAwMDApKTsKKworICBlcnI6CisJcmV0dXJuIC0xOworfQorCitFWFBPUlRfU1lNQk9MKGNvbWNlcnRvX3RpbWVyX3N0YXJ0KTsKK0VYUE9SVF9TWU1CT0woY29tY2VydG9fdGltZXJfc3RvcCk7CitFWFBPUlRfU1lNQk9MKGNvbWNlcnRvX3RpbWVyX3JlYWQpOworCitpbnQgdGltZXJfaHdfaGFuZGxlcih1OCBpZCkKK3sKKwlzdHJ1Y3QgdGltZXJfaHcgKnRodzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdGh3ID0gJnRpbWVyX2h3W2lkXTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb21jZXJ0b190aW1lcl9sb2NrLCBmbGFncyk7CisKKwlpZiAodGh3LT5zdGF0dXMgJiBUSU1FUl9TVEFUVVNfRU5BQkxFRCkgeworCisJCXN0cnVjdCBjb21jZXJ0b190aW1lciAqdCA9IHRody0+dDsKKworCQlpZiAodC0+ZmxhZ3MgJiBDT01DRVJUT19USU1FUl9SVU5fT05DRSkgeworCQkJX190aW1lcl9zdG9wKHRodyk7CisJCQlfX3RpbWVyX2ZyZWUodGh3KTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbWNlcnRvX3RpbWVyX2xvY2ssIGZsYWdzKTsKKworCQl0LT5mdW5jKHQtPmRhdGEpOworCisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tY2VydG9fdGltZXJfbG9jaywgZmxhZ3MpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKworICBlcnI6CisJcmV0dXJuIC0xOworfQorCisKK3N0cnVjdCBjb21jZXJ0b19jbG9ja19kZXZpY2UKK3sKKwlpbnQgdGltZXI7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBkZXZpY2U7Cit9OworCisvKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4gV2UgbmVlZCB0byBzdGFydCBhcyBjbG9zZSBmcm9tIHplcm8KKyAqIGFzIHBvc3NpYmxlIC0gaWYgd2UgZG9uJ3QgY2xlYXIgY291bnRlciBiZWZvcmUgc2V0dGluZyBoaWdoIGJvdW5kIHZhbHVlIHdlJ2xsIGhhdmUgaW5uYWN1cmF0ZQorICogcmVzdWx0cyBpbiBPTkVTSE9UIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgY29tY2VydG9fY2xvY2tfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBldnQsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29tY2VydG9fY2xvY2tfZGV2aWNlICpjbG9jayA9IGNvbnRhaW5lcl9vZihkZXYsIHR5cGVvZigqY2xvY2spLCBkZXZpY2UpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29tY2VydG9fdGltZXJfbG9jaywgZmxhZ3MpOworCisJLyogbm93IHdyaXRlIGNvcnJlY3QgYm91bmQgYW5kIGNsZWFyIGludGVycnVwdCBzdGF0dXMuCisJICAgV3JpdGluZyBoaWdoIGJvdW5kIHJlZ2lzdGVyIGF1dG9tYXRpY2FsbHkgcmVzZXRzIGNvdW50IHRvIGxvdyBib3VuZCB2YWx1ZS4KKwkgICBGb3IgdmVyeSBzbWFsbCBib3VuZCB2YWx1ZXMgaXQncyBwb3NzaWJsZSB0aGF0IHdlIGFjayB0aGUgaW50ZXJydXB0IF9hZnRlcl8gdGhlIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQsCisJICAgdGhpcyBpcyBub3QgdmVyeSBzZXJpb3VzIGJlY2F1c2UgdGhlIGludGVycnVwdCB3aWxsIGJlIGFzc2VydGVkIGFnYWluIGluIGEgdmVyeSBzaG9ydCB0aW1lICovCisJX19jb21jZXJ0b190aW1lcl9zZXQoY2xvY2stPnRpbWVyLCBldnQpOworCWNvbWNlcnRvX3RpbWVyX2FjayhjbG9jay0+dGltZXIpOworCisJLyogZW5hYmxlIGludGVycnVwdCBmb3IgT05FU0hPVCBtb2RlICovCisJaWYgKGRldi0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKQorCQlfX2NvbWNlcnRvX3RpbWVyX2VuYWJsZShjbG9jay0+dGltZXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29tY2VydG9fdGltZXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX2Nsb2NrX3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNvbWNlcnRvX2Nsb2NrX2RldmljZSAqY2xvY2sgPSBjb250YWluZXJfb2YoZGV2LCB0eXBlb2YoKmNsb2NrKSwgZGV2aWNlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogVGhpcyB0aW1lciBpcyB0cnVlIFBFUklPRElDIGluIGhhcmR3YXJlLCB0byBlbXVsYXRlIE9ORVNIT1Qgd2UgbmVlZCB0byBrZWVwIGl0IG1hc2tlZAorCSAqIHVudGlsIHNldF9uZXh0X2V2ZW50KCkgY2FsbC4gRW5hYmxlIGludGVycnVwdCBvbmx5IGZvciBQRVJJT0RJQyBtb2RlLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjb21jZXJ0b190aW1lcl9sb2NrLCBmbGFncyk7CisKKwlpZiAobW9kZSAhPSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKKwkJX19jb21jZXJ0b190aW1lcl9kaXNhYmxlKGNsb2NrLT50aW1lcik7CisJZWxzZSB7CisJCV9fY29tY2VydG9fdGltZXJfc2V0KGNsb2NrLT50aW1lciwgQ09NQ0VSVE9fS0VSTkVMX1RJTUVSX1ZBTFVFKTsKKwkJX19jb21jZXJ0b190aW1lcl9lbmFibGUoY2xvY2stPnRpbWVyKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb21jZXJ0b190aW1lcl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29tY2VydG9fY2xvY2tfZGV2aWNlIGNsb2NrID0KK3sKKwkudGltZXIgID0gMSwKKwkuZGV2aWNlID0KKwl7CisJCS5uYW1lICAgICAgICAgICA9ICJ0aW1lcjEiLAorCQkuZmVhdHVyZXMgICAgICAgPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCisJCS5yYXRpbmcgICAgICAgICA9IDIwMCwKKwkJLnNoaWZ0ICAgICAgICAgID0gMzEsCisJCS5zZXRfbW9kZSAgICAgICA9IGNvbWNlcnRvX2Nsb2NrX3NldF9tb2RlLAorCQkuc2V0X25leHRfZXZlbnQgPSBjb21jZXJ0b19jbG9ja19zZXRfbmV4dF9ldmVudCwKKwl9LAorfTsKKworc3RhdGljIGN5Y2xlX3QgY29tY2VydG9fdGltZXIyX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3sKKwlyZXR1cm4gY29tY2VydG9fdGltZXIyX2dldCgpOworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlID0KK3sKKwkubmFtZQk9ICJ0aW1lcjIiLAorCS5yYXRpbmcJPSAyMDAsCisJLnJlYWQJPSBjb21jZXJ0b190aW1lcjJfcmVhZCwKKwkubWFzawk9IENMT0NLU09VUkNFX01BU0soMzIpLAorCS5zaGlmdAk9IDI4LAorCS5mbGFncwk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgS0VSTkVMIFRJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAoRnVuY3Rpb25zIGNhbGxlZCAgYnkgdGhlIGtlcm5lbCkgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgaXJxX3RvX3RpbWVyKGlycSkJKElSUV9USU1FUjAgLSBpcnEpCisjZGVmaW5lIHRpbWVyX21hc2sodGltZXIpCSgxIDw8IHRpbWVyKQorCisjaWZkZWYgQ09ORklHX0xPQ0FMX1RJTUVSUworLyoKKyAqIFNldHVwIHRoZSBsb2NhbCBjbG9jayBldmVudHMgZm9yIGEgQ1BVLgorICovCitpbnQgX19jcHVpbml0IGxvY2FsX3RpbWVyX3NldHVwKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlldnQtPmlycSA9IElSUV9MT0NBTFRJTUVSOworCXR3ZF90aW1lcl9zZXR1cChldnQpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qCisgKiBSb3V0aW5lIHRvIGNhdGNoIHRpbWVyIGludGVycnVwdHMKKyAqLworc3RhdGljIGlycXJldHVybl90IGNvbWNlcnRvX3RpbWVyMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXUzMiBzdGF0dXM7CisJc3RydWN0IGNvbWNlcnRvX2Nsb2NrX2RldmljZSAqY2xvY2sgPSBkZXZfaWQ7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gJmNsb2NrLT5kZXZpY2U7CisKKwlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT01DRVJUT19USU1FUl9TVEFUVVMpICYgX19yYXdfcmVhZGwoQ09NQ0VSVE9fVElNRVJfSVJRX01BU0spOworCisJLyogdGltZXIxIGV4cGlyZWQgKi8KKwlpZiAoc3RhdHVzICYgdGltZXJfbWFzayhjbG9jay0+dGltZXIpKSB7CisJCS8qIHdlIG5lZWQgdG8gZGlzYWJsZSBpbnRlcnJ1cHQgdG8gc2ltdWxhdGUgT05FU0hPVCBtb2RlLAorCQkgICBkbyBpdCBiZWZvcmUgY2xlYXJpbmcgdGhlIGludGVycnVwdCB0byBhdm9pZCByYWNlICovCisJCWlmIChkZXYtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpCisJCQljb21jZXJ0b190aW1lcl9kaXNhYmxlKGNsb2NrLT50aW1lcik7CisKKwkJY29tY2VydG9fdGltZXJfYWNrKGNsb2NrLT50aW1lcik7CisJCWRldi0+ZXZlbnRfaGFuZGxlcihkZXYpOworCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKK2lycXJldHVybl90IGNvbWNlcnRvX3RpbWVyTl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXUzMiBzdGF0dXM7CisJaW50IHRpbWVyID0gaXJxX3RvX3RpbWVyKGlycSk7CisKKwlzdGF0dXMgPSBfX3Jhd19yZWFkbChDT01DRVJUT19USU1FUl9TVEFUVVMpOworCWlmIChzdGF0dXMgJiB0aW1lcl9tYXNrKHRpbWVyKSkgeworCQljb21jZXJ0b190aW1lcl9hY2sodGltZXIpOworCQl0aW1lcl9od19oYW5kbGVyKHRpbWVyKTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjb21jZXJ0b190aW1lcjFfaXJxID0geworCS5uYW1lCQk9ICJ0aW1lcjEiLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiwKKwkuaGFuZGxlcgk9IGNvbWNlcnRvX3RpbWVyMV9pbnRlcnJ1cHQsCisJLmRldl9pZAkJPSAmY2xvY2ssCit9OworCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjb21jZXJ0b190aW1lcjNfaXJxID0geworCS5uYW1lCQk9ICJ0aW1lcjMiLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiwKKwkuaGFuZGxlcgk9IGNvbWNlcnRvX3RpbWVyTl9pbnRlcnJ1cHQsCit9OworCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjb21jZXJ0b190aW1lcjRfaXJxID0geworCS5uYW1lCQk9ICJ0aW1lcjQiLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiwKKwkuaGFuZGxlcgk9IGNvbWNlcnRvX3RpbWVyTl9pbnRlcnJ1cHQsCit9OworCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBjb21jZXJ0b190aW1lcjVfaXJxID0geworCS5uYW1lCQk9ICJ0aW1lcjUiLAorCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiwKKwkuaGFuZGxlcgk9IGNvbWNlcnRvX3RpbWVyTl9pbnRlcnJ1cHQsCit9OworCitzdGF0aWMgREVGSU5FX0NMT0NLX0RBVEEoY2QpOworCit1bnNpZ25lZCBsb25nIGxvbmcgbm90cmFjZSBzY2hlZF9jbG9jayh2b2lkKQoreworCXUzMiBjeWMgPSBjb21jZXJ0b190aW1lcjJfZ2V0KCk7CisKKwlyZXR1cm4gY3ljX3RvX3NjaGVkX2Nsb2NrKCZjZCwgY3ljLCAodTMyKX4wKTsKK30KKworc3RhdGljIHZvaWQgbm90cmFjZSBjb21jZXJ0b191cGRhdGVfc2NoZWRfY2xvY2sodm9pZCkKK3sKKwl1MzIgY3ljOworCisJY3ljID0gY29tY2VydG9fdGltZXIyX2dldCgpOworCisJdXBkYXRlX3NjaGVkX2Nsb2NrKCZjZCwgY3ljLCAodTMyKX4wKTsKK30KKwordm9pZCBjb21jZXJ0b19od3RpbWVyX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIERPIE5PVCBNT0RJRlkgVEhFIENPTkZJR1VSQVRJT04gT0YgVElNRVIwCisJICogSXQgaXMgdXNlZCBieSB0aGUgTVNQCisJICovCisJCisJc3RydWN0IGNsayAqY2xrX2F4aTsKKworCS8qIEluaXRpYWxpemluZyB0aGUgY2xvY2sgc3RydWN0dXJlIFRyZWUgZGVjbGFyZWQvZGVmaW5lZCBpbiBjbG9jay5jICovCisgICAgICAgIGNsa19pbml0KCk7CisKKwlzcGluX2xvY2tfaW5pdCgmY29tY2VydG9fdGltZXJfbG9jayk7CisKKwkvKiBNYXNrIGFsbCB0aGUgdGltZXJzIGV4Y2VwdCB0aW1lcjAgKi8KKwljb21jZXJ0b190aW1lcl9kaXNhYmxlKDEpOworCWNvbWNlcnRvX3RpbWVyX2Rpc2FibGUoMik7CisJY29tY2VydG9fdGltZXJfZGlzYWJsZSgzKTsKKwljb21jZXJ0b190aW1lcl9kaXNhYmxlKDQpOworCWNvbWNlcnRvX3RpbWVyX2Rpc2FibGUoNSk7CisKKwkvKiBHZXQgdGhlIEFYSSBjbG9jayAsIHRvIGJlIHVzZWQgZm9yIEFIQiBjbG9jayB2YWx1ZSovCisJY2xrX2F4aSA9IGNsa19nZXQoTlVMTCwiYXhpIik7CisJCisJaWYgKElTX0VSUihjbGtfYXhpKSl7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBvYnRhaW4gYXhpIGNsb2NrOiAlbGRcbiIsX19mdW5jX18sUFRSX0VSUihjbGtfYXhpKSk7CisJCS8qIFN5c3RlbSBjYW5ub3QgcHJvY2VlZCBmcm9tIGhlcmUgKi8KKwkJQlVHKCk7CisJfQorCisJLyogRW5hYmxlIHRoZSBBWEkgY2xvY2sgKi8KKwlpZiAoY2xrX2VuYWJsZShjbGtfYXhpKSl7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBlbmFibGUgYXhpIGNsb2NrXG4iLF9fZnVuY19fKTsKKwkJLyogU3lzdGVtIGNhbm5vdCBwcm9jZWVkIGZyb20gaGVyZSAqLworCQlCVUcoKTsKKwl9CisKKwkvKiBHZXQgdGhlIEFYSSBjbG9jayByYXRlIHZhbHVlICwgd2hpY2ggd2lsbCBhc3NpZ25lZCB0byBBSEIgY2xvY2sgdmFsdWUgKi8KKwlDT01DRVJUT19BSEJDTEsgPSBjbGtfZ2V0X3JhdGUoY2xrX2F4aSk7CQorCisJX19jb21jZXJ0b190aW1lcl9zZXQoMiwgMHhmZmZmZmZmZik7CisJY2xvY2tzb3VyY2UubXVsdCA9IGNsb2Nrc291cmNlX2h6Mm11bHQoQ09NQ0VSVE9fQUhCQ0xLLCBjbG9ja3NvdXJjZS5zaGlmdCk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlKTsKKworCWluaXRfc2NoZWRfY2xvY2soJmNkLCBjb21jZXJ0b191cGRhdGVfc2NoZWRfY2xvY2ssIDMyLCBDT01DRVJUT19BSEJDTEspOworCisJY2xvY2suZGV2aWNlLm11bHQgPSBkaXZfc2MoQ09NQ0VSVE9fQUhCQ0xLLCBOU0VDX1BFUl9TRUMsIGNsb2NrLmRldmljZS5zaGlmdCk7CisJY2xvY2suZGV2aWNlLm1heF9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHgzZmZmZmZmZiwgJmNsb2NrLmRldmljZSk7CisJY2xvY2suZGV2aWNlLm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMSwgJmNsb2NrLmRldmljZSk7CisJY2xvY2suZGV2aWNlLmNwdW1hc2sgPSBjcHVtYXNrX29mKDApOworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSgmY2xvY2suZGV2aWNlKTsKKworCS8qIENsZWFyIGFsbCB0aGUgdGltZXJzIGV4Y2VwdCB0aW1lcjAgICovCisJX19yYXdfd3JpdGVsKENPTUNFUlRPX1RJTUVSX0NTUCwgQ09NQ0VSVE9fVElNRVJfU1RBVFVTKTsKKworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyIGZvciBpbnRlcnJ1cHQgb24gSVJRX1RJTUVSQiovCisJaXJxX3NldF9pcnFfdHlwZShJUlFfVElNRVIxLCBJUlFfVFlQRV9FREdFX1JJU0lORyk7CisJaXJxX3NldF9pcnFfdHlwZShJUlFfVElNRVIzLCBJUlFfVFlQRV9FREdFX1JJU0lORyk7CisJaXJxX3NldF9pcnFfdHlwZShJUlFfVElNRVI0LCBJUlFfVFlQRV9FREdFX1JJU0lORyk7CisJaXJxX3NldF9pcnFfdHlwZShJUlFfVElNRVI1LCBJUlFfVFlQRV9FREdFX1JJU0lORyk7CisJc2V0dXBfaXJxKElSUV9USU1FUjEsICZjb21jZXJ0b190aW1lcjFfaXJxKTsKKwlzZXR1cF9pcnEoSVJRX1RJTUVSMywgJmNvbWNlcnRvX3RpbWVyM19pcnEpOworCXNldHVwX2lycShJUlFfVElNRVI0LCAmY29tY2VydG9fdGltZXI0X2lycSk7CisJc2V0dXBfaXJxKElSUV9USU1FUjUsICZjb21jZXJ0b190aW1lcjVfaXJxKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGNvbWNlcnRvX3RpbWVyX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTE9DQUxfVElNRVJTCisJdHdkX2Jhc2UgPSAodm9pZCAqKUNPTUNFUlRPX1RXRF9WQUREUjsKKyNlbmRpZgorCisJY29tY2VydG9faHd0aW1lcl9pbml0KCk7Cit9CisKK3N0cnVjdCBzeXNfdGltZXIgY29tY2VydG9fdGltZXIgPSB7CisJLmluaXQJPSBjb21jZXJ0b190aW1lcl9pbml0LAorfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vS2NvbmZpZyBiL2FyY2gvYXJtL21tL0tjb25maWcKaW5kZXggNjdmNzVhMC4uY2E5NzY0ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vS2NvbmZpZworKysgYi9hcmNoL2FybS9tbS9LY29uZmlnCkBAIC03NTMsNiArNzUzLDIwIEBACiAJICBTYXkgWSBoZXJlIHRvIHVzZSB0aGUgcHJlZGljdGFibGUgcm91bmQtcm9iaW4gY2FjaGUgcmVwbGFjZW1lbnQKIAkgIHBvbGljeS4gIFVubGVzcyB5b3Ugc3BlY2lmaWNhbGx5IHJlcXVpcmUgdGhpcyBvciBhcmUgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIENQVV9TUEVDVUxBVElWRV9BQ0NFU1NfRElTQUJMRUQKKwlib29sICJEaXNhYmxlIHNwZWN1bGF0aXZlIGFjY2Vzc2VzIgorCWRlcGVuZHMgb24gQ1BVX1Y3ICYmIEFSQ0hfQ09NQ0VSVE8KKwloZWxwCisJICBEaXNhYmxlIHNwZWN1bGF0aXZlIGFjY2Vzc2VzIGZvciB0aGUgcHJvY2Vzc29yLiBUaGlzIG1heSByZWR1Y2Ugb3ZlcmFsbCBzeXN0ZW0gbWVtb3J5IHBlcmZvcm1hbmNlIGJ1dAorCSAgY2FuIGFsbG93IG90aGVyLCBwb3RlbnRpYWxseSB1bnNhZmUsIG9wdGltaXphdGlvbnMgKHNlZSBiZWxvdykuIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDUFVfRE1BX1BBUlRJQUxfSU5WQUxJREFURVMKKwlib29sICJEbyBwYXJ0aWFsIGludmFsaWRhdGVzIGluIHRoZSBETUEgbWFuYWdlbWVudCBmdW5jdGlvbnMiCisJZGVwZW5kcyBvbiBDUFVfVjcgJiYgQVJDSF9DT01DRVJUTyAmJiBDUFVfU1BFQ1VMQVRJVkVfQUNDRVNTX0RJU0FCTEVECisJaGVscAorCSAgU2F5IFkgaGVyZSB0byByZWR1Y2UgdGhlIG92ZXJoZWFkIG9mIGNhY2hlIG1haW50ZW5hbmNlIGZvciBETUEgbWFwcGVkIG1lbW9yeSB6b25lcy4gCisJICBXQVJOSU5HOiBVTlNBRkUsIHRoaXMgbWF5IGxlYWQgdG8gcmFuZG9tIG1lbW9yeSBjb3JydXB0aW9uLiBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgQ1BVX0JQUkVESUNUX0RJU0FCTEUKIAlib29sICJEaXNhYmxlIGJyYW5jaCBwcmVkaWN0aW9uIgogCWRlcGVuZHMgb24gQ1BVX0FSTTEwMjAgfHwgQ1BVX1Y2IHx8IENQVV9WNksgfHwgQ1BVX01PSEFXSyB8fCBDUFVfWFNDMyB8fCBDUFVfVjcgfHwgQ1BVX0ZBNTI2CkBAIC04MjIsNyArODM2LDcgQEAKIAkJICAgUkVBTFZJRVdfRUJfQTlNUCB8fCBBUkNIX0lNWF9WNl9WNyB8fCBNQUNIX1JFQUxWSUVXX1BCWCB8fCBcCiAJCSAgIEFSQ0hfTk9NQURJSyB8fCBBUkNIX09NQVA0IHx8IEFSQ0hfRVhZTk9TNCB8fCBBUkNIX1RFR1JBIHx8IFwKIAkJICAgQVJDSF9VODUwMCB8fCBBUkNIX1ZFWFBSRVNTX0NBOVg0IHx8IEFSQ0hfU0hNT0JJTEUgfHwgXAotCQkgICBBUkNIX1BSSU1BMiB8fCBBUkNIX1pZTlEgfHwgQVJDSF9DTlMzWFhYIHx8IEFSQ0hfSElHSEJBTksKKwkJICAgQVJDSF9QUklNQTIgfHwgQVJDSF9aWU5RIHx8IEFSQ0hfQ05TM1hYWCB8fCBBUkNIX0hJR0hCQU5LIHx8IEFSQ0hfQ09NQ0VSVE8KIAlkZWZhdWx0IHkKIAlzZWxlY3QgT1VURVJfQ0FDSEUKIAlzZWxlY3QgT1VURVJfQ0FDSEVfU1lOQwpAQCAtODM3LDYgKzg1MSw1MSBAQAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBvcHRpbWlzYXRpb25zIGZvciB0aGUgUEwzMTAgY2FjaGUKIAkgIGNvbnRyb2xsZXIuCiAKK2NvbmZpZyBMMlgwX0lOU1RSVUNUSU9OX09OTFkKKwlib29sICJVc2UgTDIgY2FjaGUgZm9yIGluc3RydWN0aW9ucyBvbmx5IgorCWRlcGVuZHMgb24gQ0FDSEVfUEwzMTAKKwlkZWZhdWx0IG4KKworY29uZmlnIFBMMzEwX0VYQ0xVU0lWRV9DQUNIRQorCWJvb2wgIkV4Y2x1c2l2ZSBjYWNoZSIKKwlkZXBlbmRzIG9uIENBQ0hFX1BMMzEwCisJZGVmYXVsdCBuCisKK2NvbmZpZyBQTDMxMF9FQVJMWV9XUklURV9SRVNQT05TRQorCWJvb2wgIkVhcmx5IHdyaXRlIHJlc3BvbnNlIgorCWRlcGVuZHMgb24gQ0FDSEVfUEwzMTAKKwlkZWZhdWx0IG4KKworY29uZmlnIFBMMzEwX0ZVTExfTElORV9PRl9aRVJPCisJYm9vbCAiRnVsbCBsaW5lIG9mIHplcm8iCisJZGVwZW5kcyBvbiBDQUNIRV9QTDMxMAorCWRlZmF1bHQgbgorCitjb25maWcgUEwzMTBfU1RPUkVfQlVGRkVSX0RFVklDRV9MSU1JVEFUSU9OCisJYm9vbCAiU3RvcmUgYnVmZmVyIGRldmljZSBsaW1pdGF0aW9uIgorCWRlcGVuZHMgb24gQ0FDSEVfUEwzMTAKKwlkZWZhdWx0IG4KKworY29uZmlnIFBMMzEwX0lOU1RSVUNUSU9OX1BSRUZFVENICisJYm9vbCAiSW5zdHJ1Y3Rpb24gcHJlZmV0Y2giCisJZGVwZW5kcyBvbiBDQUNIRV9QTDMxMAorCWRlZmF1bHQgbgorCitjb25maWcgUEwzMTBfREFUQV9QUkVGRVRDSAorCWJvb2wgIkRhdGEgcHJlZmV0Y2giCisJZGVwZW5kcyBvbiBDQUNIRV9QTDMxMAorCWRlZmF1bHQgbgorCitjb25maWcgUEwzMTBfRE9VQkxFX0xJTkVfRklMTAorCWJvb2wgIkRvdWJsZSBsaW5lIGZpbGwiCisJZGVwZW5kcyBvbiBDQUNIRV9QTDMxMAorCWRlZmF1bHQgbgorCitjb25maWcgUEwzMTBfSU5DUl9ET1VCTEVfTElORV9GSUxMCisJYm9vbCAiSW5jcmVtZW50YWwgZG91YmxlIGxpbmUgZmlsbCIKKwlkZXBlbmRzIG9uIFBMMzEwX0RPVUJMRV9MSU5FX0ZJTEwKKwlkZWZhdWx0IG4KKwogY29uZmlnIENBQ0hFX1RBVVJPUzIKIAlib29sICJFbmFibGUgdGhlIFRhdXJvczIgTDIgY2FjaGUgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIChBUkNIX0RPVkUgfHwgQVJDSF9NTVAgfHwgQ1BVX1BKNCkKQEAgLTg2Nyw3ICs5MjYsNyBAQAogY29uZmlnIEFSTV9ETUFfTUVNX0JVRkZFUkFCTEUKIAlib29sICJVc2Ugbm9uLWNhY2hlYWJsZSBtZW1vcnkgZm9yIERNQSIgaWYgKENQVV9WNiB8fCBDUFVfVjZLKSAmJiAhQ1BVX1Y3CiAJZGVwZW5kcyBvbiAhKE1BQ0hfUkVBTFZJRVdfUEIxMTc2IHx8IFJFQUxWSUVXX0VCX0FSTTExTVAgfHwgXAotCQkgICAgIE1BQ0hfUkVBTFZJRVdfUEIxMU1QKQorCQkgICAgIE1BQ0hfUkVBTFZJRVdfUEIxMU1QIHx8IENPTUNFUlRPX0REUl9FQ0NfU1VQUE9SVCkKIAlkZWZhdWx0IHkgaWYgQ1BVX1Y2IHx8IENQVV9WNksgfHwgQ1BVX1Y3CiAJaGVscAogCSAgSGlzdG9yaWNhbGx5LCB0aGUga2VybmVsIGhhcyB1c2VkIHN0cm9uZ2x5IG9yZGVyZWQgbWFwcGluZ3MgdG8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYwppbmRleCBkYjdiY2MwLi4zZTUwNGVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMKKysrIGIvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jCkBAIC0yOTksOCArMjk5LDEwIEBACiAJCWxvY2tyZWdzID0gMTsKIAogCWZvciAoaSA9IDA7IGkgPCBsb2NrcmVnczsgaSsrKSB7CisjaWZuZGVmIENPTkZJR19MMlgwX0lOU1RSVUNUSU9OX09OTFkKIAkJd3JpdGVsX3JlbGF4ZWQoMHgwLCBsMngwX2Jhc2UgKyBMMlgwX0xPQ0tET1dOX1dBWV9EX0JBU0UgKwogCQkJICAgICAgIGkgKiBMMlgwX0xPQ0tET1dOX1NUUklERSk7CisjZW5kaWYKIAkJd3JpdGVsX3JlbGF4ZWQoMHgwLCBsMngwX2Jhc2UgKyBMMlgwX0xPQ0tET1dOX1dBWV9JX0JBU0UgKwogCQkJICAgICAgIGkgKiBMMlgwX0xPQ0tET1dOX1NUUklERSk7CiAJfQpAQCAtMzExLDYgKzMxMyw3IEBACiAJX191MzIgYXV4OwogCV9fdTMyIGNhY2hlX2lkOwogCV9fdTMyIHdheV9zaXplID0gMDsKKwlfX3UzMiBwcmVmZXRjaCA9IDA7CiAJaW50IHdheXM7CiAJY29uc3QgY2hhciAqdHlwZTsKIApAQCAtMzMwLDExICszMzMsMjMgQEAKIAkJZWxzZQogCQkJd2F5cyA9IDg7CiAJCXR5cGUgPSAiTDMxMCI7CisKICNpZmRlZiBDT05GSUdfUEwzMTBfRVJSQVRBXzc1Mzk3MAogCQkvKiBVbm1hcHBlZCByZWdpc3Rlci4gKi8KIAkJc3luY19yZWdfb2Zmc2V0ID0gTDJYMF9EVU1NWV9SRUc7CiAjZW5kaWYKIAkJb3V0ZXJfY2FjaGUuc2V0X2RlYnVnID0gcGwzMTBfc2V0X2RlYnVnOworCisJCXByZWZldGNoID0gcmVhZGxfcmVsYXhlZChsMngwX2Jhc2UgKyBMMlgwX1BSRUZFVENIX0NUUkwpOworCisjaWZkZWYgQ09ORklHX1BMMzEwX0RPVUJMRV9MSU5FX0ZJTEwKKwkJcHJlZmV0Y2ggfD0gKDEgPDwgMzApIHwgKDEgPDwgMjQpOworI2lmZGVmIENPTkZJR19QTDMxMF9JTkNSX0RPVUJMRV9MSU5FX0ZJTEwKKwkJcHJlZmV0Y2ggfD0gKDEgPDwgMjMpOworI2VuZGlmCisjZW5kaWYKKwkJd3JpdGVsX3JlbGF4ZWQocHJlZmV0Y2gsIGwyeDBfYmFzZSArIEwyWDBfUFJFRkVUQ0hfQ1RSTCk7CisKIAkJYnJlYWs7CiAJY2FzZSBMMlgwX0NBQ0hFX0lEX1BBUlRfTDIxMDoKIAkJd2F5cyA9IChhdXggPj4gMTMpICYgMHhmOwpAQCAtMzg1LDggKzQwMCw4IEBACiAJb3V0ZXJfY2FjaGUuZGlzYWJsZSA9IGwyeDBfZGlzYWJsZTsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzIGNhY2hlIGNvbnRyb2xsZXIgZW5hYmxlZFxuIiwgdHlwZSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAibDJ4MDogJWQgd2F5cywgQ0FDSEVfSUQgMHglMDh4LCBBVVhfQ1RSTCAweCUwOHgsIENhY2hlIHNpemU6ICVkIEJcbiIsCi0JCQl3YXlzLCBjYWNoZV9pZCwgYXV4LCBsMngwX3NpemUpOworCXByaW50ayhLRVJOX0lORk8gImwyeDA6ICVkIHdheXMsIENBQ0hFX0lEIDB4JTA4eCwgQVVYX0NUUkwgMHglMDh4LCBQUkVGRVRDSF9DVFJMIDB4JTA4eCwgQ2FjaGUgc2l6ZTogJWQgQlxuIiwKKwkJCXdheXMsIGNhY2hlX2lkLCBhdXgsIHByZWZldGNoLCBsMngwX3NpemUpOwogfQogCiAjaWZkZWYgQ09ORklHX09GCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9jYWNoZS12Ny5TIGIvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUwppbmRleCBhNjU1ZDNkLi4wYzkyNThlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9jYWNoZS12Ny5TCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLXY3LlMKQEAgLTIxMSw5ICsyMTEsMTYgQEAKICAqIGlzbid0IG1hcHBlZCwganVzdCB0cnkgdGhlIG5leHQgcGFnZS4KICAqLwogOTAwMToKKyNpZiAhZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQogCW1vdglyMTIsIHIxMiwgbHNyICMxMgogCW1vdglyMTIsIHIxMiwgbHNsICMxMgogCWFkZAlyMTIsIHIxMiwgIzQwOTYKKyNlbHNlCisJbW92CXIxMiwgcjEyLCBsc3IgIzE2CisJbW92CXIxMiwgcjEyLCBsc2wgIzE2CisJYWRkCXIxMiwgcjEyLCAjNjU1MzYKKworI2VuZGlmCiAJYgkzYgogIFVOV0lORCguZm5lbmQJCSkKIEVORFBST0ModjdfY29oZXJlbnRfa2Vybl9yYW5nZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMgYi9hcmNoL2FybS9tbS9jb3B5cGFnZS12Ni5jCmluZGV4IDNkOWExNTUuLjgyMDUwMDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NvcHlwYWdlLXY2LmMKKysrIGIvYXJjaC9hcm0vbW0vY29weXBhZ2UtdjYuYwpAQCAtMjAsOSArMjAsMTYgQEAKIAogI2luY2x1ZGUgIm1tLmgiCiAKKyNpZiAhZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQogI2lmIFNITUxCQSA+IDE2Mzg0CiAjZXJyb3IgRklYIE1FCiAjZW5kaWYKKyNlbHNlCisjaWYgU0hNTEJBID4gUEFHRV9TSVpFCisjZXJyb3IgRklYIE1FCisjZW5kaWYKKyNlbmRpZgorCiAKICNkZWZpbmUgZnJvbV9hZGRyZXNzCSgweGZmZmY4MDAwKQogI2RlZmluZSB0b19hZGRyZXNzCSgweGZmZmZjMDAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYyBiL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKaW5kZXggMWFhNjY0YS4uYzg5MzAxYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCkBAIC0yOCw2ICsyOCw3OCBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KIAogI2luY2x1ZGUgIm1tLmgiCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fVU5DQUNIRURfRE1BKQorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fWk9ORV9ETUFfTkNOQgorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXJtX2RtYV96b25lX3NpemU7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1VOQ0FDSEVEX0RNQSkKK3N0YXRpYyBwZ2RfdCAqc2hhZG93X3BnX2RpcjsKK3N0YXRpYyB1MTYgKnNoYWRvd19wbWRfY291bnQ7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc2hhZG93X3BhZ2VfdGFibGUodm9pZCkKK3sKKwlwbWRfdCAqcG1kLCAqc2hhZG93X3BtZDsKKwlwdGVfdCAqc2hhZG93X3B0ZSwgKnB0ZXA7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgYWRkciwgZW5kLCBwZm47CisJY29uc3Qgc3RydWN0IG1lbV90eXBlICptdDsKKwlpbnQgY291bnQ7CisKKwlzaGFkb3dfcGdfZGlyID0gKHBnZF90ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgR0ZQX0FUT01JQywgZ2V0X29yZGVyKDE2Mzg0KSk7CisJaWYgKCFzaGFkb3dfcGdfZGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzaGFkb3dfcG1kX2NvdW50ID0gKHUxNiAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IEdGUF9BVE9NSUMsIGdldF9vcmRlcihzaXplb2YodTE2KSAqIFBUUlNfUEVSX1BHRCkpOworCWlmICghc2hhZG93X3BtZF9jb3VudCkKKwkJZ290byBlcnIxOworCisJbWVtc2V0KHNoYWRvd19wZ19kaXIsIDAsIDE2Mzg0KTsKKwltZW1zZXQoc2hhZG93X3BtZF9jb3VudCwgMCwgc2l6ZW9mKHUxNikgKiBQVFJTX1BFUl9QR0QpOworCisJbXQgPSBnZXRfbWVtX3R5cGUoTVRfTUVNT1JZKTsKKwlzdGFydCA9IDA7CisJY291bnQgPSAwOworCWRvIHsKKwkJcG1kID0gcG1kX29mZl9rKCh1bnNpZ25lZCBsb25nKSBzdGFydCk7CisJCWlmICghcG1kX25vbmUoKnBtZCkpIHsKKwkJCWlmIChwbWRfYmFkKCpwbWQpICYmICgocG1kX3ZhbCgqcG1kKSAmIH5TRUNUSU9OX01BU0spID09IG10LT5wcm90X3NlY3QpKSB7ICAvLyBPbmx5IGRvIGl0IGZvciBNVF9NRU1PUlkgYXJlYXMKKwkJCQlzaGFkb3dfcG1kID0gKHBtZF90ICopc2hhZG93X3BnX2RpciArIChwbWQgLSBwbWRfb2ZmX2soMCkpOworCQkJCWFkZHIgPSAodW5zaWduZWQgbG9uZylzdGFydCAmIFBNRF9NQVNLOworCQkJCWVuZCA9IGFkZHIgKyBQTURfU0laRTsKKworCQkJCXNoYWRvd19wdGUgPSAocHRlX3QgKilfX2dldF9mcmVlX3BhZ2UoUEdBTExPQ19HRlAgfCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoIXNoYWRvd19wdGUpCisJCQkJCWdvdG8gZXJyMjsKKwkJCQlwZm4gPSBfX3BoeXNfdG9fcGZuKHBtZF92YWwoKnBtZCkgJiBQTURfTUFTSyk7CisJCQkJcHRlcCA9IHNoYWRvd19wdGU7CisJCQkJZG8geworCQkJCQlzZXRfcHRlX2V4dChwdGVwLCBwZm5fcHRlKHBmbiwgX19wZ3Byb3QobXQtPnByb3RfcHRlKSksIDApOworCQkJCQlwZm4rKzsKKwkJCQl9IHdoaWxlIChwdGVwKyssIGFkZHIgKz0gUEFHRV9TSVpFLCBhZGRyICE9IGVuZCk7CisJCQkJX19wbWRfcG9wdWxhdGUoc2hhZG93X3BtZCwgX19wYShzaGFkb3dfcHRlKSwgbXQtPnByb3RfbDEpOworCQkJfSBlbHNlIHsKKwkJCQkvLyBNYXJrIHRoZSBzaGFkb3cgaW4gdXNlLCBzbyB3ZSBuZXZlciByZXBsYWNlIHRoZSBhbHJlYWR5IGV4aXN0aW5nIDJuZC1sZXZlbAorCQkJCXNoYWRvd19wbWRfY291bnRbcGdkX2luZGV4KHN0YXJ0KV0rKzsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKGNvdW50KyssIHN0YXJ0ICs9IFBNRF9TSVpFLCBjb3VudCA8IFBUUlNfUEVSX1BHRCk7CisKKwlyZXR1cm4gMDsKKworZXJyMjoKKwlfX2ZyZWVfcGFnZXMoKHN0cnVjdCBwYWdlICopc2hhZG93X3BtZF9jb3VudCwgZ2V0X29yZGVyKHNpemVvZih1MTYpICogUFRSU19QRVJfUEdEKSk7CisJc2hhZG93X3BtZF9jb3VudCA9IE5VTEw7CisJLy9UT0RPOiBmcmVlIGFscmVhZHkgYWxsb2NhdGVkIHNoYWRvd19wdGUgdGFibGVzCitlcnIxOgorCV9fZnJlZV9wYWdlcygoc3RydWN0IHBhZ2UgKilzaGFkb3dfcGdfZGlyLCBnZXRfb3JkZXIoMTYzODQpKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KK2NvcmVfaW5pdGNhbGwoaW5pdF9zaGFkb3dfcGFnZV90YWJsZSk7CisjZW5kaWYKIAogc3RhdGljIHU2NCBnZXRfY29oZXJlbnRfZG1hX21hc2soc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMTY4LDcgKzI0MCw3IEBACiAJcHRlX3QgKnB0ZTsKIAlpbnQgaSA9IDA7CiAJdW5zaWduZWQgbG9uZyBiYXNlID0gY29uc2lzdGVudF9iYXNlOwotCXVuc2lnbmVkIGxvbmcgbnVtX3B0ZXMgPSAoQ09OU0lTVEVOVF9FTkQgLSBiYXNlKSA+PiBQTURfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBudW1fcHRlcyA9IChDT05TSVNURU5UX0VORCAtIGJhc2UgKyBQTURfU0laRSAtMSkgPj4gUE1EX1NISUZUOwogCiAJY29uc2lzdGVudF9wdGUgPSBrbWFsbG9jKG51bV9wdGVzICogc2l6ZW9mKHB0ZV90KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb25zaXN0ZW50X3B0ZSkgewpAQCAtMTk1LDggKzI2Nyw5IEBACiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJYnJlYWs7CiAJCX0KKyNpZiAhZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQogCQlXQVJOX09OKCFwbWRfbm9uZSgqcG1kKSk7Ci0KKyNlbmRpZgogCQlwdGUgPSBwdGVfYWxsb2Nfa2VybmVsKHBtZCwgYmFzZSk7CiAJCWlmICghcHRlKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyBwdGUgdGFibGVzXG4iLCBfX2Z1bmNfXyk7CkBAIC0yMDUsOCArMjc4LDggQEAKIAkJfQogCiAJCWNvbnNpc3RlbnRfcHRlW2krK10gPSBwdGU7Ci0JCWJhc2UgKz0gUE1EX1NJWkU7Ci0JfSB3aGlsZSAoYmFzZSA8IENPTlNJU1RFTlRfRU5EKTsKKwkJYmFzZSA9IChiYXNlICsgUE1EX1NJWkUpICYgUE1EX01BU0s7CisJfSB3aGlsZSAoKGJhc2UtMSkgPCAoQ09OU0lTVEVOVF9FTkQgLSAxKSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDU1LDYgKzUyOCwyMTcgQEAKIH0KIEVYUE9SVF9TWU1CT0woZG1hX2ZyZWVfY29oZXJlbnQpOwogCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fVU5DQUNIRURfRE1BKQorc3RhdGljIGlubGluZSB2b2lkIHNoYWRvd19wbWRfaW5jKGNvbnN0IHZvaWQgKmthZGRyLCBpbnQgaW5jcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrLCBmbGFncyk7CisJc2hhZG93X3BtZF9jb3VudFtwZ2RfaW5kZXgoKHVuc2lnbmVkIGxvbmcpIGthZGRyKV0gKz0gaW5jcjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9wbWRfZmFzdChwbWRfdCAqcG1kcGQsIHBtZF90ICpwbWRwcykKK3sKKyNpZiAhZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQorCXBtZHBkWzBdID0gcG1kcHNbMF07CisJcG1kcGRbMV0gPSBwbWRwc1sxXTsKKyNlbHNlCisJaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgTElOS0VEX1BNRFM7IGkrKykKKwkJcG1kcGRbaV0gPSBwbWRwc1tpXTsKKyNlbmRpZgorfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RtYWNfbWFwX2FyZWEoY29uc3Qgdm9pZCAqa2FkZHIsIHNpemVfdCBzaXplLAorCWludCBkaXIpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fVU5DQUNIRURfRE1BKQorCXBtZF90ICpwbWQsICpzaGFkb3dfcG1kOworCXB0ZV90ICpwdGU7CisJY29uc3Qgdm9pZCAqa2FkZHJfcGFnZTsKKwljb25zdCBzdHJ1Y3QgbWVtX3R5cGUgKm10OworCXVuc2lnbmVkIGludCBucl9wYWdlcywgbnJfcGFnZXNfcG1kOworCisJaWYgKCFzaGFkb3dfcG1kX2NvdW50KQorCQlnb3RvIG9wOworCisJLy8gRm9yIG5vdywgYmUgc2FmZSBhbmQgb25seSB1bmNhY2hlIGZ1bGwgcGFnZXMgc28gd2UgZG9uJ3QgaGF2ZSB0byBoYW5kbGUKKwkvLyB0aGUgY2FzZSBvZiBwYWdlcyBiZWluZyBETUEtbWFwcGVkIG11bHRpcGxlIHRpbWVzCisJaWYgKChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSAmJiAoKCgodW5zaWduZWQgbG9uZykga2FkZHJ8c2l6ZSkgJiB+UEFHRV9NQVNLKSA9PSAwKSkgeworCQltdCA9IGdldF9tZW1fdHlwZShNVF9NRU1PUllfTk9OQ0FDSEVEKTsKKwkJa2FkZHJfcGFnZSA9IGthZGRyOworCQlwbWQgPSBwbWRfb2ZmX2soKHVuc2lnbmVkIGxvbmcpIGthZGRyX3BhZ2UpOworCQlzaGFkb3dfcG1kID0gKHBtZF90ICopc2hhZG93X3BnX2RpciArIChwbWQgLSBwbWRfb2ZmX2soMCkpOworCQlucl9wYWdlcyA9IF9fcGh5c190b19wZm4oc2l6ZSk7CisKKwkJaWYgKG5yX3BhZ2VzID09IDEpIHsgLy8gT3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZQorCQkJc2hhZG93X3BtZF9pbmMoa2FkZHJfcGFnZSwgMSk7CisJCQlpZiAocG1kX2JhZCgqcG1kKSkgeyAvL05vIDJuZC1sZXZlbCBwYWdlIHRhYmxlLCByZXRyaWV2ZSBpdCBmcm9tIHRoZSBzaGFkb3dzCisJCQkJLy8gU21hbGwgcmFjZSBjb25kaXRpb24gaGVyZSwgYnV0IGF0IHdvcnN0IHdlJ2xsIGVuZCB1cCBjb3B5aW5nIHRoZSBzaGFkb3dfcG1kIHRvIHRoZSBhY3R1YWwgcG1kIHR3aWNlLgorCQkJCS8vIEZvciBub3csIG1hcCB0aGUgd2hvbGUgUE1ELiBUT0RPOiB0cnkgYW5kIG1hcCBvbmx5IDEgc2VjdGlvbiAoMU1CKS4KKwkJCQljb3B5X3BtZF9mYXN0KHBtZCwgc2hhZG93X3BtZCk7CisJCQl9CisKKwkJCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgKGludCkga2FkZHJfcGFnZSk7CisJCQl1bmNhY2hlX3B0ZV9leHQocHRlKTsKKwkJCWZsdXNoX3RsYl9rZXJuZWxfcGFnZSgodW5zaWduZWQgbG9uZykga2FkZHJfcGFnZSk7CisJCQlnb3RvIG9wOworCQl9CisKKwkJbnJfcGFnZXNfcG1kID0gX19waHlzX3RvX3BmbihQTURfU0laRSAtICgodW5zaWduZWQgbG9uZykga2FkZHJfcGFnZSAmIH5QTURfTUFTSykpOworCisJCXdoaWxlIChucl9wYWdlcykgeworCisJCQlucl9wYWdlc19wbWQgPSBtaW4obnJfcGFnZXMsIG5yX3BhZ2VzX3BtZCk7CisJCQlucl9wYWdlcyAtPSBucl9wYWdlc19wbWQ7CisKKwkJCXNoYWRvd19wbWRfaW5jKGthZGRyX3BhZ2UsIG5yX3BhZ2VzX3BtZCk7CisKKwkJCWlmIChwbWRfYmFkKCpwbWQpKSB7IC8vTm8gMm5kLWxldmVsIHBhZ2UgdGFibGUsIHJldHJpZXZlIGl0IGZyb20gdGhlIHNoYWRvd3MKKwkJCQkvLyBTbWFsbCByYWNlIGNvbmRpdGlvbiBoZXJlLCBidXQgYXQgd29yc3Qgd2UnbGwgZW5kIHVwIGNvcHlpbmcgdGhlIHNoYWRvd19wbWQgdG8gdGhlIGFjdHVhbCBwbWQgdHdpY2UuCisJCQkJLy8gRm9yIG5vdywgbWFwIHRoZSB3aG9sZSBQTUQuIFRPRE86IHRyeSBhbmQgbWFwIG9ubHkgMSBzZWN0aW9uICgxTUIpLgorCQkJCWNvcHlfcG1kX2Zhc3QocG1kLCBzaGFkb3dfcG1kKTsKKwkJCX0KKworCQkJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCAoaW50KSBrYWRkcl9wYWdlKTsKKwkJCXdoaWxlIChucl9wYWdlc19wbWQpIHsKKwkJCQl1bmNhY2hlX3B0ZV9leHQocHRlKTsKKwkJCQlmbHVzaF90bGJfa2VybmVsX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGthZGRyX3BhZ2UpOworCQkJCXB0ZSsrOworCQkJCWthZGRyX3BhZ2UgKz0gUEFHRV9TSVpFOworCQkJCW5yX3BhZ2VzX3BtZC0tOworCQkJfQorCisJCQlucl9wYWdlc19wbWQgPSBQVFJTX1BFUl9QVEU7CisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKKwkJCXBtZCArPSAyOworCQkJc2hhZG93X3BtZCArPSAyOworI2Vsc2UKKwkJCXBtZCArPSBMSU5LRURfUE1EUzsKKwkJCXNoYWRvd19wbWQgKz0gTElOS0VEX1BNRFM7CisjZW5kaWYKKwkJfQorCX0KKwlvcDoKKyNlbmRpZgorCWRtYWNfbWFwX2FyZWEoa2FkZHIsIHNpemUsIGRpcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2RtYWNfdW5tYXBfYXJlYShjb25zdCB2b2lkICprYWRkciwgc2l6ZV90IHNpemUsCisJaW50IGRpcikKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19VTkNBQ0hFRF9ETUEpCisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCWNvbnN0IHN0cnVjdCBtZW1fdHlwZSAqbXQ7CisJdW5zaWduZWQgbG9uZyBwYTsKKwljb25zdCB2b2lkICprYWRkcl9wYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG5yX3BhZ2VzLCBucl9wYWdlc19wbWQsIHBhZ2VfY291bnQ7CisKKwlpZiAoIXNoYWRvd19wbWRfY291bnQpCisJCWdvdG8gb3A7CisKKwlpZiAoKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpICYmICgoKCh1bnNpZ25lZCBsb25nKSBrYWRkcnxzaXplKSAmIH5QQUdFX01BU0spID09IDApKSB7CisJCW10ID0gZ2V0X21lbV90eXBlKE1UX01FTU9SWSk7CisJCWthZGRyX3BhZ2UgPSBrYWRkcjsKKworCQlwbWQgPSBwbWRfb2ZmX2soKHVuc2lnbmVkIGxvbmcpIGthZGRyX3BhZ2UpOworCQlwYSA9IF9fdmlydF90b19waHlzKCh1bnNpZ25lZCBsb25nKWthZGRyX3BhZ2UgJiBQTURfTUFTSyk7CisKKwkJbnJfcGFnZXMgPSBfX3BoeXNfdG9fcGZuKHNpemUpOworCisJCWlmIChucl9wYWdlcyA9PSAxKSB7IC8vIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UKKwkJCWlmIChwbWRfYmFkKCpwbWQpKSAvLyBObyAybmQtbGV2ZWwgcGFnZSB0YWJsZSwgc28gcGFnZSB3YXMgbmV2ZXIgbWFkZSBub24tY2FjaGVhYmxlLgorCQkJCWdvdG8gb3A7CisJCQlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIChpbnQpIGthZGRyX3BhZ2UpOworCQkJc2V0X3B0ZV9leHQocHRlLCAqcHRlLCAwKTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrLCBmbGFncyk7CisJCQlzaGFkb3dfcG1kX2NvdW50W3BnZF9pbmRleCgodW5zaWduZWQgbG9uZykga2FkZHJfcGFnZSldLS07CisJCQlpZiAoc2hhZG93X3BtZF9jb3VudFtwZ2RfaW5kZXgoKHVuc2lnbmVkIGxvbmcpIGthZGRyX3BhZ2UpXSA9PSAwKSB7CisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKKwkJCQkqcG1kID0gX19wbWQocGEgfCBtdC0+cHJvdF9zZWN0KTsKKwkJCQlwbWQrKzsKKwkJCQlwYSArPSBTRUNUSU9OX1NJWkU7CisJCQkJKnBtZCA9IF9fcG1kKHBhIHwgbXQtPnByb3Rfc2VjdCk7CisjZWxzZQorCQkJCXBtZF90ICpvcmlnX3BtZCA9IHBtZDsKKwkJCQl3aGlsZSAocG1kIDwgKG9yaWdfcG1kICsgTElOS0VEX1BNRFMpKSB7CisJCQkJCSpwbWQgPSBfX3BtZChwYSB8IG10LT5wcm90X3NlY3QpOworCQkJCQlwYSArPSBTRUNUSU9OX1NJWkU7CisJCQkJCXBtZCsrOworCQkJCX0KKyNlbmRpZgorCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2ssIGZsYWdzKTsKKworCQkJZmx1c2hfdGxiX2tlcm5lbF9wYWdlKCh1bnNpZ25lZCBsb25nKSBrYWRkcl9wYWdlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCW5yX3BhZ2VzX3BtZCA9IF9fcGh5c190b19wZm4oUE1EX1NJWkUgLSAoKHVuc2lnbmVkIGxvbmcpIGthZGRyX3BhZ2UgJiB+UE1EX01BU0spKTsKKworCQl3aGlsZSAobnJfcGFnZXMpIHsKKwkJCWlmIChwbWRfYmFkKCpwbWQpKSAvLyBObyAybmQtbGV2ZWwgcGFnZSB0YWJsZSwgc28gcGFnZSB3YXMgbmV2ZXIgbWFkZSBub24tY2FjaGVhYmxlLgorCQkJCWdvdG8gb3A7CisJCQlucl9wYWdlc19wbWQgPSBtaW4obnJfcGFnZXMsIG5yX3BhZ2VzX3BtZCk7CisJCQlucl9wYWdlcyAtPSBucl9wYWdlc19wbWQ7CisKKwkJCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgKGludCkga2FkZHJfcGFnZSk7CisJCQlwYWdlX2NvdW50ID0gbnJfcGFnZXNfcG1kOworCQkJd2hpbGUgKHBhZ2VfY291bnQpIHsKKwkJCQlzZXRfcHRlX2V4dChwdGUsICpwdGUsIDApOworCQkJCXB0ZSsrOworCQkJCXBhZ2VfY291bnQtLTsKKwkJCX0KKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrLCBmbGFncyk7CisJCQlzaGFkb3dfcG1kX2NvdW50W3BnZF9pbmRleCgodW5zaWduZWQgbG9uZykga2FkZHJfcGFnZSldIC09IG5yX3BhZ2VzX3BtZDsKKwkJCWlmIChzaGFkb3dfcG1kX2NvdW50W3BnZF9pbmRleCgodW5zaWduZWQgbG9uZykga2FkZHJfcGFnZSldID09IDApIHsKKyNpZiAhZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQorCQkJCSpwbWQgPSBfX3BtZChwYSB8IG10LT5wcm90X3NlY3QpOworCQkJCXBtZCsrOworCQkJCXBhICs9IFNFQ1RJT05fU0laRTsKKwkJCQkqcG1kID0gX19wbWQocGEgfCBtdC0+cHJvdF9zZWN0KTsKKwkJCQlwbWQrKzsKKwkJCQlwYSArPSBTRUNUSU9OX1NJWkU7CisjZWxzZQorCQkJCXBtZF90ICpvcmlnX3BtZCA9IHBtZDsKKwkJCQl3aGlsZSAocG1kIDwgKG9yaWdfcG1kICsgTElOS0VEX1BNRFMpKSB7CisJCQkJCSpwbWQgPSBfX3BtZChwYSB8IG10LT5wcm90X3NlY3QpOworCQkJCQlwbWQrKzsKKwkJCQkJcGEgKz0gU0VDVElPTl9TSVpFOworCQkJCX0KKyNlbmRpZgorCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2ssIGZsYWdzKTsKKworCQkJd2hpbGUgKG5yX3BhZ2VzX3BtZCkgeworCQkJCWZsdXNoX3RsYl9rZXJuZWxfcGFnZSgodW5zaWduZWQgbG9uZykga2FkZHJfcGFnZSk7CisJCQkJa2FkZHJfcGFnZSArPSBQQUdFX1NJWkU7CisJCQkJbnJfcGFnZXNfcG1kLS07CisJCQl9CisKKwkJCW5yX3BhZ2VzX3BtZCA9IFBUUlNfUEVSX1BURTsKKwkJfQorCisJCXJldHVybjsKKwl9CisJb3A6CisjZW5kaWYKKyNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX0RNQV9QQVJUSUFMX0lOVkFMSURBVEVTKQorCWRtYWNfdW5tYXBfYXJlYShrYWRkciwgc2l6ZSwgZGlyKTsKKyNlbHNlCisJc2l6ZV90IHNpemVfaW52ID0gbWluX3Qoc2l6ZV90LCAzMiwgc2l6ZSk7CisKKwlkbWFjX3VubWFwX2FyZWEoa2FkZHIsIHNpemVfaW52LCBkaXIpOworCWRtYWNfdW5tYXBfYXJlYShrYWRkciArIHNpemUgLSBzaXplX2ludiwgc2l6ZV9pbnYsIGRpcik7CisjZW5kaWYKK30KKwogLyoKICAqIE1ha2UgYW4gYXJlYSBjb25zaXN0ZW50IGZvciBkZXZpY2VzLgogICogTm90ZTogRHJpdmVycyBzaG91bGQgTk9UIHVzZSB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LCBhcyBpdCB3aWxsIGJyZWFrCkBAIC00NjQsMzUgKzc0OCw1OCBAQAogdm9pZCBfX19kbWFfc2luZ2xlX2NwdV90b19kZXYoY29uc3Qgdm9pZCAqa2FkZHIsIHNpemVfdCBzaXplLAogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQl1bnNpZ25lZCBsb25nIHBhZGRyOworCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSBfX3BhKGthZGRyKTsKIAogCUJVR19PTighdmlydF9hZGRyX3ZhbGlkKGthZGRyKSB8fCAhdmlydF9hZGRyX3ZhbGlkKGthZGRyICsgc2l6ZSAtIDEpKTsKIAotCWRtYWNfbWFwX2FyZWEoa2FkZHIsIHNpemUsIGRpcik7CisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1pPTkVfRE1BX05DTkIKKwlpZiAoKHBhZGRyICsgc2l6ZSkgPD0gYXJtX2RtYV96b25lX3NpemUpIHsKKwkJaWYgKGRpciAhPSBETUFfRlJPTV9ERVZJQ0UpCisJCQl3bWIoKTsKIAotCXBhZGRyID0gX19wYShrYWRkcik7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlfX2RtYWNfbWFwX2FyZWEoa2FkZHIsIHNpemUsIGRpcik7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfTDJYMF9JTlNUUlVDVElPTl9PTkxZKQogCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSB7CiAJCW91dGVyX2ludl9yYW5nZShwYWRkciwgcGFkZHIgKyBzaXplKTsKIAl9IGVsc2UgewogCQlvdXRlcl9jbGVhbl9yYW5nZShwYWRkciwgcGFkZHIgKyBzaXplKTsKIAl9CiAJLyogRklYTUU6IG5vbi1zcGVjdWxhdGluZzogZmx1c2ggb24gYmlkaXJlY3Rpb25hbCBtYXBwaW5ncz8gKi8KKyNlbmRpZgogfQogRVhQT1JUX1NZTUJPTChfX19kbWFfc2luZ2xlX2NwdV90b19kZXYpOwogCiB2b2lkIF9fX2RtYV9zaW5nbGVfZGV2X3RvX2NwdShjb25zdCB2b2lkICprYWRkciwgc2l6ZV90IHNpemUsCiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogeworCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSBfX3BhKGthZGRyKTsKKwogCUJVR19PTighdmlydF9hZGRyX3ZhbGlkKGthZGRyKSB8fCAhdmlydF9hZGRyX3ZhbGlkKGthZGRyICsgc2l6ZSAtIDEpKTsKIAotCS8qIEZJWE1FOiBub24tc3BlY3VsYXRpbmc6IG5vdCByZXF1aXJlZCAqLworI2lmZGVmIENPTkZJR19DT01DRVJUT19aT05FX0RNQV9OQ05CCisJaWYgKChwYWRkciArIHNpemUpIDw9IGFybV9kbWFfem9uZV9zaXplKQorCQlyZXR1cm47CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19MMlgwX0lOU1RSVUNUSU9OX09OTFkpCiAJLyogZG9uJ3QgYm90aGVyIGludmFsaWRhdGluZyBpZiBETUEgdG8gZGV2aWNlICovCiAJaWYgKGRpciAhPSBETUFfVE9fREVWSUNFKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGFkZHIgPSBfX3BhKGthZGRyKTsKKyNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX0RNQV9QQVJUSUFMX0lOVkFMSURBVEVTKQogCQlvdXRlcl9pbnZfcmFuZ2UocGFkZHIsIHBhZGRyICsgc2l6ZSk7Ci0JfQorI2Vsc2UKKwkJc2l6ZV90IHNpemVfaW52ID0gbWluX3Qoc2l6ZV90LCAzMiwgc2l6ZSk7CiAKLQlkbWFjX3VubWFwX2FyZWEoa2FkZHIsIHNpemUsIGRpcik7CisJCW91dGVyX2ludl9yYW5nZShwYWRkciwgcGFkZHIgKyBzaXplX2ludik7CisJCW91dGVyX2ludl9yYW5nZShwYWRkciArIHNpemUgLSBzaXplX2ludiwgcGFkZHIgKyBzaXplKTsKKyNlbmRpZgorCX0KKyNlbmRpZgorCisJX19kbWFjX3VubWFwX2FyZWEoa2FkZHIsIHNpemUsIGRpcik7CiB9CiBFWFBPUlRfU1lNQk9MKF9fX2RtYV9zaW5nbGVfZGV2X3RvX2NwdSk7CiAKQEAgLTUzNCw2ICs4NDEsNyBAQAogCQkJdmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQ7CiAJCQlvcCh2YWRkciwgbGVuLCBkaXIpOwogCQl9CisKIAkJb2Zmc2V0ID0gMDsKIAkJcGFnZSsrOwogCQlsZWZ0IC09IGxlbjsKQEAgLTU0MywxNiArODUxLDI2IEBACiB2b2lkIF9fX2RtYV9wYWdlX2NwdV90b19kZXYoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2ZmLAogCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0JdW5zaWduZWQgbG9uZyBwYWRkcjsKKwl1bnNpZ25lZCBsb25nIHBhZGRyID0gcGFnZV90b19waHlzKHBhZ2UpICsgb2ZmOwogCi0JZG1hX2NhY2hlX21haW50X3BhZ2UocGFnZSwgb2ZmLCBzaXplLCBkaXIsIGRtYWNfbWFwX2FyZWEpOworI2lmZGVmIENPTkZJR19DT01DRVJUT19aT05FX0RNQV9OQ05CCisJaWYgKChwYWRkciArIHNpemUpIDw9IGFybV9kbWFfem9uZV9zaXplKSB7CisJCWlmIChkaXIgIT0gRE1BX0ZST01fREVWSUNFKQorCQkJd21iKCk7CiAKLQlwYWRkciA9IHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZjsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJZG1hX2NhY2hlX21haW50X3BhZ2UocGFnZSwgb2ZmLCBzaXplLCBkaXIsIF9fZG1hY19tYXBfYXJlYSk7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfTDJYMF9JTlNUUlVDVElPTl9PTkxZKQogCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSB7CiAJCW91dGVyX2ludl9yYW5nZShwYWRkciwgcGFkZHIgKyBzaXplKTsKIAl9IGVsc2UgewogCQlvdXRlcl9jbGVhbl9yYW5nZShwYWRkciwgcGFkZHIgKyBzaXplKTsKIAl9CisjZW5kaWYKIAkvKiBGSVhNRTogbm9uLXNwZWN1bGF0aW5nOiBmbHVzaCBvbiBiaWRpcmVjdGlvbmFsIG1hcHBpbmdzPyAqLwogfQogRVhQT1JUX1NZTUJPTChfX19kbWFfcGFnZV9jcHVfdG9fZGV2KTsKQEAgLTU2MiwxMiArODgwLDI1IEBACiB7CiAJdW5zaWduZWQgbG9uZyBwYWRkciA9IHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZjsKIAotCS8qIEZJWE1FOiBub24tc3BlY3VsYXRpbmc6IG5vdCByZXF1aXJlZCAqLwotCS8qIGRvbid0IGJvdGhlciBpbnZhbGlkYXRpbmcgaWYgRE1BIHRvIGRldmljZSAqLwotCWlmIChkaXIgIT0gRE1BX1RPX0RFVklDRSkKLQkJb3V0ZXJfaW52X3JhbmdlKHBhZGRyLCBwYWRkciArIHNpemUpOworI2lmZGVmIENPTkZJR19DT01DRVJUT19aT05FX0RNQV9OQ05CCisJaWYgKChwYWRkciArIHNpemUpIDw9IGFybV9kbWFfem9uZV9zaXplKQorCQlyZXR1cm47CisjZW5kaWYKIAotCWRtYV9jYWNoZV9tYWludF9wYWdlKHBhZ2UsIG9mZiwgc2l6ZSwgZGlyLCBkbWFjX3VubWFwX2FyZWEpOworI2lmICFkZWZpbmVkKENPTkZJR19MMlgwX0lOU1RSVUNUSU9OX09OTFkpCisJLyogZG9uJ3QgYm90aGVyIGludmFsaWRhdGluZyBpZiBETUEgdG8gZGV2aWNlICovCisJaWYgKGRpciAhPSBETUFfVE9fREVWSUNFKSB7CisjaWYgIWRlZmluZWQoQ09ORklHX0NQVV9ETUFfUEFSVElBTF9JTlZBTElEQVRFUykKKwkJb3V0ZXJfaW52X3JhbmdlKHBhZGRyLCBwYWRkciArIHNpemUpOworI2Vsc2UKKwkJc2l6ZV90IHNpemVfaW52ID0gbWluX3Qoc2l6ZV90LCAzMiwgc2l6ZSk7CisKKwkJb3V0ZXJfaW52X3JhbmdlKHBhZGRyLCBwYWRkciArIHNpemVfaW52KTsKKwkJb3V0ZXJfaW52X3JhbmdlKHBhZGRyICsgc2l6ZSAtIHNpemVfaW52LCBwYWRkciArIHNpemUpOworI2VuZGlmCisJfQorI2VuZGlmCisJZG1hX2NhY2hlX21haW50X3BhZ2UocGFnZSwgb2ZmLCBzaXplLCBkaXIsIF9fZG1hY191bm1hcF9hcmVhKTsKIAogCS8qCiAJICogTWFyayB0aGUgRC1jYWNoZSBjbGVhbiBmb3IgdGhpcyBwYWdlIHRvIGF2b2lkIGV4dHJhIGZsdXNoaW5nLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmx1c2guYyBiL2FyY2gvYXJtL21tL2ZsdXNoLmMKaW5kZXggMWE4ZDRhYS4uOTRlNzM5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmx1c2guYworKysgYi9hcmNoL2FybS9tbS9mbHVzaC5jCkBAIC0yMjksNiArMjI5LDI2IEBACiAJZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfTDJYMF9JTlNUUlVDVElPTl9PTkxZKQorCit2b2lkIF9fc3luY19vdXRlcl9jYWNoZShwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKQoreworCWlmIChwdGVfcHJlc2VudCgqcHRlcCkgJiYgcHRlX2V4ZWMoKnB0ZXApICYmICghcHRlX3ByZXNlbnQocHRldmFsKSB8fCAhcHRlX2V4ZWMocHRldmFsKSkpIHsKKwkJdW5zaWduZWQgbG9uZyBwaHlzID0gX19wZm5fdG9fcGh5cyhwdGVfcGZuKCpwdGVwKSk7CisKKy8vCQlwcmludGsoS0VSTl9JTkZPICJvdXRlciBmbHVzaCByYW5nZTogJXggJXggJWx4LSVseFxuIiwgcHRlX3ZhbCgqcHRlcCksIHB0ZXZhbCwgcGh5cywgcGh5cyArIFBBR0VfU0laRSk7CisJCW91dGVyX2ZsdXNoX3JhbmdlKHBoeXMsIHBoeXMgKyBQQUdFX1NJWkUpOworCX0KK30KKworc3RhdGljIHZvaWQgc3luY19vdXRlcl9jYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBoeXMgPSBwYWdlX3RvX3BoeXMocGFnZSk7CisKKwlvdXRlcl9mbHVzaF9yYW5nZShwaHlzLCBwaHlzICsgUEFHRV9TSVpFKTsKK30KKyNlbmRpZgorCiAjaWYgX19MSU5VWF9BUk1fQVJDSF9fID49IDYKIHZvaWQgX19zeW5jX2ljYWNoZV9kY2FjaGUocHRlX3QgcHRldmFsKQogewpAQCAtMzAwLDYgKzMyMCwxMCBAQAogCQkJX19mbHVzaF9kY2FjaGVfYWxpYXNlcyhtYXBwaW5nLCBwYWdlKTsKIAkJZWxzZSBpZiAobWFwcGluZykKIAkJCV9fZmx1c2hfaWNhY2hlX2FsbCgpOworCisjaWYgZGVmaW5lZChDT05GSUdfTDJYMF9JTlNUUlVDVElPTl9PTkxZKQorCQlzeW5jX291dGVyX2NhY2hlKHBhZ2UpOworI2VuZGlmCiAJCXNldF9iaXQoUEdfZGNhY2hlX2NsZWFuLCAmcGFnZS0+ZmxhZ3MpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2luaXQuYyBiL2FyY2gvYXJtL21tL2luaXQuYwppbmRleCBmYmRkMTJlLi5mMzYyY2Y4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9pbml0LmMKKysrIGIvYXJjaC9hcm0vbW0vaW5pdC5jCkBAIC0yODgsNyArMjg4LDExIEBACiAJaWYgKGFybV9kbWFfem9uZV9zaXplKSB7CiAJCWFybV9hZGp1c3RfZG1hX3pvbmUoem9uZV9zaXplLCB6aG9sZV9zaXplLAogCQkJYXJtX2RtYV96b25lX3NpemUgPj4gUEFHRV9TSElGVCk7CisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX1pPTkVfRE1BX05DTkIKKwkJYXJtX2RtYV9saW1pdCA9IDB4ZmZmZmZmZmY7CisjZWxzZQogCQlhcm1fZG1hX2xpbWl0ID0gUEhZU19PRkZTRVQgKyBhcm1fZG1hX3pvbmVfc2l6ZSAtIDE7CisjZW5kaWYKIAl9IGVsc2UKIAkJYXJtX2RtYV9saW1pdCA9IDB4ZmZmZmZmZmY7CiAjZW5kaWYKQEAgLTQyMyw5ICs0MjcsMTUgQEAKIAogCWZvciAoOyBwZm4gPCBlbmQ7IHBmbisrKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKyNpZiBkZWZpbmVkKENPTkZJR19MMlgwX0lOU1RSVUNUSU9OX09OTFkpCisJCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHBhZ2VfdG9fcGh5cyhwYWdlKTsKKyNlbmRpZgogCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKIAkJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOwogCQlfX2ZyZWVfcGFnZShwYWdlKTsKKyNpZiBkZWZpbmVkKENPTkZJR19MMlgwX0lOU1RSVUNUSU9OX09OTFkpCisJCW91dGVyX2ZsdXNoX3JhbmdlKHBoeXMsIHBoeXMgKyBQQUdFX1NJWkUpOworI2VuZGlmCiAJCXBhZ2VzKys7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbXUuYyBiL2FyY2gvYXJtL21tL21tdS5jCmluZGV4IGRjOGM1NTAuLmY0NTJiZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tdS5jCisrKyBiL2FyY2gvYXJtL21tL21tdS5jCkBAIC0yODEsNiArMjgxLDE4IEBACiAJCQkJUE1EX1NFQ1RfVU5DQUNIRUQgfCBQTURfU0VDVF9YTiwKIAkJLmRvbWFpbiAgICA9IERPTUFJTl9LRVJORUwsCiAJfSwKKwlbTVRfTVNQXSA9IHsKKwkJLnByb3RfcHRlICA9IFBST1RfUFRFX0RFVklDRSB8IExfUFRFX01UX0RFVl9DQUNIRUQgfCBMX1BURV9YTiwKKwkJLnByb3RfbDEgICA9IFBNRF9UWVBFX1RBQkxFLAorCQkucHJvdF9zZWN0ID0gUFJPVF9TRUNUX0RFVklDRSB8IFBNRF9TRUNUX1dCLAorCQkuZG9tYWluICAgID0gRE9NQUlOX0lPLAorCX0sCisJW01UX01TUF9OQ05CXSA9IHsKKwkJLnByb3RfcHRlICA9IFBST1RfUFRFX0RFVklDRSB8IExfUFRFX1hOLAorCQkucHJvdF9sMSAgID0gUE1EX1RZUEVfVEFCTEUsCisJCS5wcm90X3NlY3QgPSBQUk9UX1NFQ1RfREVWSUNFIHwgUE1EX1NFQ1RfUywKKwkJLmRvbWFpbiAgICA9IERPTUFJTl9JTywKKwl9LAogfTsKIAogY29uc3Qgc3RydWN0IG1lbV90eXBlICpnZXRfbWVtX3R5cGUodW5zaWduZWQgaW50IHR5cGUpCkBAIC01NzIsOCArNTg0LDcgQEAKIAlpZiAoKChhZGRyIHwgZW5kIHwgcGh5cykgJiB+U0VDVElPTl9NQVNLKSA9PSAwKSB7CiAJCXBtZF90ICpwID0gcG1kOwogCi0JCWlmIChhZGRyICYgU0VDVElPTl9TSVpFKQotCQkJcG1kKys7CisJCXBtZCArPSAoYWRkciAmICh+UEdESVJfTUFTSykpID4+IFNFQ1RJT05fU0hJRlQ7CiAKIAkJZG8gewogCQkJKnBtZCA9IF9fcG1kKHBoeXMgfCB0eXBlLT5wcm90X3NlY3QpOwpAQCAtMTAxMyw3ICsxMDI0LDEwIEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbWFwX2xvd21lbSh2b2lkKQogewogCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJlZzsKLQorI2lmZGVmIENPTkZJR19DT01DRVJUT19aT05FX0RNQV9OQ05CCisJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXJtX2RtYV96b25lX3NpemU7CisJcGh5c19hZGRyX3QgbGVuZ3RoX25jbmIgPSBhcm1fZG1hX3pvbmVfc2l6ZSwgbGVuZ3RoX25jbmJfbm93ID0gMDsKKyNlbmRpZgogCS8qIE1hcCBhbGwgdGhlIGxvd21lbSBtZW1vcnkgYmFua3MuICovCiAJZm9yX2VhY2hfbWVtYmxvY2sobWVtb3J5LCByZWcpIHsKIAkJcGh5c19hZGRyX3Qgc3RhcnQgPSByZWctPmJhc2U7CkBAIC0xMDI0LDcgKzEwMzgsMzEgQEAKIAkJCWVuZCA9IGxvd21lbV9saW1pdDsKIAkJaWYgKHN0YXJ0ID49IGVuZCkKIAkJCWJyZWFrOworI2lmZGVmIENPTkZJR19DT01DRVJUT19aT05FX0RNQV9OQ05CCisJCWlmIChsZW5ndGhfbmNuYiA+IDApCisJCXsKKwkJCWxlbmd0aF9uY25iX25vdyA9IG1pbihsZW5ndGhfbmNuYiwgZW5kIC0gc3RhcnQpOworCQkJbWFwLnBmbiA9IF9fcGh5c190b19wZm4oc3RhcnQpOworCQkJbWFwLnZpcnR1YWwgPSBfX3BoeXNfdG9fdmlydChzdGFydCk7CisJCQltYXAubGVuZ3RoID0gbGVuZ3RoX25jbmJfbm93OworCQkJbWFwLnR5cGUgPSBNVF9NRU1PUllfTk9OQ0FDSEVEOwogCisJCQlwcmludGsoIkNvbWNlcnRvOiB6b25lX2RtYSBtYXBwaW5nIHNpemU9JWx4IHR5cGU9JWx4XG4iLCAodW5zaWduZWQgbG9uZykgbWFwLmxlbmd0aCwgKHVuc2lnbmVkIGxvbmcpIG1hcC50eXBlKTsKKworCQkJaWYgKCFhcm1fZG1hX3pvbmUuc3RhcnQpCisJCQkJYXJtX2RtYV96b25lLnN0YXJ0ID0gX19waHlzX3RvX3ZpcnQoc3RhcnQpOworCisJCQljcmVhdGVfbWFwcGluZygmbWFwKTsKKwkJCXN0YXJ0ICs9IGxlbmd0aF9uY25iX25vdzsKKwkJCWxlbmd0aF9uY25iIC09IGxlbmd0aF9uY25iX25vdzsKKworCQkJYXJtX2RtYV96b25lLmVuZCA9IF9fcGh5c190b192aXJ0KHN0YXJ0KTsKKworCQkJaWYgKHN0YXJ0ID09IGVuZCkKKwkJCQljb250aW51ZTsKKworCQl9CisjZW5kaWYKIAkJbWFwLnBmbiA9IF9fcGh5c190b19wZm4oc3RhcnQpOwogCQltYXAudmlydHVhbCA9IF9fcGh5c190b192aXJ0KHN0YXJ0KTsKIAkJbWFwLmxlbmd0aCA9IGVuZCAtIHN0YXJ0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcGdkLmMgYi9hcmNoL2FybS9tbS9wZ2QuYwppbmRleCBiMjAyN2MxLi4yN2I5MDE2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wZ2QuYworKysgYi9hcmNoL2FybS9tbS9wZ2QuYwpAQCAtMjcsNyArMjcsNyBAQAogCXBtZF90ICpuZXdfcG1kLCAqaW5pdF9wbWQ7CiAJcHRlX3QgKm5ld19wdGUsICppbml0X3B0ZTsKIAotCW5ld19wZ2QgPSAocGdkX3QgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIDIpOworCW5ld19wZ2QgPSAocGdkX3QgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIGdldF9vcmRlcigxNjM4NCkpOwogCWlmICghbmV3X3BnZCkKIAkJZ290byBub19wZ2Q7CiAKQEAgLTc0LDcgKzc0LDcgQEAKIG5vX3BtZDoKIAlwdWRfZnJlZShtbSwgbmV3X3B1ZCk7CiBub19wdWQ6Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyluZXdfcGdkLCAyKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKW5ld19wZ2QsIGdldF9vcmRlcigxNjM4NCkpOwogbm9fcGdkOgogCXJldHVybiBOVUxMOwogfQpAQCAtMTExLDUgKzExMSw1IEBACiAJcGdkX2NsZWFyKHBnZCk7CiAJcHVkX2ZyZWUobW0sIHB1ZCk7CiBub19wZ2Q6Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcGdkX2Jhc2UsIDIpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHBnZF9iYXNlLCBnZXRfb3JkZXIoMTYzODQpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwppbmRleCA3ODUzNjVlLi41ZjNiZDliIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCkBAIC00Niw3ICs0Niw3IEBACiAJbXJjCXAxNSwgMCwgcjAsIGMxLCBjMCwgMAkJQCBjdHJsIHJlZ2lzdGVyCiAJYmljCXIwLCByMCwgIzB4MTAwMAkJCUAgLi4uaS4uLi4uLi4uLi4uLgogCWJpYwlyMCwgcjAsICMweDAwMDYJCQlAIC4uLi4uLi4uLi4uLi5jYS4KLQltY3IJcDE1LCAwLCByMCwgYzEsIGMwLCAwCQlAIGRpc2FibGUgY2FjaGVzCisjCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgZGlzYWJsZSBjYWNoZXMKIAltb3YJcGMsIGxyCiBFTkRQUk9DKGNwdV92N19wcm9jX2ZpbikKIApAQCAtMTQ5LDcgKzE0OSwxMSBAQAogCWJpYwlyMywgcjEsICMweDAwMDAwM2YwCiAJYmljCXIzLCByMywgI1BURV9UWVBFX01BU0sKIAlvcnIJcjMsIHIzLCByMgorI2lmICFkZWZpbmVkKENPTkZJR19DT01DRVJUT182NEtfUEFHRVMpCiAJb3JyCXIzLCByMywgI1BURV9FWFRfQVAwIHwgMgorI2Vsc2UKKwlvcnIJcjMsIHIzLCAjUFRFX0VYVF9BUDAgfCAxCisjZW5kaWYKIAogCXRzdAlyMSwgIzEgPDwgNAogCW9ycm5lCXIzLCByMywgI1BURV9FWFRfVEVYKDEpCkBAIC0xNzMsMTQgKzE3Nyw2NSBAQAogCXRzdG5lCXIxLCAjTF9QVEVfUFJFU0VOVAogCW1vdmVxCXIzLCAjMAogCisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKICBBUk0oCXN0cglyMywgW3IwLCAjMjA0OF0hICkKICBUSFVNQigJYWRkCXIwLCByMCwgIzIwNDggKQogIFRIVU1CKAlzdHIJcjMsIFtyMF0gKQogCW1jcglwMTUsIDAsIHIwLCBjNywgYzEwLCAxCQlAIGZsdXNoX3B0ZQorICNlbHNlCisJbGRyIHIxLCA9MzI3NjgJCUAgUFRFX0hXVEFCTEVfT0ZGCisJYWRkIHIxLCByMSwgcjAKKwlhZGQgcjIsIHIxLCAjNjQJCUAgMTYqNCBieXRlcworIDE6CisJc3ViIHIyLCByMiwgIzQKKyAJc3RyCXIzLCBbcjJdIQorCWNtcCByMSwgcjIKKwlibG8gMWIKKwltY3IJcDE1LCAwLCByMSwgYzcsIGMxMCwgMQkJQCBmbHVzaF9wdGUKKwlhZGQgcjEsIHIxLCAjMzIJCQkJQCAxIGNhY2hlIGxpbmUsIHNpbmNlIEhXIFBURSB0YWtlcyA2NCBieXRlcworCW1jcglwMTUsIDAsIHIxLCBjNywgYzEwLCAxCQlAIGZsdXNoX3B0ZQorICNlbmRpZgorCisKICNlbmRpZgogCW1vdglwYywgbHIKIEVORFBST0MoY3B1X3Y3X3NldF9wdGVfZXh0KQogCisvKiBNYWtlIHRoZSBtZW1vcnkgdW5jYWNoZWQsIGJ1dCBrZWVwIExpbnV4IHNldHRpbmdzIGFzIGlzIHNvIG1lbW9yeSBtYXkgYmUKKyAqIHJlc2V0IHRvIG9yaWdpbmFsIGF0dHJpYnV0ZXMgbGF0ZXIgb24uCisgKi8KK0VOVFJZKGNwdV92N191bmNhY2hlX3B0ZV9leHQpCisjaWZkZWYgQ09ORklHX01NVQorI2lmICFkZWZpbmVkKENPTkZJR19DT01DRVJUT182NEtfUEFHRVMpCisgQVJNKAlsZHIJcjMsIFtyMCwgIzIwNDhdISApCisgVEhVTUIoCWFkZAlyMCwgcjAsICMyMDQ4ICkKKyBUSFVNQiggbGRyIHIzLCBbcjBdICkKKwkJYmljIHIzLCByMywgIzB4NDgJCUAgY2xlYXIgVEVYWzBdLEMgYml0cyAoc2VlIGJlbG93KQorCQlvcnIgcjMsIHIzLCAjMHg0ICAJCUAgc2V0IEIgYml0IChzZWUgYmVsb3cpCisgQVJNKAlzdHIJcjMsIFtyMCwgIzIwNDhdISApCisgVEhVTUIoCXN0cglyMywgW3IwXSApCisgI2Vsc2UKKwlsZHIgcjEsID0zMjc2OAkJQCBQVEVfSFdUQUJMRV9PRkYKKwlhZGQgcjEsIHIxLCByMAorCWxkciByMywgW3IxXQorCWFkZCByMiwgcjEsICM2NAkJQCAxNio0IGJ5dGVzCitBUk0oCWJpYyByMywgcjMsICMweDEwMDggKSAJQCBjbGVhciBURVhbMF0sQyBiaXRzIChzZWUgYmVsb3cpCitUSFVNQigJYmljIHIzLCByMywgIzB4OCApCitUSFVNQigJYmljIHIzLCByMywgIzB4MTAwMCApCisJb3JyIHIzLCByMywgIzB4NAkJCUAgc2V0IEIgYml0IChzZWUgYmVsb3cpCisgMToKKwlzdWIgcjIsIHIyLCAjNAorCXN0cglyMywgW3IyXSEKKwljbXAgcjEsIHIyCisJYmxvIDFiCisgI2VuZGlmCisKKworI2VuZGlmCisJbW92CXBjLCBscgorRU5EUFJPQyhjcHVfdjdfdW5jYWNoZV9wdGVfZXh0KQorCisKIAlzdHJpbmcJY3B1X3Y3X25hbWUsICJBUk12NyBQcm9jZXNzb3IiCiAJLmFsaWduCiAKQEAgLTI0Nyw2ICszMDIsOSBAQAogCUFMVF9VUChvcnIJcjEsIHIxLCAjVFRCX0ZMQUdTX1VQKQogCW1jcglwMTUsIDAsIHIxLCBjMiwgYzAsIDAJQCBUVEIgMAogCW1jcglwMTUsIDAsIHI3LCBjMiwgYzAsIDEJQCBUVEIgMQorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0hXX0tFUk5FTF9QQUdFVEFCTEUpCisJbW92IGlwLCAjMQkJCQkJCUAgc2V0IFRUQlJDUi5OIHRvIDEsIHNvIHRoYXQgYWRkcmVzc2VzIGFib3ZlIDJHQiB3aWxsIHVzZSBUVEIxCisjZW5kaWYKIAltY3IJcDE1LCAwLCBpcCwgYzIsIGMwLCAyCUAgVFRCIGNvbnRyb2wgcmVnaXN0ZXIKIAltcmMJcDE1LCAwLCByNCwgYzEsIGMwLCAxCUAgUmVhZCBBdXhpbGlhcnkgY29udHJvbCByZWdpc3RlcgogCXRlcQlyNCwgcjkJCQlAIElzIGl0IGFscmVhZHkgc2V0PwpAQCAtMjc3LDkgKzMzNSwxNiBAQAogICoJLSBjYWNoZSB0eXBlIHJlZ2lzdGVyIGlzIGltcGxlbWVudGVkCiAgKi8KIF9fdjdfY2E1bXBfc2V0dXA6Ci1fX3Y3X2NhOW1wX3NldHVwOgogCW1vdglyMTAsICMoMSA8PCAwKQkJCUAgVExCIG9wcyBicm9hZGNhc3RpbmcKIAliCTFmCisKK19fdjdfY2E5bXBfc2V0dXA6CisJbW92CXIxMCwgIygxIDw8IDApCQkJQCBUTEIgb3BzIGJyb2FkY2FzdGluZworI2lmICFkZWZpbmVkKENPTkZJR19DUFVfU1BFQ1VMQVRJVkVfQUNDRVNTX0RJU0FCTEVEKQorCW9ycglyMTAsICMoMyA8PCAxKQkJCUAgTDEgZGF0YSBwcmVmZXRjaCwgTDIgcHJlZmV0Y2ggaGludHMgZW5hYmxlCisjZW5kaWYKKwliCTFmCisKIF9fdjdfY2ExNW1wX3NldHVwOgogCW1vdglyMTAsICMwCiAxOgpAQCAtMzcxLDYgKzQzNiw5IEBACiAJZHNiCiAjaWZkZWYgQ09ORklHX01NVQogCW1jcglwMTUsIDAsIHIxMCwgYzgsIGM3LCAwCQlAIGludmFsaWRhdGUgSSArIEQgVExCcworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0hXX0tFUk5FTF9QQUdFVEFCTEUpCisJbW92IHIxMCwgIzEJCQkJCQlAIHNldCBUVEJSQ1IuTiB0byAxLCBzbyB0aGF0IGFkZHJlc3NlcyBhYm92ZSAyR0Igd2lsbCB1c2UgVFRCMQorI2VuZGlmCiAJbWNyCXAxNSwgMCwgcjEwLCBjMiwgYzAsIDIJCUAgVFRCIGNvbnRyb2wgcmVnaXN0ZXIKIAlBTFRfU01QKG9ycglyNCwgcjQsICNUVEJfRkxBR1NfU01QKQogCUFMVF9VUChvcnIJcjQsIHI0LCAjVFRCX0ZMQUdTX1VQKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvYXJtL3Rvb2xzL21hY2gtdHlwZXMKaW5kZXggY2NiZTE2Zi4uM2E2NzBhNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdG9vbHMvbWFjaC10eXBlcworKysgYi9hcmNoL2FybS90b29scy9tYWNoLXR5cGVzCkBAIC0yMTIsNiArMjEyLDcgQEAKIG9uZWFybQkJCU1BQ0hfT05FQVJNCQlPTkVBUk0JCQkxMDc1CiBzbWRrMjQ0MwkJTUFDSF9TTURLMjQ0MwkJU01ESzI0NDMJCTEwODQKIGZzZwkJCU1BQ0hfRlNHCQlGU0cJCQkxMDkxCitjb21jZXJ0bwkJTUFDSF9DT01DRVJUTwkJQ09NQ0VSVE8JCTEwOTQKIGF0OTFzYW05MjYwZWsJCU1BQ0hfQVQ5MVNBTTkyNjBFSwlBVDkxU0FNOTI2MEVLCQkxMDk5CiBnbGFudGFuawkJTUFDSF9HTEFOVEFOSwkJR0xBTlRBTksJCTExMDAKIG4yMTAwCQkJTUFDSF9OMjEwMAkJTjIxMDAJCQkxMTAxCmRpZmYgLS1naXQgYS9hcmNoL2FybS92ZnAvZW50cnkuUyBiL2FyY2gvYXJtL3ZmcC9lbnRyeS5TCmluZGV4IDRmYTk5MDMuLmNjOTI2YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3ZmcC9lbnRyeS5TCisrKyBiL2FyY2gvYXJtL3ZmcC9lbnRyeS5TCkBAIC03LDE4ICs3LDIwIEBACiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIEJhc2ljIGVudHJ5IGNvZGUsIGNhbGxlZCBmcm9tIHRoZSBrZXJuZWwncyB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gdHJhcC4KLSAqICByMCAgPSBmYXVsdGVkIGluc3RydWN0aW9uCi0gKiAgcjUgID0gZmF1bHRlZCBQQys0Ci0gKiAgcjkgID0gc3VjY2Vzc2Z1bCByZXR1cm4KLSAqICByMTAgPSB0aHJlYWRfaW5mbyBzdHJ1Y3R1cmUKLSAqICBsciAgPSBmYWlsdXJlIHJldHVybgogICovCiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3ZmcG1hY3Jvcy5oPgogI2luY2x1ZGUgIi4uL2tlcm5lbC9lbnRyeS1oZWFkZXIuUyIKIAorQCBWRlAgZW50cnkgcG9pbnQuCitACitAICByMCAgPSBpbnN0cnVjdGlvbiBvcGNvZGUgKDMyLWJpdCBBUk0gb3IgdHdvIDE2LWJpdCBUaHVtYikKK0AgIHIyICA9IFBDIHZhbHVlIHRvIHJlc3VtZSBleGVjdXRpb24gYWZ0ZXIgc3VjY2Vzc2Z1bCBlbXVsYXRpb24KK0AgIHI5ICA9IG5vcm1hbCAic3VjY2Vzc2Z1bCIgcmV0dXJuIGFkZHJlc3MKK0AgIHIxMCA9IHRoaXMgdGhyZWFkcyB0aHJlYWRfaW5mbyBzdHJ1Y3R1cmUKK0AgIGxyICA9IHVucmVjb2duaXNlZCBpbnN0cnVjdGlvbiByZXR1cm4gYWRkcmVzcworQCAgSVJRcyBkaXNhYmxlZC4KK0AKIEVOVFJZKGRvX3ZmcCkKICNpZmRlZiBDT05GSUdfUFJFRU1QVAogCWxkcglyNCwgW3IxMCwgI1RJX1BSRUVNUFRdCUAgZ2V0IHByZWVtcHQgY291bnQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3ZmcC92ZnBody5TIGIvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKaW5kZXggMmQzMGM3Zi4uM2EwZWZhYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKKysrIGIvYXJjaC9hcm0vdmZwL3ZmcGh3LlMKQEAgLTYxLDEzICs2MSwxMyBAQAogCiBAIFZGUCBoYXJkd2FyZSBzdXBwb3J0IGVudHJ5IHBvaW50LgogQAotQCAgcjAgID0gZmF1bHRlZCBpbnN0cnVjdGlvbgotQCAgcjIgID0gZmF1bHRlZCBQQys0Ci1AICByOSAgPSBzdWNjZXNzZnVsIHJldHVybgorQCAgcjAgID0gaW5zdHJ1Y3Rpb24gb3Bjb2RlICgzMi1iaXQgQVJNIG9yIHR3byAxNi1iaXQgVGh1bWIpCitAICByMiAgPSBQQyB2YWx1ZSB0byByZXN1bWUgZXhlY3V0aW9uIGFmdGVyIHN1Y2Nlc3NmdWwgZW11bGF0aW9uCitAICByOSAgPSBub3JtYWwgInN1Y2Nlc3NmdWwiIHJldHVybiBhZGRyZXNzCiBAICByMTAgPSB2ZnBfc3RhdGUgdW5pb24KIEAgIHIxMSA9IENQVSBudW1iZXIKLUAgIGxyICA9IGZhaWx1cmUgcmV0dXJuCi0KK0AgIGxyICA9IHVucmVjb2duaXNlZCBpbnN0cnVjdGlvbiByZXR1cm4gYWRkcmVzcworQCAgSVJRcyBlbmFibGVkLgogRU5UUlkodmZwX3N1cHBvcnRfZW50cnkpCiAJREJHU1RSMwkiaW5zdHIgJTA4eCBwYyAlMDh4IHN0YXRlICVwIiwgcjAsIHIyLCByMTAKIApAQCAtMTYxLDkgKzE2MSwxMiBAQAogCQkJCQlAIGV4Y2VwdGlvbiBiZWZvcmUgcmV0cnlpbmcgYnJhbmNoCiAJCQkJCUAgb3V0IGJlZm9yZSBzZXR0aW5nIGFuIEZQRVhDIHRoYXQKIAkJCQkJQCBzdG9wcyB1cyByZWFkaW5nIHN0dWZmCi0JVkZQRk1YUglGUEVYQywgcjEJCUAgcmVzdG9yZSBGUEVYQyBsYXN0Ci0Jc3ViCXIyLCByMiwgIzQKLQlzdHIJcjIsIFtzcCwgI1NfUENdCQlAIHJldHJ5IHRoZSBpbnN0cnVjdGlvbgorCVZGUEZNWFIJRlBFWEMsIHIxCQlAIFJlc3RvcmUgRlBFWEMgbGFzdAorCXN1YglyMiwgcjIsICM0CQlAIFJldHJ5IGN1cnJlbnQgaW5zdHJ1Y3Rpb24gLSBpZiBUaHVtYgorCXN0cglyMiwgW3NwLCAjU19QQ10JCUAgbW9kZSBpdCdzIHR3byAxNi1iaXQgaW5zdHJ1Y3Rpb25zLAorCQkJCQlAIGVsc2UgaXQncyBvbmUgMzItYml0IGluc3RydWN0aW9uLCBzbworCQkJCQlAIGFsd2F5cyBzdWJ0cmFjdCA0IGZyb20gdGhlIGZvbGxvd2luZworCQkJCQlAIGluc3RydWN0aW9uIGFkZHJlc3MuCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKIAlnZXRfdGhyZWFkX2luZm8JcjEwCiAJbGRyCXI0LCBbcjEwLCAjVElfUFJFRU1QVF0JQCBnZXQgcHJlZW1wdCBjb3VudApkaWZmIC0tZ2l0IGEvY3J5cHRvL0tjb25maWcgYi9jcnlwdG8vS2NvbmZpZwppbmRleCA2Y2NhMGQyLi5hMTIyYWVkIDEwMDY0NAotLS0gYS9jcnlwdG8vS2NvbmZpZworKysgYi9jcnlwdG8vS2NvbmZpZwpAQCAtOTIzLDMgKzkyMyw2IEBACiBzb3VyY2UgImRyaXZlcnMvY3J5cHRvL0tjb25maWciCiAKIGVuZGlmCSMgaWYgQ1JZUFRPCisKK3NvdXJjZSAiY3J5cHRvL29jZi9LY29uZmlnIgorCmRpZmYgLS1naXQgYS9jcnlwdG8vTWFrZWZpbGUgYi9jcnlwdG8vTWFrZWZpbGUKaW5kZXggOWU2ZWVlMi4uM2NkZTlmOCAxMDA2NDQKLS0tIGEvY3J5cHRvL01ha2VmaWxlCisrKyBiL2NyeXB0by9NYWtlZmlsZQpAQCAtOTEsNiArOTEsOCBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIKSArPSBhbGdpZl9oYXNoLm8KIG9iai0kKENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVIpICs9IGFsZ2lmX3NrY2lwaGVyLm8KIAorb2JqLSQoQ09ORklHX09DRl9PQ0YpICs9IG9jZi8KKwogIwogIyBnZW5lcmljIGFsZ29yaXRobXMgYW5kIHRoZSBhc3luY190eCBhcGkKICMKZGlmZiAtLWdpdCBhL2NyeXB0by9vY2YvQ29uZmlnLmluIGIvY3J5cHRvL29jZi9Db25maWcuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyZjc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9vY2YvQ29uZmlnLmluCkBAIC0wLDAgKzEsMzggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK21haW5tZW51X29wdGlvbiBuZXh0X2NvbW1lbnQKK2NvbW1lbnQgJ09DRiBDb25maWd1cmF0aW9uJwordHJpc3RhdGUgJ09DRiAoT3BlbiBDcnlwdG9ncmFoaWMgRnJhbWV3b3JrKScgQ09ORklHX09DRl9PQ0YKK2RlcF9tYm9vbCAnICBlbmFibGUgZmlwcyBSTkcgY2hlY2tzIChmaXBzIGNoZWNrIG9uIFJORyBkYXRhIGJlZm9yZSB1c2UpJyBcCisJCQkJQ09ORklHX09DRl9GSVBTICRDT05GSUdfT0NGX09DRgorZGVwX21ib29sICcgIGVuYWJsZSBoYXJ2ZXN0aW5nIGVudHJvcHkgZm9yIC9kZXYvcmFuZG9tJyBcCisJCQkJQ09ORklHX09DRl9SQU5ET01IQVJWRVNUICRDT05GSUdfT0NGX09DRgorZGVwX3RyaXN0YXRlICcgIGNyeXB0b2RldiAodXNlciBzcGFjZSBzdXBwb3J0KScgXAorCQkJCUNPTkZJR19PQ0ZfQ1JZUFRPREVWICRDT05GSUdfT0NGX09DRgorZGVwX3RyaXN0YXRlICcgIGNyeXB0b3NvZnQgKHNvZnR3YXJlIGNyeXB0byBlbmdpbmUpJyBcCisJCQkJQ09ORklHX09DRl9DUllQVE9TT0ZUICRDT05GSUdfT0NGX09DRgorZGVwX3RyaXN0YXRlICcgIHNhZmVuZXQgKEhXIGNyeXB0byBlbmdpbmUpJyBcCisJCQkJQ09ORklHX09DRl9TQUZFICRDT05GSUdfT0NGX09DRgorZGVwX3RyaXN0YXRlICcgIElYUDR4eCAoSFcgY3J5cHRvIGVuZ2luZSknIFwKKwkJCQlDT05GSUdfT0NGX0lYUDRYWCAkQ09ORklHX09DRl9PQ0YKK2RlcF9tYm9vbCAgICAnICBFbmFibGUgSVhQNHh4IEhXIHRvIHBlcmZvcm0gU0hBMSBhbmQgTUQ1IGhhc2hpbmcgKHZlcnkgc2xvdyknIFwKKwkJCQlDT05GSUdfT0NGX0lYUDRYWF9TSEExX01ENSAkQ09ORklHX09DRl9JWFA0WFgKK2RlcF90cmlzdGF0ZSAnICBoaWZuIChIVyBjcnlwdG8gZW5naW5lKScgXAorCQkJCUNPTkZJR19PQ0ZfSElGTiAkQ09ORklHX09DRl9PQ0YKK2RlcF90cmlzdGF0ZSAnICB0YWxpdG9zIChIVyBjcnlwdG8gZW5naW5lKScgXAorCQkJCUNPTkZJR19PQ0ZfVEFMSVRPUyAkQ09ORklHX09DRl9PQ0YKK2RlcF90cmlzdGF0ZSAnICBwYXNlbWkgKEhXIGNyeXB0byBlbmdpbmUpJyBcCisJCQkJQ09ORklHX09DRl9QQVNFTUkgJENPTkZJR19PQ0ZfT0NGCitkZXBfdHJpc3RhdGUgJyAgZXA4MDU3OSAoSFcgY3J5cHRvIGVuZ2luZSknIFwKKwkJCQlDT05GSUdfT0NGX0VQODA1NzkgJENPTkZJR19PQ0ZfT0NGCitkZXBfdHJpc3RhdGUgJyAgTWljcm9uYXMgYzcxMDggKEhXIGNyeXB0byBlbmdpbmUpJyBcCisJCQkJQ09ORklHX09DRl9DNzEwOCAkQ09ORklHX09DRl9PQ0YKK2RlcF90cmlzdGF0ZSAnICB1QnNlYyBCQ001MzY1IChIVyBjcnlwdG8gZW5naW5lKScKKwkJCQlDT05GSUdfT0NGX1VCU0VDX1NTQiAkQ09ORklHX09DRl9PQ0YKK2RlcF90cmlzdGF0ZSAnICBvY2ZudWxsIChkb2VzIG5vIGNyeXB0byknIFwKKwkJCQlDT05GSUdfT0NGX09DRk5VTEwgJENPTkZJR19PQ0ZfT0NGCitkZXBfdHJpc3RhdGUgJyAgb2NmLWJlbmNoIChIVyBjcnlwdG8gaW4ta2VybmVsIGJlbmNobWFyayknIFwKKwkJCQlDT05GSUdfT0NGX0JFTkNIICRDT05GSUdfT0NGX09DRgorZW5kbWVudQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY3J5cHRvL29jZi9LY29uZmlnIGIvY3J5cHRvL29jZi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMDFjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vb2NmL0tjb25maWcKQEAgLTAsMCArMSw0OCBAQAorbWVudSAiT0NGIENvbmZpZ3VyYXRpb24iCisKK2NvbmZpZyBPQ0ZfT0NGCisJdHJpc3RhdGUgIk9DRiAoT3BlbiBDcnlwdG9ncmFoaWMgRnJhbWV3b3JrKSIKKwloZWxwCisJICBBIGxpbnV4IHBvcnQgb2YgdGhlIE9wZW5CU0QvRnJlZUJTRCBjcnlwdG8gZnJhbWV3b3JrLgorCitjb25maWcgT0NGX1JBTkRPTUhBUlZFU1QKKwlib29sICJjcnlwdG8gcmFuZG9tIC0tLSBoYXJ2ZXN0IGVudHJvcHkgZm9yIC9kZXYvcmFuZG9tIgorCWRlcGVuZHMgb24gT0NGX09DRgorCWhlbHAKKwkgIEluY2x1ZGVzIGNvZGUgdG8gaGFydmVzdCByYW5kb20gbnVtYmVycyBmcm9tIGRldmljZXMgdGhhdCBzdXBwb3J0IGl0LgorCitjb25maWcgT0NGX0ZJUFMKKwlib29sICJlbmFibGUgZmlwcyBSTkcgY2hlY2tzIgorCWRlcGVuZHMgb24gT0NGX09DRiAmJiBPQ0ZfUkFORE9NSEFSVkVTVAorCWhlbHAKKwkgIFJ1biBhbGwgUk5HIHByb3ZpZGVkIGRhdGEgdGhyb3VnaCBhIGZpcHMgY2hlY2sgYmVmb3JlCisJICBhZGRpbmcgaXQgL2Rldi9yYW5kb20ncyBlbnRyb3B5IHBvb2wuCisKK2NvbmZpZyBPQ0ZfQ1JZUFRPREVWCisJdHJpc3RhdGUgImNyeXB0b2RldiAodXNlciBzcGFjZSBzdXBwb3J0KSIKKwlkZXBlbmRzIG9uIE9DRl9PQ0YKKwloZWxwCisJICBUaGUgdXNlciBzcGFjZSBBUEkgdG8gYWNjZXNzIGNyeXB0byBoYXJkd2FyZS4KKworY29uZmlnIE9DRl9DUllQVE9TT0ZUCisJdHJpc3RhdGUgImNyeXB0b3NvZnQgKHNvZnR3YXJlIGNyeXB0byBlbmdpbmUpIgorCWRlcGVuZHMgb24gT0NGX09DRgorCWhlbHAKKwkgIEEgc29mdHdhcmUgZHJpdmVyIGZvciB0aGUgT0NGIGZyYW1ld29yayB0aGF0IHVzZXMKKwkgIHRoZSBrZXJuZWwgQ3J5cHRvQVBJLgorCitjb25maWcgT0NGX0JFTkNICisJdHJpc3RhdGUgIm9jZi1iZW5jaCAoSFcgY3J5cHRvIGluLWtlcm5lbCBiZW5jaG1hcmspIgorCWRlcGVuZHMgb24gT0NGX09DRgorCWhlbHAKKwkgIEEgdmVyeSBzaW1wbGUgZW5jcnlwdGlvbiB0ZXN0IGZvciB0aGUgaW4ta2VybmVsIGludGVyZmFjZQorCSAgb2YgT0NGLiAgQWxzbyBpbmNsdWRlcyBjb2RlIHRvIGJlbmNobWFyayB0aGUgSVhQIEFjY2VzcyBsaWJyYXJ5CisJICBmb3IgY29tcGFyaXNvbi4KKworY29uZmlnIE9DRl9ETV9DUllQVAorCWJvb2wgIm9jZi1kbS1jcnlwdCAoSFcgY3J5cHRvIGVuZ2luZSkiCisJZGVwZW5kcyBvbiBPQ0ZfT0NGCisJaGVscAorCU9DRiBzdXBwb3J0IGZvciBjcnlwdG8gb2ZmbG9hZGluZyBvZiBkbS1jcnlwdAorCitlbmRtZW51CmRpZmYgLS1naXQgYS9jcnlwdG8vb2NmL01ha2VmaWxlIGIvY3J5cHRvL29jZi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQ5Mjk0Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29jZi9NYWtlZmlsZQpAQCAtMCwwICsxLDEzNyBAQAorIyBmb3IgU0dsaW51eCBidWlsZHMKKy1pbmNsdWRlICQoUk9PVERJUikvbW9kdWxlcy8uY29uZmlnCisKK09DRl9PQkpTID0gY3J5cHRvLm8gY3Jpb3YubworCitpZmRlZiBDT05GSUdfT0NGX1JBTkRPTUhBUlZFU1QKKwlPQ0ZfT0JKUyArPSByYW5kb20ubworZW5kaWYKKworaWZkZWYgQ09ORklHX09DRl9GSVBTCisJT0NGX09CSlMgKz0gcm5kdGVzdC5vCitlbmRpZgorCisjIEFkZCBpbiBhdXRvY29uZi5oIHRvIGdldCAjZGVmaW5lcyBmb3IgQ09ORklHX3h4eAorQVVUT0NPTkZfSD0kKFJPT1RESVIpL21vZHVsZXMvYXV0b2NvbmYuaAoraWZlcSAoJChBVVRPQ09ORl9IKSwgJCh3aWxkY2FyZCAkKEFVVE9DT05GX0gpKSkKKwlFWFRSQV9DRkxBR1MgKz0gLWluY2x1ZGUgJChBVVRPQ09ORl9IKQorCWV4cG9ydCBFWFRSQV9DRkxBR1MKK2VuZGlmCisKK2lmbmRlZiBvYmoKKwlvYmogPz0gLgorCV9vYmogPSBzdWJkaXIKKwltb2Qtc3ViZGlycyA6PSBzYWZlIGhpZm4gaXhwNHh4IHRhbGl0b3Mgb2NmbnVsbAorCWV4cG9ydC1vYmpzICs9IGNyeXB0by5vIGNyaW92Lm8gcmFuZG9tLm8KKwlsaXN0LW11bHRpICs9IG9jZi5vCisJX3NsYXNoIDo9CitlbHNlCisJX29iaiA9IG9iagorCV9zbGFzaCA6PSAvCitlbmRpZgorCitFWFRSQV9DRkxBR1MgKz0gLUkkKG9iaikvLgorCitvYmotJChDT05GSUdfT0NGX09DRikgICAgICAgICArPSBvY2Yubworb2JqLSQoQ09ORklHX09DRl9DUllQVE9ERVYpICAgKz0gY3J5cHRvZGV2Lm8KK29iai0kKENPTkZJR19PQ0ZfQ1JZUFRPU09GVCkgICs9IGNyeXB0b3NvZnQubworb2JqLSQoQ09ORklHX09DRl9CRU5DSCkgICAgICAgKz0gb2NmLWJlbmNoLm8KKworCitvY2Ytb2JqcyA6PSAkKE9DRl9PQkpTKQorCitkdW1teToKKwlAZWNobyAiUGxlYXNlIGNvbnN1bHQgdGhlIFJFQURNRSBmb3IgaG93IHRvIGJ1aWxkIE9DRi4iCisJQGVjaG8gIklmIHlvdSBjYW4ndCB3YWl0IHRoZW4gdGhlIGZvbGxvd2luZyBzaG91bGQgZG8gaXQ6IgorCUBlY2hvICIiCisJQGVjaG8gIiAgICBtYWtlIG9jZl9tb2R1bGVzIgorCUBlY2hvICIgICAgc3VkbyBtYWtlIG9jZl9pbnN0YWxsIgorCUBlY2hvICIiCisJQGV4aXQgMQorCQorJChsaXN0LW11bHRpKSBkdW1teTE6ICQob2NmLW9ianMpCisJJChMRCkgLXIgLW8gJEAgJChvY2Ytb2JqcykKKworLlBIT05ZOgorY2xlYW46CisJcm0gLWYgKi5vICoua28gLiouby5mbGFncyAuKi5rby5jbWQgLiouby5jbWQgLioubW9kLm8uY21kICoubW9kLmMKKwlybSAtZiAqLyoubyAqLyoua28gKi8uKi5vLmNtZCAqLy4qLmtvLmNtZCAqLy4qLm1vZC5vLmNtZCAqLyoubW9kLmMgKi8uKi5vLmZsYWdzCisJcm0gLWYgKi9tb2R1bGVzLm9yZGVyICovbW9kdWxlcy5idWlsdGluIG1vZHVsZXMub3JkZXIgbW9kdWxlcy5idWlsdGluCisKK2lmZGVmIFRPUERJUgorLWluY2x1ZGUgJChUT1BESVIpL1J1bGVzLm1ha2UKK2VuZGlmCisKKyMKKyMgdGFyZ2V0cyB0byBidWlsZCBlYXNpbHkgb24gdGhlIGN1cnJlbnQgbWFjaGluZQorIworCitvY2ZfbWFrZToKKwltYWtlIC1DIC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9idWlsZCBNPWBwd2RgICQoT0NGX1RBUkdFVCkgQ09ORklHX09DRl9PQ0Y9bQorCW1ha2UgLUMgL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1aWxkIE09YHB3ZGAgJChPQ0ZfVEFSR0VUKSBDT05GSUdfT0NGX09DRj1tIENPTkZJR19PQ0ZfQ1JZUFRPU09GVD1tCisJLW1ha2UgLUMgL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1aWxkIE09YHB3ZGAgJChPQ0ZfVEFSR0VUKSBDT05GSUdfT0NGX09DRj1tIENPTkZJR19PQ0ZfQkVOQ0g9bQorCS1tYWtlIC1DIC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9idWlsZCBNPWBwd2RgICQoT0NGX1RBUkdFVCkgQ09ORklHX09DRl9PQ0Y9bSBDT05GSUdfT0NGX09DRk5VTEw9bQorCS1tYWtlIC1DIC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9idWlsZCBNPWBwd2RgICQoT0NGX1RBUkdFVCkgQ09ORklHX09DRl9PQ0Y9bSBDT05GSUdfT0NGX0hJRk49bQorCitvY2ZfbW9kdWxlczoKKwkkKE1BS0UpIG9jZl9tYWtlIE9DRl9UQVJHRVQ9bW9kdWxlcworCitvY2ZfaW5zdGFsbDoKKwkkKE1BS0UpIG9jZl9tYWtlIE9DRl9UQVJHRVQ9Im1vZHVsZXMgbW9kdWxlc19pbnN0YWxsIgorCWRlcG1vZAorCW1rZGlyIC1wIC91c3IvaW5jbHVkZS9jcnlwdG8KKwljcCBjcnlwdG9kZXYuaCAvdXNyL2luY2x1ZGUvY3J5cHRvLy4KKworIworIyBnZW5lcmF0ZSBmdWxsIGtlcm5lbCBwYXRjaGVzIGZvciAyLjQgYW5kIDIuNiBrZXJuZWxzIHRvIG1ha2UgcGF0Y2hpbmcKKyMgeW91ciBrZXJuZWwgZWFzaWVyCisjCisKKy5QSE9OWTogcGF0Y2gKK3BhdGNoOgorCXBhdGNoYmFzZT0uOyBcCisJCVsgLWQgJCRwYXRjaGJhc2UvcGF0Y2hlcyBdIHx8IHBhdGNoYmFzZT0uLjsgXAorCQlwYXRjaD1vY2YtbGludXgtYmFzZS5wYXRjaDsgXAorCQlwYXRjaDI0PW9jZi1saW51eC0yNC5wYXRjaDsgXAorCQlwYXRjaDI2PW9jZi1saW51eC0yNi5wYXRjaDsgXAorCQlwYXRjaDM9b2NmLWxpbnV4LTMucGF0Y2g7IFwKKwkJKCBcCisJCQlmaW5kIC4gLW5hbWUgTWFrZWZpbGU7IFwKKwkJCWZpbmQgLiAtbmFtZSBDb25maWcuaW47IFwKKwkJCWZpbmQgLiAtbmFtZSBLY29uZmlnOyBcCisJCQlmaW5kIC4gLW5hbWUgUkVBRE1FOyBcCisJCQlmaW5kIC4gLW5hbWUgJyouW2NoXScgfCBncmVwIC12ICcubW9kLmMnOyBcCisJCSkgfCB3aGlsZSByZWFkIHQ7IGRvIFwKKwkJCWRpZmYgLU5hdSAvZGV2L251bGwgJCR0IHwgc2VkICdzP14rKysgXC4vPysrKyBsaW51eC9jcnlwdG8vb2NmLz8nOyBcCisJCWRvbmUgPiAkJHBhdGNoOyBcCisJCWNhdCAkJHBhdGNoYmFzZS9wYXRjaGVzL2xpbnV4LTIuNC4zNS1vY2YucGF0Y2ggJCRwYXRjaCA+ICQkcGF0Y2gyNDsgXAorCQljYXQgJCRwYXRjaGJhc2UvcGF0Y2hlcy9saW51eC0yLjYuMzgtb2NmLnBhdGNoICQkcGF0Y2ggPiAkJHBhdGNoMjY7IFwKKwkJY2F0ICQkcGF0Y2hiYXNlL3BhdGNoZXMvbGludXgtMy4yLjEtb2NmLnBhdGNoICQkcGF0Y2ggPiAkJHBhdGNoMzsgXAorCisKKyMKKyMgdGhpcyB0YXJnZXQgcHJvYmFibHkgZG9lcyBub3RoaW5nIGZvciBhbnlvbmUgYnV0IG1lIC0gZGF2aWRtCisjCisKKy5QSE9OWTogcmVsZWFzZQorcmVsZWFzZToKKwlSRUw9YGRhdGUgKyVZJW0lZGA7IFJFTERJUj0vdG1wL29jZi1saW51eC0kJFJFTDsgXAorCQlDVVJESVI9YHB3ZGA7IFwKKwkJcm0gLXJmIC90bXAvb2NmLWxpbnV4LSQkUkVMKjsgXAorCQlta2RpciAtcCAkJFJFTERJUi9vY2Y7IFwKKwkJbWtkaXIgLXAgJCRSRUxESVIvcGF0Y2hlczsgXAorCQlta2RpciAtcCAkJFJFTERJUi9jcnlwdG8tdG9vbHM7IFwKKwkJY3AgUkVBRE1FKiAkJFJFTERJUi8uOyBcCisJCWNwIHBhdGNoZXMvWyFDXSogJCRSRUxESVIvcGF0Y2hlcy8uOyBcCisJCWNwIHRvb2xzL1shQ10qICQkUkVMRElSL2NyeXB0by10b29scy8uOyBcCisJCWNwIC1yIFshQ10qIENvbmZpZy5pbiAkJFJFTERJUi9vY2YvLjsgXAorCQlybSAtcmYgJCRSRUxESVIvb2NmL3BhdGNoZXMgJCRSRUxESVIvb2NmL3Rvb2xzOyBcCisJCXJtIC1mICQkUkVMRElSL29jZi9SRUFETUUqOyBcCisJCWNwICQkQ1VSRElSLy4uLy4uL3VzZXIvY3J5cHRvLXRvb2xzL1shQ10qICQkUkVMRElSL2NyeXB0by10b29scy8uOyBcCisJCW1ha2UgLUMgJCRSRUxESVIvY3J5cHRvLXRvb2xzIGNsZWFuOyBcCisJCW1ha2UgLUMgJCRSRUxESVIvb2NmIGNsZWFuOyBcCisJCWZpbmQgJCRSRUxESVIvb2NmIC1uYW1lIENWUyB8IHhhcmdzIHJtIC1yZjsgXAorCQljZCAkJFJFTERJUi8uLjsgXAorCQl0YXIgY3ZmIG9jZi1saW51eC0kJFJFTC50YXIgb2NmLWxpbnV4LSQkUkVMOyBcCisJCWd6aXAgLTkgb2NmLWxpbnV4LSQkUkVMLnRhcgorCmRpZmYgLS1naXQgYS9jcnlwdG8vb2NmL2NyaW92LmMgYi9jcnlwdG8vb2NmL2NyaW92LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjMWE4YwotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9vY2YvY3Jpb3YuYwpAQCAtMCwwICsxLDIxNSBAQAorLyogICAgICAkT3BlbkJTRDogY3Jpb3YuYyx2IDEuOSAyMDAyLzAxLzI5IDE1OjQ4OjI5IGphc29uIEV4cCAkCSovCisKKy8qCisgKiBMaW51eCBwb3J0IGRvbmUgYnkgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRfbWNjdWxsb3VnaEBtY2FmZWUuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgRGF2aWQgTWNDdWxsb3VnaAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBUaGUgbGljZW5zZSBhbmQgb3JpZ2luYWwgYXV0aG9yIGFyZSBsaXN0ZWQgYmVsb3cuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZW8gZGUgUmFhZHQKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL3N5cy9vcGVuY3J5cHRvL2NyaW92LmMsdiAxLjUgMjAwNi8wNi8wNCAyMjoxNToxMyBwamQgRXhwICQiKTsKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkgJiYgIWRlZmluZWQoQVVUT0NPTkZfSU5DTFVERUQpCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDx1aW8uaD4KKyNpbmNsdWRlIDxjcnlwdG9kZXYuaD4KKworLyoKKyAqIFRoaXMgbWFjcm8gaXMgb25seSBmb3IgYXZvaWRpbmcgY29kZSBkdXBsaWNhdGlvbiwgYXMgd2UgbmVlZCB0byBza2lwCisgKiBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNhbWUgd2F5IGluIHRocmVlIGZ1bmN0aW9ucyBiZWxvdy4KKyAqLworI2RlZmluZQlDVUlPX1NLSVAoKQlkbyB7CQkJCQkJXAorCUtBU1NFUlQob2ZmID49IDAsICgiJXM6IG9mZiAlZCA8IDAiLCBfX2Z1bmNfXywgb2ZmKSk7CQlcCisJS0FTU0VSVChsZW4gPj0gMCwgKCIlczogbGVuICVkIDwgMCIsIF9fZnVuY19fLCBsZW4pKTsJCVwKKwl3aGlsZSAob2ZmID4gMCkgewkJCQkJCVwKKwkJS0FTU0VSVChpb2wgPj0gMCwgKCIlczogZW1wdHkgaW4gc2tpcCIsIF9fZnVuY19fKSk7CVwKKwkJaWYgKG9mZiA8IGlvdi0+aW92X2xlbikJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJb2ZmIC09IGlvdi0+aW92X2xlbjsJCQkJCVwKKwkJaW9sLS07CQkJCQkJCVwKKwkJaW92Kys7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCit2b2lkCitjdWlvX2NvcHlkYXRhKHN0cnVjdCB1aW8qIHVpbywgaW50IG9mZiwgaW50IGxlbiwgY2FkZHJfdCBjcCkKK3sKKwlzdHJ1Y3QgaW92ZWMgKmlvdiA9IHVpby0+dWlvX2lvdjsKKwlpbnQgaW9sID0gdWlvLT51aW9faW92Y250OworCXVuc2lnbmVkIGNvdW50OworCisJQ1VJT19TS0lQKCk7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJS0FTU0VSVChpb2wgPj0gMCwgKCIlczogZW1wdHkiLCBfX2Z1bmNfXykpOworCQljb3VudCA9IG1pbigoaW50KShpb3YtPmlvdl9sZW4gLSBvZmYpLCBsZW4pOworCQltZW1jcHkoY3AsICgoY2FkZHJfdClpb3YtPmlvdl9iYXNlKSArIG9mZiwgY291bnQpOworCQlsZW4gLT0gY291bnQ7CisJCWNwICs9IGNvdW50OworCQlvZmYgPSAwOworCQlpb2wtLTsKKwkJaW92Kys7CisJfQorfQorCit2b2lkCitjdWlvX2NvcHliYWNrKHN0cnVjdCB1aW8qIHVpbywgaW50IG9mZiwgaW50IGxlbiwgY2FkZHJfdCBjcCkKK3sKKwlzdHJ1Y3QgaW92ZWMgKmlvdiA9IHVpby0+dWlvX2lvdjsKKwlpbnQgaW9sID0gdWlvLT51aW9faW92Y250OworCXVuc2lnbmVkIGNvdW50OworCisJQ1VJT19TS0lQKCk7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJS0FTU0VSVChpb2wgPj0gMCwgKCIlczogZW1wdHkiLCBfX2Z1bmNfXykpOworCQljb3VudCA9IG1pbigoaW50KShpb3YtPmlvdl9sZW4gLSBvZmYpLCBsZW4pOworCQltZW1jcHkoKChjYWRkcl90KWlvdi0+aW92X2Jhc2UpICsgb2ZmLCBjcCwgY291bnQpOworCQlsZW4gLT0gY291bnQ7CisJCWNwICs9IGNvdW50OworCQlvZmYgPSAwOworCQlpb2wtLTsKKwkJaW92Kys7CisJfQorfQorCisvKgorICogUmV0dXJuIGEgcG9pbnRlciB0byBpb3Yvb2Zmc2V0IG9mIGxvY2F0aW9uIGluIGlvdmVjIGxpc3QuCisgKi8KK3N0cnVjdCBpb3ZlYyAqCitjdWlvX2dldHB0cihzdHJ1Y3QgdWlvICp1aW8sIGludCBsb2MsIGludCAqb2ZmKQoreworCXN0cnVjdCBpb3ZlYyAqaW92ID0gdWlvLT51aW9faW92OworCWludCBpb2wgPSB1aW8tPnVpb19pb3ZjbnQ7CisKKwl3aGlsZSAobG9jID49IDApIHsKKwkJLyogTm9ybWFsIGVuZCBvZiBzZWFyY2ggKi8KKwkJaWYgKGxvYyA8IGlvdi0+aW92X2xlbikgeworCSAgICAJCSpvZmYgPSBsb2M7CisJICAgIAkJcmV0dXJuIChpb3YpOworCQl9CisKKwkJbG9jIC09IGlvdi0+aW92X2xlbjsKKwkJaWYgKGlvbCA9PSAwKSB7CisJCQlpZiAobG9jID09IDApIHsKKwkJCQkvKiBQb2ludCBhdCB0aGUgZW5kIG9mIHZhbGlkIGRhdGEgKi8KKwkJCQkqb2ZmID0gaW92LT5pb3ZfbGVuOworCQkJCXJldHVybiAoaW92KTsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAoTlVMTCk7CisJCX0gZWxzZSB7CisJCQlpb3YrKywgaW9sLS07CisJCX0KKyAgICAJfQorCisJcmV0dXJuIChOVUxMKTsKK30KKworRVhQT1JUX1NZTUJPTChjdWlvX2NvcHliYWNrKTsKK0VYUE9SVF9TWU1CT0woY3Vpb19jb3B5ZGF0YSk7CitFWFBPUlRfU1lNQk9MKGN1aW9fZ2V0cHRyKTsKKworc3RhdGljIHZvaWQKK3NrYl9jb3B5X2JpdHNfYmFjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LCBjYWRkcl90IGNwLCBpbnQgbGVuKQoreworCWludCBpOworCWlmIChvZmZzZXQgPCBza2JfaGVhZGxlbihza2IpKSB7CisJCW1lbWNweShza2ItPmRhdGEgKyBvZmZzZXQsIGNwLCBtaW5fdChpbnQsIHNrYl9oZWFkbGVuKHNrYiksIGxlbikpOworCQlsZW4gLT0gc2tiX2hlYWRsZW4oc2tiKTsKKwkJY3AgKz0gc2tiX2hlYWRsZW4oc2tiKTsKKwl9CisJb2Zmc2V0IC09IHNrYl9oZWFkbGVuKHNrYik7CisJZm9yIChpID0gMDsgbGVuID4gMCAmJiBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7CisJCWlmIChvZmZzZXQgPCBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemUpIHsKKwkJCW1lbWNweShwYWdlX2FkZHJlc3Moc2tiX2ZyYWdfcGFnZSgmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXSkpICsKKwkJCQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5wYWdlX29mZnNldCwKKwkJCQkJY3AsIG1pbl90KGludCwgc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplLCBsZW4pKTsKKwkJCWxlbiAtPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCQljcCArPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCX0KKwkJb2Zmc2V0IC09IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKKwl9Cit9CisKK3ZvaWQKK2NyeXB0b19jb3B5YmFjayhpbnQgZmxhZ3MsIGNhZGRyX3QgYnVmLCBpbnQgb2ZmLCBpbnQgc2l6ZSwgY2FkZHJfdCBpbikKK3sKKworCWlmICgoZmxhZ3MgJiBDUllQVE9fRl9TS0JVRikgIT0gMCkKKwkJc2tiX2NvcHlfYml0c19iYWNrKChzdHJ1Y3Qgc2tfYnVmZiAqKWJ1Ziwgb2ZmLCBpbiwgc2l6ZSk7CisJZWxzZSBpZiAoKGZsYWdzICYgQ1JZUFRPX0ZfSU9WKSAhPSAwKQorCQljdWlvX2NvcHliYWNrKChzdHJ1Y3QgdWlvICopYnVmLCBvZmYsIHNpemUsIGluKTsKKwllbHNlCisJCWJjb3B5KGluLCBidWYgKyBvZmYsIHNpemUpOworfQorCit2b2lkCitjcnlwdG9fY29weWRhdGEoaW50IGZsYWdzLCBjYWRkcl90IGJ1ZiwgaW50IG9mZiwgaW50IHNpemUsIGNhZGRyX3Qgb3V0KQoreworCisJaWYgKChmbGFncyAmIENSWVBUT19GX1NLQlVGKSAhPSAwKQorCQlza2JfY29weV9iaXRzKChzdHJ1Y3Qgc2tfYnVmZiAqKWJ1Ziwgb2ZmLCBvdXQsIHNpemUpOworCWVsc2UgaWYgKChmbGFncyAmIENSWVBUT19GX0lPVikgIT0gMCkKKwkJY3Vpb19jb3B5ZGF0YSgoc3RydWN0IHVpbyAqKWJ1Ziwgb2ZmLCBzaXplLCBvdXQpOworCWVsc2UKKwkJYmNvcHkoYnVmICsgb2ZmLCBvdXQsIHNpemUpOworfQorCitpbnQKK2NyeXB0b19hcHBseShpbnQgZmxhZ3MsIGNhZGRyX3QgYnVmLCBpbnQgb2ZmLCBpbnQgbGVuLAorICAgIGludCAoKmYpKHZvaWQgKiwgdm9pZCAqLCB1X2ludCksIHZvaWQgKmFyZykKK3sKKyNpZiAwCisJaW50IGVycm9yOworCisJaWYgKChmbGFncyAmIENSWVBUT19GX1NLQlVGKSAhPSAwKQorCQllcnJvciA9IFhYWFhYWCgoc3RydWN0IG1idWYgKilidWYsIG9mZiwgbGVuLCBmLCBhcmcpOworCWVsc2UgaWYgKChmbGFncyAmIENSWVBUT19GX0lPVikgIT0gMCkKKwkJZXJyb3IgPSBjdWlvX2FwcGx5KChzdHJ1Y3QgdWlvICopYnVmLCBvZmYsIGxlbiwgZiwgYXJnKTsKKwllbHNlCisJCWVycm9yID0gKCpmKShhcmcsIGJ1ZiArIG9mZiwgbGVuKTsKKwlyZXR1cm4gKGVycm9yKTsKKyNlbHNlCisJS0FTU0VSVCgwLCAoImNyeXB0b19hcHBseSBub3QgaW1wbGVtZW50ZWQhXG4iKSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChjcnlwdG9fY29weWJhY2spOworRVhQT1JUX1NZTUJPTChjcnlwdG9fY29weWRhdGEpOworRVhQT1JUX1NZTUJPTChjcnlwdG9fYXBwbHkpOworCmRpZmYgLS1naXQgYS9jcnlwdG8vb2NmL2NyeXB0by5jIGIvY3J5cHRvL29jZi9jcnlwdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzIyMzYxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29jZi9jcnlwdG8uYwpAQCAtMCwwICsxLDE3NjYgQEAKKy8qLQorICogTGludXggcG9ydCBkb25lIGJ5IERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkX21jY3VsbG91Z2hAbWNhZmVlLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIERhdmlkIE1jQ3VsbG91Z2gKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEludGVsIENvcnBvcmF0aW9uLgorICogVGhlIGxpY2Vuc2UgYW5kIG9yaWdpbmFsIGF1dGhvciBhcmUgbGlzdGVkIGJlbG93LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDYgU2FtIExlZmZsZXIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIDAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL3N5cy9vcGVuY3J5cHRvL2NyeXB0by5jLHYgMS4yNyAyMDA3LzAzLzIxIDAzOjQyOjUxIHNhbSBFeHAgJCIpOworI2VuZGlmCisKKy8qCisgKiBDcnlwdG9ncmFwaGljIFN1YnN5c3RlbS4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBPcGVuYnNkIENyeXB0b2dyYXBoaWMgRnJhbWV3b3JrIChPQ0YpCisgKiB0aGF0IGhhcyB0aGUgY29weXJpZ2h0IHNob3duIGJlbG93LiAgVmVyeSBsaXR0bGUgb2YgdGhlIG9yaWdpbmFsCisgKiBjb2RlIHJlbWFpbnMuCisgKi8KKy8qLQorICogVGhlIGF1dGhvciBvZiB0aGlzIGNvZGUgaXMgQW5nZWxvcyBELiBLZXJvbXl0aXMgKGFuZ2Vsb3NAY2lzLnVwZW5uLmVkdSkKKyAqCisgKiBUaGlzIGNvZGUgd2FzIHdyaXR0ZW4gYnkgQW5nZWxvcyBELiBLZXJvbXl0aXMgaW4gQXRoZW5zLCBHcmVlY2UsIGluCisgKiBGZWJydWFyeSAyMDAwLiBOZXR3b3JrIFNlY3VyaXR5IFRlY2hub2xvZ2llcyBJbmMuIChOU1RJKSBraW5kbHkKKyAqIHN1cHBvcnRlZCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBBbmdlbG9zIEQuIEtlcm9teXRpcworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBhbmQgbW9kaWZ5IHRoaXMgc29mdHdhcmUgd2l0aCBvciB3aXRob3V0IGZlZQorICogaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBlbnRpcmUgbm90aWNlIGlzIGluY2x1ZGVkIGluCisgKiBhbGwgc291cmNlIGNvZGUgY29waWVzIG9mIGFueSBzb2Z0d2FyZSB3aGljaCBpcyBvciBpbmNsdWRlcyBhIGNvcHkgb3IKKyAqIG1vZGlmaWNhdGlvbiBvZiB0aGlzIHNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5UWS4gSU4gUEFSVElDVUxBUiwgTk9ORSBPRiBUSEUgQVVUSE9SUyBNQUtFUyBBTlkKKyAqIFJFUFJFU0VOVEFUSU9OIE9SIFdBUlJBTlRZIE9GIEFOWSBLSU5EIENPTkNFUk5JTkcgVEhFCisgKiBNRVJDSEFOVEFCSUxJVFkgT0YgVEhJUyBTT0ZUV0FSRSBPUiBJVFMgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UuCisgKgorX19GQlNESUQoIiRGcmVlQlNEOiBzcmMvc3lzL29wZW5jcnlwdG8vY3J5cHRvLmMsdiAxLjE2IDIwMDUvMDEvMDcgMDI6Mjk6MTYgaW1wIEV4cCAkIik7CisgKi8KKworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkgJiYgIWRlZmluZWQoQVVUT0NPTkZfSU5DTFVERUQpCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsNCkKKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxjcnlwdG9kZXYuaD4KKworLyoKKyAqIGtlZXAgdHJhY2sgb2Ygd2hldGhlciBvciBub3Qgd2UgaGF2ZSBiZWVuIGluaXRpYWxpc2VkLCBhIGJpZworICogaXNzdWUgaWYgd2UgYXJlIGxpbmtlZCBpbnRvIHRoZSBrZXJuZWwgYW5kIGEgZHJpdmVyIGdldHMgc3RhcnRlZCBiZWZvcmUKKyAqIHVzCisgKi8KK3N0YXRpYyBpbnQgY3J5cHRvX2luaXR0ZWQgPSAwOworCisvKgorICogQ3J5cHRvIGRyaXZlcnMgcmVnaXN0ZXIgdGhlbXNlbHZlcyBieSBhbGxvY2F0aW5nIGEgc2xvdCBpbiB0aGUKKyAqIGNyeXB0b19kcml2ZXJzIHRhYmxlIHdpdGggY3J5cHRvX2dldF9kcml2ZXJpZCgpIGFuZCB0aGVuIHJlZ2lzdGVyaW5nCisgKiBlYWNoIGFsZ29yaXRobSB0aGV5IHN1cHBvcnQgd2l0aCBjcnlwdG9fcmVnaXN0ZXIoKSBhbmQgY3J5cHRvX2tyZWdpc3RlcigpLgorICovCisKKy8qCisgKiBsb2NrIG9uIGRyaXZlciB0YWJsZQorICogd2UgdHJhY2sgaXRzIHN0YXRlIGFzIHNwaW5faXNfbG9ja2VkIGRvZXMgbm90IGRvIGFueXRoaW5nIG9uIG5vbi1TTVAgYm94ZXMKKyAqLworc3RhdGljIHNwaW5sb2NrX3QJY3J5cHRvX2RyaXZlcnNfbG9jazsKK3N0YXRpYyBpbnQJCQljcnlwdG9fZHJpdmVyc19sb2NrZWQ7CQkvKiBmb3Igbm9uLVNNUCBib3hlcyAqLworCisjZGVmaW5lCUNSWVBUT19EUklWRVJfTE9DSygpIFwKKwkJCSh7IFwKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3J5cHRvX2RyaXZlcnNfbG9jaywgZF9mbGFncyk7IFwKKwkJCSAJY3J5cHRvX2RyaXZlcnNfbG9ja2VkID0gMTsgXAorCQkJCWRwcmludGsoIiVzLCVkOiBEUklWRVJfTE9DSygpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJCQkgfSkKKyNkZWZpbmUJQ1JZUFRPX0RSSVZFUl9VTkxPQ0soKSBcCisJCQkoeyBcCisJCQkgCWRwcmludGsoIiVzLCVkOiBEUklWRVJfVU5MT0NLKClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwkJCSAJY3J5cHRvX2RyaXZlcnNfbG9ja2VkID0gMDsgXAorCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNyeXB0b19kcml2ZXJzX2xvY2ssIGRfZmxhZ3MpOyBcCisJCQkgfSkKKyNkZWZpbmUJQ1JZUFRPX0RSSVZFUl9BU1NFUlQoKSBcCisJCQkoeyBcCisJCQkgCWlmICghY3J5cHRvX2RyaXZlcnNfbG9ja2VkKSB7IFwKKwkJCQkJZHByaW50aygiJXMsJWQ6IERSSVZFUl9BU1NFUlQhXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJCQkgCX0gXAorCQkJIH0pCisKKy8qCisgKiBDcnlwdG8gZGV2aWNlL2RyaXZlciBjYXBhYmlsaXRpZXMgc3RydWN0dXJlLgorICoKKyAqIFN5bmNocm9uaXphdGlvbjoKKyAqIChkKSAtIHByb3RlY3RlZCBieSBDUllQVE9fRFJJVkVSX0xPQ0soKQorICogKHEpIC0gcHJvdGVjdGVkIGJ5IENSWVBUT19RX0xPQ0soKQorICogTm90IHRhZ2dlZCBmaWVsZHMgYXJlIHJlYWQtb25seS4KKyAqLworc3RydWN0IGNyeXB0b2NhcCB7CisJZGV2aWNlX3QJY2NfZGV2OwkJCS8qIChkKSBkZXZpY2UvZHJpdmVyICovCisJdV9pbnQzMl90CWNjX3Nlc3Npb25zOwkJLyogKGQpICMgb2Ygc2Vzc2lvbnMgKi8KKwl1X2ludDMyX3QJY2Nfa29wZXJhdGlvbnM7CQkvKiAoZCkgIyBvcyBhc3ltIG9wZXJhdGlvbnMgKi8KKwkvKgorCSAqIExhcmdlc3QgcG9zc2libGUgb3BlcmF0b3IgbGVuZ3RoIChpbiBiaXRzKSBmb3IgZWFjaCB0eXBlIG9mCisJICogZW5jcnlwdGlvbiBhbGdvcml0aG0uIFhYWCBub3QgdXNlZAorCSAqLworCXVfaW50MTZfdAljY19tYXhfb3BfbGVuW0NSWVBUT19BTEdPUklUSE1fTUFYICsgMV07CisJdV9pbnQ4X3QJY2NfYWxnW0NSWVBUT19BTEdPUklUSE1fTUFYICsgMV07CisJdV9pbnQ4X3QJY2Nfa2FsZ1tDUktfQUxHT1JJVEhNX01BWCArIDFdOworCisJaW50CQljY19mbGFnczsJCS8qIChkKSBmbGFncyAqLworI2RlZmluZSBDUllQVE9DQVBfRl9DTEVBTlVQCTB4ODAwMDAwMDAJLyogbmVlZHMgcmVzb3VyY2UgY2xlYW51cCAqLworCWludAkJY2NfcWJsb2NrZWQ7CQkvKiAocSkgc3ltbWV0cmljIHEgYmxvY2tlZCAqLworCWludAkJY2Nfa3FibG9ja2VkOwkJLyogKHEpIGFzeW1tZXRyaWMgcSBibG9ja2VkICovCisKKwlpbnQJCWNjX3VucWJsb2NrZWQ7CQkvKiAocSkgc3ltbWV0cmljIHEgYmxvY2tlZCAqLworCWludAkJY2NfdW5rcWJsb2NrZWQ7CQkvKiAocSkgYXN5bW1ldHJpYyBxIGJsb2NrZWQgKi8KK307CitzdGF0aWMgc3RydWN0IGNyeXB0b2NhcCAqY3J5cHRvX2RyaXZlcnMgPSBOVUxMOworc3RhdGljIGludCBjcnlwdG9fZHJpdmVyc19udW0gPSAwOworCisvKgorICogVGhlcmUgYXJlIHR3byBxdWV1ZXMgZm9yIGNyeXB0byByZXF1ZXN0czsgb25lIGZvciBzeW1tZXRyaWMgKGUuZy4KKyAqIGNpcGhlcikgb3BlcmF0aW9ucyBhbmQgb25lIGZvciBhc3ltbWV0cmljIChlLmcuIE1PRClvcGVyYXRpb25zLgorICogQSBzaW5nbGUgbXV0ZXggaXMgdXNlZCB0byBsb2NrIGFjY2VzcyB0byBib3RoIHF1ZXVlcy4gIFdlIGNvdWxkCisgKiBoYXZlIG9uZSBwZXItcXVldWUgYnV0IGhhdmluZyBvbmUgc2ltcGxpZmllcyBoYW5kbGluZyBvZiBibG9jay91bmJsb2NrCisgKiBvcGVyYXRpb25zLgorICovCitzdGF0aWMgTElTVF9IRUFEKGNycF9xKTsJCS8qIGNyeXB0byByZXF1ZXN0IHF1ZXVlICovCitzdGF0aWMgTElTVF9IRUFEKGNycF9rcSk7CQkvKiBhc3ltIHJlcXVlc3QgcXVldWUgKi8KKworc3RhdGljIHNwaW5sb2NrX3QgY3J5cHRvX3FfbG9jazsKKworaW50IGNyeXB0b19hbGxfcWJsb2NrZWQgPSAwOyAgLyogcHJvdGVjdCB3aXRoIFFfTE9DSyAqLworbW9kdWxlX3BhcmFtKGNyeXB0b19hbGxfcWJsb2NrZWQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNyeXB0b19hbGxfcWJsb2NrZWQsICJBcmUgYWxsIGNyeXB0byBxdWV1ZXMgYmxvY2tlZCIpOworCitpbnQgY3J5cHRvX2FsbF9rcWJsb2NrZWQgPSAwOyAvKiBwcm90ZWN0IHdpdGggUV9MT0NLICovCittb2R1bGVfcGFyYW0oY3J5cHRvX2FsbF9rcWJsb2NrZWQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNyeXB0b19hbGxfa3FibG9ja2VkLCAiQXJlIGFsbCBhc3ltIGNyeXB0byBxdWV1ZXMgYmxvY2tlZCIpOworCisjZGVmaW5lCUNSWVBUT19RX0xPQ0soKSBcCisJCQkoeyBcCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNyeXB0b19xX2xvY2ssIHFfZmxhZ3MpOyBcCisJCQkgCWRwcmludGsoIiVzLCVkOiBRX0xPQ0soKVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCQkJIH0pCisjZGVmaW5lCUNSWVBUT19RX1VOTE9DSygpIFwKKwkJCSh7IFwKKwkJCSAJZHByaW50aygiJXMsJWQ6IFFfVU5MT0NLKClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcnlwdG9fcV9sb2NrLCBxX2ZsYWdzKTsgXAorCQkJIH0pCisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIHF1ZXVlcyBmb3IgcHJvY2Vzc2luZyBjb21wbGV0ZWQgY3J5cHRvIHJlcXVlc3RzOyBvbmUKKyAqIGZvciB0aGUgc3ltbWV0cmljIGFuZCBvbmUgZm9yIHRoZSBhc3ltbWV0cmljIG9wcy4gIFdlIG9ubHkgbmVlZCBvbmUKKyAqIGJ1dCBoYXZlIHR3byB0byBhdm9pZCB0eXBlIGZ1dHppbmcgKGNyeXB0b3AgdnMuIGNyeXB0a29wKS4gIEEgc2luZ2xlCisgKiBtdXRleCBpcyB1c2VkIHRvIGxvY2sgYWNjZXNzIHRvIGJvdGggcXVldWVzLiAgTm90ZSB0aGF0IHRoaXMgbG9jaworICogbXVzdCBiZSBzZXBhcmF0ZSBmcm9tIHRoZSBsb2NrIG9uIHJlcXVlc3QgcXVldWVzIHRvIGluc3VyZSBkcml2ZXIKKyAqIGNhbGxiYWNrcyBkb24ndCBnZW5lcmF0ZSBsb2NrIG9yZGVyIHJldmVyc2Fscy4KKyAqLworc3RhdGljIExJU1RfSEVBRChjcnBfcmV0X3EpOwkJLyogY2FsbGJhY2sgcXVldWVzICovCitzdGF0aWMgTElTVF9IRUFEKGNycF9yZXRfa3EpOworCitzdGF0aWMgc3BpbmxvY2tfdCBjcnlwdG9fcmV0X3FfbG9jazsKKyNkZWZpbmUJQ1JZUFRPX1JFVFFfTE9DSygpIFwKKwkJCSh7IFwKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3J5cHRvX3JldF9xX2xvY2ssIHJfZmxhZ3MpOyBcCisJCQkJZHByaW50aygiJXMsJWQ6IFJFVFFfTE9DS1xuIiwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCQkJIH0pCisjZGVmaW5lCUNSWVBUT19SRVRRX1VOTE9DSygpIFwKKwkJCSh7IFwKKwkJCSAJZHByaW50aygiJXMsJWQ6IFJFVFFfVU5MT0NLXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3J5cHRvX3JldF9xX2xvY2ssIHJfZmxhZ3MpOyBcCisJCQkgfSkKKyNkZWZpbmUJQ1JZUFRPX1JFVFFfRU1QVFkoKQkobGlzdF9lbXB0eSgmY3JwX3JldF9xKSAmJiBsaXN0X2VtcHR5KCZjcnBfcmV0X2txKSkKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmNyeXB0b3Bfem9uZTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmNyeXB0b2Rlc2Nfem9uZTsKKyNlbHNlCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmNyeXB0b3Bfem9uZTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY3J5cHRvZGVzY196b25lOworI2VuZGlmCisKKyNkZWZpbmUgZGVidWcgY3J5cHRvX2RlYnVnCitpbnQgY3J5cHRvX2RlYnVnID0gMDsKK21vZHVsZV9wYXJhbShjcnlwdG9fZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNyeXB0b19kZWJ1ZywgIkVuYWJsZSBkZWJ1ZyIpOworRVhQT1JUX1NZTUJPTChjcnlwdG9fZGVidWcpOworCisvKgorICogTWF4aW11bSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgY3J5cHRvIHJlcXVlc3RzIGJlZm9yZSB3ZSBzdGFydAorICogZmFpbGluZyByZXF1ZXN0cy4gIFdlIG5lZWQgdGhpcyB0byBwcmV2ZW50IERPUyB3aGVuIHRvbyBtYW55CisgKiByZXF1ZXN0cyBhcmUgYXJyaXZpbmcgZm9yIHVzIHRvIGtlZXAgdXAuICBPdGhlcndpc2Ugd2Ugd2lsbAorICogcnVuIHRoZSBzeXN0ZW0gb3V0IG9mIG1lbW9yeS4gIFNpbmNlIGNyeXB0byBpcyBzbG93LCAgd2UgYXJlCisgKiB1c3VhbGx5IHRoZSBib3R0bGVuZWNrIHRoYXQgbmVlZHMgdG8gc2F5LCBlbm91Z2ggaXMgZW5vdWdoLgorICoKKyAqIFdlIGNhbm5vdCBwcmludCBlcnJvcnMgd2hlbiB0aGlzIGNvbmRpdGlvbiBvY2N1cnMsICB3ZSBhcmUgYWxyZWFkeSB0b28KKyAqIHNsb3csICBwcmludGluZyBhbnl0aGluZyB3aWxsIGp1c3Qga2lsbCB1cworICovCisKK3N0YXRpYyBpbnQgY3J5cHRvX3FfY250ID0gMDsKK21vZHVsZV9wYXJhbShjcnlwdG9fcV9jbnQsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNyeXB0b19xX2NudCwKKwkJIkN1cnJlbnQgbnVtYmVyIG9mIG91dHN0YW5kaW5nIGNyeXB0byByZXF1ZXN0cyIpOworCitzdGF0aWMgaW50IGNyeXB0b19xX21heCA9IDEwMDA7Cittb2R1bGVfcGFyYW0oY3J5cHRvX3FfbWF4LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjcnlwdG9fcV9tYXgsCisJCSJNYXhpbXVtIG51bWJlciBvZiBvdXRzdGFuZGluZyBjcnlwdG8gcmVxdWVzdHMiKTsKKworI2RlZmluZSBib290dmVyYm9zZSBjcnlwdG9fdmVyYm9zZQorc3RhdGljIGludCBjcnlwdG9fdmVyYm9zZSA9IDA7Cittb2R1bGVfcGFyYW0oY3J5cHRvX3ZlcmJvc2UsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNyeXB0b192ZXJib3NlLAorCQkiRW5hYmxlIHZlcmJvc2UgY3J5cHRvIHN0YXJ0dXAiKTsKKworaW50CWNyeXB0b191c2VyY3J5cHRvID0gMTsJLyogdXNlcmxhbmQgbWF5IGRvIGNyeXB0byByZXFzICovCittb2R1bGVfcGFyYW0oY3J5cHRvX3VzZXJjcnlwdG8sIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNyeXB0b191c2VyY3J5cHRvLAorCSAgICJFbmFibGUvZGlzYWJsZSB1c2VyLW1vZGUgYWNjZXNzIHRvIGNyeXB0byBzdXBwb3J0Iik7CisKK2ludAljcnlwdG9fdXNlcmFzeW1jcnlwdG8gPSAxOwkvKiB1c2VybGFuZCBtYXkgZG8gYXN5bSBjcnlwdG8gcmVxcyAqLworbW9kdWxlX3BhcmFtKGNyeXB0b191c2VyYXN5bWNyeXB0bywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY3J5cHRvX3VzZXJhc3ltY3J5cHRvLAorCSAgICJFbmFibGUvZGlzYWJsZSB1c2VyLW1vZGUgYWNjZXNzIHRvIGFzeW1tZXRyaWMgY3J5cHRvIHN1cHBvcnQiKTsKKworaW50CWNyeXB0b19kZXZhbGxvd3NvZnQgPSAwOwkvKiBvbmx5IHVzZSBoYXJkd2FyZSBjcnlwdG8gKi8KK21vZHVsZV9wYXJhbShjcnlwdG9fZGV2YWxsb3dzb2Z0LCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhjcnlwdG9fZGV2YWxsb3dzb2Z0LAorCSAgICJFbmFibGUvZGlzYWJsZSB1c2Ugb2Ygc29mdHdhcmUgY3J5cHRvIHN1cHBvcnQiKTsKKworLyoKKyAqIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjcnlwdG8gb3BlcmF0aW9ucyB0byAKKyAqIGRvIGNvbnNlY3V0aXZlbHkgaW4gdGhlIGNyeXB0byBrZXJuZWwgdGhyZWFkIGJlZm9yZSBzY2hlZHVsaW5nIHRvIGFsbG93IAorICogb3RoZXIgcHJvY2Vzc2VzIHRvIHJ1bi4gV2l0aG91dCBpdCwgaXQgaXMgcG9zc2libGUgdG8gZ2V0IGludG8gYSAKKyAqIHNpdHVhdGlvbiB3aGVyZSB0aGUgY3J5cHRvIHRocmVhZCBuZXZlciBhbGxvd3MgYW55IG90aGVyIHByb2Nlc3NlcyB0byBydW4uCisgKiBEZWZhdWx0IHRvIDEwMDAgd2hpY2ggc2hvdWxkIGJlIGxlc3MgdGhhbiBvbmUgc2Vjb25kLgorICovCitzdGF0aWMgaW50IGNyeXB0b19tYXhfbG9vcGNvdW50ID0gMTAwMDsKK21vZHVsZV9wYXJhbShjcnlwdG9fbWF4X2xvb3Bjb3VudCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY3J5cHRvX21heF9sb29wY291bnQsCisJICAgIk1heGltdW0gbnVtYmVyIG9mIGNyeXB0byBvcHMgdG8gZG8gYmVmb3JlIHlpZWxkaW5nIHRvIG90aGVyIHByb2Nlc3NlcyIpOworCisjaWZuZGVmIENPTkZJR19OUl9DUFVTCisjZGVmaW5lIENPTkZJR19OUl9DUFVTIDEKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpjcnlwdG9wcm9jW0NPTkZJR19OUl9DUFVTXTsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNyeXB0b3JldHByb2NbQ09ORklHX05SX0NQVVNdOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGNyeXB0b3Byb2Nfd2FpdCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoY3J5cHRvcmV0cHJvY193YWl0KTsKKworc3RhdGljCWludCBjcnlwdG9fcHJvYyh2b2lkICphcmcpOworc3RhdGljCWludCBjcnlwdG9fcmV0X3Byb2Modm9pZCAqYXJnKTsKK3N0YXRpYwlpbnQgY3J5cHRvX2ludm9rZShzdHJ1Y3QgY3J5cHRvY2FwICpjYXAsIHN0cnVjdCBjcnlwdG9wICpjcnAsIGludCBoaW50KTsKK3N0YXRpYwlpbnQgY3J5cHRvX2tpbnZva2Uoc3RydWN0IGNyeXB0a29wICprcnAsIGludCBmbGFncyk7CitzdGF0aWMJdm9pZCBjcnlwdG9fZXhpdCh2b2lkKTsKK3N0YXRpYyAgaW50IGNyeXB0b19pbml0KHZvaWQpOworCitzdGF0aWMJc3RydWN0IGNyeXB0b3N0YXRzIGNyeXB0b3N0YXRzOworCitzdGF0aWMgc3RydWN0IGNyeXB0b2NhcCAqCitjcnlwdG9fY2hlY2tkcml2ZXIodV9pbnQzMl90IGhpZCkKK3sKKwlpZiAoY3J5cHRvX2RyaXZlcnMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIChoaWQgPj0gY3J5cHRvX2RyaXZlcnNfbnVtID8gTlVMTCA6ICZjcnlwdG9fZHJpdmVyc1toaWRdKTsKK30KKworLyoKKyAqIENvbXBhcmUgYSBkcml2ZXIncyBsaXN0IG9mIHN1cHBvcnRlZCBhbGdvcml0aG1zIGFnYWluc3QgYW5vdGhlcgorICogbGlzdDsgcmV0dXJuIG5vbi16ZXJvIGlmIGFsbCBhbGdvcml0aG1zIGFyZSBzdXBwb3J0ZWQuCisgKi8KK3N0YXRpYyBpbnQKK2RyaXZlcl9zdWl0YWJsZShjb25zdCBzdHJ1Y3QgY3J5cHRvY2FwICpjYXAsIGNvbnN0IHN0cnVjdCBjcnlwdG9pbmkgKmNyaSkKK3sKKwljb25zdCBzdHJ1Y3QgY3J5cHRvaW5pICpjcjsKKworCS8qIFNlZSBpZiBhbGwgdGhlIGFsZ29yaXRobXMgYXJlIHN1cHBvcnRlZC4gKi8KKwlmb3IgKGNyID0gY3JpOyBjcjsgY3IgPSBjci0+Y3JpX25leHQpCisJCWlmIChjYXAtPmNjX2FsZ1tjci0+Y3JpX2FsZ10gPT0gMCkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBTZWxlY3QgYSBkcml2ZXIgZm9yIGEgbmV3IHNlc3Npb24gdGhhdCBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCisgKiBhbGdvcml0aG1zIGFuZCwgb3B0aW9uYWxseSwgaXMgY29uc3RyYWluZWQgYWNjb3JkaW5nIHRvIHRoZSBmbGFncy4KKyAqIFRoZSBhbGdvcml0aG0gd2UgdXNlIGhlcmUgaXMgcHJldHR5IHN0dXBpZDsganVzdCB1c2UgdGhlCisgKiBmaXJzdCBkcml2ZXIgdGhhdCBzdXBwb3J0cyBhbGwgdGhlIGFsZ29yaXRobXMgd2UgbmVlZC4gSWYgdGhlcmUKKyAqIGFyZSBtdWx0aXBsZSBkcml2ZXJzIHdlIGNob29zZSB0aGUgZHJpdmVyIHdpdGggdGhlIGZld2VzdCBhY3RpdmUKKyAqIHNlc3Npb25zLiAgV2UgcHJlZmVyIGhhcmR3YXJlLWJhY2tlZCBkcml2ZXJzIHRvIHNvZnR3YXJlIG9uZXMuCisgKgorICogWFhYIFdlIG5lZWQgbW9yZSBzbWFydHMgaGVyZSAoaW4gcmVhbCBsaWZlIHRvbywgYnV0IHRoYXQncworICogWFhYIGFub3RoZXIgc3RvcnkgYWx0b2dldGhlcikuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvY2FwICoKK2NyeXB0b19zZWxlY3RfZHJpdmVyKGNvbnN0IHN0cnVjdCBjcnlwdG9pbmkgKmNyaSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBjcnlwdG9jYXAgKmNhcCwgKmJlc3Q7CisJaW50IG1hdGNoLCBoaWQ7CisKKwlDUllQVE9fRFJJVkVSX0FTU0VSVCgpOworCisJLyoKKwkgKiBMb29rIGZpcnN0IGZvciBoYXJkd2FyZSBjcnlwdG8gZGV2aWNlcyBpZiBwZXJtaXR0ZWQuCisJICovCisJaWYgKGZsYWdzICYgQ1JZUFRPQ0FQX0ZfSEFSRFdBUkUpCisJCW1hdGNoID0gQ1JZUFRPQ0FQX0ZfSEFSRFdBUkU7CisJZWxzZQorCQltYXRjaCA9IENSWVBUT0NBUF9GX1NPRlRXQVJFOworCWJlc3QgPSBOVUxMOworYWdhaW46CisJZm9yIChoaWQgPSAwOyBoaWQgPCBjcnlwdG9fZHJpdmVyc19udW07IGhpZCsrKSB7CisJCWNhcCA9ICZjcnlwdG9fZHJpdmVyc1toaWRdOworCQkvKgorCQkgKiBJZiBpdCdzIG5vdCBpbml0aWFsaXplZCwgaXMgaW4gdGhlIHByb2Nlc3Mgb2YKKwkJICogZ29pbmcgYXdheSwgb3IgaXMgbm90IGFwcHJvcHJpYXRlIChoYXJkd2FyZQorCQkgKiBvciBzb2Z0d2FyZSBiYXNlZCBvbiBtYXRjaCksIHRoZW4gc2tpcC4KKwkJICovCisJCWlmIChjYXAtPmNjX2RldiA9PSBOVUxMIHx8CisJCSAgICAoY2FwLT5jY19mbGFncyAmIENSWVBUT0NBUF9GX0NMRUFOVVApIHx8CisJCSAgICAoY2FwLT5jY19mbGFncyAmIG1hdGNoKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogdmVyaWZ5IGFsbCB0aGUgYWxnb3JpdGhtcyBhcmUgc3VwcG9ydGVkLiAqLworCQlpZiAoZHJpdmVyX3N1aXRhYmxlKGNhcCwgY3JpKSkgeworCQkJaWYgKGJlc3QgPT0gTlVMTCB8fAorCQkJICAgIGNhcC0+Y2Nfc2Vzc2lvbnMgPCBiZXN0LT5jY19zZXNzaW9ucykKKwkJCQliZXN0ID0gY2FwOworCQl9CisJfQorCWlmIChiZXN0ICE9IE5VTEwpCisJCXJldHVybiBiZXN0OworCWlmIChtYXRjaCA9PSBDUllQVE9DQVBfRl9IQVJEV0FSRSAmJiAoZmxhZ3MgJiBDUllQVE9DQVBfRl9TT0ZUV0FSRSkpIHsKKwkJLyogc29ydCBvZiBhbiBBbGdvbCA2OC1zdHlsZSBmb3IgbG9vcCAqLworCQltYXRjaCA9IENSWVBUT0NBUF9GX1NPRlRXQVJFOworCQlnb3RvIGFnYWluOworCX0KKwlyZXR1cm4gYmVzdDsKK30KKworLyoKKyAqIENyZWF0ZSBhIG5ldyBzZXNzaW9uLiAgVGhlIGNyaWQgYXJndW1lbnQgc3BlY2lmaWVzIGEgY3J5cHRvCisgKiBkcml2ZXIgdG8gdXNlIG9yIGNvbnN0cmFpbnRzIG9uIGEgZHJpdmVyIHRvIHNlbGVjdCAoaGFyZHdhcmUKKyAqIG9ubHksIHNvZnR3YXJlIG9ubHksIGVpdGhlcikuICBXaGF0ZXZlciBkcml2ZXIgaXMgc2VsZWN0ZWQKKyAqIG11c3QgYmUgY2FwYWJsZSBvZiB0aGUgcmVxdWVzdGVkIGNyeXB0byBhbGdvcml0aG1zLgorICovCitpbnQKK2NyeXB0b19uZXdzZXNzaW9uKHVfaW50NjRfdCAqc2lkLCBzdHJ1Y3QgY3J5cHRvaW5pICpjcmksIGludCBjcmlkKQoreworCXN0cnVjdCBjcnlwdG9jYXAgKmNhcDsKKwl1X2ludDMyX3QgaGlkLCBsaWQ7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGRfZmxhZ3M7CisKKwlDUllQVE9fRFJJVkVSX0xPQ0soKTsKKwlpZiAoKGNyaWQgJiAoQ1JZUFRPQ0FQX0ZfSEFSRFdBUkUgfCBDUllQVE9DQVBfRl9TT0ZUV0FSRSkpID09IDApIHsKKwkJLyoKKwkJICogVXNlIHNwZWNpZmllZCBkcml2ZXI7IHZlcmlmeSBpdCBpcyBjYXBhYmxlLgorCQkgKi8KKwkJY2FwID0gY3J5cHRvX2NoZWNrZHJpdmVyKGNyaWQpOworCQlpZiAoY2FwICE9IE5VTEwgJiYgIWRyaXZlcl9zdWl0YWJsZShjYXAsIGNyaSkpCisJCQljYXAgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE5vIHJlcXVlc3RlZCBkcml2ZXI7IHNlbGVjdCBiYXNlZCBvbiBjcmlkIGZsYWdzLgorCQkgKi8KKwkJY2FwID0gY3J5cHRvX3NlbGVjdF9kcml2ZXIoY3JpLCBjcmlkKTsKKwkJLyoKKwkJICogaWYgTlVMTCB0aGVuIGNhbid0IGRvIGV2ZXJ5dGhpbmcgaW4gb25lIHNlc3Npb24uCisJCSAqIFhYWCBGaXggdGhpcy4gV2UgbmVlZCB0byBpbmplY3QgYSAidmlydHVhbCIgc2Vzc2lvbgorCQkgKiBYWFggbGF5ZXIgcmlnaHQgYWJvdXQgaGVyZS4KKwkJICovCisJfQorCWlmIChjYXAgIT0gTlVMTCkgeworCQkvKiBDYWxsIHRoZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gcm91dGluZS4gKi8KKwkJaGlkID0gY2FwIC0gY3J5cHRvX2RyaXZlcnM7CisJCWxpZCA9IGhpZDsJCS8qIFBhc3MgdGhlIGRyaXZlciBJRC4gKi8KKwkJY2FwLT5jY19zZXNzaW9ucysrOworCQlDUllQVE9fRFJJVkVSX1VOTE9DSygpOworCQllcnIgPSBDUllQVE9ERVZfTkVXU0VTU0lPTihjYXAtPmNjX2RldiwgJmxpZCwgY3JpKTsKKwkJQ1JZUFRPX0RSSVZFUl9MT0NLKCk7CisJCWlmIChlcnIgPT0gMCkgeworCQkJKCpzaWQpID0gKGNhcC0+Y2NfZmxhZ3MgJiAweGZmMDAwMDAwKQorCQkJICAgICAgIHwgKGhpZCAmIDB4MDBmZmZmZmYpOworCQkJKCpzaWQpIDw8PSAzMjsKKwkJCSgqc2lkKSB8PSAobGlkICYgMHhmZmZmZmZmZik7CisJCX0gZWxzZQorCQkJY2FwLT5jY19zZXNzaW9ucy0tOworCX0gZWxzZQorCQllcnIgPSBFSU5WQUw7CisJQ1JZUFRPX0RSSVZFUl9VTkxPQ0soKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAorY3J5cHRvX3JlbW92ZShzdHJ1Y3QgY3J5cHRvY2FwICpjYXApCit7CisJQ1JZUFRPX0RSSVZFUl9BU1NFUlQoKTsKKwlpZiAoY2FwLT5jY19zZXNzaW9ucyA9PSAwICYmIGNhcC0+Y2Nfa29wZXJhdGlvbnMgPT0gMCkKKwkJYnplcm8oY2FwLCBzaXplb2YoKmNhcCkpOworfQorCisvKgorICogRGVsZXRlIGFuIGV4aXN0aW5nIHNlc3Npb24gKG9yIGEgcmVzZXJ2ZWQgc2Vzc2lvbiBvbiBhbiB1bnJlZ2lzdGVyZWQKKyAqIGRyaXZlcikuCisgKi8KK2ludAorY3J5cHRvX2ZyZWVzZXNzaW9uKHVfaW50NjRfdCBzaWQpCit7CisJc3RydWN0IGNyeXB0b2NhcCAqY2FwOworCXVfaW50MzJfdCBoaWQ7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyBkX2ZsYWdzOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlDUllQVE9fRFJJVkVSX0xPQ0soKTsKKworCWlmIChjcnlwdG9fZHJpdmVycyA9PSBOVUxMKSB7CisJCWVyciA9IEVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCS8qIERldGVybWluZSB0d28gSURzLiAqLworCWhpZCA9IENSWVBUT19TRVNJRDJISUQoc2lkKTsKKworCWlmIChoaWQgPj0gY3J5cHRvX2RyaXZlcnNfbnVtKSB7CisJCWRwcmludGsoIiVzIC0gSU5WQUxJRCBEUklWRVIgTlVNICVkXG4iLCBfX0ZVTkNUSU9OX18sIGhpZCk7CisJCWVyciA9IEVOT0VOVDsKKwkJZ290byBkb25lOworCX0KKwljYXAgPSAmY3J5cHRvX2RyaXZlcnNbaGlkXTsKKworCWlmIChjYXAtPmNjX2RldikgeworCQlDUllQVE9fRFJJVkVSX1VOTE9DSygpOworCQkvKiBDYWxsIHRoZSBkcml2ZXIgY2xlYW51cCByb3V0aW5lLCBpZiBhdmFpbGFibGUsIHVubG9ja2VkLiAqLworCQllcnIgPSBDUllQVE9ERVZfRlJFRVNFU1NJT04oY2FwLT5jY19kZXYsIHNpZCk7CisJCUNSWVBUT19EUklWRVJfTE9DSygpOworCX0KKworCWlmIChjYXAtPmNjX3Nlc3Npb25zKQorCQljYXAtPmNjX3Nlc3Npb25zLS07CisKKwlpZiAoY2FwLT5jY19mbGFncyAmIENSWVBUT0NBUF9GX0NMRUFOVVApCisJCWNyeXB0b19yZW1vdmUoY2FwKTsKKworZG9uZToKKwlDUllQVE9fRFJJVkVSX1VOTE9DSygpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBSZXR1cm4gYW4gdW51c2VkIGRyaXZlciBpZC4gIFVzZWQgYnkgZHJpdmVycyBwcmlvciB0byByZWdpc3RlcmluZworICogc3VwcG9ydCBmb3IgdGhlIGFsZ29yaXRobXMgdGhleSBoYW5kbGUuCisgKi8KK2ludDMyX3QKK2NyeXB0b19nZXRfZHJpdmVyaWQoZGV2aWNlX3QgZGV2LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGNyeXB0b2NhcCAqbmV3ZHJ2OworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZF9mbGFnczsKKworCWlmICgoZmxhZ3MgJiAoQ1JZUFRPQ0FQX0ZfSEFSRFdBUkUgfCBDUllQVE9DQVBfRl9TT0ZUV0FSRSkpID09IDApIHsKKwkJcHJpbnRmKCIlczogbm8gZmxhZ3Mgc3BlY2lmaWVkIHdoZW4gcmVnaXN0ZXJpbmcgZHJpdmVyXG4iLAorCQkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChkZXYpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCUNSWVBUT19EUklWRVJfTE9DSygpOworCisJZm9yIChpID0gMDsgaSA8IGNyeXB0b19kcml2ZXJzX251bTsgaSsrKSB7CisJCWlmIChjcnlwdG9fZHJpdmVyc1tpXS5jY19kZXYgPT0gTlVMTCAmJgorCQkgICAgKGNyeXB0b19kcml2ZXJzW2ldLmNjX2ZsYWdzICYgQ1JZUFRPQ0FQX0ZfQ0xFQU5VUCkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBPdXQgb2YgZW50cmllcywgYWxsb2NhdGUgc29tZSBtb3JlLiAqLworCWlmIChpID09IGNyeXB0b19kcml2ZXJzX251bSkgeworCQkvKiBCZSBjYXJlZnVsIGFib3V0IHdyYXAtYXJvdW5kLiAqLworCQlpZiAoMiAqIGNyeXB0b19kcml2ZXJzX251bSA8PSBjcnlwdG9fZHJpdmVyc19udW0pIHsKKwkJCUNSWVBUT19EUklWRVJfVU5MT0NLKCk7CisJCQlwcmludGsoImNyeXB0bzogZHJpdmVyIGNvdW50IHdyYXBhcm91bmQhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW5ld2RydiA9IGttYWxsb2MoMiAqIGNyeXB0b19kcml2ZXJzX251bSAqIHNpemVvZihzdHJ1Y3QgY3J5cHRvY2FwKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld2RydiA9PSBOVUxMKSB7CisJCQlDUllQVE9fRFJJVkVSX1VOTE9DSygpOworCQkJcHJpbnRrKCJjcnlwdG86IG5vIHNwYWNlIHRvIGV4cGFuZCBkcml2ZXIgdGFibGUhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCW1lbWNweShuZXdkcnYsIGNyeXB0b19kcml2ZXJzLAorCQkJCWNyeXB0b19kcml2ZXJzX251bSAqIHNpemVvZihzdHJ1Y3QgY3J5cHRvY2FwKSk7CisJCW1lbXNldCgmbmV3ZHJ2W2NyeXB0b19kcml2ZXJzX251bV0sIDAsCisJCQkJY3J5cHRvX2RyaXZlcnNfbnVtICogc2l6ZW9mKHN0cnVjdCBjcnlwdG9jYXApKTsKKworCQljcnlwdG9fZHJpdmVyc19udW0gKj0gMjsKKworCQlrZnJlZShjcnlwdG9fZHJpdmVycyk7CisJCWNyeXB0b19kcml2ZXJzID0gbmV3ZHJ2OworCX0KKworCS8qIE5COiBzdGF0ZSBpcyB6ZXJvJ2Qgb24gZnJlZSAqLworCWNyeXB0b19kcml2ZXJzW2ldLmNjX3Nlc3Npb25zID0gMTsJLyogTWFyayAqLworCWNyeXB0b19kcml2ZXJzW2ldLmNjX2RldiA9IGRldjsKKwljcnlwdG9fZHJpdmVyc1tpXS5jY19mbGFncyA9IGZsYWdzOworCWlmIChib290dmVyYm9zZSkKKwkJcHJpbnRmKCJjcnlwdG86IGFzc2lnbiAlcyBkcml2ZXIgaWQgJXUsIGZsYWdzICV1XG4iLAorCQkgICAgZGV2aWNlX2dldF9uYW1ldW5pdChkZXYpLCBpLCBmbGFncyk7CisKKwlDUllQVE9fRFJJVkVSX1VOTE9DSygpOworCisJcmV0dXJuIGk7Cit9CisKKy8qCisgKiBMb29rdXAgYSBkcml2ZXIgYnkgbmFtZS4gIFdlIG1hdGNoIGFnYWluc3QgdGhlIGZ1bGwgZGV2aWNlCisgKiBuYW1lIGFuZCB1bml0LCBhbmQgYWdhaW5zdCBqdXN0IHRoZSBuYW1lLiAgVGhlIGxhdHRlciBnaXZlcworICogdXMgYSBzaW1wbGUgd2lkbGNhcmRpbmcgYnkgZGV2aWNlIG5hbWUuICBPbiBzdWNjZXNzIHJldHVybiB0aGUKKyAqIGRyaXZlci9oYXJkd2FyZSBpZGVudGlmaWVyOyBvdGhlcndpc2UgcmV0dXJuIC0xLgorICovCitpbnQKK2NyeXB0b19maW5kX2RyaXZlcihjb25zdCBjaGFyICptYXRjaCkKK3sKKwlpbnQgaSwgbGVuID0gc3RybGVuKG1hdGNoKTsKKwl1bnNpZ25lZCBsb25nIGRfZmxhZ3M7CisKKwlDUllQVE9fRFJJVkVSX0xPQ0soKTsKKwlmb3IgKGkgPSAwOyBpIDwgY3J5cHRvX2RyaXZlcnNfbnVtOyBpKyspIHsKKwkJZGV2aWNlX3QgZGV2ID0gY3J5cHRvX2RyaXZlcnNbaV0uY2NfZGV2OworCQlpZiAoZGV2ID09IE5VTEwgfHwKKwkJICAgIChjcnlwdG9fZHJpdmVyc1tpXS5jY19mbGFncyAmIENSWVBUT0NBUF9GX0NMRUFOVVApKQorCQkJY29udGludWU7CisJCWlmIChzdHJuY21wKG1hdGNoLCBkZXZpY2VfZ2V0X25hbWV1bml0KGRldiksIGxlbikgPT0gMCB8fAorCQkgICAgc3RybmNtcChtYXRjaCwgZGV2aWNlX2dldF9uYW1lKGRldiksIGxlbikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlDUllQVE9fRFJJVkVSX1VOTE9DSygpOworCXJldHVybiBpIDwgY3J5cHRvX2RyaXZlcnNfbnVtID8gaSA6IC0xOworfQorCisvKgorICogUmV0dXJuIHRoZSBkZXZpY2VfdCBmb3IgdGhlIHNwZWNpZmllZCBkcml2ZXIgb3IgTlVMTAorICogaWYgdGhlIGRyaXZlciBpZGVudGlmaWVyIGlzIGludmFsaWQuCisgKi8KK2RldmljZV90CitjcnlwdG9fZmluZF9kZXZpY2VfYnloaWQoaW50IGhpZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvY2FwICpjYXAgPSBjcnlwdG9fY2hlY2tkcml2ZXIoaGlkKTsKKwlyZXR1cm4gY2FwICE9IE5VTEwgPyBjYXAtPmNjX2RldiA6IE5VTEw7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGRldmljZS9kcml2ZXIgY2FwYWJpbGl0aWVzLgorICovCitpbnQKK2NyeXB0b19nZXRjYXBzKGludCBoaWQpCit7CisJc3RydWN0IGNyeXB0b2NhcCAqY2FwID0gY3J5cHRvX2NoZWNrZHJpdmVyKGhpZCk7CisJcmV0dXJuIGNhcCAhPSBOVUxMID8gY2FwLT5jY19mbGFncyA6IDA7Cit9CisKKy8qCisgKiBSZWdpc3RlciBzdXBwb3J0IGZvciBhIGtleS1yZWxhdGVkIGFsZ29yaXRobS4gIFRoaXMgcm91dGluZQorICogaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggYWxnb3JpdGhtIHN1cHBvcnRlZCBhIGRyaXZlci4KKyAqLworaW50CitjcnlwdG9fa3JlZ2lzdGVyKHVfaW50MzJfdCBkcml2ZXJpZCwgaW50IGthbGcsIHVfaW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgY3J5cHRvY2FwICpjYXA7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGRfZmxhZ3M7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCUNSWVBUT19EUklWRVJfTE9DSygpOworCisJY2FwID0gY3J5cHRvX2NoZWNrZHJpdmVyKGRyaXZlcmlkKTsKKwlpZiAoY2FwICE9IE5VTEwgJiYKKwkgICAgKENSS19BTEdPUklUTV9NSU4gPD0ga2FsZyAmJiBrYWxnIDw9IENSS19BTEdPUklUSE1fTUFYKSkgeworCQkvKgorCQkgKiBYWFggRG8gc29tZSBwZXJmb3JtYW5jZSB0ZXN0aW5nIHRvIGRldGVybWluZSBwbGFjaW5nLgorCQkgKiBYWFggV2UgcHJvYmFibHkgbmVlZCBhbiBhdXhpbGlhcnkgZGF0YSBzdHJ1Y3R1cmUgdGhhdAorCQkgKiBYWFggZGVzY3JpYmVzIHJlbGF0aXZlIHBlcmZvcm1hbmNlcy4KKwkJICovCisKKwkJY2FwLT5jY19rYWxnW2thbGddID0gZmxhZ3MgfCBDUllQVE9fQUxHX0ZMQUdfU1VQUE9SVEVEOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlwcmludGYoImNyeXB0bzogJXMgcmVnaXN0ZXJzIGtleSBhbGcgJXUgZmxhZ3MgJXVcbiIKKwkJCQksIGRldmljZV9nZXRfbmFtZXVuaXQoY2FwLT5jY19kZXYpCisJCQkJLCBrYWxnCisJCQkJLCBmbGFncworCQkJKTsKKwkJZXJyID0gMDsKKwl9IGVsc2UKKwkJZXJyID0gRUlOVkFMOworCisJQ1JZUFRPX0RSSVZFUl9VTkxPQ0soKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogUmVnaXN0ZXIgc3VwcG9ydCBmb3IgYSBub24ta2V5LXJlbGF0ZWQgYWxnb3JpdGhtLiAgVGhpcyByb3V0aW5lCisgKiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzdWNoIGFsZ29yaXRobSBzdXBwb3J0ZWQgYnkgYSBkcml2ZXIuCisgKi8KK2ludAorY3J5cHRvX3JlZ2lzdGVyKHVfaW50MzJfdCBkcml2ZXJpZCwgaW50IGFsZywgdV9pbnQxNl90IG1heG9wbGVuLAorICAgIHVfaW50MzJfdCBmbGFncykKK3sKKwlzdHJ1Y3QgY3J5cHRvY2FwICpjYXA7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGRfZmxhZ3M7CisKKwlkcHJpbnRrKCIlcyhpZD0weCV4LCBhbGc9JWQsIG1heG9wbGVuPSVkLCBmbGFncz0weCV4KVxuIiwgX19GVU5DVElPTl9fLAorCQkJZHJpdmVyaWQsIGFsZywgbWF4b3BsZW4sIGZsYWdzKTsKKworCUNSWVBUT19EUklWRVJfTE9DSygpOworCisJY2FwID0gY3J5cHRvX2NoZWNrZHJpdmVyKGRyaXZlcmlkKTsKKwkvKiBOQjogYWxnb3JpdGhtcyBhcmUgaW4gdGhlIHJhbmdlIFsxLi5tYXhdICovCisJaWYgKGNhcCAhPSBOVUxMICYmCisJICAgIChDUllQVE9fQUxHT1JJVEhNX01JTiA8PSBhbGcgJiYgYWxnIDw9IENSWVBUT19BTEdPUklUSE1fTUFYKSkgeworCQkvKgorCQkgKiBYWFggRG8gc29tZSBwZXJmb3JtYW5jZSB0ZXN0aW5nIHRvIGRldGVybWluZSBwbGFjaW5nLgorCQkgKiBYWFggV2UgcHJvYmFibHkgbmVlZCBhbiBhdXhpbGlhcnkgZGF0YSBzdHJ1Y3R1cmUgdGhhdAorCQkgKiBYWFggZGVzY3JpYmVzIHJlbGF0aXZlIHBlcmZvcm1hbmNlcy4KKwkJICovCisKKwkJY2FwLT5jY19hbGdbYWxnXSA9IGZsYWdzIHwgQ1JZUFRPX0FMR19GTEFHX1NVUFBPUlRFRDsKKwkJY2FwLT5jY19tYXhfb3BfbGVuW2FsZ10gPSBtYXhvcGxlbjsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJcHJpbnRmKCJjcnlwdG86ICVzIHJlZ2lzdGVycyBhbGcgJXUgZmxhZ3MgJXUgbWF4b3BsZW4gJXVcbiIKKwkJCQksIGRldmljZV9nZXRfbmFtZXVuaXQoY2FwLT5jY19kZXYpCisJCQkJLCBhbGcKKwkJCQksIGZsYWdzCisJCQkJLCBtYXhvcGxlbgorCQkJKTsKKwkJY2FwLT5jY19zZXNzaW9ucyA9IDA7CQkvKiBVbm1hcmsgKi8KKwkJZXJyID0gMDsKKwl9IGVsc2UKKwkJZXJyID0gRUlOVkFMOworCisJQ1JZUFRPX0RSSVZFUl9VTkxPQ0soKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAorZHJpdmVyX2ZpbmlzKHN0cnVjdCBjcnlwdG9jYXAgKmNhcCkKK3sKKwl1X2ludDMyX3Qgc2VzLCBrb3BzOworCisJQ1JZUFRPX0RSSVZFUl9BU1NFUlQoKTsKKworCXNlcyA9IGNhcC0+Y2Nfc2Vzc2lvbnM7CisJa29wcyA9IGNhcC0+Y2Nfa29wZXJhdGlvbnM7CisJYnplcm8oY2FwLCBzaXplb2YoKmNhcCkpOworCWlmIChzZXMgIT0gMCB8fCBrb3BzICE9IDApIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIHBlbmRpbmcgc2Vzc2lvbnMsCisJCSAqIGp1c3QgbWFyayBhcyBpbnZhbGlkLgorCQkgKi8KKwkJY2FwLT5jY19mbGFncyB8PSBDUllQVE9DQVBfRl9DTEVBTlVQOworCQljYXAtPmNjX3Nlc3Npb25zID0gc2VzOworCQljYXAtPmNjX2tvcGVyYXRpb25zID0ga29wczsKKwl9Cit9CisKKy8qCisgKiBVbnJlZ2lzdGVyIGEgY3J5cHRvIGRyaXZlci4gSWYgdGhlcmUgYXJlIHBlbmRpbmcgc2Vzc2lvbnMgdXNpbmcgaXQsCisgKiBsZWF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gYXJvdW5kIHNvIHRoYXQgc3Vic2VxdWVudCBjYWxscyB1c2luZyB0aG9zZQorICogc2Vzc2lvbnMgd2lsbCBjb3JyZWN0bHkgZGV0ZWN0IHRoZSBkcml2ZXIgaGFzIGJlZW4gdW5yZWdpc3RlcmVkIGFuZAorICogcmVyb3V0ZSByZXF1ZXN0cy4KKyAqLworaW50CitjcnlwdG9fdW5yZWdpc3Rlcih1X2ludDMyX3QgZHJpdmVyaWQsIGludCBhbGcpCit7CisJc3RydWN0IGNyeXB0b2NhcCAqY2FwOworCWludCBpLCBlcnI7CisJdW5zaWduZWQgbG9uZyBkX2ZsYWdzOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlDUllQVE9fRFJJVkVSX0xPQ0soKTsKKworCWNhcCA9IGNyeXB0b19jaGVja2RyaXZlcihkcml2ZXJpZCk7CisJaWYgKGNhcCAhPSBOVUxMICYmCisJICAgIChDUllQVE9fQUxHT1JJVEhNX01JTiA8PSBhbGcgJiYgYWxnIDw9IENSWVBUT19BTEdPUklUSE1fTUFYKSAmJgorCSAgICBjYXAtPmNjX2FsZ1thbGddICE9IDApIHsKKwkJY2FwLT5jY19hbGdbYWxnXSA9IDA7CisJCWNhcC0+Y2NfbWF4X29wX2xlblthbGddID0gMDsKKworCQkvKiBXYXMgdGhpcyB0aGUgbGFzdCBhbGdvcml0aG0gPyAqLworCQlmb3IgKGkgPSAxOyBpIDw9IENSWVBUT19BTEdPUklUSE1fTUFYOyBpKyspCisJCQlpZiAoY2FwLT5jY19hbGdbaV0gIT0gMCkKKwkJCQlicmVhazsKKworCQlpZiAoaSA9PSBDUllQVE9fQUxHT1JJVEhNX01BWCArIDEpCisJCQlkcml2ZXJfZmluaXMoY2FwKTsKKwkJZXJyID0gMDsKKwl9IGVsc2UKKwkJZXJyID0gRUlOVkFMOworCUNSWVBUT19EUklWRVJfVU5MT0NLKCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFVucmVnaXN0ZXIgYWxsIGFsZ29yaXRobXMgYXNzb2NpYXRlZCB3aXRoIGEgY3J5cHRvIGRyaXZlci4KKyAqIElmIHRoZXJlIGFyZSBwZW5kaW5nIHNlc3Npb25zIHVzaW5nIGl0LCBsZWF2ZSBlbm91Z2ggaW5mb3JtYXRpb24KKyAqIGFyb3VuZCBzbyB0aGF0IHN1YnNlcXVlbnQgY2FsbHMgdXNpbmcgdGhvc2Ugc2Vzc2lvbnMgd2lsbAorICogY29ycmVjdGx5IGRldGVjdCB0aGUgZHJpdmVyIGhhcyBiZWVuIHVucmVnaXN0ZXJlZCBhbmQgcmVyb3V0ZQorICogcmVxdWVzdHMuCisgKi8KK2ludAorY3J5cHRvX3VucmVnaXN0ZXJfYWxsKHVfaW50MzJfdCBkcml2ZXJpZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvY2FwICpjYXA7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGRfZmxhZ3M7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCUNSWVBUT19EUklWRVJfTE9DSygpOworCWNhcCA9IGNyeXB0b19jaGVja2RyaXZlcihkcml2ZXJpZCk7CisJaWYgKGNhcCAhPSBOVUxMKSB7CisJCWRyaXZlcl9maW5pcyhjYXApOworCQllcnIgPSAwOworCX0gZWxzZQorCQllcnIgPSBFSU5WQUw7CisJQ1JZUFRPX0RSSVZFUl9VTkxPQ0soKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDbGVhciBibG9ja2FnZSBvbiBhIGRyaXZlci4gIFRoZSB3aGF0IHBhcmFtZXRlciBpbmRpY2F0ZXMgd2hldGhlcgorICogdGhlIGRyaXZlciBpcyBub3cgcmVhZHkgZm9yIGNyeXB0b3AncyBhbmQvb3IgY3J5cHRva29wJ3MuCisgKi8KK2ludAorY3J5cHRvX3VuYmxvY2sodV9pbnQzMl90IGRyaXZlcmlkLCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3QgY3J5cHRvY2FwICpjYXA7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIHFfZmxhZ3M7CisKKwlDUllQVE9fUV9MT0NLKCk7CisJY2FwID0gY3J5cHRvX2NoZWNrZHJpdmVyKGRyaXZlcmlkKTsKKwlpZiAoY2FwICE9IE5VTEwpIHsKKwkJaWYgKHdoYXQgJiBDUllQVE9fU1lNUSkgeworCQkJY2FwLT5jY19xYmxvY2tlZCA9IDA7CisJCQljYXAtPmNjX3VucWJsb2NrZWQgPSAwOworCQkJY3J5cHRvX2FsbF9xYmxvY2tlZCA9IDA7CisJCX0KKwkJaWYgKHdoYXQgJiBDUllQVE9fQVNZTVEpIHsKKwkJCWNhcC0+Y2Nfa3FibG9ja2VkID0gMDsKKwkJCWNhcC0+Y2NfdW5rcWJsb2NrZWQgPSAwOworCQkJY3J5cHRvX2FsbF9rcWJsb2NrZWQgPSAwOworCQl9CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY3J5cHRvcHJvY193YWl0KTsKKwkJZXJyID0gMDsKKwl9IGVsc2UKKwkJZXJyID0gRUlOVkFMOworCUNSWVBUT19RX1VOTE9DSygpOyAvL0RBVklETSBzaG91bGQgdGhpcyBiZSBhIGRyaXZlciBsb2NrCisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQWRkIGEgY3J5cHRvIHJlcXVlc3QgdG8gYSBxdWV1ZSwgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBrZXJuZWwgdGhyZWFkLgorICovCitpbnQKK2NyeXB0b19kaXNwYXRjaChzdHJ1Y3QgY3J5cHRvcCAqY3JwKQoreworCXN0cnVjdCBjcnlwdG9jYXAgKmNhcDsKKwlpbnQgcmVzdWx0ID0gLTE7CisJdW5zaWduZWQgbG9uZyBxX2ZsYWdzOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWNyeXB0b3N0YXRzLmNzX29wcysrOworCisJQ1JZUFRPX1FfTE9DSygpOworCS8qaWYgKGNyeXB0b19xX2NudCA+PSBjcnlwdG9fcV9tYXgpIHsKKwkJY3J5cHRvc3RhdHMuY3NfZHJvcHMrKzsKKwkJQ1JZUFRPX1FfVU5MT0NLKCk7CisJCXJldHVybiBFTk9NRU07CisJfSovCisJY3J5cHRvX3FfY250Kys7CisKKwkvKiBtYWtlIHN1cmUgd2UgYXJlIHN0YXJ0aW5nIGEgZnJlc2ggcnVuIG9uIHRoaXMgY3JwLiAqLworCWNycC0+Y3JwX2ZsYWdzICY9IH5DUllQVE9fRl9ET05FOworCWNycC0+Y3JwX2V0eXBlID0gMDsKKworCS8qCisJICogQ2FsbGVyIG1hcmtlZCB0aGUgcmVxdWVzdCB0byBiZSBwcm9jZXNzZWQgaW1tZWRpYXRlbHk7IGRpc3BhdGNoCisJICogaXQgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciB1bmxlc3MgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgYmxvY2tlZC4KKwkgKi8KKwlpZiAoKGNycC0+Y3JwX2ZsYWdzICYgQ1JZUFRPX0ZfQkFUQ0gpID09IDApIHsKKwkJaW50IGhpZCA9IENSWVBUT19TRVNJRDJISUQoY3JwLT5jcnBfc2lkKTsKKwkJY2FwID0gY3J5cHRvX2NoZWNrZHJpdmVyKGhpZCk7CisJCS8qIERyaXZlciBjYW5ub3QgZGlzYXBwZWFyIHdoZW4gdGhlcmUgaXMgYW4gYWN0aXZlIHNlc3Npb24uICovCisJCUtBU1NFUlQoY2FwICE9IE5VTEwsICgiJXM6IERyaXZlciBkaXNhcHBlYXJlZC4iLCBfX2Z1bmNfXykpOworCQlpZiAoIWNhcC0+Y2NfcWJsb2NrZWQpIHsKKwkJCWNyeXB0b19hbGxfcWJsb2NrZWQgPSAwOworCQkJY3J5cHRvX2RyaXZlcnNbaGlkXS5jY191bnFibG9ja2VkID0gMTsKKwkJCUNSWVBUT19RX1VOTE9DSygpOworCQkJcmVzdWx0ID0gY3J5cHRvX2ludm9rZShjYXAsIGNycCwgMCk7CisJCQlDUllQVE9fUV9MT0NLKCk7CisJCQlpZiAocmVzdWx0ID09IEVSRVNUQVJUKQorCQkJCWlmIChjcnlwdG9fZHJpdmVyc1toaWRdLmNjX3VucWJsb2NrZWQpCisJCQkJCWNyeXB0b19kcml2ZXJzW2hpZF0uY2NfcWJsb2NrZWQgPSAxOworCQkJY3J5cHRvX2RyaXZlcnNbaGlkXS5jY191bnFibG9ja2VkID0gMDsKKwkJfQorCX0KKwlpZiAocmVzdWx0ID09IEVSRVNUQVJUKSB7CisJCS8qCisJCSAqIFRoZSBkcml2ZXIgcmFuIG91dCBvZiByZXNvdXJjZXMsIG1hcmsgdGhlCisJCSAqIGRyaXZlciBgYGJsb2NrZWQnJyBmb3IgY3J5cHRvcCdzIGFuZCBwdXQKKwkJICogdGhlIHJlcXVlc3QgYmFjayBpbiB0aGUgcXVldWUuICBJdCB3b3VsZAorCQkgKiBiZXN0IHRvIHB1dCB0aGUgcmVxdWVzdCBiYWNrIHdoZXJlIHdlIGdvdAorCQkgKiBpdCBidXQgdGhhdCdzIGhhcmQgc28gZm9yIG5vdyB3ZSBwdXQgaXQKKwkJICogYXQgdGhlIGZyb250LiAgVGhpcyBzaG91bGQgYmUgb2s7IHB1dHRpbmcKKwkJICogaXQgYXQgdGhlIGVuZCBkb2VzIG5vdCB3b3JrLgorCQkgKi8KKwkJbGlzdF9hZGQoJmNycC0+Y3JwX25leHQsICZjcnBfcSk7CisJCWNyeXB0b3N0YXRzLmNzX2Jsb2NrcysrOworCQlyZXN1bHQgPSAwOworCX0gZWxzZSBpZiAocmVzdWx0ID09IC0xKSB7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZjcnBfcSwgY3JwLCBjcnBfbmV4dCk7CisJCXJlc3VsdCA9IDA7CisJfQorCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY3J5cHRvcHJvY193YWl0KTsKKwlDUllQVE9fUV9VTkxPQ0soKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQWRkIGFuIGFzeW1ldHJpYyBjcnlwdG8gcmVxdWVzdCB0byBhIHF1ZXVlLAorICogdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBrZXJuZWwgdGhyZWFkLgorICovCitpbnQKK2NyeXB0b19rZGlzcGF0Y2goc3RydWN0IGNyeXB0a29wICprcnApCit7CisJaW50IGVycm9yOworCXVuc2lnbmVkIGxvbmcgcV9mbGFnczsKKworCWNyeXB0b3N0YXRzLmNzX2tvcHMrKzsKKworCWVycm9yID0gY3J5cHRvX2tpbnZva2Uoa3JwLCBrcnAtPmtycF9jcmlkKTsKKwlpZiAoZXJyb3IgPT0gRVJFU1RBUlQpIHsKKwkJQ1JZUFRPX1FfTE9DSygpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmY3JwX2txLCBrcnAsIGtycF9uZXh0KTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjcnlwdG9wcm9jX3dhaXQpOworCQlDUllQVE9fUV9VTkxPQ0soKTsKKwkJZXJyb3IgPSAwOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBWZXJpZnkgYSBkcml2ZXIgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uLgorICovCitzdGF0aWMgX19pbmxpbmUgaW50CitrZHJpdmVyX3N1aXRhYmxlKGNvbnN0IHN0cnVjdCBjcnlwdG9jYXAgKmNhcCwgY29uc3Qgc3RydWN0IGNyeXB0a29wICprcnApCit7CisJcmV0dXJuIChjYXAtPmNjX2thbGdba3JwLT5rcnBfb3BdICYgQ1JZUFRPX0FMR19GTEFHX1NVUFBPUlRFRCkgIT0gMDsKK30KKworLyoKKyAqIFNlbGVjdCBhIGRyaXZlciBmb3IgYW4gYXN5bSBvcGVyYXRpb24uICBUaGUgZHJpdmVyIG11c3QKKyAqIHN1cHBvcnQgdGhlIG5lY2Vzc2FyeSBhbGdvcml0aG0uICBUaGUgY2FsbGVyIGNhbiBjb25zdHJhaW4KKyAqIHdoaWNoIGRldmljZSBpcyBzZWxlY3RlZCB3aXRoIHRoZSBmbGFncyBwYXJhbWV0ZXIuICBUaGUKKyAqIGFsZ29yaXRobSB3ZSB1c2UgaGVyZSBpcyBwcmV0dHkgc3R1cGlkOyBqdXN0IHVzZSB0aGUgZmlyc3QKKyAqIGRyaXZlciB0aGF0IHN1cHBvcnRzIHRoZSBhbGdvcml0aG1zIHdlIG5lZWQuIElmIHRoZXJlIGFyZQorICogbXVsdGlwbGUgc3VpdGFibGUgZHJpdmVycyB3ZSBjaG9vc2UgdGhlIGRyaXZlciB3aXRoIHRoZQorICogZmV3ZXN0IGFjdGl2ZSBvcGVyYXRpb25zLiAgV2UgcHJlZmVyIGhhcmR3YXJlLWJhY2tlZAorICogZHJpdmVycyB0byBzb2Z0d2FyZSBvbmVzIHdoZW4gZWl0aGVyIG1heSBiZSB1c2VkLgorICovCitzdGF0aWMgc3RydWN0IGNyeXB0b2NhcCAqCitjcnlwdG9fc2VsZWN0X2tkcml2ZXIoY29uc3Qgc3RydWN0IGNyeXB0a29wICprcnAsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgY3J5cHRvY2FwICpjYXAsICpiZXN0LCAqYmxvY2tlZDsKKwlpbnQgbWF0Y2gsIGhpZDsKKworCUNSWVBUT19EUklWRVJfQVNTRVJUKCk7CisKKwkvKgorCSAqIExvb2sgZmlyc3QgZm9yIGhhcmR3YXJlIGNyeXB0byBkZXZpY2VzIGlmIHBlcm1pdHRlZC4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBDUllQVE9DQVBfRl9IQVJEV0FSRSkKKwkJbWF0Y2ggPSBDUllQVE9DQVBfRl9IQVJEV0FSRTsKKwllbHNlCisJCW1hdGNoID0gQ1JZUFRPQ0FQX0ZfU09GVFdBUkU7CisJYmVzdCA9IE5VTEw7CisJYmxvY2tlZCA9IE5VTEw7CithZ2FpbjoKKwlmb3IgKGhpZCA9IDA7IGhpZCA8IGNyeXB0b19kcml2ZXJzX251bTsgaGlkKyspIHsKKwkJY2FwID0gJmNyeXB0b19kcml2ZXJzW2hpZF07CisJCS8qCisJCSAqIElmIGl0J3Mgbm90IGluaXRpYWxpemVkLCBpcyBpbiB0aGUgcHJvY2VzcyBvZgorCQkgKiBnb2luZyBhd2F5LCBvciBpcyBub3QgYXBwcm9wcmlhdGUgKGhhcmR3YXJlCisJCSAqIG9yIHNvZnR3YXJlIGJhc2VkIG9uIG1hdGNoKSwgdGhlbiBza2lwLgorCQkgKi8KKwkJaWYgKGNhcC0+Y2NfZGV2ID09IE5VTEwgfHwKKwkJICAgIChjYXAtPmNjX2ZsYWdzICYgQ1JZUFRPQ0FQX0ZfQ0xFQU5VUCkgfHwKKwkJICAgIChjYXAtPmNjX2ZsYWdzICYgbWF0Y2gpID09IDApCisJCQljb250aW51ZTsKKworCQkvKiB2ZXJpZnkgYWxsIHRoZSBhbGdvcml0aG1zIGFyZSBzdXBwb3J0ZWQuICovCisJCWlmIChrZHJpdmVyX3N1aXRhYmxlKGNhcCwga3JwKSkgeworCQkJaWYgKGJlc3QgPT0gTlVMTCB8fAorCQkJICAgIGNhcC0+Y2Nfa29wZXJhdGlvbnMgPCBiZXN0LT5jY19rb3BlcmF0aW9ucykKKwkJCQliZXN0ID0gY2FwOworCQl9CisJfQorCWlmIChiZXN0ICE9IE5VTEwpCisJCXJldHVybiBiZXN0OworCWlmIChtYXRjaCA9PSBDUllQVE9DQVBfRl9IQVJEV0FSRSAmJiAoZmxhZ3MgJiBDUllQVE9DQVBfRl9TT0ZUV0FSRSkpIHsKKwkJLyogc29ydCBvZiBhbiBBbGdvbCA2OC1zdHlsZSBmb3IgbG9vcCAqLworCQltYXRjaCA9IENSWVBUT0NBUF9GX1NPRlRXQVJFOworCQlnb3RvIGFnYWluOworCX0KKwlyZXR1cm4gYmVzdDsKK30KKworLyoKKyAqIERpc3BhdGNoIGFuIGFzc3ltZXRyaWMgY3J5cHRvIHJlcXVlc3QuCisgKi8KK3N0YXRpYyBpbnQKK2NyeXB0b19raW52b2tlKHN0cnVjdCBjcnlwdGtvcCAqa3JwLCBpbnQgY3JpZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvY2FwICpjYXAgPSBOVUxMOworCWludCBlcnJvcjsKKwl1bnNpZ25lZCBsb25nIGRfZmxhZ3M7CisKKwlLQVNTRVJUKGtycCAhPSBOVUxMLCAoIiVzOiBrcnAgPT0gTlVMTCIsIF9fZnVuY19fKSk7CisJS0FTU0VSVChrcnAtPmtycF9jYWxsYmFjayAhPSBOVUxMLAorCSAgICAoIiVzOiBrcnAtPmNycF9jYWxsYmFjayA9PSBOVUxMIiwgX19mdW5jX18pKTsKKworCUNSWVBUT19EUklWRVJfTE9DSygpOworCWlmICgoY3JpZCAmIChDUllQVE9DQVBfRl9IQVJEV0FSRSB8IENSWVBUT0NBUF9GX1NPRlRXQVJFKSkgPT0gMCkgeworCQljYXAgPSBjcnlwdG9fY2hlY2tkcml2ZXIoY3JpZCk7CisJCWlmIChjYXAgIT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIERyaXZlciBwcmVzZW50LCBpdCBtdXN0IHN1cHBvcnQgdGhlIG5lY2Vzc2FyeQorCQkJICogYWxnb3JpdGhtIGFuZCwgaWYgcy93IGRyaXZlcnMgYXJlIGV4Y2x1ZGVkLAorCQkJICogaXQgbXVzdCBiZSByZWdpc3RlcmVkIGFzIGhhcmR3YXJlLWJhY2tlZC4KKwkJCSAqLworCQkJaWYgKCFrZHJpdmVyX3N1aXRhYmxlKGNhcCwga3JwKSB8fAorCQkJICAgICghY3J5cHRvX2RldmFsbG93c29mdCAmJgorCQkJICAgICAoY2FwLT5jY19mbGFncyAmIENSWVBUT0NBUF9GX0hBUkRXQVJFKSA9PSAwKSkKKwkJCQljYXAgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTm8gcmVxdWVzdGVkIGRyaXZlcjsgc2VsZWN0IGJhc2VkIG9uIGNyaWQgZmxhZ3MuCisJCSAqLworCQlpZiAoIWNyeXB0b19kZXZhbGxvd3NvZnQpCS8qIE5COiBkaXNhbGxvdyBzL3cgZHJpdmVycyAqLworCQkJY3JpZCAmPSB+Q1JZUFRPQ0FQX0ZfU09GVFdBUkU7CisJCWNhcCA9IGNyeXB0b19zZWxlY3Rfa2RyaXZlcihrcnAsIGNyaWQpOworCX0KKwlpZiAoY2FwICE9IE5VTEwgJiYgIWNhcC0+Y2Nfa3FibG9ja2VkKSB7CisJCWtycC0+a3JwX2hpZCA9IGNhcCAtIGNyeXB0b19kcml2ZXJzOworCQljYXAtPmNjX2tvcGVyYXRpb25zKys7CisJCUNSWVBUT19EUklWRVJfVU5MT0NLKCk7CisJCWVycm9yID0gQ1JZUFRPREVWX0tQUk9DRVNTKGNhcC0+Y2NfZGV2LCBrcnAsIDApOworCQlDUllQVE9fRFJJVkVSX0xPQ0soKTsKKwkJaWYgKGVycm9yID09IEVSRVNUQVJUKSB7CisJCQljYXAtPmNjX2tvcGVyYXRpb25zLS07CisJCQlDUllQVE9fRFJJVkVSX1VOTE9DSygpOworCQkJcmV0dXJuIChlcnJvcik7CisJCX0KKwkJLyogcmV0dXJuIHRoZSBhY3R1YWwgZGV2aWNlIHVzZWQgKi8KKwkJa3JwLT5rcnBfY3JpZCA9IGtycC0+a3JwX2hpZDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBOQjogY2FwIGlzICFOVUxMIGlmIGRldmljZSBpcyBibG9ja2VkOyBpbgorCQkgKiAgICAgdGhhdCBjYXNlIHJldHVybiBFUkVTVEFSVCBzbyB0aGUgb3BlcmF0aW9uCisJCSAqICAgICBpcyByZXN1Ym1pdHRlZCBpZiBwb3NzaWJsZS4KKwkJICovCisJCWVycm9yID0gKGNhcCA9PSBOVUxMKSA/IEVOT0RFViA6IEVSRVNUQVJUOworCX0KKwlDUllQVE9fRFJJVkVSX1VOTE9DSygpOworCisJaWYgKGVycm9yKSB7CisJCWtycC0+a3JwX3N0YXR1cyA9IGVycm9yOworCQljcnlwdG9fa2RvbmUoa3JwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIERpc3BhdGNoIGEgY3J5cHRvIHJlcXVlc3QgdG8gdGhlIGFwcHJvcHJpYXRlIGNyeXB0byBkZXZpY2VzLgorICovCitzdGF0aWMgaW50CitjcnlwdG9faW52b2tlKHN0cnVjdCBjcnlwdG9jYXAgKmNhcCwgc3RydWN0IGNyeXB0b3AgKmNycCwgaW50IGhpbnQpCit7CisJS0FTU0VSVChjcnAgIT0gTlVMTCwgKCIlczogY3JwID09IE5VTEwiLCBfX2Z1bmNfXykpOworCUtBU1NFUlQoY3JwLT5jcnBfY2FsbGJhY2sgIT0gTlVMTCwKKwkgICAgKCIlczogY3JwLT5jcnBfY2FsbGJhY2sgPT0gTlVMTCIsIF9fZnVuY19fKSk7CisJS0FTU0VSVChjcnAtPmNycF9kZXNjICE9IE5VTEwsICgiJXM6IGNycC0+Y3JwX2Rlc2MgPT0gTlVMTCIsIF9fZnVuY19fKSk7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisjaWZkZWYgQ1JZUFRPX1RJTUlORworCWlmIChjcnlwdG9fdGltaW5nKQorCQljcnlwdG9fdHN0YXQoJmNyeXB0b3N0YXRzLmNzX2ludm9rZSwgJmNycC0+Y3JwX3RzdGFtcCk7CisjZW5kaWYKKwlpZiAoY2FwLT5jY19mbGFncyAmIENSWVBUT0NBUF9GX0NMRUFOVVApIHsKKwkJc3RydWN0IGNyeXB0b2Rlc2MgKmNyZDsKKwkJdV9pbnQ2NF90IG5pZDsKKworCQkvKgorCQkgKiBEcml2ZXIgaGFzIHVucmVnaXN0ZXJlZDsgbWlncmF0ZSB0aGUgc2Vzc2lvbiBhbmQgcmV0dXJuCisJCSAqIGFuIGVycm9yIHRvIHRoZSBjYWxsZXIgc28gdGhleSdsbCByZXN1Ym1pdCB0aGUgb3AuCisJCSAqCisJCSAqIFhYWDogV2hhdCBpZiB0aGVyZSBhcmUgbW9yZSBhbHJlYWR5IHF1ZXVlZCByZXF1ZXN0cyBmb3IgdGhpcworCQkgKiAgICAgIHNlc3Npb24/CisJCSAqLworCQljcnlwdG9fZnJlZXNlc3Npb24oY3JwLT5jcnBfc2lkKTsKKworCQlmb3IgKGNyZCA9IGNycC0+Y3JwX2Rlc2M7IGNyZC0+Y3JkX25leHQ7IGNyZCA9IGNyZC0+Y3JkX25leHQpCisJCQljcmQtPkNSRF9JTkkuY3JpX25leHQgPSAmKGNyZC0+Y3JkX25leHQtPkNSRF9JTkkpOworCisJCS8qIFhYWCBwcm9wYWdhdGUgZmxhZ3MgZnJvbSBpbml0aWFsIHNlc3Npb24/ICovCisJCWlmIChjcnlwdG9fbmV3c2Vzc2lvbigmbmlkLCAmKGNycC0+Y3JwX2Rlc2MtPkNSRF9JTkkpLAorCQkgICAgQ1JZUFRPQ0FQX0ZfSEFSRFdBUkUgfCBDUllQVE9DQVBfRl9TT0ZUV0FSRSkgPT0gMCkKKwkJCWNycC0+Y3JwX3NpZCA9IG5pZDsKKworCQljcnAtPmNycF9ldHlwZSA9IEVBR0FJTjsKKwkJY3J5cHRvX2RvbmUoY3JwKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSW52b2tlIHRoZSBkcml2ZXIgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdC4KKwkJICovCisJCXJldHVybiBDUllQVE9ERVZfUFJPQ0VTUyhjYXAtPmNjX2RldiwgY3JwLCBoaW50KTsKKwl9Cit9CisKKy8qCisgKiBSZWxlYXNlIGEgc2V0IG9mIGNyeXB0byBkZXNjcmlwdG9ycy4KKyAqLwordm9pZAorY3J5cHRvX2ZyZWVyZXEoc3RydWN0IGNyeXB0b3AgKmNycCkKK3sKKwlzdHJ1Y3QgY3J5cHRvZGVzYyAqY3JkOworCisJaWYgKGNycCA9PSBOVUxMKQorCQlyZXR1cm47CisKKyNpZmRlZiBESUFHTk9TVElDCisJeworCQlzdHJ1Y3QgY3J5cHRvcCAqY3JwMjsKKwkJdW5zaWduZWQgbG9uZyBxX2ZsYWdzOworCisJCUNSWVBUT19RX0xPQ0soKTsKKwkJVEFJTFFfRk9SRUFDSChjcnAyLCAmY3JwX3EsIGNycF9uZXh0KSB7CisJCQlLQVNTRVJUKGNycDIgIT0gY3JwLAorCQkJICAgICgiRnJlZWluZyBjcnlwdG9wIGZyb20gdGhlIGNyeXB0byBxdWV1ZSAoJXApLiIsCisJCQkgICAgY3JwKSk7CisJCX0KKwkJQ1JZUFRPX1FfVU5MT0NLKCk7CisJCUNSWVBUT19SRVRRX0xPQ0soKTsKKwkJVEFJTFFfRk9SRUFDSChjcnAyLCAmY3JwX3JldF9xLCBjcnBfbmV4dCkgeworCQkJS0FTU0VSVChjcnAyICE9IGNycCwKKwkJCSAgICAoIkZyZWVpbmcgY3J5cHRvcCBmcm9tIHRoZSByZXR1cm4gcXVldWUgKCVwKS4iLAorCQkJICAgIGNycCkpOworCQl9CisJCUNSWVBUT19SRVRRX1VOTE9DSygpOworCX0KKyNlbmRpZgorCisJd2hpbGUgKChjcmQgPSBjcnAtPmNycF9kZXNjKSAhPSBOVUxMKSB7CisJCWNycC0+Y3JwX2Rlc2MgPSBjcmQtPmNyZF9uZXh0OworCQlrbWVtX2NhY2hlX2ZyZWUoY3J5cHRvZGVzY196b25lLCBjcmQpOworCX0KKwlrbWVtX2NhY2hlX2ZyZWUoY3J5cHRvcF96b25lLCBjcnApOworfQorCisvKgorICogQWNxdWlyZSBhIHNldCBvZiBjcnlwdG8gZGVzY3JpcHRvcnMuCisgKi8KK3N0cnVjdCBjcnlwdG9wICoKK2NyeXB0b19nZXRyZXEoaW50IG51bSkKK3sKKwlzdHJ1Y3QgY3J5cHRvZGVzYyAqY3JkOworCXN0cnVjdCBjcnlwdG9wICpjcnA7CisKKwljcnAgPSBrbWVtX2NhY2hlX2FsbG9jKGNyeXB0b3Bfem9uZSwgU0xBQl9BVE9NSUMpOworCWlmIChjcnAgIT0gTlVMTCkgeworCQltZW1zZXQoY3JwLCAwLCBzaXplb2YoKmNycCkpOworCQlJTklUX0xJU1RfSEVBRCgmY3JwLT5jcnBfbmV4dCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNycC0+Y3JwX3dhaXRxKTsKKwkJd2hpbGUgKG51bS0tKSB7CisJCQljcmQgPSBrbWVtX2NhY2hlX2FsbG9jKGNyeXB0b2Rlc2Nfem9uZSwgU0xBQl9BVE9NSUMpOworCQkJaWYgKGNyZCA9PSBOVUxMKSB7CisJCQkJY3J5cHRvX2ZyZWVyZXEoY3JwKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCW1lbXNldChjcmQsIDAsIHNpemVvZigqY3JkKSk7CisJCQljcmQtPmNyZF9uZXh0ID0gY3JwLT5jcnBfZGVzYzsKKwkJCWNycC0+Y3JwX2Rlc2MgPSBjcmQ7CisJCX0KKwl9CisJcmV0dXJuIGNycDsKK30KKworLyoKKyAqIEludm9rZSB0aGUgY2FsbGJhY2sgb24gYmVoYWxmIG9mIHRoZSBkcml2ZXIuCisgKi8KK3ZvaWQKK2NyeXB0b19kb25lKHN0cnVjdCBjcnlwdG9wICpjcnApCit7CisJdW5zaWduZWQgbG9uZyBxX2ZsYWdzOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoKGNycC0+Y3JwX2ZsYWdzICYgQ1JZUFRPX0ZfRE9ORSkgPT0gMCkgeworCQljcnAtPmNycF9mbGFncyB8PSBDUllQVE9fRl9ET05FOworCQlDUllQVE9fUV9MT0NLKCk7CisJCWNyeXB0b19xX2NudC0tOworCQlDUllQVE9fUV9VTkxPQ0soKTsKKwl9IGVsc2UKKwkJcHJpbnRrKCJjcnlwdG86IGNyeXB0b19kb25lIG9wIGFscmVhZHkgZG9uZSwgZmxhZ3MgMHgleCIsCisJCQkJY3JwLT5jcnBfZmxhZ3MpOworCWlmIChjcnAtPmNycF9ldHlwZSAhPSAwKQorCQljcnlwdG9zdGF0cy5jc19lcnJzKys7CisJLyoKKwkgKiBDQklNTSBtZWFucyB1bmNvbmRpdGlvbmFsbHkgZG8gdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5OworCSAqIENCSUZTWU5DIG1lYW5zIGRvIHRoZSBjYWxsYmFjayBpbW1lZGlhdGVseSBvbmx5IGlmIHRoZQorCSAqIG9wZXJhdGlvbiB3YXMgZG9uZSBzeW5jaHJvbm91c2x5LiAgQm90aCBhcmUgdXNlZCB0byBhdm9pZAorCSAqIGRvaW5nIGV4dHJhbmVvdXMgY29udGV4dCBzd2l0Y2hlczsgdGhlIGxhdHRlciBpcyBtb3N0bHkKKwkgKiB1c2VkIHdpdGggdGhlIHNvZnR3YXJlIGNyeXB0byBkcml2ZXIuCisJICovCisJaWYgKChjcnAtPmNycF9mbGFncyAmIENSWVBUT19GX0NCSU1NKSB8fAorCSAgICAoKGNycC0+Y3JwX2ZsYWdzICYgQ1JZUFRPX0ZfQ0JJRlNZTkMpICYmCisJICAgICAoQ1JZUFRPX1NFU0lEMkNBUFMoY3JwLT5jcnBfc2lkKSAmIENSWVBUT0NBUF9GX1NZTkMpKSkgeworCQkvKgorCQkgKiBEbyB0aGUgY2FsbGJhY2sgZGlyZWN0bHkuICBUaGlzIGlzIG9rIHdoZW4gdGhlCisJCSAqIGNhbGxiYWNrIHJvdXRpbmUgZG9lcyB2ZXJ5IGxpdHRsZSAoZS5nLiB0aGUKKwkJICogL2Rldi9jcnlwdG8gY2FsbGJhY2sgbWV0aG9kIGp1c3QgZG9lcyBhIHdha2V1cCkuCisJCSAqLworCQljcnAtPmNycF9jYWxsYmFjayhjcnApOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgcl9mbGFnczsKKwkJLyoKKwkJICogTm9ybWFsIGNhc2U7IHF1ZXVlIHRoZSBjYWxsYmFjayBmb3IgdGhlIHRocmVhZC4KKwkJICovCisJCUNSWVBUT19SRVRRX0xPQ0soKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjcnlwdG9yZXRwcm9jX3dhaXQpOy8qIHNoYXJlZCB3YWl0IGNoYW5uZWwgKi8KKwkJVEFJTFFfSU5TRVJUX1RBSUwoJmNycF9yZXRfcSwgY3JwLCBjcnBfbmV4dCk7CisJCUNSWVBUT19SRVRRX1VOTE9DSygpOworCX0KK30KKworLyoKKyAqIEludm9rZSB0aGUgY2FsbGJhY2sgb24gYmVoYWxmIG9mIHRoZSBkcml2ZXIuCisgKi8KK3ZvaWQKK2NyeXB0b19rZG9uZShzdHJ1Y3QgY3J5cHRrb3AgKmtycCkKK3sKKwlzdHJ1Y3QgY3J5cHRvY2FwICpjYXA7CisJdW5zaWduZWQgbG9uZyBkX2ZsYWdzOworCisJaWYgKChrcnAtPmtycF9mbGFncyAmIENSWVBUT19LRl9ET05FKSAhPSAwKQorCQlwcmludGsoImNyeXB0bzogY3J5cHRvX2tkb25lIG9wIGFscmVhZHkgZG9uZSwgZmxhZ3MgMHgleCIsCisJCQkJa3JwLT5rcnBfZmxhZ3MpOworCWtycC0+a3JwX2ZsYWdzIHw9IENSWVBUT19LRl9ET05FOworCWlmIChrcnAtPmtycF9zdGF0dXMgIT0gMCkKKwkJY3J5cHRvc3RhdHMuY3Nfa2VycnMrKzsKKworCUNSWVBUT19EUklWRVJfTE9DSygpOworCS8qIFhYWDogV2hhdCBpZiBkcml2ZXIgaXMgbG9hZGVkIGluIHRoZSBtZWFudGltZT8gKi8KKwlpZiAoa3JwLT5rcnBfaGlkIDwgY3J5cHRvX2RyaXZlcnNfbnVtKSB7CisJCWNhcCA9ICZjcnlwdG9fZHJpdmVyc1trcnAtPmtycF9oaWRdOworCQljYXAtPmNjX2tvcGVyYXRpb25zLS07CisJCUtBU1NFUlQoY2FwLT5jY19rb3BlcmF0aW9ucyA+PSAwLCAoImNjX2tvcGVyYXRpb25zIDwgMCIpKTsKKwkJaWYgKGNhcC0+Y2NfZmxhZ3MgJiBDUllQVE9DQVBfRl9DTEVBTlVQKQorCQkJY3J5cHRvX3JlbW92ZShjYXApOworCX0KKwlDUllQVE9fRFJJVkVSX1VOTE9DSygpOworCisJLyoKKwkgKiBDQklNTSBtZWFucyB1bmNvbmRpdGlvbmFsbHkgZG8gdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5OworCSAqIFRoaXMgaXMgdXNlZCB0byBhdm9pZCBkb2luZyBleHRyYW5lb3VzIGNvbnRleHQgc3dpdGNoZXMKKwkgKi8KKwlpZiAoKGtycC0+a3JwX2ZsYWdzICYgQ1JZUFRPX0tGX0NCSU1NKSkgeworCQkvKgorCQkgKiBEbyB0aGUgY2FsbGJhY2sgZGlyZWN0bHkuICBUaGlzIGlzIG9rIHdoZW4gdGhlCisJCSAqIGNhbGxiYWNrIHJvdXRpbmUgZG9lcyB2ZXJ5IGxpdHRsZSAoZS5nLiB0aGUKKwkJICogL2Rldi9jcnlwdG8gY2FsbGJhY2sgbWV0aG9kIGp1c3QgZG9lcyBhIHdha2V1cCkuCisJCSAqLworCQlrcnAtPmtycF9jYWxsYmFjayhrcnApOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgcl9mbGFnczsKKwkJLyoKKwkJICogTm9ybWFsIGNhc2U7IHF1ZXVlIHRoZSBjYWxsYmFjayBmb3IgdGhlIHRocmVhZC4KKwkJICovCisJCUNSWVBUT19SRVRRX0xPQ0soKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjcnlwdG9yZXRwcm9jX3dhaXQpOy8qIHNoYXJlZCB3YWl0IGNoYW5uZWwgKi8KKwkJVEFJTFFfSU5TRVJUX1RBSUwoJmNycF9yZXRfa3EsIGtycCwga3JwX25leHQpOworCQlDUllQVE9fUkVUUV9VTkxPQ0soKTsKKwl9Cit9CisKK2ludAorY3J5cHRvX2dldGZlYXQoaW50ICpmZWF0cCkKK3sKKwlpbnQgaGlkLCBrYWxnLCBmZWF0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGRfZmxhZ3M7CisKKwlDUllQVE9fRFJJVkVSX0xPQ0soKTsKKwlmb3IgKGhpZCA9IDA7IGhpZCA8IGNyeXB0b19kcml2ZXJzX251bTsgaGlkKyspIHsKKwkJY29uc3Qgc3RydWN0IGNyeXB0b2NhcCAqY2FwID0gJmNyeXB0b19kcml2ZXJzW2hpZF07CisKKwkJaWYgKChjYXAtPmNjX2ZsYWdzICYgQ1JZUFRPQ0FQX0ZfU09GVFdBUkUpICYmCisJCSAgICAhY3J5cHRvX2RldmFsbG93c29mdCkgeworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChrYWxnID0gMDsga2FsZyA8IENSS19BTEdPUklUSE1fTUFYOyBrYWxnKyspCisJCQlpZiAoY2FwLT5jY19rYWxnW2thbGddICYgQ1JZUFRPX0FMR19GTEFHX1NVUFBPUlRFRCkKKwkJCQlmZWF0IHw9ICAxIDw8IGthbGc7CisJfQorCUNSWVBUT19EUklWRVJfVU5MT0NLKCk7CisJKmZlYXRwID0gZmVhdDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogQ3J5cHRvIHRocmVhZCwgZGlzcGF0Y2hlcyBjcnlwdG8gcmVxdWVzdHMuCisgKi8KK3N0YXRpYyBpbnQKK2NyeXB0b19wcm9jKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgY3J5cHRvcCAqY3JwLCAqc3VibWl0OworCXN0cnVjdCBjcnlwdGtvcCAqa3JwLCAqa3JwcDsKKwlzdHJ1Y3QgY3J5cHRvY2FwICpjYXA7CisJdV9pbnQzMl90IGhpZDsKKwlpbnQgcmVzdWx0LCBoaW50OworCXVuc2lnbmVkIGxvbmcgcV9mbGFnczsKKwlpbnQgbG9vcGNvdW50ID0gMDsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwlDUllQVE9fUV9MT0NLKCk7CisJZm9yICg7OykgeworCQkvKgorCQkgKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaW50byBhIGJ1c3kgbG9vcCB3aXRoIG5vdGhpbmcKKwkJICogdG8gZG8sICB0aGUgdHdvIGNyeXB0b19hbGxfKmJsb2NrZWQgdmFycyBoZWxwIHVzIGZpbmQgb3V0IHdoZW4KKwkJICogd2UgYXJlIGFsbCBmdWxsIGFuZCBjYW4gZG8gbm90aGluZyBvbiBhbnkgZHJpdmVyIG9yIFEuICBJZiBzbyB3ZQorCQkgKiB3YWl0IGZvciBhbiB1bmJsb2NrLgorCQkgKi8KKwkJY3J5cHRvX2FsbF9xYmxvY2tlZCAgPSAhbGlzdF9lbXB0eSgmY3JwX3EpOworCisJCS8qCisJCSAqIEZpbmQgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHF1ZXVlIHRoYXQgY2FuIGJlCisJCSAqIHByb2Nlc3NlZCBhbmQgbG9vay1haGVhZCB0byBzZWUgaWYgbXVsdGlwbGUgb3BzCisJCSAqIGFyZSByZWFkeSBmb3IgdGhlIHNhbWUgZHJpdmVyLgorCQkgKi8KKwkJc3VibWl0ID0gTlVMTDsKKwkJaGludCA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3JwLCAmY3JwX3EsIGNycF9uZXh0KSB7CisJCQloaWQgPSBDUllQVE9fU0VTSUQySElEKGNycC0+Y3JwX3NpZCk7CisJCQljYXAgPSBjcnlwdG9fY2hlY2tkcml2ZXIoaGlkKTsKKwkJCS8qCisJCQkgKiBEcml2ZXIgY2Fubm90IGRpc2FwcGVhciB3aGVuIHRoZXJlIGlzIGFuIGFjdGl2ZQorCQkJICogc2Vzc2lvbi4KKwkJCSAqLworCQkJS0FTU0VSVChjYXAgIT0gTlVMTCwgKCIlczoldSBEcml2ZXIgZGlzYXBwZWFyZWQuIiwKKwkJCSAgICBfX2Z1bmNfXywgX19MSU5FX18pKTsKKwkJCWlmIChjYXAgPT0gTlVMTCB8fCBjYXAtPmNjX2RldiA9PSBOVUxMKSB7CisJCQkJLyogT3AgbmVlZHMgdG8gYmUgbWlncmF0ZWQsIHByb2Nlc3MgaXQuICovCisJCQkJaWYgKHN1Ym1pdCA9PSBOVUxMKQorCQkJCQlzdWJtaXQgPSBjcnA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWNhcC0+Y2NfcWJsb2NrZWQpIHsKKwkJCQlpZiAoc3VibWl0ICE9IE5VTEwpIHsKKwkJCQkJLyoKKwkJCQkJICogV2Ugc3RvcCBvbiBmaW5kaW5nIGFub3RoZXIgb3AsCisJCQkJCSAqIHJlZ2FyZGxlc3Mgd2hldGhlciBpdHMgZm9yIHRoZSBzYW1lCisJCQkJCSAqIGRyaXZlciBvciBub3QuICBXZSBjb3VsZCBrZWVwCisJCQkJCSAqIHNlYXJjaGluZyB0aGUgcXVldWUgYnV0IGl0IG1pZ2h0IGJlCisJCQkJCSAqIGJldHRlciB0byBqdXN0IHVzZSBhIHBlci1kcml2ZXIKKwkJCQkJICogcXVldWUgaW5zdGVhZC4KKwkJCQkJICovCisJCQkJCWlmIChDUllQVE9fU0VTSUQySElEKHN1Ym1pdC0+Y3JwX3NpZCkgPT0gaGlkKQorCQkJCQkJaGludCA9IENSWVBUT19ISU5UX01PUkU7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCXN1Ym1pdCA9IGNycDsKKwkJCQkJaWYgKChzdWJtaXQtPmNycF9mbGFncyAmIENSWVBUT19GX0JBVENIKSA9PSAwKQorCQkJCQkJYnJlYWs7CisJCQkJCS8qIGtlZXAgc2Nhbm5pbmcgZm9yIG1vcmUgYXJlIHEnZCAqLworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoc3VibWl0ICE9IE5VTEwpIHsKKwkJCWhpZCA9IENSWVBUT19TRVNJRDJISUQoc3VibWl0LT5jcnBfc2lkKTsKKwkJCWNyeXB0b19hbGxfcWJsb2NrZWQgPSAwOworCQkJbGlzdF9kZWwoJnN1Ym1pdC0+Y3JwX25leHQpOworCQkJY3J5cHRvX2RyaXZlcnNbaGlkXS5jY191bnFibG9ja2VkID0gMTsKKwkJCWNhcCA9IGNyeXB0b19jaGVja2RyaXZlcihoaWQpOworCQkJQ1JZUFRPX1FfVU5MT0NLKCk7CisJCQlLQVNTRVJUKGNhcCAhPSBOVUxMLCAoIiVzOiV1IERyaXZlciBkaXNhcHBlYXJlZC4iLAorCQkJICAgIF9fZnVuY19fLCBfX0xJTkVfXykpOworCQkJcmVzdWx0ID0gY3J5cHRvX2ludm9rZShjYXAsIHN1Ym1pdCwgaGludCk7CisJCQlDUllQVE9fUV9MT0NLKCk7CisJCQlpZiAocmVzdWx0ID09IEVSRVNUQVJUKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgZHJpdmVyIHJhbiBvdXQgb2YgcmVzb3VyY2VzLCBtYXJrIHRoZQorCQkJCSAqIGRyaXZlciBgYGJsb2NrZWQnJyBmb3IgY3J5cHRvcCdzIGFuZCBwdXQKKwkJCQkgKiB0aGUgcmVxdWVzdCBiYWNrIGluIHRoZSBxdWV1ZS4gIEl0IHdvdWxkCisJCQkJICogYmVzdCB0byBwdXQgdGhlIHJlcXVlc3QgYmFjayB3aGVyZSB3ZSBnb3QKKwkJCQkgKiBpdCBidXQgdGhhdCdzIGhhcmQgc28gZm9yIG5vdyB3ZSBwdXQgaXQKKwkJCQkgKiBhdCB0aGUgZnJvbnQuICBUaGlzIHNob3VsZCBiZSBvazsgcHV0dGluZworCQkJCSAqIGl0IGF0IHRoZSBlbmQgZG9lcyBub3Qgd29yay4KKwkJCQkgKi8KKwkJCQkvKiBYWFggdmFsaWRhdGUgc2lkIGFnYWluPyAqLworCQkJCWxpc3RfYWRkKCZzdWJtaXQtPmNycF9uZXh0LCAmY3JwX3EpOworCQkJCWNyeXB0b3N0YXRzLmNzX2Jsb2NrcysrOworCQkJCWlmIChjcnlwdG9fZHJpdmVyc1toaWRdLmNjX3VucWJsb2NrZWQpCisJCQkJCWNyeXB0b19kcml2ZXJzW2hpZF0uY2NfcWJsb2NrZWQ9MDsKKwkJCQljcnlwdG9fZHJpdmVyc1toaWRdLmNjX3VucWJsb2NrZWQ9MDsKKwkJCX0KKwkJCWNyeXB0b19kcml2ZXJzW2hpZF0uY2NfdW5xYmxvY2tlZCA9IDA7CisJCX0KKworCQljcnlwdG9fYWxsX2txYmxvY2tlZCA9ICFsaXN0X2VtcHR5KCZjcnBfa3EpOworCisJCS8qIEFzIGFib3ZlLCBidXQgZm9yIGtleSBvcHMgKi8KKwkJa3JwID0gTlVMTDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShrcnBwLCAmY3JwX2txLCBrcnBfbmV4dCkgeworCQkJY2FwID0gY3J5cHRvX2NoZWNrZHJpdmVyKGtycHAtPmtycF9oaWQpOworCQkJaWYgKGNhcCA9PSBOVUxMIHx8IGNhcC0+Y2NfZGV2ID09IE5VTEwpIHsKKwkJCQkvKgorCQkJCSAqIE9wZXJhdGlvbiBuZWVkcyB0byBiZSBtaWdyYXRlZCwgaW52YWxpZGF0ZQorCQkJCSAqIHRoZSBhc3NpZ25lZCBkZXZpY2Ugc28gaXQgd2lsbCByZXNlbGVjdCBhCisJCQkJICogbmV3IG9uZSBiZWxvdy4gIFByb3BhZ2F0ZSB0aGUgb3JpZ2luYWwKKwkJCQkgKiBjcmlkIHNlbGVjdGlvbiBmbGFncyBpZiBzdXBwbGllZC4KKwkJCQkgKi8KKwkJCQlrcnAtPmtycF9oaWQgPSBrcnAtPmtycF9jcmlkICYKKwkJCQkgICAgKENSWVBUT0NBUF9GX1NPRlRXQVJFfENSWVBUT0NBUF9GX0hBUkRXQVJFKTsKKwkJCQlpZiAoa3JwLT5rcnBfaGlkID09IDApCisJCQkJCWtycC0+a3JwX2hpZCA9CisJCQkJICAgIENSWVBUT0NBUF9GX1NPRlRXQVJFfENSWVBUT0NBUF9GX0hBUkRXQVJFOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFjYXAtPmNjX2txYmxvY2tlZCkgeworCQkJCWtycCA9IGtycHA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGtycCAhPSBOVUxMKSB7CisJCQljcnlwdG9fYWxsX2txYmxvY2tlZCA9IDA7CisJCQlsaXN0X2RlbCgma3JwLT5rcnBfbmV4dCk7CisJCQljcnlwdG9fZHJpdmVyc1trcnAtPmtycF9oaWRdLmNjX2txYmxvY2tlZCA9IDE7CisJCQlDUllQVE9fUV9VTkxPQ0soKTsKKwkJCXJlc3VsdCA9IGNyeXB0b19raW52b2tlKGtycCwga3JwLT5rcnBfaGlkKTsKKwkJCUNSWVBUT19RX0xPQ0soKTsKKwkJCWlmIChyZXN1bHQgPT0gRVJFU1RBUlQpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBkcml2ZXIgcmFuIG91dCBvZiByZXNvdXJjZXMsIG1hcmsgdGhlCisJCQkJICogZHJpdmVyIGBgYmxvY2tlZCcnIGZvciBjcnlwdGtvcCdzIGFuZCBwdXQKKwkJCQkgKiB0aGUgcmVxdWVzdCBiYWNrIGluIHRoZSBxdWV1ZS4gIEl0IHdvdWxkCisJCQkJICogYmVzdCB0byBwdXQgdGhlIHJlcXVlc3QgYmFjayB3aGVyZSB3ZSBnb3QKKwkJCQkgKiBpdCBidXQgdGhhdCdzIGhhcmQgc28gZm9yIG5vdyB3ZSBwdXQgaXQKKwkJCQkgKiBhdCB0aGUgZnJvbnQuICBUaGlzIHNob3VsZCBiZSBvazsgcHV0dGluZworCQkJCSAqIGl0IGF0IHRoZSBlbmQgZG9lcyBub3Qgd29yay4KKwkJCQkgKi8KKwkJCQkvKiBYWFggdmFsaWRhdGUgc2lkIGFnYWluPyAqLworCQkJCWxpc3RfYWRkKCZrcnAtPmtycF9uZXh0LCAmY3JwX2txKTsKKwkJCQljcnlwdG9zdGF0cy5jc19rYmxvY2tzKys7CisJCQl9IGVsc2UKKwkJCQljcnlwdG9fZHJpdmVyc1trcnAtPmtycF9oaWRdLmNjX2txYmxvY2tlZCA9IDA7CisJCX0KKworCQlpZiAoc3VibWl0ID09IE5VTEwgJiYga3JwID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBOb3RoaW5nIG1vcmUgdG8gYmUgcHJvY2Vzc2VkLiAgU2xlZXAgdW50aWwgd2UncmUKKwkJCSAqIHdva2VuIGJlY2F1c2UgdGhlcmUgYXJlIG1vcmUgb3BzIHRvIHByb2Nlc3MuCisJCQkgKiBUaGlzIGhhcHBlbnMgZWl0aGVyIGJ5IHN1Ym1pc3Npb24gb3IgYnkgYSBkcml2ZXIKKwkJCSAqIGJlY29taW5nIHVuYmxvY2tlZCBhbmQgbm90aWZ5aW5nIHVzIHRocm91Z2gKKwkJCSAqIGNyeXB0b191bmJsb2NrLiAgTm90ZSB0aGF0IHdoZW4gd2Ugd2FrZXVwIHdlCisJCQkgKiBzdGFydCBwcm9jZXNzaW5nIGVhY2ggcXVldWUgYWdhaW4gZnJvbSB0aGUKKwkJCSAqIGZyb250LiBJdCdzIG5vdCBjbGVhciB0aGF0IGl0J3MgaW1wb3J0YW50IHRvCisJCQkgKiBwcmVzZXJ2ZSB0aGlzIG9yZGVyaW5nIHNpbmNlIG9wcyBtYXkgZmluaXNoCisJCQkgKiBvdXQgb2Ygb3JkZXIgaWYgZGlzcGF0Y2hlZCB0byBkaWZmZXJlbnQgZGV2aWNlcworCQkJICogYW5kIHNvbWUgYmVjb21lIGJsb2NrZWQgd2hpbGUgb3RoZXJzIGRvIG5vdC4KKwkJCSAqLworCQkJZHByaW50aygiJXMgLSBzbGVlcGluZyAocWU9JWQgcWI9JWQga3FlPSVkIGtxYj0lZClcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywKKwkJCQkJbGlzdF9lbXB0eSgmY3JwX3EpLCBjcnlwdG9fYWxsX3FibG9ja2VkLAorCQkJCQlsaXN0X2VtcHR5KCZjcnBfa3EpLCBjcnlwdG9fYWxsX2txYmxvY2tlZCk7CisJCQlsb29wY291bnQgPSAwOworCQkJQ1JZUFRPX1FfVU5MT0NLKCk7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY3J5cHRvcHJvY193YWl0LAorCQkJCQkhKGxpc3RfZW1wdHkoJmNycF9xKSB8fCBjcnlwdG9fYWxsX3FibG9ja2VkKSB8fAorCQkJCQkhKGxpc3RfZW1wdHkoJmNycF9rcSkgfHwgY3J5cHRvX2FsbF9rcWJsb2NrZWQpIHx8CisJCQkJCWt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJCQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnbWFza19sb2NrKTsKKyNlbmRpZgorCQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJCQkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdtYXNrX2xvY2spOworI2VuZGlmCisJCQl9CisJCQlDUllQVE9fUV9MT0NLKCk7CisJCQlkcHJpbnRrKCIlcyAtIGF3YWtlXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCQlicmVhazsKKwkJCWNyeXB0b3N0YXRzLmNzX2ludHJzKys7CisJCX0gZWxzZSBpZiAobG9vcGNvdW50ID4gY3J5cHRvX21heF9sb29wY291bnQpIHsKKwkJCS8qCisJCQkgKiBHaXZlIG90aGVyIHByb2Nlc3NlcyBhIGNoYW5jZSB0byBydW4gaWYgd2UndmUgCisJCQkgKiBiZWVuIHVzaW5nIHRoZSBDUFUgZXhjbHVzaXZlbHkgZm9yIGEgd2hpbGUuCisJCQkgKi8KKwkJCWxvb3Bjb3VudCA9IDA7CisJCQlDUllQVE9fUV9VTkxPQ0soKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlDUllQVE9fUV9MT0NLKCk7CisJCX0KKwkJbG9vcGNvdW50Kys7CisJfQorCUNSWVBUT19RX1VOTE9DSygpOworCXJldHVybiAwOworfQorCisvKgorICogQ3J5cHRvIHJldHVybnMgdGhyZWFkLCBkb2VzIGNhbGxiYWNrcyBmb3IgcHJvY2Vzc2VkIGNyeXB0byByZXF1ZXN0cy4KKyAqIENhbGxiYWNrcyBhcmUgZG9uZSBoZXJlLCByYXRoZXIgdGhhbiBpbiB0aGUgY3J5cHRvIGRyaXZlcnMsIGJlY2F1c2UKKyAqIGNhbGxiYWNrcyB0eXBpY2FsbHkgYXJlIGV4cGVuc2l2ZSBhbmQgd291bGQgc2xvdyBpbnRlcnJ1cHQgaGFuZGxpbmcuCisgKi8KK3N0YXRpYyBpbnQKK2NyeXB0b19yZXRfcHJvYyh2b2lkICphcmcpCit7CisJc3RydWN0IGNyeXB0b3AgKmNycHQ7CisJc3RydWN0IGNyeXB0a29wICprcnB0OworCXVuc2lnbmVkIGxvbmcgIHJfZmxhZ3M7CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCisJQ1JZUFRPX1JFVFFfTE9DSygpOworCWZvciAoOzspIHsKKwkJLyogSGFydmVzdCByZXR1cm4gcSdzIGZvciBjb21wbGV0ZWQgb3BzICovCisJCWNycHQgPSBOVUxMOworCQlpZiAoIWxpc3RfZW1wdHkoJmNycF9yZXRfcSkpCisJCQljcnB0ID0gbGlzdF9lbnRyeShjcnBfcmV0X3EubmV4dCwgdHlwZW9mKCpjcnB0KSwgY3JwX25leHQpOworCQlpZiAoY3JwdCAhPSBOVUxMKQorCQkJbGlzdF9kZWwoJmNycHQtPmNycF9uZXh0KTsKKworCQlrcnB0ID0gTlVMTDsKKwkJaWYgKCFsaXN0X2VtcHR5KCZjcnBfcmV0X2txKSkKKwkJCWtycHQgPSBsaXN0X2VudHJ5KGNycF9yZXRfa3EubmV4dCwgdHlwZW9mKCprcnB0KSwga3JwX25leHQpOworCQlpZiAoa3JwdCAhPSBOVUxMKQorCQkJbGlzdF9kZWwoJmtycHQtPmtycF9uZXh0KTsKKworCQlpZiAoY3JwdCAhPSBOVUxMIHx8IGtycHQgIT0gTlVMTCkgeworCQkJQ1JZUFRPX1JFVFFfVU5MT0NLKCk7CisJCQkvKgorCQkJICogUnVuIGNhbGxiYWNrcyB1bmxvY2tlZC4KKwkJCSAqLworCQkJaWYgKGNycHQgIT0gTlVMTCkKKwkJCQljcnB0LT5jcnBfY2FsbGJhY2soY3JwdCk7CisJCQlpZiAoa3JwdCAhPSBOVUxMKQorCQkJCWtycHQtPmtycF9jYWxsYmFjayhrcnB0KTsKKwkJCUNSWVBUT19SRVRRX0xPQ0soKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBOb3RoaW5nIG1vcmUgdG8gYmUgcHJvY2Vzc2VkLiAgU2xlZXAgdW50aWwgd2UncmUKKwkJCSAqIHdva2VuIGJlY2F1c2UgdGhlcmUgYXJlIG1vcmUgcmV0dXJucyB0byBwcm9jZXNzLgorCQkJICovCisJCQlkcHJpbnRrKCIlcyAtIHNsZWVwaW5nXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJQ1JZUFRPX1JFVFFfVU5MT0NLKCk7CisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY3J5cHRvcmV0cHJvY193YWl0LAorCQkJCQkhbGlzdF9lbXB0eSgmY3JwX3JldF9xKSB8fAorCQkJCQkhbGlzdF9lbXB0eSgmY3JwX3JldF9rcSkgfHwKKwkJCQkJa3RocmVhZF9zaG91bGRfc3RvcCgpKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyAoY3VycmVudCkpIHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwkJCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdtYXNrX2xvY2spOworI2VuZGlmCisJCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwkJCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ21hc2tfbG9jayk7CisjZW5kaWYKKwkJCX0KKwkJCUNSWVBUT19SRVRRX0xPQ0soKTsKKwkJCWRwcmludGsoIiVzIC0gYXdha2VcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCQkJZHByaW50aygiJXMgLSBFWElUSU5HIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNyeXB0b3N0YXRzLmNzX3JldHMrKzsKKwkJfQorCX0KKwlDUllQVE9fUkVUUV9VTkxPQ0soKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWYgMCAvKiBzaG91bGQgcHV0IHRoaXMgaW50byAvcHJvYyBvciBzb21ldGhpbmcgKi8KK3N0YXRpYyB2b2lkCitkYl9zaG93X2RyaXZlcnModm9pZCkKK3sKKwlpbnQgaGlkOworCisJZGJfcHJpbnRmKCIlMTJzICU0cyAlNHMgJThzICUycyAlMnNcbiIKKwkJLCAiRGV2aWNlIgorCQksICJTZXMiCisJCSwgIktvcHMiCisJCSwgIkZsYWdzIgorCQksICJRQiIKKwkJLCAiS0IiCisJKTsKKwlmb3IgKGhpZCA9IDA7IGhpZCA8IGNyeXB0b19kcml2ZXJzX251bTsgaGlkKyspIHsKKwkJY29uc3Qgc3RydWN0IGNyeXB0b2NhcCAqY2FwID0gJmNyeXB0b19kcml2ZXJzW2hpZF07CisJCWlmIChjYXAtPmNjX2RldiA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWRiX3ByaW50ZigiJS0xMnMgJTR1ICU0dSAlMDh4ICUydSAlMnVcbiIKKwkJICAgICwgZGV2aWNlX2dldF9uYW1ldW5pdChjYXAtPmNjX2RldikKKwkJICAgICwgY2FwLT5jY19zZXNzaW9ucworCQkgICAgLCBjYXAtPmNjX2tvcGVyYXRpb25zCisJCSAgICAsIGNhcC0+Y2NfZmxhZ3MKKwkJICAgICwgY2FwLT5jY19xYmxvY2tlZAorCQkgICAgLCBjYXAtPmNjX2txYmxvY2tlZAorCQkpOworCX0KK30KKworREJfU0hPV19DT01NQU5EKGNyeXB0bywgZGJfc2hvd19jcnlwdG8pCit7CisJc3RydWN0IGNyeXB0b3AgKmNycDsKKworCWRiX3Nob3dfZHJpdmVycygpOworCWRiX3ByaW50ZigiXG4iKTsKKworCWRiX3ByaW50ZigiJTRzICU4cyAlNHMgJTRzICU0cyAlNHMgJThzICU4c1xuIiwKKwkgICAgIkhJRCIsICJDYXBzIiwgIklsZW4iLCAiT2xlbiIsICJFdHlwZSIsICJGbGFncyIsCisJICAgICJEZXNjIiwgIkNhbGxiYWNrIik7CisJVEFJTFFfRk9SRUFDSChjcnAsICZjcnBfcSwgY3JwX25leHQpIHsKKwkJZGJfcHJpbnRmKCIlNHUgJTA4eCAlNHUgJTR1ICU0dSAlMDR4ICU4cCAlOHBcbiIKKwkJICAgICwgKGludCkgQ1JZUFRPX1NFU0lEMkhJRChjcnAtPmNycF9zaWQpCisJCSAgICAsIChpbnQpIENSWVBUT19TRVNJRDJDQVBTKGNycC0+Y3JwX3NpZCkKKwkJICAgICwgY3JwLT5jcnBfaWxlbiwgY3JwLT5jcnBfb2xlbgorCQkgICAgLCBjcnAtPmNycF9ldHlwZQorCQkgICAgLCBjcnAtPmNycF9mbGFncworCQkgICAgLCBjcnAtPmNycF9kZXNjCisJCSAgICAsIGNycC0+Y3JwX2NhbGxiYWNrCisJCSk7CisJfQorCWlmICghVEFJTFFfRU1QVFkoJmNycF9yZXRfcSkpIHsKKwkJZGJfcHJpbnRmKCJcbiU0cyAlNHMgJTRzICU4c1xuIiwKKwkJICAgICJISUQiLCAiRXR5cGUiLCAiRmxhZ3MiLCAiQ2FsbGJhY2siKTsKKwkJVEFJTFFfRk9SRUFDSChjcnAsICZjcnBfcmV0X3EsIGNycF9uZXh0KSB7CisJCQlkYl9wcmludGYoIiU0dSAlNHUgJTA0eCAlOHBcbiIKKwkJCSAgICAsIChpbnQpIENSWVBUT19TRVNJRDJISUQoY3JwLT5jcnBfc2lkKQorCQkJICAgICwgY3JwLT5jcnBfZXR5cGUKKwkJCSAgICAsIGNycC0+Y3JwX2ZsYWdzCisJCQkgICAgLCBjcnAtPmNycF9jYWxsYmFjaworCQkJKTsKKwkJfQorCX0KK30KKworREJfU0hPV19DT01NQU5EKGtjcnlwdG8sIGRiX3Nob3dfa2NyeXB0bykKK3sKKwlzdHJ1Y3QgY3J5cHRrb3AgKmtycDsKKworCWRiX3Nob3dfZHJpdmVycygpOworCWRiX3ByaW50ZigiXG4iKTsKKworCWRiX3ByaW50ZigiJTRzICU1cyAlNHMgJTRzICU4cyAlNHMgJThzXG4iLAorCSAgICAiT3AiLCAiU3RhdHVzIiwgIiNJUCIsICIjT1AiLCAiQ1JJRCIsICJISUQiLCAiQ2FsbGJhY2siKTsKKwlUQUlMUV9GT1JFQUNIKGtycCwgJmNycF9rcSwga3JwX25leHQpIHsKKwkJZGJfcHJpbnRmKCIlNHUgJTV1ICU0dSAlNHUgJTA4eCAlNHUgJThwXG4iCisJCSAgICAsIGtycC0+a3JwX29wCisJCSAgICAsIGtycC0+a3JwX3N0YXR1cworCQkgICAgLCBrcnAtPmtycF9pcGFyYW1zLCBrcnAtPmtycF9vcGFyYW1zCisJCSAgICAsIGtycC0+a3JwX2NyaWQsIGtycC0+a3JwX2hpZAorCQkgICAgLCBrcnAtPmtycF9jYWxsYmFjaworCQkpOworCX0KKwlpZiAoIVRBSUxRX0VNUFRZKCZjcnBfcmV0X3EpKSB7CisJCWRiX3ByaW50ZigiJTRzICU1cyAlOHMgJTRzICU4c1xuIiwKKwkJICAgICJPcCIsICJTdGF0dXMiLCAiQ1JJRCIsICJISUQiLCAiQ2FsbGJhY2siKTsKKwkJVEFJTFFfRk9SRUFDSChrcnAsICZjcnBfcmV0X2txLCBrcnBfbmV4dCkgeworCQkJZGJfcHJpbnRmKCIlNHUgJTV1ICUwOHggJTR1ICU4cFxuIgorCQkJICAgICwga3JwLT5rcnBfb3AKKwkJCSAgICAsIGtycC0+a3JwX3N0YXR1cworCQkJICAgICwga3JwLT5rcnBfY3JpZCwga3JwLT5rcnBfaGlkCisJCQkgICAgLCBrcnAtPmtycF9jYWxsYmFjaworCQkJKTsKKwkJfQorCX0KK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQKK2NyeXB0b19pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCXVuc2lnbmVkIGxvbmcgY3B1OworCisJZHByaW50aygiJXMoJXApXG4iLCBfX0ZVTkNUSU9OX18sICh2b2lkICopIGNyeXB0b19pbml0KTsKKworCWlmIChjcnlwdG9faW5pdHRlZCkKKwkJcmV0dXJuIDA7CisJY3J5cHRvX2luaXR0ZWQgPSAxOworCisJc3Bpbl9sb2NrX2luaXQoJmNyeXB0b19kcml2ZXJzX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjcnlwdG9fcV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY3J5cHRvX3JldF9xX2xvY2spOworCisJY3J5cHRvcF96b25lID0ga21lbV9jYWNoZV9jcmVhdGUoImNyeXB0b3AiLCBzaXplb2Yoc3RydWN0IGNyeXB0b3ApLAorCQkJCSAgICAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjMpCisJCQkJICAgICAgICwgTlVMTAorI2VuZGlmCisJCQkJCSk7CisKKwljcnlwdG9kZXNjX3pvbmUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiY3J5cHRvZGVzYyIsIHNpemVvZihzdHJ1Y3QgY3J5cHRvZGVzYyksCisJCQkJICAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMykKKwkJCQkgICAgICAgLCBOVUxMCisjZW5kaWYKKwkJCQkJKTsKKworCWlmIChjcnlwdG9kZXNjX3pvbmUgPT0gTlVMTCB8fCBjcnlwdG9wX3pvbmUgPT0gTlVMTCkgeworCQlwcmludGsoImNyeXB0bzogY3J5cHRvX2luaXQgY2Fubm90IHNldHVwIGNyeXB0byB6b25lc1xuIik7CisJCWVycm9yID0gRU5PTUVNOworCQlnb3RvIGJhZDsKKwl9CisKKwljcnlwdG9fZHJpdmVyc19udW0gPSBDUllQVE9fRFJJVkVSU19JTklUSUFMOworCWNyeXB0b19kcml2ZXJzID0ga21hbGxvYyhjcnlwdG9fZHJpdmVyc19udW0gKiBzaXplb2Yoc3RydWN0IGNyeXB0b2NhcCksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoY3J5cHRvX2RyaXZlcnMgPT0gTlVMTCkgeworCQlwcmludGsoImNyeXB0bzogY3J5cHRvX2luaXQgY2Fubm90IHNldHVwIGNyeXB0byBkcml2ZXJzXG4iKTsKKwkJZXJyb3IgPSBFTk9NRU07CisJCWdvdG8gYmFkOworCX0KKworCW1lbXNldChjcnlwdG9fZHJpdmVycywgMCwgY3J5cHRvX2RyaXZlcnNfbnVtICogc2l6ZW9mKHN0cnVjdCBjcnlwdG9jYXApKTsKKworCW9jZl9mb3JfZWFjaF9jcHUoY3B1KSB7CisJCWNyeXB0b3Byb2NbY3B1XSA9IGt0aHJlYWRfY3JlYXRlKGNyeXB0b19wcm9jLCAodm9pZCAqKSBjcHUsCisJCQkJCQkJCQkib2NmXyVkIiwgKGludCkgY3B1KTsKKwkJaWYgKElTX0VSUihjcnlwdG9wcm9jW2NwdV0pKSB7CisJCQllcnJvciA9IFBUUl9FUlIoY3J5cHRvcHJvY1tjcHVdKTsKKwkJCXByaW50aygiY3J5cHRvOiBjcnlwdG9faW5pdCBjYW5ub3Qgc3RhcnQgY3J5cHRvIHRocmVhZDsgZXJyb3IgJWQiLAorCQkJCWVycm9yKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWt0aHJlYWRfYmluZChjcnlwdG9wcm9jW2NwdV0sIGNwdSk7CisJCXdha2VfdXBfcHJvY2VzcyhjcnlwdG9wcm9jW2NwdV0pOworCisJCWNyeXB0b3JldHByb2NbY3B1XSA9IGt0aHJlYWRfY3JlYXRlKGNyeXB0b19yZXRfcHJvYywgKHZvaWQgKikgY3B1LAorCQkJCQkJCQkJIm9jZl9yZXRfJWQiLCAoaW50KSBjcHUpOworCQlpZiAoSVNfRVJSKGNyeXB0b3JldHByb2NbY3B1XSkpIHsKKwkJCWVycm9yID0gUFRSX0VSUihjcnlwdG9yZXRwcm9jW2NwdV0pOworCQkJcHJpbnRrKCJjcnlwdG86IGNyeXB0b19pbml0IGNhbm5vdCBzdGFydCBjcnlwdG9yZXQgdGhyZWFkOyBlcnJvciAlZCIsCisJCQkJCWVycm9yKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCWt0aHJlYWRfYmluZChjcnlwdG9yZXRwcm9jW2NwdV0sIGNwdSk7CisJCXdha2VfdXBfcHJvY2VzcyhjcnlwdG9yZXRwcm9jW2NwdV0pOworCX0KKworCXJldHVybiAwOworYmFkOgorCWNyeXB0b19leGl0KCk7CisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyB2b2lkCitjcnlwdG9fZXhpdCh2b2lkKQoreworCWludCBjcHU7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJLyoKKwkgKiBUZXJtaW5hdGUgYW55IGNyeXB0byB0aHJlYWRzLgorCSAqLworCW9jZl9mb3JfZWFjaF9jcHUoY3B1KSB7CisJCWt0aHJlYWRfc3RvcChjcnlwdG9wcm9jW2NwdV0pOworCQlrdGhyZWFkX3N0b3AoY3J5cHRvcmV0cHJvY1tjcHVdKTsKKwl9CisKKwkvKiAKKwkgKiBSZWNsYWltIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCByZXNvdXJjZXMuCisJICovCisJaWYgKGNyeXB0b19kcml2ZXJzICE9IE5VTEwpCisJCWtmcmVlKGNyeXB0b19kcml2ZXJzKTsKKworCWlmIChjcnlwdG9kZXNjX3pvbmUgIT0gTlVMTCkKKwkJa21lbV9jYWNoZV9kZXN0cm95KGNyeXB0b2Rlc2Nfem9uZSk7CisJaWYgKGNyeXB0b3Bfem9uZSAhPSBOVUxMKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koY3J5cHRvcF96b25lKTsKK30KKworCitFWFBPUlRfU1lNQk9MKGNyeXB0b19uZXdzZXNzaW9uKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX2ZyZWVzZXNzaW9uKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX2dldF9kcml2ZXJpZCk7CitFWFBPUlRfU1lNQk9MKGNyeXB0b19rcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChjcnlwdG9fcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChjcnlwdG9fdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKGNyeXB0b191bnJlZ2lzdGVyX2FsbCk7CitFWFBPUlRfU1lNQk9MKGNyeXB0b191bmJsb2NrKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX2Rpc3BhdGNoKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX2tkaXNwYXRjaCk7CitFWFBPUlRfU1lNQk9MKGNyeXB0b19mcmVlcmVxKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX2dldHJlcSk7CitFWFBPUlRfU1lNQk9MKGNyeXB0b19kb25lKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX2tkb25lKTsKK0VYUE9SVF9TWU1CT0woY3J5cHRvX2dldGZlYXQpOworRVhQT1JUX1NZTUJPTChjcnlwdG9fdXNlcmFzeW1jcnlwdG8pOworRVhQT1JUX1NZTUJPTChjcnlwdG9fZ2V0Y2Fwcyk7CitFWFBPUlRfU1lNQk9MKGNyeXB0b19maW5kX2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKGNyeXB0b19maW5kX2RldmljZV9ieWhpZCk7CisKK21vZHVsZV9pbml0KGNyeXB0b19pbml0KTsKK21vZHVsZV9leGl0KGNyeXB0b19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkJTRCIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRfbWNjdWxsb3VnaEBtY2FmZWUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJPQ0YgKE9wZW5CU0QgQ3J5cHRvZ3JhcGhpYyBGcmFtZXdvcmspIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vb2NmL2NyeXB0b2Rldi5jIGIvY3J5cHRvL29jZi9jcnlwdG9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWUzNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29jZi9jcnlwdG9kZXYuYwpAQCAtMCwwICsxLDEwNjkgQEAKKy8qCSRPcGVuQlNEOiBjcnlwdG9kZXYuYyx2IDEuNTIgMjAwMi8wNi8xOSAwNzoyMjo0NiBkZXJhYWR0IEV4cCAkCSovCisKKy8qLQorICogTGludXggcG9ydCBkb25lIGJ5IERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkX21jY3VsbG91Z2hAbWNhZmVlLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIERhdmlkIE1jQ3VsbG91Z2gKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEludGVsIENvcnBvcmF0aW9uLgorICogVGhlIGxpY2Vuc2UgYW5kIG9yaWdpbmFsIGF1dGhvciBhcmUgbGlzdGVkIGJlbG93LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGVvIGRlIFJhYWR0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBTYW0gTGVmZmxlciwgRXJybm8gQ29uc3VsdGluZworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogRWZmb3J0IHNwb25zb3JlZCBpbiBwYXJ0IGJ5IHRoZSBEZWZlbnNlIEFkdmFuY2VkIFJlc2VhcmNoIFByb2plY3RzCisgKiBBZ2VuY3kgKERBUlBBKSBhbmQgQWlyIEZvcmNlIFJlc2VhcmNoIExhYm9yYXRvcnksIEFpciBGb3JjZQorICogTWF0ZXJpZWwgQ29tbWFuZCwgVVNBRiwgdW5kZXIgYWdyZWVtZW50IG51bWJlciBGMzA2MDItMDEtMi0wNTM3LgorICoKK19fRkJTRElEKCIkRnJlZUJTRDogc3JjL3N5cy9vcGVuY3J5cHRvL2NyeXB0b2Rldi5jLHYgMS4zNCAyMDA3LzA1LzA5IDE5OjM3OjAyIGdubiBFeHAgJCIpOworICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSAmJiAhZGVmaW5lZChBVVRPQ09ORl9JTkNMVURFRCkKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGNyeXB0b2Rldi5oPgorI2luY2x1ZGUgPHVpby5oPgorCitleHRlcm4gYXNtbGlua2FnZSBsb25nIHN5c19kdXAodW5zaWduZWQgaW50IGZpbGRlcyk7CisKKyNkZWZpbmUgZGVidWcgY3J5cHRvZGV2X2RlYnVnCitpbnQgY3J5cHRvZGV2X2RlYnVnID0gMDsKK21vZHVsZV9wYXJhbShjcnlwdG9kZXZfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNyeXB0b2Rldl9kZWJ1ZywgIkVuYWJsZSBjcnlwdG9kZXYgZGVidWciKTsKKworc3RydWN0IGNzZXNzaW9uX2luZm8geworCXVfaW50MTZfdAlibG9ja3NpemU7CisJdV9pbnQxNl90CW1pbmtleSwgbWF4a2V5OworCisJdV9pbnQxNl90CWtleXNpemU7CisJLyogdV9pbnQxNl90CWhhc2hzaXplOyAgKi8KKwl1X2ludDE2X3QJYXV0aHNpemU7CisJdV9pbnQxNl90CWF1dGhrZXk7CisJLyogdV9pbnQxNl90CWN0eHNpemU7ICovCit9OworCitzdHJ1Y3QgY3Nlc3Npb24geworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwl1X2ludDY0X3QJc2lkOworCXVfaW50MzJfdAlzZXM7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0cTsKKworCXVfaW50MzJfdAljaXBoZXI7CisKKwl1X2ludDMyX3QJbWFjOworCisJY2FkZHJfdAkJa2V5OworCWludAkJa2V5bGVuOworCXVfY2hhcgkJdG1wX2l2W0VBTEdfTUFYX0JMT0NLX0xFTl07CisKKwljYWRkcl90CQltYWNrZXk7CisJaW50CQltYWNrZXlsZW47CisKKwlzdHJ1Y3QgY3Nlc3Npb25faW5mbyBpbmZvOworCisJc3RydWN0IGlvdmVjCWlvdmVjOworCXN0cnVjdCB1aW8JdWlvOworCWludAkJZXJyb3I7Cit9OworCitzdHJ1Y3QgZmNyeXB0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWNzZXNzaW9uczsKKwlpbnQJCXNlc247Cit9OworCitzdGF0aWMgc3RydWN0IGNzZXNzaW9uICpjc2VmaW5kKHN0cnVjdCBmY3J5cHQgKiwgdV9pbnQpOworc3RhdGljIGludCBjc2VkZWxldGUoc3RydWN0IGZjcnlwdCAqLCBzdHJ1Y3QgY3Nlc3Npb24gKik7CitzdGF0aWMgc3RydWN0IGNzZXNzaW9uICpjc2VhZGQoc3RydWN0IGZjcnlwdCAqLCBzdHJ1Y3QgY3Nlc3Npb24gKik7CitzdGF0aWMgc3RydWN0IGNzZXNzaW9uICpjc2VjcmVhdGUoc3RydWN0IGZjcnlwdCAqLCB1X2ludDY0X3QsCisJCXN0cnVjdCBjcnlwdG9pbmkgKmNyaWUsIHN0cnVjdCBjcnlwdG9pbmkgKmNyaWEsIHN0cnVjdCBjc2Vzc2lvbl9pbmZvICopOworc3RhdGljIGludCBjc2VmcmVlKHN0cnVjdCBjc2Vzc2lvbiAqKTsKKworc3RhdGljCWludCBjcnlwdG9kZXZfb3Aoc3RydWN0IGNzZXNzaW9uICosIHN0cnVjdCBjcnlwdF9vcCAqKTsKK3N0YXRpYwlpbnQgY3J5cHRvZGV2X2tleShzdHJ1Y3QgY3J5cHRfa29wICopOworc3RhdGljCWludCBjcnlwdG9kZXZfZmluZChzdHJ1Y3QgY3J5cHRfZmluZF9vcCAqKTsKKworc3RhdGljIGludCBjcnlwdG9kZXZfY2Iodm9pZCAqKTsKK3N0YXRpYyBpbnQgY3J5cHRvZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworCisvKgorICogQ2hlY2sgYSBjcnlwdG8gaWRlbnRpZmllciB0byBzZWUgaWYgaXQgcmVxdWVzdGVkCisgKiBhIHZhbGlkIGNyaWQgYW5kIGl0J3MgY2FwYWJpbGl0aWVzIG1hdGNoLgorICovCitzdGF0aWMgaW50CitjaGVja2NyaWQoaW50IGNyaWQpCit7CisJaW50IGhpZCA9IGNyaWQgJiB+KENSWVBUT0NBUF9GX1NPRlRXQVJFIHwgQ1JZUFRPQ0FQX0ZfSEFSRFdBUkUpOworCWludCB0eXAgPSBjcmlkICYgKENSWVBUT0NBUF9GX1NPRlRXQVJFIHwgQ1JZUFRPQ0FQX0ZfSEFSRFdBUkUpOworCWludCBjYXBzID0gMDsKKwkKKwkvKiBpZiB0aGUgdXNlciBoYXNuJ3Qgc2VsZWN0ZWQgYSBkcml2ZXIsIHRoZW4ganVzdCBjYWxsIG5ld3Nlc3Npb24gKi8KKwlpZiAoaGlkID09IDAgJiYgdHlwICE9IDApCisJCXJldHVybiAwOworCisJY2FwcyA9IGNyeXB0b19nZXRjYXBzKGhpZCk7CisKKwkvKiBkaWRuJ3QgZmluZCBhbnl0aGluZyB3aXRoIGNhcGFiaWxpdGllcyAqLworCWlmIChjYXBzID09IDApIHsKKwkJZHByaW50aygiJXM6IGhpZD0leCB0eXA9JXggbm90IG1hdGNoZWRcbiIsIF9fRlVOQ1RJT05fXywgaGlkLCB0eXApOworCQlyZXR1cm4gRUlOVkFMOworCX0KKwkKKwkvKiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeSBTVyBvciBIVywgc28gdGhlIGRyaXZlciBpcyBvayAqLworCWlmICh0eXAgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBpZiB0aGUgdHlwZSBzcGVjaWZpZWQgZGlkbid0IG1hdGNoICovCisJaWYgKHR5cCAhPSAoY2FwcyAmIChDUllQVE9DQVBfRl9TT0ZUV0FSRSB8IENSWVBUT0NBUF9GX0hBUkRXQVJFKSkpIHsKKwkJZHByaW50aygiJXM6IGhpZD0leCB0eXA9JXggY2Fwcz0leCBub3QgbWF0Y2hlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJCWhpZCwgdHlwLCBjYXBzKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorY3J5cHRvZGV2X29wKHN0cnVjdCBjc2Vzc2lvbiAqY3NlLCBzdHJ1Y3QgY3J5cHRfb3AgKmNvcCkKK3sKKwlzdHJ1Y3QgY3J5cHRvcCAqY3JwID0gTlVMTDsKKwlzdHJ1Y3QgY3J5cHRvZGVzYyAqY3JkZSA9IE5VTEwsICpjcmRhID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoY29wLT5sZW4gPiBDUllQVE9fTUFYX0RBVEFfTEVOKSB7CisJCWRwcmludGsoIiVzOiAlZCA+ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGNvcC0+bGVuLCBDUllQVE9fTUFYX0RBVEFfTEVOKTsKKwkJcmV0dXJuIChFMkJJRyk7CisJfQorCisJaWYgKGNzZS0+aW5mby5ibG9ja3NpemUgJiYgKGNvcC0+bGVuICUgY3NlLT5pbmZvLmJsb2Nrc2l6ZSkgIT0gMCkgeworCQlkcHJpbnRrKCIlczogYmxvY2tzaXplPSVkIGxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCBjc2UtPmluZm8uYmxvY2tzaXplLAorCQkJCWNvcC0+bGVuKTsKKwkJcmV0dXJuIChFSU5WQUwpOworCX0KKworCWNzZS0+dWlvLnVpb19pb3YgPSAmY3NlLT5pb3ZlYzsKKwljc2UtPnVpby51aW9faW92Y250ID0gMTsKKwljc2UtPnVpby51aW9fb2Zmc2V0ID0gMDsKKyNpZiAwCisJY3NlLT51aW8udWlvX3Jlc2lkID0gY29wLT5sZW47CisJY3NlLT51aW8udWlvX3NlZ2ZsZyA9IFVJT19TWVNTUEFDRTsKKwljc2UtPnVpby51aW9fcncgPSBVSU9fV1JJVEU7CisJY3NlLT51aW8udWlvX3RkID0gdGQ7CisjZW5kaWYKKwljc2UtPnVpby51aW9faW92WzBdLmlvdl9sZW4gPSBjb3AtPmxlbjsKKwlpZiAoY3NlLT5pbmZvLmF1dGhzaXplKQorCQljc2UtPnVpby51aW9faW92WzBdLmlvdl9sZW4gKz0gY3NlLT5pbmZvLmF1dGhzaXplOworCWNzZS0+dWlvLnVpb19pb3ZbMF0uaW92X2Jhc2UgPSBrbWFsbG9jKGNzZS0+dWlvLnVpb19pb3ZbMF0uaW92X2xlbiwKKwkJCUdGUF9LRVJORUwpOworCisJaWYgKGNzZS0+dWlvLnVpb19pb3ZbMF0uaW92X2Jhc2UgPT0gTlVMTCkgeworCQlkcHJpbnRrKCIlczogaW92X2Jhc2Uga21hbGxvYyglZCkgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJKGludCljc2UtPnVpby51aW9faW92WzBdLmlvdl9sZW4pOworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJY3JwID0gY3J5cHRvX2dldHJlcSgoY3NlLT5pbmZvLmJsb2Nrc2l6ZSAhPSAwKSArIChjc2UtPmluZm8uYXV0aHNpemUgIT0gMCkpOworCWlmIChjcnAgPT0gTlVMTCkgeworCQlkcHJpbnRrKCIlczogRU5PTUVNXG4iLCBfX0ZVTkNUSU9OX18pOworCQllcnJvciA9IEVOT01FTTsKKwkJZ290byBiYWlsOworCX0KKworCWlmIChjc2UtPmluZm8uYXV0aHNpemUgJiYgY3NlLT5pbmZvLmJsb2Nrc2l6ZSkgeworCQlpZiAoY29wLT5vcCA9PSBDT1BfRU5DUllQVCkgeworCQkJY3JkZSA9IGNycC0+Y3JwX2Rlc2M7CisJCQljcmRhID0gY3JkZS0+Y3JkX25leHQ7CisJCX0gZWxzZSB7CisJCQljcmRhID0gY3JwLT5jcnBfZGVzYzsKKwkJCWNyZGUgPSBjcmRhLT5jcmRfbmV4dDsKKwkJfQorCX0gZWxzZSBpZiAoY3NlLT5pbmZvLmF1dGhzaXplKSB7CisJCWNyZGEgPSBjcnAtPmNycF9kZXNjOworCX0gZWxzZSBpZiAoY3NlLT5pbmZvLmJsb2Nrc2l6ZSkgeworCQljcmRlID0gY3JwLT5jcnBfZGVzYzsKKwl9IGVsc2UgeworCQlkcHJpbnRrKCIlczogYmFkIHJlcXVlc3RcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWVycm9yID0gRUlOVkFMOworCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKChlcnJvciA9IGNvcHlfZnJvbV91c2VyKGNzZS0+dWlvLnVpb19pb3ZbMF0uaW92X2Jhc2UsIGNvcC0+c3JjLAorCQkJCQljb3AtPmxlbikpKSB7CisJCWRwcmludGsoIiVzOiBiYWQgY29weVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBiYWlsOworCX0KKworCWlmIChjcmRhKSB7CisJCWNyZGEtPmNyZF9za2lwID0gMDsKKwkJY3JkYS0+Y3JkX2xlbiA9IGNvcC0+bGVuOworCQljcmRhLT5jcmRfaW5qZWN0ID0gY29wLT5sZW47CisKKwkJY3JkYS0+Y3JkX2FsZyA9IGNzZS0+bWFjOworCQljcmRhLT5jcmRfa2V5ID0gY3NlLT5tYWNrZXk7CisJCWNyZGEtPmNyZF9rbGVuID0gY3NlLT5tYWNrZXlsZW4gKiA4OworCX0KKworCWlmIChjcmRlKSB7CisJCWlmIChjb3AtPm9wID09IENPUF9FTkNSWVBUKQorCQkJY3JkZS0+Y3JkX2ZsYWdzIHw9IENSRF9GX0VOQ1JZUFQ7CisJCWVsc2UKKwkJCWNyZGUtPmNyZF9mbGFncyAmPSB+Q1JEX0ZfRU5DUllQVDsKKwkJY3JkZS0+Y3JkX2xlbiA9IGNvcC0+bGVuOworCQljcmRlLT5jcmRfaW5qZWN0ID0gMDsKKworCQljcmRlLT5jcmRfYWxnID0gY3NlLT5jaXBoZXI7CisJCWNyZGUtPmNyZF9rZXkgPSBjc2UtPmtleTsKKwkJY3JkZS0+Y3JkX2tsZW4gPSBjc2UtPmtleWxlbiAqIDg7CisJfQorCisJY3JwLT5jcnBfaWxlbiA9IGNzZS0+dWlvLnVpb19pb3ZbMF0uaW92X2xlbjsKKwljcnAtPmNycF9mbGFncyA9IENSWVBUT19GX0lPViB8IENSWVBUT19GX0NCSU1NCisJCSAgICAgICB8IChjb3AtPmZsYWdzICYgQ09QX0ZfQkFUQ0gpOworCWNycC0+Y3JwX2J1ZiA9IChjYWRkcl90KSZjc2UtPnVpbzsKKwljcnAtPmNycF9jYWxsYmFjayA9IChpbnQgKCopIChzdHJ1Y3QgY3J5cHRvcCAqKSkgY3J5cHRvZGV2X2NiOworCWNycC0+Y3JwX3NpZCA9IGNzZS0+c2lkOworCWNycC0+Y3JwX29wYXF1ZSA9ICh2b2lkICopY3NlOworCisJaWYgKGNvcC0+aXYpIHsKKwkJaWYgKGNyZGUgPT0gTlVMTCkgeworCQkJZXJyb3IgPSBFSU5WQUw7CisJCQlkcHJpbnRrKCIlcyBubyBjcmRlXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZ290byBiYWlsOworCQl9CisJCWlmIChjc2UtPmNpcGhlciA9PSBDUllQVE9fQVJDNCkgeyAvKiBYWFggdXNlIGZsYWc/ICovCisJCQllcnJvciA9IEVJTlZBTDsKKwkJCWRwcmludGsoIiVzIGFyYzQgd2l0aCBJVlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlpZiAoKGVycm9yID0gY29weV9mcm9tX3VzZXIoY3NlLT50bXBfaXYsIGNvcC0+aXYsCisJCQkJCQljc2UtPmluZm8uYmxvY2tzaXplKSkpIHsKKwkJCWRwcmludGsoIiVzIGJhZCBpdiBjb3B5XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZ290byBiYWlsOworCQl9CisJCW1lbWNweShjcmRlLT5jcmRfaXYsIGNzZS0+dG1wX2l2LCBjc2UtPmluZm8uYmxvY2tzaXplKTsKKwkJY3JkZS0+Y3JkX2ZsYWdzIHw9IENSRF9GX0lWX0VYUExJQ0lUIHwgQ1JEX0ZfSVZfUFJFU0VOVDsKKwkJY3JkZS0+Y3JkX3NraXAgPSAwOworCX0gZWxzZSBpZiAoY3NlLT5jaXBoZXIgPT0gQ1JZUFRPX0FSQzQpIHsgLyogWFhYIHVzZSBmbGFnPyAqLworCQljcmRlLT5jcmRfc2tpcCA9IDA7CisJfSBlbHNlIGlmIChjcmRlKSB7CisJCWNyZGUtPmNyZF9mbGFncyB8PSBDUkRfRl9JVl9QUkVTRU5UOworCQljcmRlLT5jcmRfc2tpcCA9IGNzZS0+aW5mby5ibG9ja3NpemU7CisJCWNyZGUtPmNyZF9sZW4gLT0gY3NlLT5pbmZvLmJsb2Nrc2l6ZTsKKwl9CisKKwlpZiAoY29wLT5tYWMgJiYgY3JkYSA9PSBOVUxMKSB7CisJCWVycm9yID0gRUlOVkFMOworCQlkcHJpbnRrKCIlcyBubyBjcmRhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGJhaWw7CisJfQorCisJLyoKKwkgKiBMZXQgdGhlIGRpc3BhdGNoIHJ1biB1bmxvY2tlZCwgdGhlbiwgaW50ZXJsb2NrIGFnYWluc3QgdGhlCisJICogY2FsbGJhY2sgYmVmb3JlIGNoZWNraW5nIGlmIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIGFuZCBnb2luZworCSAqIHRvIHNsZWVwLiAgVGhpcyBpbnN1cmVzIGRyaXZlcnMgZG9uJ3QgaW5oZXJpdCBvdXIgbG9jayB3aGljaAorCSAqIHJlc3VsdHMgaW4gYSBsb2NrIG9yZGVyIHJldmVyc2FsIGJldHdlZW4gY3J5cHRvX2Rpc3BhdGNoIGZvcmNlZAorCSAqIGVudHJ5IGFuZCB0aGUgY3J5cHRvX2RvbmUgY2FsbGJhY2sgaW50byB1cy4KKwkgKi8KKwllcnJvciA9IGNyeXB0b19kaXNwYXRjaChjcnApOworCWlmIChlcnJvcikgeworCQlkcHJpbnRrKCIlcyBlcnJvciBpbiBjcnlwdG9fZGlzcGF0Y2hcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlkcHJpbnRrKCIlcyBhYm91dCB0byBXQUlUXG4iLCBfX0ZVTkNUSU9OX18pOworCS8qCisJICogd2UgcmVhbGx5IG5lZWQgdG8gd2FpdCBmb3IgZHJpdmVyIHRvIGNvbXBsZXRlIHRvIG1haW50YWluCisJICogc3RhdGUsICBsdWNraWx5IGludGVycnVwdHMgd2lsbCBiZSByZW1lbWJlcmVkCisJICovCisJZG8geworCQllcnJvciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjcnAtPmNycF93YWl0cSwKKwkJCQkoKGNycC0+Y3JwX2ZsYWdzICYgQ1JZUFRPX0ZfRE9ORSkgIT0gMCkpOworCQkvKgorCQkgKiB3ZSBjYW4ndCBicmVhayBvdXQgb2YgdGhpcyBsb29wIG9yIHdlIHdpbGwgbGVhdmUgYmVoaW5kCisJCSAqIGEgaHVnZSBtZXNzLCAgaG93ZXZlciwgIHN0YXlpbmcgaGVyZSBtZWFucyBpZiB5b3VyIGRyaXZlcgorCQkgKiBpcyBicm9rZW4gdXNlciBhcHBsaWNhdGlvbnMgY2FuIGhhbmcgYW5kIG5vdCBiZSBraWxsZWQuCisJCSAqIFRoZSBzb2x1dGlvbiwgIGZpeCB5b3VyIGRyaXZlciA6LSkKKwkJICovCisJCWlmIChlcnJvcikgeworCQkJc2NoZWR1bGUoKTsKKwkJCWVycm9yID0gMDsKKwkJfQorCX0gd2hpbGUgKChjcnAtPmNycF9mbGFncyAmIENSWVBUT19GX0RPTkUpID09IDApOworCWRwcmludGsoIiVzIGZpbmlzaGVkIFdBSVRJTkcgZXJyb3I9JWRcbiIsIF9fRlVOQ1RJT05fXywgZXJyb3IpOworCisJaWYgKGNycC0+Y3JwX2V0eXBlICE9IDApIHsKKwkJZXJyb3IgPSBjcnAtPmNycF9ldHlwZTsKKwkJZHByaW50aygiJXMgZXJyb3IgaW4gY3JwIHByb2Nlc3NpbmdcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAoY3NlLT5lcnJvcikgeworCQllcnJvciA9IGNzZS0+ZXJyb3I7CisJCWRwcmludGsoIiVzIGVycm9yIGluIGNzZSBwcm9jZXNzaW5nXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGJhaWw7CisJfQorCisJaWYgKGNvcC0+ZHN0ICYmIChlcnJvciA9IGNvcHlfdG9fdXNlcihjb3AtPmRzdCwKKwkJCQkJY3NlLT51aW8udWlvX2lvdlswXS5pb3ZfYmFzZSwgY29wLT5sZW4pKSkgeworCQlkcHJpbnRrKCIlcyBiYWQgZHN0IGNvcHlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlpZiAoY29wLT5tYWMgJiYKKwkJCShlcnJvcj1jb3B5X3RvX3VzZXIoY29wLT5tYWMsCisJCQkJKGNhZGRyX3QpY3NlLT51aW8udWlvX2lvdlswXS5pb3ZfYmFzZSArIGNvcC0+bGVuLAorCQkJCWNzZS0+aW5mby5hdXRoc2l6ZSkpKSB7CisJCWRwcmludGsoIiVzIGJhZCBtYWMgY29weVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBiYWlsOworCX0KKworYmFpbDoKKwlpZiAoY3JwKQorCQljcnlwdG9fZnJlZXJlcShjcnApOworCWlmIChjc2UtPnVpby51aW9faW92WzBdLmlvdl9iYXNlKQorCQlrZnJlZShjc2UtPnVpby51aW9faW92WzBdLmlvdl9iYXNlKTsKKworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CitjcnlwdG9kZXZfY2Iodm9pZCAqb3ApCit7CisJc3RydWN0IGNyeXB0b3AgKmNycCA9IChzdHJ1Y3QgY3J5cHRvcCAqKSBvcDsKKwlzdHJ1Y3QgY3Nlc3Npb24gKmNzZSA9IChzdHJ1Y3QgY3Nlc3Npb24gKiljcnAtPmNycF9vcGFxdWU7CisJaW50IGVycm9yOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwllcnJvciA9IGNycC0+Y3JwX2V0eXBlOworCWlmIChlcnJvciA9PSBFQUdBSU4pIHsKKwkJY3JwLT5jcnBfZmxhZ3MgJj0gfkNSWVBUT19GX0RPTkU7CisjaWZkZWYgTk9UWUVUCisJCS8qCisJCSAqIERBVklETSBJIGFtIGZhaXJseSBzdXJlIHRoYXQgd2Ugc2hvdWxkIHR1cm4gdGhpcyBpbnRvIGEgYmF0Y2gKKwkJICogcmVxdWVzdCB0byBzdG9wIGJhZCBrYXJtYS9sb2NrdXAsIHJldmlzaXQKKwkJICovCisJCWNycC0+Y3JwX2ZsYWdzIHw9IENSWVBUT19GX0JBVENIOworI2VuZGlmCisJCXJldHVybiBjcnlwdG9fZGlzcGF0Y2goY3JwKTsKKwl9CisJaWYgKGVycm9yICE9IDAgfHwgKGNycC0+Y3JwX2ZsYWdzICYgQ1JZUFRPX0ZfRE9ORSkpIHsKKwkJY3NlLT5lcnJvciA9IGVycm9yOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNycC0+Y3JwX3dhaXRxKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorY3J5cHRvZGV2a2V5X2NiKHZvaWQgKm9wKQoreworCXN0cnVjdCBjcnlwdGtvcCAqa3JwID0gKHN0cnVjdCBjcnlwdGtvcCAqKSBvcDsKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgma3JwLT5rcnBfd2FpdHEpOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2NyeXB0b2Rldl9rZXkoc3RydWN0IGNyeXB0X2tvcCAqa29wKQoreworCXN0cnVjdCBjcnlwdGtvcCAqa3JwID0gTlVMTDsKKwlpbnQgZXJyb3IgPSBFSU5WQUw7CisJaW50IGluLCBvdXQsIHNpemUsIGk7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWlmIChrb3AtPmNya19pcGFyYW1zICsga29wLT5jcmtfb3BhcmFtcyA+IENSS19NQVhQQVJBTSkgeworCQlkcHJpbnRrKCIlcyBwYXJhbXMgdG9vIGJpZ1xuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIChFRkJJRyk7CisJfQorCisJaW4gPSBrb3AtPmNya19pcGFyYW1zOworCW91dCA9IGtvcC0+Y3JrX29wYXJhbXM7CisJc3dpdGNoIChrb3AtPmNya19vcCkgeworCWNhc2UgQ1JLX01PRF9FWFA6CisJCWlmIChpbiA9PSAzICYmIG91dCA9PSAxKQorCQkJYnJlYWs7CisJCXJldHVybiAoRUlOVkFMKTsKKwljYXNlIENSS19NT0RfRVhQX0NSVDoKKwkJaWYgKGluID09IDYgJiYgb3V0ID09IDEpCisJCQlicmVhazsKKwkJcmV0dXJuIChFSU5WQUwpOworCWNhc2UgQ1JLX0RTQV9TSUdOOgorCQlpZiAoaW4gPT0gNSAmJiBvdXQgPT0gMikKKwkJCWJyZWFrOworCQlyZXR1cm4gKEVJTlZBTCk7CisJY2FzZSBDUktfRFNBX1ZFUklGWToKKwkJaWYgKGluID09IDcgJiYgb3V0ID09IDApCisJCQlicmVhazsKKwkJcmV0dXJuIChFSU5WQUwpOworCWNhc2UgQ1JLX0RIX0NPTVBVVEVfS0VZOgorCQlpZiAoaW4gPT0gMyAmJiBvdXQgPT0gMSkKKwkJCWJyZWFrOworCQlyZXR1cm4gKEVJTlZBTCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChFSU5WQUwpOworCX0KKworCWtycCA9IChzdHJ1Y3QgY3J5cHRrb3AgKilrbWFsbG9jKHNpemVvZiAqa3JwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtycCkKKwkJcmV0dXJuIChFTk9NRU0pOworCWJ6ZXJvKGtycCwgc2l6ZW9mICprcnApOworCWtycC0+a3JwX29wID0ga29wLT5jcmtfb3A7CisJa3JwLT5rcnBfc3RhdHVzID0ga29wLT5jcmtfc3RhdHVzOworCWtycC0+a3JwX2lwYXJhbXMgPSBrb3AtPmNya19pcGFyYW1zOworCWtycC0+a3JwX29wYXJhbXMgPSBrb3AtPmNya19vcGFyYW1zOworCWtycC0+a3JwX2NyaWQgPSBrb3AtPmNya19jcmlkOworCWtycC0+a3JwX3N0YXR1cyA9IDA7CisJa3JwLT5rcnBfZmxhZ3MgPSBDUllQVE9fS0ZfQ0JJTU07CisJa3JwLT5rcnBfY2FsbGJhY2sgPSAoaW50ICgqKSAoc3RydWN0IGNyeXB0a29wICopKSBjcnlwdG9kZXZrZXlfY2I7CisJaW5pdF93YWl0cXVldWVfaGVhZCgma3JwLT5rcnBfd2FpdHEpOworCisJZm9yIChpID0gMDsgaSA8IENSS19NQVhQQVJBTTsgaSsrKQorCQlrcnAtPmtycF9wYXJhbVtpXS5jcnBfbmJpdHMgPSBrb3AtPmNya19wYXJhbVtpXS5jcnBfbmJpdHM7CisJZm9yIChpID0gMDsgaSA8IGtycC0+a3JwX2lwYXJhbXMgKyBrcnAtPmtycF9vcGFyYW1zOyBpKyspIHsKKwkJc2l6ZSA9IChrcnAtPmtycF9wYXJhbVtpXS5jcnBfbmJpdHMgKyA3KSAvIDg7CisJCWlmIChzaXplID09IDApCisJCQljb250aW51ZTsKKwkJa3JwLT5rcnBfcGFyYW1baV0uY3JwX3AgPSAoY2FkZHJfdCkga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGkgPj0ga3JwLT5rcnBfaXBhcmFtcykKKwkJCWNvbnRpbnVlOworCQllcnJvciA9IGNvcHlfZnJvbV91c2VyKGtycC0+a3JwX3BhcmFtW2ldLmNycF9wLAorCQkJCWtvcC0+Y3JrX3BhcmFtW2ldLmNycF9wLCBzaXplKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBmYWlsOworCX0KKworCWVycm9yID0gY3J5cHRvX2tkaXNwYXRjaChrcnApOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCisJZG8geworCQllcnJvciA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShrcnAtPmtycF93YWl0cSwKKwkJCQkoKGtycC0+a3JwX2ZsYWdzICYgQ1JZUFRPX0tGX0RPTkUpICE9IDApKTsKKwkJLyoKKwkJICogd2UgY2FuJ3QgYnJlYWsgb3V0IG9mIHRoaXMgbG9vcCBvciB3ZSB3aWxsIGxlYXZlIGJlaGluZAorCQkgKiBhIGh1Z2UgbWVzcywgIGhvd2V2ZXIsICBzdGF5aW5nIGhlcmUgbWVhbnMgaWYgeW91ciBkcml2ZXIKKwkJICogaXMgYnJva2VuIHVzZXIgYXBwbGljYXRpb25zIGNhbiBoYW5nIGFuZCBub3QgYmUga2lsbGVkLgorCQkgKiBUaGUgc29sdXRpb24sICBmaXggeW91ciBkcml2ZXIgOi0pCisJCSAqLworCQlpZiAoZXJyb3IpIHsKKwkJCXNjaGVkdWxlKCk7CisJCQllcnJvciA9IDA7CisJCX0KKwl9IHdoaWxlICgoa3JwLT5rcnBfZmxhZ3MgJiBDUllQVE9fS0ZfRE9ORSkgPT0gMCk7CisKKwlkcHJpbnRrKCIlcyBmaW5pc2hlZCBXQUlUSU5HIGVycm9yPSVkXG4iLCBfX0ZVTkNUSU9OX18sIGVycm9yKTsKKwkKKwlrb3AtPmNya19jcmlkID0ga3JwLT5rcnBfY3JpZDsJCS8qIGRldmljZSB0aGF0IGRpZCB0aGUgd29yayAqLworCWlmIChrcnAtPmtycF9zdGF0dXMgIT0gMCkgeworCQllcnJvciA9IGtycC0+a3JwX3N0YXR1czsKKwkJZ290byBmYWlsOworCX0KKworCWZvciAoaSA9IGtycC0+a3JwX2lwYXJhbXM7IGkgPCBrcnAtPmtycF9pcGFyYW1zICsga3JwLT5rcnBfb3BhcmFtczsgaSsrKSB7CisJCXNpemUgPSAoa3JwLT5rcnBfcGFyYW1baV0uY3JwX25iaXRzICsgNykgLyA4OworCQlpZiAoc2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCWVycm9yID0gY29weV90b191c2VyKGtvcC0+Y3JrX3BhcmFtW2ldLmNycF9wLCBrcnAtPmtycF9wYXJhbVtpXS5jcnBfcCwKKwkJCQlzaXplKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBmYWlsOworCX0KKworZmFpbDoKKwlpZiAoa3JwKSB7CisJCWtvcC0+Y3JrX3N0YXR1cyA9IGtycC0+a3JwX3N0YXR1czsKKwkJZm9yIChpID0gMDsgaSA8IENSS19NQVhQQVJBTTsgaSsrKSB7CisJCQlpZiAoa3JwLT5rcnBfcGFyYW1baV0uY3JwX3ApCisJCQkJa2ZyZWUoa3JwLT5rcnBfcGFyYW1baV0uY3JwX3ApOworCQl9CisJCWtmcmVlKGtycCk7CisJfQorCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50CitjcnlwdG9kZXZfZmluZChzdHJ1Y3QgY3J5cHRfZmluZF9vcCAqZmluZCkKK3sKKwlkZXZpY2VfdCBkZXY7CisKKwlpZiAoZmluZC0+Y3JpZCAhPSAtMSkgeworCQlkZXYgPSBjcnlwdG9fZmluZF9kZXZpY2VfYnloaWQoZmluZC0+Y3JpZCk7CisJCWlmIChkZXYgPT0gTlVMTCkKKwkJCXJldHVybiAoRU5PRU5UKTsKKwkJc3RybGNweShmaW5kLT5uYW1lLCBkZXZpY2VfZ2V0X25hbWV1bml0KGRldiksCisJCSAgICBzaXplb2YoZmluZC0+bmFtZSkpOworCX0gZWxzZSB7CisJCWZpbmQtPmNyaWQgPSBjcnlwdG9fZmluZF9kcml2ZXIoZmluZC0+bmFtZSk7CisJCWlmIChmaW5kLT5jcmlkID09IC0xKQorCQkJcmV0dXJuIChFTk9FTlQpOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgc3RydWN0IGNzZXNzaW9uICoKK2NzZWZpbmQoc3RydWN0IGZjcnlwdCAqZmNyLCB1X2ludCBzZXMpCit7CisJc3RydWN0IGNzZXNzaW9uICpjc2U7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3NlLCAmZmNyLT5jc2Vzc2lvbnMsIGxpc3QpCisJCWlmIChjc2UtPnNlcyA9PSBzZXMpCisJCQlyZXR1cm4gKGNzZSk7CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RhdGljIGludAorY3NlZGVsZXRlKHN0cnVjdCBmY3J5cHQgKmZjciwgc3RydWN0IGNzZXNzaW9uICpjc2VfZGVsKQoreworCXN0cnVjdCBjc2Vzc2lvbiAqY3NlOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNzZSwgJmZjci0+Y3Nlc3Npb25zLCBsaXN0KSB7CisJCWlmIChjc2UgPT0gY3NlX2RlbCkgeworCQkJbGlzdF9kZWwoJmNzZS0+bGlzdCk7CisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisJCitzdGF0aWMgc3RydWN0IGNzZXNzaW9uICoKK2NzZWFkZChzdHJ1Y3QgZmNyeXB0ICpmY3IsIHN0cnVjdCBjc2Vzc2lvbiAqY3NlKQoreworCWRwcmludGsoIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJbGlzdF9hZGRfdGFpbCgmY3NlLT5saXN0LCAmZmNyLT5jc2Vzc2lvbnMpOworCWNzZS0+c2VzID0gZmNyLT5zZXNuKys7CisJcmV0dXJuIChjc2UpOworfQorCitzdGF0aWMgc3RydWN0IGNzZXNzaW9uICoKK2NzZWNyZWF0ZShzdHJ1Y3QgZmNyeXB0ICpmY3IsIHVfaW50NjRfdCBzaWQsIHN0cnVjdCBjcnlwdG9pbmkgKmNyaWUsCisJc3RydWN0IGNyeXB0b2luaSAqY3JpYSwgc3RydWN0IGNzZXNzaW9uX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNzZXNzaW9uICpjc2U7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWNzZSA9IChzdHJ1Y3QgY3Nlc3Npb24gKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGNzZXNzaW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNzZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoY3NlLCAwLCBzaXplb2Yoc3RydWN0IGNzZXNzaW9uKSk7CisKKwlJTklUX0xJU1RfSEVBRCgmY3NlLT5saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjc2UtPndhaXRxKTsKKworCWNzZS0+a2V5ID0gY3JpZS0+Y3JpX2tleTsKKwljc2UtPmtleWxlbiA9IGNyaWUtPmNyaV9rbGVuLzg7CisJY3NlLT5tYWNrZXkgPSBjcmlhLT5jcmlfa2V5OworCWNzZS0+bWFja2V5bGVuID0gY3JpYS0+Y3JpX2tsZW4vODsKKwljc2UtPnNpZCA9IHNpZDsKKwljc2UtPmNpcGhlciA9IGNyaWUtPmNyaV9hbGc7CisJY3NlLT5tYWMgPSBjcmlhLT5jcmlfYWxnOworCWNzZS0+aW5mbyA9ICppbmZvOworCWNzZWFkZChmY3IsIGNzZSk7CisJcmV0dXJuIChjc2UpOworfQorCitzdGF0aWMgaW50Citjc2VmcmVlKHN0cnVjdCBjc2Vzc2lvbiAqY3NlKQoreworCWludCBlcnJvcjsKKworCWRwcmludGsoIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJZXJyb3IgPSBjcnlwdG9fZnJlZXNlc3Npb24oY3NlLT5zaWQpOworCWlmIChjc2UtPmtleSkKKwkJa2ZyZWUoY3NlLT5rZXkpOworCWlmIChjc2UtPm1hY2tleSkKKwkJa2ZyZWUoY3NlLT5tYWNrZXkpOworCWtmcmVlKGNzZSk7CisJcmV0dXJuKGVycm9yKTsKK30KKworc3RhdGljIGludAorY3J5cHRvZGV2X2lvY3RsKAorCXN0cnVjdCBpbm9kZSAqaW5vZGUsCisJc3RydWN0IGZpbGUgKmZpbHAsCisJdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY3J5cHRvaW5pIGNyaWEsIGNyaWU7CisJc3RydWN0IGZjcnlwdCAqZmNyID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjc2Vzc2lvbiAqY3NlOworCXN0cnVjdCBjc2Vzc2lvbl9pbmZvIGluZm87CisJc3RydWN0IHNlc3Npb24yX29wIHNvcDsKKwlzdHJ1Y3QgY3J5cHRfb3AgY29wOworCXN0cnVjdCBjcnlwdF9rb3Aga29wOworCXN0cnVjdCBjcnlwdF9maW5kX29wIGZvcDsKKwl1X2ludDY0X3Qgc2lkOworCXVfaW50MzJfdCBzZXMgPSAwOworCWludCBmZWF0LCBmZCwgZXJyb3IgPSAwLCBjcmlkOworCW1tX3NlZ21lbnRfdCBmczsKKworCWRwcmludGsoIiVzKGNtZD0leCBhcmc9JWx4KVxuIiwgX19GVU5DVElPTl9fLCBjbWQsIGFyZyk7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBDUklPR0VUOiB7CisJCWRwcmludGsoIiVzKENSSU9HRVQpXG4iLCBfX0ZVTkNUSU9OX18pOworCQlmcyA9IGdldF9mcygpOworCQlzZXRfZnMoZ2V0X2RzKCkpOworCQlmb3IgKGZkID0gMDsgZmQgPCBmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKS0+bWF4X2ZkczsgZmQrKykKKwkJCWlmIChmaWxlc19mZHRhYmxlKGN1cnJlbnQtPmZpbGVzKS0+ZmRbZmRdID09IGZpbHApCisJCQkJYnJlYWs7CisJCWZkID0gc3lzX2R1cChmZCk7CisJCXNldF9mcyhmcyk7CisJCXB1dF91c2VyKGZkLCAoaW50ICopIGFyZyk7CisJCXJldHVybiBJU19FUlJfVkFMVUUoZmQpID8gZmQgOiAwOworCQl9CisKKyNkZWZpbmUJQ0lPQ0dTRVNTU1RSCShjbWQgPT0gQ0lPQ0dTRVNTSU9OID8gIkNJT0NHU0VTU0lPTiIgOiAiQ0lPQ0dTRVNTSU9OMiIpCisJY2FzZSBDSU9DR1NFU1NJT046CisJY2FzZSBDSU9DR1NFU1NJT04yOgorCQlkcHJpbnRrKCIlcyglcylcbiIsIF9fRlVOQ1RJT05fXywgQ0lPQ0dTRVNTU1RSKTsKKwkJbWVtc2V0KCZjcmllLCAwLCBzaXplb2YoY3JpZSkpOworCQltZW1zZXQoJmNyaWEsIDAsIHNpemVvZihjcmlhKSk7CisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJbWVtc2V0KCZzb3AsIDAsIHNpemVvZihzb3ApKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNvcCwgKHZvaWQqKWFyZywgKGNtZCA9PSBDSU9DR1NFU1NJT04pID8KKwkJCQkJc2l6ZW9mKHN0cnVjdCBzZXNzaW9uX29wKSA6IHNpemVvZihzb3ApKSkgeworCQkJZHByaW50aygiJXMoJXMpIC0gYmFkIGNvcHlcbiIsIF9fRlVOQ1RJT05fXywgQ0lPQ0dTRVNTU1RSKTsKKwkJCWVycm9yID0gRUZBVUxUOworCQkJZ290byBiYWlsOworCQl9CisKKwkJc3dpdGNoIChzb3AuY2lwaGVyKSB7CisJCWNhc2UgMDoKKwkJCWRwcmludGsoIiVzKCVzKSAtIG5vIGNpcGhlclxuIiwgX19GVU5DVElPTl9fLCBDSU9DR1NFU1NTVFIpOworCQkJYnJlYWs7CisJCWNhc2UgQ1JZUFRPX05VTExfQ0JDOgorCQkJaW5mby5ibG9ja3NpemUgPSBOVUxMX0JMT0NLX0xFTjsKKwkJCWluZm8ubWlua2V5ID0gTlVMTF9NSU5fS0VZX0xFTjsKKwkJCWluZm8ubWF4a2V5ID0gTlVMTF9NQVhfS0VZX0xFTjsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT19ERVNfQ0JDOgorCQkJaW5mby5ibG9ja3NpemUgPSBERVNfQkxPQ0tfTEVOOworCQkJaW5mby5taW5rZXkgPSBERVNfTUlOX0tFWV9MRU47CisJCQlpbmZvLm1heGtleSA9IERFU19NQVhfS0VZX0xFTjsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT18zREVTX0NCQzoKKwkJCWluZm8uYmxvY2tzaXplID0gREVTM19CTE9DS19MRU47CisJCQlpbmZvLm1pbmtleSA9IERFUzNfTUlOX0tFWV9MRU47CisJCQlpbmZvLm1heGtleSA9IERFUzNfTUFYX0tFWV9MRU47CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fQkxGX0NCQzoKKwkJCWluZm8uYmxvY2tzaXplID0gQkxPV0ZJU0hfQkxPQ0tfTEVOOworCQkJaW5mby5taW5rZXkgPSBCTE9XRklTSF9NSU5fS0VZX0xFTjsKKwkJCWluZm8ubWF4a2V5ID0gQkxPV0ZJU0hfTUFYX0tFWV9MRU47CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fQ0FTVF9DQkM6CisJCQlpbmZvLmJsb2Nrc2l6ZSA9IENBU1QxMjhfQkxPQ0tfTEVOOworCQkJaW5mby5taW5rZXkgPSBDQVNUMTI4X01JTl9LRVlfTEVOOworCQkJaW5mby5tYXhrZXkgPSBDQVNUMTI4X01BWF9LRVlfTEVOOworCQkJYnJlYWs7CisJCWNhc2UgQ1JZUFRPX1NLSVBKQUNLX0NCQzoKKwkJCWluZm8uYmxvY2tzaXplID0gU0tJUEpBQ0tfQkxPQ0tfTEVOOworCQkJaW5mby5taW5rZXkgPSBTS0lQSkFDS19NSU5fS0VZX0xFTjsKKwkJCWluZm8ubWF4a2V5ID0gU0tJUEpBQ0tfTUFYX0tFWV9MRU47CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fQUVTX0NCQzoKKwkJCWluZm8uYmxvY2tzaXplID0gQUVTX0JMT0NLX0xFTjsKKwkJCWluZm8ubWlua2V5ID0gQUVTX01JTl9LRVlfTEVOOworCQkJaW5mby5tYXhrZXkgPSBBRVNfTUFYX0tFWV9MRU47CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fQVJDNDoKKwkJCWluZm8uYmxvY2tzaXplID0gQVJDNF9CTE9DS19MRU47CisJCQlpbmZvLm1pbmtleSA9IEFSQzRfTUlOX0tFWV9MRU47CisJCQlpbmZvLm1heGtleSA9IEFSQzRfTUFYX0tFWV9MRU47CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fQ0FNRUxMSUFfQ0JDOgorCQkJaW5mby5ibG9ja3NpemUgPSBDQU1FTExJQV9CTE9DS19MRU47CisJCQlpbmZvLm1pbmtleSA9IENBTUVMTElBX01JTl9LRVlfTEVOOworCQkJaW5mby5tYXhrZXkgPSBDQU1FTExJQV9NQVhfS0VZX0xFTjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50aygiJXMoJXMpIC0gYmFkIGNpcGhlclxuIiwgX19GVU5DVElPTl9fLCBDSU9DR1NFU1NTVFIpOworCQkJZXJyb3IgPSBFSU5WQUw7CisJCQlnb3RvIGJhaWw7CisJCX0KKworCQlzd2l0Y2ggKHNvcC5tYWMpIHsKKwkJY2FzZSAwOgorCQkJZHByaW50aygiJXMoJXMpIC0gbm8gbWFjXG4iLCBfX0ZVTkNUSU9OX18sIENJT0NHU0VTU1NUUik7CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fTlVMTF9ITUFDOgorCQkJaW5mby5hdXRoc2l6ZSA9IE5VTExfSEFTSF9MRU47CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fTUQ1OgorCQkJaW5mby5hdXRoc2l6ZSA9IE1ENV9IQVNIX0xFTjsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT19TSEExOgorCQkJaW5mby5hdXRoc2l6ZSA9IFNIQTFfSEFTSF9MRU47CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fU0hBMl8yNTY6CisJCQlpbmZvLmF1dGhzaXplID0gU0hBMl8yNTZfSEFTSF9MRU47CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fU0hBMl8zODQ6CisJCQlpbmZvLmF1dGhzaXplID0gU0hBMl8zODRfSEFTSF9MRU47CisgIAkJCWJyZWFrOworCQljYXNlIENSWVBUT19TSEEyXzUxMjoKKwkJCWluZm8uYXV0aHNpemUgPSBTSEEyXzUxMl9IQVNIX0xFTjsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT19SSVBFTUQxNjA6CisJCQlpbmZvLmF1dGhzaXplID0gUklQRU1EMTYwX0hBU0hfTEVOOworCQkJYnJlYWs7CisJCWNhc2UgQ1JZUFRPX01ENV9ITUFDOgorCQkJaW5mby5hdXRoc2l6ZSA9IE1ENV9IQVNIX0xFTjsKKwkJCWluZm8uYXV0aGtleSA9IDE2OworCQkJYnJlYWs7CisJCWNhc2UgQ1JZUFRPX1NIQTFfSE1BQzoKKwkJCWluZm8uYXV0aHNpemUgPSBTSEExX0hBU0hfTEVOOworCQkJaW5mby5hdXRoa2V5ID0gMjA7CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fU0hBMl8yNTZfSE1BQzoKKwkJCWluZm8uYXV0aHNpemUgPSBTSEEyXzI1Nl9IQVNIX0xFTjsKKwkJCWluZm8uYXV0aGtleSA9IDMyOworCQkJYnJlYWs7CisJCWNhc2UgQ1JZUFRPX1NIQTJfMzg0X0hNQUM6CisJCQlpbmZvLmF1dGhzaXplID0gU0hBMl8zODRfSEFTSF9MRU47CisJCQlpbmZvLmF1dGhrZXkgPSA0ODsKKyAgCQkJYnJlYWs7CisJCWNhc2UgQ1JZUFRPX1NIQTJfNTEyX0hNQUM6CisJCQlpbmZvLmF1dGhzaXplID0gU0hBMl81MTJfSEFTSF9MRU47CisJCQlpbmZvLmF1dGhrZXkgPSA2NDsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT19SSVBFTUQxNjBfSE1BQzoKKwkJCWluZm8uYXV0aHNpemUgPSBSSVBFTUQxNjBfSEFTSF9MRU47CisJCQlpbmZvLmF1dGhrZXkgPSAyMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZHByaW50aygiJXMoJXMpIC0gYmFkIG1hY1xuIiwgX19GVU5DVElPTl9fLCBDSU9DR1NFU1NTVFIpOworCQkJZXJyb3IgPSBFSU5WQUw7CisJCQlnb3RvIGJhaWw7CisJCX0KKworCQlpZiAoaW5mby5ibG9ja3NpemUpIHsKKwkJCWNyaWUuY3JpX2FsZyA9IHNvcC5jaXBoZXI7CisJCQljcmllLmNyaV9rbGVuID0gc29wLmtleWxlbiAqIDg7CisJCQlpZiAoKGluZm8ubWF4a2V5ICYmIHNvcC5rZXlsZW4gPiBpbmZvLm1heGtleSkgfHwKKwkJCQkgICAJc29wLmtleWxlbiA8IGluZm8ubWlua2V5KSB7CisJCQkJZHByaW50aygiJXMoJXMpIC0gYmFkIGtleVxuIiwgX19GVU5DVElPTl9fLCBDSU9DR1NFU1NTVFIpOworCQkJCWVycm9yID0gRUlOVkFMOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKworCQkJY3JpZS5jcmlfa2V5ID0gKHVfaW50OF90ICopIGttYWxsb2MoY3JpZS5jcmlfa2xlbi84KzEsIEdGUF9LRVJORUwpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGNyaWUuY3JpX2tleSwgc29wLmtleSwKKwkJCQkJCQljcmllLmNyaV9rbGVuLzgpKSB7CisJCQkJZHByaW50aygiJXMoJXMpIC0gYmFkIGNvcHlcbiIsIF9fRlVOQ1RJT05fXywgQ0lPQ0dTRVNTU1RSKTsKKwkJCQllcnJvciA9IEVGQVVMVDsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQlpZiAoaW5mby5hdXRoc2l6ZSkKKwkJCQljcmllLmNyaV9uZXh0ID0gJmNyaWE7CisJCX0KKworCQlpZiAoaW5mby5hdXRoc2l6ZSkgeworCQkJY3JpYS5jcmlfYWxnID0gc29wLm1hYzsKKwkJCWNyaWEuY3JpX2tsZW4gPSBzb3AubWFja2V5bGVuICogODsKKwkJCWlmIChpbmZvLmF1dGhrZXkgJiYgc29wLm1hY2tleWxlbiAhPSBpbmZvLmF1dGhrZXkpIHsKKwkJCQlkcHJpbnRrKCIlcyglcykgLSBtYWNrZXlsZW4gJWQgIT0gJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkJCUNJT0NHU0VTU1NUUiwgc29wLm1hY2tleWxlbiwgaW5mby5hdXRoa2V5KTsKKwkJCQllcnJvciA9IEVJTlZBTDsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisKKwkJCWlmIChjcmlhLmNyaV9rbGVuKSB7CisJCQkJY3JpYS5jcmlfa2V5ID0gKHVfaW50OF90ICopIGttYWxsb2MoY3JpYS5jcmlfa2xlbi84LEdGUF9LRVJORUwpOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcihjcmlhLmNyaV9rZXksIHNvcC5tYWNrZXksCisJCQkJCQkJCWNyaWEuY3JpX2tsZW4gLyA4KSkgeworCQkJCQlkcHJpbnRrKCIlcyglcykgLSBiYWQgY29weVxuIiwgX19GVU5DVElPTl9fLCBDSU9DR1NFU1NTVFIpOworCQkJCQllcnJvciA9IEVGQVVMVDsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIE5COiBDSU9HU0VTU0lPTjIgaGFzIHRoZSBjcmlkICovCisJCWlmIChjbWQgPT0gQ0lPQ0dTRVNTSU9OMikgeworCQkJY3JpZCA9IHNvcC5jcmlkOworCQkJZXJyb3IgPSBjaGVja2NyaWQoY3JpZCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlkcHJpbnRrKCIlcyglcykgLSBjaGVja2NyaWQgJXhcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkJCUNJT0NHU0VTU1NUUiwgZXJyb3IpOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGFsbG93IGVpdGhlciBIVyBvciBTVyB0byBiZSB1c2VkICovCisJCQljcmlkID0gQ1JZUFRPQ0FQX0ZfSEFSRFdBUkUgfCBDUllQVE9DQVBfRl9TT0ZUV0FSRTsKKwkJfQorCQllcnJvciA9IGNyeXB0b19uZXdzZXNzaW9uKCZzaWQsIChpbmZvLmJsb2Nrc2l6ZSA/ICZjcmllIDogJmNyaWEpLCBjcmlkKTsKKwkJaWYgKGVycm9yKSB7CisJCQlkcHJpbnRrKCIlcyglcykgLSBuZXdzZXNzaW9uICVkXG4iLF9fRlVOQ1RJT05fXyxDSU9DR1NFU1NTVFIsZXJyb3IpOworCQkJZ290byBiYWlsOworCQl9CisKKwkJY3NlID0gY3NlY3JlYXRlKGZjciwgc2lkLCAmY3JpZSwgJmNyaWEsICZpbmZvKTsKKwkJaWYgKGNzZSA9PSBOVUxMKSB7CisJCQljcnlwdG9fZnJlZXNlc3Npb24oc2lkKTsKKwkJCWVycm9yID0gRUlOVkFMOworCQkJZHByaW50aygiJXMoJXMpIC0gY3NlY3JlYXRlIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fLCBDSU9DR1NFU1NTVFIpOworCQkJZ290byBiYWlsOworCQl9CisJCXNvcC5zZXMgPSBjc2UtPnNlczsKKworCQlpZiAoY21kID09IENJT0NHU0VTU0lPTjIpIHsKKwkJCS8qIHJldHVybiBoYXJkd2FyZS9kcml2ZXIgaWQgKi8KKwkJCXNvcC5jcmlkID0gQ1JZUFRPX1NFU0lEMkhJRChjc2UtPnNpZCk7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKCh2b2lkKilhcmcsICZzb3AsIChjbWQgPT0gQ0lPQ0dTRVNTSU9OKSA/CisJCQkJCXNpemVvZihzdHJ1Y3Qgc2Vzc2lvbl9vcCkgOiBzaXplb2Yoc29wKSkpIHsKKwkJCWRwcmludGsoIiVzKCVzKSAtIGJhZCBjb3B5XG4iLCBfX0ZVTkNUSU9OX18sIENJT0NHU0VTU1NUUik7CisJCQllcnJvciA9IEVGQVVMVDsKKwkJfQorYmFpbDoKKwkJaWYgKGVycm9yKSB7CisJCQlkcHJpbnRrKCIlcyglcykgLSBiYWlsICVkXG4iLCBfX0ZVTkNUSU9OX18sIENJT0NHU0VTU1NUUiwgZXJyb3IpOworCQkJaWYgKGNyaWUuY3JpX2tleSkKKwkJCQlrZnJlZShjcmllLmNyaV9rZXkpOworCQkJaWYgKGNyaWEuY3JpX2tleSkKKwkJCQlrZnJlZShjcmlhLmNyaV9rZXkpOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0lPQ0ZTRVNTSU9OOgorCQlkcHJpbnRrKCIlcyhDSU9DRlNFU1NJT04pXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnZXRfdXNlcihzZXMsICh1aW50MzJfdCopYXJnKTsKKwkJY3NlID0gY3NlZmluZChmY3IsIHNlcyk7CisJCWlmIChjc2UgPT0gTlVMTCkgeworCQkJZXJyb3IgPSBFSU5WQUw7CisJCQlkcHJpbnRrKCIlcyhDSU9DRlNFU1NJT04pIC0gRmFpbCAlZFxuIiwgX19GVU5DVElPTl9fLCBlcnJvcik7CisJCQlicmVhazsKKwkJfQorCQljc2VkZWxldGUoZmNyLCBjc2UpOworCQllcnJvciA9IGNzZWZyZWUoY3NlKTsKKwkJYnJlYWs7CisJY2FzZSBDSU9DQ1JZUFQ6CisJCWRwcmludGsoIiVzKENJT0NDUllQVClcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWlmKGNvcHlfZnJvbV91c2VyKCZjb3AsICh2b2lkKilhcmcsIHNpemVvZihjb3ApKSkgeworCQkJZHByaW50aygiJXMoQ0lPQ0NSWVBUKSAtIGJhZCBjb3B5XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJZXJyb3IgPSBFRkFVTFQ7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJY3NlID0gY3NlZmluZChmY3IsIGNvcC5zZXMpOworCQlpZiAoY3NlID09IE5VTEwpIHsKKwkJCWVycm9yID0gRUlOVkFMOworCQkJZHByaW50aygiJXMoQ0lPQ0NSWVBUKSAtIEZhaWwgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXJyb3IpOworCQkJYnJlYWs7CisJCX0KKwkJZXJyb3IgPSBjcnlwdG9kZXZfb3AoY3NlLCAmY29wKTsKKwkJaWYoY29weV90b191c2VyKCh2b2lkKilhcmcsICZjb3AsIHNpemVvZihjb3ApKSkgeworCQkJZHByaW50aygiJXMoQ0lPQ0NSWVBUKSAtIGJhZCByZXR1cm4gY29weVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWVycm9yID0gRUZBVUxUOworCQkJZ290byBiYWlsOworCQl9CisJCWJyZWFrOworCWNhc2UgQ0lPQ0tFWToKKwljYXNlIENJT0NLRVkyOgorCQlkcHJpbnRrKCIlcyhDSU9DS0VZKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKCFjcnlwdG9fdXNlcmFzeW1jcnlwdG8pCisJCQlyZXR1cm4gKEVQRVJNKTsJCS8qIFhYWCBjb21wYXQ/ICovCisJCWlmKGNvcHlfZnJvbV91c2VyKCZrb3AsICh2b2lkKilhcmcsIHNpemVvZihrb3ApKSkgeworCQkJZHByaW50aygiJXMoQ0lPQ0tFWSkgLSBiYWQgY29weVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWVycm9yID0gRUZBVUxUOworCQkJZ290byBiYWlsOworCQl9CisJCWlmIChjbWQgPT0gQ0lPQ0tFWSkgeworCQkJLyogTkI6IGNyeXB0byBjb3JlIGVuZm9yY2VzIHMvdyBkcml2ZXIgdXNlICovCisJCQlrb3AuY3JrX2NyaWQgPQorCQkJICAgIENSWVBUT0NBUF9GX0hBUkRXQVJFIHwgQ1JZUFRPQ0FQX0ZfU09GVFdBUkU7CisJCX0KKwkJZXJyb3IgPSBjcnlwdG9kZXZfa2V5KCZrb3ApOworCQlpZihjb3B5X3RvX3VzZXIoKHZvaWQqKWFyZywgJmtvcCwgc2l6ZW9mKGtvcCkpKSB7CisJCQlkcHJpbnRrKCIlcyhDSU9DR0tFWSkgLSBiYWQgcmV0dXJuIGNvcHlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnJvciA9IEVGQVVMVDsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlicmVhazsKKwljYXNlIENJT0NBU1lNRkVBVDoKKwkJZHByaW50aygiJXMoQ0lPQ0FTWU1GRUFUKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaWYgKCFjcnlwdG9fdXNlcmFzeW1jcnlwdG8pIHsKKwkJCS8qCisJCQkgKiBOQjogaWYgdXNlciBhc3ltIGNyeXB0byBvcGVyYXRpb25zIGFyZQorCQkJICogbm90IHBlcm1pdHRlZCByZXR1cm4gIm5vIGFsZ29yaXRobXMiCisJCQkgKiBzbyB3ZWxsLWJlaGF2ZWQgYXBwbGljYXRpb25zIHdpbGwganVzdAorCQkJICogZmFsbGJhY2sgdG8gZG9pbmcgdGhlbSBpbiBzb2Z0d2FyZS4KKwkJCSAqLworCQkJZmVhdCA9IDA7CisJCX0gZWxzZQorCQkJZXJyb3IgPSBjcnlwdG9fZ2V0ZmVhdCgmZmVhdCk7CisJCWlmICghZXJyb3IpIHsKKwkJICBlcnJvciA9IGNvcHlfdG9fdXNlcigodm9pZCopYXJnLCAmZmVhdCwgc2l6ZW9mKGZlYXQpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIENJT0NGSU5EREVWOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmZvcCwgKHZvaWQqKWFyZywgc2l6ZW9mKGZvcCkpKSB7CisJCQlkcHJpbnRrKCIlcyhDSU9DRklORERFVikgLSBiYWQgY29weVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCWVycm9yID0gRUZBVUxUOworCQkJZ290byBiYWlsOworCQl9CisJCWVycm9yID0gY3J5cHRvZGV2X2ZpbmQoJmZvcCk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQqKWFyZywgJmZvcCwgc2l6ZW9mKGZvcCkpKSB7CisJCQlkcHJpbnRrKCIlcyhDSU9DRklORERFVikgLSBiYWQgcmV0dXJuIGNvcHlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQllcnJvciA9IEVGQVVMVDsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKCIlcyh1bmtub3duIGlvY3RsIDB4JXgpXG4iLCBfX0ZVTkNUSU9OX18sIGNtZCk7CisJCWVycm9yID0gRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuKC1lcnJvcik7Cit9CisKKyNpZmRlZiBIQVZFX1VOTE9DS0VEX0lPQ1RMCitzdGF0aWMgbG9uZworY3J5cHRvZGV2X3VubG9ja2VkX2lvY3RsKAorCXN0cnVjdCBmaWxlICpmaWxwLAorCXVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGNyeXB0b2Rldl9pb2N0bChOVUxMLCBmaWxwLCBjbWQsIGFyZyk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorY3J5cHRvZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGZjcnlwdCAqZmNyOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMzUpCisJLyoKKwkgKiBvbiAyLjYuMzUgcHJpdmF0ZV9kYXRhIHBvaW50cyB0byBhIG1pc2NkZXZpY2Ugc3RydWN0dXJlLCB3ZSBvdmVycmlkZQorCSAqIGl0LCAgd2hpY2ggaXMgY3VycmVudGx5IHNhZmUgdG8gZG8uCisJICovCisJaWYgKGZpbHAtPnByaXZhdGVfZGF0YSkgeworCQlwcmludGsoImNyeXB0b2RldjogUHJpdmF0ZSBkYXRhIGFscmVhZHkgZXhpc3RzIC0gJXAhXG4iLCBmaWxwLT5wcml2YXRlX2RhdGEpOworCQlyZXR1cm4oLUVOT0RFVik7CisJfQorI2VuZGlmCisKKwlmY3IgPSBrbWFsbG9jKHNpemVvZigqZmNyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmY3IpIHsKKwkJZHByaW50aygiJXMoKSAtIG1hbGxvYyBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybigtRU5PTUVNKTsKKwl9CisJbWVtc2V0KGZjciwgMCwgc2l6ZW9mKCpmY3IpKTsKKworCUlOSVRfTElTVF9IRUFEKCZmY3ItPmNzZXNzaW9ucyk7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZmNyOworCXJldHVybigwKTsKK30KKworc3RhdGljIGludAorY3J5cHRvZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGZjcnlwdCAqZmNyID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjc2Vzc2lvbiAqY3NlLCAqdG1wOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoIWZpbHApIHsKKwkJcHJpbnRrKCJjcnlwdG9kZXY6IE5vIHByaXZhdGUgZGF0YSBvbiByZWxlYXNlXG4iKTsKKwkJcmV0dXJuKDApOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjc2UsIHRtcCwgJmZjci0+Y3Nlc3Npb25zLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZjc2UtPmxpc3QpOworCQkodm9pZCljc2VmcmVlKGNzZSk7CisJfQorCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJa2ZyZWUoZmNyKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNyeXB0b2Rldl9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gY3J5cHRvZGV2X29wZW4sCisJLnJlbGVhc2UgPSBjcnlwdG9kZXZfcmVsZWFzZSwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMzYpCisJLmlvY3RsID0gY3J5cHRvZGV2X2lvY3RsLAorI2VuZGlmCisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9JT0NUTAorCS51bmxvY2tlZF9pb2N0bCA9IGNyeXB0b2Rldl91bmxvY2tlZF9pb2N0bCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGNyeXB0b2RldiA9IHsKKwkubWlub3IgPSBDUllQVE9ERVZfTUlOT1IsCisJLm5hbWUgPSAiY3J5cHRvIiwKKwkuZm9wcyA9ICZjcnlwdG9kZXZfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitjcnlwdG9kZXZfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCWRwcmludGsoIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBjcnlwdG9kZXZfaW5pdCk7CisJcmMgPSBtaXNjX3JlZ2lzdGVyKCZjcnlwdG9kZXYpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgImNyeXB0b2RldjogcmVnaXN0cmF0aW9uIG9mIC9kZXYvY3J5cHRvIGZhaWxlZFxuIik7CisJCXJldHVybihyYyk7CisJfQorCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2NyeXB0b2Rldl9leGl0KHZvaWQpCit7CisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKwltaXNjX2RlcmVnaXN0ZXIoJmNyeXB0b2Rldik7Cit9CisKK21vZHVsZV9pbml0KGNyeXB0b2Rldl9pbml0KTsKK21vZHVsZV9leGl0KGNyeXB0b2Rldl9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkJTRCIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRfbWNjdWxsb3VnaEBtY2FmZWUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDcnlwdG9kZXYgKHVzZXIgaW50ZXJmYWNlIHRvIE9DRikiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9vY2YvY3J5cHRvZGV2LmggYi9jcnlwdG8vb2NmL2NyeXB0b2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjc1NDEKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vb2NmL2NyeXB0b2Rldi5oCkBAIC0wLDAgKzEsNTYxIEBACisvKgkkRnJlZUJTRDogc3JjL3N5cy9vcGVuY3J5cHRvL2NyeXB0b2Rldi5oLHYgMS4yNSAyMDA3LzA1LzA5IDE5OjM3OjAyIGdubiBFeHAgJAkqLworLyoJJE9wZW5CU0Q6IGNyeXB0b2Rldi5oLHYgMS4zMSAyMDAyLzA2LzExIDExOjE0OjI5IGJlY2sgRXhwICQJKi8KKworLyotCisgKiBMaW51eCBwb3J0IGRvbmUgYnkgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRfbWNjdWxsb3VnaEBtY2FmZWUuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgRGF2aWQgTWNDdWxsb3VnaAorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBUaGUgbGljZW5zZSBhbmQgb3JpZ2luYWwgYXV0aG9yIGFyZSBsaXN0ZWQgYmVsb3cuCisgKgorICogVGhlIGF1dGhvciBvZiB0aGlzIGNvZGUgaXMgQW5nZWxvcyBELiBLZXJvbXl0aXMgKGFuZ2Vsb3NAY2lzLnVwZW5uLmVkdSkKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA2IFNhbSBMZWZmbGVyLCBFcnJubyBDb25zdWx0aW5nCisgKgorICogVGhpcyBjb2RlIHdhcyB3cml0dGVuIGJ5IEFuZ2Vsb3MgRC4gS2Vyb215dGlzIGluIEF0aGVucywgR3JlZWNlLCBpbgorICogRmVicnVhcnkgMjAwMC4gTmV0d29yayBTZWN1cml0eSBUZWNobm9sb2dpZXMgSW5jLiAoTlNUSSkga2luZGx5CisgKiBzdXBwb3J0ZWQgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgY29kZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgQW5nZWxvcyBELiBLZXJvbXl0aXMKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgYW5kIG1vZGlmeSB0aGlzIHNvZnR3YXJlIHdpdGggb3Igd2l0aG91dCBmZWUKKyAqIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgZW50aXJlIG5vdGljZSBpcyBpbmNsdWRlZCBpbgorICogYWxsIHNvdXJjZSBjb2RlIGNvcGllcyBvZiBhbnkgc29mdHdhcmUgd2hpY2ggaXMgb3IgaW5jbHVkZXMgYSBjb3B5IG9yCisgKiBtb2RpZmljYXRpb24gb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVFkuIElOIFBBUlRJQ1VMQVIsIE5PTkUgT0YgVEhFIEFVVEhPUlMgTUFLRVMgQU5ZCisgKiBSRVBSRVNFTlRBVElPTiBPUiBXQVJSQU5UWSBPRiBBTlkgS0lORCBDT05DRVJOSU5HIFRIRQorICogTUVSQ0hBTlRBQklMSVRZIE9GIFRISVMgU09GVFdBUkUgT1IgSVRTIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGVvIGRlIFJhYWR0CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBFZmZvcnQgc3BvbnNvcmVkIGluIHBhcnQgYnkgdGhlIERlZmVuc2UgQWR2YW5jZWQgUmVzZWFyY2ggUHJvamVjdHMKKyAqIEFnZW5jeSAoREFSUEEpIGFuZCBBaXIgRm9yY2UgUmVzZWFyY2ggTGFib3JhdG9yeSwgQWlyIEZvcmNlCisgKiBNYXRlcmllbCBDb21tYW5kLCBVU0FGLCB1bmRlciBhZ3JlZW1lbnQgbnVtYmVyIEYzMDYwMi0wMS0yLTA1MzcuCisgKgorICovCisKKyNpZm5kZWYgX0NSWVBUT19DUllQVE9fSF8KKyNkZWZpbmUgX0NSWVBUT19DUllQVE9fSF8KKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgfHwgIWRlZmluZWQoX19HTElCQ19fKSB8fCAoX19HTElCQ19fIDwgMikKKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2VuZGlmCisKKworLyogU29tZSBpbml0aWFsIHZhbHVlcyAqLworI2RlZmluZSBDUllQVE9fRFJJVkVSU19JTklUSUFMCTQKKyNkZWZpbmUgQ1JZUFRPX1NXX1NFU1NJT05TCTMyCisKKy8qIEhhc2ggdmFsdWVzICovCisjZGVmaW5lIE5VTExfSEFTSF9MRU4JCTAKKyNkZWZpbmUgTUQ1X0hBU0hfTEVOCQkxNgorI2RlZmluZSBTSEExX0hBU0hfTEVOCQkyMAorI2RlZmluZSBSSVBFTUQxNjBfSEFTSF9MRU4JMjAKKyNkZWZpbmUgU0hBMl8yNTZfSEFTSF9MRU4JMzIKKyNkZWZpbmUgU0hBMl8zODRfSEFTSF9MRU4JNDgKKyNkZWZpbmUgU0hBMl81MTJfSEFTSF9MRU4JNjQKKyNkZWZpbmUgTUQ1X0tQREtfSEFTSF9MRU4JMTYKKyNkZWZpbmUgU0hBMV9LUERLX0hBU0hfTEVOCTIwCisvKiBNYXhpbXVtIGhhc2ggYWxnb3JpdGhtIHJlc3VsdCBsZW5ndGggKi8KKyNkZWZpbmUgSEFTSF9NQVhfTEVOCQlTSEEyXzUxMl9IQVNIX0xFTiAvKiBLZWVwIHRoaXMgdXBkYXRlZCAqLworCisvKiBITUFDIHZhbHVlcyAqLworI2RlZmluZSBOVUxMX0hNQUNfQkxPQ0tfTEVOCQkJMQorI2RlZmluZSBNRDVfSE1BQ19CTE9DS19MRU4JCQk2NAorI2RlZmluZSBTSEExX0hNQUNfQkxPQ0tfTEVOCQkJNjQKKyNkZWZpbmUgUklQRU1EMTYwX0hNQUNfQkxPQ0tfTEVOCTY0CisjZGVmaW5lIFNIQTJfMjU2X0hNQUNfQkxPQ0tfTEVOCQk2NAorI2RlZmluZSBTSEEyXzM4NF9ITUFDX0JMT0NLX0xFTgkJMTI4CisjZGVmaW5lIFNIQTJfNTEyX0hNQUNfQkxPQ0tfTEVOCQkxMjgKKy8qIE1heGltdW0gSE1BQyBibG9jayBsZW5ndGggKi8KKyNkZWZpbmUgSE1BQ19NQVhfQkxPQ0tfTEVOCQlTSEEyXzUxMl9ITUFDX0JMT0NLX0xFTiAvKiBLZWVwIHRoaXMgdXBkYXRlZCAqLworI2RlZmluZSBITUFDX0lQQURfVkFMCQkJMHgzNgorI2RlZmluZSBITUFDX09QQURfVkFMCQkJMHg1QworCisvKiBFbmNyeXB0aW9uIGFsZ29yaXRobSBibG9jayBzaXplcyAqLworI2RlZmluZSBOVUxMX0JMT0NLX0xFTgkJCTEKKyNkZWZpbmUgREVTX0JMT0NLX0xFTgkJCTgKKyNkZWZpbmUgREVTM19CTE9DS19MRU4JCQk4CisjZGVmaW5lIEJMT1dGSVNIX0JMT0NLX0xFTgkJOAorI2RlZmluZSBTS0lQSkFDS19CTE9DS19MRU4JCTgKKyNkZWZpbmUgQ0FTVDEyOF9CTE9DS19MRU4JCTgKKyNkZWZpbmUgUklKTkRBRUwxMjhfQkxPQ0tfTEVOCTE2CisjZGVmaW5lIEFFU19CTE9DS19MRU4JCQlSSUpOREFFTDEyOF9CTE9DS19MRU4KKyNkZWZpbmUgQ0FNRUxMSUFfQkxPQ0tfTEVOCQkxNgorI2RlZmluZSBBUkM0X0JMT0NLX0xFTgkJCTEKKyNkZWZpbmUgRUFMR19NQVhfQkxPQ0tfTEVOCQlBRVNfQkxPQ0tfTEVOIC8qIEtlZXAgdGhpcyB1cGRhdGVkICovCisKKy8qIEVuY3J5cHRpb24gYWxnb3JpdGhtIG1pbiBhbmQgbWF4IGtleSBzaXplcyAqLworI2RlZmluZSBOVUxMX01JTl9LRVlfTEVOCQkwCisjZGVmaW5lIE5VTExfTUFYX0tFWV9MRU4JCTAKKyNkZWZpbmUgREVTX01JTl9LRVlfTEVOCQkJOAorI2RlZmluZSBERVNfTUFYX0tFWV9MRU4JCQk4CisjZGVmaW5lIERFUzNfTUlOX0tFWV9MRU4JCTI0CisjZGVmaW5lIERFUzNfTUFYX0tFWV9MRU4JCTI0CisjZGVmaW5lIEJMT1dGSVNIX01JTl9LRVlfTEVOCTQKKyNkZWZpbmUgQkxPV0ZJU0hfTUFYX0tFWV9MRU4JNTYKKyNkZWZpbmUgU0tJUEpBQ0tfTUlOX0tFWV9MRU4JMTAKKyNkZWZpbmUgU0tJUEpBQ0tfTUFYX0tFWV9MRU4JMTAKKyNkZWZpbmUgQ0FTVDEyOF9NSU5fS0VZX0xFTgkJNQorI2RlZmluZSBDQVNUMTI4X01BWF9LRVlfTEVOCQkxNgorI2RlZmluZSBSSUpOREFFTDEyOF9NSU5fS0VZX0xFTgkxNgorI2RlZmluZSBSSUpOREFFTDEyOF9NQVhfS0VZX0xFTgkzMgorI2RlZmluZSBBRVNfTUlOX0tFWV9MRU4JCQlSSUpOREFFTDEyOF9NSU5fS0VZX0xFTgorI2RlZmluZSBBRVNfTUFYX0tFWV9MRU4JCQlSSUpOREFFTDEyOF9NQVhfS0VZX0xFTgorI2RlZmluZSBDQU1FTExJQV9NSU5fS0VZX0xFTgkxNgorI2RlZmluZSBDQU1FTExJQV9NQVhfS0VZX0xFTgkzMgorI2RlZmluZSBBUkM0X01JTl9LRVlfTEVOCQkxCisjZGVmaW5lIEFSQzRfTUFYX0tFWV9MRU4JCTI1NgorCisvKiBNYXggc2l6ZSBvZiBkYXRhIHRoYXQgY2FuIGJlIHByb2Nlc3NlZCAqLworI2RlZmluZSBDUllQVE9fTUFYX0RBVEFfTEVOCQk2NCoxMDI0IC0gMQorCisjZGVmaW5lIENSWVBUT19BTEdPUklUSE1fTUlOCTEKKyNkZWZpbmUgQ1JZUFRPX0RFU19DQkMJCQkxCisjZGVmaW5lIENSWVBUT18zREVTX0NCQwkJCTIKKyNkZWZpbmUgQ1JZUFRPX0JMRl9DQkMJCQkzCisjZGVmaW5lIENSWVBUT19DQVNUX0NCQwkJCTQKKyNkZWZpbmUgQ1JZUFRPX1NLSVBKQUNLX0NCQwkJNQorI2RlZmluZSBDUllQVE9fTUQ1X0hNQUMJCQk2CisjZGVmaW5lIENSWVBUT19TSEExX0hNQUMJCTcKKyNkZWZpbmUgQ1JZUFRPX1JJUEVNRDE2MF9ITUFDCTgKKyNkZWZpbmUgQ1JZUFRPX01ENV9LUERLCQkJOQorI2RlZmluZSBDUllQVE9fU0hBMV9LUERLCQkxMAorI2RlZmluZSBDUllQVE9fUklKTkRBRUwxMjhfQ0JDCTExIC8qIDEyOCBiaXQgYmxvY2tzaXplICovCisjZGVmaW5lIENSWVBUT19BRVNfQ0JDCQkJMTEgLyogMTI4IGJpdCBibG9ja3NpemUgLS0gdGhlIHNhbWUgYXMgYWJvdmUgKi8KKyNkZWZpbmUgQ1JZUFRPX0FSQzQJCQkJMTIKKyNkZWZpbmUgQ1JZUFRPX01ENQkJCQkxMworI2RlZmluZSBDUllQVE9fU0hBMQkJCQkxNAorI2RlZmluZSBDUllQVE9fTlVMTF9ITUFDCQkxNQorI2RlZmluZSBDUllQVE9fTlVMTF9DQkMJCQkxNgorI2RlZmluZSBDUllQVE9fREVGTEFURV9DT01QCQkxNyAvKiBEZWZsYXRlIGNvbXByZXNzaW9uIGFsZ29yaXRobSAqLworI2RlZmluZSBDUllQVE9fU0hBMl8yNTZfSE1BQwkxOAorI2RlZmluZSBDUllQVE9fU0hBMl8zODRfSE1BQwkxOQorI2RlZmluZSBDUllQVE9fU0hBMl81MTJfSE1BQwkyMAorI2RlZmluZSBDUllQVE9fQ0FNRUxMSUFfQ0JDCQkyMQorI2RlZmluZSBDUllQVE9fU0hBMl8yNTYJCQkyMgorI2RlZmluZSBDUllQVE9fU0hBMl8zODQJCQkyMworI2RlZmluZSBDUllQVE9fU0hBMl81MTIJCQkyNAorI2RlZmluZSBDUllQVE9fUklQRU1EMTYwCQkyNQorI2RlZmluZQlDUllQVE9fTFpTX0NPTVAJCQkyNgorI2RlZmluZSBDUllQVE9fRVNQX1JGQzI0MDYgCQkyNworLy8jZGVmaW5lIENSWVBUT19FU1BfUkZDMjQwNl9UUkFOU1BPUlQgMjAKKyNkZWZpbmUgQ1JZUFRPX0VTUF9SRkM0MzAzICAJCTI4CisjZGVmaW5lIENSWVBUT19FU1A0X1JGQzQzMDMgIAkJMjgKKyNkZWZpbmUgQ1JZUFRPX0VTUDZfUkZDNDMwMyAgCQkyOQorI2RlZmluZSBDUllQVE9fQUgJCQkzMAorI2RlZmluZSBDUllQVE9fQUg0CQkJMzAKKyNkZWZpbmUgQ1JZUFRPX0FINgkJCTMxCisjZGVmaW5lIENSWVBUT19TSEEyX0hNQUMJCTMyIC8qVE9ETyBpcyBpdCBhIGR1cGxpY2F0ZSBlbnRyeSovCisjZGVmaW5lIENSWVBUT19BTEdPUklUSE1fTUFYCQkzMiAvKiBLZWVwIHVwZGF0ZWQgLSBzZWUgYmVsb3cgKi8KKworLyogQWxnb3JpdGhtIGZsYWdzICovCisjZGVmaW5lIENSWVBUT19BTEdfRkxBR19TVVBQT1JURUQJMHgwMSAvKiBBbGdvcml0aG0gaXMgc3VwcG9ydGVkICovCisjZGVmaW5lIENSWVBUT19BTEdfRkxBR19STkdfRU5BQkxFCTB4MDIgLyogSGFzIEhXIFJORyBmb3IgREgvRFNBICovCisjZGVmaW5lIENSWVBUT19BTEdfRkxBR19EU0FfU0hBCQkweDA0IC8qIENhbiBkbyBTSEEgb24gbXNnICovCisKKy8qCisgKiBDcnlwdG8gZHJpdmVyL2RldmljZSBmbGFncy4gIFRoZXkgY2FuIHNldCBpbiB0aGUgY3JpZAorICogcGFyYW1ldGVyIHdoZW4gY3JlYXRpbmcgYSBzZXNzaW9uIG9yIHN1Ym1pdHRpbmcgYSBrZXkKKyAqIG9wIHRvIGFmZmVjdCB0aGUgZGV2aWNlL2RyaXZlciBhc3NpZ25lZC4gIElmIG5laXRoZXIKKyAqIG9mIHRoZXNlIGFyZSBzcGVjaWZpZWQgdGhlbiB0aGUgY3JpZCBpcyBhc3N1bWVkIHRvIGhvbGQKKyAqIHRoZSBkcml2ZXIgaWQgb2YgYW4gZXhpc3RpbmcgKGFuZCBzdWl0YWJsZSkgZGV2aWNlIHRoYXQKKyAqIG11c3QgYmUgdXNlZCB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0LgorICovCisjZGVmaW5lIENSWVBUT19GTEFHX0hBUkRXQVJFCTB4MDEwMDAwMDAJLyogaGFyZHdhcmUgYWNjZWxlcmF0ZWQgKi8KKyNkZWZpbmUgQ1JZUFRPX0ZMQUdfU09GVFdBUkUJMHgwMjAwMDAwMAkvKiBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiBOQjogZGVwcmVjYXRlZCAqLworc3RydWN0IHNlc3Npb25fb3AgeworCXVfaW50MzJfdAljaXBoZXI7CQkvKiBpZS4gQ1JZUFRPX0RFU19DQkMgKi8KKwl1X2ludDMyX3QJbWFjOwkJLyogaWUuIENSWVBUT19NRDVfSE1BQyAqLworCisJdV9pbnQzMl90CWtleWxlbjsJCS8qIGNpcGhlciBrZXkgKi8KKwljYWRkcl90CQlrZXk7CisJaW50CQltYWNrZXlsZW47CS8qIG1hYyBrZXkgKi8KKwljYWRkcl90CQltYWNrZXk7CisKKyAgCXVfaW50MzJfdAlzZXM7CQkvKiByZXR1cm5zOiBzZXNzaW9uICMgKi8gCit9OworCitzdHJ1Y3Qgc2Vzc2lvbjJfb3AgeworCXVfaW50MzJfdAljaXBoZXI7CQkvKiBpZS4gQ1JZUFRPX0RFU19DQkMgKi8KKwl1X2ludDMyX3QJbWFjOwkJLyogaWUuIENSWVBUT19NRDVfSE1BQyAqLworCisJdV9pbnQzMl90CWtleWxlbjsJCS8qIGNpcGhlciBrZXkgKi8KKwljYWRkcl90CQlrZXk7CisJaW50CQltYWNrZXlsZW47CS8qIG1hYyBrZXkgKi8KKwljYWRkcl90CQltYWNrZXk7CisKKyAgCXVfaW50MzJfdAlzZXM7CQkvKiByZXR1cm5zOiBzZXNzaW9uICMgKi8gCisJaW50CQljcmlkOwkJLyogZHJpdmVyIGlkICsgZmxhZ3MgKHJ3KSAqLworCWludAkJcGFkWzRdOwkJLyogZm9yIGZ1dHVyZSBleHBhbnNpb24gKi8KK307CisKK3N0cnVjdCBjcnlwdF9vcCB7CisJdV9pbnQzMl90CXNlczsKKwl1X2ludDE2X3QJb3A7CQkvKiBpLmUuIENPUF9FTkNSWVBUICovCisjZGVmaW5lIENPUF9OT05FCTAKKyNkZWZpbmUgQ09QX0VOQ1JZUFQJMQorI2RlZmluZSBDT1BfREVDUllQVAkyCisJdV9pbnQxNl90CWZsYWdzOworI2RlZmluZQlDT1BfRl9CQVRDSAkweDAwMDgJCS8qIEJhdGNoIG9wIGlmIHBvc3NpYmxlICovCisJdV9pbnQJCWxlbjsKKwljYWRkcl90CQlzcmMsIGRzdDsJLyogYmVjb21lIGlvdltdIGluc2lkZSBrZXJuZWwgKi8KKwljYWRkcl90CQltYWM7CQkvKiBtdXN0IGJlIGJpZyBlbm91Z2ggZm9yIGNob3NlbiBNQUMgKi8KKwljYWRkcl90CQlpdjsKK307CisKKy8qCisgKiBQYXJhbWV0ZXJzIGZvciBsb29raW5nIHVwIGEgY3J5cHRvIGRyaXZlci9kZXZpY2UgYnkKKyAqIGRldmljZSBuYW1lIG9yIGJ5IGlkLiAgVGhlIGxhdHRlciBhcmUgcmV0dXJuZWQgZm9yCisgKiBjcmVhdGVkIHNlc3Npb25zIChjcmlkKSBhbmQgY29tcGxldGVkIGtleSBvcGVyYXRpb25zLgorICovCitzdHJ1Y3QgY3J5cHRfZmluZF9vcCB7CisJaW50CQljcmlkOwkJLyogZHJpdmVyIGlkICsgZmxhZ3MgKi8KKwljaGFyCQluYW1lWzMyXTsJLyogZGV2aWNlL2RyaXZlciBuYW1lICovCit9OworCisvKiBiaWdudW0gcGFyYW1ldGVyLCBpbiBwYWNrZWQgYnl0ZXMsIC4uLiAqLworc3RydWN0IGNycGFyYW0geworCWNhZGRyX3QJCWNycF9wOworCXVfaW50CQljcnBfbmJpdHM7Cit9OworCisjZGVmaW5lIENSS19NQVhQQVJBTQk4CisKK3N0cnVjdCBjcnlwdF9rb3AgeworCXVfaW50CQljcmtfb3A7CQkvKiBpZS4gQ1JLX01PRF9FWFAgb3Igb3RoZXIgKi8KKwl1X2ludAkJY3JrX3N0YXR1czsJLyogcmV0dXJuIHN0YXR1cyAqLworCXVfc2hvcnQJCWNya19pcGFyYW1zOwkvKiAjIG9mIGlucHV0IHBhcmFtZXRlcnMgKi8KKwl1X3Nob3J0CQljcmtfb3BhcmFtczsJLyogIyBvZiBvdXRwdXQgcGFyYW1ldGVycyAqLworCXVfaW50CQljcmtfY3JpZDsJLyogTkI6IG9ubHkgdXNlZCBieSBDSU9DS0VZMiAocncpICovCisJc3RydWN0IGNycGFyYW0JY3JrX3BhcmFtW0NSS19NQVhQQVJBTV07Cit9OworI2RlZmluZSBDUktfQUxHT1JJVE1fTUlOCTAKKyNkZWZpbmUgQ1JLX01PRF9FWFAJCTAKKyNkZWZpbmUgQ1JLX01PRF9FWFBfQ1JUCQkxCisjZGVmaW5lIENSS19EU0FfU0lHTgkJMgorI2RlZmluZSBDUktfRFNBX1ZFUklGWQkJMworI2RlZmluZSBDUktfREhfQ09NUFVURV9LRVkJNAorI2RlZmluZSBDUktfQUxHT1JJVEhNX01BWAk0IC8qIEtlZXAgdXBkYXRlZCAtIHNlZSBiZWxvdyAqLworCisjZGVmaW5lIENSRl9NT0RfRVhQCQkoMSA8PCBDUktfTU9EX0VYUCkKKyNkZWZpbmUgQ1JGX01PRF9FWFBfQ1JUCQkoMSA8PCBDUktfTU9EX0VYUF9DUlQpCisjZGVmaW5lIENSRl9EU0FfU0lHTgkJKDEgPDwgQ1JLX0RTQV9TSUdOKQorI2RlZmluZSBDUkZfRFNBX1ZFUklGWQkJKDEgPDwgQ1JLX0RTQV9WRVJJRlkpCisjZGVmaW5lIENSRl9ESF9DT01QVVRFX0tFWQkoMSA8PCBDUktfREhfQ09NUFVURV9LRVkpCisKKy8qCisgKiBkb25lIGFnYWluc3Qgb3BlbiBvZiAvZGV2L2NyeXB0bywgdG8gZ2V0IGEgY2xvbmVkIGRlc2NyaXB0b3IuCisgKiBQbGVhc2UgdXNlIEZfU0VURkQgYWdhaW5zdCB0aGUgY2xvbmVkIGRlc2NyaXB0b3IuCisgKi8KKyNkZWZpbmUgQ1JJT0dFVAkJX0lPV1IoJ2MnLCAxMDAsIHVfaW50MzJfdCkKKyNkZWZpbmUgQ1JJT0FTWU1GRUFUCUNJT0NBU1lNRkVBVAorI2RlZmluZSBDUklPRklORERFVglDSU9DRklORERFVgorCisvKiB0aGUgZm9sbG93aW5nIGFyZSBkb25lIGFnYWluc3QgdGhlIGNsb25lZCBkZXNjcmlwdG9yICovCisjZGVmaW5lIENJT0NHU0VTU0lPTglfSU9XUignYycsIDEwMSwgc3RydWN0IHNlc3Npb25fb3ApCisjZGVmaW5lIENJT0NGU0VTU0lPTglfSU9XKCdjJywgMTAyLCB1X2ludDMyX3QpCisjZGVmaW5lIENJT0NDUllQVAlfSU9XUignYycsIDEwMywgc3RydWN0IGNyeXB0X29wKQorI2RlZmluZSBDSU9DS0VZCQlfSU9XUignYycsIDEwNCwgc3RydWN0IGNyeXB0X2tvcCkKKyNkZWZpbmUgQ0lPQ0FTWU1GRUFUCV9JT1IoJ2MnLCAxMDUsIHVfaW50MzJfdCkKKyNkZWZpbmUgQ0lPQ0dTRVNTSU9OMglfSU9XUignYycsIDEwNiwgc3RydWN0IHNlc3Npb24yX29wKQorI2RlZmluZSBDSU9DS0VZMglfSU9XUignYycsIDEwNywgc3RydWN0IGNyeXB0X2tvcCkKKyNkZWZpbmUgQ0lPQ0ZJTkRERVYJX0lPV1IoJ2MnLCAxMDgsIHN0cnVjdCBjcnlwdF9maW5kX29wKQorCitzdHJ1Y3QgY3J5cHRvdHN0YXQgeworCXN0cnVjdCB0aW1lc3BlYwlhY2M7CQkvKiB0b3RhbCBhY2N1bXVsYXRlZCB0aW1lICovCisJc3RydWN0IHRpbWVzcGVjCW1pbjsJCS8qIG1pbiB0aW1lICovCisJc3RydWN0IHRpbWVzcGVjCW1heDsJCS8qIG1heCB0aW1lICovCisJdV9pbnQzMl90CWNvdW50OwkJLyogbnVtYmVyIG9mIG9ic2VydmF0aW9ucyAqLworfTsKKworc3RydWN0IGNyeXB0b3N0YXRzIHsKKwl1X2ludDMyX3QJY3Nfb3BzOwkJLyogc3ltbWV0cmljIGNyeXB0byBvcHMgc3VibWl0dGVkICovCisJdV9pbnQzMl90CWNzX2VycnM7CS8qIHN5bW1ldHJpYyBjcnlwdG8gb3BzIHRoYXQgZmFpbGVkICovCisJdV9pbnQzMl90CWNzX2tvcHM7CS8qIGFzeW1ldHJpYy9rZXkgb3BzIHN1Ym1pdHRlZCAqLworCXVfaW50MzJfdAljc19rZXJyczsJLyogYXN5bWV0cmljL2tleSBvcHMgdGhhdCBmYWlsZWQgKi8KKwl1X2ludDMyX3QJY3NfaW50cnM7CS8qIGNyeXB0byBzd2kgdGhyZWFkIGFjdGl2YXRpb25zICovCisJdV9pbnQzMl90CWNzX3JldHM7CS8qIGNyeXB0byByZXR1cm4gdGhyZWFkIGFjdGl2YXRpb25zICovCisJdV9pbnQzMl90CWNzX2Jsb2NrczsJLyogc3ltbWV0cmljIG9wIGRyaXZlciBibG9jayAqLworCXVfaW50MzJfdAljc19rYmxvY2tzOwkvKiBzeW1tZXRyaWMgb3AgZHJpdmVyIGJsb2NrICovCisJLyoKKwkgKiBXaGVuIENSWVBUT19USU1JTkcgaXMgZGVmaW5lZCBhdCBjb21waWxlIHRpbWUgYW5kIHRoZQorCSAqIHN5c2N0bCBkZWJ1Zy5jcnlwdG8gaXMgc2V0IHRvIDEsIHRoZSBjcnlwdG8gc3lzdGVtIHdpbGwKKwkgKiBhY2N1bXVsYXRlIHN0YXRpc3RpY3MgYWJvdXQgaG93IGxvbmcgaXQgdGFrZXMgdG8gcHJvY2VzcworCSAqIGNyeXB0byByZXF1ZXN0cyBhdCB2YXJpb3VzIHBvaW50cyBkdXJpbmcgcHJvY2Vzc2luZy4KKwkgKi8KKwlzdHJ1Y3QgY3J5cHRvdHN0YXQgY3NfaW52b2tlOwkvKiBjcnlwdG9fZGlwc2F0Y2ggLT4gY3J5cHRvX2ludm9rZSAqLworCXN0cnVjdCBjcnlwdG90c3RhdCBjc19kb25lOwkvKiBjcnlwdG9faW52b2tlIC0+IGNyeXB0b19kb25lICovCisJc3RydWN0IGNyeXB0b3RzdGF0IGNzX2NiOwkvKiBjcnlwdG9fZG9uZSAtPiBjYWxsYmFjayAqLworCXN0cnVjdCBjcnlwdG90c3RhdCBjc19maW5pczsJLyogY2FsbGJhY2sgLT4gY2FsbGJhY2sgcmV0dXJuICovCisKKwl1X2ludDMyX3QJY3NfZHJvcHM7CQkvKiBjcnlwdG8gb3BzIGRyb3BwZWQgZHVlIHRvIGNvbmdlc3Rpb24gKi8KK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIFN0YW5kYXJkIGluaXRpYWxpemF0aW9uIHN0cnVjdHVyZSBiZWdpbm5pbmcgKi8KK3N0cnVjdCBjcnlwdG9pbmkgeworCWludAkJY3JpX2FsZzsJLyogQWxnb3JpdGhtIHRvIHVzZSAqLworCWludAkJY3JpX2ZsYWdzOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCWludAkJY3JpX21sZW47CS8qIE51bWJlciBvZiBieXRlcyB3ZSB3YW50IGZyb20gdGhlCisJCQkJCSAgIGVudGlyZSBoYXNoLiAwIG1lYW5zIGFsbC4gKi8KKwkJCWludAkJCWNyaV9rbGVuOwkvKiBLZXkgbGVuZ3RoLCBpbiBiaXRzICovCisJCQljYWRkcl90CQljcmlfa2V5OwkvKiBrZXkgdG8gdXNlICovCisJCQl1X2ludDhfdAljcmlfaXZbRUFMR19NQVhfQkxPQ0tfTEVOXTsJLyogSVYgdG8gdXNlICovCisJCX0gY3JpX2FsZzsKKwkJc3RydWN0IHsKKwkJCXVfaW50MzJfdCBiYXNlYWxnOworCQkJc3RydWN0IHNvY2thZGRyX2luIHR1bl9zb3VyY2U7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gdHVuX2Rlc3RpbmF0aW9uOworCQkJaW50IHR1bl9kZl9tb2RlOworCQkJaW50IHR1bl9kc19tb2RlOworCQkgCWludCB0dW5fdHRsX3ZhbHVlOworCQkgCWludCB0dW5fcmVwbGF5X3dpbmRvd3NpemU7CisJCSAJaW50IHNwaXZhbHVlIDsKKwkJIAlpbnQgcmVwbGF5aW5pdDsgIC8qIHNldCB0byAwIHRvIGRpc2FibGUgcmVwbGF5IG9uIHJlY2VpdmUgKi8KKwkJIAl1X2ludDY0X3QgdGltZV9oYXJkX2xpZmV0aW1lOworCQkgCXVfaW50NjRfdCB0aW1lX3NvZnRfbGlmZXRpbWU7CisJCSAJdV9pbnQ2NF90IGJ5dGVfaGFyZF9saWZldGltZTsKKwkJIAl1X2ludDY0X3QgYnl0ZV9zb2Z0X2xpZmV0aW1lOworCQl9IGNyaV9wYWNrOwkKKwl9IHU7CisJc3RydWN0IGNyeXB0b2luaSAqY3JpX25leHQ7Cit9OworI2RlZmluZSBjcmlfbWxlbgkJdS5jcmlfYWxnLmNyaV9tbGVuCisjZGVmaW5lIGNyaV9rbGVuCQl1LmNyaV9hbGcuY3JpX2tsZW4KKyNkZWZpbmUgY3JpX2tleQkJCXUuY3JpX2FsZy5jcmlfa2V5CisjZGVmaW5lIGNyaV9pdgkJCXUuY3JpX2FsZy5jcmlfaXYKKyNkZWZpbmUgY3JpcF9iYXNlYWxnCQkJdS5jcmlfcGFjay5iYXNlYWxnCisjZGVmaW5lIGNyaXBfdHVuX3NvdXJjZSAJCXUuY3JpX3BhY2sudHVuX3NvdXJjZQorI2RlZmluZSBjcmlwX3R1bl9kZXN0aW5hdGlvbgl1LmNyaV9wYWNrLnR1bl9kZXN0aW5hdGlvbgorI2RlZmluZSBjcmlwX3R1bl9kZl9tb2RlCQl1LmNyaV9wYWNrLnR1bl9kZl9tb2RlCisjZGVmaW5lIGNyaXBfdHVuX2RzX21vZGUJdS5jcmlfcGFjay50dW5fZHNfbW9kZQorI2RlZmluZSBjcmlwX3R1bl90dGxfdmFsdWUJdS5jcmlfcGFjay50dW5fdHRsX3ZhbHVlCisjZGVmaW5lIGNyaXBfdHVuX3JlcGxheV93aW5kb3dzaXplIHUuY3JpX3BhY2sudHVuX3JlcGxheV93aW5kb3dzaXplCisjZGVmaW5lIGNyaXBfc3BpdmFsdWUgCQl1LmNyaV9wYWNrLnNwaXZhbHVlCisjZGVmaW5lIGNyaXBfcmVwbGF5aW5pdAkJdS5jcmlfcGFjay5yZXBsYXlpbml0CisjZGVmaW5lIGNyaXBfdGltZV9oYXJkX2xpZmV0aW1lIAkgdS5jcmlfcGFjay50aW1lX2hhcmRfbGlmZXRpbWUKKyNkZWZpbmUgY3JpcF90aW1lX3NvZnRfbGlmZXRpbWUgCSB1LmNyaV9wYWNrLnRpbWVfc29mdF9saWZldGltZQorI2RlZmluZSBjcmlwX2J5dGVfaGFyZF9saWZldGltZSAJIHUuY3JpX3BhY2suYnl0ZV9oYXJkX2xpZmV0aW1lCisjZGVmaW5lIGNyaXBfYnl0ZV9zb2Z0X2xpZmV0aW1lIAkgdS5jcmlfcGFjay5ieXRlX3NvZnRfbGlmZXRpbWUKKworLyogRGVzY3JpYmUgYm91bmRhcmllcyBvZiBhIHNpbmdsZSBjcnlwdG8gb3BlcmF0aW9uICovCitzdHJ1Y3QgY3J5cHRvZGVzYyB7CisJaW50CQljcmRfc2tpcDsJLyogSG93IG1hbnkgYnl0ZXMgdG8gaWdub3JlIGZyb20gc3RhcnQgKi8KKwlpbnQJCWNyZF9sZW47CS8qIEhvdyBtYW55IGJ5dGVzIHRvIHByb2Nlc3MgKi8KKwlpbnQJCWNyZF9pbmplY3Q7CS8qIFdoZXJlIHRvIGluamVjdCByZXN1bHRzLCBpZiBhcHBsaWNhYmxlICovCisJaW50CQljcmRfZmxhZ3M7CisKKyNkZWZpbmUgQ1JEX0ZfRU5DUllQVAkJMHgwMQkvKiBTZXQgd2hlbiBkb2luZyBlbmNyeXB0aW9uICovCisjZGVmaW5lIENSRF9GX0lWX1BSRVNFTlQJMHgwMgkvKiBXaGVuIGVuY3J5cHRpbmcsIElWIGlzIGFscmVhZHkgaW4KKwkJCQkJICAgcGxhY2UsIHNvIGRvbid0IGNvcHkuICovCisjZGVmaW5lIENSRF9GX0lWX0VYUExJQ0lUCTB4MDQJLyogSVYgZXhwbGljaXRseSBwcm92aWRlZCAqLworI2RlZmluZSBDUkRfRl9EU0FfU0hBX05FRURFRAkweDA4CS8qIENvbXB1dGUgU0hBLTEgb2YgYnVmZmVyIGZvciBEU0EgKi8KKyNkZWZpbmUgQ1JEX0ZfS0VZX0VYUExJQ0lUCTB4MTAJLyogS2V5IGV4cGxpY2l0bHkgcHJvdmlkZWQgKi8KKyNkZWZpbmUgQ1JEX0ZfQ09NUAkJMHgwZiAgICAvKiBTZXQgd2hlbiBkb2luZyBjb21wcmVzc2lvbiAqLworCisJc3RydWN0IGNyeXB0b2luaQlDUkRfSU5JOyAvKiBJbml0aWFsaXphdGlvbi9jb250ZXh0IGRhdGEgKi8KKyNkZWZpbmUgY3JkX2l2CQlDUkRfSU5JLmNyaV9pdgorI2RlZmluZSBjcmRfa2V5CQlDUkRfSU5JLmNyaV9rZXkKKyNkZWZpbmUgY3JkX2FsZwkJQ1JEX0lOSS5jcmlfYWxnCisjZGVmaW5lIGNyZF9rbGVuCUNSRF9JTkkuY3JpX2tsZW4KKyNkZWZpbmUgY3JkX21sZW4JQ1JEX0lOSS5jcmlfbWxlbgorCisJc3RydWN0IGNyeXB0b2Rlc2MgKmNyZF9uZXh0OworfTsKKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgY29tcGxldGUgb3BlcmF0aW9uICovCitzdHJ1Y3QgY3J5cHRvcCB7CisJc3RydWN0IGxpc3RfaGVhZCBjcnBfbmV4dDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBjcnBfd2FpdHE7CisKKwl1X2ludDY0X3QJY3JwX3NpZDsJLyogU2Vzc2lvbiBJRCAqLworCWludAkJY3JwX2lsZW47CS8qIElucHV0IGRhdGEgdG90YWwgbGVuZ3RoICovCisJaW50CQljcnBfb2xlbjsJLyogUmVzdWx0IHRvdGFsIGxlbmd0aCAqLworCisJaW50CQljcnBfZXR5cGU7CS8qCisJCQkJCSAqIEVycm9yIHR5cGUgKHplcm8gbWVhbnMgbm8gZXJyb3IpLgorCQkJCQkgKiBBbGwgZXJyb3IgY29kZXMgZXhjZXB0IEVBR0FJTgorCQkJCQkgKiBpbmRpY2F0ZSBwb3NzaWJsZSBkYXRhIGNvcnJ1cHRpb24gKGFzIGluLAorCQkJCQkgKiB0aGUgZGF0YSBoYXZlIGJlZW4gdG91Y2hlZCkuIE9uIGFsbAorCQkJCQkgKiBlcnJvcnMsIHRoZSBjcnBfc2lkIG1heSBoYXZlIGNoYW5nZWQKKwkJCQkJICogKHJlc2V0IHRvIGEgbmV3IG9uZSksIHNvIHRoZSBjYWxsZXIKKwkJCQkJICogc2hvdWxkIGFsd2F5cyBjaGVjayBhbmQgdXNlIHRoZSBuZXcKKwkJCQkJICogdmFsdWUgb24gZnV0dXJlIHJlcXVlc3RzLgorCQkJCQkgKi8KKwlpbnQJCWNycF9mbGFnczsKKworI2RlZmluZSBDUllQVE9fRl9TS0JVRgkJMHgwMDAxCS8qIElucHV0L291dHB1dCBhcmUgc2tidWYgY2hhaW5zICovCisjZGVmaW5lIENSWVBUT19GX0lPVgkJMHgwMDAyCS8qIElucHV0L291dHB1dCBhcmUgdWlvICovCisjZGVmaW5lIENSWVBUT19GX1JFTAkJMHgwMDA0CS8qIE11c3QgcmV0dXJuIGRhdGEgaW4gc2FtZSBwbGFjZSAqLworI2RlZmluZSBDUllQVE9fRl9CQVRDSAkJMHgwMDA4CS8qIEJhdGNoIG9wIGlmIHBvc3NpYmxlICovCisjZGVmaW5lIENSWVBUT19GX0NCSU1NCQkweDAwMTAJLyogRG8gY2FsbGJhY2sgaW1tZWRpYXRlbHkgKi8KKyNkZWZpbmUgQ1JZUFRPX0ZfRE9ORQkJMHgwMDIwCS8qIE9wZXJhdGlvbiBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgQ1JZUFRPX0ZfQ0JJRlNZTkMJMHgwMDQwCS8qIERvIENCSU1NIGlmIG9wIGlzIHN5bmNocm9ub3VzICovCisKKwljYWRkcl90CQljcnBfYnVmOwkvKiBEYXRhIHRvIGJlIHByb2Nlc3NlZCAqLworCWNhZGRyX3QJCWNycF9vdXRfYnVmOwkvKiBDcnlwdG8gUmVzdWx0IEJ1ZmZlciAqLworCWNhZGRyX3QJCWNycF9vcGFxdWU7CS8qIE9wYXF1ZSBwb2ludGVyLCBwYXNzZWQgYWxvbmcgKi8KKwlzdHJ1Y3QgY3J5cHRvZGVzYyAqY3JwX2Rlc2M7CS8qIExpbmtlZCBsaXN0IG9mIHByb2Nlc3NpbmcgZGVzY3JpcHRvcnMgKi8KKworCWludCAoKmNycF9jYWxsYmFjaykoc3RydWN0IGNyeXB0b3AgKik7IC8qIENhbGxiYWNrIGZ1bmN0aW9uICovCit9OworZW51bSBjcnlwdG9fcGFja2V0X3JldHVybl9jb2RlIHsKKwkJQ1JZUFRPX09LPTAsCisJCUNSWVBUT19TT0ZUX1RUTCA9IDIsCisgCQlDUllQVE9fSEFSRF9UVEwsCisgCQlDUllQVE9fU0FfSU5BQ1RJVkUsCisgCQlDUllQVE9fUkVQTEFZLAorIAkJQ1JZUFRPX0lDVl9GQUlMLAorIAkJQ1JZUFRPX1NFUV9ST0xMLAorIAkJQ1JZUFRPX01FTV9FUlJPUiwKKyAJCUNSWVBUT19WRVJTX0VSUk9SLAorIAkJQ1JZUFRPX1BST1RfRVJST1IsCisgCQlDUllQVE9fUFlMRF9FUlJPUiwKKyAJCUNSWVBUT19QQURfRVJST1IgCit9OworCitlbnVtIGNyeXB0b19hY2NlbF90eXBlIHsKKyAgICAgICAgICAgICAgICAgIENSWVBUT19QQUNLRVQgID0weDIsICAgIC8qIE9SIHRvZ2V0aGVyIGRlc2lyZWQgYml0cyAqLworICAgICAgICAgICAgICAgICAgQ1JZUFRPX0hBUkRXQVJFPTB4MSwKKyAgICAgICAgICAgICAgICAgIENSWVBUT19TT0ZUV0FSRT0weDAKK307CisKK2VudW0gY3J5cHRvX2ZsYWdzIHsKKyAgICAgICAgICAgICAgICAgIENSWVBUT19FTkNSWVBUPTB4MSwgCS8vIHNhbWUgZm9yIGVuY2FwIChPQ0YgbDIpCisgICAgICAgICAgICAgICAgICBDUllQVE9fREVDUllQVD0weDIsCQkvLyBzYW1lIGZvciBkZWNhcCAoT0NGIGwyKQorICAgICAgICAgICAgICAgICAgQ1JZUFRPX01BQ19HRU49MHg0LAorICAgICAgICAgICAgICAgICAgQ1JZUFRPX01BQ19DSEVDSz0weDA4LAorICAgICAgICAgICAgICAgICAgQ1JZUFRPX0NPTVBSRVNTX1NNQUxMRVI9MHgxMCwKKyAgICAgICAgICAgICAgICAgIENSWVBUT19DT01QUkVTU19CSUdHRVI9MHgyMAorfTsKKworI2RlZmluZSBDUllQVE9fQlVGX0NPTlRJRwkweDAKKyNkZWZpbmUgQ1JZUFRPX0JVRl9JT1YJCTB4MQorI2RlZmluZSBDUllQVE9fQlVGX1NLQlVGCQkweDIKKworI2RlZmluZSBDUllQVE9fT1BfREVDUllQVAkweDAKKyNkZWZpbmUgQ1JZUFRPX09QX0VOQ1JZUFQJMHgxCisKKy8qCisgKiBIaW50cyBwYXNzZWQgdG8gcHJvY2VzcyBtZXRob2RzLgorICovCisjZGVmaW5lIENSWVBUT19ISU5UX01PUkUJMHgxCS8qIG1vcmUgb3BzIGNvbWluZyBzaG9ydGx5ICovCisKK3N0cnVjdCBjcnlwdGtvcCB7CisJc3RydWN0IGxpc3RfaGVhZCBrcnBfbmV4dDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBrcnBfd2FpdHE7CisKKwlpbnQJCWtycF9mbGFnczsKKyNkZWZpbmUgQ1JZUFRPX0tGX0RPTkUJCTB4MDAwMQkvKiBPcGVyYXRpb24gY29tcGxldGVkICovCisjZGVmaW5lIENSWVBUT19LRl9DQklNTQkJMHgwMDAyCS8qIERvIGNhbGxiYWNrIGltbWVkaWF0ZWx5ICovCisKKwl1X2ludAkJa3JwX29wOwkJLyogaWUuIENSS19NT0RfRVhQIG9yIG90aGVyICovCisJdV9pbnQJCWtycF9zdGF0dXM7CS8qIHJldHVybiBzdGF0dXMgKi8KKwl1X3Nob3J0CQlrcnBfaXBhcmFtczsJLyogIyBvZiBpbnB1dCBwYXJhbWV0ZXJzICovCisJdV9zaG9ydAkJa3JwX29wYXJhbXM7CS8qICMgb2Ygb3V0cHV0IHBhcmFtZXRlcnMgKi8KKwl1X2ludAkJa3JwX2NyaWQ7CS8qIGRlc2lyZWQgZGV2aWNlLCBldGMuICovCisJdV9pbnQzMl90CWtycF9oaWQ7CisJc3RydWN0IGNycGFyYW0Ja3JwX3BhcmFtW0NSS19NQVhQQVJBTV07CS8qIGt2bSAqLworCWludAkJKCprcnBfY2FsbGJhY2spKHN0cnVjdCBjcnlwdGtvcCAqKTsKK307CisKKyNpbmNsdWRlIDxvY2YtY29tcGF0Lmg+CisKKy8qCisgKiBTZXNzaW9uIGlkcyBhcmUgNjQgYml0cy4gIFRoZSBsb3dlciAzMiBiaXRzIGNvbnRhaW4gYSAibG9jYWwgaWQiIHdoaWNoCisgKiBpcyBhIGRyaXZlci1wcml2YXRlIHNlc3Npb24gaWRlbnRpZmllci4gIFRoZSB1cHBlciAzMiBiaXRzIGNvbnRhaW4gYQorICogImhhcmR3YXJlIGlkIiB1c2VkIGJ5IHRoZSBjb3JlIGNyeXB0byBjb2RlIHRvIGlkZW50aWZ5IHRoZSBkcml2ZXIgYW5kCisgKiBhIGNvcHkgb2YgdGhlIGRyaXZlcidzIGNhcGFiaWxpdGllcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBjb2RlIHRvCisgKiBvcHRpbWl6ZSBvcGVyYXRpb24uCisgKi8KKyNkZWZpbmUgQ1JZUFRPX1NFU0lEMkhJRChfc2lkKQkoKChfc2lkKSA+PiAzMikgJiAweDAwZmZmZmZmKQorI2RlZmluZSBDUllQVE9fU0VTSUQyQ0FQUyhfc2lkKQkoKChfc2lkKSA+PiAzMikgJiAweGZmMDAwMDAwKQorI2RlZmluZSBDUllQVE9fU0VTSUQyTElEKF9zaWQpCSgoKHVfaW50MzJfdCkgKF9zaWQpKSAmIDB4ZmZmZmZmZmYpCisKK2V4dGVybglpbnQgY3J5cHRvX25ld3Nlc3Npb24odV9pbnQ2NF90ICpzaWQsIHN0cnVjdCBjcnlwdG9pbmkgKmNyaSwgaW50IGhhcmQpOworZXh0ZXJuCWludCBjcnlwdG9fZnJlZXNlc3Npb24odV9pbnQ2NF90IHNpZCk7CisjZGVmaW5lIENSWVBUT0NBUF9GX0hBUkRXQVJFCUNSWVBUT19GTEFHX0hBUkRXQVJFCisjZGVmaW5lIENSWVBUT0NBUF9GX1NPRlRXQVJFCUNSWVBUT19GTEFHX1NPRlRXQVJFCisjZGVmaW5lIENSWVBUT0NBUF9GX1NZTkMJMHgwNDAwMDAwMAkvKiBvcGVyYXRlcyBzeW5jaHJvbm91c2x5ICovCitleHRlcm4JaW50MzJfdCBjcnlwdG9fZ2V0X2RyaXZlcmlkKGRldmljZV90IGRldiwgaW50IGZsYWdzKTsKK2V4dGVybglpbnQgY3J5cHRvX2ZpbmRfZHJpdmVyKGNvbnN0IGNoYXIgKik7CitleHRlcm4JZGV2aWNlX3QgY3J5cHRvX2ZpbmRfZGV2aWNlX2J5aGlkKGludCBoaWQpOworZXh0ZXJuCWludCBjcnlwdG9fZ2V0Y2FwcyhpbnQgaGlkKTsKK2V4dGVybglpbnQgY3J5cHRvX3JlZ2lzdGVyKHVfaW50MzJfdCBkcml2ZXJpZCwgaW50IGFsZywgdV9pbnQxNl90IG1heG9wbGVuLAorCSAgICB1X2ludDMyX3QgZmxhZ3MpOworZXh0ZXJuCWludCBjcnlwdG9fa3JlZ2lzdGVyKHVfaW50MzJfdCwgaW50LCB1X2ludDMyX3QpOworZXh0ZXJuCWludCBjcnlwdG9fdW5yZWdpc3Rlcih1X2ludDMyX3QgZHJpdmVyaWQsIGludCBhbGcpOworZXh0ZXJuCWludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGwodV9pbnQzMl90IGRyaXZlcmlkKTsKK2V4dGVybglpbnQgY3J5cHRvX2Rpc3BhdGNoKHN0cnVjdCBjcnlwdG9wICpjcnApOworZXh0ZXJuCWludCBjcnlwdG9fa2Rpc3BhdGNoKHN0cnVjdCBjcnlwdGtvcCAqKTsKKyNkZWZpbmUgQ1JZUFRPX1NZTVEJMHgxCisjZGVmaW5lIENSWVBUT19BU1lNUQkweDIKK2V4dGVybglpbnQgY3J5cHRvX3VuYmxvY2sodV9pbnQzMl90LCBpbnQpOworZXh0ZXJuCXZvaWQgY3J5cHRvX2RvbmUoc3RydWN0IGNyeXB0b3AgKmNycCk7CitleHRlcm4Jdm9pZCBjcnlwdG9fa2RvbmUoc3RydWN0IGNyeXB0a29wICopOworZXh0ZXJuCWludCBjcnlwdG9fZ2V0ZmVhdChpbnQgKik7CisKK2V4dGVybgl2b2lkIGNyeXB0b19mcmVlcmVxKHN0cnVjdCBjcnlwdG9wICpjcnApOworZXh0ZXJuCXN0cnVjdCBjcnlwdG9wICpjcnlwdG9fZ2V0cmVxKGludCBudW0pOworCitleHRlcm4gIGludCBjcnlwdG9fdXNlcmNyeXB0bzsgICAgICAvKiB1c2VybGFuZCBtYXkgZG8gY3J5cHRvIHJlcXVlc3RzICovCitleHRlcm4gIGludCBjcnlwdG9fdXNlcmFzeW1jcnlwdG87ICAvKiB1c2VybGFuZCBtYXkgZG8gYXN5bSBjcnlwdG8gcmVxcyAqLworZXh0ZXJuICBpbnQgY3J5cHRvX2RldmFsbG93c29mdDsgICAgLyogb25seSB1c2UgaGFyZHdhcmUgY3J5cHRvICovCisKKy8qCisgKiByYW5kb20gbnVtYmVyIHN1cHBvcnQsICBjcnlwdG9fdW5yZWdpc3Rlcl9hbGwgd2lsbCB1bnJlZ2lzdGVyCisgKi8KK2V4dGVybiBpbnQgY3J5cHRvX3JyZWdpc3Rlcih1X2ludDMyX3QgZHJpdmVyaWQsCisJCWludCAoKnJlYWRfcmFuZG9tKSh2b2lkICphcmcsIHVfaW50MzJfdCAqYnVmLCBpbnQgbGVuKSwgdm9pZCAqYXJnKTsKK2V4dGVybiBpbnQgY3J5cHRvX3J1bnJlZ2lzdGVyX2FsbCh1X2ludDMyX3QgZHJpdmVyaWQpOworCisvKgorICogQ3J5cHRvLXJlbGF0ZWQgdXRpbGl0eSByb3V0aW5lcyB1c2VkIG1haW5seSBieSBkcml2ZXJzLgorICoKKyAqIFhYWCB0aGVzZSBkb24ndCByZWFsbHkgYmVsb25nIGhlcmU7IGJ1dCBmb3Igbm93IHRoZXkncmUKKyAqICAgICBrZXB0IGFwYXJ0IGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KKyAqLworc3RydWN0IHVpbzsKK2V4dGVybgl2b2lkIGN1aW9fY29weWRhdGEoc3RydWN0IHVpbyogdWlvLCBpbnQgb2ZmLCBpbnQgbGVuLCBjYWRkcl90IGNwKTsKK2V4dGVybgl2b2lkIGN1aW9fY29weWJhY2soc3RydWN0IHVpbyogdWlvLCBpbnQgb2ZmLCBpbnQgbGVuLCBjYWRkcl90IGNwKTsKK2V4dGVybglzdHJ1Y3QgaW92ZWMgKmN1aW9fZ2V0cHRyKHN0cnVjdCB1aW8gKnVpbywgaW50IGxvYywgaW50ICpvZmYpOworCitleHRlcm4Jdm9pZCBjcnlwdG9fY29weWJhY2soaW50IGZsYWdzLCBjYWRkcl90IGJ1ZiwgaW50IG9mZiwgaW50IHNpemUsCisJICAgIGNhZGRyX3QgaW4pOworZXh0ZXJuCXZvaWQgY3J5cHRvX2NvcHlkYXRhKGludCBmbGFncywgY2FkZHJfdCBidWYsIGludCBvZmYsIGludCBzaXplLAorCSAgICBjYWRkcl90IG91dCk7CitleHRlcm4JaW50IGNyeXB0b19hcHBseShpbnQgZmxhZ3MsIGNhZGRyX3QgYnVmLCBpbnQgb2ZmLCBpbnQgbGVuLAorCSAgICBpbnQgKCpmKSh2b2lkICosIHZvaWQgKiwgdV9pbnQpLCB2b2lkICphcmcpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9DUllQVE9fQ1JZUFRPX0hfICovCmRpZmYgLS1naXQgYS9jcnlwdG8vb2NmL2NyeXB0b3NvZnQuYyBiL2NyeXB0by9vY2YvY3J5cHRvc29mdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMjM4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vb2NmL2NyeXB0b3NvZnQuYwpAQCAtMCwwICsxLDEzMjIgQEAKKy8qCisgKiBBbiBPQ0YgbW9kdWxlIHRoYXQgdXNlcyB0aGUgbGludXgga2VybmVsIGNyeXB0b2FwaSwgYmFzZWQgb24gdGhlCisgKiBvcmlnaW5hbCBjcnlwdG9zb2Z0IGZvciBCU0QgYnkgQW5nZWxvcyBELiBLZXJvbXl0aXMgKGFuZ2Vsb3NAY2lzLnVwZW5uLmVkdSkKKyAqIGJ1dCBpcyBtb3N0bHkgdW5yZWNvZ25pc2FibGUsCisgKgorICogV3JpdHRlbiBieSBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZF9tY2N1bGxvdWdoQG1jYWZlZS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMSBEYXZpZCBNY0N1bGxvdWdoCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBMSUNFTlNFIFRFUk1TCisgKgorICogVGhlIGZyZWUgZGlzdHJpYnV0aW9uIGFuZCB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBpbiBib3RoIHNvdXJjZSBhbmQgYmluYXJ5CisgKiBmb3JtIGlzIGFsbG93ZWQgKHdpdGggb3Igd2l0aG91dCBjaGFuZ2VzKSBwcm92aWRlZCB0aGF0OgorICoKKyAqICAgMS4gZGlzdHJpYnV0aW9ucyBvZiB0aGlzIHNvdXJjZSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXI7CisgKgorICogICAyLiBkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqICAgICAgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIGFzc29jaWF0ZWQgbWF0ZXJpYWxzOworICoKKyAqICAgMy4gdGhlIGNvcHlyaWdodCBob2xkZXIncyBuYW1lIGlzIG5vdCB1c2VkIHRvIGVuZG9yc2UgcHJvZHVjdHMKKyAqICAgICAgYnVpbHQgdXNpbmcgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHJldGFpbmVkIGluIGZ1bGwsIHRoaXMgcHJvZHVjdAorICogbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksCisgKiBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXBwbHkgSU5TVEVBRCBPRiB0aG9zZSBnaXZlbiBhYm92ZS4KKyAqCisgKiBESVNDTEFJTUVSCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMgaXMnIHdpdGggbm8gZXhwbGljaXQgb3IgaW1wbGllZCB3YXJyYW50aWVzCisgKiBpbiByZXNwZWN0IG9mIGl0cyBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgY29ycmVjdG5lc3MKKyAqIGFuZC9vciBmaXRuZXNzIGZvciBwdXJwb3NlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMzgpICYmICFkZWZpbmVkKEFVVE9DT05GX0lOQ0xVREVEKQorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjkpCisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Y3J5cHRvZGV2Lmg+CisjaW5jbHVkZSA8dWlvLmg+CisKK3N0cnVjdCB7CisJc29mdGNfZGV2aWNlX2RlY2wJc2NfZGV2OworfSBzd2NyX3NvZnRjOworCisjZGVmaW5lIG9mZnNldF9pbl9wYWdlKHApICgodW5zaWduZWQgbG9uZykocCkgJiB+UEFHRV9NQVNLKQorCisjZGVmaW5lIFNXX1RZUEVfQ0lQSEVSCQkweDAxCisjZGVmaW5lIFNXX1RZUEVfSE1BQwkJMHgwMgorI2RlZmluZSBTV19UWVBFX0hBU0gJCTB4MDQKKyNkZWZpbmUgU1dfVFlQRV9DT01QCQkweDA4CisjZGVmaW5lIFNXX1RZUEVfQkxLQ0lQSEVSCTB4MTAKKyNkZWZpbmUgU1dfVFlQRV9BTEdfTUFTSwkweDFmCisKKyNkZWZpbmUgU1dfVFlQRV9BU1lOQwkJMHg4MDAwCisKKyNkZWZpbmUgU1dfVFlQRV9JTlVTRQkJMHgxMDAwMDAwMAorCisvKiBXZSBjaGFuZ2Ugc29tZSBvZiB0aGUgYWJvdmUgaWYgd2UgaGF2ZSBhbiBhc3luYyBpbnRlcmZhY2UgKi8KKworI2RlZmluZSBTV19UWVBFX0FMR19BTUFTSwkoU1dfVFlQRV9BTEdfTUFTSyB8IFNXX1RZUEVfQVNZTkMpCisKKyNkZWZpbmUgU1dfVFlQRV9BQkxLQ0lQSEVSCShTV19UWVBFX0JMS0NJUEhFUiB8IFNXX1RZUEVfQVNZTkMpCisjZGVmaW5lIFNXX1RZUEVfQUhBU0gJCShTV19UWVBFX0hBU0ggfCBTV19UWVBFX0FTWU5DKQorI2RlZmluZSBTV19UWVBFX0FITUFDCQkoU1dfVFlQRV9ITUFDIHwgU1dfVFlQRV9BU1lOQykKKworI2RlZmluZSBTQ0FUVEVSTElTVF9NQVggMTYKKworc3RydWN0IHN3Y3JfZGF0YSB7CisJc3RydWN0IHdvcmtfc3RydWN0ICB3b3JrcTsKKwlpbnQJCQkJCXN3X3R5cGU7CisJaW50CQkJCQlzd19hbGc7CisJc3RydWN0IGNyeXB0b190Zm0JKnN3X3RmbTsKKwlzcGlubG9ja190CQkJc3dfdGZtX2xvY2s7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJY2hhciAqc3dfa2V5OworCQkJaW50ICBzd19rbGVuOworCQkJaW50ICBzd19tbGVuOworCQl9IGhtYWM7CisJCXZvaWQgKnN3X2NvbXBfYnVmOworCX0gdTsKKwlzdHJ1Y3Qgc3djcl9kYXRhCSpzd19uZXh0OworfTsKKworc3RydWN0IHN3Y3JfcmVxIHsKKwlzdHJ1Y3Qgc3djcl9kYXRhCSpzd19oZWFkOworCXN0cnVjdCBzd2NyX2RhdGEJKnN3OworCXN0cnVjdCBjcnlwdG9wCQkqY3JwOworCXN0cnVjdCBjcnlwdG9kZXNjCSpjcmQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0CSBzZ1tTQ0FUVEVSTElTVF9NQVhdOworCXVuc2lnbmVkIGNoYXIJCSBpdltFQUxHX01BWF9CTE9DS19MRU5dOworCWNoYXIJCQkJIHJlc3VsdFtIQVNIX01BWF9MRU5dOworCXZvaWQJCQkJKmNyeXB0b19yZXE7Cit9OworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorc3RhdGljIGttZW1fY2FjaGVfdCAqc3djcl9yZXFfY2FjaGU7CisjZWxzZQorc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzd2NyX3JlcV9jYWNoZTsKKyNlbmRpZgorCisjaWZuZGVmIENSWVBUT19URk1fTU9ERV9DQkMKKy8qCisgKiBBcyBvZiBsaW51eC0yLjYuMjEgdGhpcyBpcyBubyBsb25nZXIgZGVmaW5lZCwgYW5kIHByZXN1bWFibHkgbm8gbG9uZ2VyCisgKiBuZWVkZWQgdG8gYmUgcGFzc2VkIGludG8gdGhlIGNyeXB0byBjb3JlIGNvZGUuCisgKi8KKyNkZWZpbmUJQ1JZUFRPX1RGTV9NT0RFX0NCQwkwCisjZGVmaW5lCUNSWVBUT19URk1fTU9ERV9FQ0IJMAorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTkpCisJLyoKKwkgKiBMaW51eCAyLjYuMTkgaW50cm9kdWNlZCBhIG5ldyBDcnlwdG8gQVBJLCBzZXR1cCBtYWNybydzIHRvIGNvbnZlcnQgbmV3CisJICogQVBJIGludG8gb2xkIEFQSS4KKwkgKi8KKworCS8qIFN5bW1ldHJpYy9CbG9jayBDaXBoZXIgKi8KKwlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MKKwl7CisJCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CisJCXZvaWQgKmluZm87CisJfTsKKwkjZGVmaW5lIGVjYihYKQkJCQkJCQkJI1ggLCBDUllQVE9fVEZNX01PREVfRUNCCisJI2RlZmluZSBjYmMoWCkJCQkJCQkJCSNYICwgQ1JZUFRPX1RGTV9NT0RFX0NCQworCSNkZWZpbmUgY3J5cHRvX2hhc19ibGtjaXBoZXIoWCwgWSwgWikJCWNyeXB0b19hbGdfYXZhaWxhYmxlKFgsIDApCisJI2RlZmluZSBjcnlwdG9fYmxrY2lwaGVyX2Nhc3QoWCkJCQlYCisJI2RlZmluZSBjcnlwdG9fYmxrY2lwaGVyX3RmbShYKQkJCQlYCisJI2RlZmluZSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKFgsIFksIFopCQljcnlwdG9fYWxsb2NfdGZtKFgsIG1vZGUpCisJI2RlZmluZSBjcnlwdG9fYmxrY2lwaGVyX2l2c2l6ZShYKQkJCWNyeXB0b190Zm1fYWxnX2l2c2l6ZShYKQorCSNkZWZpbmUgY3J5cHRvX2Jsa2NpcGhlcl9ibG9ja3NpemUoWCkJCWNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShYKQorCSNkZWZpbmUgY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoWCwgWSwgWikJY3J5cHRvX2NpcGhlcl9zZXRrZXkoWCwgWSwgWikKKwkjZGVmaW5lIGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdF9pdihXLCBYLCBZLCBaKQlcCisJCQkJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X2l2KChXKS0+dGZtLCBYLCBZLCBaLCAodTggKikoKFcpLT5pbmZvKSkKKwkjZGVmaW5lIGNyeXB0b19ibGtjaXBoZXJfZGVjcnlwdF9pdihXLCBYLCBZLCBaKQlcCisJCQkJY3J5cHRvX2NpcGhlcl9kZWNyeXB0X2l2KChXKS0+dGZtLCBYLCBZLCBaLCAodTggKikoKFcpLT5pbmZvKSkKKwkjZGVmaW5lIGNyeXB0b19ibGtjaXBoZXJfc2V0X2ZsYWdzKHgsIHkpCS8qIG5vcCAqLworCSNkZWZpbmUgY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHgpCQkJY3J5cHRvX2ZyZWVfdGZtKHgpCisJI2RlZmluZSBjcnlwdG9fZnJlZV9jb21wCQkJCQljcnlwdG9fZnJlZV90Zm0KKwkjZGVmaW5lIGNyeXB0b19mcmVlX2hhc2gJCQkJCWNyeXB0b19mcmVlX3RmbQorCisJLyogSGFzaC9ITUFDL0RpZ2VzdCAqLworCXN0cnVjdCBoYXNoX2Rlc2MKKwl7CisJCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CisJfTsKKwkjZGVmaW5lIGhtYWMoWCkJCQkJCQkJI1ggLCAwCisJI2RlZmluZSBjcnlwdG9faGFzX2hhc2goWCwgWSwgWikJCWNyeXB0b19hbGdfYXZhaWxhYmxlKFgsIDApCisJI2RlZmluZSBjcnlwdG9faGFzaF9jYXN0KFgpCQkJCVgKKwkjZGVmaW5lIGNyeXB0b19oYXNoX3RmbShYKQkJCQlYCisJI2RlZmluZSBjcnlwdG9fYWxsb2NfaGFzaChYLCBZLCBaKQkJY3J5cHRvX2FsbG9jX3RmbShYLCBtb2RlKQorCSNkZWZpbmUgY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZShYKQkJY3J5cHRvX3RmbV9hbGdfZGlnZXN0c2l6ZShYKQorCSNkZWZpbmUgY3J5cHRvX2hhc2hfZGlnZXN0KFcsIFgsIFksIFopCVwKKwkJCQljcnlwdG9fZGlnZXN0X2RpZ2VzdCgoVyktPnRmbSwgWCwgc2dfbnVtLCBaKQorCisJLyogQXN5bW1ldHJpYyBDaXBoZXIgKi8KKwkjZGVmaW5lIGNyeXB0b19oYXNfY2lwaGVyKFgsIFksIFopCQljcnlwdG9fYWxnX2F2YWlsYWJsZShYLCAwKQorCisJLyogQ29tcHJlc3Npb24gKi8KKwkjZGVmaW5lIGNyeXB0b19oYXNfY29tcChYLCBZLCBaKQkJY3J5cHRvX2FsZ19hdmFpbGFibGUoWCwgMCkKKwkjZGVmaW5lIGNyeXB0b19jb21wX3RmbShYKQkJCQlYCisJI2RlZmluZSBjcnlwdG9fY29tcF9jYXN0KFgpCQkJCVgKKwkjZGVmaW5lIGNyeXB0b19hbGxvY19jb21wKFgsIFksIFopCQljcnlwdG9fYWxsb2NfdGZtKFgsIG1vZGUpCisJI2RlZmluZSBwbGFpbihYKQkjWCAsIDAKKyNlbHNlCisJI2RlZmluZSBlY2IoWCkJImVjYigiICNYICIpIiAsIDAKKwkjZGVmaW5lIGNiYyhYKQkiY2JjKCIgI1ggIikiICwgMAorCSNkZWZpbmUgaG1hYyhYKQkiaG1hYygiICNYICIpIiAsIDAKKwkjZGVmaW5lIHBsYWluKFgpCSNYICwgMAorI2VuZGlmIC8qIGlmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkgKi8KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMikKKy8qIG5vIGFibGtjaXBoZXIgaW4gb2xkZXIga2VybmVscyAqLworI2RlZmluZSBjcnlwdG9fYWxsb2NfYWJsa2NpcGhlcihhLGIsYykJCShOVUxMKQorI2RlZmluZSBjcnlwdG9fYWJsa2NpcGhlcl90Zm0oeCkJCQkoKHN0cnVjdCBjcnlwdG9fdGZtICopKHgpKQorI2RlZmluZSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRfZmxhZ3MoYSwgYikJLyogbm9wICovCisjZGVmaW5lIGNyeXB0b19hYmxrY2lwaGVyX3NldGtleSh4LCB5LCB6KQkoLUVJTlZBTCkKKyNkZWZpbmUJY3J5cHRvX2hhc19hYmxrY2lwaGVyKGEsYixjKQkJKDApCisjZWxzZQorI2RlZmluZQlIQVZFX0FCTEtDSVBIRVIKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDMyKQorLyogbm8gYWhhc2ggaW4gb2xkZXIga2VybmVscyAqLworI2RlZmluZSBjcnlwdG9fYWhhc2hfdGZtKHgpCQkJCQkoKHN0cnVjdCBjcnlwdG9fdGZtICopKHgpKQorI2RlZmluZQljcnlwdG9fYWxsb2NfYWhhc2goYSxiLGMpCQkJKE5VTEwpCisjZGVmaW5lCWNyeXB0b19haGFzaF9kaWdlc3RzaXplKHgpCQkJMAorI2Vsc2UKKyNkZWZpbmUJSEFWRV9BSEFTSAorI2VuZGlmCisKK3N0cnVjdCBjcnlwdG9fZGV0YWlscyB7CisJY2hhciAqYWxnX25hbWU7CisJaW50IG1vZGU7CisJaW50IHN3X3R5cGU7Cit9OworCitzdGF0aWMgc3RydWN0IGNyeXB0b19kZXRhaWxzIGNyeXB0b19kZXRhaWxzW10gPSB7CisJW0NSWVBUT19ERVNfQ0JDXSAgICAgICAgID0geyBjYmMoZGVzKSwgICAgICAgICAgU1dfVFlQRV9CTEtDSVBIRVIsIH0sCisJW0NSWVBUT18zREVTX0NCQ10gICAgICAgID0geyBjYmMoZGVzM19lZGUpLCAgICAgU1dfVFlQRV9CTEtDSVBIRVIsIH0sCisJW0NSWVBUT19CTEZfQ0JDXSAgICAgICAgID0geyBjYmMoYmxvd2Zpc2gpLCAgICAgU1dfVFlQRV9CTEtDSVBIRVIsIH0sCisJW0NSWVBUT19DQVNUX0NCQ10gICAgICAgID0geyBjYmMoY2FzdDUpLCAgICAgICAgU1dfVFlQRV9CTEtDSVBIRVIsIH0sCisJW0NSWVBUT19TS0lQSkFDS19DQkNdICAgID0geyBjYmMoc2tpcGphY2spLCAgICAgU1dfVFlQRV9CTEtDSVBIRVIsIH0sCisJW0NSWVBUT19NRDVfSE1BQ10gICAgICAgID0geyBobWFjKG1kNSksICAgICAgICAgU1dfVFlQRV9ITUFDLCB9LAorCVtDUllQVE9fU0hBMV9ITUFDXSAgICAgICA9IHsgaG1hYyhzaGExKSwgICAgICAgIFNXX1RZUEVfSE1BQywgfSwKKwlbQ1JZUFRPX1JJUEVNRDE2MF9ITUFDXSAgPSB7IGhtYWMocmlwZW1kMTYwKSwgICBTV19UWVBFX0hNQUMsIH0sCisJW0NSWVBUT19NRDVfS1BES10gICAgICAgID0geyBwbGFpbihtZDUta3BkayksICAgU1dfVFlQRV9IQVNILCB9LAorCVtDUllQVE9fU0hBMV9LUERLXSAgICAgICA9IHsgcGxhaW4oc2hhMS1rcGRrKSwgIFNXX1RZUEVfSEFTSCwgfSwKKwlbQ1JZUFRPX0FFU19DQkNdICAgICAgICAgPSB7IGNiYyhhZXMpLCAgICAgICAgICBTV19UWVBFX0JMS0NJUEhFUiwgfSwKKwlbQ1JZUFRPX0FSQzRdICAgICAgICAgICAgPSB7IGVjYihhcmM0KSwgICAgICAgICBTV19UWVBFX0JMS0NJUEhFUiwgfSwKKwlbQ1JZUFRPX01ENV0gICAgICAgICAgICAgPSB7IHBsYWluKG1kNSksICAgICAgICBTV19UWVBFX0hBU0gsIH0sCisJW0NSWVBUT19TSEExXSAgICAgICAgICAgID0geyBwbGFpbihzaGExKSwgICAgICAgU1dfVFlQRV9IQVNILCB9LAorCVtDUllQVE9fTlVMTF9ITUFDXSAgICAgICA9IHsgaG1hYyhkaWdlc3RfbnVsbCksIFNXX1RZUEVfSE1BQywgfSwKKwlbQ1JZUFRPX05VTExfQ0JDXSAgICAgICAgPSB7IGNiYyhjaXBoZXJfbnVsbCksICBTV19UWVBFX0JMS0NJUEhFUiwgfSwKKwlbQ1JZUFRPX0RFRkxBVEVfQ09NUF0gICAgPSB7IHBsYWluKGRlZmxhdGUpLCAgICBTV19UWVBFX0NPTVAsIH0sCisJW0NSWVBUT19TSEEyXzI1Nl9ITUFDXSAgID0geyBobWFjKHNoYTI1NiksICAgICAgU1dfVFlQRV9ITUFDLCB9LAorCVtDUllQVE9fU0hBMl8zODRfSE1BQ10gICA9IHsgaG1hYyhzaGEzODQpLCAgICAgIFNXX1RZUEVfSE1BQywgfSwKKwlbQ1JZUFRPX1NIQTJfNTEyX0hNQUNdICAgPSB7IGhtYWMoc2hhNTEyKSwgICAgICBTV19UWVBFX0hNQUMsIH0sCisJW0NSWVBUT19DQU1FTExJQV9DQkNdICAgID0geyBjYmMoY2FtZWxsaWEpLCAgICAgU1dfVFlQRV9CTEtDSVBIRVIsIH0sCisJW0NSWVBUT19TSEEyXzI1Nl0gICAgICAgID0geyBwbGFpbihzaGEyNTYpLCAgICAgU1dfVFlQRV9IQVNILCB9LAorCVtDUllQVE9fU0hBMl8zODRdICAgICAgICA9IHsgcGxhaW4oc2hhMzg0KSwgICAgIFNXX1RZUEVfSEFTSCwgfSwKKwlbQ1JZUFRPX1NIQTJfNTEyXSAgICAgICAgPSB7IHBsYWluKHNoYTUxMiksICAgICBTV19UWVBFX0hBU0gsIH0sCisJW0NSWVBUT19SSVBFTUQxNjBdICAgICAgID0geyBwbGFpbihyaXBlbWQxNjApLCAgU1dfVFlQRV9IQVNILCB9LAorfTsKKworaW50MzJfdCBzd2NyX2lkID0gLTE7Cittb2R1bGVfcGFyYW0oc3djcl9pZCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3djcl9pZCwgIlJlYWQtT25seSBPQ0YgSUQgZm9yIGNyeXB0b3NvZnQgZHJpdmVyIik7CisKK2ludCBzd2NyX2ZhaWxfaWZfY29tcHJlc3Npb25fZ3Jvd3MgPSAxOworbW9kdWxlX3BhcmFtKHN3Y3JfZmFpbF9pZl9jb21wcmVzc2lvbl9ncm93cywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3djcl9mYWlsX2lmX2NvbXByZXNzaW9uX2dyb3dzLAorICAgICAgICAgICAgICAgICJUcmVhdCBjb21wcmVzc2lvbiB0aGF0IHJlc3VsdHMgaW4gbW9yZSBkYXRhIGFzIGEgZmFpbHVyZSIpOworCitpbnQgc3djcl9ub19haGFzaCA9IDA7Cittb2R1bGVfcGFyYW0oc3djcl9ub19haGFzaCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3djcl9ub19haGFzaCwKKyAgICAgICAgICAgICAgICAiRG8gbm90IHVzZSBhc3luYyBoYXNoL2htYWMgZXZlbiBpZiBhdmFpbGFibGUiKTsKKworaW50IHN3Y3Jfbm9fYWJsayA9IDA7Cittb2R1bGVfcGFyYW0oc3djcl9ub19hYmxrLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhzd2NyX25vX2FibGssCisgICAgICAgICAgICAgICAgIkRvIG5vdCB1c2UgYXN5bmMgYmxrIGNpcGhlcnMgZXZlbiBpZiBhdmFpbGFibGUiKTsKKworc3RhdGljIHN0cnVjdCBzd2NyX2RhdGEgKipzd2NyX3Nlc3Npb25zID0gTlVMTDsKK3N0YXRpYyB1X2ludDMyX3Qgc3djcl9zZXNudW0gPSAwOworCitzdGF0aWMJaW50IHN3Y3JfcHJvY2VzcyhkZXZpY2VfdCwgc3RydWN0IGNyeXB0b3AgKiwgaW50KTsKK3N0YXRpYwlpbnQgc3djcl9uZXdzZXNzaW9uKGRldmljZV90LCB1X2ludDMyX3QgKiwgc3RydWN0IGNyeXB0b2luaSAqKTsKK3N0YXRpYwlpbnQgc3djcl9mcmVlc2Vzc2lvbihkZXZpY2VfdCwgdV9pbnQ2NF90KTsKKworc3RhdGljIGRldmljZV9tZXRob2RfdCBzd2NyX21ldGhvZHMgPSB7CisJLyogY3J5cHRvIGRldmljZSBtZXRob2RzICovCisJREVWTUVUSE9EKGNyeXB0b2Rldl9uZXdzZXNzaW9uLAlzd2NyX25ld3Nlc3Npb24pLAorCURFVk1FVEhPRChjcnlwdG9kZXZfZnJlZXNlc3Npb24sc3djcl9mcmVlc2Vzc2lvbiksCisJREVWTUVUSE9EKGNyeXB0b2Rldl9wcm9jZXNzLAlzd2NyX3Byb2Nlc3MpLAorfTsKKworI2RlZmluZSBkZWJ1ZyBzd2NyX2RlYnVnCitpbnQgc3djcl9kZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oc3djcl9kZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc3djcl9kZWJ1ZywgIkVuYWJsZSBkZWJ1ZyIpOworCitzdGF0aWMgdm9pZCBzd2NyX3Byb2Nlc3NfcmVxKHN0cnVjdCBzd2NyX3JlcSAqcmVxKTsKKworLyoKKyAqIHNvbWV0aGluZ3MganVzdCBuZWVkIHRvIGJlIHJ1biB3aXRoIHVzZXIgY29udGV4dCBubyBtYXR0ZXIgd2hldGhlcgorICogdGhlIGtlcm5lbCBjb21wcmVzc2lvbiBsaWJzIHVzZSB2bWFsbG9jL3ZmcmVlIGZvciBleGFtcGxlLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3E7CisJdm9pZAkoKmZ1bmMpKHZvaWQgKmFyZyk7CisJdm9pZAkqYXJnOworfSBleGVjdXRlX2xhdGVyX3Q7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorc3RhdGljIHZvaWQKK2RvaW5nX2l0X25vdyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndxKQoreworCWV4ZWN1dGVfbGF0ZXJfdCAqdyA9IGNvbnRhaW5lcl9vZih3cSwgZXhlY3V0ZV9sYXRlcl90LCB3cSk7CisJKHctPmZ1bmMpKHctPmFyZyk7CisJa2ZyZWUodyk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQKK2RvaW5nX2l0X25vdyh2b2lkICphcmcpCit7CisJZXhlY3V0ZV9sYXRlcl90ICp3ID0gKGV4ZWN1dGVfbGF0ZXJfdCAqKSBhcmc7CisJKHctPmZ1bmMpKHctPmFyZyk7CisJa2ZyZWUodyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2V4ZWN1dGVfbGF0ZXIodm9pZCAoZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKK3sKKwlleGVjdXRlX2xhdGVyX3QgKnc7CisKKwl3ID0gKGV4ZWN1dGVfbGF0ZXJfdCAqKSBrbWFsbG9jKHNpemVvZihleGVjdXRlX2xhdGVyX3QpLCBTTEFCX0FUT01JQyk7CisJaWYgKHcpIHsKKwkJbWVtc2V0KHcsICdcMCcsIHNpemVvZih3KSk7CisJCXctPmZ1bmMgPSBmbjsKKwkJdy0+YXJnID0gYXJnOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJCUlOSVRfV09SSygmdy0+d3EsIGRvaW5nX2l0X25vdyk7CisjZWxzZQorCQlJTklUX1dPUksoJnctPndxLCBkb2luZ19pdF9ub3csIHcpOworI2VuZGlmCisJCXNjaGVkdWxlX3dvcmsoJnctPndxKTsKKwl9Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBhIG5ldyBzb2Z0d2FyZSBzZXNzaW9uLgorICovCitzdGF0aWMgaW50Citzd2NyX25ld3Nlc3Npb24oZGV2aWNlX3QgZGV2LCB1X2ludDMyX3QgKnNpZCwgc3RydWN0IGNyeXB0b2luaSAqY3JpKQoreworCXN0cnVjdCBzd2NyX2RhdGEgKipzd2Q7CisJdV9pbnQzMl90IGk7CisJaW50IGVycm9yOworCWNoYXIgKmFsZ287CisJaW50IG1vZGU7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWlmIChzaWQgPT0gTlVMTCB8fCBjcmkgPT0gTlVMTCkgeworCQlkcHJpbnRrKCIlcywlZCAtIEVJTlZBTFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlpZiAoc3djcl9zZXNzaW9ucykgeworCQlmb3IgKGkgPSAxOyBpIDwgc3djcl9zZXNudW07IGkrKykKKwkJCWlmIChzd2NyX3Nlc3Npb25zW2ldID09IE5VTEwpCisJCQkJYnJlYWs7CisJfSBlbHNlCisJCWkgPSAxOwkJLyogTkI6IHRvIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZyAqLworCisJaWYgKHN3Y3Jfc2Vzc2lvbnMgPT0gTlVMTCB8fCBpID09IHN3Y3Jfc2VzbnVtKSB7CisJCWlmIChzd2NyX3Nlc3Npb25zID09IE5VTEwpIHsKKwkJCWkgPSAxOyAvKiBXZSBsZWF2ZSBzd2NyX3Nlc3Npb25zWzBdIGVtcHR5ICovCisJCQlzd2NyX3Nlc251bSA9IENSWVBUT19TV19TRVNTSU9OUzsKKwkJfSBlbHNlCisJCQlzd2NyX3Nlc251bSAqPSAyOworCisJCXN3ZCA9IGttYWxsb2Moc3djcl9zZXNudW0gKiBzaXplb2Yoc3RydWN0IHN3Y3JfZGF0YSAqKSwgU0xBQl9BVE9NSUMpOworCQlpZiAoc3dkID09IE5VTEwpIHsKKwkJCS8qIFJlc2V0IHNlc3Npb24gbnVtYmVyICovCisJCQlpZiAoc3djcl9zZXNudW0gPT0gQ1JZUFRPX1NXX1NFU1NJT05TKQorCQkJCXN3Y3Jfc2VzbnVtID0gMDsKKwkJCWVsc2UKKwkJCQlzd2NyX3Nlc251bSAvPSAyOworCQkJZHByaW50aygiJXMsJWQ6IEVOT0JVRlNcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gRU5PQlVGUzsKKwkJfQorCQltZW1zZXQoc3dkLCAwLCBzd2NyX3Nlc251bSAqIHNpemVvZihzdHJ1Y3Qgc3djcl9kYXRhICopKTsKKworCQkvKiBDb3B5IGV4aXN0aW5nIHNlc3Npb25zICovCisJCWlmIChzd2NyX3Nlc3Npb25zKSB7CisJCQltZW1jcHkoc3dkLCBzd2NyX3Nlc3Npb25zLAorCQkJICAgIChzd2NyX3Nlc251bSAvIDIpICogc2l6ZW9mKHN0cnVjdCBzd2NyX2RhdGEgKikpOworCQkJa2ZyZWUoc3djcl9zZXNzaW9ucyk7CisJCX0KKworCQlzd2NyX3Nlc3Npb25zID0gc3dkOworCX0KKworCXN3ZCA9ICZzd2NyX3Nlc3Npb25zW2ldOworCSpzaWQgPSBpOworCisJd2hpbGUgKGNyaSkgeworCQkqc3dkID0gKHN0cnVjdCBzd2NyX2RhdGEgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IHN3Y3JfZGF0YSksCisJCQkJU0xBQl9BVE9NSUMpOworCQlpZiAoKnN3ZCA9PSBOVUxMKSB7CisJCQlzd2NyX2ZyZWVzZXNzaW9uKE5VTEwsIGkpOworCQkJZHByaW50aygiJXMsJWQ6IEVOT0JVRlNcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQlyZXR1cm4gRU5PQlVGUzsKKwkJfQorCQltZW1zZXQoKnN3ZCwgMCwgc2l6ZW9mKHN0cnVjdCBzd2NyX2RhdGEpKTsKKworCQlpZiAoY3JpLT5jcmlfYWxnIDwgMCB8fAorCQkJCWNyaS0+Y3JpX2FsZz49c2l6ZW9mKGNyeXB0b19kZXRhaWxzKS9zaXplb2YoY3J5cHRvX2RldGFpbHNbMF0pKXsKKwkJCXByaW50aygiY3J5cHRvc29mdDogVW5rbm93biBhbGdvcml0aG0gMHgleFxuIiwgY3JpLT5jcmlfYWxnKTsKKwkJCXN3Y3JfZnJlZXNlc3Npb24oTlVMTCwgaSk7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisKKwkJYWxnbyA9IGNyeXB0b19kZXRhaWxzW2NyaS0+Y3JpX2FsZ10uYWxnX25hbWU7CisJCWlmICghYWxnbyB8fCAhKmFsZ28pIHsKKwkJCXByaW50aygiY3J5cHRvc29mdDogVW5zdXBwb3J0ZWQgYWxnb3JpdGhtIDB4JXhcbiIsIGNyaS0+Y3JpX2FsZyk7CisJCQlzd2NyX2ZyZWVzZXNzaW9uKE5VTEwsIGkpOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCisJCW1vZGUgPSBjcnlwdG9fZGV0YWlsc1tjcmktPmNyaV9hbGddLm1vZGU7CisJCSgqc3dkKS0+c3dfdHlwZSA9IGNyeXB0b19kZXRhaWxzW2NyaS0+Y3JpX2FsZ10uc3dfdHlwZTsKKwkJKCpzd2QpLT5zd19hbGcgPSBjcmktPmNyaV9hbGc7CisKKwkJc3Bpbl9sb2NrX2luaXQoJigqc3dkKS0+c3dfdGZtX2xvY2spOworCisJCS8qIEFsZ29yaXRobSBzcGVjaWZpYyBjb25maWd1cmF0aW9uICovCisJCXN3aXRjaCAoY3JpLT5jcmlfYWxnKSB7CisJCWNhc2UgQ1JZUFRPX05VTExfQ0JDOgorCQkJY3JpLT5jcmlfa2xlbiA9IDA7IC8qIG1ha2UgaXQgd29yayB3aXRoIGNyeXB0byBBUEkgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKCpzd2QpLT5zd190eXBlICYgU1dfVFlQRV9CTEtDSVBIRVIpIHsKKwkJCWRwcmludGsoIiVzIGNyeXB0b19hbGxvY18qYmxrY2lwaGVyKCVzLCAweCV4KVxuIiwgX19GVU5DVElPTl9fLAorCQkJCQlhbGdvLCBtb2RlKTsKKworCQkJLyogdHJ5IGFzeW5jIGZpcnN0ICovCisJCQkoKnN3ZCktPnN3X3RmbSA9IHN3Y3Jfbm9fYWJsayA/IE5VTEwgOgorCQkJCQljcnlwdG9fYWJsa2NpcGhlcl90Zm0oY3J5cHRvX2FsbG9jX2FibGtjaXBoZXIoYWxnbywgMCwgMCkpOworCQkJaWYgKCgqc3dkKS0+c3dfdGZtICYmICFJU19FUlIoKCpzd2QpLT5zd190Zm0pKSB7CisJCQkJZHByaW50aygiJXMgJXMgY2lwaGVyIGlzIGFzeW5jXG4iLCBfX0ZVTkNUSU9OX18sIGFsZ28pOworCQkJCSgqc3dkKS0+c3dfdHlwZSB8PSBTV19UWVBFX0FTWU5DOworCQkJfSBlbHNlIHsKKwkJCQkoKnN3ZCktPnN3X3RmbSA9IGNyeXB0b19ibGtjaXBoZXJfdGZtKAorCQkJCQkJY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcihhbGdvLCAwLCBDUllQVE9fQUxHX0FTWU5DKSk7CisJCQkJaWYgKCgqc3dkKS0+c3dfdGZtICYmICFJU19FUlIoKCpzd2QpLT5zd190Zm0pKQorCQkJCQlkcHJpbnRrKCIlcyAlcyBjaXBoZXIgaXMgc3luY1xuIiwgX19GVU5DVElPTl9fLCBhbGdvKTsKKwkJCX0KKwkJCWlmICghKCpzd2QpLT5zd190Zm0gfHwgSVNfRVJSKCgqc3dkKS0+c3dfdGZtKSkgeworCQkJCWludCBlcnI7CisJCQkJZHByaW50aygiY3J5cHRvc29mdDogY3J5cHRvX2FsbG9jX2Jsa2NpcGhlciBmYWlsZWQoJXMsIDB4JXgpXG4iLAorCQkJCQkJYWxnbyxtb2RlKTsKKwkJCQllcnIgPSBJU19FUlIoKCpzd2QpLT5zd190Zm0pID8gLShQVFJfRVJSKCgqc3dkKS0+c3dfdGZtKSkgOiBFSU5WQUw7CisJCQkJKCpzd2QpLT5zd190Zm0gPSBOVUxMOyAvKiBlbnN1cmUgTlVMTCAqLworCQkJCXN3Y3JfZnJlZXNlc3Npb24oTlVMTCwgaSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKworCQkJaWYgKGRlYnVnKSB7CisJCQkJZHByaW50aygiJXMga2V5OmNyaS0+Y3JpX2tsZW49JWQsKGNyaS0+Y3JpX2tsZW4gKyA3KS84PSVkIiwKKwkJCQkJCV9fRlVOQ1RJT05fXywgY3JpLT5jcmlfa2xlbiwgKGNyaS0+Y3JpX2tsZW4gKyA3KSAvIDgpOworCQkJCWZvciAoaSA9IDA7IGkgPCAoY3JpLT5jcmlfa2xlbiArIDcpIC8gODsgaSsrKQorCQkJCQlkcHJpbnRrKCIlczB4JXgiLCAoaSAlIDgpID8gIiAiIDogIlxuICAgICIsCisJCQkJCQkJY3JpLT5jcmlfa2V5W2ldICYgMHhmZik7CisJCQkJZHByaW50aygiXG4iKTsKKwkJCX0KKwkJCWlmICgoKnN3ZCktPnN3X3R5cGUgJiBTV19UWVBFX0FTWU5DKSB7CisJCQkJLyogT0NGIGRvZXNuJ3QgZW5mb3JjZSBrZXlzICovCisJCQkJY3J5cHRvX2FibGtjaXBoZXJfc2V0X2ZsYWdzKAorCQkJCQkJX19jcnlwdG9fYWJsa2NpcGhlcl9jYXN0KCgqc3dkKS0+c3dfdGZtKSwKKwkJCQkJCQlDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSk7CisJCQkJZXJyb3IgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkoCisJCQkJCQkJX19jcnlwdG9fYWJsa2NpcGhlcl9jYXN0KCgqc3dkKS0+c3dfdGZtKSwKKwkJCQkJCQkJY3JpLT5jcmlfa2V5LCAoY3JpLT5jcmlfa2xlbiArIDcpIC8gOCk7CisJCQl9IGVsc2UgeworCQkJCS8qIE9DRiBkb2Vzbid0IGVuZm9yY2Uga2V5cyAqLworCQkJCWNyeXB0b19ibGtjaXBoZXJfc2V0X2ZsYWdzKAorCQkJCQkJY3J5cHRvX2Jsa2NpcGhlcl9jYXN0KCgqc3dkKS0+c3dfdGZtKSwKKwkJCQkJCQlDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSk7CisJCQkJZXJyb3IgPSBjcnlwdG9fYmxrY2lwaGVyX3NldGtleSgKKwkJCQkJCQljcnlwdG9fYmxrY2lwaGVyX2Nhc3QoKCpzd2QpLT5zd190Zm0pLAorCQkJCQkJCQljcmktPmNyaV9rZXksIChjcmktPmNyaV9rbGVuICsgNykgLyA4KTsKKwkJCX0KKwkJCWlmIChlcnJvcikgeworCQkJCXByaW50aygiY3J5cHRvc29mdDogc2V0a2V5IGZhaWxlZCAlZCAoY3J0X2ZsYWdzPTB4JXgpXG4iLCBlcnJvciwKKwkJCQkJCSgqc3dkKS0+c3dfdGZtLT5jcnRfZmxhZ3MpOworCQkJCXN3Y3JfZnJlZXNlc3Npb24oTlVMTCwgaSk7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQl9IGVsc2UgaWYgKCgqc3dkKS0+c3dfdHlwZSAmIChTV19UWVBFX0hNQUMgfCBTV19UWVBFX0hBU0gpKSB7CisJCQlkcHJpbnRrKCIlcyBjcnlwdG9fYWxsb2NfKmhhc2goJXMsIDB4JXgpXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJCWFsZ28sIG1vZGUpOworCisJCQkvKiB0cnkgYXN5bmMgZmlyc3QgKi8KKwkJCSgqc3dkKS0+c3dfdGZtID0gc3djcl9ub19haGFzaCA/IE5VTEwgOgorCQkJCQljcnlwdG9fYWhhc2hfdGZtKGNyeXB0b19hbGxvY19haGFzaChhbGdvLCAwLCAwKSk7CisJCQlpZiAoKCpzd2QpLT5zd190Zm0pIHsKKwkJCQlkcHJpbnRrKCIlcyAlcyBoYXNoIGlzIGFzeW5jXG4iLCBfX0ZVTkNUSU9OX18sIGFsZ28pOworCQkJCSgqc3dkKS0+c3dfdHlwZSB8PSBTV19UWVBFX0FTWU5DOworCQkJfSBlbHNlIHsKKwkJCQlkcHJpbnRrKCIlcyAlcyBoYXNoIGlzIHN5bmNcbiIsIF9fRlVOQ1RJT05fXywgYWxnbyk7CisJCQkJKCpzd2QpLT5zd190Zm0gPSBjcnlwdG9faGFzaF90Zm0oCisJCQkJCQljcnlwdG9fYWxsb2NfaGFzaChhbGdvLCAwLCBDUllQVE9fQUxHX0FTWU5DKSk7CisJCQl9CisKKwkJCWlmICghKCpzd2QpLT5zd190Zm0pIHsKKwkJCQlkcHJpbnRrKCJjcnlwdG9zb2Z0OiBjcnlwdG9fYWxsb2NfaGFzaCBmYWlsZWQoJXMsMHgleClcbiIsCisJCQkJCQlhbGdvLCBtb2RlKTsKKwkJCQlzd2NyX2ZyZWVzZXNzaW9uKE5VTEwsIGkpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisKKwkJCSgqc3dkKS0+dS5obWFjLnN3X2tsZW4gPSAoY3JpLT5jcmlfa2xlbiArIDcpIC8gODsKKwkJCSgqc3dkKS0+dS5obWFjLnN3X2tleSA9IChjaGFyICopa21hbGxvYygoKnN3ZCktPnUuaG1hYy5zd19rbGVuLAorCQkJCQlTTEFCX0FUT01JQyk7CisJCQlpZiAoKCpzd2QpLT51LmhtYWMuc3dfa2V5ID09IE5VTEwpIHsKKwkJCQlzd2NyX2ZyZWVzZXNzaW9uKE5VTEwsIGkpOworCQkJCWRwcmludGsoIiVzLCVkOiBFTk9CVUZTXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQkJCXJldHVybiBFTk9CVUZTOworCQkJfQorCQkJbWVtY3B5KCgqc3dkKS0+dS5obWFjLnN3X2tleSwgY3JpLT5jcmlfa2V5LCAoKnN3ZCktPnUuaG1hYy5zd19rbGVuKTsKKwkJCWlmIChjcmktPmNyaV9tbGVuKSB7CisJCQkJKCpzd2QpLT51LmhtYWMuc3dfbWxlbiA9IGNyaS0+Y3JpX21sZW47CisJCQl9IGVsc2UgaWYgKCgqc3dkKS0+c3dfdHlwZSAmIFNXX1RZUEVfQVNZTkMpIHsKKwkJCQkoKnN3ZCktPnUuaG1hYy5zd19tbGVuID0gY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUoCisJCQkJCQlfX2NyeXB0b19haGFzaF9jYXN0KCgqc3dkKS0+c3dfdGZtKSk7CisJCQl9IGVsc2UgIHsKKwkJCQkoKnN3ZCktPnUuaG1hYy5zd19tbGVuID0gY3J5cHRvX2hhc2hfZGlnZXN0c2l6ZSgKKwkJCQkJCWNyeXB0b19oYXNoX2Nhc3QoKCpzd2QpLT5zd190Zm0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoKnN3ZCktPnN3X3R5cGUgJiBTV19UWVBFX0NPTVApIHsKKwkJCSgqc3dkKS0+c3dfdGZtID0gY3J5cHRvX2NvbXBfdGZtKAorCQkJCQljcnlwdG9fYWxsb2NfY29tcChhbGdvLCAwLCBDUllQVE9fQUxHX0FTWU5DKSk7CisJCQlpZiAoISgqc3dkKS0+c3dfdGZtKSB7CisJCQkJZHByaW50aygiY3J5cHRvc29mdDogY3J5cHRvX2FsbG9jX2NvbXAgZmFpbGVkKCVzLDB4JXgpXG4iLAorCQkJCQkJYWxnbywgbW9kZSk7CisJCQkJc3djcl9mcmVlc2Vzc2lvbihOVUxMLCBpKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJKCpzd2QpLT51LnN3X2NvbXBfYnVmID0ga21hbGxvYyhDUllQVE9fTUFYX0RBVEFfTEVOLCBTTEFCX0FUT01JQyk7CisJCQlpZiAoKCpzd2QpLT51LnN3X2NvbXBfYnVmID09IE5VTEwpIHsKKwkJCQlzd2NyX2ZyZWVzZXNzaW9uKE5VTEwsIGkpOworCQkJCWRwcmludGsoIiVzLCVkOiBFTk9CVUZTXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQkJCXJldHVybiBFTk9CVUZTOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKCJjcnlwdG9zb2Z0OiBVbmhhbmRsZWQgc3dfdHlwZSAlZFxuIiwgKCpzd2QpLT5zd190eXBlKTsKKwkJCXN3Y3JfZnJlZXNlc3Npb24oTlVMTCwgaSk7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisKKwkJY3JpID0gY3JpLT5jcmlfbmV4dDsKKwkJc3dkID0gJigoKnN3ZCktPnN3X25leHQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWUgYSBzZXNzaW9uLgorICovCitzdGF0aWMgaW50Citzd2NyX2ZyZWVzZXNzaW9uKGRldmljZV90IGRldiwgdV9pbnQ2NF90IHRpZCkKK3sKKwlzdHJ1Y3Qgc3djcl9kYXRhICpzd2Q7CisJdV9pbnQzMl90IHNpZCA9IENSWVBUT19TRVNJRDJMSUQodGlkKTsKKworCWRwcmludGsoIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisJaWYgKHNpZCA+IHN3Y3Jfc2VzbnVtIHx8IHN3Y3Jfc2Vzc2lvbnMgPT0gTlVMTCB8fAorCQkJc3djcl9zZXNzaW9uc1tzaWRdID09IE5VTEwpIHsKKwkJZHByaW50aygiJXMsJWQ6IEVJTlZBTFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJcmV0dXJuKEVJTlZBTCk7CisJfQorCisJLyogU2lsZW50bHkgYWNjZXB0IGFuZCByZXR1cm4gKi8KKwlpZiAoc2lkID09IDApCisJCXJldHVybigwKTsKKworCXdoaWxlICgoc3dkID0gc3djcl9zZXNzaW9uc1tzaWRdKSAhPSBOVUxMKSB7CisJCXN3Y3Jfc2Vzc2lvbnNbc2lkXSA9IHN3ZC0+c3dfbmV4dDsKKwkJaWYgKHN3ZC0+c3dfdGZtKSB7CisJCQlzd2l0Y2ggKHN3ZC0+c3dfdHlwZSAmIFNXX1RZUEVfQUxHX0FNQVNLKSB7CisjaWZkZWYgSEFWRV9BSEFTSAorCQkJY2FzZSBTV19UWVBFX0FITUFDOgorCQkJY2FzZSBTV19UWVBFX0FIQVNIOgorCQkJCWNyeXB0b19mcmVlX2FoYXNoKF9fY3J5cHRvX2FoYXNoX2Nhc3Qoc3dkLT5zd190Zm0pKTsKKwkJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQUJMS0NJUEhFUgorCQkJY2FzZSBTV19UWVBFX0FCTEtDSVBIRVI6CisJCQkJY3J5cHRvX2ZyZWVfYWJsa2NpcGhlcihfX2NyeXB0b19hYmxrY2lwaGVyX2Nhc3Qoc3dkLT5zd190Zm0pKTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSBTV19UWVBFX0JMS0NJUEhFUjoKKwkJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoY3J5cHRvX2Jsa2NpcGhlcl9jYXN0KHN3ZC0+c3dfdGZtKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNXX1RZUEVfSE1BQzoKKwkJCWNhc2UgU1dfVFlQRV9IQVNIOgorCQkJCWNyeXB0b19mcmVlX2hhc2goY3J5cHRvX2hhc2hfY2FzdChzd2QtPnN3X3RmbSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBTV19UWVBFX0NPTVA6CisJCQkJaWYgKGluX2ludGVycnVwdCgpKQorCQkJCQlleGVjdXRlX2xhdGVyKCh2b2lkICgqKSh2b2lkICopKWNyeXB0b19mcmVlX2NvbXAsICh2b2lkICopY3J5cHRvX2NvbXBfY2FzdChzd2QtPnN3X3RmbSkpOworCQkJCWVsc2UKKwkJCQkJY3J5cHRvX2ZyZWVfY29tcChjcnlwdG9fY29tcF9jYXN0KHN3ZC0+c3dfdGZtKSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNyeXB0b19mcmVlX3RmbShzd2QtPnN3X3RmbSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2QtPnN3X3RmbSA9IE5VTEw7CisJCX0KKwkJaWYgKHN3ZC0+c3dfdHlwZSAmIFNXX1RZUEVfQ09NUCkgeworCQkJaWYgKHN3ZC0+dS5zd19jb21wX2J1ZikKKwkJCQlrZnJlZShzd2QtPnUuc3dfY29tcF9idWYpOworCQl9IGVsc2UgeworCQkJaWYgKHN3ZC0+dS5obWFjLnN3X2tleSkKKwkJCQlrZnJlZShzd2QtPnUuaG1hYy5zd19rZXkpOworCQl9CisJCWtmcmVlKHN3ZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzd2NyX3Byb2Nlc3NfcmVxX2NvbXBsZXRlKHN0cnVjdCBzd2NyX3JlcSAqcmVxKQoreworCWRwcmludGsoIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAocmVxLT5zdy0+c3dfdHlwZSAmIFNXX1RZUEVfSU5VU0UpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJlcS0+c3ctPnN3X3RmbV9sb2NrLCBmbGFncyk7CisJCXJlcS0+c3ctPnN3X3R5cGUgJj0gflNXX1RZUEVfSU5VU0U7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlcS0+c3ctPnN3X3RmbV9sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKHJlcS0+Y3JwLT5jcnBfZXR5cGUpCisJCWdvdG8gZG9uZTsKKworCXN3aXRjaCAocmVxLT5zdy0+c3dfdHlwZSAmIFNXX1RZUEVfQUxHX0FNQVNLKSB7CisjaWYgZGVmaW5lZChIQVZFX0FIQVNIKQorCWNhc2UgU1dfVFlQRV9BSE1BQzoKKwljYXNlIFNXX1RZUEVfQUhBU0g6CisJCWNyeXB0b19jb3B5YmFjayhyZXEtPmNycC0+Y3JwX2ZsYWdzLCByZXEtPmNycC0+Y3JwX2J1ZiwKKwkJCQlyZXEtPmNyZC0+Y3JkX2luamVjdCwgcmVxLT5zdy0+dS5obWFjLnN3X21sZW4sIHJlcS0+cmVzdWx0KTsKKwkJYWhhc2hfcmVxdWVzdF9mcmVlKHJlcS0+Y3J5cHRvX3JlcSk7CisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX0FCTEtDSVBIRVIpCisJY2FzZSBTV19UWVBFX0FCTEtDSVBIRVI6CisJCWFibGtjaXBoZXJfcmVxdWVzdF9mcmVlKHJlcS0+Y3J5cHRvX3JlcSk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBTV19UWVBFX0NJUEhFUjoKKwljYXNlIFNXX1RZUEVfSE1BQzoKKwljYXNlIFNXX1RZUEVfSEFTSDoKKwljYXNlIFNXX1RZUEVfQ09NUDoKKwljYXNlIFNXX1RZUEVfQkxLQ0lQSEVSOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXEtPmNycC0+Y3JwX2V0eXBlID0gRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCisJcmVxLT5jcmQgPSByZXEtPmNyZC0+Y3JkX25leHQ7CisJaWYgKHJlcS0+Y3JkKSB7CisJCXN3Y3JfcHJvY2Vzc19yZXEocmVxKTsKKwkJcmV0dXJuOworCX0KKworZG9uZToKKwlkcHJpbnRrKCIlcyBjcnlwdG9fZG9uZSAlcFxuIiwgX19GVU5DVElPTl9fLCByZXEpOworCWNyeXB0b19kb25lKHJlcS0+Y3JwKTsKKwlrbWVtX2NhY2hlX2ZyZWUoc3djcl9yZXFfY2FjaGUsIHJlcSk7Cit9CisKKyNpZiBkZWZpbmVkKEhBVkVfQUJMS0NJUEhFUikgfHwgZGVmaW5lZChIQVZFX0FIQVNIKQorc3RhdGljIHZvaWQgc3djcl9wcm9jZXNzX2NhbGxiYWNrKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqY3JlcSwgaW50IGVycikKK3sKKwlzdHJ1Y3Qgc3djcl9yZXEgKnJlcSA9IGNyZXEtPmRhdGE7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRUlOUFJPR1JFU1MpCisJCQlyZXR1cm47CisJCWRwcmludGsoIiVzKCkgZmFpbCAlZFxuIiwgX19GVU5DVElPTl9fLCAtZXJyKTsKKwkJcmVxLT5jcnAtPmNycF9ldHlwZSA9IC1lcnI7CisJfQorCisJc3djcl9wcm9jZXNzX3JlcV9jb21wbGV0ZShyZXEpOworfQorI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9BQkxLQ0lQSEVSKSB8fCBkZWZpbmVkKEhBVkVfQUhBU0gpICovCisKKworc3RhdGljIHZvaWQgc3djcl9wcm9jZXNzX3JlcShzdHJ1Y3Qgc3djcl9yZXEgKnJlcSkKK3sKKwlzdHJ1Y3Qgc3djcl9kYXRhICpzdzsKKwlzdHJ1Y3QgY3J5cHRvcCAqY3JwID0gcmVxLT5jcnA7CisJc3RydWN0IGNyeXB0b2Rlc2MgKmNyZCA9IHJlcS0+Y3JkOworCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgY3JwLT5jcnBfYnVmOworCXN0cnVjdCB1aW8gKnVpb3AgPSAoc3RydWN0IHVpbyAqKSBjcnAtPmNycF9idWY7CisJaW50IHNnX251bSwgc2dfbGVuLCBza2lwOworCisJZHByaW50aygiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCS8qCisJICogRmluZCB0aGUgY3J5cHRvIGNvbnRleHQuCisJICoKKwkgKiBYWFggTm90ZSB0aGF0IHRoZSBsb2dpYyBoZXJlIHByZXZlbnRzIHVzIGZyb20gaGF2aW5nCisJICogWFhYIHRoZSBzYW1lIGFsZ29yaXRobSBtdWx0aXBsZSB0aW1lcyBpbiBhIHNlc3Npb24KKwkgKiBYWFggKG9yIHJhdGhlciwgd2UgY2FuIGJ1dCBpdCB3b24ndCBnaXZlIHVzIHRoZSByaWdodAorCSAqIFhYWCByZXN1bHRzKS4gVG8gZG8gdGhhdCwgd2UnZCBuZWVkIHNvbWUgd2F5IG9mIGRpZmZlcmVudGlhdGluZworCSAqIFhYWCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGluc3RhbmNlcyBvZiBhbiBhbGdvcml0aG0gKHNvIHdlIGNhbgorCSAqIFhYWCBsb2NhdGUgdGhlIGNvcnJlY3QgY3J5cHRvIGNvbnRleHQpLgorCSAqLworCWZvciAoc3cgPSByZXEtPnN3X2hlYWQ7IHN3ICYmIHN3LT5zd19hbGcgIT0gY3JkLT5jcmRfYWxnOyBzdyA9IHN3LT5zd19uZXh0KQorCQk7CisKKwkvKiBObyBzdWNoIGNvbnRleHQgPyAqLworCWlmIChzdyA9PSBOVUxMKSB7CisJCWNycC0+Y3JwX2V0eXBlID0gRUlOVkFMOworCQlkcHJpbnRrKCIlcywlZDogRUlOVkFMXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBmb3Igc29tZSB0eXBlcyB3ZSBuZWVkIHRvIGVuc3VyZSBvbmx5IG9uZSB1c2VyIGFzIGluZm8gaXMgc3RvcmVkIGluCisJICogdGhlIHRmbSBkdXJpbmcgYW4gb3BlcmF0aW9uIHRoYXQgY2FuIGdldCBjb3JydXB0ZWQKKwkgKi8KKwlzd2l0Y2ggKHN3LT5zd190eXBlICYgU1dfVFlQRV9BTEdfQU1BU0spIHsKKyNpZmRlZiBIQVZFX0FIQVNICisJY2FzZSBTV19UWVBFX0FITUFDOgorCWNhc2UgU1dfVFlQRV9BSEFTSDoKKyNlbmRpZgorCWNhc2UgU1dfVFlQRV9ITUFDOgorCWNhc2UgU1dfVFlQRV9IQVNIOiB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdy0+c3dfdGZtX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHN3LT5zd190eXBlICYgU1dfVFlQRV9JTlVTRSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ctPnN3X3RmbV9sb2NrLCBmbGFncyk7CisJCQlleGVjdXRlX2xhdGVyKCh2b2lkICgqKSh2b2lkICopKXN3Y3JfcHJvY2Vzc19yZXEsICh2b2lkICopcmVxKTsKKwkJCXJldHVybjsKKwkJfQorCQlzdy0+c3dfdHlwZSB8PSBTV19UWVBFX0lOVVNFOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdy0+c3dfdGZtX2xvY2ssIGZsYWdzKTsKKwkJfSBicmVhazsKKwl9CisKKwlyZXEtPnN3ID0gc3c7CisJc2tpcCA9IGNyZC0+Y3JkX3NraXA7CisKKwkvKgorCSAqIHNldHVwIHRoZSBTRyBsaXN0IHNraXAgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlcgorCSAqLworCW1lbXNldChyZXEtPnNnLCAwLCBzaXplb2YocmVxLT5zZykpOworCXNnX2luaXRfdGFibGUocmVxLT5zZywgU0NBVFRFUkxJU1RfTUFYKTsKKwlpZiAoY3JwLT5jcnBfZmxhZ3MgJiBDUllQVE9fRl9TS0JVRikgeworCQlpbnQgaSwgbGVuOworCisJCXNnX251bSA9IDA7CisJCXNnX2xlbiA9IDA7CisKKwkJaWYgKHNraXAgPCBza2JfaGVhZGxlbihza2IpKSB7CisJCQlsZW4gPSBza2JfaGVhZGxlbihza2IpIC0gc2tpcDsKKwkJCWlmIChsZW4gKyBzZ19sZW4gPiBjcmQtPmNyZF9sZW4pCisJCQkJbGVuID0gY3JkLT5jcmRfbGVuIC0gc2dfbGVuOworCQkJc2dfc2V0X3BhZ2UoJnJlcS0+c2dbc2dfbnVtXSwKKwkJCQl2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhICsgc2tpcCksIGxlbiwKKwkJCQlvZmZzZXRfaW5fcGFnZShza2ItPmRhdGEgKyBza2lwKSk7CisJCQlzZ19sZW4gKz0gbGVuOworCQkJc2dfbnVtKys7CisJCQlza2lwID0gMDsKKwkJfSBlbHNlCisJCQlza2lwIC09IHNrYl9oZWFkbGVuKHNrYik7CisKKwkJZm9yIChpID0gMDsgc2dfbGVuIDwgY3JkLT5jcmRfbGVuICYmCisJCQkJCWkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICYmCisJCQkJCXNnX251bSA8IFNDQVRURVJMSVNUX01BWDsgaSsrKSB7CisJCQlpZiAoc2tpcCA8IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSkgeworCQkJCWxlbiA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZSAtIHNraXA7CisJCQkJaWYgKGxlbiArIHNnX2xlbiA+IGNyZC0+Y3JkX2xlbikKKwkJCQkJbGVuID0gY3JkLT5jcmRfbGVuIC0gc2dfbGVuOworCQkJCXNnX3NldF9wYWdlKCZyZXEtPnNnW3NnX251bV0sCisJCQkJCXNrYl9mcmFnX3BhZ2UoJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0pLAorCQkJCQlsZW4sCisJCQkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0ucGFnZV9vZmZzZXQgKyBza2lwKTsKKwkJCQlzZ19sZW4gKz0gbGVuOworCQkJCXNnX251bSsrOworCQkJCXNraXAgPSAwOworCQkJfSBlbHNlCisJCQkJc2tpcCAtPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJCX0KKwl9IGVsc2UgaWYgKGNycC0+Y3JwX2ZsYWdzICYgQ1JZUFRPX0ZfSU9WKSB7CisJCWludCBsZW47CisKKwkJc2dfbGVuID0gMDsKKwkJZm9yIChzZ19udW0gPSAwOyBzZ19sZW4gPCBjcmQtPmNyZF9sZW4gJiYKKwkJCQlzZ19udW0gPCB1aW9wLT51aW9faW92Y250ICYmCisJCQkJc2dfbnVtIDwgU0NBVFRFUkxJU1RfTUFYOyBzZ19udW0rKykgeworCQkJaWYgKHNraXAgPD0gdWlvcC0+dWlvX2lvdltzZ19udW1dLmlvdl9sZW4pIHsKKwkJCQlsZW4gPSB1aW9wLT51aW9faW92W3NnX251bV0uaW92X2xlbiAtIHNraXA7CisJCQkJaWYgKGxlbiArIHNnX2xlbiA+IGNyZC0+Y3JkX2xlbikKKwkJCQkJbGVuID0gY3JkLT5jcmRfbGVuIC0gc2dfbGVuOworCQkJCXNnX3NldF9wYWdlKCZyZXEtPnNnW3NnX251bV0sCisJCQkJCXZpcnRfdG9fcGFnZSh1aW9wLT51aW9faW92W3NnX251bV0uaW92X2Jhc2Urc2tpcCksCisJCQkJCWxlbiwKKwkJCQkJb2Zmc2V0X2luX3BhZ2UodWlvcC0+dWlvX2lvdltzZ19udW1dLmlvdl9iYXNlK3NraXApKTsKKwkJCQlzZ19sZW4gKz0gbGVuOworCQkJCXNraXAgPSAwOworCQkJfSBlbHNlIAorCQkJCXNraXAgLT0gdWlvcC0+dWlvX2lvdltzZ19udW1dLmlvdl9sZW47CisJCX0KKwl9IGVsc2UgeworCQlzZ19sZW4gPSAoY3JwLT5jcnBfaWxlbiAtIHNraXApOworCQlpZiAoc2dfbGVuID4gY3JkLT5jcmRfbGVuKQorCQkJc2dfbGVuID0gY3JkLT5jcmRfbGVuOworCQlzZ19zZXRfcGFnZSgmcmVxLT5zZ1swXSwgdmlydF90b19wYWdlKGNycC0+Y3JwX2J1ZiArIHNraXApLAorCQkJc2dfbGVuLCBvZmZzZXRfaW5fcGFnZShjcnAtPmNycF9idWYgKyBza2lwKSk7CisJCXNnX251bSA9IDE7CisJfQorCWlmIChzZ19udW0gPiAwKQorCQlzZ19tYXJrX2VuZCgmcmVxLT5zZ1tzZ19udW0tMV0pOworCisJc3dpdGNoIChzdy0+c3dfdHlwZSAmIFNXX1RZUEVfQUxHX0FNQVNLKSB7CisKKyNpZmRlZiBIQVZFX0FIQVNICisJY2FzZSBTV19UWVBFX0FITUFDOgorCWNhc2UgU1dfVFlQRV9BSEFTSDoKKwkJeworCQlpbnQgcmV0OworCisJCS8qIGNoZWNrIHdlIGhhdmUgcm9vbSBmb3IgdGhlIHJlc3VsdCAqLworCQlpZiAoY3JwLT5jcnBfaWxlbiAtIGNyZC0+Y3JkX2luamVjdCA8IHN3LT51LmhtYWMuc3dfbWxlbikgeworCQkJZHByaW50aygiY3J5cHRvc29mdDogRUlOVkFMIGNycF9pbGVuPSVkLCBsZW49JWQsIGluamVjdD0lZCAiCisJCQkJCSJkaWdlc3RzaXplPSVkXG4iLCBjcnAtPmNycF9pbGVuLCBjcmQtPmNyZF9za2lwICsgc2dfbGVuLAorCQkJCQljcmQtPmNyZF9pbmplY3QsIHN3LT51LmhtYWMuc3dfbWxlbik7CisJCQljcnAtPmNycF9ldHlwZSA9IEVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXJlcS0+Y3J5cHRvX3JlcSA9CisJCQkJYWhhc2hfcmVxdWVzdF9hbGxvYyhfX2NyeXB0b19haGFzaF9jYXN0KHN3LT5zd190Zm0pLEdGUF9BVE9NSUMpOworCQlpZiAoIXJlcS0+Y3J5cHRvX3JlcSkgeworCQkJY3JwLT5jcnBfZXR5cGUgPSBFTk9NRU07CisJCQlkcHJpbnRrKCIlcywlZDogRU5PTUVNIGFoYXNoX3JlcXVlc3RfYWxsb2MiLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQkJZ290byBkb25lOworCQl9CisKKwkJYWhhc2hfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLT5jcnlwdG9fcmVxLAorCQkJCUNSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLCBzd2NyX3Byb2Nlc3NfY2FsbGJhY2ssIHJlcSk7CisKKwkJbWVtc2V0KHJlcS0+cmVzdWx0LCAwLCBzaXplb2YocmVxLT5yZXN1bHQpKTsKKworCQlpZiAoc3ctPnN3X3R5cGUgJiBTV19UWVBFX0FITUFDKQorCQkJY3J5cHRvX2FoYXNoX3NldGtleShfX2NyeXB0b19haGFzaF9jYXN0KHN3LT5zd190Zm0pLAorCQkJCQlzdy0+dS5obWFjLnN3X2tleSwgc3ctPnUuaG1hYy5zd19rbGVuKTsKKwkJYWhhc2hfcmVxdWVzdF9zZXRfY3J5cHQocmVxLT5jcnlwdG9fcmVxLCByZXEtPnNnLCByZXEtPnJlc3VsdCwgc2dfbGVuKTsKKwkJcmV0ID0gY3J5cHRvX2FoYXNoX2RpZ2VzdChyZXEtPmNyeXB0b19yZXEpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIC1FSU5QUk9HUkVTUzoKKwkJY2FzZSAtRUJVU1k6CisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCWNhc2UgMDoKKwkJCWRwcmludGsoImhhc2ggT1AgJXMgJWRcbiIsIHJldCA/ICJmYWlsZWQiIDogInN1Y2Nlc3MiLCByZXQpOworCQkJY3JwLT5jcnBfZXR5cGUgPSByZXQ7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJfSBicmVhazsKKyNlbmRpZiAvKiBIQVZFX0FIQVNIICovCisKKyNpZmRlZiBIQVZFX0FCTEtDSVBIRVIKKwljYXNlIFNXX1RZUEVfQUJMS0NJUEhFUjogeworCQlpbnQgcmV0OworCQl1bnNpZ25lZCBjaGFyICppdnAgPSByZXEtPml2OworCQlpbnQgaXZzaXplID0gCisJCQljcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoX19jcnlwdG9fYWJsa2NpcGhlcl9jYXN0KHN3LT5zd190Zm0pKTsKKworCQlpZiAoc2dfbGVuIDwgY3J5cHRvX2FibGtjaXBoZXJfYmxvY2tzaXplKAorCQkJCV9fY3J5cHRvX2FibGtjaXBoZXJfY2FzdChzdy0+c3dfdGZtKSkpIHsKKwkJCWNycC0+Y3JwX2V0eXBlID0gRUlOVkFMOworCQkJZHByaW50aygiJXMsJWQ6IEVJTlZBTCBsZW4gJWQgPCAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fLAorCQkJCQlzZ19sZW4sIGNyeXB0b19hYmxrY2lwaGVyX2Jsb2Nrc2l6ZSgKKwkJCQkJCV9fY3J5cHRvX2FibGtjaXBoZXJfY2FzdChzdy0+c3dfdGZtKSkpOworCQkJZ290byBkb25lOworCQl9CisKKwkJaWYgKGl2c2l6ZSA+IHNpemVvZihyZXEtPml2KSkgeworCQkJY3JwLT5jcnBfZXR5cGUgPSBFSU5WQUw7CisJCQlkcHJpbnRrKCIlcywlZDogRUlOVkFMXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQkJZ290byBkb25lOworCQl9CisKKwkJcmVxLT5jcnlwdG9fcmVxID0gYWJsa2NpcGhlcl9yZXF1ZXN0X2FsbG9jKAorCQkJCV9fY3J5cHRvX2FibGtjaXBoZXJfY2FzdChzdy0+c3dfdGZtKSwgR0ZQX0FUT01JQyk7CisJCWlmICghcmVxLT5jcnlwdG9fcmVxKSB7CisJCQljcnAtPmNycF9ldHlwZSA9IEVOT01FTTsKKwkJCWRwcmludGsoIiVzLCVkOiBFTk9NRU0gYWJsa2NpcGhlcl9yZXF1ZXN0X2FsbG9jIiwKKwkJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLT5jcnlwdG9fcmVxLAorCQkJCUNSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLCBzd2NyX3Byb2Nlc3NfY2FsbGJhY2ssIHJlcSk7CisKKwkJaWYgKGNyZC0+Y3JkX2ZsYWdzICYgQ1JEX0ZfS0VZX0VYUExJQ0lUKSB7CisJCQlpbnQgaSwgZXJyb3I7CisKKwkJCWlmIChkZWJ1ZykgeworCQkJCWRwcmludGsoIiVzIGtleToiLCBfX0ZVTkNUSU9OX18pOworCQkJCWZvciAoaSA9IDA7IGkgPCAoY3JkLT5jcmRfa2xlbiArIDcpIC8gODsgaSsrKQorCQkJCQlkcHJpbnRrKCIlczB4JXgiLCAoaSAlIDgpID8gIiAiIDogIlxuICAgICIsCisJCQkJCQkJY3JkLT5jcmRfa2V5W2ldICYgMHhmZik7CisJCQkJZHByaW50aygiXG4iKTsKKwkJCX0KKwkJCS8qIE9DRiBkb2Vzbid0IGVuZm9yY2Uga2V5cyAqLworCQkJY3J5cHRvX2FibGtjaXBoZXJfc2V0X2ZsYWdzKF9fY3J5cHRvX2FibGtjaXBoZXJfY2FzdChzdy0+c3dfdGZtKSwKKwkJCQkJQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkpOworCQkJZXJyb3IgPSBjcnlwdG9fYWJsa2NpcGhlcl9zZXRrZXkoCisJCQkJCQlfX2NyeXB0b19hYmxrY2lwaGVyX2Nhc3Qoc3ctPnN3X3RmbSksIGNyZC0+Y3JkX2tleSwKKwkJCQkJCShjcmQtPmNyZF9rbGVuICsgNykgLyA4KTsKKwkJCWlmIChlcnJvcikgeworCQkJCWRwcmludGsoImNyeXB0b3NvZnQ6IHNldGtleSBmYWlsZWQgJWQgKGNydF9mbGFncz0weCV4KVxuIiwKKwkJCQkJCWVycm9yLCBzdy0+c3dfdGZtLT5jcnRfZmxhZ3MpOworCQkJCWNycC0+Y3JwX2V0eXBlID0gLWVycm9yOworCQkJfQorCQl9CisKKwkJaWYgKGNyZC0+Y3JkX2ZsYWdzICYgQ1JEX0ZfRU5DUllQVCkgeyAvKiBlbmNyeXB0ICovCisKKwkJCWlmIChjcmQtPmNyZF9mbGFncyAmIENSRF9GX0lWX0VYUExJQ0lUKQorCQkJCWl2cCA9IGNyZC0+Y3JkX2l2OworCQkJZWxzZQorCQkJCWdldF9yYW5kb21fYnl0ZXMoaXZwLCBpdnNpemUpOworCQkJLyoKKwkJCSAqIGRvIHdlIGhhdmUgdG8gY29weSB0aGUgSVYgYmFjayB0byB0aGUgYnVmZmVyID8KKwkJCSAqLworCQkJaWYgKChjcmQtPmNyZF9mbGFncyAmIENSRF9GX0lWX1BSRVNFTlQpID09IDApIHsKKwkJCQljcnlwdG9fY29weWJhY2soY3JwLT5jcnBfZmxhZ3MsIGNycC0+Y3JwX2J1ZiwKKwkJCQkJCWNyZC0+Y3JkX2luamVjdCwgaXZzaXplLCAoY2FkZHJfdClpdnApOworCQkJfQorCQkJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jcnlwdChyZXEtPmNyeXB0b19yZXEsIHJlcS0+c2csIHJlcS0+c2csCisJCQkJCXNnX2xlbiwgaXZwKTsKKwkJCXJldCA9IGNyeXB0b19hYmxrY2lwaGVyX2VuY3J5cHQocmVxLT5jcnlwdG9fcmVxKTsKKworCQl9IGVsc2UgeyAvKmRlY3J5cHQgKi8KKworCQkJaWYgKGNyZC0+Y3JkX2ZsYWdzICYgQ1JEX0ZfSVZfRVhQTElDSVQpCisJCQkJaXZwID0gY3JkLT5jcmRfaXY7CisJCQllbHNlCisJCQkJY3J5cHRvX2NvcHlkYXRhKGNycC0+Y3JwX2ZsYWdzLCBjcnAtPmNycF9idWYsCisJCQkJCQljcmQtPmNyZF9pbmplY3QsIGl2c2l6ZSwgKGNhZGRyX3QpaXZwKTsKKwkJCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLT5jcnlwdG9fcmVxLCByZXEtPnNnLCByZXEtPnNnLAorCQkJCQlzZ19sZW4sIGl2cCk7CisJCQlyZXQgPSBjcnlwdG9fYWJsa2NpcGhlcl9kZWNyeXB0KHJlcS0+Y3J5cHRvX3JlcSk7CisJCX0KKworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIC1FSU5QUk9HUkVTUzoKKwkJY2FzZSAtRUJVU1k6CisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCWNhc2UgMDoKKwkJCWRwcmludGsoImNyeXB0byBPUCAlcyAlZFxuIiwgcmV0ID8gImZhaWxlZCIgOiAic3VjY2VzcyIsIHJldCk7CisJCQljcnAtPmNycF9ldHlwZSA9IHJldDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQl9IGJyZWFrOworI2VuZGlmIC8qIEhBVkVfQUJMS0NJUEhFUiAqLworCisJY2FzZSBTV19UWVBFX0JMS0NJUEhFUjogeworCQl1bnNpZ25lZCBjaGFyIGl2W0VBTEdfTUFYX0JMT0NLX0xFTl07CisJCXVuc2lnbmVkIGNoYXIgKml2cCA9IGl2OworCQlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYzsKKwkJaW50IGl2c2l6ZSA9IGNyeXB0b19ibGtjaXBoZXJfaXZzaXplKGNyeXB0b19ibGtjaXBoZXJfY2FzdChzdy0+c3dfdGZtKSk7CisKKwkJaWYgKHNnX2xlbiA8IGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKAorCQkJCWNyeXB0b19ibGtjaXBoZXJfY2FzdChzdy0+c3dfdGZtKSkpIHsKKwkJCWNycC0+Y3JwX2V0eXBlID0gRUlOVkFMOworCQkJZHByaW50aygiJXMsJWQ6IEVJTlZBTCBsZW4gJWQgPCAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fLAorCQkJCQlzZ19sZW4sIGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKAorCQkJCQkJY3J5cHRvX2Jsa2NpcGhlcl9jYXN0KHN3LT5zd190Zm0pKSk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpZiAoaXZzaXplID4gc2l6ZW9mKGl2KSkgeworCQkJY3JwLT5jcnBfZXR5cGUgPSBFSU5WQUw7CisJCQlkcHJpbnRrKCIlcywlZDogRUlOVkFMXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQkJZ290byBkb25lOworCQl9CisKKwkJaWYgKGNyZC0+Y3JkX2ZsYWdzICYgQ1JEX0ZfS0VZX0VYUExJQ0lUKSB7CisJCQlpbnQgaSwgZXJyb3I7CisKKwkJCWlmIChkZWJ1ZykgeworCQkJCWRwcmludGsoIiVzIGtleToiLCBfX0ZVTkNUSU9OX18pOworCQkJCWZvciAoaSA9IDA7IGkgPCAoY3JkLT5jcmRfa2xlbiArIDcpIC8gODsgaSsrKQorCQkJCQlkcHJpbnRrKCIlczB4JXgiLCAoaSAlIDgpID8gIiAiIDogIlxuICAgICIsCisJCQkJCQkJY3JkLT5jcmRfa2V5W2ldICYgMHhmZik7CisJCQkJZHByaW50aygiXG4iKTsKKwkJCX0KKwkJCS8qIE9DRiBkb2Vzbid0IGVuZm9yY2Uga2V5cyAqLworCQkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRfZmxhZ3MoY3J5cHRvX2Jsa2NpcGhlcl9jYXN0KHN3LT5zd190Zm0pLAorCQkJCQlDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSk7CisJCQllcnJvciA9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KAorCQkJCQkJY3J5cHRvX2Jsa2NpcGhlcl9jYXN0KHN3LT5zd190Zm0pLCBjcmQtPmNyZF9rZXksCisJCQkJCQkoY3JkLT5jcmRfa2xlbiArIDcpIC8gOCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlkcHJpbnRrKCJjcnlwdG9zb2Z0OiBzZXRrZXkgZmFpbGVkICVkIChjcnRfZmxhZ3M9MHgleClcbiIsCisJCQkJCQllcnJvciwgc3ctPnN3X3RmbS0+Y3J0X2ZsYWdzKTsKKwkJCQljcnAtPmNycF9ldHlwZSA9IC1lcnJvcjsKKwkJCX0KKwkJfQorCisJCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKKwkJZGVzYy50Zm0gPSBjcnlwdG9fYmxrY2lwaGVyX2Nhc3Qoc3ctPnN3X3RmbSk7CisKKwkJaWYgKGNyZC0+Y3JkX2ZsYWdzICYgQ1JEX0ZfRU5DUllQVCkgeyAvKiBlbmNyeXB0ICovCisKKwkJCWlmIChjcmQtPmNyZF9mbGFncyAmIENSRF9GX0lWX0VYUExJQ0lUKSB7CisJCQkJaXZwID0gY3JkLT5jcmRfaXY7CisJCQl9IGVsc2UgeworCQkJCWdldF9yYW5kb21fYnl0ZXMoaXZwLCBpdnNpemUpOworCQkJfQorCQkJLyoKKwkJCSAqIGRvIHdlIGhhdmUgdG8gY29weSB0aGUgSVYgYmFjayB0byB0aGUgYnVmZmVyID8KKwkJCSAqLworCQkJaWYgKChjcmQtPmNyZF9mbGFncyAmIENSRF9GX0lWX1BSRVNFTlQpID09IDApIHsKKwkJCQljcnlwdG9fY29weWJhY2soY3JwLT5jcnBfZmxhZ3MsIGNycC0+Y3JwX2J1ZiwKKwkJCQkJCWNyZC0+Y3JkX2luamVjdCwgaXZzaXplLCAoY2FkZHJfdClpdnApOworCQkJfQorCQkJZGVzYy5pbmZvID0gaXZwOworCQkJY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0X2l2KCZkZXNjLCByZXEtPnNnLCByZXEtPnNnLCBzZ19sZW4pOworCisJCX0gZWxzZSB7IC8qZGVjcnlwdCAqLworCisJCQlpZiAoY3JkLT5jcmRfZmxhZ3MgJiBDUkRfRl9JVl9FWFBMSUNJVCkgeworCQkJCWl2cCA9IGNyZC0+Y3JkX2l2OworCQkJfSBlbHNlIHsKKwkJCQljcnlwdG9fY29weWRhdGEoY3JwLT5jcnBfZmxhZ3MsIGNycC0+Y3JwX2J1ZiwKKwkJCQkJCWNyZC0+Y3JkX2luamVjdCwgaXZzaXplLCAoY2FkZHJfdClpdnApOworCQkJfQorCQkJZGVzYy5pbmZvID0gaXZwOworCQkJY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0X2l2KCZkZXNjLCByZXEtPnNnLCByZXEtPnNnLCBzZ19sZW4pOworCQl9CisJCX0gYnJlYWs7CisKKwljYXNlIFNXX1RZUEVfSE1BQzoKKwljYXNlIFNXX1RZUEVfSEFTSDoKKwkJeworCQljaGFyIHJlc3VsdFtIQVNIX01BWF9MRU5dOworCQlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2M7CisKKwkJLyogY2hlY2sgd2UgaGF2ZSByb29tIGZvciB0aGUgcmVzdWx0ICovCisJCWlmIChjcnAtPmNycF9pbGVuIC0gY3JkLT5jcmRfaW5qZWN0IDwgc3ctPnUuaG1hYy5zd19tbGVuKSB7CisJCQlkcHJpbnRrKCJjcnlwdG9zb2Z0OiBFSU5WQUwgY3JwX2lsZW49JWQsIGxlbj0lZCwgaW5qZWN0PSVkICIKKwkJCQkJImRpZ2VzdHNpemU9JWRcbiIsIGNycC0+Y3JwX2lsZW4sIGNyZC0+Y3JkX3NraXAgKyBzZ19sZW4sCisJCQkJCWNyZC0+Y3JkX2luamVjdCwgc3ctPnUuaG1hYy5zd19tbGVuKTsKKwkJCWNycC0+Y3JwX2V0eXBlID0gRUlOVkFMOworCQkJZ290byBkb25lOworCQl9CisKKwkJbWVtc2V0KCZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworCQlkZXNjLnRmbSA9IGNyeXB0b19oYXNoX2Nhc3Qoc3ctPnN3X3RmbSk7CisKKwkJbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZW9mKHJlc3VsdCkpOworCisJCWlmIChzdy0+c3dfdHlwZSAmIFNXX1RZUEVfSE1BQykgeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkKKwkJCWNyeXB0b19obWFjKHN3LT5zd190Zm0sIHN3LT51LmhtYWMuc3dfa2V5LCAmc3ctPnUuaG1hYy5zd19rbGVuLAorCQkJCQlyZXEtPnNnLCBzZ19udW0sIHJlc3VsdCk7CisjZWxzZQorCQkJY3J5cHRvX2hhc2hfc2V0a2V5KGRlc2MudGZtLCBzdy0+dS5obWFjLnN3X2tleSwKKwkJCQkJc3ctPnUuaG1hYy5zd19rbGVuKTsKKwkJCWNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgcmVxLT5zZywgc2dfbGVuLCByZXN1bHQpOworI2VuZGlmIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxOSkgKi8KKwkJCQorCQl9IGVsc2UgeyAvKiBTV19UWVBFX0hBU0ggKi8KKwkJCWNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgcmVxLT5zZywgc2dfbGVuLCByZXN1bHQpOworCQl9CisKKwkJY3J5cHRvX2NvcHliYWNrKGNycC0+Y3JwX2ZsYWdzLCBjcnAtPmNycF9idWYsCisJCQkJY3JkLT5jcmRfaW5qZWN0LCBzdy0+dS5obWFjLnN3X21sZW4sIHJlc3VsdCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNXX1RZUEVfQ09NUDogeworCQl2b2lkICppYnVmID0gTlVMTDsKKwkJdm9pZCAqb2J1ZiA9IHN3LT51LnN3X2NvbXBfYnVmOworCQlpbnQgaWxlbiA9IHNnX2xlbiwgb2xlbiA9IENSWVBUT19NQVhfREFUQV9MRU47CisJCWludCByZXQgPSAwOworCisJCS8qCisJCSAqIHdlIG5lZWQgdG8gdXNlIGFuIGFkZGl0aW9uYWwgY29weSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCisJCSAqIGlucHV0IGNodW5rIHNpbmNlIHRoZSBrZXJuZWwgY29tcCByb3V0aW5lcyBkbyBub3QgaGFuZGxlCisJCSAqIFNHIHlldC4gIE90aGVyd2lzZSB3ZSBqdXN0IHVzZSB0aGUgaW5wdXQgYnVmZmVyIGFzIGlzLgorCQkgKiBSYXRoZXIgdGhhbiBhbGxvY2F0ZSBhbm90aGVyIGJ1ZmZlciB3ZSBqdXN0IHNwbGl0IHRoZSB0bXAKKwkJICogYnVmZmVyIHdlIGFscmVhZHkgaGF2ZS4KKwkJICogUGVyaGFwcyB3ZSBzaG91bGQganVzdCB1c2UgemxpYiBkaXJlY3RseSA/CisJCSAqLworCQlpZiAoc2dfbnVtID4gMSkgeworCQkJaW50IGJsazsKKworCQkJaWJ1ZiA9IG9idWY7CisJCQlmb3IgKGJsayA9IDA7IGJsayA8IHNnX251bTsgYmxrKyspIHsKKwkJCQltZW1jcHkob2J1Ziwgc2dfdmlydCgmcmVxLT5zZ1tibGtdKSwKKwkJCQkJCXJlcS0+c2dbYmxrXS5sZW5ndGgpOworCQkJCW9idWYgKz0gcmVxLT5zZ1tibGtdLmxlbmd0aDsKKwkJCX0KKwkJCW9sZW4gLT0gc2dfbGVuOworCQl9IGVsc2UKKwkJCWlidWYgPSBzZ192aXJ0KCZyZXEtPnNnWzBdKTsKKworCQlpZiAoY3JkLT5jcmRfZmxhZ3MgJiBDUkRfRl9FTkNSWVBUKSB7IC8qIGNvbXByZXNzICovCisJCQlyZXQgPSBjcnlwdG9fY29tcF9jb21wcmVzcyhjcnlwdG9fY29tcF9jYXN0KHN3LT5zd190Zm0pLAorCQkJCQlpYnVmLCBpbGVuLCBvYnVmLCAmb2xlbik7CisJCQlpZiAoIXJldCAmJiBvbGVuID4gY3JkLT5jcmRfbGVuKSB7CisJCQkJZHByaW50aygiY3J5cHRvc29mdDogRVJBTkdFIGNvbXByZXNzICVkIGludG8gJWRcbiIsCisJCQkJCQljcmQtPmNyZF9sZW4sIG9sZW4pOworCQkJCWlmIChzd2NyX2ZhaWxfaWZfY29tcHJlc3Npb25fZ3Jvd3MpCisJCQkJCXJldCA9IEVSQU5HRTsKKwkJCX0KKwkJfSBlbHNlIHsgLyogZGVjb21wcmVzcyAqLworCQkJcmV0ID0gY3J5cHRvX2NvbXBfZGVjb21wcmVzcyhjcnlwdG9fY29tcF9jYXN0KHN3LT5zd190Zm0pLAorCQkJCQlpYnVmLCBpbGVuLCBvYnVmLCAmb2xlbik7CisJCQlpZiAoIXJldCAmJiAob2xlbiArIGNyZC0+Y3JkX2luamVjdCkgPiBjcnAtPmNycF9vbGVuKSB7CisJCQkJZHByaW50aygiY3J5cHRvc29mdDogRVRPT1NNQUxMIGRlY29tcHJlc3MgJWQgaW50byAlZCwgIgorCQkJCQkJInNwYWNlIGZvciAlZCxhdCBvZmZzZXQgJWRcbiIsCisJCQkJCQljcmQtPmNyZF9sZW4sIG9sZW4sIGNycC0+Y3JwX29sZW4sIGNyZC0+Y3JkX2luamVjdCk7CisJCQkJcmV0ID0gRVRPT1NNQUxMOworCQkJfQorCQl9CisJCWlmIChyZXQpCisJCQlkcHJpbnRrKCIlcywlZDogcmV0ID0gJWRcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcmV0KTsKKworCQkvKgorCQkgKiBvbiBzdWNjZXNzIGNvcHkgcmVzdWx0IGJhY2ssCisJCSAqIGxpbnV4IGNycHl0byBBUEkgcmV0dXJucyAtZXJybm8sICB3ZSBuZWVkIHRvIGZpeCB0aGF0CisJCSAqLworCQljcnAtPmNycF9ldHlwZSA9IHJldCA8IDAgPyAtcmV0IDogcmV0OworCQlpZiAocmV0ID09IDApIHsKKwkJCS8qIGNvcHkgYmFjayB0aGUgcmVzdWx0IGFuZCByZXR1cm4gaXQncyBzaXplICovCisJCQljcnlwdG9fY29weWJhY2soY3JwLT5jcnBfZmxhZ3MsIGNycC0+Y3JwX2J1ZiwKKwkJCQkJY3JkLT5jcmRfaW5qZWN0LCBvbGVuLCBvYnVmKTsKKwkJCWNycC0+Y3JwX29sZW4gPSBvbGVuOworCQl9CisJCX0gYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duL3Vuc3VwcG9ydGVkIGFsZ29yaXRobSAqLworCQlkcHJpbnRrKCIlcywlZDogRUlOVkFMXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQljcnAtPmNycF9ldHlwZSA9IEVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworZG9uZToKKwlzd2NyX3Byb2Nlc3NfcmVxX2NvbXBsZXRlKHJlcSk7Cit9CisKKworLyoKKyAqIFByb2Nlc3MgYSBjcnlwdG8gcmVxdWVzdC4KKyAqLworc3RhdGljIGludAorc3djcl9wcm9jZXNzKGRldmljZV90IGRldiwgc3RydWN0IGNyeXB0b3AgKmNycCwgaW50IGhpbnQpCit7CisJc3RydWN0IHN3Y3JfcmVxICpyZXEgPSBOVUxMOworCXVfaW50MzJfdCBsaWQ7CisKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChjcnAgPT0gTlVMTCkgeworCQlkcHJpbnRrKCIlcywlZDogRUlOVkFMXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCWNycC0+Y3JwX2V0eXBlID0gMDsKKworCWlmIChjcnAtPmNycF9kZXNjID09IE5VTEwgfHwgY3JwLT5jcnBfYnVmID09IE5VTEwpIHsKKwkJZHByaW50aygiJXMsJWQ6IEVJTlZBTFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJY3JwLT5jcnBfZXR5cGUgPSBFSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlsaWQgPSBjcnAtPmNycF9zaWQgJiAweGZmZmZmZmZmOworCWlmIChsaWQgPj0gc3djcl9zZXNudW0gfHwgbGlkID09IDAgfHwgc3djcl9zZXNzaW9ucyA9PSBOVUxMIHx8CisJCQlzd2NyX3Nlc3Npb25zW2xpZF0gPT0gTlVMTCkgeworCQljcnAtPmNycF9ldHlwZSA9IEVOT0VOVDsKKwkJZHByaW50aygiJXMsJWQ6IEVOT0VOVFxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogZG8gc29tZSBlcnJvciBjaGVja2luZyBvdXRzaWRlIG9mIHRoZSBsb29wIGZvciBTS0IgYW5kIElPViBwcm9jZXNzaW5nCisJICogdGhpcyBsZWF2ZXMgdXMgd2l0aCB2YWxpZCBza2Igb3IgdWlvcCBwb2ludGVycyBmb3IgbGF0ZXIKKwkgKi8KKwlpZiAoY3JwLT5jcnBfZmxhZ3MgJiBDUllQVE9fRl9TS0JVRikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIGNycC0+Y3JwX2J1ZjsKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPj0gU0NBVFRFUkxJU1RfTUFYKSB7CisJCQlwcmludGsoIiVzLCVkOiAlZCBucl9mcmFncyA+IFNDQVRURVJMSVNUX01BWCIsIF9fRklMRV9fLCBfX0xJTkVfXywKKwkJCQkJc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9IGVsc2UgaWYgKGNycC0+Y3JwX2ZsYWdzICYgQ1JZUFRPX0ZfSU9WKSB7CisJCXN0cnVjdCB1aW8gKnVpb3AgPSAoc3RydWN0IHVpbyAqKSBjcnAtPmNycF9idWY7CisJCWlmICh1aW9wLT51aW9faW92Y250ID4gU0NBVFRFUkxJU1RfTUFYKSB7CisJCQlwcmludGsoIiVzLCVkOiAlZCB1aW9faW92Y250ID4gU0NBVFRFUkxJU1RfTUFYIiwgX19GSUxFX18sIF9fTElORV9fLAorCQkJCQl1aW9wLT51aW9faW92Y250KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCS8qCisJICogc2V0dXAgYSBuZXcgcmVxdWVzdCByZWFkeSBmb3IgcXVldWluZworCSAqLworCXJlcSA9IGttZW1fY2FjaGVfYWxsb2Moc3djcl9yZXFfY2FjaGUsIFNMQUJfQVRPTUlDKTsKKwlpZiAocmVxID09IE5VTEwpIHsKKwkJZHByaW50aygiJXMsJWQ6IEVOT01FTVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsKKwkJY3JwLT5jcnBfZXR5cGUgPSBFTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKworCXJlcS0+c3dfaGVhZCA9IHN3Y3Jfc2Vzc2lvbnNbbGlkXTsKKwlyZXEtPmNycCA9IGNycDsKKwlyZXEtPmNyZCA9IGNycC0+Y3JwX2Rlc2M7CisKKwlzd2NyX3Byb2Nlc3NfcmVxKHJlcSk7CisJcmV0dXJuIDA7CisKK2RvbmU6CisJY3J5cHRvX2RvbmUoY3JwKTsKKwlpZiAocmVxKQorCQlrbWVtX2NhY2hlX2ZyZWUoc3djcl9yZXFfY2FjaGUsIHJlcSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorY3J5cHRvc29mdF9pbml0KHZvaWQpCit7CisJaW50IGksIHN3X3R5cGUsIG1vZGU7CisJY2hhciAqYWxnbzsKKworCWRwcmludGsoIiVzKCVwKVxuIiwgX19GVU5DVElPTl9fLCBjcnlwdG9zb2Z0X2luaXQpOworCisJc3djcl9yZXFfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiY3J5cHRvc29mdF9yZXEiLAorCQkJCXNpemVvZihzdHJ1Y3Qgc3djcl9yZXEpLCAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjMpCisJCQkJLCBOVUxMCisjZW5kaWYKKwkJCQkpOworCWlmICghc3djcl9yZXFfY2FjaGUpIHsKKwkJcHJpbnRrKCJjcnlwdG9zb2Z0OiBmYWlsZWQgdG8gY3JlYXRlIHJlcXVlc3QgY2FjaGVcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlzb2Z0Y19kZXZpY2VfaW5pdCgmc3djcl9zb2Z0YywgImNyeXB0b3NvZnQiLCAwLCBzd2NyX21ldGhvZHMpOworCisJc3djcl9pZCA9IGNyeXB0b19nZXRfZHJpdmVyaWQoc29mdGNfZ2V0X2RldmljZSgmc3djcl9zb2Z0YyksCisJCQlDUllQVE9DQVBfRl9TT0ZUV0FSRSB8IENSWVBUT0NBUF9GX1NZTkMpOworCWlmIChzd2NyX2lkIDwgMCkgeworCQlwcmludGsoImNyeXB0b3NvZnQ6IFNvZnR3YXJlIGNyeXB0byBkZXZpY2UgY2Fubm90IGluaXRpYWxpemUhIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworI2RlZmluZQlSRUdJU1RFUihhbGcpIFwKKwkJY3J5cHRvX3JlZ2lzdGVyKHN3Y3JfaWQsIGFsZywgMCwwKQorCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihjcnlwdG9fZGV0YWlscykvc2l6ZW9mKGNyeXB0b19kZXRhaWxzWzBdKTsgaSsrKSB7CisJCWludCBmb3VuZDsKKwkJCisJCWFsZ28gPSBjcnlwdG9fZGV0YWlsc1tpXS5hbGdfbmFtZTsKKwkJaWYgKCFhbGdvIHx8ICEqYWxnbykgeworCQkJZHByaW50aygiJXM6QWxnb3JpdGhtICVkIG5vdCBzdXBwb3J0ZWRcbiIsIF9fRlVOQ1RJT05fXywgaSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCW1vZGUgPSBjcnlwdG9fZGV0YWlsc1tpXS5tb2RlOworCQlzd190eXBlID0gY3J5cHRvX2RldGFpbHNbaV0uc3dfdHlwZTsKKworCQlmb3VuZCA9IDA7CisJCXN3aXRjaCAoc3dfdHlwZSAmIFNXX1RZUEVfQUxHX01BU0spIHsKKwkJY2FzZSBTV19UWVBFX0NJUEhFUjoKKwkJCWZvdW5kID0gY3J5cHRvX2hhc19jaXBoZXIoYWxnbywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJCQlicmVhazsKKwkJY2FzZSBTV19UWVBFX0hNQUM6CisJCQlmb3VuZCA9IGNyeXB0b19oYXNfaGFzaChhbGdvLCAwLCBzd2NyX25vX2FoYXNoP0NSWVBUT19BTEdfQVNZTkM6MCk7CisJCQlicmVhazsKKwkJY2FzZSBTV19UWVBFX0hBU0g6CisJCQlmb3VuZCA9IGNyeXB0b19oYXNfaGFzaChhbGdvLCAwLCBzd2NyX25vX2FoYXNoP0NSWVBUT19BTEdfQVNZTkM6MCk7CisJCQlicmVhazsKKwkJY2FzZSBTV19UWVBFX0NPTVA6CisJCQlmb3VuZCA9IGNyeXB0b19oYXNfY29tcChhbGdvLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwkJCWJyZWFrOworCQljYXNlIFNXX1RZUEVfQkxLQ0lQSEVSOgorCQkJZm91bmQgPSBjcnlwdG9faGFzX2Jsa2NpcGhlcihhbGdvLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwkJCWlmICghZm91bmQgJiYgIXN3Y3Jfbm9fYWJsaykKKwkJCQlmb3VuZCA9IGNyeXB0b19oYXNfYWJsa2NpcGhlcihhbGdvLCAwLCAwKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmb3VuZCkgeworCQkJUkVHSVNURVIoaSk7CisJCX0gZWxzZSB7CisJCQlkcHJpbnRrKCIlczpBbGdvcml0aG0gVHlwZSAlZCBub3Qgc3VwcG9ydGVkIChhbGdvcml0aG0gJWQ6JyVzJylcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgc3dfdHlwZSwgaSwgYWxnbyk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitjcnlwdG9zb2Z0X2V4aXQodm9pZCkKK3sKKwlkcHJpbnRrKCIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCWNyeXB0b191bnJlZ2lzdGVyX2FsbChzd2NyX2lkKTsKKwlzd2NyX2lkID0gLTE7CisJa21lbV9jYWNoZV9kZXN0cm95KHN3Y3JfcmVxX2NhY2hlKTsKK30KKworbGF0ZV9pbml0Y2FsbChjcnlwdG9zb2Z0X2luaXQpOworbW9kdWxlX2V4aXQoY3J5cHRvc29mdF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRfbWNjdWxsb3VnaEBtY2FmZWUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDcnlwdG9zb2Z0IChPQ0YgbW9kdWxlIGZvciBrZXJuZWwgY3J5cHRvKSIpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL29jZi9vY2YtYmVuY2guYyBiL2NyeXB0by9vY2Yvb2NmLWJlbmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmZTlkMAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9vY2Yvb2NmLWJlbmNoLmMKQEAgLTAsMCArMSw1MTQgQEAKKy8qCisgKiBBIGxvYWRhYmxlIG1vZHVsZSB0aGF0IGJlbmNobWFya3MgdGhlIE9DRiBjcnlwdG8gc3BlZWQgZnJvbSBrZXJuZWwgc3BhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRfbWNjdWxsb3VnaEBtY2FmZWUuY29tPgorICoKKyAqIExJQ0VOU0UgVEVSTVMKKyAqCisgKiBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6CisgKgorICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKyAqCisgKiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisgKgorICogICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICogICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0CisgKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIERJU0NMQUlNRVIKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKKyAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcworICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwzOCkgJiYgIWRlZmluZWQoQVVUT0NPTkZfSU5DTFVERUQpCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGNyeXB0b2Rldi5oPgorCisjaWZkZWYgSV9IQVZFX0FOX1hTQ0FMRV9XSVRIX0lOVEVMX1NESworI2RlZmluZSBCRU5DSF9JWFBfQUNDRVNTX0xJQiAxCisjZW5kaWYKKyNpZmRlZiBCRU5DSF9JWFBfQUNDRVNTX0xJQgorI2luY2x1ZGUgPEl4VHlwZXMuaD4KKyNpbmNsdWRlIDxJeE9zQnVmZk1ndC5oPgorI2luY2x1ZGUgPEl4TnBlRGwuaD4KKyNpbmNsdWRlIDxJeENyeXB0b0FjYy5oPgorI2luY2x1ZGUgPEl4UU1nci5oPgorI2luY2x1ZGUgPEl4T3NTZXJ2aWNlcy5oPgorI2luY2x1ZGUgPEl4T3NDYWNoZU1NVS5oPgorI2VuZGlmCisKKy8qCisgKiBzdXBwb3J0IGZvciBhY2Nlc3MgbGliIHZlcnNpb24gMS40CisgKi8KKyNpZm5kZWYgSVhfTUJVRl9QUklWCisjZGVmaW5lIElYX01CVUZfUFJJVih4KSAoKHgpLT5wcml2KQorI2VuZGlmCisKKy8qCisgKiB0aGUgbnVtYmVyIG9mIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSByZXF1ZXN0cworICovCitzdGF0aWMgaW50IHJlcXVlc3RfcV9sZW4gPSA0MDsKK21vZHVsZV9wYXJhbShyZXF1ZXN0X3FfbGVuLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZXF1ZXN0X3FfbGVuLCAiTnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlcXVlc3RzIik7CisKKy8qCisgKiBob3cgbWFueSByZXF1ZXN0cyB3ZSB3YW50IHRvIGhhdmUgcHJvY2Vzc2VkCisgKi8KK3N0YXRpYyBpbnQgcmVxdWVzdF9udW0gPSAxMDI0OworbW9kdWxlX3BhcmFtKHJlcXVlc3RfbnVtLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZXF1ZXN0X251bSwgInJ1biBmb3IgYXQgbGVhc3QgdGhpcyBtYW55IHJlcXVlc3RzIik7CisKKy8qCisgKiB0aGUgc2l6ZSBvZiBlYWNoIHJlcXVlc3QKKyAqLworc3RhdGljIGludCByZXF1ZXN0X3NpemUgPSAxNDg4OworbW9kdWxlX3BhcmFtKHJlcXVlc3Rfc2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVxdWVzdF9zaXplLCAic2l6ZSBvZiBlYWNoIHJlcXVlc3QiKTsKKworLyoKKyAqIE9DRiBiYXRjaGluZyBvZiByZXF1ZXN0cworICovCitzdGF0aWMgaW50IHJlcXVlc3RfYmF0Y2ggPSAxOworbW9kdWxlX3BhcmFtKHJlcXVlc3RfYmF0Y2gsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlcXVlc3RfYmF0Y2gsICJlbmFibGUgT0NGIHJlcXVlc3QgYmF0Y2hpbmciKTsKKworLyoKKyAqIE9DRiBpbW1lZGlhdGUgY2FsbGJhY2sgb24gY29tcGxldGlvbgorICovCitzdGF0aWMgaW50IHJlcXVlc3RfY2JpbW0gPSAxOworbW9kdWxlX3BhcmFtKHJlcXVlc3RfY2JpbW0sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlcXVlc3RfY2JpbW0sICJlbmFibGUgT0NGIGltbWVkaWF0ZSBjYWxsYmFjayBvbiBjb21wbGV0aW9uIik7CisKKy8qCisgKiBhIHN0cnVjdHVyZSBmb3IgZWFjaCByZXF1ZXN0CisgKi8KK3R5cGVkZWYgc3RydWN0ICB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisjaWZkZWYgQkVOQ0hfSVhQX0FDQ0VTU19MSUIKKwlJWF9NQlVGIG1idWY7CisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7Cit9IHJlcXVlc3RfdDsKKworc3RhdGljIHJlcXVlc3RfdCAqcmVxdWVzdHM7CisKK3N0YXRpYyBzcGlubG9ja190IG9jZmJlbmNoX2NvdW50ZXJfbG9jazsKK3N0YXRpYyBpbnQgb3V0c3RhbmRpbmc7CitzdGF0aWMgaW50IHRvdGFsOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBPQ0YgYmVuY2htYXJrIHJvdXRpbmVzCisgKi8KKworc3RhdGljIHVpbnQ2NF90IG9jZl9jcnlwdG9pZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGpzdGFydCwganN0b3A7CisKK3N0YXRpYyBpbnQgb2NmX2luaXQodm9pZCk7CitzdGF0aWMgaW50IG9jZl9jYihzdHJ1Y3QgY3J5cHRvcCAqY3JwKTsKK3N0YXRpYyB2b2lkIG9jZl9yZXF1ZXN0KHZvaWQgKmFyZyk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKK3N0YXRpYyB2b2lkIG9jZl9yZXF1ZXN0X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisjZW5kaWYKKworc3RhdGljIGludAorb2NmX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGNyeXB0b2luaSBjcmllLCBjcmlhOworCXN0cnVjdCBjcnlwdG9kZXNjIGNyZGEsIGNyZGU7CisKKwltZW1zZXQoJmNyaWUsIDAsIHNpemVvZihjcmllKSk7CisJbWVtc2V0KCZjcmlhLCAwLCBzaXplb2YoY3JpYSkpOworCW1lbXNldCgmY3JkZSwgMCwgc2l6ZW9mKGNyZGUpKTsKKwltZW1zZXQoJmNyZGEsIDAsIHNpemVvZihjcmRhKSk7CisKKwljcmlhLmNyaV9hbGcgID0gQ1JZUFRPX1NIQTFfSE1BQzsKKwljcmlhLmNyaV9rbGVuID0gMjAgKiA4OworCWNyaWEuY3JpX2tleSAgPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWoiOworCisJLy9jcmllLmNyaV9hbGcgID0gQ1JZUFRPXzNERVNfQ0JDOworCWNyaWUuY3JpX2FsZyAgPSBDUllQVE9fQUVTX0NCQzsKKwljcmllLmNyaV9rbGVuID0gMjQgKiA4OworCWNyaWUuY3JpX2tleSAgPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1uIjsKKworCWNyaWUuY3JpX25leHQgPSAmY3JpYTsKKworCWVycm9yID0gY3J5cHRvX25ld3Nlc3Npb24oJm9jZl9jcnlwdG9pZCwgJmNyaWUsCisJCQkJQ1JZUFRPQ0FQX0ZfSEFSRFdBUkUgfCBDUllQVE9DQVBfRl9TT0ZUV0FSRSk7CisJaWYgKGVycm9yKSB7CisJCXByaW50aygiY3J5cHRvX25ld3Nlc3Npb24gZmFpbGVkICVkXG4iLCBlcnJvcik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK29jZl9jYihzdHJ1Y3QgY3J5cHRvcCAqY3JwKQoreworCXJlcXVlc3RfdCAqciA9IChyZXF1ZXN0X3QgKikgY3JwLT5jcnBfb3BhcXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY3JwLT5jcnBfZXR5cGUpCisJCXByaW50aygiRXJyb3IgaW4gT0NGIHByb2Nlc3Npbmc6ICVkXG4iLCBjcnAtPmNycF9ldHlwZSk7CisJY3J5cHRvX2ZyZWVyZXEoY3JwKTsKKwljcnAgPSBOVUxMOworCisJLyogZG8gYWxsIHJlcXVlc3RzICBidXQgdGFrZSBhdCBsZWFzdCAxIHNlY29uZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZvY2ZiZW5jaF9jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwl0b3RhbCsrOworCWlmICh0b3RhbCA+IHJlcXVlc3RfbnVtICYmIGpzdGFydCArIEhaIDwgamlmZmllcykgeworCQlvdXRzdGFuZGluZy0tOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvY2ZiZW5jaF9jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9jZmJlbmNoX2NvdW50ZXJfbG9jaywgZmxhZ3MpOworCisJc2NoZWR1bGVfd29yaygmci0+d29yayk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK29jZl9yZXF1ZXN0KHZvaWQgKmFyZykKK3sKKwlyZXF1ZXN0X3QgKnIgPSBhcmc7CisJc3RydWN0IGNyeXB0b3AgKmNycCA9IGNyeXB0b19nZXRyZXEoMik7CisJc3RydWN0IGNyeXB0b2Rlc2MgKmNyZGUsICpjcmRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNycCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmb2NmYmVuY2hfY291bnRlcl9sb2NrLCBmbGFncyk7CisJCW91dHN0YW5kaW5nLS07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9jZmJlbmNoX2NvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJY3JkZSA9IGNycC0+Y3JwX2Rlc2M7CisJY3JkYSA9IGNyZGUtPmNyZF9uZXh0OworCisJY3JkYS0+Y3JkX3NraXAgPSAwOworCWNyZGEtPmNyZF9mbGFncyA9IDA7CisJY3JkYS0+Y3JkX2xlbiA9IHJlcXVlc3Rfc2l6ZTsKKwljcmRhLT5jcmRfaW5qZWN0ID0gcmVxdWVzdF9zaXplOworCWNyZGEtPmNyZF9hbGcgPSBDUllQVE9fU0hBMV9ITUFDOworCWNyZGEtPmNyZF9rZXkgPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWoiOworCWNyZGEtPmNyZF9rbGVuID0gMjAgKiA4OworCisJY3JkZS0+Y3JkX3NraXAgPSAwOworCWNyZGUtPmNyZF9mbGFncyA9IENSRF9GX0lWX0VYUExJQ0lUIHwgQ1JEX0ZfRU5DUllQVDsKKwljcmRlLT5jcmRfbGVuID0gcmVxdWVzdF9zaXplOworCWNyZGUtPmNyZF9pbmplY3QgPSByZXF1ZXN0X3NpemU7CisJLy9jcmRlLT5jcmRfYWxnID0gQ1JZUFRPXzNERVNfQ0JDOworCWNyZGUtPmNyZF9hbGcgPSBDUllQVE9fQUVTX0NCQzsKKwljcmRlLT5jcmRfa2V5ID0gIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbiI7CisJY3JkZS0+Y3JkX2tsZW4gPSAyNCAqIDg7CisKKwljcnAtPmNycF9pbGVuID0gcmVxdWVzdF9zaXplICsgNjQ7CisJY3JwLT5jcnBfZmxhZ3MgPSAwOworCWlmIChyZXF1ZXN0X2JhdGNoKQorCQljcnAtPmNycF9mbGFncyB8PSBDUllQVE9fRl9CQVRDSDsKKwlpZiAocmVxdWVzdF9jYmltbSkKKwkJY3JwLT5jcnBfZmxhZ3MgfD0gQ1JZUFRPX0ZfQ0JJTU07CisJY3JwLT5jcnBfYnVmID0gKGNhZGRyX3QpIHItPmJ1ZmZlcjsKKwljcnAtPmNycF9jYWxsYmFjayA9IG9jZl9jYjsKKwljcnAtPmNycF9zaWQgPSBvY2ZfY3J5cHRvaWQ7CisJY3JwLT5jcnBfb3BhcXVlID0gKGNhZGRyX3QpIHI7CisJY3J5cHRvX2Rpc3BhdGNoKGNycCk7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorc3RhdGljIHZvaWQKK29jZl9yZXF1ZXN0X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlyZXF1ZXN0X3QgKnIgPSBjb250YWluZXJfb2Yod29yaywgcmVxdWVzdF90LCB3b3JrKTsKKwlvY2ZfcmVxdWVzdChyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorb2NmX2RvbmUodm9pZCkKK3sKKwljcnlwdG9fZnJlZXNlc3Npb24ob2NmX2NyeXB0b2lkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQkVOQ0hfSVhQX0FDQ0VTU19MSUIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIENyeXB0b0FjYyBiZW5jaG1hcmsgcm91dGluZXMKKyAqLworCitzdGF0aWMgSXhDcnlwdG9BY2NDdHggaXhwX2N0eDsKK3N0YXRpYyBVSU5UMzIgaXhwX2N0eF9pZDsKK3N0YXRpYyBJWF9NQlVGIGl4cF9wcmk7CitzdGF0aWMgSVhfTUJVRiBpeHBfc2VjOworc3RhdGljIGludCBpeHBfcmVnaXN0ZXJlZCA9IDA7CisKK3N0YXRpYyB2b2lkIGl4cF9yZWdpc3Rlcl9jYihVSU5UMzIgY3R4X2lkLCBJWF9NQlVGICpidWZwLAorCQkJCQlJeENyeXB0b0FjY1N0YXR1cyBzdGF0dXMpOworc3RhdGljIHZvaWQgaXhwX3BlcmZvcm1fY2IoVUlOVDMyIGN0eF9pZCwgSVhfTUJVRiAqc2J1ZnAsIElYX01CVUYgKmRidWZwLAorCQkJCQlJeENyeXB0b0FjY1N0YXR1cyBzdGF0dXMpOworc3RhdGljIHZvaWQgaXhwX3JlcXVlc3Qodm9pZCAqYXJnKTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorc3RhdGljIHZvaWQgaXhwX3JlcXVlc3Rfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKyNlbmRpZgorCitzdGF0aWMgaW50CitpeHBfaW5pdCh2b2lkKQoreworCUl4Q3J5cHRvQWNjU3RhdHVzIHN0YXR1czsKKworCWl4cF9jdHguY2lwaGVyQ3R4LmNpcGhlckFsZ28gPSBJWF9DUllQVE9fQUNDX0NJUEhFUl8zREVTOworCWl4cF9jdHguY2lwaGVyQ3R4LmNpcGhlck1vZGUgPSBJWF9DUllQVE9fQUNDX01PREVfQ0JDOworCWl4cF9jdHguY2lwaGVyQ3R4LmNpcGhlcktleUxlbiA9IDI0OworCWl4cF9jdHguY2lwaGVyQ3R4LmNpcGhlckJsb2NrTGVuID0gSVhfQ1JZUFRPX0FDQ19ERVNfQkxPQ0tfNjQ7CisJaXhwX2N0eC5jaXBoZXJDdHguY2lwaGVySW5pdGlhbFZlY3RvckxlbiA9IElYX0NSWVBUT19BQ0NfREVTX0lWXzY0OworCW1lbWNweShpeHBfY3R4LmNpcGhlckN0eC5rZXkuY2lwaGVyS2V5LCAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1uIiwgMjQpOworCisJaXhwX2N0eC5hdXRoQ3R4LmF1dGhBbGdvID0gSVhfQ1JZUFRPX0FDQ19BVVRIX1NIQTE7CisJaXhwX2N0eC5hdXRoQ3R4LmF1dGhEaWdlc3RMZW4gPSAxMjsKKwlpeHBfY3R4LmF1dGhDdHguYWFkTGVuID0gMDsKKwlpeHBfY3R4LmF1dGhDdHguYXV0aEtleUxlbiA9IDIwOworCW1lbWNweShpeHBfY3R4LmF1dGhDdHgua2V5LmF1dGhLZXksICIwMTIzNDU2Nzg5YWJjZGVmZ2hpaiIsIDIwKTsKKworCWl4cF9jdHgudXNlRGlmZmVyZW50U3JjQW5kRGVzdE1idWZzID0gMDsKKwlpeHBfY3R4Lm9wZXJhdGlvbiA9IElYX0NSWVBUT19BQ0NfT1BfRU5DUllQVF9BVVRIIDsKKworCUlYX01CVUZfTUxFTigmaXhwX3ByaSkgID0gSVhfTUJVRl9QS1RfTEVOKCZpeHBfcHJpKSA9IDEyODsKKwlJWF9NQlVGX01EQVRBKCZpeHBfcHJpKSA9ICh1bnNpZ25lZCBjaGFyICopIGttYWxsb2MoMTI4LCBTTEFCX0FUT01JQyk7CisJSVhfTUJVRl9NTEVOKCZpeHBfc2VjKSAgPSBJWF9NQlVGX1BLVF9MRU4oJml4cF9zZWMpID0gMTI4OworCUlYX01CVUZfTURBVEEoJml4cF9zZWMpID0gKHVuc2lnbmVkIGNoYXIgKikga21hbGxvYygxMjgsIFNMQUJfQVRPTUlDKTsKKworCXN0YXR1cyA9IGl4Q3J5cHRvQWNjQ3R4UmVnaXN0ZXIoJml4cF9jdHgsICZpeHBfcHJpLCAmaXhwX3NlYywKKwkJCWl4cF9yZWdpc3Rlcl9jYiwgaXhwX3BlcmZvcm1fY2IsICZpeHBfY3R4X2lkKTsKKworCWlmIChJWF9DUllQVE9fQUNDX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworCQl3aGlsZSAoIWl4cF9yZWdpc3RlcmVkKQorCQkJc2NoZWR1bGUoKTsKKwkJcmV0dXJuIGl4cF9yZWdpc3RlcmVkIDwgMCA/IC0xIDogMDsKKwl9CisKKwlwcmludGsoIml4cDogaXhDcnlwdG9BY2NDdHhSZWdpc3RlciBmYWlsZWQgJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAoraXhwX3JlZ2lzdGVyX2NiKFVJTlQzMiBjdHhfaWQsIElYX01CVUYgKmJ1ZnAsIEl4Q3J5cHRvQWNjU3RhdHVzIHN0YXR1cykKK3sKKwlpZiAoYnVmcCkgeworCQlJWF9NQlVGX01MRU4oYnVmcCkgPSBJWF9NQlVGX1BLVF9MRU4oYnVmcCkgPSAwOworCQlrZnJlZShJWF9NQlVGX01EQVRBKGJ1ZnApKTsKKwkJSVhfTUJVRl9NREFUQShidWZwKSA9IE5VTEw7CisJfQorCisJaWYgKElYX0NSWVBUT19BQ0NfU1RBVFVTX1dBSVQgPT0gc3RhdHVzKQorCQlyZXR1cm47CisJaWYgKElYX0NSWVBUT19BQ0NfU1RBVFVTX1NVQ0NFU1MgPT0gc3RhdHVzKQorCQlpeHBfcmVnaXN0ZXJlZCA9IDE7CisJZWxzZQorCQlpeHBfcmVnaXN0ZXJlZCA9IC0xOworfQorCitzdGF0aWMgdm9pZAoraXhwX3BlcmZvcm1fY2IoCisJVUlOVDMyIGN0eF9pZCwKKwlJWF9NQlVGICpzYnVmcCwKKwlJWF9NQlVGICpkYnVmcCwKKwlJeENyeXB0b0FjY1N0YXR1cyBzdGF0dXMpCit7CisJcmVxdWVzdF90ICpyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogZG8gYWxsIHJlcXVlc3RzICBidXQgdGFrZSBhdCBsZWFzdCAxIHNlY29uZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZvY2ZiZW5jaF9jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwl0b3RhbCsrOworCWlmICh0b3RhbCA+IHJlcXVlc3RfbnVtICYmIGpzdGFydCArIEhaIDwgamlmZmllcykgeworCQlvdXRzdGFuZGluZy0tOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvY2ZiZW5jaF9jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghc2J1ZnAgfHwgIShyID0gSVhfTUJVRl9QUklWKHNidWZwKSkpIHsKKwkJcHJpbnRrKCJjcmFwcG8gJXAgJXBcbiIsIHNidWZwLCByKTsKKwkJb3V0c3RhbmRpbmctLTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2NmYmVuY2hfY291bnRlcl9sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2NmYmVuY2hfY291bnRlcl9sb2NrLCBmbGFncyk7CisKKwlzY2hlZHVsZV93b3JrKCZyLT53b3JrKTsKK30KKworc3RhdGljIHZvaWQKK2l4cF9yZXF1ZXN0KHZvaWQgKmFyZykKK3sKKwlyZXF1ZXN0X3QgKnIgPSBhcmc7CisJSXhDcnlwdG9BY2NTdGF0dXMgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltZW1zZXQoJnItPm1idWYsIDAsIHNpemVvZihyLT5tYnVmKSk7CisJSVhfTUJVRl9NTEVOKCZyLT5tYnVmKSA9IElYX01CVUZfUEtUX0xFTigmci0+bWJ1ZikgPSByZXF1ZXN0X3NpemUgKyA2NDsKKwlJWF9NQlVGX01EQVRBKCZyLT5tYnVmKSA9IHItPmJ1ZmZlcjsKKwlJWF9NQlVGX1BSSVYoJnItPm1idWYpID0gcjsKKwlzdGF0dXMgPSBpeENyeXB0b0FjY0F1dGhDcnlwdFBlcmZvcm0oaXhwX2N0eF9pZCwgJnItPm1idWYsIE5VTEwsCisJCQkwLCByZXF1ZXN0X3NpemUsIDAsIHJlcXVlc3Rfc2l6ZSwgcmVxdWVzdF9zaXplLCByLT5idWZmZXIpOworCWlmIChJWF9DUllQVE9fQUNDX1NUQVRVU19TVUNDRVNTICE9IHN0YXR1cykgeworCQlwcmludGsoInN0YXR1czEgPSAlZFxuIiwgc3RhdHVzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm9jZmJlbmNoX2NvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlvdXRzdGFuZGluZy0tOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvY2ZiZW5jaF9jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlyZXR1cm47Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorc3RhdGljIHZvaWQKK2l4cF9yZXF1ZXN0X3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlyZXF1ZXN0X3QgKnIgPSBjb250YWluZXJfb2Yod29yaywgcmVxdWVzdF90LCB3b3JrKTsKKwlpeHBfcmVxdWVzdChyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAoraXhwX2RvbmUodm9pZCkKK3sKKwkvKiB3ZSBzaG91bGQgZnJlZSB0aGUgc2Vzc2lvbiBoZXJlIGJ1dCBJIGFtIGxhenkgOi0pICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIEJFTkNIX0lYUF9BQ0NFU1NfTElCICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CitvY2ZiZW5jaF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBtYnBzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcmludGsoIkNyeXB0byBTcGVlZCB0ZXN0c1xuIik7CisKKwlyZXF1ZXN0cyA9IGttYWxsb2Moc2l6ZW9mKHJlcXVlc3RfdCkgKiByZXF1ZXN0X3FfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcXVlc3RzKSB7CisJCXByaW50aygibWFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0X3FfbGVuOyBpKyspIHsKKwkJLyogKzY0IGZvciByZXR1cm4gZGF0YSAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjApCisJCUlOSVRfV09SSygmcmVxdWVzdHNbaV0ud29yaywgb2NmX3JlcXVlc3Rfd3EpOworI2Vsc2UKKwkJSU5JVF9XT1JLKCZyZXF1ZXN0c1tpXS53b3JrLCBvY2ZfcmVxdWVzdCwgJnJlcXVlc3RzW2ldKTsKKyNlbmRpZgorCQlyZXF1ZXN0c1tpXS5idWZmZXIgPSBrbWFsbG9jKHJlcXVlc3Rfc2l6ZSArIDEyOCwgR0ZQX0RNQSk7CisJCWlmICghcmVxdWVzdHNbaV0uYnVmZmVyKSB7CisJCQlwcmludGsoIm1hbGxvYyBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWVtc2V0KHJlcXVlc3RzW2ldLmJ1ZmZlciwgJzAnICsgaSwgcmVxdWVzdF9zaXplICsgMTI4KTsKKwl9CisKKwkvKgorCSAqIE9DRiBiZW5jaG1hcmsKKwkgKi8KKwlwcmludGsoIk9DRjogdGVzdGluZyAuLi5cbiIpOworCWlmIChvY2ZfaW5pdCgpID09IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pbml0KCZvY2ZiZW5jaF9jb3VudGVyX2xvY2spOworCXRvdGFsID0gb3V0c3RhbmRpbmcgPSAwOworCWpzdGFydCA9IGppZmZpZXM7CisJZm9yIChpID0gMDsgaSA8IHJlcXVlc3RfcV9sZW47IGkrKykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmb2NmYmVuY2hfY291bnRlcl9sb2NrLCBmbGFncyk7CisJCW91dHN0YW5kaW5nKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9jZmJlbmNoX2NvdW50ZXJfbG9jaywgZmxhZ3MpOworCQlvY2ZfcmVxdWVzdCgmcmVxdWVzdHNbaV0pOworCX0KKwl3aGlsZSAob3V0c3RhbmRpbmcgPiAwKQorCQlzY2hlZHVsZSgpOworCWpzdG9wID0gamlmZmllczsKKworCW1icHMgPSAwOworCWlmIChqc3RvcCA+IGpzdGFydCkgeworCQltYnBzID0gKHVuc2lnbmVkIGxvbmcpIHRvdGFsICogKHVuc2lnbmVkIGxvbmcpIHJlcXVlc3Rfc2l6ZSAqIDg7CisJCW1icHMgLz0gKChqc3RvcCAtIGpzdGFydCkgKiAxMDAwKSAvIEhaOworCX0KKwlwcmludGsoIk9DRjogJWQgcmVxdWVzdHMgb2YgJWQgYnl0ZXMgaW4gJWQgamlmZmllcyAoJWQuJTAzZCBNYnBzKVxuIiwKKwkJCXRvdGFsLCByZXF1ZXN0X3NpemUsIChpbnQpKGpzdG9wIC0ganN0YXJ0KSwKKwkJCSgoaW50KW1icHMpIC8gMTAwMCwgKChpbnQpbWJwcykgJSAxMDAwKTsKKwlvY2ZfZG9uZSgpOworCisjaWZkZWYgQkVOQ0hfSVhQX0FDQ0VTU19MSUIKKwkvKgorCSAqIElYUCBiZW5jaG1hcmsKKwkgKi8KKwlwcmludGsoIklYUDogdGVzdGluZyAuLi5cbiIpOworCWl4cF9pbml0KCk7CisJdG90YWwgPSBvdXRzdGFuZGluZyA9IDA7CisJanN0YXJ0ID0gamlmZmllczsKKwlmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdF9xX2xlbjsgaSsrKSB7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKwkJSU5JVF9XT1JLKCZyZXF1ZXN0c1tpXS53b3JrLCBpeHBfcmVxdWVzdF93cSk7CisjZWxzZQorCQlJTklUX1dPUksoJnJlcXVlc3RzW2ldLndvcmssIGl4cF9yZXF1ZXN0LCAmcmVxdWVzdHNbaV0pOworI2VuZGlmCisJCXNwaW5fbG9ja19pcnFzYXZlKCZvY2ZiZW5jaF9jb3VudGVyX2xvY2ssIGZsYWdzKTsKKwkJb3V0c3RhbmRpbmcrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2NmYmVuY2hfY291bnRlcl9sb2NrLCBmbGFncyk7CisJCWl4cF9yZXF1ZXN0KCZyZXF1ZXN0c1tpXSk7CisJfQorCXdoaWxlIChvdXRzdGFuZGluZyA+IDApCisJCXNjaGVkdWxlKCk7CisJanN0b3AgPSBqaWZmaWVzOworCisJbWJwcyA9IDA7CisJaWYgKGpzdG9wID4ganN0YXJ0KSB7CisJCW1icHMgPSAodW5zaWduZWQgbG9uZykgdG90YWwgKiAodW5zaWduZWQgbG9uZykgcmVxdWVzdF9zaXplICogODsKKwkJbWJwcyAvPSAoKGpzdG9wIC0ganN0YXJ0KSAqIDEwMDApIC8gSFo7CisJfQorCXByaW50aygiSVhQOiAlZCByZXF1ZXN0cyBvZiAlZCBieXRlcyBpbiAlZCBqaWZmaWVzICglZC4lMDNkIE1icHMpXG4iLAorCQkJdG90YWwsIHJlcXVlc3Rfc2l6ZSwganN0b3AgLSBqc3RhcnQsCisJCQkoKGludCltYnBzKSAvIDEwMDAsICgoaW50KW1icHMpICUgMTAwMCk7CisJaXhwX2RvbmUoKTsKKyNlbmRpZiAvKiBCRU5DSF9JWFBfQUNDRVNTX0xJQiAqLworCisJZm9yIChpID0gMDsgaSA8IHJlcXVlc3RfcV9sZW47IGkrKykKKwkJa2ZyZWUocmVxdWVzdHNbaV0uYnVmZmVyKTsKKwlrZnJlZShyZXF1ZXN0cyk7CisJcmV0dXJuIC1FSU5WQUw7IC8qIGFsd2F5cyBmYWlsIHRvIGxvYWQgc28gaXQgY2FuIGJlIHJlLXJ1biBxdWlja2x5IDstKSAqLworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb2NmYmVuY2hfZXhpdCh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChvY2ZiZW5jaF9pbml0KTsKK21vZHVsZV9leGl0KG9jZmJlbmNoX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiQlNEIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZF9tY2N1bGxvdWdoQG1jYWZlZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJlbmNobWFyayB2YXJpb3VzIGluLWtlcm5lbCBjcnlwdG8gc3BlZWRzIik7CmRpZmYgLS1naXQgYS9jcnlwdG8vb2NmL29jZi1jb21wYXQuaCBiL2NyeXB0by9vY2Yvb2NmLWNvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDEyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vb2NmL29jZi1jb21wYXQuaApAQCAtMCwwICsxLDM3MiBAQAorI2lmbmRlZiBfQlNEX0NPTVBBVF9IXworI2RlZmluZSBfQlNEX0NPTVBBVF9IXyAxCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBQcm92aWRlIGNvbXBhdCByb3V0aW5lcyBmb3Igb2xkZXIgbGludXgga2VybmVscyBhbmQgQlNEIGtlcm5lbHMKKyAqCisgKiBXcml0dGVuIGJ5IERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkX21jY3VsbG91Z2hAbWNhZmVlLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZF9tY2N1bGxvdWdoQG1jYWZlZS5jb20+CisgKgorICogTElDRU5TRSBURVJNUworICoKKyAqIFRoZSBmcmVlIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIG9mIHRoaXMgc29mdHdhcmUgaW4gYm90aCBzb3VyY2UgYW5kIGJpbmFyeQorICogZm9ybSBpcyBhbGxvd2VkICh3aXRoIG9yIHdpdGhvdXQgY2hhbmdlcykgcHJvdmlkZWQgdGhhdDoKKyAqCisgKiAgIDEuIGRpc3RyaWJ1dGlvbnMgb2YgdGhpcyBzb3VyY2UgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyOworICoKKyAqICAgMi4gZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiAgICAgIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBhc3NvY2lhdGVkIG1hdGVyaWFsczsKKyAqCisgKiAgIDMuIHRoZSBjb3B5cmlnaHQgaG9sZGVyJ3MgbmFtZSBpcyBub3QgdXNlZCB0byBlbmRvcnNlIHByb2R1Y3RzCisgKiAgICAgIGJ1aWx0IHVzaW5nIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyByZXRhaW5lZCBpbiBmdWxsLCB0aGlzIGZpbGUKKyAqIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFwcGx5IElOU1RFQUQgT0YgdGhvc2UgZ2l2ZW4gYWJvdmUuCisgKgorICogRElTQ0xBSU1FUgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzIGlzJyB3aXRoIG5vIGV4cGxpY2l0IG9yIGltcGxpZWQgd2FycmFudGllcworICogaW4gcmVzcGVjdCBvZiBpdHMgcHJvcGVydGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIGNvcnJlY3RuZXNzCisgKiBhbmQvb3IgZml0bmVzcyBmb3IgcHVycG9zZS4KKyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMzgpICYmICFkZWZpbmVkKEFVVE9DT05GX0lOQ0xVREVEKQorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCisKKy8qCisgKiBmYWtlIHNvbWUgQlNEIGRyaXZlciBpbnRlcmZhY2Ugc3R1ZmYgc3BlY2lmaWNhbGx5IGZvciBPQ0YgdXNlCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgb2NmX2RldmljZSAqZGV2aWNlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgKCpjcnlwdG9kZXZfbmV3c2Vzc2lvbikoZGV2aWNlX3QgZGV2LCB1X2ludDMyX3QgKnNpZHAsIHN0cnVjdCBjcnlwdG9pbmkgKmNyaSk7CisJaW50ICgqY3J5cHRvZGV2X2ZyZWVzZXNzaW9uKShkZXZpY2VfdCBkZXYsIHVfaW50NjRfdCB0aWQpOworCWludCAoKmNyeXB0b2Rldl9wcm9jZXNzKShkZXZpY2VfdCBkZXYsIHN0cnVjdCBjcnlwdG9wICpjcnAsIGludCBoaW50KTsKKwlpbnQgKCpjcnlwdG9kZXZfa3Byb2Nlc3MpKGRldmljZV90IGRldiwgc3RydWN0IGNyeXB0a29wICprcnAsIGludCBoaW50KTsKK30gZGV2aWNlX21ldGhvZF90OworI2RlZmluZSBERVZNRVRIT0QoaWQsIGZ1bmMpCWlkOiBmdW5jCisKK3N0cnVjdCBvY2ZfZGV2aWNlIHsKKwljaGFyIG5hbWVbMzJdOwkJLyogdGhlIGRyaXZlciBuYW1lICovCisJY2hhciBuYW1ldW5pdFszMl07CS8qIHRoZSBkcml2ZXIgbmFtZSArIEhXIGluc3RhbmNlICovCisJaW50ICB1bml0OworCWRldmljZV9tZXRob2RfdAltZXRob2RzOworCXZvaWQgKnNvZnRjOworfTsKKworI2RlZmluZSBDUllQVE9ERVZfTkVXU0VTU0lPTihkZXYsIHNpZCwgY3JpKSBcCisJKCgqKGRldiktPm1ldGhvZHMuY3J5cHRvZGV2X25ld3Nlc3Npb24pKGRldixzaWQsY3JpKSkKKyNkZWZpbmUgQ1JZUFRPREVWX0ZSRUVTRVNTSU9OKGRldiwgc2lkKSBcCisJKCgqKGRldiktPm1ldGhvZHMuY3J5cHRvZGV2X2ZyZWVzZXNzaW9uKShkZXYsIHNpZCkpCisjZGVmaW5lIENSWVBUT0RFVl9QUk9DRVNTKGRldiwgY3JwLCBoaW50KSBcCisJKCgqKGRldiktPm1ldGhvZHMuY3J5cHRvZGV2X3Byb2Nlc3MpKGRldiwgY3JwLCBoaW50KSkKKyNkZWZpbmUgQ1JZUFRPREVWX0tQUk9DRVNTKGRldiwga3JwLCBoaW50KSBcCisJKCgqKGRldiktPm1ldGhvZHMuY3J5cHRvZGV2X2twcm9jZXNzKShkZXYsIGtycCwgaGludCkpCisKKyNkZWZpbmUgZGV2aWNlX2dldF9uYW1lKGRldikJKChkZXYpLT5uYW1lKQorI2RlZmluZSBkZXZpY2VfZ2V0X25hbWV1bml0KGRldikJKChkZXYpLT5uYW1ldW5pdCkKKyNkZWZpbmUgZGV2aWNlX2dldF91bml0KGRldikJKChkZXYpLT51bml0KQorI2RlZmluZSBkZXZpY2VfZ2V0X3NvZnRjKGRldikJKChkZXYpLT5zb2Z0YykKKworI2RlZmluZQlzb2Z0Y19kZXZpY2VfZGVjbCBcCisJCXN0cnVjdCBvY2ZfZGV2aWNlIF9kZXZpY2U7IFwKKwkJZGV2aWNlX3QKKworI2RlZmluZQlzb2Z0Y19kZXZpY2VfaW5pdChfc2MsIF9uYW1lLCBfdW5pdCwgX21ldGhvZHMpIFwKKwlpZiAoMSkge1wKKwlzdHJuY3B5KChfc2MpLT5fZGV2aWNlLm5hbWUsIF9uYW1lLCBzaXplb2YoKF9zYyktPl9kZXZpY2UubmFtZSkgLSAxKTsgXAorCXNucHJpbnRmKChfc2MpLT5fZGV2aWNlLm5hbWV1bml0LCBzaXplb2YoKF9zYyktPl9kZXZpY2UubmFtZSksICIlcyVkIiwgX25hbWUsIF91bml0KTsgXAorCShfc2MpLT5fZGV2aWNlLnVuaXQgPSBfdW5pdDsgXAorCShfc2MpLT5fZGV2aWNlLm1ldGhvZHMgPSBfbWV0aG9kczsgXAorCShfc2MpLT5fZGV2aWNlLnNvZnRjID0gKHZvaWQgKikgX3NjOyBcCisJKihkZXZpY2VfdCAqKSgoc29mdGNfZ2V0X2RldmljZShfc2MpKSsxKSA9ICYoX3NjKS0+X2RldmljZTsgXAorCX0gZWxzZQorCisjZGVmaW5lCXNvZnRjX2dldF9kZXZpY2UoX3NjKQkoJihfc2MpLT5fZGV2aWNlKQorCisvKgorICogaW9tZW0gc3VwcG9ydCBmb3IgMi40IGFuZCAyLjYga2VybmVscworICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorI2RlZmluZSBvY2ZfaW9tZW1fdAl1bnNpZ25lZCBsb25nCisKKy8qCisgKiBpbXBsZW1lbnQgc2ltcGxlIHdvcmtxdWV1ZSBsaWtlIHN1cHBvcnQgZm9yIG9sZGVyIGtlcm5lbHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHF1ZXVlLmg+CisKKyNkZWZpbmUgd29ya19zdHJ1Y3QgdHFfc3RydWN0CisKKyNkZWZpbmUgSU5JVF9XT1JLKHdwLCBmcCwgYXApIFwKKwlkbyB7IFwKKwkJKHdwKS0+c3luYyA9IDA7IFwKKwkJKHdwKS0+cm91dGluZSA9IChmcCk7IFwKKwkJKHdwKS0+ZGF0YSA9IChhcCk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHNjaGVkdWxlX3dvcmsod3ApIFwKKwlkbyB7IFwKKwkJcXVldWVfdGFzaygod3ApLCAmdHFfaW1tZWRpYXRlKTsgXAorCQltYXJrX2JoKElNTUVESUFURV9CSCk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIGZsdXNoX3NjaGVkdWxlZF93b3JrKCkJcnVuX3Rhc2tfcXVldWUoJnRxX2ltbWVkaWF0ZSkKKworI2Vsc2UKKyNkZWZpbmUgb2NmX2lvbWVtX3QJdm9pZCBfX2lvbWVtICoKKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjYpCisjaW5jbHVkZSA8bGludXgvZmR0YWJsZS5oPgorI2VsaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDExKQorI2RlZmluZSBmaWxlc19mZHRhYmxlKGZpbGVzKQkoZmlsZXMpCisjZW5kaWYKKworI2lmZGVmIE1PRFVMRV9QQVJNCisjdW5kZWYgbW9kdWxlX3BhcmFtCS8qIGp1c3QgaW4gY2FzZSAqLworI2RlZmluZQltb2R1bGVfcGFyYW0oYSxiLGMpCQlNT0RVTEVfUEFSTShhLCJpIikKKyNlbmRpZgorCisjZGVmaW5lIGJ6ZXJvKHMsbCkJCW1lbXNldChzLDAsbCkKKyNkZWZpbmUgYmNvcHkocyxkLGwpCW1lbWNweShkLHMsbCkKKyNkZWZpbmUgYmNtcCh4LCB5LCBsKQltZW1jbXAoeCx5LGwpCisKKyNkZWZpbmUgTUlOKHgseSkJKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKKworI2RlZmluZSBkZXZpY2VfcHJpbnRmKGRldiwgYS4uLikgKHsgXAorCQkJCXByaW50aygiJXM6ICIsIGRldmljZV9nZXRfbmFtZXVuaXQoZGV2KSk7IHByaW50ayhhKTsgXAorCQkJfSkKKworI3VuZGVmIHByaW50ZgorI2RlZmluZSBwcmludGYoZm10Li4uKQlwcmludGsoZm10KQorCisjZGVmaW5lIEtBU1NFUlQoYyxwKQlpZiAoIShjKSkgeyBwcmludGsgcCA7IH0gZWxzZQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisjZGVmaW5lIG9jZl9kYWVtb25pemUoc3RyKSBcCisJZGFlbW9uaXplKCk7IFwKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdtYXNrX2xvY2spOyBcCisJc2lnZW1wdHlzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOyBcCisJcmVjYWxjX3NpZ3BlbmRpbmcoY3VycmVudCk7IFwKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ21hc2tfbG9jayk7IFwKKwlzcHJpbnRmKGN1cnJlbnQtPmNvbW0sIHN0cik7CisjZWxzZQorI2RlZmluZSBvY2ZfZGFlbW9uaXplKHN0cikgZGFlbW9uaXplKHN0cik7CisjZW5kaWYKKworI2RlZmluZQlUQUlMUV9JTlNFUlRfVEFJTChxLGQsbSkgbGlzdF9hZGRfdGFpbCgmKGQpLT5tLCAocSkpCisjZGVmaW5lCVRBSUxRX0VNUFRZKHEpCWxpc3RfZW1wdHkocSkKKyNkZWZpbmUJVEFJTFFfRk9SRUFDSCh2LCBxLCBtKSBsaXN0X2Zvcl9lYWNoX2VudHJ5KHYsIHEsIG0pCisKKyNkZWZpbmUgcmVhZF9yYW5kb20ocCxsKSBnZXRfcmFuZG9tX2J5dGVzKHAsbCkKKworI2RlZmluZSBERUxBWSh4KQkoKHgpID4gMjAwMCA/IG1kZWxheSgoeCkvMTAwMCkgOiB1ZGVsYXkoeCkpCisjZGVmaW5lIHN0cnRvdWwgc2ltcGxlX3N0cnRvdWwKKworI2RlZmluZSBwY2lfZ2V0X3ZlbmRvcihkZXYpCSgoZGV2KS0+dmVuZG9yKQorI2RlZmluZSBwY2lfZ2V0X2RldmljZShkZXYpCSgoZGV2KS0+ZGV2aWNlKQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisjZGVmaW5lIHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhkZXYsIG1hc2spICgwKQorI2VuZGlmCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorI2RlZmluZSBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUgcGNpX2RtYV9zeW5jX3NpbmdsZQorI2VuZGlmCisKKyNpZm5kZWYgRE1BXzMyQklUX01BU0sKKyNkZWZpbmUgRE1BXzMyQklUX01BU0sgIDB4MDAwMDAwMDBmZmZmZmZmZlVMTAorI2VuZGlmCisKKyNpZm5kZWYgaHRvbGUzMgorI2RlZmluZSBodG9sZTMyKHgpCWNwdV90b19sZTMyKHgpCisjZW5kaWYKKyNpZm5kZWYgaHRvYmUzMgorI2RlZmluZSBodG9iZTMyKHgpCWNwdV90b19iZTMyKHgpCisjZW5kaWYKKyNpZm5kZWYgaHRvbGUxNgorI2RlZmluZSBodG9sZTE2KHgpCWNwdV90b19sZTE2KHgpCisjZW5kaWYKKyNpZm5kZWYgaHRvYmUxNgorI2RlZmluZSBodG9iZTE2KHgpCWNwdV90b19iZTE2KHgpCisjZW5kaWYKKworLyogb2xkZXIga2VybmVscyBkb24ndCBoYXZlIHRoZXNlICovCisKKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaWYgIWRlZmluZWQoSVJRX05PTkUpICYmICFkZWZpbmVkKElSUV9SRVRWQUwpCisjZGVmaW5lIElSUV9OT05FCisjZGVmaW5lIElSUV9IQU5ETEVECisjZGVmaW5lIElSUV9XQUtFX1RIUkVBRAorI2RlZmluZSBJUlFfUkVUVkFMCisjZGVmaW5lIGlycXJldHVybl90IHZvaWQKK3R5cGVkZWYgaXJxcmV0dXJuX3QgKCppcnFfaGFuZGxlcl90KShpbnQgaXJxLCB2b2lkICphcmcsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorI2lmbmRlZiBJUlFGX1NIQVJFRAorI2RlZmluZSBJUlFGX1NIQVJFRAlTQV9TSElSUQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkKKyMgZGVmaW5lIHN0cmxjcHkoZGVzdCxzcmMsbGVuKSBcCisJCSh7c3RybmNweShkZXN0LHNyYywobGVuKS0xKTsgKChjaGFyICopZGVzdClbKGxlbiktMV0gPSAnXDAnOyB9KQorI2VuZGlmCisKKyNpZm5kZWYgTUFYX0VSUk5PCisjZGVmaW5lIE1BWF9FUlJOTwk0MDk1CisjZW5kaWYKKyNpZm5kZWYgSVNfRVJSX1ZBTFVFCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNSw1KQorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2VuZGlmCisjaWZuZGVmIElTX0VSUl9WQUxVRQorI2RlZmluZSBJU19FUlJfVkFMVUUoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSA+PSAodW5zaWduZWQgbG9uZyktTUFYX0VSUk5PKQorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIGNvbW1vbiBkZWJ1ZyBmb3IgYWxsCisgKi8KKyNpZiAxCisjZGVmaW5lIGRwcmludGsoYS4uLikJZG8geyBpZiAoZGVidWcpIHByaW50ayhhKTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgZHByaW50ayhhLi4uKQorI2VuZGlmCisKKyNpZm5kZWYgU0xBQl9BVE9NSUMKKy8qIENoYW5nZWQgaW4gMi42LjIwLCBtdXN0IHVzZSBHRlBfQVRPTUlDIG5vdyAqLworI2RlZmluZQlTTEFCX0FUT01JQwlHRlBfQVRPTUlDCisjZW5kaWYKKworLyoKKyAqIG5lZWQgc29tZSBhZGRpdGlvbmFsIHN1cHBvcnQgZm9yIG9sZGVyIGtlcm5lbHMgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMikKKyNkZWZpbmUgcGNpX3JlZ2lzdGVyX2RyaXZlcl9jb21wYXQoZHJpdmVyLCByYykgXAorCWRvIHsgXAorCQlpZiAoKHJjKSA+IDApIHsgXAorCQkJKHJjKSA9IDA7IFwKKwkJfSBlbHNlIGlmIChyYyA9PSAwKSB7IFwKKwkJCShyYykgPSAtRU5PREVWOyBcCisJCX0gZWxzZSB7IFwKKwkJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcihkcml2ZXIpOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisjZWxpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTApCisjZGVmaW5lIHBjaV9yZWdpc3Rlcl9kcml2ZXJfY29tcGF0KGRyaXZlcixyYykgKChyYykgPSAocmMpIDwgMCA/IChyYykgOiAwKQorI2Vsc2UKKyNkZWZpbmUgcGNpX3JlZ2lzdGVyX2RyaXZlcl9jb21wYXQoZHJpdmVyLHJjKQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjQpCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgc2dfc2V0X3BhZ2Uoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc2ctPnBhZ2UgPSBwYWdlOworCXNnLT5vZmZzZXQgPSBvZmZzZXQ7CisJc2ctPmxlbmd0aCA9IGxlbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkICpzZ192aXJ0KHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisJcmV0dXJuIHBhZ2VfYWRkcmVzcyhzZy0+cGFnZSkgKyBzZy0+b2Zmc2V0OworfQorCisjZGVmaW5lIHNnX2luaXRfdGFibGUoc2csIG4pCisKKyNkZWZpbmUgc2dfbWFya19lbmQoc2cpCisKKyNlbmRpZgorCisjaWZuZGVmIGxhdGVfaW5pdGNhbGwKKyNkZWZpbmUgbGF0ZV9pbml0Y2FsbChpbml0KSBtb2R1bGVfaW5pdChpbml0KQorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsNCkgfHwgIWRlZmluZWQoQ09ORklHX1NNUCkKKyNkZWZpbmUgb2NmX2Zvcl9lYWNoX2NwdShjcHUpIGZvciAoKGNwdSkgPSAwOyAoY3B1KSA9PSAwOyAoY3B1KSsrKQorI2Vsc2UKKyNkZWZpbmUgb2NmX2Zvcl9lYWNoX2NwdShjcHUpIGZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyNykKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2RlZmluZQlraWxsX3Byb2MocCxzLHYpCXNlbmRfc2lnKHMsZmluZF90YXNrX2J5X3ZwaWQocCksMCkKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDQpCisKK3N0cnVjdCBvY2ZfdGhyZWFkIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CisJaW50CQkJCQkoKmZ1bmMpKHZvaWQgKmFyZyk7CisJdm9pZAkJCQkqYXJnOworfTsKKworLyogdGhyZWFkIHN0YXJ0dXAgaGVscGVyIGZ1bmMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9jZl9ydW5fdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgb2NmX3RocmVhZCAqdCA9IChzdHJ1Y3Qgb2NmX3RocmVhZCAqKSBhcmc7CisJaWYgKCF0KQorCQlyZXR1cm4gLTE7IC8qIHZlcnkgYmFkICovCisJdC0+dGFzayA9IGN1cnJlbnQ7CisJZGFlbW9uaXplKCk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnbWFza19sb2NrKTsKKwlzaWdlbXB0eXNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoY3VycmVudCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdtYXNrX2xvY2spOworCXJldHVybiAoKnQtPmZ1bmMpKHQtPmFyZyk7Cit9CisKKyNkZWZpbmUga3RocmVhZF9jcmVhdGUoZixhLGZtdC4uLikgXAorCSh7IFwKKwkJc3RydWN0IG9jZl90aHJlYWQgdDsgXAorCQlwaWRfdCBwOyBcCisJCXQudGFzayA9IE5VTEw7IFwKKwkJdC5mdW5jID0gKGYpOyBcCisJCXQuYXJnID0gKGEpOyBcCisJCXAgPSBrZXJuZWxfdGhyZWFkKG9jZl9ydW5fdGhyZWFkLCAmdCwgQ0xPTkVfRlN8Q0xPTkVfRklMRVMpOyBcCisJCXdoaWxlIChwICE9IChwaWRfdCkgLTEgJiYgdC50YXNrID09IE5VTEwpIFwKKwkJCXNjaGVkdWxlKCk7IFwKKwkJaWYgKHQudGFzaykgXAorCQkJc25wcmludGYodC50YXNrLT5jb21tLCBzaXplb2YodC50YXNrLT5jb21tKSwgZm10KTsgXAorCQkodC50YXNrKTsgXAorCX0pCisKKyNkZWZpbmUga3RocmVhZF9iaW5kKHQsY3B1KQkvKiovCisKKyNkZWZpbmUga3RocmVhZF9zaG91bGRfc3RvcCgpCShzdHJjbXAoY3VycmVudC0+Y29tbSwgInN0b3BwaW5nIikgPT0gMCkKKworI2RlZmluZSBrdGhyZWFkX3N0b3AodCkgXAorCSh7IFwKKwkJc3RyY3B5KCh0KS0+Y29tbSwgInN0b3BwaW5nIik7IFwKKwkJa2lsbF9wcm9jKCh0KS0+cGlkLCBTSUdURVJNLCAxKTsgXAorCQlkbyB7IFwKKwkJCXNjaGVkdWxlKCk7IFwKKwkJfSB3aGlsZSAoa2lsbF9wcm9jKCh0KS0+cGlkLCBTSUdURVJNLCAxKSA9PSAwKTsgXAorCX0pCisKKyNlbHNlCisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2VuZGlmCisKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDMsMiwwKQorI2RlZmluZQlza2JfZnJhZ19wYWdlKHgpCSgoeCktPnBhZ2UpCisjZW5kaWYKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYgLyogX0JTRF9DT01QQVRfSF8gKi8KZGlmZiAtLWdpdCBhL2NyeXB0by9vY2YvcmFuZG9tLmMgYi9jcnlwdG8vb2NmL3JhbmRvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjc3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9jcnlwdG8vb2NmL3JhbmRvbS5jCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogQSBzeXN0ZW0gaW5kZXBlbmRhbnQgd2F5IG9mIGFkZGluZyBlbnRyb3B5IHRvIHRoZSBrZXJuZWxzIHBvb2wKKyAqIHRoaXMgd2F5IHRoZSBkcml2ZXJzIGNhbiBmb2N1cyBvbiB0aGUgcmVhbCB3b3JrIGFuZCB3ZSBjYW4gdGFrZQorICogY2FyZSBvZiBwdXNoaW5nIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSBwbGFjZSBpbiB0aGUga2VybmVsLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGZhc3QgYW5kIGNhbGxhYmxlIGZyb20gdGltZXJzL2ludGVycnVwdHMKKyAqCisgKiBXcml0dGVuIGJ5IERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkX21jY3VsbG91Z2hAbWNhZmVlLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIERhdmlkIE1jQ3VsbG91Z2gKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIExJQ0VOU0UgVEVSTVMKKyAqCisgKiBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6CisgKgorICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKyAqCisgKiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisgKgorICogICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICogICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0CisgKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIERJU0NMQUlNRVIKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKKyAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcworICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMzgpICYmICFkZWZpbmVkKEFVVE9DT05GX0lOQ0xVREVEKQorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8Y3J5cHRvZGV2Lmg+CisKKyNpZmRlZiBDT05GSUdfT0NGX0ZJUFMKKyNpbmNsdWRlICJybmR0ZXN0LmgiCisjZW5kaWYKKworI2lmbmRlZiBIQVNfUkFORE9NX0lOUFVUX1dBSVQKKyNlcnJvciAiUGxlYXNlIGRvIG5vdCBlbmFibGUgT0NGX1JBTkRPTUhBUlZFU1QgdW5sZXNzIHlvdSBoYXZlIGFwcGxpZWQgcGF0Y2hlcyIKKyNlbmRpZgorCisvKgorICogYSBoYWNrIHRvIGFjY2VzcyB0aGUgZGVidWcgbGV2ZWxzIGZyb20gdGhlIGNyeXB0byBkcml2ZXIKKyAqLworZXh0ZXJuIGludCBjcnlwdG9fZGVidWc7CisjZGVmaW5lIGRlYnVnIGNyeXB0b19kZWJ1ZworCisvKgorICogYSBsaXN0IG9mIGFsbCByZWdpc3RlcmVkIHJhbmRvbSBwcm92aWRlcnMKKyAqLworc3RhdGljIExJU1RfSEVBRChyYW5kb21fb3BzKTsKK3N0YXRpYyBpbnQgc3RhcnRlZCA9IDA7CitzdGF0aWMgaW50IGluaXR0ZWQgPSAwOworCitzdHJ1Y3QgcmFuZG9tX29wIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJhbmRvbV9saXN0OworCXVfaW50MzJfdCBkcml2ZXJpZDsKKwlpbnQgKCpyZWFkX3JhbmRvbSkodm9pZCAqYXJnLCB1X2ludDMyX3QgKmJ1ZiwgaW50IGxlbik7CisJdm9pZCAqYXJnOworfTsKKworc3RhdGljIGludCByYW5kb21fcHJvYyh2b2lkICphcmcpOworCitzdGF0aWMgcGlkX3QJCXJhbmRvbXByb2MgPSAocGlkX3QpIC0xOworc3RhdGljIHNwaW5sb2NrX3QJcmFuZG9tX2xvY2s7CisKKy8qCisgKiBqdXN0IGluaXQgdGhlIHNwaW4gbG9ja3MKKyAqLworc3RhdGljIGludAorY3J5cHRvX3JhbmRvbV9pbml0KHZvaWQpCit7CisJc3Bpbl9sb2NrX2luaXQoJnJhbmRvbV9sb2NrKTsKKwlpbml0dGVkID0gMTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBBZGQgdGhlIGdpdmVuIHJhbmRvbSByZWFkZXIgdG8gb3VyIGxpc3QgKGlmIG5vdCBwcmVzZW50KQorICogYW5kIHN0YXJ0IHRoZSB0aHJlYWQgKGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQpCisgKgorICogd2UgaGF2ZSB0byBhc3N1bWUgdGhhdCBkcml2ZXIgaWQgaXMgb2sgZm9yIG5vdworICovCitpbnQKK2NyeXB0b19ycmVnaXN0ZXIoCisJdV9pbnQzMl90IGRyaXZlcmlkLAorCWludCAoKnJlYWRfcmFuZG9tKSh2b2lkICphcmcsIHVfaW50MzJfdCAqYnVmLCBpbnQgbGVuKSwKKwl2b2lkICphcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgcmFuZG9tX29wCSpyb3BzLCAqdG1wOworCisJZHByaW50aygiJXMsJWQ6ICVzKDB4JXgsICVwLCAlcClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXywKKwkJCV9fRlVOQ1RJT05fXywgZHJpdmVyaWQsIHJlYWRfcmFuZG9tLCBhcmcpOworCisJaWYgKCFpbml0dGVkKQorCQljcnlwdG9fcmFuZG9tX2luaXQoKTsKKworI2lmIDAKKwlzdHJ1Y3QgY3J5cHRvY2FwCSpjYXA7CisKKwljYXAgPSBjcnlwdG9fY2hlY2tkcml2ZXIoZHJpdmVyaWQpOworCWlmICghY2FwKQorCQlyZXR1cm4gRUlOVkFMOworI2VuZGlmCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocm9wcywgdG1wLCAmcmFuZG9tX29wcywgcmFuZG9tX2xpc3QpIHsKKwkJaWYgKHJvcHMtPmRyaXZlcmlkID09IGRyaXZlcmlkICYmIHJvcHMtPnJlYWRfcmFuZG9tID09IHJlYWRfcmFuZG9tKQorCQkJcmV0dXJuIEVFWElTVDsKKwl9CisKKwlyb3BzID0gKHN0cnVjdCByYW5kb21fb3AgKikga21hbGxvYyhzaXplb2YoKnJvcHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJvcHMpCisJCXJldHVybiBFTk9NRU07CisKKwlyb3BzLT5kcml2ZXJpZCAgICA9IGRyaXZlcmlkOworCXJvcHMtPnJlYWRfcmFuZG9tID0gcmVhZF9yYW5kb207CisJcm9wcy0+YXJnID0gYXJnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJhbmRvbV9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmcm9wcy0+cmFuZG9tX2xpc3QsICZyYW5kb21fb3BzKTsKKwlpZiAoIXN0YXJ0ZWQpIHsKKwkJcmFuZG9tcHJvYyA9IGtlcm5lbF90aHJlYWQocmFuZG9tX3Byb2MsIE5VTEwsIENMT05FX0ZTfENMT05FX0ZJTEVTKTsKKwkJaWYgKHJhbmRvbXByb2MgPCAwKSB7CisJCQlyZXQgPSByYW5kb21wcm9jOworCQkJcHJpbnRrKCJjcnlwdG86IGNyeXB0b19ycmVnaXN0ZXIgY2Fubm90IHN0YXJ0IHJhbmRvbSB0aHJlYWQ7ICIKKwkJCQkJImVycm9yICVkIiwgcmV0KTsKKwkJfSBlbHNlCisJCQlzdGFydGVkID0gMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmFuZG9tX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGNyeXB0b19ycmVnaXN0ZXIpOworCitpbnQKK2NyeXB0b19ydW5yZWdpc3Rlcl9hbGwodV9pbnQzMl90IGRyaXZlcmlkKQoreworCXN0cnVjdCByYW5kb21fb3AgKnJvcHMsICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRwcmludGsoIiVzLCVkOiAlcygweCV4KVxuIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18sIGRyaXZlcmlkKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyb3BzLCB0bXAsICZyYW5kb21fb3BzLCByYW5kb21fbGlzdCkgeworCQlpZiAocm9wcy0+ZHJpdmVyaWQgPT0gZHJpdmVyaWQpIHsKKwkJCWxpc3RfZGVsKCZyb3BzLT5yYW5kb21fbGlzdCk7CisJCQlrZnJlZShyb3BzKTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZyYW5kb21fbG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZyYW5kb21fb3BzKSAmJiBzdGFydGVkKQorCQlraWxsX3Byb2MocmFuZG9tcHJvYywgU0lHS0lMTCwgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmFuZG9tX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4oMCk7Cit9CitFWFBPUlRfU1lNQk9MKGNyeXB0b19ydW5yZWdpc3Rlcl9hbGwpOworCisvKgorICogd2hpbGUgd2UgY2FuIGFkZCBlbnRyb3B5IHRvIHJhbmRvbS5jIGNvbnRpbnVlIHRvIHJlYWQgcmFuZG9tIGRhdGEgZnJvbQorICogdGhlIGRyaXZlcnMgYW5kIHB1c2ggaXQgdG8gcmFuZG9tLgorICovCitzdGF0aWMgaW50CityYW5kb21fcHJvYyh2b2lkICphcmcpCit7CisJaW50IG47CisJaW50IHdhbnRjbnQ7CisJaW50IGJ1ZmNudCA9IDA7CisJaW50IHJldHZhbCA9IDA7CisJaW50ICpidWYgPSBOVUxMOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJZGFlbW9uaXplKCk7CisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnbWFza19sb2NrKTsKKwlzaWdlbXB0eXNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoY3VycmVudCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdtYXNrX2xvY2spOworCXNwcmludGYoY3VycmVudC0+Y29tbSwgIm9jZi1yYW5kb20iKTsKKyNlbHNlCisJZGFlbW9uaXplKCJvY2YtcmFuZG9tIik7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworI2VuZGlmCisKKwkodm9pZCkgZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKworI2lmZGVmIENPTkZJR19PQ0ZfRklQUworI2RlZmluZSBOVU1fSU5UIChSTkRURVNUX05CWVRFUy9zaXplb2YoaW50KSkKKyNlbHNlCisjZGVmaW5lIE5VTV9JTlQgMzIKKyNlbmRpZgorCisJLyoKKwkgKiBzb21lIGRldmljZXMgY2FuIHRyYW5zZmVyciB0aGVpciBSTkcgZGF0YSBkaXJlY3QgaW50byBtZW1vcnksCisJICogc28gbWFrZSBzdXJlIGl0IGlzIGRldmljZSBmcmllbmRseQorCSAqLworCWJ1ZiA9IGttYWxsb2MoTlVNX0lOVCAqIHNpemVvZihpbnQpLCBHRlBfRE1BKTsKKwlpZiAoTlVMTCA9PSBidWYpIHsKKwkJcHJpbnRrKCJjcnlwdG86IFJORyBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBiYWRfYWxsb2M7CisJfQorCisJd2FudGNudCA9IE5VTV9JTlQ7ICAgLyogc3RhcnQgYnkgYWRkaW5nIHNvbWUgZW50cm9weSAqLworCisJLyoKKwkgKiBpdHMgcG9zc2libGUgZHVlIHRvIGVycm9ycyBvciBkcml2ZXIgcmVtb3ZhbCB0aGF0IHdlIG5vIGxvbmdlcgorCSAqIGhhdmUgYW55dGhpbmcgdG8gZG8sICBpZiBzbyBleGl0IG9yIHdlIHdpbGwgY29uc3VtZSBhbGwgdGhlIENQVQorCSAqIGRvaW5nIG5vdGhpbmcKKwkgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJhbmRvbV9vcHMpKSB7CisJCXN0cnVjdCByYW5kb21fb3AJKnJvcHMsICp0bXA7CisKKyNpZmRlZiBDT05GSUdfT0NGX0ZJUFMKKwkJaWYgKHdhbnRjbnQpCisJCQl3YW50Y250ID0gTlVNX0lOVDsgLyogRklQcyBtb2RlIGNhbiBkbyAyMDAwMCBiaXRzIG9yIG5vbmUgKi8KKyNlbmRpZgorCisJCS8qIHNlZSBpZiB3ZSBjYW4gZ2V0IGVub3VnaCBlbnRyb3B5IHRvIG1ha2UgdGhlIHdvcmxkCisJCSAqIGEgYmV0dGVyIHBsYWNlLgorCQkgKi8KKwkJd2hpbGUgKGJ1ZmNudCA8IHdhbnRjbnQgJiYgYnVmY250IDwgTlVNX0lOVCkgeworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJvcHMsIHRtcCwgJnJhbmRvbV9vcHMsIHJhbmRvbV9saXN0KSB7CisKKwkJCQluID0gKCpyb3BzLT5yZWFkX3JhbmRvbSkocm9wcy0+YXJnLCAmYnVmW2J1ZmNudF0sCisJCQkJCQkJIE5VTV9JTlQgLSBidWZjbnQpOworCisJCQkJLyogb24gZmFpbHVyZSByZW1vdmUgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yICovCisJCQkJaWYgKG4gPT0gLTEpIHsKKwkJCQkJbGlzdF9kZWwoJnJvcHMtPnJhbmRvbV9saXN0KTsKKwkJCQkJcHJpbnRrKCJjcnlwdG86IFJORyAoZHJpdmVyaWQ9MHgleCkgZmFpbGVkLCBkaXNhYmxpbmdcbiIsCisJCQkJCQkJcm9wcy0+ZHJpdmVyaWQpOworCQkJCQlrZnJlZShyb3BzKTsKKwkJCQl9IGVsc2UgaWYgKG4gPiAwKQorCQkJCQlidWZjbnQgKz0gbjsKKwkJCX0KKwkJCS8qIGdpdmUgdXAgQ1BVIGZvciBhIGJpdCwganVzdCBpbiBjYXNlIGFzIHRoaXMgaXMgYSBsb29wICovCisJCQlzY2hlZHVsZSgpOworCQl9CisKKworI2lmZGVmIENPTkZJR19PQ0ZfRklQUworCQlpZiAoYnVmY250ID4gMCAmJiBybmR0ZXN0X2J1ZigodW5zaWduZWQgY2hhciAqKSAmYnVmWzBdKSkgeworCQkJZHByaW50aygiY3J5cHRvOiBidWZmZXIgaGFkIGZpcHMgZXJyb3JzLCBkaXNjYXJkaW5nXG4iKTsKKwkJCWJ1ZmNudCA9IDA7CisJCX0KKyNlbmRpZgorCisJCS8qCisJCSAqIGlmIHdlIGhhdmUgYSBjZXJ0aWZpZWQgYnVmZmVyLCAgd2UgY2FuIHNlbmQgc29tZSBkYXRhCisJCSAqIHRvIC9kZXYvcmFuZG9tIGFuZCBtb3ZlIGFsb25nCisJCSAqLworCQlpZiAoYnVmY250ID4gMCkgeworCQkJLyogYWRkIHdoYXQgd2UgaGF2ZSAqLworCQkJcmFuZG9tX2lucHV0X3dvcmRzKGJ1ZiwgYnVmY250LCBidWZjbnQqc2l6ZW9mKGludCkqOCk7CisJCQlidWZjbnQgPSAwOworCQl9CisKKwkJLyogZ2l2ZSB1cCBDUFUgZm9yIGEgYml0IHNvIHdlIGRvbid0IGhvZyB3aGlsZSBmaWxsaW5nICovCisJCXNjaGVkdWxlKCk7CisKKwkJLyogd2FpdCBmb3IgbmVlZGluZyBtb3JlICovCisJCXdhbnRjbnQgPSByYW5kb21faW5wdXRfd2FpdCgpOworCisJCWlmICh3YW50Y250IDw9IDApCisJCQl3YW50Y250ID0gMDsgLyogdHJ5IHRvIGdldCBzb21lIGluZm8gYWdhaW4gKi8KKwkJZWxzZQorCQkgCS8qIHJvdW5kIHVwIHRvIG9uZSB3b3JkIG9yIHdlIGNhbiBsb29wIGZvcmV2ZXIgKi8KKwkJCXdhbnRjbnQgPSAod2FudGNudCArIChzaXplb2YoaW50KSo4KSkgLyAoc2l6ZW9mKGludCkqOCk7CisJCWlmICh3YW50Y250ID4gTlVNX0lOVCkgeworCQkJd2FudGNudCA9IE5VTV9JTlQ7CisJCX0KKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwkJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ21hc2tfbG9jayk7CisjZW5kaWYKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ21hc2tfbG9jayk7CisjZW5kaWYKKwkJfQorCX0KKwkKKwlrZnJlZShidWYpOworCitiYWRfYWxsb2M6CisJc3Bpbl9sb2NrX2lycSgmcmFuZG9tX2xvY2spOworCXJhbmRvbXByb2MgPSAocGlkX3QpIC0xOworCXN0YXJ0ZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmcmFuZG9tX2xvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvY3J5cHRvL29jZi9ybmR0ZXN0LmMgYi9jcnlwdG8vb2NmL3JuZHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmVkNmExCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL29jZi9ybmR0ZXN0LmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qCSRPcGVuQlNEJAkqLworCisvKgorICogT0NGL0xpbnV4IHBvcnQgZG9uZSBieSBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZF9tY2N1bGxvdWdoQG1jYWZlZS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBEYXZpZCBNY0N1bGxvdWdoCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIFRoZSBsaWNlbnNlIGFuZCBvcmlnaW5hbCBhdXRob3IgYXJlIGxpc3RlZCBiZWxvdy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFzb24gTC4gV3JpZ2h0IChqYXNvbkB0aG91Z2h0Lm5ldCkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgSmFzb24gTC4gV3JpZ2h0CisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSAmJiAhZGVmaW5lZChBVVRPQ09ORl9JTkNMVURFRCkKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxjcnlwdG9kZXYuaD4KKyNpbmNsdWRlICJybmR0ZXN0LmgiCisKK3N0YXRpYyBzdHJ1Y3Qgcm5kdGVzdF9zdGF0cyBybmRzdGF0czsKKworc3RhdGljCXZvaWQgcm5kdGVzdF90ZXN0KHN0cnVjdCBybmR0ZXN0X3N0YXRlICopOworCisvKiBUaGUgdGVzdHMgdGhlbXNlbHZlcyAqLworc3RhdGljCWludCBybmR0ZXN0X21vbm9iaXQoc3RydWN0IHJuZHRlc3Rfc3RhdGUgKik7CitzdGF0aWMJaW50IHJuZHRlc3RfcnVucyhzdHJ1Y3Qgcm5kdGVzdF9zdGF0ZSAqKTsKK3N0YXRpYwlpbnQgcm5kdGVzdF9sb25ncnVucyhzdHJ1Y3Qgcm5kdGVzdF9zdGF0ZSAqKTsKK3N0YXRpYwlpbnQgcm5kdGVzdF9jaGlfNChzdHJ1Y3Qgcm5kdGVzdF9zdGF0ZSAqKTsKKworc3RhdGljCWludCBybmR0ZXN0X3J1bnNfY2hlY2soc3RydWN0IHJuZHRlc3Rfc3RhdGUgKiwgaW50LCBpbnQgKik7CitzdGF0aWMJdm9pZCBybmR0ZXN0X3J1bnNfcmVjb3JkKHN0cnVjdCBybmR0ZXN0X3N0YXRlICosIGludCwgaW50ICopOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJuZHRlc3RfdGVzdGZ1bmMgeworCWludCAoKnRlc3QpKHN0cnVjdCBybmR0ZXN0X3N0YXRlICopOworfSBybmR0ZXN0X2Z1bmNzW10gPSB7CisJeyBybmR0ZXN0X21vbm9iaXQgfSwKKwl7IHJuZHRlc3RfcnVucyB9LAorCXsgcm5kdGVzdF9jaGlfNCB9LAorCXsgcm5kdGVzdF9sb25ncnVucyB9LAorfTsKKworI2RlZmluZQlSTkRURVNUX05URVNUUwkoc2l6ZW9mKHJuZHRlc3RfZnVuY3MpL3NpemVvZihybmR0ZXN0X2Z1bmNzWzBdKSkKKworc3RhdGljIHZvaWQKK3JuZHRlc3RfdGVzdChzdHJ1Y3Qgcm5kdGVzdF9zdGF0ZSAqcnNwKQoreworCWludCBpLCBydiA9IDA7CisKKwlybmRzdGF0cy5yc3RfdGVzdHMrKzsKKwlmb3IgKGkgPSAwOyBpIDwgUk5EVEVTVF9OVEVTVFM7IGkrKykKKwkJcnYgfD0gKCpybmR0ZXN0X2Z1bmNzW2ldLnRlc3QpKHJzcCk7CisJcnNwLT5yc19kaXNjYXJkID0gKHJ2ICE9IDApOworfQorCisKK2V4dGVybiBpbnQgY3J5cHRvX2RlYnVnOworI2RlZmluZSBybmR0ZXN0X3ZlcmJvc2UgMgorI2RlZmluZSBybmR0ZXN0X3JlcG9ydChyc3AsIGZhaWx1cmUsIGZtdCwgYS4uLikgXAorCXsgaWYgKGZhaWx1cmUgfHwgY3J5cHRvX2RlYnVnKSB7IHByaW50aygicm5nX3Rlc3Q6ICIgZm10ICJcbiIsIGEpOyB9IGVsc2U7IH0KKworI2RlZmluZQlSTkRURVNUX01PTk9CSVRfTUlOT05FUwk5NzI1CisjZGVmaW5lCVJORFRFU1RfTU9OT0JJVF9NQVhPTkVTCTEwMjc1CisKK3N0YXRpYyBpbnQKK3JuZHRlc3RfbW9ub2JpdChzdHJ1Y3Qgcm5kdGVzdF9zdGF0ZSAqcnNwKQoreworCWludCBpLCBvbmVzID0gMCwgajsKKwl1X2ludDhfdCByOworCisJZm9yIChpID0gMDsgaSA8IFJORFRFU1RfTkJZVEVTOyBpKyspIHsKKwkJciA9IHJzcC0+cnNfYnVmW2ldOworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrLCByIDw8PSAxKQorCQkJaWYgKHIgJiAweDgwKQorCQkJCW9uZXMrKzsKKwl9CisJaWYgKG9uZXMgPiBSTkRURVNUX01PTk9CSVRfTUlOT05FUyAmJgorCSAgICBvbmVzIDwgUk5EVEVTVF9NT05PQklUX01BWE9ORVMpIHsKKwkJaWYgKHJuZHRlc3RfdmVyYm9zZSA+IDEpCisJCQlybmR0ZXN0X3JlcG9ydChyc3AsIDAsICJtb25vYml0IHBhc3MgKCVkIDwgJWQgPCAlZCkiLAorCQkJICAgIFJORFRFU1RfTU9OT0JJVF9NSU5PTkVTLCBvbmVzLAorCQkJICAgIFJORFRFU1RfTU9OT0JJVF9NQVhPTkVTKTsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQlpZiAocm5kdGVzdF92ZXJib3NlKQorCQkJcm5kdGVzdF9yZXBvcnQocnNwLCAxLAorCQkJICAgICJtb25vYml0IGZhaWxlZCAoJWQgb25lcykiLCBvbmVzKTsKKwkJcm5kc3RhdHMucnN0X21vbm9iaXQrKzsKKwkJcmV0dXJuICgtMSk7CisJfQorfQorCisjZGVmaW5lCVJORFRFU1RfUlVOU19OSU5URVJWQUwJNgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJuZHRlc3RfcnVuc190YWJzIHsKKwl1X2ludDE2X3QgbWluLCBtYXg7Cit9IHJuZHRlc3RfcnVuc190YWJbXSA9IHsKKwl7IDIzNDMsIDI2NTcgfSwKKwl7IDExMzUsIDEzNjUgfSwKKwl7IDU0MiwgNzA4IH0sCisJeyAyNTEsIDM3MyB9LAorCXsgMTExLCAyMDEgfSwKKwl7IDExMSwgMjAxIH0sCit9OworCitzdGF0aWMgaW50CitybmR0ZXN0X3J1bnMoc3RydWN0IHJuZHRlc3Rfc3RhdGUgKnJzcCkKK3sKKwlpbnQgaSwgaiwgb25lcywgemVyb3MsIHJ2ID0gMDsKKwlpbnQgb25laVtSTkRURVNUX1JVTlNfTklOVEVSVkFMXSwgemVyb2lbUk5EVEVTVF9SVU5TX05JTlRFUlZBTF07CisJdV9pbnQ4X3QgYzsKKworCWJ6ZXJvKG9uZWksIHNpemVvZihvbmVpKSk7CisJYnplcm8oemVyb2ksIHNpemVvZih6ZXJvaSkpOworCW9uZXMgPSB6ZXJvcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IFJORFRFU1RfTkJZVEVTOyBpKyspIHsKKwkJYyA9IHJzcC0+cnNfYnVmW2ldOworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrLCBjIDw8PSAxKSB7CisJCQlpZiAoYyAmIDB4ODApIHsKKwkJCQlvbmVzKys7CisJCQkJcm5kdGVzdF9ydW5zX3JlY29yZChyc3AsIHplcm9zLCB6ZXJvaSk7CisJCQkJemVyb3MgPSAwOworCQkJfSBlbHNlIHsKKwkJCQl6ZXJvcysrOworCQkJCXJuZHRlc3RfcnVuc19yZWNvcmQocnNwLCBvbmVzLCBvbmVpKTsKKwkJCQlvbmVzID0gMDsKKwkJCX0KKwkJfQorCX0KKwlybmR0ZXN0X3J1bnNfcmVjb3JkKHJzcCwgb25lcywgb25laSk7CisJcm5kdGVzdF9ydW5zX3JlY29yZChyc3AsIHplcm9zLCB6ZXJvaSk7CisKKwlydiB8PSBybmR0ZXN0X3J1bnNfY2hlY2socnNwLCAwLCB6ZXJvaSk7CisJcnYgfD0gcm5kdGVzdF9ydW5zX2NoZWNrKHJzcCwgMSwgb25laSk7CisKKwlpZiAocnYpCisJCXJuZHN0YXRzLnJzdF9ydW5zKys7CisKKwlyZXR1cm4gKHJ2KTsKK30KKworc3RhdGljIHZvaWQKK3JuZHRlc3RfcnVuc19yZWNvcmQoc3RydWN0IHJuZHRlc3Rfc3RhdGUgKnJzcCwgaW50IGxlbiwgaW50ICppbnRydikKK3sKKwlpZiAobGVuID09IDApCisJCXJldHVybjsKKwlpZiAobGVuID4gUk5EVEVTVF9SVU5TX05JTlRFUlZBTCkKKwkJbGVuID0gUk5EVEVTVF9SVU5TX05JTlRFUlZBTDsKKwlsZW4gLT0gMTsKKwlpbnRydltsZW5dKys7Cit9CisKK3N0YXRpYyBpbnQKK3JuZHRlc3RfcnVuc19jaGVjayhzdHJ1Y3Qgcm5kdGVzdF9zdGF0ZSAqcnNwLCBpbnQgdmFsLCBpbnQgKnNyYykKK3sKKwlpbnQgaSwgcnYgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFJORFRFU1RfUlVOU19OSU5URVJWQUw7IGkrKykgeworCQlpZiAoc3JjW2ldIDwgcm5kdGVzdF9ydW5zX3RhYltpXS5taW4gfHwKKwkJICAgIHNyY1tpXSA+IHJuZHRlc3RfcnVuc190YWJbaV0ubWF4KSB7CisJCQlybmR0ZXN0X3JlcG9ydChyc3AsIDEsCisJCQkgICAgIiVzIGludGVydmFsICVkIGZhaWxlZCAoJWQsICVkLSVkKSIsCisJCQkgICAgdmFsID8gIm9uZXMiIDogInplcm9zIiwKKwkJCSAgICBpICsgMSwgc3JjW2ldLCBybmR0ZXN0X3J1bnNfdGFiW2ldLm1pbiwKKwkJCSAgICBybmR0ZXN0X3J1bnNfdGFiW2ldLm1heCk7CisJCQlydiA9IC0xOworCQl9IGVsc2UgeworCQkJcm5kdGVzdF9yZXBvcnQocnNwLCAwLAorCQkJICAgICJydW5zIHBhc3MgJXMgaW50ZXJ2YWwgJWQgKCVkIDwgJWQgPCAlZCkiLAorCQkJICAgIHZhbCA/ICJvbmVzIiA6ICJ6ZXJvcyIsCisJCQkgICAgaSArIDEsIHJuZHRlc3RfcnVuc190YWJbaV0ubWluLCBzcmNbaV0sCisJCQkgICAgcm5kdGVzdF9ydW5zX3RhYltpXS5tYXgpOworCQl9CisJfQorCXJldHVybiAocnYpOworfQorCitzdGF0aWMgaW50CitybmR0ZXN0X2xvbmdydW5zKHN0cnVjdCBybmR0ZXN0X3N0YXRlICpyc3ApCit7CisJaW50IGksIGosIG9uZXMgPSAwLCB6ZXJvcyA9IDAsIG1heG9uZXMgPSAwLCBtYXh6ZXJvcyA9IDA7CisJdV9pbnQ4X3QgYzsKKworCWZvciAoaSA9IDA7IGkgPCBSTkRURVNUX05CWVRFUzsgaSsrKSB7CisJCWMgPSByc3AtPnJzX2J1ZltpXTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKywgYyA8PD0gMSkgeworCQkJaWYgKGMgJiAweDgwKSB7CisJCQkJemVyb3MgPSAwOworCQkJCW9uZXMrKzsKKwkJCQlpZiAob25lcyA+IG1heG9uZXMpCisJCQkJCW1heG9uZXMgPSBvbmVzOworCQkJfSBlbHNlIHsKKwkJCQlvbmVzID0gMDsKKwkJCQl6ZXJvcysrOworCQkJCWlmICh6ZXJvcyA+IG1heHplcm9zKQorCQkJCQltYXh6ZXJvcyA9IHplcm9zOworCQkJfQorCQl9CisJfQorCisJaWYgKG1heG9uZXMgPCAyNiAmJiBtYXh6ZXJvcyA8IDI2KSB7CisJCXJuZHRlc3RfcmVwb3J0KHJzcCwgMCwgImxvbmdydW5zIHBhc3MgKCVkIG9uZXMsICVkIHplcm9zKSIsCisJCQltYXhvbmVzLCBtYXh6ZXJvcyk7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJcm5kdGVzdF9yZXBvcnQocnNwLCAxLCAibG9uZ3J1bnMgZmFpbCAoJWQgb25lcywgJWQgemVyb3MpIiwKKwkJCW1heG9uZXMsIG1heHplcm9zKTsKKwkJcm5kc3RhdHMucnN0X2xvbmdydW5zKys7CisJCXJldHVybiAoLTEpOworCX0KK30KKworLyoKKyAqIGNoaV4yIHRlc3Qgb3ZlciA0IGJpdHM6ICh0aGlzIGlzIGNhbGxlZCB0aGUgcG9rZXIgdGVzdCBpbiBGSVBTIDE0MC0yLAorICogYnV0IGl0IGlzIHJlYWxseSB0aGUgY2hpXjIgdGVzdCBvdmVyIDQgYml0cyAodGhlIHBva2VyIHRlc3QgYXMgZGVzY3JpYmVkCisgKiBieSBLbnV0aCB2b2wgMiBpcyBzb21ldGhpbmcgZGlmZmVyZW50LCBhbmQgSSB0YWtlIGhpbSBhcyBhdXRob3JpdGF0aXZlCisgKiBvbiBub21lbmNsYXR1cmUgb3ZlciBOSVNUKS4KKyAqLworI2RlZmluZQlSTkRURVNUX0NISTRfSwkxNgorI2RlZmluZQlSTkRURVNUX0NISTRfS19NQVNLCShSTkRURVNUX0NISTRfSyAtIDEpCisKKy8qCisgKiBUaGUgdW5ub3JtYWxpemVkIHZhbHVlcyBhcmUgdXNlZCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQKKyAqIGZyYWN0aW9uYWwgcHJlY2lzaW9uLiAgVGhlICJyZWFsIiB2YWx1ZSBpcyBmb3VuZCBieToKKyAqCShWIC0gMTU2MjUwMCkgKiAoMTYgLyA1MDAwKSA9IFZuICAgKHdoZXJlIFYgaXMgdGhlIHVubm9ybWFsaXplZCB2YWx1ZSkKKyAqLworI2RlZmluZQlSTkRURVNUX0NISTRfVk1JTgkxNTYzMTgxCQkvKiAyLjE3OTIgKi8KKyNkZWZpbmUJUk5EVEVTVF9DSEk0X1ZNQVgJMTU3NjkyOQkJLyogNDYuMTcyOCAqLworCitzdGF0aWMgaW50CitybmR0ZXN0X2NoaV80KHN0cnVjdCBybmR0ZXN0X3N0YXRlICpyc3ApCit7CisJdW5zaWduZWQgaW50IGZyZXFbUk5EVEVTVF9DSEk0X0tdLCBpLCBzdW07CisKKwlmb3IgKGkgPSAwOyBpIDwgUk5EVEVTVF9DSEk0X0s7IGkrKykKKwkJZnJlcVtpXSA9IDA7CisKKwkvKiBHZXQgbnVtYmVyIG9mIG9jY3VyYW5jZXMgb2YgZWFjaCA0IGJpdCBwYXR0ZXJuICovCisJZm9yIChpID0gMDsgaSA8IFJORFRFU1RfTkJZVEVTOyBpKyspIHsKKwkJZnJlcVsocnNwLT5yc19idWZbaV0gPj4gNCkgJiBSTkRURVNUX0NISTRfS19NQVNLXSsrOworCQlmcmVxWyhyc3AtPnJzX2J1ZltpXSA+PiAwKSAmIFJORFRFU1RfQ0hJNF9LX01BU0tdKys7CisJfQorCisJZm9yIChpID0gMCwgc3VtID0gMDsgaSA8IFJORFRFU1RfQ0hJNF9LOyBpKyspCisJCXN1bSArPSBmcmVxW2ldICogZnJlcVtpXTsKKworCWlmIChzdW0gPj0gMTU2MzE4MSAmJiBzdW0gPD0gMTU3NjkyOSkgeworCQlybmR0ZXN0X3JlcG9ydChyc3AsIDAsICJjaGleMig0KTogcGFzcyAoc3VtICV1KSIsIHN1bSk7CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJcm5kdGVzdF9yZXBvcnQocnNwLCAxLCAiY2hpXjIoNCk6IGZhaWxlZCAoc3VtICV1KSIsIHN1bSk7CisJCXJuZHN0YXRzLnJzdF9jaGkrKzsKKwkJcmV0dXJuICgtMSk7CisJfQorfQorCitpbnQKK3JuZHRlc3RfYnVmKHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgcm5kdGVzdF9zdGF0ZSByc3A7CisKKwltZW1zZXQoJnJzcCwgMCwgc2l6ZW9mKHJzcCkpOworCXJzcC5yc19idWYgPSBidWY7CisJcm5kdGVzdF90ZXN0KCZyc3ApOworCXJldHVybihyc3AucnNfZGlzY2FyZCk7Cit9CisKZGlmZiAtLWdpdCBhL2NyeXB0by9vY2Yvcm5kdGVzdC5oIGIvY3J5cHRvL29jZi9ybmR0ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkOGVjOAotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9vY2Yvcm5kdGVzdC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCSRGcmVlQlNEOiBzcmMvc3lzL2Rldi9ybmR0ZXN0L3JuZHRlc3QuaCx2IDEuMSAyMDAzLzAzLzExIDIyOjU0OjQ0IHNhbSBFeHAgJAkqLworLyoJJE9wZW5CU0QkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFzb24gTC4gV3JpZ2h0IChqYXNvbkB0aG91Z2h0Lm5ldCkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgSmFzb24gTC4gV3JpZ2h0CisgKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCisgKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworLyogU29tZSBvZiB0aGUgdGVzdHMgZGVwZW5kIG9uIHRoZXNlIHZhbHVlcyAqLworI2RlZmluZQlSTkRURVNUX05CWVRFUwkyNTAwCisjZGVmaW5lCVJORFRFU1RfTkJJVFMJKDggKiBSTkRURVNUX05CWVRFUykKKworc3RydWN0IHJuZHRlc3Rfc3RhdGUgeworCWludAkJcnNfZGlzY2FyZDsJLyogZGlzY2FyZC9hY2NlcHQgcmFuZG9tIGRhdGEgKi8KKwl1X2ludDhfdAkqcnNfYnVmOworfTsKKworc3RydWN0IHJuZHRlc3Rfc3RhdHMgeworCXVfaW50MzJfdAlyc3RfZGlzY2FyZDsJLyogbnVtYmVyIG9mIGJ5dGVzIGRpc2NhcmRlZCAqLworCXVfaW50MzJfdAlyc3RfdGVzdHM7CS8qIG51bWJlciBvZiB0ZXN0IHJ1bnMgKi8KKwl1X2ludDMyX3QJcnN0X21vbm9iaXQ7CS8qIG1vbm9iaXQgdGVzdCBmYWlsdXJlcyAqLworCXVfaW50MzJfdAlyc3RfcnVuczsJLyogMC8xIHJ1bnMgZmFpbHVyZXMgKi8KKwl1X2ludDMyX3QJcnN0X2xvbmdydW5zOwkvKiBsb25ncnVucyBmYWlsdXJlcyAqLworCXVfaW50MzJfdAlyc3RfY2hpOwkvKiBjaGleMiBmYWlsdXJlcyAqLworfTsKKworZXh0ZXJuIGludCBybmR0ZXN0X2J1Zih1bnNpZ25lZCBjaGFyICpidWYpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL29jZi91aW8uaCBiL2NyeXB0by9vY2YvdWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNhNjI0OQotLS0gL2Rldi9udWxsCisrKyBiL2NyeXB0by9vY2YvdWlvLmgKQEAgLTAsMCArMSw1NCBAQAorI2lmbmRlZiBfT0NGX1VJT19IXworI2RlZmluZSBfT0NGX1VJT19IXworCisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisKKy8qCisgKiBUaGUgbGludXggdWlvLmggZG9lc24ndCBoYXZlIGFsbCB3ZSBuZWVkLiAgVG8gYmUgZnVsbHkgYXBpIGNvbXBhdGlibGUKKyAqIHdpdGggdGhlIEJTRCBjcnlwdG9kZXYsICB3ZSBuZWVkIHRvIGtlZXAgdGhpcyBhcm91bmQuICBQZXJoYXBzIHRoaXMgY2FuCisgKiBiZSBtb3ZlZCBiYWNrIGludG8gdGhlIGxpbnV4L3Vpby5oCisgKgorICogTGludXggcG9ydCBkb25lIGJ5IERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkX21jY3VsbG91Z2hAbWNhZmVlLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIERhdmlkIE1jQ3VsbG91Z2gKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIExJQ0VOU0UgVEVSTVMKKyAqCisgKiBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6CisgKgorICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKyAqCisgKiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisgKgorICogICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICogICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBwcm9kdWN0CisgKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIERJU0NMQUlNRVIKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKKyAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcworICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCitzdHJ1Y3QgdWlvIHsKKwlzdHJ1Y3QJaW92ZWMgKnVpb19pb3Y7CisJaW50CQl1aW9faW92Y250OworCW9mZl90CXVpb19vZmZzZXQ7CisJaW50CQl1aW9fcmVzaWQ7CisjaWYgMAorCWVudW0JdWlvX3NlZyB1aW9fc2VnZmxnOworCWVudW0JdWlvX3J3IHVpb19ydzsKKwlzdHJ1Y3QgIHRocmVhZCAqdWlvX3RkOworI2VuZGlmCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvS2NvbmZpZyBiL2RyaXZlcnMvS2NvbmZpZwppbmRleCBiNWU2ZjI0Li5lMTE2NTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9LY29uZmlnCkBAIC01Miw2ICs1Miw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9zcGkvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3NwaTIvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL3Bwcy9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvcHRwL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCAxYjMxNDIxLi4yZmM3YzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTUzLDYgKzUzLDcgQEAKIG9iai0kKENPTkZJR19UQVJHRVRfQ09SRSkJKz0gdGFyZ2V0Lwogb2JqLSQoQ09ORklHX01URCkJCSs9IG10ZC8KIG9iai0kKENPTkZJR19TUEkpCQkrPSBzcGkvCitvYmotJChDT05GSUdfU1BJMikJCSs9IHNwaTIvCiBvYmoteQkJCQkrPSBuZXQvCiBvYmotJChDT05GSUdfQVRNKQkJKz0gYXRtLwogb2JqLSQoQ09ORklHX0ZVU0lPTikJCSs9IG1lc3NhZ2UvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmggYi9kcml2ZXJzL2F0YS9haGNpLmgKaW5kZXggYjE3NTAwMC4uYzY5NzE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5oCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuaApAQCAtMzU3LDQgKzM1NywzNSBAQAogCXJldHVybiAoY2FwICYgMHgxZikgKyAxOwogfQogCisjaWYgZGVmaW5lZCAoQ09ORklHX0NPTUNFUlRPX0FIQ0lfUFJPRikKKworI2RlZmluZSBNQVhfQUhDSV9QT1JUUwkJNAorI2RlZmluZSBNQVhfQUhDSV9TTE9UUwkJMzIKKyNkZWZpbmUgTUFYX0JJTlMJCTY0CisjZGVmaW5lIFVTX1NISUZUCQk4CisjZGVmaW5lIEJZVEVfU0hJRlQJCTE0CisjZGVmaW5lIFJBVEVfU0hJRlQJCTIKKworc3RydWN0IGFoY2lfcG9ydF9zdGF0cyB7CisJc3RydWN0IHRpbWV2YWwgZmlyc3RfaXNzdWU7CisJdW5zaWduZWQgaW50IHBlbmRpbmdfZmxhZzsKKwl1bnNpZ25lZCBpbnQgbmJfcGVuZGluZzsKKwl1bnNpZ25lZCBpbnQgbmJfcGVuZGluZ19tYXg7CisJdW5zaWduZWQgaW50IG5iX3BlbmRpbmdfdG90YWw7CisJdW5zaWduZWQgaW50IGJ5dGVzX3BlbmRpbmc7CisJdW5zaWduZWQgaW50IGRpZmZfdXM7CisJdW5zaWduZWQgaW50IHBlbmRpbmdfY291bnRlcltNQVhfQklOU107CisJdW5zaWduZWQgaW50IHJhdGVfY291bnRlcltNQVhfQklOU107CisKKwl1bnNpZ25lZCBpbnQgaW5pdF9wcm9mOworCXVuc2lnbmVkIGludCB0aW1lX2NvdW50ZXJbTUFYX0JJTlNdOyAvLyAxMjh1cyAtPiAxNm1zCisJdW5zaWduZWQgaW50IGRhdGFfY291bnRlcltNQVhfQklOU107IC8vIDRLLT4gMTAyMEsKKwl1bnNpZ25lZCBpbnQgbm9fZnJlZV9zbG90OworCXN0cnVjdCB0aW1ldmFsIGxhc3RfcmVxOworfTsKKworZXh0ZXJuIHN0cnVjdCBhaGNpX3BvcnRfc3RhdHMgYWhjaV9wb3J0X3N0YXRzW01BWF9BSENJX1BPUlRTXTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZW5hYmxlX2FoY2lfcHJvZjsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0FIQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaV9wbGF0Zm9ybS5jIGIvZHJpdmVycy9hdGEvYWhjaV9wbGF0Zm9ybS5jCmluZGV4IDQzYjg3NTguLmQxZDlkNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2lfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2F0YS9haGNpX3BsYXRmb3JtLmMKQEAgLTIxLDcgKzIxLDIxIEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAjaW5jbHVkZSA8bGludXgvYWhjaV9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KKyNpbmNsdWRlIDxtYWNoL2NvbWNlcnRvLTIwMDAvcG0uaD4KICNpbmNsdWRlICJhaGNpLmgiCisjaW5jbHVkZSA8bWFjaC9zZXJkZXMtYzIwMDAuaD4KKworI2lmZGVmIENPTkZJR19BUkNIX004NlhYWCAKKy8qIFNBVEEgQ2xvY2tzICovCitzdGF0aWMgc3RydWN0IGNsayAqc2F0YV9vb2JfY2xrOyAvKiBDb3JlIGNsb2NrICovCitzdGF0aWMgc3RydWN0IGNsayAqc2F0YV9wbXVfY2xrOyAvKiBQTVUgYWxpdmUgY2xvY2sgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrICpzYXRhX2NsazsJLyogU2F0YSBBWEkgcmVmIGNsb2NrICovCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fU0FUQV9PQ0NfQ0xPQ0spCitzdGF0aWMgc3RydWN0IGNsayAqc2F0YV9vY2NfY2xrOyAvKiBzYXRhIE9DQyBjbG9jayAqLworI2VuZGlmCisjZW5kaWYgCiAKIGVudW0gYWhjaV90eXBlIHsKIAlBSENJLAkJLyogc3RhbmRhcmQgcGxhdGZvcm0gYWhjaSAqLwpAQCAtNjIsNiArNzYsOTEgQEAKIAlBSENJX1NIVCgiYWhjaV9wbGF0Zm9ybSIpLAogfTsKIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhaGNpX3BsYXRmb3JtX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworICAgICAgICBzdHJ1Y3QgYXRhX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0PTA7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9NODZYWFgKKwkgLyogQ2hlY2sgZm9yIHRoZSBCaXRfTWFzayBiaXQgZm9yIFNBVEEsIGlmIGl0IGlzIGVuYWJsZWQKKwkgICogdGhlbiB3ZSBhcmUgbm90IGdvaW5nIHN1c3BlbmQgdGhlIFNBVEEgZGV2aWNlICwgYXMgYnkKKwkgICogdGhpcyBkZXZpY2UgLCB3ZSB3aWxsIHdha2UgZnJvbSBTeXN0ZW0gUmVzdW1lLgorCSAqLworCWlmICggIShob3N0X3V0aWxwZV9zaGFyZWRfcG11X2JpdG1hc2sgJiBTQVRBX0lSUSApKXsKKworICAgICAgICAgICAgICAgIC8qIFdlIHdpbGwgSnVzdCByZXR1cm4KKyAgICAgICAgICAgICAgICAqLworCQlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCisgICAgICAgIGlmIChob3N0KQorCQlyZXQgPSBhdGFfaG9zdF9zdXNwZW5kKGhvc3QsIHN0YXRlKTsKKworI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCWlmICghcmV0KSAvKiBzdWNlc3NmdWxseSBkb25lIHRoZSBob3N0IHN1c3BlbmQgKi8KKwl7CisJCS8qIE5vIGRvIHRoZSBjbG9jayBkaXNhYmxlIFBNVSxPT0IsQVhJIGhlcmUgKi8KKwkJY2xrX2Rpc2FibGUoc2F0YV9jbGspOworCQljbGtfZGlzYWJsZShzYXRhX29vYl9jbGspOworCQljbGtfZGlzYWJsZShzYXRhX3BtdV9jbGspOworCisJCS8qIFBNIFBlcmZvcm1hbmNlIEVuaGFuY2VtZW50IDogU1JEUzEgUEQgU0FUQTEvU1JEUzIgUEQgU0FUQTIgLSBQMiBzdGF0ZSwgKi8KKwkJLyogUmVzZXRzIHRoZSBlbnRpcmUgUEhZIG1vZHVsZSBhbmQgQ01VIHBvd2VyIGRvd24gKi8KKwkJaWYgKHJlYWRsKENPTUNFUlRPX0dQSU9fU1lTVEVNX0NPTkZJRykgJiBCT09UX1NFUkRFUzFfQ05GX1NBVEEwKQorCQkJd3JpdGVsKChyZWFkbCgoQ09NQ0VSVE9fRFdDMV9DRkdfQkFTRSsweDQ0KSkgfCAweENDKSwgKENPTUNFUlRPX0RXQzFfQ0ZHX0JBU0UrMHg0NCkpOworCQllbHNlIGlmIChyZWFkbChDT01DRVJUT19HUElPX1NZU1RFTV9DT05GSUcpICYgQk9PVF9TRVJERVMyX0NORl9TQVRBMSkKKwkJCXdyaXRlbCgocmVhZGwoKENPTUNFUlRPX0RXQzFfQ0ZHX0JBU0UrMHg1NCkpIHwgMHhDQyksIChDT01DRVJUT19EV0MxX0NGR19CQVNFKzB4NTQpKTsKKworCX0KKyNlbmRpZgorCQorICAgICAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFoY2lfcGxhdGZvcm1fcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisgICAgICAgIHN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisjaWZkZWYgQ09ORklHX0FSQ0hfTTg2WFhYCisJLyogUE0gUGVyZm9ybWFuY2UgRW5oYW5jZW1lbnQgOiBTUkRTMSBQRCBTQVRBMS9TUkRTMiBQRCBTQVRBMiAtIFAyIHN0YXRlLCAqLworCS8qIEVuYWJsZSBQSFkgbW9kdWxlIGFuZCBDTVUgcG93ZXIgVVAgKi8KKwlpZiAocmVhZGwoQ09NQ0VSVE9fR1BJT19TWVNURU1fQ09ORklHKSAmIEJPT1RfU0VSREVTMV9DTkZfU0FUQTApCisgCQl3cml0ZWwoKHJlYWRsKChDT01DRVJUT19EV0MxX0NGR19CQVNFKzB4NDQpKSAmIH4weENDKSwgKENPTUNFUlRPX0RXQzFfQ0ZHX0JBU0UrMHg0NCkpOworCWVsc2UgaWYgKHJlYWRsKENPTUNFUlRPX0dQSU9fU1lTVEVNX0NPTkZJRykgJiBCT09UX1NFUkRFUzJfQ05GX1NBVEExKQorCQl3cml0ZWwoKHJlYWRsKChDT01DRVJUT19EV0MxX0NGR19CQVNFKzB4NTQpKSAmIH4weENDKSwgKENPTUNFUlRPX0RXQzFfQ0ZHX0JBU0UrMHg1NCkpOworCisJLyogQ2hlY2sgZm9yIHRoZSBCaXRfTWFzayBiaXQgZm9yIFNBVEEsIGlmIGl0IGlzIGVuYWJsZWQKKwkgKiB0aGVuIHdlIGFyZSBub3QgZ29pbmcgc3VzcGVuZCB0aGUgU0FUQSBkZXZpY2UgLCBhcyBieQorCSAqIHRoaXMgZGV2aWNlICwgd2Ugd2lsbCB3YWtlIGZyb20gU3lzdGVtIFJlc3VtZS4KKwkqLworCisJaWYgKCAhKGhvc3RfdXRpbHBlX3NoYXJlZF9wbXVfYml0bWFzayAmIFNBVEFfSVJRICkpeworCisgICAgICAgICAgICAgICAgLyogV2Ugd2lsbCBKdXN0IHJldHVybgorICAgICAgICAgICAgICAgICovCisJCXJldHVybiAwOworCX0KKworCS8qIERvIHRoZSAgY2xvY2sgZW5hYmxlIGhlcmUgIFBNVSxPT0IsQVhJICovCisJY2xrX2VuYWJsZShzYXRhX2Nsayk7CisJY2xrX2VuYWJsZShzYXRhX29vYl9jbGspOworCWNsa19lbmFibGUoc2F0YV9wbXVfY2xrKTsKKyNlbmRpZgorCisgICAgICAgIGlmIChob3N0KSAKKwkJYXRhX2hvc3RfcmVzdW1lKGhvc3QpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSBhaGNpX3BsYXRmb3JtX3N1c3BlbmQgTlVMTAorI2RlZmluZSBhaGNpX3BsYXRmb3JtX3Jlc3VtZSBOVUxMCisjZW5kaWYKKworCisKIHN0YXRpYyBpbnQgX19pbml0IGFoY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwpAQCAtNzYsNyArMTc1LDY2IEBACiAJaW50IG5fcG9ydHM7CiAJaW50IGk7CiAJaW50IHJjOworI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCS8qIEdldCB0aGUgUmVmZXJlbmNlIGFuZCBFbmFibGUgIHRoZSBTQVRBIGNsb2NrcyBoZXJlICovCiAKKwlzYXRhX2NsayA9IGNsa19nZXQoTlVMTCwic2F0YSIpOworCS8qIEVycm9yIEhhbmRsaW5nICwgaWYgbm8gU0FUQShBWEkpIGNsb2NrIHJlZmVyZW5jZTogcmV0dXJuIGVycm9yICovCisJaWYgKElTX0VSUihzYXRhX2NsaykpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIG9idGFpbiBTQVRBKEFYSSkgY2xvY2s6ICVsZFxuIixfX2Z1bmNfXyxQVFJfRVJSKHNhdGFfY2xrKSk7CisJCXJldHVybiBQVFJfRVJSKHNhdGFfY2xrKTsKKyAJfQorCisJLypFbmFibGUgdGhlIFNBVEEoQVhJKSBjbG9jayBoZXJlICovCisgICAgICAgIHJjID0gY2xrX2VuYWJsZShzYXRhX2Nsayk7CisJaWYgKHJjKXsKKwkJcHJfZXJyKCIlczogU0FUQShBWEkpIGNsb2NrIGVuYWJsZSBmYWlsZWQgXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisJfQorCXNhdGFfb29iX2NsayA9IGNsa19nZXQoTlVMTCwic2F0YV9vb2IiKTsKKwkvKiBFcnJvciBIYW5kbGluZyAsIGlmIG5vIFNBVEFfT09CIGNsb2NrIHJlZmVyZW5jZTogcmV0dXJuIGVycm9yICovCisJaWYgKElTX0VSUihzYXRhX29vYl9jbGspKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBvYnRhaW4gU0FUQV9PT0IgY2xvY2s6ICVsZFxuIixfX2Z1bmNfXyxQVFJfRVJSKHNhdGFfb29iX2NsaykpOworCQlyZXR1cm4gUFRSX0VSUihzYXRhX29vYl9jbGspOworIAl9CisKKwlzYXRhX3BtdV9jbGsgPSBjbGtfZ2V0KE5VTEwsInNhdGFfcG11Iik7CisJLyogRXJyb3IgSGFuZGxpbmcgLCBpZiBubyBTQVRBX1BNVSBjbG9jayByZWZlcmVuY2U6IHJldHVybiBlcnJvciAqLworCWlmIChJU19FUlIoc2F0YV9wbXVfY2xrKSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gb2J0YWluIFNBVEFfUE1VIGNsb2NrOiAlbGRcbiIsX19mdW5jX18sUFRSX0VSUihzYXRhX3BtdV9jbGspKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9wbXVfY2xrKTsKKwl9CisJLypFbmFibGUgdGhlIFNBVEEoUE1VIGFuZCBPT0IpIGNsb2NrcyBoZXJlICovCisgICAgICAgIHJjID0gY2xrX2VuYWJsZShzYXRhX29vYl9jbGspOworCWlmIChyYyl7CisJCXByX2VycigiJXM6IFNBVEFfT09CIGNsb2NrIGVuYWJsZSBmYWlsZWQgXG4iLF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisJfQorCisgICAgICAgIHJjID0gY2xrX2VuYWJsZShzYXRhX3BtdV9jbGspOworCWlmIChyYyl7CisJCXByX2VycigiJXM6IFNBVEFfUE1VIGNsb2NrIGVuYWJsZSBmYWlsZWQgXG4iLF9fZnVuY19fKTsKKwkJcmV0dXJuIHJjOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19TQVRBX09DQ19DTE9DSykKKwlzYXRhX29jY19jbGsgPSBjbGtfZ2V0KE5VTEwsInNhdGFfb2NjIik7CisJLyogRXJyb3IgSGFuZGxpbmcgLCBpZiBubyBzYXRhIG9jYyBjbG9jayByZWZlcmVuY2U6IHJldHVybiBlcnJvciAqLworCWlmIChJU19FUlIoc2F0YV9vY2NfY2xrKSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gb2J0YWluIHNhdGEgb2NjIGNsb2NrOiAlbGRcbiIsX19mdW5jX18sUFRSX0VSUihzYXRhX29jY19jbGspKTsKKwkJcmV0dXJuIFBUUl9FUlIoc2F0YV9vY2NfY2xrKTsKKyAJfQorCS8qRW5hYmxlIHRoZSBzYXRhX29jYyBjbG9ja3MgaGVyZSAqLworICAgICAgICByYyA9IGNsa19lbmFibGUoc2F0YV9vY2NfY2xrKTsKKwlpZiAocmMpeworCQlwcl9lcnIoIiVzOiBzYXRhIG9jYyBjbG9jayBlbmFibGUgZmFpbGVkIFxuIixfX2Z1bmNfXyk7CisJCXJldHVybiByYzsKKwl9CisjZW5kaWYKKwkvKiBTZXQgdGhlIFNBVEEgUE1VIGNsb2NrIHRvIDMwIE1IWiBhbmQgT09CIGNsb2NrIHRvIDEyNU1IWiAqLworCWNsa19zZXRfcmF0ZShzYXRhX29vYl9jbGssMTI1MDAwMDAwKTsKKwljbGtfc2V0X3JhdGUoc2F0YV9wbXVfY2xrLDMwMDAwMDAwKTsKKwkKKyNlbmRpZgogCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKCFtZW0pIHsKIAkJZGV2X2VycihkZXYsICJubyBtbWlvIHNwYWNlXG4iKTsKQEAgLTE2NCw2ICszMjIsMTIgQEAKIAkJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX0VNKQogCQkJYXAtPmVtX21lc3NhZ2VfdHlwZSA9IGhwcml2LT5lbV9tc2dfdHlwZTsKIAorI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCQkvKiBPcHRpbWl6ZWQgUEZFL1NBVEEgRERSIGludGVyYWN0aW9uLAorCQlsaW1pdCByZWFkIGJ1cnN0IHNpemUgb2YgU0FUQSBjb250cm9sbGVyICovCisJCXdyaXRlbCgweDQxLCBhaGNpX3BvcnRfYmFzZShhcCkgKyAweDcwKTsKKyNlbmRpZgorCiAJCS8qIGRpc2FibGVkL25vdC1pbXBsZW1lbnRlZCBwb3J0ICovCiAJCWlmICghKGhwcml2LT5wb3J0X21hcCAmICgxIDw8IGkpKSkKIAkJCWFwLT5vcHMgPSAmYXRhX2R1bW15X3BvcnRfb3BzOwpAQCAtMTk4LDYgKzM2MiwzMSBAQAogCiAJaWYgKHBkYXRhICYmIHBkYXRhLT5leGl0KQogCQlwZGF0YS0+ZXhpdChkZXYpOworI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCS8qIERpc2JhbGUgdGhlIFNBVEEgY2xvY2tzIEhlcmUgKi8KKwljbGtfZGlzYWJsZShzYXRhX2Nsayk7CisJY2xrX3B1dChzYXRhX2Nsayk7CisJY2xrX2Rpc2FibGUoc2F0YV9vb2JfY2xrKTsKKwljbGtfcHV0KHNhdGFfb29iX2Nsayk7CisJY2xrX2Rpc2FibGUoc2F0YV9wbXVfY2xrKTsKKwljbGtfcHV0KHNhdGFfcG11X2Nsayk7CisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fU0FUQV9PQ0NfQ0xPQ0spCisJY2xrX2Rpc2FibGUoc2F0YV9vY2NfY2xrKTsKKwljbGtfcHV0KHNhdGFfb2NjX2Nsayk7CisjZW5kaWYKKwkvKlB1dHRpbmcgIFNBVEEgaW4gcmVzZXQgc3RhdGUgCisJICogU2F0YSBheGkgY2xvY2sgZG9tYWluIGluIHJlc2V0IHN0YXRlCisJICogU2VyZGVzIDEvMiBpbiByZXNldCBzdGF0ZSwgdGhpcyBkZXBlbmRzIHVwb24gUENJRTEgYW5kIFNHTUlJIAorICAgICAgICAgKiBzYXRhIDAvMSBzZXJkZXMgY29udHJvbGxlciBpbiByZXNldCBzdGF0ZQorCSovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9TQVRBLDEpOworCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1NFUkRFUzEsMSk7CisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1NFUkRFU19TQVRBMCwxKTsKKworCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9TRVJERVMyLDEpOworCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9TRVJERVNfU0FUQTEsMSk7CisjZW5kaWYKIAogCXJldHVybiAwOwogfQpAQCAtMjA5LDEzICszOTgsMTcgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFoY2lfb2ZfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhaGNpX2RyaXZlciA9IHsKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoYWhjaV9yZW1vdmUpLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFoY2kiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gYWhjaV9vZl9tYXRjaCwKKwkucmVtb3ZlICA9IF9fZGV2ZXhpdF9wKGFoY2lfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGFoY2lfcGxhdGZvcm1fc3VzcGVuZCwKKwkucmVzdW1lICA9IGFoY2lfcGxhdGZvcm1fcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlciAgPSB7CisJCSAubmFtZSA9ICJhaGNpIiwKKwkJIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkgLm9mX21hdGNoX3RhYmxlID0gYWhjaV9vZl9tYXRjaCwKIAl9LAotCS5pZF90YWJsZQk9IGFoY2lfZGV2dHlwZSwKKwkuaWRfdGFibGUgPSBhaGNpX2RldnR5cGUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhaGNpX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYyBiL2RyaXZlcnMvYXRhL2xpYmFoY2kuYwppbmRleCAzYzkyZGJkLi5hMGUzYzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhaGNpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYWhjaS5jCkBAIC0xNzI0LDYgKzE3MjQsOCBAQAogCX0KIH0KIAorLyoKKyovCiBpcnFyZXR1cm5fdCBhaGNpX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCiB7CiAJc3RydWN0IGF0YV9ob3N0ICpob3N0ID0gZGV2X2luc3RhbmNlOwpAQCAtMTgwOCw2ICsxODEwLDU3IEBACiAJCXBwLT5mYnNfbGFzdF9kZXYgPSBxYy0+ZGV2LT5saW5rLT5wbXA7CiAJfQogCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fQUhDSV9QUk9GKQorCWlmIChlbmFibGVfYWhjaV9wcm9mKSB7CisJCXN0cnVjdCBhaGNpX3BvcnRfc3RhdHMgKnN0YXRzID0gJmFoY2lfcG9ydF9zdGF0c1thcC0+cG9ydF9ub107CisJCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwkJaW50IGJpbjsKKworCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisKKwkJaWYgKHN0YXRzLT5pbml0X3Byb2YpIHsKKwkJCWludCBkaWZmX3RpbWVfdXM7CisKKwkJCWRpZmZfdGltZV91cyA9IChub3cudHZfc2VjIC0gc3RhdHMtPmxhc3RfcmVxLnR2X3NlYykgKiAxMDAwICogMTAwMCArIChub3cudHZfdXNlYyAtIHN0YXRzLT5sYXN0X3JlcS50dl91c2VjKTsKKworCQkJYmluID0gZGlmZl90aW1lX3VzID4+IFVTX1NISUZUOworCQkJaWYgKGJpbiA+PSBNQVhfQklOUykKKwkJCQliaW4gPSBNQVhfQklOUyAtIDE7CisKKwkJCXN0YXRzLT50aW1lX2NvdW50ZXJbYmluXSsrOworCQl9CisJCWVsc2UgeworCQkJc3RhdHMtPmluaXRfcHJvZiA9IDE7CisJCX0KKworCQlzdGF0cy0+bGFzdF9yZXEgPSBub3c7CisKKwkJYmluID0gcWMtPm5ieXRlcyA+PiBCWVRFX1NISUZUOworCQlpZiAoYmluID49IE1BWF9CSU5TKQorCQkJYmluID0gTUFYX0JJTlMgLSAxOworCisJCXN0YXRzLT5kYXRhX2NvdW50ZXJbYmluXSsrOworCisJCWlmICghc3RhdHMtPm5iX3BlbmRpbmcpIHsKKwkJCXN0YXRzLT5maXJzdF9pc3N1ZSA9IG5vdzsKKwkJCXN0YXRzLT5uYl9wZW5kaW5nX3RvdGFsID0gMDsKKwkJfQorCisJCXN0YXRzLT5uYl9wZW5kaW5nX3RvdGFsKys7CisKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgKi8KKwkJc3RhdHMtPnBlbmRpbmdfY291bnRlcltzdGF0cy0+bmJfcGVuZGluZyAmIChNQVhfQUhDSV9TTE9UUyAtIDEpXSsrOworCisJCXN0YXRzLT5uYl9wZW5kaW5nKys7CisKKwkJaWYgKHN0YXRzLT5uYl9wZW5kaW5nX3RvdGFsID4gc3RhdHMtPm5iX3BlbmRpbmdfbWF4KQorCQkJc3RhdHMtPm5iX3BlbmRpbmdfbWF4ID0gc3RhdHMtPm5iX3BlbmRpbmdfdG90YWw7CisKKwkJc3RhdHMtPmJ5dGVzX3BlbmRpbmcgKz0gcWMtPm5ieXRlczsKKwkJc3RhdHMtPnBlbmRpbmdfZmxhZyB8PSAxIDw8IHFjLT50YWc7CisJfQorI2VuZGlmCisKIAl3cml0ZWwoMSA8PCBxYy0+dGFnLCBwb3J0X21taW8gKyBQT1JUX0NNRF9JU1NVRSk7CiAKIAlhaGNpX3N3X2FjdGl2aXR5KHFjLT5kZXYtPmxpbmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKaW5kZXggYzA0YWQ2OC4uMGQyODVlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCkBAIC00NjYzLDYgKzQ2NjMsMTUgQEAKICNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0FIQ0lfUFJPRikKKworI2luY2x1ZGUgImFoY2kuaCIKKworc3RydWN0IGFoY2lfcG9ydF9zdGF0cyBhaGNpX3BvcnRfc3RhdHNbTUFYX0FIQ0lfUE9SVFNdOwordW5zaWduZWQgaW50IGVuYWJsZV9haGNpX3Byb2YgPSAwOworCisjZW5kaWYKKwogLyoqCiAgKglhdGFfcWNfbmV3IC0gUmVxdWVzdCBhbiBhdmFpbGFibGUgQVRBIGNvbW1hbmQsIGZvciBxdWV1ZWluZwogICoJQGFwOiB0YXJnZXQgcG9ydApAQCAtNDY5MCw2ICs0Njk5LDEzIEBACiAJaWYgKHFjKQogCQlxYy0+dGFnID0gaTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0FIQ0lfUFJPRikKKwlpZiAoZW5hYmxlX2FoY2lfcHJvZikKKwkJaWYgKHFjID09IE5VTEwpIHsKKwkJCWFoY2lfcG9ydF9zdGF0c1thcC0+cG9ydF9ub10ubm9fZnJlZV9zbG90Kys7CisJCX0KKyNlbmRpZgorCiAJcmV0dXJuIHFjOwogfQogCkBAIC00NzQxLDYgKzQ3NTcsNDggQEAKIAlpZiAobGlrZWx5KGF0YV90YWdfdmFsaWQodGFnKSkpIHsKIAkJcWMtPnRhZyA9IEFUQV9UQUdfUE9JU09OOwogCQljbGVhcl9iaXQodGFnLCAmYXAtPnFjX2FsbG9jYXRlZCk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19BSENJX1BST0YpCisJCWlmIChlbmFibGVfYWhjaV9wcm9mKSB7CisJCQlzdHJ1Y3QgYWhjaV9wb3J0X3N0YXRzICpzdGF0cyA9ICZhaGNpX3BvcnRfc3RhdHNbYXAtPnBvcnRfbm9dOworCisJCQlpZiAoc3RhdHMtPnBlbmRpbmdfZmxhZyAmICgxIDw8IHRhZykpIHsKKwkJCQlzdGF0cy0+cGVuZGluZ19mbGFnICY9IH4oMSA8PCB0YWcpOworCQkJCXN0YXRzLT5uYl9wZW5kaW5nLS07CisKKwkJCQlpZiAoIXN0YXRzLT5uYl9wZW5kaW5nKSB7CisJCQkJCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwkJCQkJaW50IGRpZmZfdGltZV91czsKKwkJCQkJdW5zaWduZWQgaW50IHJhdGU7CisJCQkJCWludCBiaW47CisKKwkJCQkJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCisJCQkJCWRpZmZfdGltZV91cyA9ICgobm93LnR2X3NlYyAtIHN0YXRzLT5maXJzdF9pc3N1ZS50dl9zZWMpICogMTAwMCAqIDEwMDApICsKKwkJCQkJCQkJKG5vdy50dl91c2VjIC0gc3RhdHMtPmZpcnN0X2lzc3VlLnR2X3VzZWMpOworCisJCQkJCXN0YXRzLT5kaWZmX3VzICs9IGRpZmZfdGltZV91czsKKworCQkJCQkvKiBEbyB0aGUgYXZlcmFnZSBmb3IgYXQgbGVhc3QgMTBNaUIgb2YgZGF0YSB0cmFuc2ZlcmVkICovCisJCQkJCWlmIChzdGF0cy0+Ynl0ZXNfcGVuZGluZyA+ICgxMCAqICgxIDw8IDIwKSkpIHsKKworCQkJCQkJcmF0ZSA9ICgoc3RhdHMtPmJ5dGVzX3BlbmRpbmcgLyBzdGF0cy0+ZGlmZl91cykgKiAxMDAwICogMTAwMCkgPj4gMjA7IC8vTWlCcHMKKworCQkJCQkJYmluID0gcmF0ZSA+PiBSQVRFX1NISUZUOworCQkJCQkJaWYgKGJpbiA+PSBNQVhfQklOUykKKwkJCQkJCQliaW4gPSBNQVhfQklOUyAtIDE7CisKKwkJCQkJCS8qIFRyYWNrIGhvdyBtYW55IEtpQiB3ZXJlIHRyYW5zZmVyZWQgYXQgdGhpcyByYXRlICovCisJCQkJCQlzdGF0cy0+cmF0ZV9jb3VudGVyW2Jpbl0gKz0gc3RhdHMtPmJ5dGVzX3BlbmRpbmcgPj4gMTA7CisKKwkJCQkJCS8qIFJlc2V0IHN0YXRzICovCisJCQkJCQlzdGF0cy0+Ynl0ZXNfcGVuZGluZyA9IDA7CisJCQkJCQlzdGF0cy0+ZGlmZl91cyA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKaW5kZXggYjk2NTQ0YS4uMTk1NWQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCkBAIC0xMTQ2LDMgKzExNDYsMTkyIEBACiAJcmV0dXJuIGFzeW5jX2Vycm9yOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3BtX3dhaXRfZm9yX2Rldik7CisKKworLyoKKyAqIENvZGUgYWRkZWQgdG8gc3VwcG9wcnQgIGRldmljZSBTVVNQRU5EKEwxIGFuZCBMMiApIGFuZCBSRVNVTUUKKyAqIChMMSA9IGNsb2NrIGdhdGluZyBMMiA9IGNsb2NrIGdhdGluZyArIHJlc2V0KSAuCisgKiBEZXBlbmRzIHVwb24gY29uZmlnIG9wdGlvbiBDT05GSUdfUE1fU1lTRlNfTUFOVUFMCisgKgorICovCisKKyNpZmRlZiBDT05GSUdfUE1fU1lTRlNfTUFOVUFMCisKK3N0YXRpYyBERUZJTkVfTVVURVgoZHBtX2xvY2spOworCisvKioKKyAqCWRwbV9tYW51YWxfcmVzdW1lIC0gcmVzdW1lIHRoZSBkZXZpY2UgLgorICogICAgICB1c2VzIGRldmljZV9yZXN1bWUgYW5kIGRldmljZV9jb21wbGV0ZSB0byBhY2hlaXZlIGZlYXR1cmUuCisgKiAgICAgIHBhcnQgb2YgdGhlIGNvZGUgYm9ycm93ZWQgZnJvbSBkcG1fcmVzdW1lIGFuZCBkcG1fcmVzdW1lX2NvbXBsZXRlLgorICoJQGRldjogICBEZXZpY2UuCisgKiAJQHN0YXRlOiBTdGF0ZSB0byBlbnRlci4KKyovCisKK3ZvaWQgZHBtX21hbnVhbF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2LHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWt0aW1lX3Qgc3RhcnR0aW1lID0ga3RpbWVfZ2V0KCk7CisKKwltaWdodF9zbGVlcCgpOworCisJLyogRGV2aWNlIHJlc3VtZSBwcmVwYXJlIHN0YXJ0cyBoZXJlICovCisJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKKyAgICAgICAgcG1fdHJhbnNpdGlvbiA9IHN0YXRlOworCUlOSVRfQ09NUExFVElPTihkZXYtPnBvd2VyLmNvbXBsZXRpb24pOworCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKKworCWVycm9yID0gZGV2aWNlX3Jlc3VtZShkZXYsIHN0YXRlLCBmYWxzZSk7CisJaWYgKGVycm9yKSB7CisJCXN1c3BlbmRfc3RhdHMuZmFpbGVkX3Jlc3VtZSsrOworCQlkcG1fc2F2ZV9mYWlsZWRfc3RlcChTVVNQRU5EX1JFU1VNRSk7CisJCWRwbV9zYXZlX2ZhaWxlZF9kZXYoZGV2X25hbWUoZGV2KSk7CisJCXBtX2Rldl9lcnIoZGV2LCBzdGF0ZSwgIiIsIGVycm9yKTsKKwl9CisKKwltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOworCWlmICghbGlzdF9lbXB0eSgmZGV2LT5wb3dlci5lbnRyeSkpCisJCWxpc3RfbW92ZV90YWlsKCZkZXYtPnBvd2VyLmVudHJ5LCAmZHBtX3ByZXBhcmVkX2xpc3QpOworCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKKwkKKwkvKiBEUE0gY29tcGxldGUgc3RhcnQgKi8KKwlJTklUX0xJU1RfSEVBRCgmbGlzdCk7CisJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKKwlkZXYtPnBvd2VyLmlzX3ByZXBhcmVkID0gZmFsc2U7CisJbGlzdF9tb3ZlKCZkZXYtPnBvd2VyLmVudHJ5LCAmbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkcG1fbGlzdF9tdHgpOworCisJZGV2aWNlX2NvbXBsZXRlKGRldiwgc3RhdGUpOworCWRldi0+cG93ZXIucG93ZXJfc3RhdGU9c3RhdGU7CisJZHBtX3Nob3dfdGltZShzdGFydHRpbWUsIHN0YXRlLCBOVUxMKTsKK30KKworCisvKioKKyAqCWRwbV9tYW51YWxfcmVzdW1lX3N0YXJ0IC0gU3RhcnQgdGhlIHByb2Nlc3MgZm9yIFBvd2VyIG9uZSBkZXZpY2UgYmFjayB0byB3b3JrLgorICoJQGRldjogICBEZXZpY2UuCisgKglAc3RhdGU6IFN0YXRlIHRvIGVudGVyLgorICogICAgICBDb2RlIGluc3BpcmVkIGZyb20gZHBtX3Jlc3VtZV9lbmQoKS4KKyAqCisgKglCcmluZyBvbmUgZGV2aWNlIGJhY2sgdG8gdGhlIG9uIHN0YXRlIGJ5IGZpcnN0IHBvd2VyaW5nIGl0CisgKglvbiwgdGhlbiByZXN0b3Jpbmcgc3RhdGUuIFdlIG9ubHkgb3BlcmF0ZSBvbiBkZXZpY2VzIHRoYXQgYXJlbid0CisgKglhbHJlYWR5IG9uLgorICovCisKK3ZvaWQgZHBtX21hbnVhbF9yZXN1bWVfc3RhcnQoc3RydWN0IGRldmljZSAqIGRldixwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJbXV0ZXhfbG9jaygmZHBtX2xvY2spOworCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IHN0YXRlLmV2ZW50KXsKKwkJcHJpbnRrKEtFUk5fRVJSICJQTTogV2UgYXJlIGFscmVhZHkgaW4gdGhlIHJlc3VtZSBzdGF0ZSBcbiIpOworCQlnb3RvIGRvbmU7CisgICAgICAgIH0KKwkvKiBEZXZpY2UgcmVzdW1lIHN0YXJ0cyBmcm9tIGhlcmUgKi8KKwlkcG1fbWFudWFsX3Jlc3VtZShkZXYsc3RhdGUpOworZG9uZToKKwltdXRleF91bmxvY2soJmRwbV9sb2NrKTsKKworfQorCisvKioKKyAqCWRwbV9tYW51YWxfcHJlcGFyZSAtIHByZXBhcmUgdGhlIGRldmljZSBmb3IgcG93ZXIgdHJhbnNpdGlvbi4KKyAqCVBhcnQgb2YgdGhlIGNvZGUgYm9ycm93ZWQgZnJvbSBkcG1fcHJhcGFyZS4KKyAqCUBkZXY6ICAgRGV2aWNlLgorICoJQHN0YXRlOiBTdGF0ZSB0byBlbnRlci4KKyAqLworc3RhdGljIGludCBkcG1fbWFudWFsX3ByZXBhcmUoc3RydWN0IGRldmljZSAqIGRldiAsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwkvKiBUaGlzIHBhcnQgb2YgY29kZSBpcyBib3Jyb3dlZCBmcm9tIGRwbV9wcmVwYXJlCisJICogbWFrZSB0aGUgZGVpY2UgZm9yIHByZXBhcmUuCisJKi8KKwlpbnQgZXJyb3IgPSAwOworCW1pZ2h0X3NsZWVwKCk7CisJCisJLyogQ2FsbCB0aGUgZGV2aWNlIHByZXBhcmUgKi8KKwllcnJvciA9IGRldmljZV9wcmVwYXJlKGRldiwgc3RhdGUpOworCisJbXV0ZXhfbG9jaygmZHBtX2xpc3RfbXR4KTsKKwlpZiAoZXJyb3IpeworCQlwcmludGsoS0VSTl9JTkZPICJQTTogRGV2aWNlICVzIG5vdCBwcmVwYXJlZCAiICJmb3IgcG93ZXIgdHJhbnNpdGlvbjogY29kZSAlZFxuIiwKKwkJCWRldl9uYW1lKGRldiksIGVycm9yKTsKKwkJZ290byBkb25lOworCX0KKwlkZXYtPnBvd2VyLmlzX3ByZXBhcmVkID0gdHJ1ZTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+cG93ZXIuZW50cnkpKQorCQlsaXN0X21vdmVfdGFpbCgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9wcmVwYXJlZF9saXN0KTsKKworZG9uZToKKwltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CQorCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKglkcG1fbWFudWFsX3N1c3BlbmQgLSBIZWxwZXIgcm91dGluZyB0byBjYWxsIHRoZSBkZXZpY2Vfc3VzcGVuZC4KKyAqCVBhcnQgb2YgdGhlIGNvZGUgYm9ycm93ZWQgZnJvbSBkcG1fc3VwZW5kKCkuCisgKglAZGV2OiAgIERldmljZS4KKyAqCUBzdGF0ZTogU3RhdGUgdG8gZW50ZXIuCisgKi8KK3N0YXRpYyBpbnQgZHBtX21hbnVhbF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlrdGltZV90IHN0YXJ0dGltZTsKKwlpbnQgZXJyb3I9MDsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwltdXRleF9sb2NrKCZkcG1fbGlzdF9tdHgpOworCXBtX3RyYW5zaXRpb24gPSBzdGF0ZTsKKwltdXRleF91bmxvY2soJmRwbV9saXN0X210eCk7CisJCisJZXJyb3IgPSBkZXZpY2Vfc3VzcGVuZChkZXYpOworCQorCW11dGV4X2xvY2soJmRwbV9saXN0X210eCk7CisJaWYgKGVycm9yKXsKKwkJcG1fZGV2X2VycihkZXYsIHN0YXRlLCAiIiwgZXJyb3IpOworICAgICAgICAgICAgICAgIGRwbV9zYXZlX2ZhaWxlZF9kZXYoZGV2X25hbWUoZGV2KSk7CisJfQkKKwlpZiAoIWxpc3RfZW1wdHkoJmRldi0+cG93ZXIuZW50cnkpKQorCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZkcG1fc3VzcGVuZGVkX2xpc3QpOworCW11dGV4X3VubG9jaygmZHBtX2xpc3RfbXR4KTsKKworCWRldi0+cG93ZXIucG93ZXJfc3RhdGU9c3RhdGU7CisJZHBtX3Nob3dfdGltZShzdGFydHRpbWUsIHN0YXRlLCBOVUxMKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogICAgICBkcG1fbWFudWFsX3N1c3BlbmRfc3RhcnQgLSBQdXQgb25lIGRldmljZSBpbiBQb3dlciBvZiBMMS9MMiBzdGF0ZS4KKyAqICAgICAgUG93ZXIgb2ZmIEwxIC0gY2xvY2sgZ2F0aW5nICwgUG93ZXIgb2ZmIEwyIC0gY2xvY2sgZ2F0aW5nICsgZGV2aWNlIHJlc2V0CisgKiAgCVBhcnQgb2YgdGhlIGNvZGUgYm9ycm93ZWQgZnJvbSBkcG1fc3VzcGVuZF9zdGFydC4KKyAqICAgICAgQGRldjogICBEZXZpY2UuCisgKiAgICAgIEBzdGF0ZTogU3RhdGUgdG8gZW50ZXIuCisgKi8KK2ludCBkcG1fbWFudWFsX3N1c3BlbmRfc3RhcnQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWludCBlcnJvcj0wOworCisJLyogU3RhcnQgdGhlIGdsb2JhbCBtdXRleCB2YWx1ZSovCisJbXV0ZXhfbG9jaygmZHBtX2xvY2spOworCisJaWYgKGRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gc3RhdGUuZXZlbnQpeworCQlpZiAoIHN0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQgKQorCQkJcHJpbnRrKEtFUk5fRVJSICJQTTogV2UgYXJlIGFscmVhZHkgaW4gdGhlIHN1c3BlbmQgKHBvd2VyIG9mZiBMMSkgc3RhdGUgXG4iKTsKKyNpZiAwCisJCWVsc2UgaWYgKCBzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5EX0wyKQorCQkJcHJpbnRrKEtFUk5fRVJSICJQTTogV2UgYXJlIGFscmVhZHkgaW4gdGhlIHN1c3BlbmQgKFBvd2VyIG9mZiBMMikgc3RhdGUgXG4iKTsKKyNlbmRpZgorCQlnb3RvIGRvbmU7CisgICAgICAgIH0KKworCS8qIERldmNlIFBNIHByZXBhcmUgc3RhcnRzIGZyb20gaGVyZSAqLworCWVycm9yPWRwbV9tYW51YWxfcHJlcGFyZShkZXYsc3RhdGUpOworCQorCWlmIChlcnJvcil7CisJCXN1c3BlbmRfc3RhdHMuZmFpbGVkX3ByZXBhcmUrKzsKKwkJZHBtX3NhdmVfZmFpbGVkX3N0ZXAoU1VTUEVORF9QUkVQQVJFKTsKKwkJZ290byBkb25lOworCX1lbHNlCisJCWVycm9yID0gZHBtX21hbnVhbF9zdXNwZW5kKGRldixzdGF0ZSk7CQorZG9uZToKKwltdXRleF91bmxvY2soJmRwbV9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYwppbmRleCA5NTcwNmZhLi5mZTEwYjg0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAuYwpAQCAtMzMwLDYgKzMzMCw3IEBACiB7CiAJc3RydWN0IGRldmljZV9vcHAgKmRldl9vcHA7CiAJc3RydWN0IG9wcCAqdGVtcF9vcHAsICpvcHAgPSBFUlJfUFRSKC1FTk9ERVYpOworCWludCBjID0gMDsKIAogCWlmICghZGV2IHx8ICFmcmVxKSB7CiAJCWRldl9lcnIoZGV2LCAiJXM6IEludmFsaWQgYXJndW1lbnQgZnJlcT0lcFxuIiwgX19mdW5jX18sIGZyZXEpOwpAQCAtMzQxLDEwICszNDIsMTUgQEAKIAkJcmV0dXJuIG9wcDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHRlbXBfb3BwLCAmZGV2X29wcC0+b3BwX2xpc3QsIG5vZGUpIHsKKwkJKytjOwogCQlpZiAodGVtcF9vcHAtPmF2YWlsYWJsZSkgewogCQkJLyogZ28gdG8gdGhlIG5leHQgbm9kZSwgYmVmb3JlIGNob29zaW5nIHByZXYgKi8KIAkJCWlmICh0ZW1wX29wcC0+cmF0ZSA+ICpmcmVxKQorCQkJeworCQkJCWlmIChjID09IDEpCisJCQkJCW9wcCA9IHRlbXBfb3BwOwogCQkJCWJyZWFrOworCQkJfQogCQkJZWxzZQogCQkJCW9wcCA9IHRlbXBfb3BwOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcG93ZXIuaCBiL2RyaXZlcnMvYmFzZS9wb3dlci9wb3dlci5oCmluZGV4IDliZjYyMzIuLjhlOWQwOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9wb3dlci5oCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9wb3dlci5oCkBAIC04MSwzICs4MSwxNSBAQAogc3RhdGljIGlubGluZSB2b2lkIHdha2V1cF9zeXNmc19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KSB7fQogCiAjZW5kaWYKKworLyogQWRkZWQgZm9yIFNZU0ZTIHN1cHBvcnQgdG8gaGFuZGxlIGZyb20gRGV2aWNlIHBvd2VyIG1hbmFnZW1lbnQgZnJvbSAKKyAqIHVzZXIgc3BhY2UuIE1hbnVhbCBQTSAgY29uZmlndXJhdGlvbi4KKyAqLworCisjaWZkZWYgIENPTkZJR19QTV9TWVNGU19NQU5VQUwKKworZXh0ZXJuIGludCBkcG1fbWFudWFsX3N1c3BlbmRfc3RhcnQoc3RydWN0IGRldmljZSAqICwgcG1fbWVzc2FnZV90ICk7CitleHRlcm4gdm9pZCBkcG1fbWFudWFsX3Jlc3VtZV9zdGFydChzdHJ1Y3QgZGV2aWNlICogLCBwbV9tZXNzYWdlX3QpOworCisjZW5kaWYgLyogQ09ORklHX1BNX1NZU0ZTX01BTlVBTCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCmluZGV4IGFkZjQxYmUwLi4xZDJkYjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYwpAQCAtODksNiArODksMTIgQEAKICAqCXZhbHVlIGFyZSB1c2VkIG9ubHkgaWYgdGhlIGRyaXZlciBjYWxscyBwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgpLgogICoKICAqCXdha2V1cF9jb3VudCAtIFJlcG9ydCB0aGUgbnVtYmVyIG9mIHdha2V1cCBldmVudHMgcmVsYXRlZCB0byB0aGUgZGV2aWNlCisgKiAgICAgIAorICogICAgICBNU1BEOiBBZGRlZCB0aGUgc3VwcG9ydCBmb3IgbWFudWFsIFBNIG9wZXJhdGlvbiBmb3IgTk9OLUNQVSBkZXZpY2VzLgorICogICAgICBUaGlzIGlzIG9wZXJhdGVkIHRocm91Z2ggcG93ZXIvc3RhdGUgZmlsZSAuIG9wZXJhdGVzIGluIHR3byBzdGF0ZXMKKyAqICAgICAgUE1fRVZFTlRfU1VTUEVORD0gUG93ZXIgb2ZmIEwxIHN0YXRlIChkZXZpY2UgQ2xvY2sgZ2F0aW5nICkKKyAqCVBNX0VWRU5UX1NVU1BFTkRfTDI9UG93ZXIgb2ZmIEwyIHN0YXRlICggZGV2aWNlIENsb2NrIGdhdGluZyArIHJlc2V0KS4gCisgKiAgICAgIAogICovCiAKIHN0YXRpYyBjb25zdCBjaGFyIGVuYWJsZWRbXSA9ICJlbmFibGVkIjsKQEAgLTk3LDYgKzEwMyw0NCBAQAogY29uc3QgY2hhciBwb3dlcl9ncm91cF9uYW1lW10gPSAicG93ZXIiOwogRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfZ3JvdXBfbmFtZSk7CiAKKyNpZmRlZiBDT05GSUdfUE1fU1lTRlNfTUFOVUFMCitzdGF0aWMgc3NpemVfdCBzdGF0ZV9zaG93KHN0cnVjdCBkZXZpY2UgKiBkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICogYnVmKQoreworCWlmIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIC8qIFBvd2VyIG9mZiBMMSBzdGF0ZSAqLworCQlyZXR1cm4gc3ByaW50ZihidWYsICIyXG4iKTsKKyNpZiAwCisJZWxzZSBpZiAoZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5EX0wyKSAvKiBQb3dlciBvZmYgTDIgc3RhdGUgKi8KKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiM1xuIik7CisjZW5kaWYKKwllbHNlIAorCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RhdGVfc3RvcmUoc3RydWN0IGRldmljZSAqIGRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKiBidWYsIHNpemVfdCBuKQoreworCXBtX21lc3NhZ2VfdCBzdGF0ZTsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCQorCWlmICgobiA9PSAyKSAmJiAoYnVmWzBdID09ICcyJykpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5ldmVudCA9IFBNX0VWRU5UX1NVU1BFTkQ7IAorICAgICAgICAgICAgICAgIGVycm9yID0gZHBtX21hbnVhbF9zdXNwZW5kX3N0YXJ0KGRldiwgc3RhdGUpOyAvKiBQb3dlciBvZmYgTDEgc3RhdGUgKi8KKyAgICAgICAgfQorI2lmIDAKKwlpZiAoKG4gPT0gMikgJiYgKGJ1ZlswXSA9PSAnMycpKSB7CisgICAgICAgICAgICAgICAgc3RhdGUuZXZlbnQgPSBQTV9FVkVOVF9TVVNQRU5EX0wyOworICAgICAgICAgICAgICAgIGVycm9yID0gZHBtX21hbnVhbF9zdXNwZW5kKGRldiwgc3RhdGUpOyAgICAgICAvKiBQb3dlciBvZmYgTDIgc3RhdGUgKi8KKyAgICAgICAgfQkKKyNlbmRpZgorCWlmICgobiA9PSAyKSAmJiAoYnVmWzBdID09ICcwJykpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS5ldmVudCA9IFBNX0VWRU5UX1JFU1VNRTsKKyAgICAgICAgICAgICAgICBkcG1fbWFudWFsX3Jlc3VtZV9zdGFydChkZXYsIHN0YXRlKTsKKwkJZXJyb3IgPSAwOworICAgICAgICB9CisJcmV0dXJuIGVycm9yID8gZXJyb3IgOiBuOworfQorc3RhdGljIERFVklDRV9BVFRSKHN0YXRlLCAwNjQ0LCBzdGF0ZV9zaG93LCBzdGF0ZV9zdG9yZSk7CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCiBzdGF0aWMgY29uc3QgY2hhciBjdHJsX2F1dG9bXSA9ICJhdXRvIjsKIHN0YXRpYyBjb25zdCBjaGFyIGN0cmxfb25bXSA9ICJvbiI7CkBAIC00MzIsMTEgKzQ3NiwxMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gbjsKIH0KLQogc3RhdGljIERFVklDRV9BVFRSKGFzeW5jLCAwNjQ0LCBhc3luY19zaG93LCBhc3luY19zdG9yZSk7CiAjZW5kaWYgLyogQ09ORklHX1BNX0FEVkFOQ0VEX0RFQlVHICovCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwb3dlcl9hdHRyc1tdID0geworI2lmZGVmIENPTkZJR19QTV9TWVNGU19NQU5VQUwKKwkgJmRldl9hdHRyX3N0YXRlLmF0dHIsCisjZW5kaWYKICNpZmRlZiBDT05GSUdfUE1fQURWQU5DRURfREVCVUcKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAkmZGV2X2F0dHJfYXN5bmMuYXR0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yYW5kb20uYyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwppbmRleCA2MDM1YWI4Li44YzNhY2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9jaGFyL3JhbmRvbS5jCkBAIC0xMzAsNiArMTMwLDkgQEAKICAqIAl2b2lkIGFkZF9pbnRlcnJ1cHRfcmFuZG9tbmVzcyhpbnQgaXJxKTsKICAqIAl2b2lkIGFkZF9kaXNrX3JhbmRvbW5lc3Moc3RydWN0IGdlbmRpc2sgKmRpc2spOwogICoKKyAqICAgICAgdm9pZCByYW5kb21faW5wdXRfd29yZHMoX191MzIgKmJ1Ziwgc2l6ZV90IHdvcmRjb3VudCwgaW50IGVudF9jb3VudCkKKyAqICAgICAgaW50IHJhbmRvbV9pbnB1dF93YWl0KHZvaWQpOworICoKICAqIGFkZF9pbnB1dF9yYW5kb21uZXNzKCkgdXNlcyB0aGUgaW5wdXQgbGF5ZXIgaW50ZXJydXB0IHRpbWluZywgYXMgd2VsbCBhcwogICogdGhlIGV2ZW50IHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgaGFyZHdhcmUuCiAgKgpAQCAtMTQ3LDYgKzE1MCwxMyBAQAogICogc2VlayB0aW1lcyBkbyBub3QgbWFrZSBmb3IgZ29vZCBzb3VyY2VzIG9mIGVudHJvcHksIGFzIHRoZWlyIHNlZWsKICAqIHRpbWVzIGFyZSB1c3VhbGx5IGZhaXJseSBjb25zaXN0ZW50LgogICoKKyAqIHJhbmRvbV9pbnB1dF93b3JkcygpIGp1c3QgcHJvdmlkZXMgYSByYXcgYmxvY2sgb2YgZW50cm9weSB0byB0aGUgaW5wdXQKKyAqIHBvb2wsIHN1Y2ggYXMgZnJvbSBhIGhhcmR3YXJlIGVudHJvcHkgZ2VuZXJhdG9yLgorICoKKyAqIHJhbmRvbV9pbnB1dF93YWl0KCkgc3VzcGVuZHMgdGhlIGNhbGxlciB1bnRpbCBzdWNoIHRpbWUgYXMgdGhlCisgKiBlbnRyb3B5IHBvb2wgZmFsbHMgYmVsb3cgdGhlIHdyaXRlIHRocmVzaG9sZCwgYW5kIHJldHVybnMgYSBjb3VudCBvZiBob3cKKyAqIG11Y2ggZW50cm9weSAoaW4gYml0cykgaXMgbmVlZGVkIHRvIHN1c3RhaW4gdGhlIHBvb2wuCisgKgogICogQWxsIG9mIHRoZXNlIHJvdXRpbmVzIHRyeSB0byBlc3RpbWF0ZSBob3cgbWFueSBiaXRzIG9mIHJhbmRvbW5lc3MgYQogICogcGFydGljdWxhciByYW5kb21uZXNzIHNvdXJjZS4gIFRoZXkgZG8gdGhpcyBieSBrZWVwaW5nIHRyYWNrIG9mIHRoZQogICogZmlyc3QgYW5kIHNlY29uZCBvcmRlciBkZWx0YXMgb2YgdGhlIGV2ZW50IHRpbWluZ3MuCkBAIC03MjIsNiArNzMyLDYzIEBACiB9CiAjZW5kaWYKIAorLyoKKyAqIHJhbmRvbV9pbnB1dF93b3JkcyAtIGFkZCBidWxrIGVudHJvcHkgdG8gcG9vbAorICoKKyAqIEBidWY6IGJ1ZmZlciB0byBhZGQKKyAqIEB3b3JkY291bnQ6IG51bWJlciBvZiBfX3UzMiB3b3JkcyB0byBhZGQKKyAqIEBlbnRfY291bnQ6IHRvdGFsIGFtb3VudCBvZiBlbnRyb3B5IChpbiBiaXRzKSB0byBjcmVkaXQKKyAqCisgKiB0aGlzIHByb3ZpZGVzIGJ1bGsgaW5wdXQgb2YgZW50cm9weSB0byB0aGUgaW5wdXQgcG9vbAorICoKKyAqLwordm9pZCByYW5kb21faW5wdXRfd29yZHMoX191MzIgKmJ1Ziwgc2l6ZV90IHdvcmRjb3VudCwgaW50IGVudF9jb3VudCkKK3sKKwltaXhfcG9vbF9ieXRlcygmaW5wdXRfcG9vbCwgYnVmLCB3b3JkY291bnQqNCk7CisKKwljcmVkaXRfZW50cm9weV9iaXRzKCZpbnB1dF9wb29sLCBlbnRfY291bnQpOworCisJREVCVUdfRU5UKCJjcmVkaXRpbmcgJWQgYml0cyA9PiAlZFxuIiwKKwkJICBlbnRfY291bnQsIGlucHV0X3Bvb2wuZW50cm9weV9jb3VudCk7CisJLyoKKwkgKiBXYWtlIHVwIHdhaXRpbmcgcHJvY2Vzc2VzIGlmIHdlIGhhdmUgZW5vdWdoCisJICogZW50cm9weS4KKwkgKi8KKwlpZiAoaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50ID49IHJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2gpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmFuZG9tX3JlYWRfd2FpdCk7Cit9CitFWFBPUlRfU1lNQk9MKHJhbmRvbV9pbnB1dF93b3Jkcyk7CisKKy8qCisgKiByYW5kb21faW5wdXRfd2FpdCAtIHdhaXQgdW50aWwgcmFuZG9tIG5lZWRzIGVudHJvcHkKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIHNsZWVwcyB1bnRpbCB0aGUgL2Rldi9yYW5kb20gc3Vic3lzdGVtIGFjdHVhbGx5CisgKiBuZWVkcyBtb3JlIGVudHJvcHksIGFuZCB0aGVuIHJldHVybiB0aGUgYW1vdW50IG9mIGVudHJvcHkKKyAqIHRoYXQgaXQgd291bGQgYmUgbmljZSB0byBoYXZlIGFkZGVkIHRvIHRoZSBzeXN0ZW0uCisgKi8KK2ludCByYW5kb21faW5wdXRfd2FpdCh2b2lkKQoreworCWludCBjb3VudDsKKworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShyYW5kb21fd3JpdGVfd2FpdCwgCisJCQkgaW5wdXRfcG9vbC5lbnRyb3B5X2NvdW50IDwgcmFuZG9tX3dyaXRlX3dha2V1cF90aHJlc2gpOworCisJY291bnQgPSByYW5kb21fd3JpdGVfd2FrZXVwX3RocmVzaCAtIGlucHV0X3Bvb2wuZW50cm9weV9jb3VudDsKKworICAgICAgICAvKiBsaWtlbHkgd2UgZ290IHdva2VuIHVwIGR1ZSB0byBhIHNpZ25hbCAqLworCWlmIChjb3VudCA8PSAwKSBjb3VudCA9IHJhbmRvbV9yZWFkX3dha2V1cF90aHJlc2g7IAorCisJREVCVUdfRU5UKCJyZXF1ZXN0aW5nICVkIGJpdHMgZnJvbSBpbnB1dF93YWl0KCllciAlZDwlZFxuIiwKKwkJICBjb3VudCwKKwkJICBpbnB1dF9wb29sLmVudHJvcHlfY291bnQsIHJhbmRvbV93cml0ZV93YWtldXBfdGhyZXNoKTsKKworCXJldHVybiBjb3VudDsKK30KK0VYUE9SVF9TWU1CT0wocmFuZG9tX2lucHV0X3dhaXQpOworCisKKyNkZWZpbmUgRVhUUkFDVF9TSVpFIDEwCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBFbnRyb3B5IGV4dHJhY3Rpb24gcm91dGluZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKaW5kZXggZTI0YTJhMS4uYzA4Yjk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKKysrIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKQEAgLTQ1LDcgKzQ1LDcgQEAKIGNob2ljZQogCXByb21wdCAiRGVmYXVsdCBDUFVGcmVxIGdvdmVybm9yIgogCWRlZmF1bHQgQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFIGlmIENQVV9GUkVRX1NBMTEwMCB8fCBDUFVfRlJFUV9TQTExMTAKLQlkZWZhdWx0IENQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFCisJZGVmYXVsdCBDUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHNldHMgd2hpY2ggQ1BVRnJlcSBnb3Zlcm5vciBzaGFsbCBiZSBsb2FkZWQgYXQKIAkgIHN0YXJ0dXAuIElmIGluIGRvdWJ0LCBzZWxlY3QgJ3BlcmZvcm1hbmNlJy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLmFybSBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLmFybQppbmRleCA3MmEwMDQ0Li5hZDZiOWJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcuYXJtCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLmFybQpAQCAtMzAsMyArMzAsOCBAQAogCSAgU29DIChTNVBWMzEwIG9yIFM1UEMyMTApLgogCiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCisKK2NvbmZpZyBDUFVfRlJFUV9DMksKKwlib29sICJDUFVmcmVxIGRyaXZlciBmb3IgQ29tY2VydG8iCisJZGVwZW5kcyBvbiBBUkNIX0NPTUNFUlRPICYmIENQVV9GUkVRCisJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvTWFrZWZpbGUgYi9kcml2ZXJzL2NwdWZyZXEvTWFrZWZpbGUKaW5kZXggYTQ4YmMwMi4uNWNjMzY4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9NYWtlZmlsZQpAQCAtNDcsMyArNDcsNCBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBQb3dlclBDIHBsYXRmb3JtIGRyaXZlcnMKIG9iai0kKENPTkZJR19DUFVfRlJFUV9NQVBMRSkJCSs9IG1hcGxlLWNwdWZyZXEubworb2JqLSQoQ09ORklHX0NQVV9GUkVRX0MySykgICAgICAgICAgICAgKz0gYzJrLWNwdWZyZXEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2Myay1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvYzJrLWNwdWZyZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNiOWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcHVmcmVxL2Myay1jcHVmcmVxLmMKQEAgLTAsMCArMSwyNTAgQEAKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2RlZmluZSBOUl9GUkVRUyAgICAgICAgMTUKKworLy8jZGVmaW5lIEMyS19DUFVGUkVRX0RFQlVHCisjaWZkZWYgQzJLX0NQVUZSRVFfREVCVUcKKwkjZGVmaW5lIGMya19jcHVmcmVxX2RlYnVnKGZtdCwgYXJnLi4uKSAgIHByaW50ayhmbXQsICMjYXJnKQorI2Vsc2UKKwkjZGVmaW5lIGMya19jcHVmcmVxX2RlYnVnKGZtdCwgYXJnLi4uKSAgICAgOworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciBjcHVmcmVxX2dvdl9vbmRlbWFuZDsKKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSBjb21jZXJ0b19jbGtfZnJxc1tOUl9GUkVRUyArIDFdOworCitzdGF0aWMgaW50IGNvbWNlcnRvX3ZlcmlmeV9zcGVlZChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpZiAocG9saWN5LT5jcHUgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnkocG9saWN5LCBjb21jZXJ0b19jbGtfZnJxcyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29tY2VydG9fZ2V0c3BlZWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY2xrICpjbGtfYXJtOworCisJaWYgKGNwdSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJYzJrX2NwdWZyZXFfZGVidWcgKCIlczogR2V0IHNwZWVkIGZvciBjcHUoJWQpXG4iLCBfX2Z1bmNfXywgY3B1KTsKKworCWNsa19hcm0gPSBjbGtfZ2V0KE5VTEwsImFybSIpOworCWlmIChJU19FUlIoY2xrX2FybSkpIHsKKwkJcHJfZXJyKCJjcHVmcmVxOiBVbmFibGUgdG8gb2J0YWluIEFSTUNMSzogJWxkXG4iLAorCQkJCVBUUl9FUlIoY2xrX2FybSkpOworCQlyZXR1cm4gUFRSX0VSUihjbGtfYXJtKTsKKwl9CisKKwlyZXR1cm4gY2xrX2dldF9yYXRlKGNsa19hcm0pOyAvKiB3ZSBnZXQgZnJlcSBpbiBoeiAqLworfQorCitzdGF0aWMgaW50IGNvbWNlcnRvX3NldF90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlbGF0aW9uKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXVuc2lnbmVkIGludCBpbmRleDsKKwlzdHJ1Y3QgY2xrICpjbGtfYXJtOworCWludCByZXQ7CisJaW50IGogPSAwOworCisJcmV0ID0gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdGFyZ2V0KHBvbGljeSwgY29tY2VydG9fY2xrX2ZycXMsIHRhcmdldF9mcmVxLCByZWxhdGlvbiwgJmluZGV4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwb2xpY3ktPmNwdSA+PSBOUl9DUFVTKSB7CisJCXByX2RlYnVnKCIlczogY291bGRuJ3QgbGltaXQgdG8gQ1BVcyBpbiB0aGlzIGRvbWFpblxuIiwgXAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJY2xrX2FybSA9IGNsa19nZXQoTlVMTCwiYXJtIik7CisJaWYgKElTX0VSUihjbGtfYXJtKSkgeworCQlwcl9lcnIoIiVzOiBjcHVmcmVxOiBVbmFibGUgdG8gb2J0YWluIEFSTUNMSzogJWxkXG4iLCBfX2Z1bmNfXyxcCisJCQkJUFRSX0VSUihjbGtfYXJtKSk7CisJCXJldHVybiBQVFJfRVJSKGNsa19hcm0pOworCX0KKworCWZyZXFzLm9sZCA9IGNvbWNlcnRvX2dldHNwZWVkKHBvbGljeS0+Y3B1KTsKKwlpZiAoZnJlcXMub2xkID09IHRhcmdldF9mcmVxKQorCXsKKwkJYzJrX2NwdWZyZXFfZGVidWcgKCIlczogb2xkIGZyZXEgKCVkKSBlcXVhbHMgbmV3IGZyZXEoJWQpLlxuIiwgXAorCQkJX19mdW5jX18sIGZyZXFzLm9sZCwgdGFyZ2V0X2ZyZXEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmcmVxcy5uZXcgPSBjb21jZXJ0b19jbGtfZnJxc1tpbmRleF0uZnJlcXVlbmN5OworCisJYzJrX2NwdWZyZXFfZGVidWcoIiVzOiBUcmFuc2l0aW9uKGNwdTolZCkgJWQtJWRIelxuIiwgX19mdW5jX18sXAorCQkJCXBvbGljeS0+Y3B1LCBmcmVxcy5vbGQsIGZyZXFzLm5ldyk7CisKKwl3aGlsZSAoaiA8IE5SX0NQVVMpCisJeworCQlpZiAoIWNwdV9vbmxpbmUoaikpCisJCXsKKwkJCWorKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWZyZXFzLmNwdSA9IGo7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisJCWorKzsKKwl9CisJaiA9IDA7CisKKwlwb2xpY3ktPmN1ciA9IGZyZXFzLm5ldzsKKwlyZXQgPSBjbGtfc2V0X3JhdGUoY2xrX2FybSwgZnJlcXMubmV3KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9kZWJ1ZygiY3B1ZnJlcTogRmFpbGVkIHRvIHNldCByYXRlICVkSHo6ICVkXG4iLAorCQkJCWZyZXFzLm5ldywgcmV0KTsKKwkJaiA9IDA7CisJCWdvdG8gZXJyOworCX0KKworCXdoaWxlIChqIDwgTlJfQ1BVUykKKwl7CisJCWlmICghY3B1X29ubGluZShqKSkKKwkJeworCQkJaisrOworCQkJY29udGludWU7CisJCX0KKwkJZnJlcXMuY3B1ID0gajsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJCWorKzsKKwl9CisKKwljMmtfY3B1ZnJlcV9kZWJ1ZygiJXM6U2V0IGFjdHVhbCBmcmVxdWVuY3kgJWx1SHpcbiIsIF9fZnVuY19fLCBcCisJCQljbGtfZ2V0X3JhdGUoY2xrX2FybSkpOworCisJcmV0dXJuIDA7CitlcnI6CisJcG9saWN5LT5jdXIgPSBmcmVxcy5vbGQ7CisJZnJlcXMubmV3ID0gZnJlcXMub2xkOworCXdoaWxlIChqIDwgTlJfQ1BVUykKKwl7CisJCWlmICghY3B1X29ubGluZShqKSkKKwkJeworCQkJaisrOworCQkJY29udGludWU7CisJCX0KKwkJZnJlcXMuY3B1ID0gajsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJCWorKzsKKwl9CisKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb21jZXJ0b19pbml0X3RhYmxlKGludCBjcHUpCit7CisJaW50IGk7CisJc3RydWN0IGNsayAqY2xrX2FybTsKKwlzdHJ1Y3QgY2xrICpjbGtfcGxsOworCisgICAgICAgIGlmIChjcHUgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworCWNsa19hcm0gPSBjbGtfZ2V0KE5VTEwsImFybSIpOworCWlmIChJU19FUlIoY2xrX2FybSkpIHsKKwkJcHJfZXJyKCJjcHVmcmVxOiBVbmFibGUgdG8gb2J0YWluIEFSTUNMSzogJWxkXG4iLAorCQkJCVBUUl9FUlIoY2xrX2FybSkpOworCQlyZXR1cm4gUFRSX0VSUihjbGtfYXJtKTsKKwl9CisKKwljbGtfcGxsID0gY2xrX2dldF9wYXJlbnQoY2xrX2FybSk7CisKKwljb21jZXJ0b19jbGtfZnJxc1swXS5mcmVxdWVuY3kgPSBjbGtfZ2V0X3JhdGUoY2xrX2FybSk7CisJY29tY2VydG9fY2xrX2ZycXNbMF0uaW5kZXggPSBjbGtfZ2V0X3JhdGUoY2xrX3BsbCkvY2xrX2dldF9yYXRlKGNsa19hcm0pOworCisJYzJrX2NwdWZyZXFfZGVidWcoIlxuXG4gIyMjIGNwdWZyZXEgVGFibGUgIyMjXG4iKTsKKworCWMya19jcHVmcmVxX2RlYnVnICgiY29tY2VydG9fY2xrX2ZycXNbMF0uaW5kZXggPSAlZCwgY29tY2VydG9fY2xrX2ZycXNbMF0uZnJlcXVlbmN5ID0gJWRcbiIsXAorCQkJCWNvbWNlcnRvX2Nsa19mcnFzWzBdLmluZGV4LCBjb21jZXJ0b19jbGtfZnJxc1swXS5mcmVxdWVuY3kpOworCisJZm9yIChpID0gMTsgY29tY2VydG9fY2xrX2ZycXNbMF0uaW5kZXggKyBpIDw9IE5SX0ZSRVFTOyBpKyspIAorCXsKKwkJY29tY2VydG9fY2xrX2ZycXNbaV0uZnJlcXVlbmN5ID0gKGNvbWNlcnRvX2Nsa19mcnFzWzBdLmZyZXF1ZW5jeSBcCisJCQkqIGNvbWNlcnRvX2Nsa19mcnFzWzBdLmluZGV4KSAvIChjb21jZXJ0b19jbGtfZnJxc1swXS5pbmRleCArIGkpOworCisJCWNvbWNlcnRvX2Nsa19mcnFzW2ldLmluZGV4ID0gY29tY2VydG9fY2xrX2ZycXNbMF0uaW5kZXggKyBpOworCisJCWMya19jcHVmcmVxX2RlYnVnICgiY29tY2VydG9fY2xrX2ZycXNbJWRdLmluZGV4ID0gJWQsIGNvbWNlcnRvX2Nsa19mcnFzWyVkXS5mcmVxdWVuY3kgPSAlZFxuIixcCisJCQkJCWksIGNvbWNlcnRvX2Nsa19mcnFzW2ldLmluZGV4LCBpLCBjb21jZXJ0b19jbGtfZnJxc1tpXS5mcmVxdWVuY3kpOworCX0KKworCWNvbWNlcnRvX2Nsa19mcnFzW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tY2VydG9fY3B1X2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJY29tY2VydG9faW5pdF90YWJsZShwb2xpY3ktPmNwdSk7CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9jcHVpbmZvKHBvbGljeSwgY29tY2VydG9fY2xrX2ZycXMpOworCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoY29tY2VydG9fY2xrX2ZycXMsIHBvbGljeS0+Y3B1KTsKKworCS8qIFBMTCBzdGFiYWxpc2F0aW9uIHRpbWUgKi8KKwlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gMTAwMDA7IC8qIDEwdXMgKi8KKworCS8qIEN1cnJlbnQgRnJlcXVlbmN5ICovCisJcG9saWN5LT5jdXIgPSBjb21jZXJ0b19jbGtfZnJxc1swXS5mcmVxdWVuY3k7CisKKwkvKiBHb3Zlcm5vciB1c2VkICovCisJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZyZXFfYXR0ciAqY29tY2VydG9fY3B1ZnJlcV9hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGNvbWNlcnRvX2RyaXZlciA9IHsKKwkubmFtZSA9ICJjb21jZXJ0byIsCisJLmluaXQgPSBjb21jZXJ0b19jcHVfaW5pdCwKKwkudmVyaWZ5ID0gY29tY2VydG9fdmVyaWZ5X3NwZWVkLAorCS50YXJnZXQgPSBjb21jZXJ0b19zZXRfdGFyZ2V0LAorCS5nZXQgPSBjb21jZXJ0b19nZXRzcGVlZCwKKwkuYXR0ciA9IGNvbWNlcnRvX2NwdWZyZXFfYXR0ciwKKwkuZmxhZ3MgPSBDUFVGUkVRX1NUSUNLWSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbWNlcnRvX2NwdWZyZXFfaW5pdCh2b2lkKQoreworCXByaW50ayAoIlJlZ2lzdGVyaW5nIENQVUZyZXEoJXMpXG4iLCBjb21jZXJ0b19kcml2ZXIubmFtZSk7CisKKwlyZXR1cm4gIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZjb21jZXJ0b19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY29tY2VydG9fY3B1ZnJlcV9leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmY29tY2VydG9fZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUiAoIlNhdGVuZHJhIFByYXRhcCA8c2F0ZW5kcmEucHJhdGFwQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTiAoIkNQVUZyZXEgZHJpdmVyIGZvciBNaW5kc3BlZWQncyBDMjAwMCBTb0MiKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKK2xhdGVfaW5pdGNhbGwoY29tY2VydG9fY3B1ZnJlcV9pbml0KTsKK21vZHVsZV9leGl0KGNvbWNlcnRvX2NwdWZyZXFfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IDk4N2ExNjUuLmMyM2FmNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtOTIzLDggKzkyMywxMCBAQAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCWZvcl9lYWNoX29ubGluZV9jcHUoc2libGluZykgewogCQlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmNwID0gcGVyX2NwdShjcHVmcmVxX2NwdV9kYXRhLCBzaWJsaW5nKTsKKwogCQlpZiAoY3AgJiYgY3AtPmdvdmVybm9yICYmCiAJCSAgICAoY3B1bWFza190ZXN0X2NwdShjcHUsIGNwLT5yZWxhdGVkX2NwdXMpKSkgeworCiAJCQlwb2xpY3ktPmdvdmVybm9yID0gY3AtPmdvdmVybm9yOwogCQkJZm91bmQgPSAxOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCmluZGV4IDhmMDQ5MTAuLjg1MzAyZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCkBAIC02NSw0ICs2NSwxMCBAQAogCiBjb21tZW50ICJERVZGUkVRIERyaXZlcnMiCiAKK2NvbmZpZyBDT01DRVJUT19ERVZGUkVRX1NVUFBPUlQKKwlib29sICJFbmFibGUgQ29tY2VydG8gZGV2ZnJlcSIKKwlzZWxlY3QgREVWRlJFUV9HT1ZfU0lNUExFX09OREVNQU5ECisJaGVscAorCQlBZGRzIGRldmZyZXEgc3VwcG9ydCBpbiBDb21jZXJ0by4KKwogZW5kaWYgIyBQTV9ERVZGUkVRCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvTWFrZWZpbGUgYi9kcml2ZXJzL2RldmZyZXEvTWFrZWZpbGUKaW5kZXggNDU2NGE4OS4uYWYyNGU2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kZXZmcmVxL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9NYWtlZmlsZQpAQCAtMywzICszLDQgQEAKIG9iai0kKENPTkZJR19ERVZGUkVRX0dPVl9QRVJGT1JNQU5DRSkJKz0gZ292ZXJub3JfcGVyZm9ybWFuY2Uubwogb2JqLSQoQ09ORklHX0RFVkZSRVFfR09WX1BPV0VSU0FWRSkJKz0gZ292ZXJub3JfcG93ZXJzYXZlLm8KIG9iai0kKENPTkZJR19ERVZGUkVRX0dPVl9VU0VSU1BBQ0UpCSs9IGdvdmVybm9yX3VzZXJzcGFjZS5vCitvYmotJChDT05GSUdfQ09NQ0VSVE9fREVWRlJFUV9TVVBQT1JUKQkrPSBjMmstZGV2ZnJlcS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvYzJrLWRldmZyZXEuYyBiL2RyaXZlcnMvZGV2ZnJlcS9jMmstZGV2ZnJlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTlkMGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RldmZyZXEvYzJrLWRldmZyZXEuYwpAQCAtMCwwICsxLDI3OSBAQAorCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29wcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZyZXEuaD4KKworI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Myay1kZXZmcmVxLmg+CisKKy8vI2RlZmluZQlDMktfREVWRlJFUV9ERUJVRworCitpbnQgZGV2ZnJlcV9jb3VudGVyc19pbml0KHN0cnVjdCBjMmtfZGV2ZnJlcV9kYXRhICpkYXRhKQoreworCWRldmZyZXFfY291bnRlcnMgKipkYyA9ICZkYXRhLT5kcGM7CisKKwkqZGMgPSBremFsbG9jKHNpemVvZiAoZGV2ZnJlcV9jb3VudGVycyksIEdGUF9LRVJORUwpOworCWlmIChkYyA9PSBOVUxMKSB7CisJCXByaW50ayAoIiVzOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZmcmVxX2NvdW50ZXJzLlxuIlwKKwkJCQksIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisjaWZkZWYgQzJLX0RFVkZSRVFfVVNFX0tUSU1FCisJKCpkYyktPnN0YXJ0X3RpbWUgPSBrdGltZV9nZXQoKTsKKyNlbHNlCisJKCpkYyktPmZlbnRyeV90aW1lID0gMFVMOworCSgqZGMpLT5wcmV2X2NvdW50ID0gMFVMOworCSgqZGMpLT5idXN5X3RpbWUgPSAwVUw7CisJKCpkYyktPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRldmZyZXFfY291bnRlcnNfaW5pdCk7CisKK3N0YXRpYyBpbnQgYzJrX2RldmZyZXFfcG1fbm90aWZpZXJfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAorICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworICAgICAgIHN0cnVjdCBjMmtfZGV2ZnJlcV9kYXRhICpkYXRhID0gY29udGFpbmVyX29mKCZ0aGlzLCBzdHJ1Y3QgYzJrX2RldmZyZXFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtX25vdGlmaWVyKTsKKworICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICAgICBjYXNlIFBNX1NVU1BFTkRfUFJFUEFSRToKKyAgICAgICAgICAgICAgIC8qIERlYWN0aXZhdGUgRFZGUyAqLworICAgICAgICAgICAgICAgbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisgICAgICAgICAgICAgICBkYXRhLT5kaXNhYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICBtdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworICAgICAgICAgICAgICAgcmV0dXJuIE5PVElGWV9PSzsKKyAgICAgICBjYXNlIFBNX1BPU1RfUkVTVE9SRToKKyAgICAgICBjYXNlIFBNX1BPU1RfU1VTUEVORDoKKyAgICAgICAgICAgICAgIC8qIFJlYWN0aXZhdGUgKi8KKyAgICAgICAgICAgICAgIG11dGV4X2xvY2soJmRhdGEtPmxvY2spOworICAgICAgICAgICAgICAgZGF0YS0+ZGlzYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgIG11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisgICAgICAgICAgICAgICByZXR1cm4gTk9USUZZX09LOworICAgICAgIH0KKworICAgICAgIHJldHVybiBOT1RJRllfRE9ORTsKK30KKworLyoKKyAqIEBkZXZmcmVxX3RhcmdldCAgUmV0dXJucyBkZXNpcmVkIG9wZXJhdGluZyBmcmVxdWVuY3kgZm9yIHRoZSBkZXZpY2UuCisgKiAgICAgICAgICAgICAgICAgICAgICBCYXNpY2FsbHksIGdldF90YXJnZXRfZnJlcSB3aWxsIHJ1bgorICogICAgICAgICAgICAgICAgICAgICAgZGV2ZnJlcV9kZXZfcHJvZmlsZS5nZXRfZGV2X3N0YXR1cygpIHRvIGdldCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyBvZiB0aGUgZGV2aWNlIChsb2FkID0gYnVzeV90aW1lIC8gdG90YWxfdGltZSkuCisgKi8KK3N0YXRpYyBpbnQgZGV2ZnJlcV90YXJnZXQoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nICpmcmVxKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOworCXN0cnVjdCBjMmtfZGV2ZnJlcV9kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBvbGRfZnJlcSA9IG9wcF9nZXRfZnJlcShkYXRhLT5jdXJyX29wcCk7CisJc3RydWN0IG9wcCAqbmV3X29wcDsKKwlpbnQgZXJyID0gMDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisjaWZkZWYgQzJLX0RFVkZSRVFfREVCVUcKKwljMmtfZGV2ZnJlcV9kZWJ1ZyAoIiVzOmN1cnJlbnQgb3BwIDxmPSVsdSB2PSVsdT5cbiIsIF9fZnVuY19fLCBcCisJCW9wcF9nZXRfZnJlcShkYXRhLT5jdXJyX29wcCksIG9wcF9nZXRfdm9sdGFnZShkYXRhLT5jdXJyX29wcCkpOworI2VuZGlmCisJaWYgKGRhdGEtPmRpc2FibGVkKQorCQlnb3RvIG91dDsKKworCS8qIGhlcmUuLi5maW5kIGNvcnJlc3BvbmRpbmcgT1BQIHcuci50IHxfKmZyZXFffCAqLworCW5ld19vcHAgPSBvcHBfZmluZF9mcmVxX2Zsb29yKGRldiwgZnJlcSk7CisJaWYgKElTX0VSUihuZXdfb3BwKSkgeworCQlwcmludGsoIiVzOiBJbnZhbGlkIGZyZXF1ZW5jeSAlbHUga0h6LlxuIiwKKwkJCV9fZnVuY19fLCAqZnJlcSk7CisJCWVyciA9IFBUUl9FUlIobmV3X29wcCk7CisJCWdvdG8gb3V0OworCX0KKyNpZmRlZiBDMktfREVWRlJFUV9ERUJVRworCWMya19kZXZmcmVxX2RlYnVnICgiJXM6bmV3IG9wcCA8Zj0lbHUgdj0lbHU+XG4iLCBfX2Z1bmNfXywgXAorCQlvcHBfZ2V0X2ZyZXEobmV3X29wcCksIG9wcF9nZXRfdm9sdGFnZShuZXdfb3BwKSk7CisjZW5kaWYKKwlkYXRhLT5jdXJyX29wcCA9IG5ld19vcHA7IAorCSpmcmVxID0gb3BwX2dldF9mcmVxKG5ld19vcHApOworCisJLyogbm93IHNldCBmcmVxICovCisJaWYgKG9sZF9mcmVxICE9ICpmcmVxKQorCXsKKwkJaWYgKCpmcmVxID49IFVJTlRfTUFYKQorCQkJKmZyZXEgPSBkYXRhLT5tYXhfZnJlcTsKKwkJaWYgKCpmcmVxID09IDApCisJCQkqZnJlcSA9IGRhdGEtPm1pbl9mcmVxOworCisJCWVyciA9IGRhdGEtPnNldF9mcmVxKGRhdGEsIGZyZXEpOyAvKiB1c2VzIGNsayBzdHJ1Y3QgKi8KKwl9CisJZWxzZQorCQlnb3RvIG91dDsKKworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogd2UgY291bGQgc2V0IHZvbHRhZ2UgYWxzbyAqLworb3V0OgorCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEB0b3RhbF90aW1lICAgICAgICAgIFRoZSB0b3RhbCB0aW1lIHJlcHJlc2VudGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YKKyAqICAgICAgICAgICAgICAgICAgICAgIGRldmZyZXFfZGV2X3N0YXR1cworICogQGJ1c3lfdGltZSAgICAgICAgICAgVGhlIHRpbWUgdGhhdCB0aGUgZGV2aWNlIHdhcyB3b3JraW5nIGFtb25nIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgdG90YWxfdGltZS4KKyAqLworc3RhdGljIGludCBnZXRfZGV2ZnJlcV9zdGF0dXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2ZnJlcV9kZXZfc3RhdHVzICpzdGF0KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOworCXN0cnVjdCBjMmtfZGV2ZnJlcV9kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJZGV2ZnJlcV9jb3VudGVycyAqZGMgPSBkYXRhLT5kcGM7CisKKwlzdGF0LT5jdXJyZW50X2ZyZXF1ZW5jeSA9IG9wcF9nZXRfZnJlcShkYXRhLT5jdXJyX29wcCk7CisKKwkvKiBIZXJlIGdvZXMgYSBsaXN0IG9mIG1lY2hhbmlzbXMgdG8gZmV0Y2ggYnVzeS90b3RhbCB0aW1lOgorCSAgIC0gUGVyZm9ybWFuY2UgY291bnRlcnMKKwkgICAtIE1lYXN1cmUgdGhlIHRpbWUgYmV0d2VlbiAib3BlcmF0aW9uIHN0YXJ0IiBhbmQgIm9wZXJhdGlvbiBlbmQiIGFuZAorCSAgIGFjY3VtdWxhdGUgdGhlIHRpbWUgKGdldHRpbmcgYnVzeSB0aW1lLiBwcm9iYWJseSBieSBrdGltZT8pCisJICAgLSBNZWFzdXJlIHRoZSBpZGxlIHRpbWUgKENQVUlETEUvQ1BVRlJFUSBkb2VzIHRoaXMpCisJICAgLSBDb3VudCB0aGUgbnVtYmVyIG9mIG9wZXJhdGlvbiBhbmQgY2FsY3VsYXRlIHRoZSBvcGVyYXRpb25hbCB0aW1lCisJICAgYmFzZWQgb24gdGhlIG51bWJlci4KKwkgKi8KKworCXN0YXQtPmJ1c3lfdGltZSA9ICh1bnNpZ25lZCBsb25nKW1vZHVsZV9idXN5X3RpbWUoZGMpOworCisJc3RhdC0+dG90YWxfdGltZSA9ICh1bnNpZ25lZCBsb25nKW1vZHVsZV9idXN5X3BsdXNfbm90X2J1c3lfdGltZShkYyk7CisKKwlkZXZmcmVxX3Jlc2V0X2NvdW50ZXJzKGRjKTsKKworCXJldHVybiAwOworfQorCitpbnQgYzJrX2RyaXZlcl9kZXZmcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGMya19kZXZmcmVxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGRldmZyZXEgKmxkZXZmcmVxOworCXN0cnVjdCBvcHAgKm9wcDsKKwlpbnQgaSwgZXJyID0gMDsKKworCUJVR19PTihkYXRhPT1OVUxMKTsKKworI2lmZGVmIEMyS19ERVZGUkVRX0RFQlVHCisJYzJrX2RldmZyZXFfZGVidWcoIiVzOiBpbml0aWFsaXppbmcgZm9yIGRldiAlc1xuIiwgX19mdW5jX18sIGRldl9uYW1lKGRldikpOworI2VuZGlmCisJaWYgKCEoZGF0YS0+dmRkX2ludCkpCisJeworCQlkYXRhLT52ZGRfaW50ID0gcmVndWxhdG9yX2dldChkZXYsICJjMmtfZGVmYXVsdF92Y2MiKTsKKworCQlpZiAoSVNfRVJSKGRhdGEtPnZkZF9pbnQpKSB7CisJCQlwcmludGsgKCIlczogQ2Fubm90IGdldCB0aGUgcmVndWxhdG9yIFwidmNjX2Mya1wiXG4iLCBfX2Z1bmNfXyk7CisJCQllcnIgPSBQVFJfRVJSKGRhdGEtPnZkZF9pbnQpOworCQkJZ290byBlcnJfcmVndWxhdG9yOworCQl9CisJfQorCisJZGF0YS0+ZGV2ID0gZGV2OworCW11dGV4X2luaXQoJmRhdGEtPmxvY2spOworCisJLyogT1BQIEVudHJpZXMgYXNzdW1lZCB0byBiZSBzZXR1cCBieSBub3cgKi8KKwlpZiAoZGF0YS0+b3BwX3RhYmxlKQorCXsKKwkJZm9yIChpID0gMDsgZGF0YS0+b3BwX3RhYmxlW2ldLmlkeCAhPSAwOyBpKyspIHsKKwkJI2lmZGVmIEMyS19ERVZGUkVRX0RFQlVHCisJCQljMmtfZGV2ZnJlcV9kZWJ1ZygiJXM6IEFkZGluZyBvcHAgZW50cnk6ICVsZCBIeiwgJWxkIHV2b2x0LlxuIixcCisJCQkJX19mdW5jX18sIGRhdGEtPm9wcF90YWJsZVtpXS5mcmVxLCBkYXRhLT5vcHBfdGFibGVbaV0udm9sdCk7CisJCSNlbmRpZgorCQkJZXJyID0gb3BwX2FkZChkZXYsIGRhdGEtPm9wcF90YWJsZVtpXS5mcmVxLCBkYXRhLT5vcHBfdGFibGVbaV0udm9sdCk7CisJCisJCQlpZiAoZXJyKSB7CisJCQkJcHJpbnRrKCIlczogQ2Fubm90IGFkZCBvcHAgZW50cmllczogZXJyID0gJWRcbiIsX19mdW5jX18sIGVycik7CisJCQkJZ290byBlcnJfb3BwX2FkZDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlwcmludGsgKCIlczogTm90IHVzaW5nIE9QUCBmcmFtZXdvcmsuXG4iLCBfX2Z1bmNfXyk7CisJfQorCisJaWYgKGRhdGEtPmRldmZyZXFfcHJvZmlsZS0+aW5pdGlhbF9mcmVxID4gMCkKKwl7CisJCW9wcCA9IG9wcF9maW5kX2ZyZXFfZmxvb3IoZGV2LCAmKGRhdGEtPmRldmZyZXFfcHJvZmlsZS0+aW5pdGlhbF9mcmVxKSk7CisJCWlmIChJU19FUlIob3BwKSkgeworCQkJcHJpbnRrKCIlczogSW52YWxpZCBpbml0aWFsIGZyZXF1ZW5jeSAlbHUga0h6LlxuIiwKKwkJCQlfX2Z1bmNfXywgZGF0YS0+ZGV2ZnJlcV9wcm9maWxlLT5pbml0aWFsX2ZyZXEpOworCQkJZXJyID0gUFRSX0VSUihvcHApOworCQkJZ290byBlcnJfb3BwX2FkZDsKKwkJfQorCQlkYXRhLT5jdXJyX29wcCA9IG9wcDsgCisJfQorCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRhdGEtPmRldmZyZXFfcHJvZmlsZS0+dGFyZ2V0KQorCQlkYXRhLT5kZXZmcmVxX3Byb2ZpbGUtPnRhcmdldCA9IGRldmZyZXFfdGFyZ2V0OyAvKiB1c2luZyBkZWZhdWx0ICovCisKKwlpZiAoIWRhdGEtPmRldmZyZXFfcHJvZmlsZS0+Z2V0X2Rldl9zdGF0dXMpCisJCWRhdGEtPmRldmZyZXFfcHJvZmlsZS0+Z2V0X2Rldl9zdGF0dXMgPSBnZXRfZGV2ZnJlcV9zdGF0dXM7IC8qIHVzaW5nIGRlZmF1bHQgKi8KKworCWlmICghZGF0YS0+Z292KQorCQlkYXRhLT5nb3YgPSAmZGV2ZnJlcV9zaW1wbGVfb25kZW1hbmQ7IC8qIHVzaW5nIGRlZmF1bHQgZ292ZXJuZXIgKi8KKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGRhdGEpOworCisJbGRldmZyZXEgPSBkZXZmcmVxX2FkZF9kZXZpY2UoZGV2LCBkYXRhLT5kZXZmcmVxX3Byb2ZpbGUsIGRhdGEtPmdvdiwgTlVMTCk7CisJaWYgKCFsZGV2ZnJlcSkKKwl7CisJCXByaW50ayAoIiVzOiBkZXZmcmVxX2FkZF9kZXZpY2UgZmFpbGVkIHdpdGggZXJyID0gJWRcbiIsIF9fZnVuY19fLCBlcnIpOworCQlnb3RvIGVycl9vcHBfYWRkOworCX0KKworCWlmIChkYXRhLT5wbV9ub3RpZmllcikKKwl7CisJCWVyciA9IHJlZ2lzdGVyX3BtX25vdGlmaWVyKGRhdGEtPnBtX25vdGlmaWVyKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrICgiJXM6IEZhaWxlZCB0byBzZXR1cCBwbSBub3RpZmllci5cbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX25vdGlmaWVyOworCQl9CisJfQorCWVsc2UKKwl7CisJCWRhdGEtPnBtX25vdGlmaWVyID0gKHN0cnVjdCBub3RpZmllcl9ibG9jayopa3phbGxvY1wKKwkJCQkoc2l6ZW9mKHN0cnVjdCBub3RpZmllcl9ibG9jayksIEdGUF9LRVJORUwpOworCisJICAgICAgICBpZiAoZGF0YS0+cG1fbm90aWZpZXIgPT0gTlVMTCkgeworICAgICAgICAJICAgICAgICBwcmludGsgKCIlczogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcG1fbm90aWZpZXIuXG4iLFwKKwkJCQlfX2Z1bmNfXyk7CisgICAgICAgIAkgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAJfQorCisJCWRhdGEtPnBtX25vdGlmaWVyLT5ub3RpZmllcl9jYWxsID0gYzJrX2RldmZyZXFfcG1fbm90aWZpZXJfZXZlbnQ7IC8qIGRlZmF1bHQgcG0gbm90aWZpZXIgKi8KKworCQllcnIgPSByZWdpc3Rlcl9wbV9ub3RpZmllcihkYXRhLT5wbV9ub3RpZmllcik7CisJCWlmIChlcnIpIHsKKwkJCXByaW50ayAoIiVzOiBGYWlsZWQgdG8gc2V0dXAgcG0gbm90aWZpZXIuXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycl9ub3RpZmllcjsKKwkJfQorCX0KKworCWVyciA9IGRldmZyZXFfY291bnRlcnNfaW5pdChkYXRhKTsKKworCXJldHVybiBlcnI7CisKK2Vycl9ub3RpZmllcjoKKwlkZXZmcmVxX3JlbW92ZV9kZXZpY2UobGRldmZyZXEpOworZXJyX29wcF9hZGQ6CisJcmVndWxhdG9yX3B1dChkYXRhLT52ZGRfaW50KTsKK2Vycl9yZWd1bGF0b3I6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woYzJrX2RyaXZlcl9kZXZmcmVxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4IGRhODVjMGQuLmM1MDA1YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMTIyLDYgKzEyMiwyMiBAQAogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgTWFydmVsbCBYT1IgZW5naW5lLgogCitjb25maWcgQ09NQ0VSVE9fWE9SCisJdHJpc3RhdGUgIk1pbmRzcGVlZCBDb21jZXJ0byAyMDAwIFhPUiBlbmdpbmUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfTTg2WFhYCisJc2VsZWN0IERNQV9FTkdJTkUKKwlzZWxlY3QgQVNZTkNfVFhfRU5BQkxFX0NIQU5ORUxfU1dJVENICisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBNaW5kc3BlZWQgWE9SIGVuZ2luZS4KKworY29uZmlnIENPTUNFUlRPX0RNQV9CQVNJQworCXRyaXN0YXRlICJNaW5kc3BlZWQgQ29tY2VydG8gMjAwMCBNRE1BIGVuZ2luZSBiYXNpYyBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVJDSF9NODZYWFgKKwlzZWxlY3QgRE1BX0VOR0lORQorCXNlbGVjdCBBU1lOQ19UWF9FTkFCTEVfQ0hBTk5FTF9TV0lUQ0gKKwktLS1oZWxwLS0tCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIE1pbmRzcGVlZCBtZG1hIGVuZ2luZS4KKwogY29uZmlnIE1YM19JUFUKIAlib29sICJNWDN4IEltYWdlIFByb2Nlc3NpbmcgVW5pdCBzdXBwb3J0IgogCWRlcGVuZHMgb24gU09DX0lNWDMxIHx8wqBTT0NfSU1YMzUKQEAgLTI3Miw2ICsyODgsMTUgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIFJBSURfWkVST19DT1BZCisgICAgICAgIGJvb2wgIk9wdGltaXplZCBETUEvWE9SIG9mZmxvYWQ6IHJlZHVjZSByYWlkNSBtZW1jcHkgd2hpY2ggb2ZmbG9hZGVkIGZvciBkbWEiCisgICAgICAgIGRlcGVuZHMgb24gQVNZTkNfVFhfRE1BCisgICAgICAgIGhlbHAKKyAgICAgICAgICBUaGlzIGFsbG93cyB0aGUgYXN5bmNfdHggYXBpIHRyeSB0byByZWR1Y2UgcmFpZDUgbWVtY3B5IG9wZXJhdGlvbnMgZm9yCisgICAgICAgICAgZG1hLiBJZiB5b3UgaGF2ZSBkbWEgZGV2aWNlIHRvIHN1cHBvcnQgbWVtY3B5IG9mZmxvYWRpbmcsIHlvdSBjYW4gc2V0CisgICAgICAgICAgaXQgYXMgWSwgZWxzZSBOLgorCisKIGNvbmZpZyBETUFURVNUCiAJdHJpc3RhdGUgIkRNQSBUZXN0IGNsaWVudCIKIAlkZXBlbmRzIG9uIERNQV9FTkdJTkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKaW5kZXggMzBjZjNiMS4uNGUwODk5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKQEAgLTI2LDMgKzI2LDUgQEAKIG9iai0kKENPTkZJR19QQ0hfRE1BKSArPSBwY2hfZG1hLm8KIG9iai0kKENPTkZJR19BTUJBX1BMMDhYKSArPSBhbWJhLXBsMDh4Lm8KIG9iai0kKENPTkZJR19FUDkzWFhfRE1BKSArPSBlcDkzeHhfZG1hLm8KK29iai0kKENPTkZJR19DT01DRVJUT19YT1IpICs9IGNvbWNlcnRvX3hvci5vCitvYmotJChDT05GSUdfQ09NQ0VSVE9fRE1BX0JBU0lDKSArPSBjMmtfZG1hLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2Mya19kbWEuYyBiL2RyaXZlcnMvZG1hL2Mya19kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI3ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEvYzJrX2RtYS5jCkBAIC0wLDAgKzEsMTE3OCBAQAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxtYWNoL2Mya19kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKworI2RlZmluZSBYT1JfTUFYX1NSQ19DTlQJNgorCisjZGVmaW5lIHZpcnRfdG9feG9yX2RtYShwYmFzZSwgdmJhc2UsIHZhZGRyKQkJKChwYmFzZSArICgodW5zaWduZWQgbG9uZyl2YWRkciAtICh1bnNpZ25lZCBsb25nKXZiYXNlKSkpCisKK3N0cnVjdCBjb21jZXJ0b194b3JfZGV2aWNlIHsKKwlzdHJ1Y3QgZG1hX2RldmljZSAgICAgICAgZGV2aWNlOworfTsKKworc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuIHsKKwlzdHJ1Y3QgY29tY2VydG9feG9yX2RldmljZSAgICAgICAgKmRldmljZTsKKwlzdHJ1Y3QgZG1hX2NoYW4gICAgICAgICAgICAgICAgIGNoYW47CisJc3RydWN0IHRhc2tsZXRfc3RydWN0ICAgICAgIGlycV90YXNrbGV0OworCXNwaW5sb2NrX3QgICAgICAgICAgICAgICAgICBsb2NrOworCWRtYV9jb29raWVfdCAgICAgICAgICAgICAgICBjb21wbGV0ZWRfY29va2llOworfTsKKworc3RydWN0IGNvbWNlcnRvX3N3X3hvcl9kZXNjIHsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgYXN5bmNfdHg7CisJaW50IHNyY19jbnQ7CisJc2l6ZV90IGxlbjsKKwlkbWFfYWRkcl90IGRtYV9kZXN0OworCWRtYV9hZGRyX3QgZG1hX3NyY1tYT1JfTUFYX1NSQ19DTlRdOworfTsKKwordm9pZCAqY29tY2VydG9feG9yX3Bvb2xfdmlydDsKK2RtYV9hZGRyX3QgY29tY2VydG9feG9yX3Bvb2xfcGh5OworCitzcGlubG9ja190CWNvbWNlcnRvX3hvcl9jbGVhbnVwX2xvY2s7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoY29tY2VydG9feG9yX3dhaXRfcXVldWUpOworc3RhdGljIGludCBjb21jZXJ0b194b3Jfc2xlZXBpbmcgPSAwOworCitzdGF0aWMgaW50IHhvcl9yZF9pZHggPSAwOworc3RhdGljIGludCB4b3Jfd3JfaWR4ID0gMDsKK3N0YXRpYyBpbnQgeG9yX2RtYV9pZHggPSAwOworc3RhdGljIGludCB4b3Jfc3dfcmRfaWR4ID0gMDsKK3N0YXRpYyBpbnQgeG9yX3N3X3dyX2lkeCA9IDA7CitzdGF0aWMgaW50IHhvcl9zd193cl9wcmV2X2lkeCA9IDA7CitzdGF0aWMgaW50IHhvcl9jdXJyZW50X2JhdGNoX2NvdW50ID0gMDsKKworI2RlZmluZSBYT1JfRkRFU0NfQ09VTlQgNTEyCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fNjRLX1BBR0VTKQorI2RlZmluZSBYT1JfU1dfRkRFU0NfQ09VTlQgMzIKKyNlbHNlCisjZGVmaW5lIFhPUl9TV19GREVTQ19DT1VOVCBYT1JfRkRFU0NfQ09VTlQKKyNlbmRpZgorCitzdHJ1Y3QgdGltZXJfbGlzdCBjb21jZXJ0b194b3JfdGltZXI7CisjZGVmaW5lIENPTVBMRVRJT05fVElNRU9VVCAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwKQorc3RhdGljIGludCBjb21lcnRvX3hvcl90aW1lcl9maXJzdCA9IDE7CisKK3N0cnVjdCBjb21jZXJ0b194b3JfaW5ib3VuZF9mZGVzYyAqeG9yX2luX2ZkZXNjW1hPUl9GREVTQ19DT1VOVF07CitzdHJ1Y3QgY29tY2VydG9feG9yX291dGJvdW5kX2ZkZXNjICp4b3Jfb3V0X2ZkZXNjW1hPUl9GREVTQ19DT1VOVF07CitzdHJ1Y3QgY29tY2VydG9fc3dfeG9yX2Rlc2MgICAgIHN3X3hvcl9kZXNjW1hPUl9TV19GREVTQ19DT1VOVF07CisKK3N0cnVjdCBjb21jZXJ0b194b3JfZGV2aWNlICpjb21jZXJ0b194b3JfZGV2Oworc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICAgY29tY2VydG9feG9yX2NoOworI2RlZmluZSBPV05FUl9YT1JfRlJFRQkxCisjZGVmaW5lIE9XTkVSX01FTUNQWV9GUkVFIDIKKyNkZWZpbmUgT1dORVJfWE9SX0JVU1kJMworI2RlZmluZSBPV05FUl9NRU1DUFlfQlVTWQk0CitzdGF0aWMgaW50IGRtYV9vd25lZCA9IDA7CitzdGF0aWMgaW50IG1lbWNweV9wcm9jZXNzZWRfb25nb2luZyA9IDA7CitzdGF0aWMgaW50IG1lbWNweV9wZW5kaW5nX2NvdW50ID0gMDsKKworCisvL3N0YXRpYyBpbnQgbWRtYV9idXN5ID0gMDsKK3N0YXRpYyBpbnQgbWRtYV9kb25lOworc3RhdGljIHNwaW5sb2NrX3QgbWRtYV9sb2NrOworCitzdGF0aWMgdm9pZCAqdmlydGJhc2U7CisKKyNkZWZpbmUgTTJJT19DT05UUk9MICAgICAgICAgICAodmlydGJhc2UpCisjZGVmaW5lIE0ySU9fSEVBRCAgICAgICAgICAgICAgKHZpcnRiYXNlICsgMHg0KQorI2RlZmluZSBNMklPX0JVUlNUICAgICAgICAgICAgICh2aXJ0YmFzZSArIDB4OCkKKyNkZWZpbmUgTTJJT19GTEVOICAgICAgICAgICAgICAodmlydGJhc2UgKyAweEMpCisjZGVmaW5lIE0ySU9fSVJRX0VOQUJMRSAgICAgICAgKHZpcnRiYXNlICsgMHgxMCkKKyNkZWZpbmUgTTJJT19JUlFfU1RBVFVTICAgICAgICAodmlydGJhc2UgKyAweDE0KQorI2RlZmluZSBNMklPX1JFU0VUICAgICAgICAgICAgICh2aXJ0YmFzZSArIDB4MjApCisKKyNkZWZpbmUgSU8yTV9DT05UUk9MICAgICAgICAgICAodmlydGJhc2UgKyAweDgwKQorI2RlZmluZSBJTzJNX0hFQUQgICAgICAgICAgICAgICh2aXJ0YmFzZSArIDB4ODQpCisjZGVmaW5lIElPMk1fQlVSU1QgICAgICAgICAgICAgKHZpcnRiYXNlICsgMHg4OCkKKyNkZWZpbmUgSU8yTV9GTEVOICAgICAgICAgICAgICAodmlydGJhc2UgKyAweDhDKQorI2RlZmluZSBJTzJNX0lSUV9FTkFCTEUgICAgICAgICh2aXJ0YmFzZSArIDB4OTApCisjZGVmaW5lIElPMk1fSVJRX1NUQVRVUyAgICAgICAgKHZpcnRiYXNlICsgMHg5NCkKKyNkZWZpbmUgSU8yTV9SRVNFVCAgICAgICAgICAgICAodmlydGJhc2UgKyAweEEwKQorCisjZGVmaW5lIEZET05FX01BU0sJMHg4MDAwMDAwMAorCisjZGVmaW5lIEZMRU5FTiAgICAgICAgICAweDIKKworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKG1kbWFfbWVtY3B5X2J1c3lfcXVldWUpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKG1kbWFfZG9uZV9xdWV1ZSk7CisKK3Vuc2lnbmVkIGxvbmcgbWRtYV9pbl9kZXNjX3BoeTsKK3Vuc2lnbmVkIGxvbmcgbWRtYV9vdXRfZGVzY19waHk7CisKK3N0cnVjdCBjb21jZXJ0b19tZW1jcHlfaW5ib3VuZF9mZGVzYyAqbWRtYV9pbl9kZXNjOworc3RydWN0IGNvbWNlcnRvX21lbWNweV9vdXRib3VuZF9mZGVzYyAqbWRtYV9vdXRfZGVzYzsKKworRVhQT1JUX1NZTUJPTChtZG1hX2luX2Rlc2MpOworRVhQT1JUX1NZTUJPTChtZG1hX291dF9kZXNjKTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvbWNlcnRvX3hvcl9zZXRfaW5fYmRlc2ModTMyIGJ1Zl9pZHgsIHUzMiBiZGVzY19pZHgsIHUzMiBhZGRyLCB1MzIgY3RybCkKK3sKKwl4b3JfaW5fZmRlc2NbYnVmX2lkeF0tPmJkZXNjW2JkZXNjX2lkeF0uYnBvaW50ZXIgPSBhZGRyOworCXhvcl9pbl9mZGVzY1tidWZfaWR4XS0+YmRlc2NbYmRlc2NfaWR4XS5iY29udHJvbCA9IGN0cmw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21jZXJ0b194b3Jfc2V0X291dF9iZGVzYyh1MzIgYnVmX2lkeCwgdTMyIGJkZXNjX2lkeCwgdTMyIGFkZHIsIHUzMiBjdHJsKQoreworCXhvcl9vdXRfZmRlc2NbYnVmX2lkeF0tPmJkZXNjW2JkZXNjX2lkeF0uYnBvaW50ZXIgPSBhZGRyOworCXhvcl9vdXRfZmRlc2NbYnVmX2lkeF0tPmJkZXNjW2JkZXNjX2lkeF0uYmNvbnRyb2wgPSBjdHJsOworfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b194b3Jfc2V0X2Rlc2Moc3dfaWR4LCAgaHdfaWR4KQoreworCWludCBpLHNwbGl0X25vOworCXUzMiBmc3RhdHVzMCA9IDA7CisJdTMyIGFkZHI7CisJaW50IHNwbGl0X3NpemU7CisJZG1hX2FkZHJfdCBkZXN0OworCWRtYV9hZGRyX3QgKnNyY3M7CQorCXUzMiBibG9ja19zaXplOworCWludCBzcmNfY250OworCisJYmxvY2tfc2l6ZSA9IHN3X3hvcl9kZXNjW3N3X2lkeF0ubGVuOworCXNyY19jbnQgPSBzd194b3JfZGVzY1tzd19pZHhdLnNyY19jbnQ7CisJc3JjcyA9IHN3X3hvcl9kZXNjW3N3X2lkeF0uZG1hX3NyYzsKKwlkZXN0ID0gc3dfeG9yX2Rlc2Nbc3dfaWR4XS5kbWFfZGVzdDsKKworCWlmKGJsb2NrX3NpemUgIT0gUEFHRV9TSVpFKQorCQlwcmludGsoIiVzOiBpbnB1dCBidWZmZXJzIG5vdCAlZCBsZW5cbiIsX19mdW5jX18sICh1bnNpZ25lZCBpbnQpUEFHRV9TSVpFKTsJCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT182NEtfUEFHRVMpCisJYmxvY2tfc2l6ZSA9IGJsb2NrX3NpemUvMTY7IC8vdG8gZ2V0IDRLCisJc3BsaXRfc2l6ZSA9IDE2OworI2Vsc2UKKwlzcGxpdF9zaXplID0gMTsKKyNlbmRpZgorCisJZm9yKHNwbGl0X25vID0gMCA7IHNwbGl0X25vIDwgc3BsaXRfc2l6ZTsgc3BsaXRfbm8rKykKKwl7CisKKwkJZm9yKGkgPSAwOyBpIDwgc3JjX2NudCAtIDE7IGkrKykgeworCQkJYWRkciA9ICh1MzIpc3dfeG9yX2Rlc2Nbc3dfaWR4XS5kbWFfc3JjW2ldICsgNDA5NiAqIHNwbGl0X25vOworCQkJY29tY2VydG9feG9yX3NldF9pbl9iZGVzYyhod19pZHgsIGksIGFkZHIsIGJsb2NrX3NpemUpOworCQl9CisKKwkJYWRkciA9ICh1MzIpc3dfeG9yX2Rlc2Nbc3dfaWR4XS5kbWFfc3JjW3NyY19jbnQgLSAxXSArIDQwOTYgKiBzcGxpdF9ubzsKKwkJY29tY2VydG9feG9yX3NldF9pbl9iZGVzYyhod19pZHgsIHNyY19jbnQgLSAxLCBhZGRyLCBibG9ja19zaXplIHwgQkxBU1QpOworCisJCWZzdGF0dXMwID0gMTsgLy8gTmV3IFJlcSwgcmVzZXQgYmxvY2sgY291bnRlciwgYmxvY2sgb2Zmc2V0LCBjbGVhciBzY3JhdGNocGFkIChvdmVyd3JpdGUgZXhpc3RpbmcgZGF0YSkKKwkJZnN0YXR1czAgfD0gICgxIDw8IDEpOyAvLyBSZWFkIFNQLCByZXR1cm4gY29udGVudCBvZiBzY3JhdGNoIHBhZCBhZnRlciBwcm9jZXNzaW5nIGlucHV0IGRhdGEKKwkJZnN0YXR1czAgfD0gICgwIDw8IDIpOyAvLyBNb2RlLCBFbmNvZGUKKwkJZnN0YXR1czAgfD0gIChzcmNfY250IDw8IDQpOyAvLyBOdW1iZXIgb2YgYmxvY2tzIHRvIGJlIHByb2Nlc3NlZAorCQlmc3RhdHVzMCB8PSAgKDEgPDwgOSk7IC8vIFR5cGUsIFhPUgorCQlmc3RhdHVzMCB8PSAgKFhPUl9CTE9DS19TSVpFXzQwOTYgPDwgMTEpOworCisJCXhvcl9pbl9mZGVzY1tod19pZHhdLT5mY29udHJvbCA9IDA7CisJCXhvcl9pbl9mZGVzY1tod19pZHhdLT5mc3RhdHVzMCA9IGZzdGF0dXMwOworCQl4b3JfaW5fZmRlc2NbaHdfaWR4XS0+ZnN0YXR1czEgPSAwOworCisJCWFkZHIgPSAodTMyKXN3X3hvcl9kZXNjW3N3X2lkeF0uZG1hX2Rlc3QgKyA0MDk2ICogc3BsaXRfbm87CisJCWNvbWNlcnRvX3hvcl9zZXRfb3V0X2JkZXNjKGh3X2lkeCwgMCwgYWRkciwgYmxvY2tfc2l6ZSB8IEJMQVNUKTsKKworCQl4b3Jfb3V0X2ZkZXNjW2h3X2lkeF0tPmZjb250cm9sID0gMDsKKwkJeG9yX291dF9mZGVzY1tod19pZHhdLT5mc3RhdHVzMCA9IDA7CisJCXhvcl9vdXRfZmRlc2NbaHdfaWR4XS0+ZnN0YXR1czEgPSAwOworCisJCWh3X2lkeCA9IChod19pZHggKyAxKSAlIFhPUl9GREVTQ19DT1VOVDsKKwl9CisKKwl4b3Jfd3JfaWR4ID0gaHdfaWR4OworfQorCitzdGF0aWMgaW5saW5lIGludCBjb21jZXJ0b19kbWFfYnVzeSh2b2lkKQoreworCXJldHVybiAocmVhZGxfcmVsYXhlZChJTzJNX0NPTlRST0wpICYgMHgxKTsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9feG9yX3VwZGF0ZV9kbWFfaGVhZChpbnQgaWR4KQoreworCXUzMiBvdXRfZGVzY19oZWFkLCBpbl9kZXNjX2hlYWQ7CisJb3V0X2Rlc2NfaGVhZCA9IHZpcnRfdG9feG9yX2RtYShjb21jZXJ0b194b3JfcG9vbF9waHksIGNvbWNlcnRvX3hvcl9wb29sX3ZpcnQsIHhvcl9vdXRfZmRlc2NbaWR4XSk7CisJaW5fZGVzY19oZWFkID0gdmlydF90b194b3JfZG1hKGNvbWNlcnRvX3hvcl9wb29sX3BoeSwgY29tY2VydG9feG9yX3Bvb2xfdmlydCwgeG9yX2luX2ZkZXNjW2lkeF0pOworCisJd21iKCk7CisJd3JpdGVsX3JlbGF4ZWQob3V0X2Rlc2NfaGVhZCwgSU8yTV9IRUFEKTsKKwl3cml0ZWxfcmVsYXhlZChpbl9kZXNjX2hlYWQsIE0ySU9fSEVBRCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3hvcl91cGRhdGVfZG1hX2ZsZW4oaW50IGZsZW4pCit7CisJd21iKCk7CisJd3JpdGVsX3JlbGF4ZWQoZmxlbiwgTTJJT19GTEVOKTsKKwl3cml0ZWxfcmVsYXhlZChmbGVuLCBJTzJNX0ZMRU4pOworfQorCitzdGF0aWMgaW50IGNvbWNlcnRvX3hvcl9yYl9mdWxsKHZvaWQpCit7CisJaWYoQ0lSQ19TUEFDRSh4b3Jfc3dfd3JfaWR4LCB4b3Jfc3dfcmRfaWR4LCBYT1JfU1dfRkRFU0NfQ09VTlQpID4gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKwordm9pZCBjb21jZXJ0b194b3JfcmVxdWVzdF93YWl0KHZvaWQpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlwcmVwYXJlX3RvX3dhaXQoJmNvbWNlcnRvX3hvcl93YWl0X3F1ZXVlLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJY29tY2VydG9feG9yX3NsZWVwaW5nKys7CisKKwl3aGlsZSAoY29tY2VydG9feG9yX3JiX2Z1bGwoKSkgeworCQlzcGluX3VubG9ja19iaCgmY29tY2VydG9feG9yX2NoLmxvY2spOworCQlzY2hlZHVsZSgpOworCQlzcGluX2xvY2tfYmgoJmNvbWNlcnRvX3hvcl9jaC5sb2NrKTsKKwkJcHJlcGFyZV90b193YWl0KCZjb21jZXJ0b194b3Jfd2FpdF9xdWV1ZSwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl9CisKKwlmaW5pc2hfd2FpdCgmY29tY2VydG9feG9yX3dhaXRfcXVldWUsICZ3YWl0KTsKKwljb21jZXJ0b194b3Jfc2xlZXBpbmctLTsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9fZG1hX3Byb2Nlc3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBlbmRpbmdfY291bnQ7CisKKwlpZighZG1hX293bmVkIHx8IGRtYV9vd25lZD09T1dORVJfWE9SX0ZSRUUpCisJeworCQlwZW5kaW5nX2NvdW50ID0gQ0lSQ19DTlQoeG9yX3dyX2lkeCwgeG9yX2RtYV9pZHgsIFhPUl9GREVTQ19DT1VOVCk7CisJCWlmKHBlbmRpbmdfY291bnQpCisJCXsKKwkJCWRtYV9vd25lZCA9IE9XTkVSX1hPUl9CVVNZOworCQkJeG9yX2N1cnJlbnRfYmF0Y2hfY291bnQgPSBwZW5kaW5nX2NvdW50OworCQkJY29tY2VydG9feG9yX3VwZGF0ZV9kbWFfZmxlbihwZW5kaW5nX2NvdW50KTsKKwkJCWNvbWNlcnRvX3hvcl91cGRhdGVfZG1hX2hlYWQoeG9yX2RtYV9pZHgpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b194b3JfY2xlYW51cCh2b2lkKQoreworCWludCBpLGosazsKKwlpbnQgaWR4OworCWludCBjbGVhbnVwX2NvdW50OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHNwbGl0X3NpemU7CisJc3RydWN0IGNvbWNlcnRvX3N3X3hvcl9kZXNjICpzd19kZXNjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kbWFfbG9jaywgZmxhZ3MpOworCWNsZWFudXBfY291bnQgPSBDSVJDX0NOVCh4b3JfZG1hX2lkeCwgeG9yX3JkX2lkeCwgWE9SX0ZERVNDX0NPVU5UKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZG1hX2xvY2ssIGZsYWdzKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKKwlzcGxpdF9zaXplID0gMTY7CisjZWxzZQorCXNwbGl0X3NpemUgPSAxOworI2VuZGlmCisKKwlpZihjbGVhbnVwX2NvdW50ICYmIChjbGVhbnVwX2NvdW50ICUgc3BsaXRfc2l6ZSA9PSAwKSkKKwl7CisJCWZvcihpID0gMCA7IGkgPCBjbGVhbnVwX2NvdW50L3NwbGl0X3NpemU7IGkrKykKKwkJeworCQkJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPXzY0S19QQUdFUykKKwkJCWlmKHhvcl9yZF9pZHglMTYpCisJCQkJcHJpbnRrKCIlczogeG9yX3JkX2lkeCAlZCBub3QgbXVsdGlwbGUgb2YgMTZcbiIsX19mdW5jX18sIHhvcl9yZF9pZHgpOworI2VuZGlmCisJCQlpZHggPSB4b3Jfc3dfcmRfaWR4OworCQkJdHggPSAmc3dfeG9yX2Rlc2NbaWR4XS5hc3luY190eDsKKwkJCXN3X2Rlc2MgPSAmc3dfeG9yX2Rlc2NbaWR4XTsKKworCQkJZm9yIChqID0gMDsgaiA8IHN3X2Rlc2MtPnNyY19jbnQ7IGorKykgeworCQkJCWRtYV91bm1hcF9wYWdlKE5VTEwsIHN3X2Rlc2MtPmRtYV9zcmNbal0sIHN3X2Rlc2MtPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQl9CisJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBzd19kZXNjLT5kbWFfZGVzdCwgc3dfZGVzYy0+bGVuLCBETUFfQklESVJFQ1RJT05BTCk7CisKKwkJCWNvbWNlcnRvX3hvcl9jaC5jb21wbGV0ZWRfY29va2llID0gdHgtPmNvb2tpZTsKKworCQkJaWYgKHR4LT5jYWxsYmFjaykgeworCQkJCXR4LT5jYWxsYmFjayh0eC0+Y2FsbGJhY2tfcGFyYW0pOworCQkJCXR4LT5jYWxsYmFjayA9IE5VTEw7CisJCQl9CisJCQllbHNlCisJCQkJcHJpbnRrKCJObyBDYWxsYmFja1xuIik7CisKKwkJCXNtcF9tYigpOwkJCisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZtZG1hX2xvY2ssIGZsYWdzKTsKKwkJCWZvcihrID0gMCA7IGsgPCBzcGxpdF9zaXplOyBrKyspCisJCQl7CisJCQkJeG9yX3JkX2lkeCA9ICh4b3JfcmRfaWR4ICsgMSkgJSBYT1JfRkRFU0NfQ09VTlQ7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZG1hX2xvY2ssIGZsYWdzKTsKKworCQkJeG9yX3N3X3JkX2lkeCA9ICh4b3Jfc3dfcmRfaWR4ICsgMSkgJSBYT1JfU1dfRkRFU0NfQ09VTlQ7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJaWYoY2xlYW51cF9jb3VudCkKKwkJCXByaW50aygiJXM6IGNsZWFudXBfY291bnQgJWQgbm90IG11bHRpcGxlIG9mIDE2XG4iLF9fZnVuY19fLCBjbGVhbnVwX2NvdW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3hvcl90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzcGluX2xvY2tfYmgoJmNvbWNlcnRvX3hvcl9jaC5sb2NrKTsKKworCWNvbWNlcnRvX3hvcl9jbGVhbnVwKCk7CisKKwlzcGluX3VubG9ja19iaCgmY29tY2VydG9feG9yX2NoLmxvY2spOworfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b194b3JfdGltZXJfZm5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZG1hX2xvY2ssIGZsYWdzKTsKKworCWlmKGNvbWNlcnRvX3hvcl9zbGVlcGluZykKKwkJd2FrZV91cCgmY29tY2VydG9feG9yX3dhaXRfcXVldWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRtYV9sb2NrLCBmbGFncyk7CisKKwljb21jZXJ0b194b3JfdGFza2xldCgwKTsKKworCW1vZF90aW1lcigmY29tY2VydG9feG9yX3RpbWVyLCBqaWZmaWVzICsgQ09NUExFVElPTl9USU1FT1VUKTsKKworfQorCisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3hvcl9pc3N1ZV9wZW5kaW5nKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBmbGFnczsKKworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kbWFfbG9jaywgZmxhZ3MpOworCisJY29tY2VydG9fZG1hX3Byb2Nlc3MoKTsKKworCWlmKGNvbWNlcnRvX3hvcl9zbGVlcGluZykKKwkJd2FrZV91cCgmY29tY2VydG9feG9yX3dhaXRfcXVldWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRtYV9sb2NrLCBmbGFncyk7CisKKwljb21jZXJ0b194b3JfdGFza2xldCgwKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY29tY2VydG9fc3dfeG9yX2Rlc2MgKnR4ZF90b19jb21jZXJ0b19kZXNjKHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkKQoreworCXJldHVybiBjb250YWluZXJfb2YodHhkLCBzdHJ1Y3QgY29tY2VydG9fc3dfeG9yX2Rlc2MsIGFzeW5jX3R4KTsKK30KKworCitzdGF0aWMgZG1hX2Nvb2tpZV90IGNvbWNlcnRvX3hvcl90eF9zdWJtaXQoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IGRtYV9jaGFuICpjID0gdHgtPmNoYW47CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKKworCXNwaW5fbG9ja19iaCgmY29tY2VydG9feG9yX2NoLmxvY2spOworCisJY29va2llID0gYy0+Y29va2llOworCWNvb2tpZSsrOworCWlmIChjb29raWUgPCAwKQorCQljb29raWUgPSAxOworCXR4LT5jb29raWUgPSBjb29raWU7CisJYy0+Y29va2llID0gY29va2llOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kbWFfbG9jaywgZmxhZ3MpOworCisJY29tY2VydG9feG9yX3NldF9kZXNjKHhvcl9zd193cl9wcmV2X2lkeCwgeG9yX3dyX2lkeCk7CisJeG9yX3N3X3dyX3ByZXZfaWR4ID0gKHhvcl9zd193cl9wcmV2X2lkeCArIDEpICUgWE9SX1NXX0ZERVNDX0NPVU5UIDsKKwljb21jZXJ0b19kbWFfcHJvY2VzcygpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRtYV9sb2NrLCBmbGFncyk7CisKKwlzcGluX3VubG9ja19iaCgmY29tY2VydG9feG9yX2NoLmxvY2spOworCisJaWYoY29tZXJ0b194b3JfdGltZXJfZmlyc3QpCisJeworCQltb2RfdGltZXIoJmNvbWNlcnRvX3hvcl90aW1lciwgamlmZmllcyArIENPTVBMRVRJT05fVElNRU9VVCk7CisJCWNvbWVydG9feG9yX3RpbWVyX2ZpcnN0ID0gMDsKKwl9CisJcmV0dXJuIGNvb2tpZTsKK30KKworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitjb21jZXJ0b194b3JfcHJlcF9kbWFfeG9yKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkZXN0LCBkbWFfYWRkcl90ICpzcmNzLAorCQl1bnNpZ25lZCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyB4b3JfZmxhZ3MpCit7CisJaW50IGRlc2NfaWR4OworCWludCBpOworCisJc3Bpbl9sb2NrX2JoKCZjb21jZXJ0b194b3JfY2gubG9jayk7CisJaWYoY29tY2VydG9feG9yX3JiX2Z1bGwoKSkKKwl7CisJCWNvbWNlcnRvX3hvcl9yZXF1ZXN0X3dhaXQoKTsKKwl9CisKKwlkZXNjX2lkeCA9IHhvcl9zd193cl9pZHg7CisJeG9yX3N3X3dyX2lkeCA9ICh4b3Jfc3dfd3JfaWR4ICsgMSkgJSBYT1JfU1dfRkRFU0NfQ09VTlQgOworCisJc3dfeG9yX2Rlc2NbZGVzY19pZHhdLmFzeW5jX3R4LmZsYWdzID0geG9yX2ZsYWdzOworCXN3X3hvcl9kZXNjW2Rlc2NfaWR4XS5zcmNfY250ID0gc3JjX2NudDsKKwlzd194b3JfZGVzY1tkZXNjX2lkeF0ubGVuID0gbGVuOworCXN3X3hvcl9kZXNjW2Rlc2NfaWR4XS5kbWFfZGVzdCA9IGRlc3Q7CisJZm9yKGkgPSAwOyBpIDwgc3JjX2NudDsgaSsrKQorCQlzd194b3JfZGVzY1tkZXNjX2lkeF0uZG1hX3NyY1tpXSA9IHNyY3NbaV07CisKKwlzcGluX3VubG9ja19iaCgmY29tY2VydG9feG9yX2NoLmxvY2spOworCisJcmV0dXJuICZzd194b3JfZGVzY1tkZXNjX2lkeF0uYXN5bmNfdHg7CisKK30KKworCitzdGF0aWMgaW50IGNvbWNlcnRvX3hvcl9hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBYT1JfU1dfRkRFU0NfQ09VTlQ7IGkrKykgeworCQltZW1zZXQoJnN3X3hvcl9kZXNjW2ldLCAwLCBzaXplb2Yoc3RydWN0IGNvbWNlcnRvX3N3X3hvcl9kZXNjKSk7CisJCXN3X3hvcl9kZXNjW2ldLmFzeW5jX3R4LnR4X3N1Ym1pdCA9IGNvbWNlcnRvX3hvcl90eF9zdWJtaXQ7CisJCXN3X3hvcl9kZXNjW2ldLmFzeW5jX3R4LmNvb2tpZSA9IDA7CisJCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJnN3X3hvcl9kZXNjW2ldLmFzeW5jX3R4LCBjaGFuKTsKKwl9CisJcmV0dXJuIFhPUl9TV19GREVTQ19DT1VOVDsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9feG9yX2ZyZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCS8vVE9ETworCisJcHJpbnRrKCIqKiogJXMgKioqXG4iLF9fZnVuY19fKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGVudW0gZG1hX3N0YXR1cyBjb21jZXJ0b194b3Jfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKKwkJZG1hX2Nvb2tpZV90IGNvb2tpZSwKKwkJc3RydWN0IGRtYV90eF9zdGF0ZSAqdHhzdGF0ZSkKK3sKKwlkbWFfY29va2llX3QgbGFzdF91c2VkOworCWRtYV9jb29raWVfdCBsYXN0X2NvbXBsZXRlOworCisJbGFzdF91c2VkID0gY2hhbi0+Y29va2llOworCWxhc3RfY29tcGxldGUgPSBjb21jZXJ0b194b3JfY2guY29tcGxldGVkX2Nvb2tpZTsKKwlkbWFfc2V0X3R4X3N0YXRlKHR4c3RhdGUsIGxhc3RfY29tcGxldGUsIGxhc3RfdXNlZCwgMCk7CisKKwlyZXR1cm4gZG1hX2FzeW5jX2lzX2NvbXBsZXRlKGNvb2tpZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkKTsKK30KKworCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fTURNQV9QUk9GKQorCit1bnNpZ25lZCBpbnQgbWRtYV90aW1lX2NvdW50ZXJbMjU2XTsKK3Vuc2lnbmVkIGludCBtZG1hX3JlcXRpbWVfY291bnRlclsyNTZdOwordW5zaWduZWQgaW50IG1kbWFfZGF0YV9jb3VudGVyWzI1Nl07CitzdGF0aWMgc3RydWN0IHRpbWV2YWwgbGFzdF9tZG1hOwordW5zaWduZWQgaW50IGluaXRfbWRtYV9wcm9mID0gMDsKK3Vuc2lnbmVkIGludCBlbmFibGVfbWRtYV9wcm9mID0gMDsKKwordm9pZCBjb21jZXJ0b19kbWFfcHJvZmlsaW5nX3N0YXJ0KHN0cnVjdCBjb21jZXJ0b19kbWFfc2cgKnNnLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWxvbmcgZGlmZl90aW1lX3VzOworCisJaWYgKGVuYWJsZV9tZG1hX3Byb2YpIHsKKwkJZG9fZ2V0dGltZW9mZGF5KCZzZy0+c3RhcnQpOworCisJCWlmIChpbml0X21kbWFfcHJvZikgeworCQkJZGlmZl90aW1lX3VzID0gKChzZy0+c3RhcnQudHZfc2VjIC0gbGFzdF9tZG1hLnR2X3NlYykgKiAxMDAwMDAwICsgc2ctPnN0YXJ0LnR2X3VzZWMgLSBsYXN0X21kbWEudHZfdXNlYykgPj4gNDsKKwkJCWlmIChkaWZmX3RpbWVfdXMgPCAyNTYpIHsKKwkJCQltZG1hX3RpbWVfY291bnRlcltkaWZmX3RpbWVfdXNdKys7CisJCQl9CisJCQllbHNlIHsKKwkJCQltZG1hX3RpbWVfY291bnRlclsyNTVdKys7CisJCQl9CisJCX0KKworCQlsZW4gPj49IDEzOworCisJCWlmIChsZW4gPCAyNTYpCisJCQltZG1hX2RhdGFfY291bnRlcltsZW5dKys7CisJCWVsc2UKKwkJCW1kbWFfZGF0YV9jb3VudGVyWzI1NV0rKzsKKwl9Cit9CisKK3ZvaWQgY29tY2VydG9fZG1hX3Byb2ZpbGluZ19lbmQoc3RydWN0IGNvbWNlcnRvX2RtYV9zZyAqc2cpCit7CisJbG9uZyBkaWZmX3RpbWVfdXM7CisKKwlpZiAoZW5hYmxlX21kbWFfcHJvZikgeworCQlkb19nZXR0aW1lb2ZkYXkoJnNnLT5lbmQpOworCisJCWRpZmZfdGltZV91cyA9ICgoc2ctPmVuZC50dl9zZWMgLSBzZy0+c3RhcnQudHZfc2VjKSAqIDEwMDAwMDAgKyBzZy0+ZW5kLnR2X3VzZWMgLSBzZy0+c3RhcnQudHZfdXNlYykgPj4gNDsKKwkJaWYgKGRpZmZfdGltZV91cyA8IDI1NikgeworCQkJbWRtYV9yZXF0aW1lX2NvdW50ZXJbZGlmZl90aW1lX3VzXSsrOworCQl9CisJCWVsc2UKKwkJCW1kbWFfcmVxdGltZV9jb3VudGVyWzI1NV0rKzsKKworCQlpZiAoIWluaXRfbWRtYV9wcm9mKQorCQkJaW5pdF9tZG1hX3Byb2YgPSAxOworCisJCWxhc3RfbWRtYSA9IHNnLT5lbmQ7CisJfQorfQorCisjZWxzZQordm9pZCBjb21jZXJ0b19kbWFfcHJvZmlsaW5nX3N0YXJ0KHN0cnVjdCBjb21jZXJ0b19kbWFfc2cgKnNnLCB1bnNpZ25lZCBpbnQgbGVuKSB7fQordm9pZCBjb21jZXJ0b19kbWFfcHJvZmlsaW5nX2VuZChzdHJ1Y3QgY29tY2VydG9fZG1hX3NnICpzZykge30KKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfYWNwX21hcF9wYWdlKHN0cnVjdCBjb21jZXJ0b19kbWFfc2cgKnNnLCB2b2lkICpwLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgZGlyLCBpbnQgdXNlX2FjcCkKK3sKKwlkbWFfYWRkcl90IHBoeXNfYWRkciA9IHZpcnRfdG9fcGh5cyhwKTsKKwlkbWFfYWRkcl90IGxvdywgaGlnaDsKKworCWlmICghdXNlX2FjcCkKKwkJZ290byBtYXA7CisKKwlpZiAoKHBoeXNfYWRkciA+PSBzZy0+bG93X3BoeXNfYWRkcikgJiYgKHBoeXNfYWRkciArIGxlbikgPCBzZy0+aGlnaF9waHlzX2FkZHIpCisJeworCQkvKiBJbiByYW5nZSwgc2tpcCBtYXBwaW5nICovCisJCXJldHVybiBDT01DRVJUT19BWElfQUNQX0JBU0UgKyBwaHlzX2FkZHI7CisJfQorCisJLyogVHJ5IHRvIGdyb3cgd2luZG93LCBpZiBwb3NzaWJsZSAqLworCWlmIChwaHlzX2FkZHIgPCBzZy0+bG93X3BoeXNfYWRkcikKKwkJbG93ID0gcGh5c19hZGRyICYgfihDT01DRVJUT19BWElfQUNQX1NJWkUgLSAxKTsKKwllbHNlCisJCWxvdyA9IHNnLT5sb3dfcGh5c19hZGRyOworCisJaWYgKChwaHlzX2FkZHIgKyBsZW4pID4gc2ctPmhpZ2hfcGh5c19hZGRyKQorCQloaWdoID0gKHBoeXNfYWRkciArIGxlbiArIENPTUNFUlRPX0FYSV9BQ1BfU0laRSAtIDEpICYgfihDT01DRVJUT19BWElfQUNQX1NJWkUgLSAxKTsKKwllbHNlCisJCWhpZ2ggPSBzZy0+aGlnaF9waHlzX2FkZHI7CisKKwlpZiAoKGhpZ2ggLSBsb3cpIDw9IENPTUNFUlRPX0FYSV9BQ1BfU0laRSkgeworCQlzZy0+bG93X3BoeXNfYWRkciA9IGxvdzsKKwkJc2ctPmhpZ2hfcGh5c19hZGRyID0gaGlnaDsKKworCQlyZXR1cm4gQ09NQ0VSVE9fQVhJX0FDUF9CQVNFICsgcGh5c19hZGRyOworCX0KKworbWFwOgorCXJldHVybiBkbWFfbWFwX3NpbmdsZShOVUxMLCBwLCBsZW4sIGRpcik7IC8vVE9ETyBhZGQgcHJvcGVyIGNoZWNrcworfQorCisKK2ludCBjb21jZXJ0b19kbWFfc2dfYWRkX2lucHV0KHN0cnVjdCBjb21jZXJ0b19kbWFfc2cgKnNnLCB2b2lkICpwLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgdXNlX2FjcCkKK3sKKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKKworCWlmICh1bmxpa2VseShsZW4gPiAoTURNQV9NQVhfQlVGX1NJWkUgKyAxKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdHJpZWQgdG8gYWRkIGEgcGFnZSBsYXJnZXIgdGhhbiAlZCBrQi5cbiIsIF9fZnVuY19fLCBNRE1BX01BWF9CVUZfU0laRSArIDEpOworCQlyZXR1cm4gLTI7CisJfQorCisJaWYgKGxlbiA8PSBNRE1BX01BWF9CVUZfU0laRSkgeworCQlpZiAoc2ctPmlucHV0X2lkeCA+PSBNRE1BX0lOQk9VTkRfQlVGX0RFU0MpCisJCQlyZXR1cm4gLTE7CisKKwkJcGh5c19hZGRyID0gZG1hX2FjcF9tYXBfcGFnZShzZywgcCwgbGVuLCBETUFfVE9fREVWSUNFLCB1c2VfYWNwKTsKKworCQlzZy0+aW5fYmRlc2Nbc2ctPmlucHV0X2lkeF0uc3BsaXQgPSAwOworCQlzZy0+aW5fYmRlc2Nbc2ctPmlucHV0X2lkeF0ucGh5c19hZGRyID0gcGh5c19hZGRyOworCQlzZy0+aW5fYmRlc2Nbc2ctPmlucHV0X2lkeF0ubGVuID0gbGVuOworCQlzZy0+aW5wdXRfaWR4Kys7CisKKwkJcmV0dXJuIDA7CisJfQorCWVsc2UgeyAvKiBsZW4gPSBNU1BEX01ETUFfTUFYX0JVRl9TSVpFICsxLCBzcGxpdCBpdCBpbiAyIHBpZWNlcyAqLworCQlpZiAoc2ctPmlucHV0X2lkeCA+PSAoTURNQV9JTkJPVU5EX0JVRl9ERVNDIC0gMSkpCisJCQlyZXR1cm4gLTE7CisKKwkJcGh5c19hZGRyID0gZG1hX2FjcF9tYXBfcGFnZShzZywgcCwgbGVuLCBETUFfVE9fREVWSUNFLCB1c2VfYWNwKTsKKworCQlzZy0+aW5fYmRlc2Nbc2ctPmlucHV0X2lkeF0uc3BsaXQgPSAxOworCQlzZy0+aW5fYmRlc2Nbc2ctPmlucHV0X2lkeF0ucGh5c19hZGRyID0gcGh5c19hZGRyOworCQlzZy0+aW5fYmRlc2Nbc2ctPmlucHV0X2lkeF0ubGVuID0gTURNQV9TUExJVF9CVUZfU0laRTsKKwkJc2ctPmlucHV0X2lkeCsrOworCQlzZy0+aW5fYmRlc2Nbc2ctPmlucHV0X2lkeF0uc3BsaXQgPSAwOworCQlzZy0+aW5fYmRlc2Nbc2ctPmlucHV0X2lkeF0ucGh5c19hZGRyID0gcGh5c19hZGRyICsgTURNQV9TUExJVF9CVUZfU0laRTsKKwkJc2ctPmluX2JkZXNjW3NnLT5pbnB1dF9pZHhdLmxlbiA9IGxlbiAtIE1ETUFfU1BMSVRfQlVGX1NJWkU7CisJCXNnLT5pbnB1dF9pZHgrKzsKKworCQlyZXR1cm4gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGNvbWNlcnRvX2RtYV9zZ19hZGRfaW5wdXQpOworCitpbnQgY29tY2VydG9fZG1hX3NnX2FkZF9vdXRwdXQoc3RydWN0IGNvbWNlcnRvX2RtYV9zZyAqc2csIHZvaWQgKnAsIHVuc2lnbmVkIGludCBsZW4sIGludCB1c2VfYWNwKQoreworCWRtYV9hZGRyX3QgcGh5c19hZGRyOworCisJaWYgKHVubGlrZWx5KGxlbiA+IChNRE1BX01BWF9CVUZfU0laRSArIDEpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB0cmllZCB0byBhZGQgYSBwYWdlIGxhcmdlciB0aGFuICVkIGtCLlxuIiwgX19mdW5jX18sIE1ETUFfTUFYX0JVRl9TSVpFICsgMSk7CisJCXJldHVybiAtMjsKKwl9CisKKwlpZiAobGVuIDw9IE1ETUFfTUFYX0JVRl9TSVpFKSB7CisJCWlmIChzZy0+b3V0cHV0X2lkeCA+PSBNRE1BX09VVEJPVU5EX0JVRl9ERVNDKQorCQkJcmV0dXJuIC0xOworCisJCXBoeXNfYWRkciA9IGRtYV9hY3BfbWFwX3BhZ2Uoc2csIHAsIGxlbiwgRE1BX0ZST01fREVWSUNFLCB1c2VfYWNwKTsKKworCQlzZy0+b3V0X2JkZXNjW3NnLT5vdXRwdXRfaWR4XS5zcGxpdCA9IDA7CisJCXNnLT5vdXRfYmRlc2Nbc2ctPm91dHB1dF9pZHhdLnBoeXNfYWRkciA9IHBoeXNfYWRkcjsKKwkJc2ctPm91dF9iZGVzY1tzZy0+b3V0cHV0X2lkeF0ubGVuID0gbGVuOworCQlzZy0+b3V0cHV0X2lkeCsrOworCisJCXJldHVybiAwOworCX0KKwllbHNlIHsgLyogbGVuID0gTURNQV9NQVhfQlVGX1NJWkUgKzEsIHNwbGl0IGl0IGluIDIgcGllY2VzICovCisJCWlmIChzZy0+b3V0cHV0X2lkeCA+PSAoTURNQV9PVVRCT1VORF9CVUZfREVTQyAtIDEpKQorCQkJcmV0dXJuIC0xOworCisJCXBoeXNfYWRkciA9IGRtYV9hY3BfbWFwX3BhZ2Uoc2csIHAsIGxlbiwgRE1BX0ZST01fREVWSUNFLCB1c2VfYWNwKTsKKworCQlzZy0+b3V0X2JkZXNjW3NnLT5vdXRwdXRfaWR4XS5zcGxpdCA9IDE7CisJCXNnLT5vdXRfYmRlc2Nbc2ctPm91dHB1dF9pZHhdLnBoeXNfYWRkciA9IHBoeXNfYWRkcjsKKwkJc2ctPm91dF9iZGVzY1tzZy0+b3V0cHV0X2lkeF0ubGVuID0gTURNQV9TUExJVF9CVUZfU0laRTsKKwkJc2ctPm91dHB1dF9pZHgrKzsKKwkJc2ctPm91dF9iZGVzY1tzZy0+b3V0cHV0X2lkeF0uc3BsaXQgPSAwOworCQlzZy0+b3V0X2JkZXNjW3NnLT5vdXRwdXRfaWR4XS5waHlzX2FkZHIgPSBwaHlzX2FkZHIgKyBNRE1BX1NQTElUX0JVRl9TSVpFOworCQlzZy0+b3V0X2JkZXNjW3NnLT5vdXRwdXRfaWR4XS5sZW4gPSBsZW4gLSBNRE1BX1NQTElUX0JVRl9TSVpFOworCQlzZy0+b3V0cHV0X2lkeCsrOworCisJCXJldHVybiAwOworCX0KK30KK0VYUE9SVF9TWU1CT0woY29tY2VydG9fZG1hX3NnX2FkZF9vdXRwdXQpOworCit2b2lkIGNvbWNlcnRvX2RtYV9zZ19zZXR1cChzdHJ1Y3QgY29tY2VydG9fZG1hX3NnICpzZywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcmVtYWluaW5nOworCisJY29tY2VydG9fZG1hX3Byb2ZpbGluZ19zdGFydChzZywgbGVuKTsKKworCXdyaXRlbF9yZWxheGVkKHNnLT5sb3dfcGh5c19hZGRyIHwKKwkJCUFXVVNFUl9DT0hFUkVOVChXUklURUJBQ0spIHwgQVdQUk9UKDB4MCkgfCBBV0NBQ0hFKENBQ0hFQUJMRSB8IEJVRkZFUkFCTEUpIHwKKwkJCUFSVVNFUl9DT0hFUkVOVChXUklURUJBQ0spIHwgQVJQUk9UKDB4MCkgfCBBUkNBQ0hFKENBQ0hFQUJMRSB8IEJVRkZFUkFCTEUpLAorCQkJQ09NQ0VSVE9fR1BJT19BOV9BQ1BfQ09ORl9SRUcpOworCisJcmVtYWluaW5nID0gbGVuOworCWkgPSAwOworCXdoaWxlIChyZW1haW5pbmcgPiBzZy0+aW5fYmRlc2NbaV0ubGVuKSB7CisKKwkJaWYgKHNnLT5pbl9iZGVzY1tpXS5waHlzX2FkZHIgPj0gQ09NQ0VSVE9fQVhJX0FDUF9CQVNFKQorCQkJc2ctPmluX2JkZXNjW2ldLnBoeXNfYWRkciAtPSBzZy0+bG93X3BoeXNfYWRkcjsKKworCQljb21jZXJ0b19kbWFfc2V0X2luX2JkZXNjKGksIHNnLT5pbl9iZGVzY1tpXS5waHlzX2FkZHIsIHNnLT5pbl9iZGVzY1tpXS5sZW4pOworCQlyZW1haW5pbmcgLT0gc2ctPmluX2JkZXNjW2ldLmxlbjsKKwkJaSsrOworCX0KKworCWlmIChzZy0+aW5fYmRlc2NbaV0ucGh5c19hZGRyID49IENPTUNFUlRPX0FYSV9BQ1BfQkFTRSkKKwkJc2ctPmluX2JkZXNjW2ldLnBoeXNfYWRkciAtPSBzZy0+bG93X3BoeXNfYWRkcjsKKworCWNvbWNlcnRvX2RtYV9zZXRfaW5fYmRlc2MoaSwgc2ctPmluX2JkZXNjW2ldLnBoeXNfYWRkciwgcmVtYWluaW5nIHwgQkxBU1QpOworCisJcmVtYWluaW5nID0gbGVuOworCWkgPSAwOworCisJd2hpbGUgKHJlbWFpbmluZyA+IHNnLT5vdXRfYmRlc2NbaV0ubGVuKSB7CisJCWlmIChzZy0+b3V0X2JkZXNjW2ldLnBoeXNfYWRkciA+PSBDT01DRVJUT19BWElfQUNQX0JBU0UpCisJCQlzZy0+b3V0X2JkZXNjW2ldLnBoeXNfYWRkciAtPSBzZy0+bG93X3BoeXNfYWRkcjsKKworCQljb21jZXJ0b19kbWFfc2V0X291dF9iZGVzYyhpLCBzZy0+b3V0X2JkZXNjW2ldLnBoeXNfYWRkciwgc2ctPm91dF9iZGVzY1tpXS5sZW4pOworCQlyZW1haW5pbmcgLT0gc2ctPm91dF9iZGVzY1tpXS5sZW47CisJCWkrKzsKKwl9CisKKwlpZiAoc2ctPm91dF9iZGVzY1tpXS5waHlzX2FkZHIgPj0gQ09NQ0VSVE9fQVhJX0FDUF9CQVNFKQorCQlzZy0+b3V0X2JkZXNjW2ldLnBoeXNfYWRkciAtPSBzZy0+bG93X3BoeXNfYWRkcjsKKworCWNvbWNlcnRvX2RtYV9zZXRfb3V0X2JkZXNjKGksIHNnLT5vdXRfYmRlc2NbaV0ucGh5c19hZGRyLCByZW1haW5pbmcgfCBCTEFTVCk7Cit9CitFWFBPUlRfU1lNQk9MKGNvbWNlcnRvX2RtYV9zZ19zZXR1cCk7CisKK3ZvaWQgY29tY2VydG9fZG1hX3NnX2NsZWFudXAoc3RydWN0IGNvbWNlcnRvX2RtYV9zZyAqc2csIHVuc2lnbmVkIGludCBsZW4pCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHJlbWFpbmluZzsKKworCXJlbWFpbmluZyA9IGxlbjsKKwlpID0gMDsKKwl3aGlsZSAocmVtYWluaW5nID4gc2ctPmluX2JkZXNjW2ldLmxlbikgeworCQlpZiAoc2ctPmluX2JkZXNjW2ldLnNwbGl0KSB7CisJCQlzZy0+aW5fYmRlc2NbaSsxXS5waHlzX2FkZHIgPSBzZy0+aW5fYmRlc2NbaV0ucGh5c19hZGRyOworCQkJc2ctPmluX2JkZXNjW2krMV0ubGVuICs9IHNnLT5pbl9iZGVzY1tpXS5sZW47CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoc2ctPmluX2JkZXNjW2ldLnBoeXNfYWRkciA8IENPTUNFUlRPX0FYSV9BQ1BfQkFTRSkKKwkJCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBzZy0+aW5fYmRlc2NbaV0ucGh5c19hZGRyLCBzZy0+aW5fYmRlc2NbaV0ubGVuLCBETUFfVE9fREVWSUNFKTsKKwkJCXJlbWFpbmluZyAtPSBzZy0+aW5fYmRlc2NbaV0ubGVuOworCQl9CisJCWkrKzsKKwl9CisKKwlpZiAoc2ctPmluX2JkZXNjW2ldLnBoeXNfYWRkciA8IENPTUNFUlRPX0FYSV9BQ1BfQkFTRSkKKwkJZG1hX3VubWFwX3BhZ2UoTlVMTCwgc2ctPmluX2JkZXNjW2ldLnBoeXNfYWRkciwgc2ctPmluX2JkZXNjW2ldLmxlbiwgRE1BX1RPX0RFVklDRSk7CisKKwlyZW1haW5pbmcgPSBsZW47CisJaSA9IDA7CisJd2hpbGUgKHJlbWFpbmluZyA+IHNnLT5vdXRfYmRlc2NbaV0ubGVuKSB7CisJCWlmIChzZy0+b3V0X2JkZXNjW2ldLnNwbGl0KSB7CisJCQlzZy0+b3V0X2JkZXNjW2krMV0ucGh5c19hZGRyID0gc2ctPm91dF9iZGVzY1tpXS5waHlzX2FkZHI7CisJCQlzZy0+b3V0X2JkZXNjW2krMV0ubGVuICs9IHNnLT5vdXRfYmRlc2NbaV0ubGVuOworCQl9CisJCWVsc2UgeworCQkJaWYgKHNnLT5vdXRfYmRlc2NbaV0ucGh5c19hZGRyIDwgQ09NQ0VSVE9fQVhJX0FDUF9CQVNFKQorCQkJCWRtYV91bm1hcF9wYWdlKE5VTEwsIHNnLT5vdXRfYmRlc2NbaV0ucGh5c19hZGRyLCBzZy0+b3V0X2JkZXNjW2ldLmxlbiwgRE1BX0ZST01fREVWSUNFKTsKKwkJCXJlbWFpbmluZyAtPSBzZy0+b3V0X2JkZXNjW2ldLmxlbjsKKwkJfQorCQlpKys7CisJfQorCisJaWYgKHNnLT5vdXRfYmRlc2NbaV0ucGh5c19hZGRyIDwgQ09NQ0VSVE9fQVhJX0FDUF9CQVNFKQorCQlkbWFfdW5tYXBfcGFnZShOVUxMLCBzZy0+b3V0X2JkZXNjW2ldLnBoeXNfYWRkciwgc2ctPm91dF9iZGVzY1tpXS5sZW4sIERNQV9GUk9NX0RFVklDRSk7CisKKworCWNvbWNlcnRvX2RtYV9wcm9maWxpbmdfZW5kKHNnKTsKK30KK0VYUE9SVF9TWU1CT0woY29tY2VydG9fZG1hX3NnX2NsZWFudXApOworCit2b2lkIGNvbWNlcnRvX2RtYV9nZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCURFRklORV9XQUlUKHdhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kbWFfbG9jaywgZmxhZ3MpOworCisJaWYgKGRtYV9vd25lZCAmJiAoZG1hX293bmVkICE9IE9XTkVSX01FTUNQWV9GUkVFKSkgeworCQlwcmVwYXJlX3RvX3dhaXQoJm1kbWFfbWVtY3B5X2J1c3lfcXVldWUsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisKKwkJbWVtY3B5X3BlbmRpbmdfY291bnQrKzsKKworCQl3aGlsZSAoIWRtYV9vd25lZCB8fCAhKGRtYV9vd25lZCA9PSBPV05FUl9NRU1DUFlfRlJFRSkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kbWFfbG9jaywgZmxhZ3MpOworCQkJc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZtZG1hX2xvY2ssIGZsYWdzKTsKKwkJCXByZXBhcmVfdG9fd2FpdCgmbWRtYV9tZW1jcHlfYnVzeV9xdWV1ZSwgJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJfQorCisJCW1lbWNweV9wZW5kaW5nX2NvdW50LS07CisKKwkJZmluaXNoX3dhaXQoJm1kbWFfbWVtY3B5X2J1c3lfcXVldWUsICZ3YWl0KTsKKwl9CisJZG1hX293bmVkID0gT1dORVJfTUVNQ1BZX0JVU1k7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZG1hX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woY29tY2VydG9fZG1hX2dldCk7CisKK3ZvaWQgY29tY2VydG9fZG1hX3B1dCh2b2lkKQoreworI2lmIDAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kbWFfbG9jaywgZmxhZ3MpOworCW1kbWFfYnVzeSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRtYV9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwKCZtZG1hX21lbWNweV9idXN5X3F1ZXVlKTsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChjb21jZXJ0b19kbWFfcHV0KTsKKworLyogQ2FsbGVkIG9uY2UgdG8gc2V0dXAgY29tbW9uIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgY29tY2VydG9fZG1hX3NldHVwKHZvaWQpCit7CisJLyogSU8yTV9JUlFfRU5BQkxFOiBFbmFibGUgSVJRX0lSUUZET04qLworCXdyaXRlbF9yZWxheGVkKElSUV9JUlFGRE9OfElSUV9JUlFGTEVOfElSUV9JUlFGVEhMRHxJUlFfSVJRRkxTVCwgSU8yTV9JUlFfRU5BQkxFKTsKKwl3cml0ZWxfcmVsYXhlZChJUlFfSVJRRkRPTnxJUlFfSVJRRkxFTnxJUlFfSVJRRlRITER8SVJRX0lSUUZMU1QsIE0ySU9fSVJRX0VOQUJMRSk7CisKKwl3cml0ZWxfcmVsYXhlZChGTEVORU4sIE0ySU9fQ09OVFJPTCk7CisJd3JpdGVsX3JlbGF4ZWQoMHhmIHwgKDB4M2ZmIDw8IDgpLCBNMklPX0JVUlNUKTsKKwl3cml0ZWxfcmVsYXhlZChGTEVORU4sIElPMk1fQ09OVFJPTCk7CisJd3JpdGVsX3JlbGF4ZWQoMHhmIHwgKDB4M2ZmIDw8IDgpLCBJTzJNX0JVUlNUKTsKK30KKworCit2b2lkIGNvbWNlcnRvX2RtYV9zdGFydCh2b2lkKQoreworCW1kbWFfZG9uZSA9IDA7CisKKwltZG1hX2luX2Rlc2MtPm5leHRfZGVzYyA9IDA7CisJbWRtYV9pbl9kZXNjLT5mY29udHJvbCA9IDA7CisJbWRtYV9pbl9kZXNjLT5mc3RhdHVzMCA9IDA7CisJbWRtYV9pbl9kZXNjLT5mc3RhdHVzMSA9IDA7CisKKwkvLyBvdXRib3VuZAorCW1kbWFfb3V0X2Rlc2MtPm5leHRfZGVzYyA9IDA7CisJbWRtYV9vdXRfZGVzYy0+ZmNvbnRyb2wgPSAwOworCW1kbWFfb3V0X2Rlc2MtPmZzdGF0dXMwID0gMDsKKwltZG1hX291dF9kZXNjLT5mc3RhdHVzMSA9IDA7CisKKwl3bWIoKTsKKworCS8vIEluaXRpYWxpemUgdGhlIE91dGJvdW5kIEhlYWQgUG9pbnRlcgorCXdyaXRlbF9yZWxheGVkKG1kbWFfb3V0X2Rlc2NfcGh5LCBJTzJNX0hFQUQpOworCisJLy8gSW5pdGlhbGl6ZSB0aGUgSW5ib3VuZCBIZWFkIFBvaW50ZXIKKwl3cml0ZWxfcmVsYXhlZChtZG1hX2luX2Rlc2NfcGh5LCBNMklPX0hFQUQpOworCisJd3JpdGVsX3JlbGF4ZWQoMSwgTTJJT19GTEVOKTsKKwl3cml0ZWxfcmVsYXhlZCgxLCBJTzJNX0ZMRU4pOworCisJd21iKCk7Cit9CitFWFBPUlRfU1lNQk9MKGNvbWNlcnRvX2RtYV9zdGFydCk7CisKKwordm9pZCBjb21jZXJ0b19kbWFfd2FpdCh2b2lkKQoreworCURFRklORV9XQUlUKHdhaXQpOworCisJcHJlcGFyZV90b193YWl0KCZtZG1hX2RvbmVfcXVldWUsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisKKwlpZiAoIW1kbWFfZG9uZSkKKwkJc2NoZWR1bGUoKTsKKworCWZpbmlzaF93YWl0KCZtZG1hX2RvbmVfcXVldWUsICZ3YWl0KTsKK30KK0VYUE9SVF9TWU1CT0woY29tY2VydG9fZG1hX3dhaXQpOworCitzdGF0aWMgdm9pZCBjb21jZXJ0b19kdW1wX3JlZ3Modm9pZCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChNMklPX0NPTlRST0wpOworCXByaW50ayhLRVJOX0VSUiJNMklPX0NPTlRST0wgICAgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoTTJJT19IRUFEKTsKKwlwcmludGsoS0VSTl9FUlIiTTJJT19IRUFEICAgICAgICAgICAgMHglOHguXG4iLHZhbCk7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKE0ySU9fQlVSU1QpOworCXByaW50ayhLRVJOX0VSUiJNMklPX0JVUlNUICAgICAgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoTTJJT19GTEVOKTsKKwlwcmludGsoS0VSTl9FUlIiTTJJT19GTEVOICAgICAgICAgICAgMHglOHguXG4iLHZhbCk7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKE0ySU9fSVJRX0VOQUJMRSk7CisJcHJpbnRrKEtFUk5fRVJSIk0ySU9fSVJRX0VOQUJMRSAgICAgIDB4JTh4LlxuIix2YWwpOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChNMklPX0lSUV9TVEFUVVMpOworCXByaW50ayhLRVJOX0VSUiJNMklPX0lSUV9TVEFUVVMgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoTTJJT19SRVNFVCk7CisJcHJpbnRrKEtFUk5fRVJSIk0ySU9fUkVTRVQgICAgICAgICAgIDB4JTh4LlxuIix2YWwpOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChJTzJNX0NPTlRST0wpOworCXByaW50ayhLRVJOX0VSUiJJTzJNX0NPTlRST0wgICAgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoSU8yTV9IRUFEKTsKKwlwcmludGsoS0VSTl9FUlIiSU8yTV9IRUFEICAgICAgICAgICAgMHglOHguXG4iLHZhbCk7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKElPMk1fQlVSU1QpOworCXByaW50ayhLRVJOX0VSUiJJTzJNX0JVUlNUICAgICAgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoSU8yTV9GTEVOKTsKKwlwcmludGsoS0VSTl9FUlIiSU8yTV9GTEVOICAgICAgICAgICAgMHglOHguXG4iLHZhbCk7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKElPMk1fSVJRX0VOQUJMRSk7CisJcHJpbnRrKEtFUk5fRVJSIklPMk1fSVJRX0VOQUJMRSAgICAgIDB4JTh4LlxuIix2YWwpOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChJTzJNX0lSUV9TVEFUVVMpOworCXByaW50ayhLRVJOX0VSUiJJTzJNX0lSUV9TVEFUVVMgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoSU8yTV9SRVNFVCk7CisJcHJpbnRrKEtFUk5fRVJSIklPMk1fUkVTRVQgICAgICAgICAgIDB4JTh4LlxuIix2YWwpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYzJrX2RtYV9oYW5kbGVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJaW50IGk7CisJaW50IHBlbmRpbmdfY291bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaW50cl9jYXVzZSA9IHJlYWRsX3JlbGF4ZWQoSU8yTV9JUlFfU1RBVFVTKTsKKworCXdyaXRlbF9yZWxheGVkKGludHJfY2F1c2UsIElPMk1fSVJRX1NUQVRVUyk7CisKKwlpZiAodW5saWtlbHkoaW50cl9jYXVzZSAmIH4oSVJRX0lSUUZET04gfCBJUlFfSVJRRkxTVCB8IElSUV9JUlFGTEVOKSkpIHsKKwkJaWYgKGludHJfY2F1c2UgJiBJUlFfSVJRRlJEWU4pCisJCQlwcmludGsoS0VSTl9BTEVSVCAiSVJRRlJEWU46IEEgZnJhbWUgaXMgc3RhcnRlZCBidXQgdGhlIGZyYW1lIGlzIG5vdCByZWFkeSIpOworCisJCWlmIChpbnRyX2NhdXNlICYgSVJRX0lSUUZMU0gpCisJCQlwcmludGsoS0VSTl9BTEVSVCAiSVJRRkxTSDogSU8gaGFzIG1vcmUgZGF0YSB0aGFuIHRoZSBtZW1vcnkgYnVmZmVyIik7CisKKwkJaWYgKGludHJfY2F1c2UgJiBJUlFfSVJRRlRITEQpCisJCQlwcmludGsoS0VSTl9BTEVSVCAiSVJRRlRITEQ6IEZyYW1lIHRocmVzaG9sZCByZWFjaGVkLiBGTEVOPUZUSExETCIpOworCisJCWlmIChpbnRyX2NhdXNlICYgSVJRX0lSUUZDVFJMKQorCQkJcHJpbnRrKEtFUk5fQUxFUlQgIklSUUZDVFJMOiAxIGZyYW1lIGlzIGNvbXBsZXRlZCBvciB3aGVuIGEgZnJhbWUgaXMgc3RhcnRlZCBidXQgbm90IHJlYWR5Iik7CQorCisJCWNvbWNlcnRvX2R1bXBfcmVncygpOworCX0KKworCWlmIChpbnRyX2NhdXNlICYgSVJRX0lSUUZET04pIHsKKworCX0KKworCWlmIChpbnRyX2NhdXNlICYgSVJRX0lSUUZMRU4pIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRtYV9sb2NrLCBmbGFncyk7CisJCWlmKCFkbWFfb3duZWQpCisJCQlwcmludGsoS0VSTl9BTEVSVCAiIE5VTEwgTURNQSBPd25lcnNoaXAgISEhXG4iKTsKKworCisJCWlmKGRtYV9vd25lZD09T1dORVJfWE9SX0JVU1kpCisJCXsKKworCQkJZm9yKGkgPSAwIDsgaSA8IHhvcl9jdXJyZW50X2JhdGNoX2NvdW50OyBpKyspCisJCQkJeG9yX2RtYV9pZHggPSAoeG9yX2RtYV9pZHggKyAxKSAlIFhPUl9GREVTQ19DT1VOVDsKKworCQkJeG9yX2N1cnJlbnRfYmF0Y2hfY291bnQgPSAwOworCisKKwkJCWlmKG1lbWNweV9wZW5kaW5nX2NvdW50KQorCQkJeworCQkJCWRtYV9vd25lZCA9IE9XTkVSX01FTUNQWV9GUkVFOworCQkJCXdha2VfdXAoJm1kbWFfbWVtY3B5X2J1c3lfcXVldWUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXBlbmRpbmdfY291bnQgPSBDSVJDX0NOVCh4b3Jfd3JfaWR4LCB4b3JfZG1hX2lkeCwgWE9SX0ZERVNDX0NPVU5UKTsKKwkJCQlpZihwZW5kaW5nX2NvdW50KQorCQkJCXsKKwkJCQkJZG1hX293bmVkID0gT1dORVJfWE9SX0JVU1k7CisJCQkJCXhvcl9jdXJyZW50X2JhdGNoX2NvdW50ID0gcGVuZGluZ19jb3VudDsKKwkJCQkJY29tY2VydG9feG9yX3VwZGF0ZV9kbWFfZmxlbih4b3JfY3VycmVudF9iYXRjaF9jb3VudCk7CisJCQkJCWNvbWNlcnRvX3hvcl91cGRhdGVfZG1hX2hlYWQoeG9yX2RtYV9pZHgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlkbWFfb3duZWQgPSAwOworCQkJCX0KKwkJCX0KKworCQkJaWYoY29tY2VydG9feG9yX3NsZWVwaW5nKQorCQkJeworCQkJCXdha2VfdXAoJmNvbWNlcnRvX3hvcl93YWl0X3F1ZXVlKTsKKwkJCX0KKworCQkJdGFza2xldF9zY2hlZHVsZSgmY29tY2VydG9feG9yX2NoLmlycV90YXNrbGV0KTsKKwkJfQorCQllbHNlIC8vbWVtY3B5CisJCXsKKwkJCW1kbWFfZG9uZSA9IDE7CisJCQl3YWtlX3VwKCZtZG1hX2RvbmVfcXVldWUpOworCisJCQltZW1jcHlfcHJvY2Vzc2VkX29uZ29pbmcrKzsKKwkJCXBlbmRpbmdfY291bnQgPSBDSVJDX0NOVCh4b3Jfd3JfaWR4LCB4b3JfZG1hX2lkeCwgWE9SX0ZERVNDX0NPVU5UKTsKKworCQkJaWYocGVuZGluZ19jb3VudCkKKwkJCXsKKwkJCQltZW1jcHlfcHJvY2Vzc2VkX29uZ29pbmcgPSAwOworCQkJCWRtYV9vd25lZCA9IE9XTkVSX1hPUl9CVVNZOworCQkJCXhvcl9jdXJyZW50X2JhdGNoX2NvdW50ID0gcGVuZGluZ19jb3VudDsKKwkJCQljb21jZXJ0b194b3JfdXBkYXRlX2RtYV9mbGVuKHhvcl9jdXJyZW50X2JhdGNoX2NvdW50KTsKKwkJCQljb21jZXJ0b194b3JfdXBkYXRlX2RtYV9oZWFkKHhvcl9kbWFfaWR4KTsKKworCQkJCWlmKGNvbWNlcnRvX3hvcl9zbGVlcGluZykKKwkJCQl7CisJCQkJCXdha2VfdXAoJmNvbWNlcnRvX3hvcl93YWl0X3F1ZXVlKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYobWVtY3B5X3BlbmRpbmdfY291bnQpCisJCQkJeworCQkJCQlkbWFfb3duZWQgPSBPV05FUl9NRU1DUFlfRlJFRTsKKwkJCQkJd2FrZV91cCgmbWRtYV9tZW1jcHlfYnVzeV9xdWV1ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWRtYV9vd25lZCA9IDA7CisJCQkJfQorCQkJfQorCisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRtYV9sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBjb21jZXJ0b19kbWFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGlycTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwlpb3VubWFwKHZpcnRiYXNlKTsKKworCWZyZWVfaXJxKGlycSwgTlVMTCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjb21jZXJ0b19kbWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgICAgICAqaW87CisJaW50ICAgICAgICAgICAgICAgICAgaXJxOworCXZvaWQgKm1lbWNweV9wb29sID0gKHZvaWQgKilJUkFNX01FTU9SWV9WQUREUjsKKwl2b2lkICp4b3JfcG9vbDsKKwlpbnQgaTsKKwlzdHJ1Y3QgZG1hX2RldmljZSAgICAqZG1hX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFJldHJpZXZlIHJlbGF0ZWQgcmVzb3VyY2VzKG1lbSwgaXJxKSBmcm9tIHBsYXRmb3JtX2RldmljZSAqLworCWlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIWlvKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgYzJrX2RtYV9oYW5kbGVfaW50ZXJydXB0LCAwLCAiTURNQSIsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdmlydGJhc2UgPSBpb3JlbWFwKGlvLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpbykpOworCWlmICghdmlydGJhc2UpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJLyogSW5pdGlhbGl6ZSBjb21jZXJ0b194b3JfZGV2aWNlICovCisJY29tY2VydG9feG9yX2RldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGNvbWNlcnRvX3hvcl9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKworCWlmKCFjb21jZXJ0b194b3JfZGV2KQorCXsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9yZW1hcDsKKwl9CisKKwlkbWFfZGV2ID0gJmNvbWNlcnRvX3hvcl9kZXYtPmRldmljZTsKKwlJTklUX0xJU1RfSEVBRCgmZG1hX2Rldi0+Y2hhbm5lbHMpOworCWRtYV9jYXBfc2V0KERNQV9YT1IsZG1hX2Rldi0+Y2FwX21hc2spOworCWRtYV9kZXYtPmRldiA9ICZwZGV2LT5kZXY7CisJZG1hX2Rldi0+ZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzID0gY29tY2VydG9feG9yX2FsbG9jX2NoYW5fcmVzb3VyY2VzOworCWRtYV9kZXYtPmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzICA9IGNvbWNlcnRvX3hvcl9mcmVlX2NoYW5fcmVzb3VyY2VzOworCWRtYV9kZXYtPmRldmljZV90eF9zdGF0dXMgICAgICAgICAgICA9IGNvbWNlcnRvX3hvcl9zdGF0dXM7CisJZG1hX2Rldi0+ZGV2aWNlX2lzc3VlX3BlbmRpbmcgICAgICAgID0gY29tY2VydG9feG9yX2lzc3VlX3BlbmRpbmc7CisJZG1hX2Rldi0+ZGV2aWNlX3ByZXBfZG1hX3hvciAgICAgICAgID0gY29tY2VydG9feG9yX3ByZXBfZG1hX3hvcjsKKwlkbWFfZGV2LT5tYXhfeG9yID0gWE9SX01BWF9TUkNfQ05UOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsY29tY2VydG9feG9yX2Rldik7CisKKwkvKiBJbml0aWFsaXplIGNvbWNlcnRvX3hvcl9jaGFuICovCisJY29tY2VydG9feG9yX2NoLmNoYW4uZGV2aWNlID0gZG1hX2RldjsKKwlsaXN0X2FkZF90YWlsKCZjb21jZXJ0b194b3JfY2guY2hhbi5kZXZpY2Vfbm9kZSwmZG1hX2Rldi0+Y2hhbm5lbHMpOworCisJcmV0ID0gZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcihkbWFfZGV2KTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgWE9SIERNQSBjaGFubmVsICVkXG4iLF9fZnVuY19fLHJldCk7CisJCWdvdG8gZXJyX2ZyZWVfZG1hOworCX0KKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBYT1IgRE1BIGNoYW5uZWwgcmVnaXN0ZXJlZFxuIixfX2Z1bmNfXyk7CisKKwlzcGluX2xvY2tfaW5pdCgmY29tY2VydG9feG9yX2NoLmxvY2spOworCXNwaW5fbG9ja19pbml0KCZjb21jZXJ0b194b3JfY2xlYW51cF9sb2NrKTsKKworCXNwaW5fbG9ja19pbml0KCZtZG1hX2xvY2spOworCisJLy9NZW1jcHkgZGVzY3JpcHRvciBpbml0aWFsaXppbmcKKwltZG1hX2luX2Rlc2MgPSAoc3RydWN0IGNvbWNlcnRvX21lbWNweV9pbmJvdW5kX2ZkZXNjICopIChtZW1jcHlfcG9vbCk7CisJbWVtY3B5X3Bvb2wgKz0gc2l6ZW9mKHN0cnVjdCBjb21jZXJ0b19tZW1jcHlfaW5ib3VuZF9mZGVzYyk7CisJbWVtY3B5X3Bvb2wgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZykobWVtY3B5X3Bvb2wgKyAxNSkgJiB+MTUpOworCW1kbWFfb3V0X2Rlc2MgPSAoc3RydWN0IGNvbWNlcnRvX21lbWNweV9vdXRib3VuZF9mZGVzYyAqKSAobWVtY3B5X3Bvb2wpOworCW1lbWNweV9wb29sICs9IHNpemVvZihzdHJ1Y3QgY29tY2VydG9fbWVtY3B5X291dGJvdW5kX2ZkZXNjKTsKKwltZW1jcHlfcG9vbCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKShtZW1jcHlfcG9vbCArIDE1KSAmIH4xNSk7CisKKwltZG1hX2luX2Rlc2NfcGh5ID0gdmlydF90b19hcmFtKG1kbWFfaW5fZGVzYyk7CisJbWRtYV9vdXRfZGVzY19waHkgPSB2aXJ0X3RvX2FyYW0obWRtYV9vdXRfZGVzYyk7CisKKwkvL1hPUiBkZXNjcmlwdG9yIGluaXRpYWxpemluZworCWNvbWNlcnRvX3hvcl9wb29sX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgWE9SX0ZERVNDX0NPVU5UICogKHNpemVvZihzdHJ1Y3QgY29tY2VydG9feG9yX2luYm91bmRfZmRlc2MpIAorCQkJCSsgIHNpemVvZihzdHJ1Y3QgY29tY2VydG9feG9yX291dGJvdW5kX2ZkZXNjKSksICZjb21jZXJ0b194b3JfcG9vbF9waHksIEdGUF9LRVJORUwpOworCXhvcl9wb29sID0gY29tY2VydG9feG9yX3Bvb2xfdmlydDsKKworCWZvciAoaSA9IDA7IGkgPCBYT1JfRkRFU0NfQ09VTlQ7IGkrKykgeworCQl4b3JfaW5fZmRlc2NbaV0gPSAoc3RydWN0IGNvbWNlcnRvX3hvcl9pbmJvdW5kX2ZkZXNjICopICh4b3JfcG9vbCk7CisJCXhvcl9wb29sICs9IHNpemVvZihzdHJ1Y3QgY29tY2VydG9feG9yX2luYm91bmRfZmRlc2MpOworCQl4b3JfcG9vbCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh4b3JfcG9vbCArIDE1KSAmIH4xNSk7CisJCXhvcl9vdXRfZmRlc2NbaV0gPSAoc3RydWN0IGNvbWNlcnRvX3hvcl9vdXRib3VuZF9mZGVzYyAqKSAoeG9yX3Bvb2wpOworCQl4b3JfcG9vbCArPSBzaXplb2Yoc3RydWN0IGNvbWNlcnRvX3hvcl9vdXRib3VuZF9mZGVzYyk7CisJCXhvcl9wb29sID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHhvcl9wb29sICsgMTUpICYgfjE1KTsKKworCQltZW1zZXQoeG9yX2luX2ZkZXNjW2ldLCAwICwgc2l6ZW9mKHN0cnVjdCBjb21jZXJ0b194b3JfaW5ib3VuZF9mZGVzYykpOworCQltZW1zZXQoeG9yX291dF9mZGVzY1tpXSwgMCAsIHNpemVvZihzdHJ1Y3QgY29tY2VydG9feG9yX291dGJvdW5kX2ZkZXNjKSk7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgWE9SX0ZERVNDX0NPVU5UIC0gMTsgaSsrKSB7CisJCXhvcl9pbl9mZGVzY1tpXS0+bmV4dF9kZXNjID0gdmlydF90b194b3JfZG1hKGNvbWNlcnRvX3hvcl9wb29sX3BoeSwgY29tY2VydG9feG9yX3Bvb2xfdmlydCwgeG9yX2luX2ZkZXNjW2krMV0pOworCQl4b3Jfb3V0X2ZkZXNjW2ldLT5uZXh0X2Rlc2MgPSB2aXJ0X3RvX3hvcl9kbWEoY29tY2VydG9feG9yX3Bvb2xfcGh5LCBjb21jZXJ0b194b3JfcG9vbF92aXJ0LCB4b3Jfb3V0X2ZkZXNjW2krMV0pOworCX0KKwl4b3JfaW5fZmRlc2NbWE9SX0ZERVNDX0NPVU5ULTFdLT5uZXh0X2Rlc2MgPSB2aXJ0X3RvX3hvcl9kbWEoY29tY2VydG9feG9yX3Bvb2xfcGh5LCBjb21jZXJ0b194b3JfcG9vbF92aXJ0LCB4b3JfaW5fZmRlc2NbMF0pOworCXhvcl9vdXRfZmRlc2NbWE9SX0ZERVNDX0NPVU5ULTFdLT5uZXh0X2Rlc2MgPSB2aXJ0X3RvX3hvcl9kbWEoY29tY2VydG9feG9yX3Bvb2xfcGh5LCBjb21jZXJ0b194b3JfcG9vbF92aXJ0LCB4b3Jfb3V0X2ZkZXNjWzBdKTsKKworCWluaXRfdGltZXIoJmNvbWNlcnRvX3hvcl90aW1lcik7CisJY29tY2VydG9feG9yX3RpbWVyLmZ1bmN0aW9uID0gY29tY2VydG9feG9yX3RpbWVyX2ZuYzsKKwljb21jZXJ0b194b3JfdGltZXIuZGF0YSA9IDA7CisKKwl0YXNrbGV0X2luaXQoJmNvbWNlcnRvX3hvcl9jaC5pcnFfdGFza2xldCwgY29tY2VydG9feG9yX3Rhc2tsZXQsIDApOworCisJY29tY2VydG9fZG1hX3NldHVwKCk7CisKKwlnb3RvIG91dDsKKworZXJyX2ZyZWVfZG1hOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsTlVMTCk7CisJa2ZyZWUoY29tY2VydG9feG9yX2Rldik7CitlcnJfZnJlZV9yZW1hcDoKKwlpb3VubWFwKHZpcnRiYXNlKTsJCitlcnJfZnJlZV9pcnE6CisJZnJlZV9pcnEoaXJxLCBOVUxMKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNvbWNlcnRvX2RtYV9kcml2ZXIgPSB7CisJLnByb2JlICAgICAgICA9IGNvbWNlcnRvX2RtYV9wcm9iZSwKKwkucmVtb3ZlICAgICAgID0gY29tY2VydG9fZG1hX3JlbW92ZSwKKwkuZHJpdmVyICAgICAgID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm5hbWUgID0gImNvbWNlcnRvX2RtYSIsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbWNlcnRvX2RtYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY29tY2VydG9fZG1hX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChjb21jZXJ0b19kbWFfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb21jZXJ0b19kbWFfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjb21jZXJ0b19kbWFfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGNvbWNlcnRvX2RtYV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJETUEgZW5naW5lIGRyaXZlciBmb3IgTWluZHNwZWVkIENvbWNlcnRvIEMyMDAwIGRldmljZXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvY29tY2VydG9feG9yLmMgYi9kcml2ZXJzL2RtYS9jb21jZXJ0b194b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBiM2EyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEvY29tY2VydG9feG9yLmMKQEAgLTAsMCArMSwxMjM3IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KKyNpbmNsdWRlICJjb21jZXJ0b194b3IuaCIKKworI2RlZmluZSB0b19jb21jZXJ0b194b3JfY2hhbihkbWFfY2hhbikgICAgICAgICAgICAgIFwKKwkgICAgY29udGFpbmVyX29mKGRtYV9jaGFuLHN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiwgY2hhbikKKworI2RlZmluZSB0b19jb21jZXJ0b194b3JfZGV2aWNlKGRldikgICAgICAgICAgICAgXAorCSAgICBjb250YWluZXJfb2YoZGV2LHN0cnVjdCBjb21jZXJ0b194b3JfZGV2aWNlLCBkZXZpY2UpCisKKyNkZWZpbmUgdG9fY29tY2VydG9feG9yX3Nsb3QodHgpICAgICAgICAgICAgICAgIFwKKwkJY29udGFpbmVyX29mKHR4LCBzdHJ1Y3QgY29tY2VydG9feG9yX2Rlc2Nfc2xvdCwgYXN5bmNfdHgpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb25zIHRvIHNldC9yZWFkIGZyYW1lIGRlc2NyaXB0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0gU2V0IGluYm91bmQgZnJhbWUgZGVzY3JpcHRvciAtLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3NldF9uZXh0X2Rlc2NfaW5ib3VuZChzdHJ1Y3QgY29tY2VydG9feG9yX2Rlc2Nfc2xvdCAqc2xvdCwgdTMyIG5leHRfZGVzY19hZGRyKQoreworCXN0cnVjdCBjb21jZXJ0b194b3JfaW5ib3VuZF9kZXNjICpod19kZXNjID0gc2xvdC0+aHdfZGVzY19pbmJvdW5kOworCWh3X2Rlc2MtPm5leHRfZGVzYyA9IG5leHRfZGVzY19hZGRyOworfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b19zZXRfZmNvbnRyb2xfaW5ib3VuZChzdHJ1Y3QgY29tY2VydG9feG9yX2Rlc2Nfc2xvdCAqc2xvdCkKK3sKKwlzdHJ1Y3QgY29tY2VydG9feG9yX2luYm91bmRfZGVzYyAqaHdfZGVzYyA9IHNsb3QtPmh3X2Rlc2NfaW5ib3VuZDsKKworCXN3aXRjaCAoc2xvdC0+dHlwZSkgeworCWNhc2UgRE1BX1hPUjoKKwljYXNlIERNQV9YT1JfVkFMOgorCWNhc2UgRE1BX01FTUNQWToKKwkJaHdfZGVzYy0+ZmNvbnRyb2wgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBzbG90LT5hc3luY190eC5jaGFuLT5kZXZpY2UtPmRldiwKKwkJCQkgICAiZXJyb3I6IHVuc3VwcG9ydGVkIG9wZXJhdGlvbiAlZC5cbiIsc2xvdC0+dHlwZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b19zZXRfZnN0YXR1czBfaW5ib3VuZChzdHJ1Y3QgY29tY2VydG9feG9yX2Rlc2Nfc2xvdCAqc2xvdCkKK3sKKwlzdHJ1Y3QgY29tY2VydG9feG9yX2luYm91bmRfZGVzYyAqaHdfZGVzYyA9IHNsb3QtPmh3X2Rlc2NfaW5ib3VuZDsKKworCXN3aXRjaCAoc2xvdC0+dHlwZSkgeworCisJY2FzZSBETUFfWE9SOgorCQlod19kZXNjLT5mc3RhdHVzMCA9IDE7IAkJCQkJCS8vIE5ldyBSZXEsIHJlc2V0IGJsb2NrIGNvdW50ZXIsIGJsb2NrIG9mZnNldCwgY2xlYXIgc2NyYXRjaHBhZCAob3ZlcndyaXRlIGV4aXN0aW5nIGRhdGEpCisJCWh3X2Rlc2MtPmZzdGF0dXMwID0gaHdfZGVzYy0+ZnN0YXR1czAgfCAoMSA8PCAxKTsgCQkvLyBSZWFkIFNQLCByZXR1cm4gY29udGVudCBvZiBzY3JhdGNoIHBhZCBhZnRlciBwcm9jZXNzaW5nIGlucHV0IGRhdGEKKwkJaHdfZGVzYy0+ZnN0YXR1czAgPSBod19kZXNjLT5mc3RhdHVzMCB8ICgwIDw8IDIpOyAJCS8vIE1vZGUsIEVuY29kZQorCQlod19kZXNjLT5mc3RhdHVzMCA9IGh3X2Rlc2MtPmZzdGF0dXMwIHwgKHNsb3QtPnNyY19jbnQgPDwgNCk7IAkvLyBOdW1iZXIgb2YgYmxvY2tzIHRvIGJlIHByb2Nlc3NlZAorCQlod19kZXNjLT5mc3RhdHVzMCA9IGh3X2Rlc2MtPmZzdGF0dXMwIHwgKDEgPDwgOSk7IAkJLy8gVHlwZSwgWE9SCisJCWlmKHNsb3QtPmxlbiA9PSAyNTYpCisJCQlod19kZXNjLT5mc3RhdHVzMCA9IGh3X2Rlc2MtPmZzdGF0dXMwIHwgKFhPUl9CTE9DS19TSVpFXzI1NiA8PCAxMSk7CisJCWlmKHNsb3QtPmxlbiA9PSA1MTIpCisJCQlod19kZXNjLT5mc3RhdHVzMCA9IGh3X2Rlc2MtPmZzdGF0dXMwIHwgKFhPUl9CTE9DS19TSVpFXzUxMiA8PCAxMSk7CisJCWlmKHNsb3QtPmxlbiA9PSAxMDI0KQorCQkJaHdfZGVzYy0+ZnN0YXR1czAgPSBod19kZXNjLT5mc3RhdHVzMCB8IChYT1JfQkxPQ0tfU0laRV8xMDI0IDw8IDExKTsKKwkJaWYoc2xvdC0+bGVuID09IDIwNDgpCisJCQlod19kZXNjLT5mc3RhdHVzMCA9IGh3X2Rlc2MtPmZzdGF0dXMwIHwgKFhPUl9CTE9DS19TSVpFXzIwNDggPDwgMTEpOworCQlpZihzbG90LT5sZW4gPT0gNDA5NikKKwkJCWh3X2Rlc2MtPmZzdGF0dXMwID0gaHdfZGVzYy0+ZnN0YXR1czAgfCAoWE9SX0JMT0NLX1NJWkVfNDA5NiA8PCAxMSk7CisJCWJyZWFrOworCisJY2FzZSBETUFfWE9SX1ZBTDoKKwkJaHdfZGVzYy0+ZnN0YXR1czAgPSAxOyAJCQkJCQkvLyBOZXcgUmVxLCByZXNldCBibG9jayBjb3VudGVyLCBibG9jayBvZmZzZXQsIGNsZWFyIHNjcmF0Y2hwYWQgKG92ZXJ3cml0ZSBleGlzdGluZyBkYXRhKQorCQlod19kZXNjLT5mc3RhdHVzMCA9IGh3X2Rlc2MtPmZzdGF0dXMwIHwgKDAgPDwgMSk7IAkJLy8gUmVhZCBTUCwgbm8gb3V0cHV0IGdlbmVyYXRlZCwgb25seSBzdGF0dXMKKwkJaHdfZGVzYy0+ZnN0YXR1czAgPSBod19kZXNjLT5mc3RhdHVzMCB8ICgxIDw8IDIpOyAJCS8vIE1vZGUsIFZhbGlkYXRlCisJCWh3X2Rlc2MtPmZzdGF0dXMwID0gaHdfZGVzYy0+ZnN0YXR1czAgfCAoc2xvdC0+c3JjX2NudCA8PCA0KTsJLy8gTnVtYmVyIG9mIGJsb2NrcyB0byBiZSBwcm9jZXNzZWQKKwkJaHdfZGVzYy0+ZnN0YXR1czAgPSBod19kZXNjLT5mc3RhdHVzMCB8ICgxIDw8IDkpOyAJCS8vIFR5cGUsIFhPUgorCQlpZihzbG90LT5sZW4gPT0gMjU2KQorCQkJaHdfZGVzYy0+ZnN0YXR1czAgPSBod19kZXNjLT5mc3RhdHVzMCB8IChYT1JfQkxPQ0tfU0laRV8yNTYgPDwgMTEpOworCQlpZihzbG90LT5sZW4gPT0gNTEyKQorCQkJaHdfZGVzYy0+ZnN0YXR1czAgPSBod19kZXNjLT5mc3RhdHVzMCB8IChYT1JfQkxPQ0tfU0laRV81MTIgPDwgMTEpOworCQlpZihzbG90LT5sZW4gPT0gMTAyNCkKKwkJCWh3X2Rlc2MtPmZzdGF0dXMwID0gaHdfZGVzYy0+ZnN0YXR1czAgfCAoWE9SX0JMT0NLX1NJWkVfMTAyNCA8PCAxMSk7CisJCWlmKHNsb3QtPmxlbiA9PSAyMDQ4KQorCQkJaHdfZGVzYy0+ZnN0YXR1czAgPSBod19kZXNjLT5mc3RhdHVzMCB8IChYT1JfQkxPQ0tfU0laRV8yMDQ4IDw8IDExKTsKKwkJaWYoc2xvdC0+bGVuID09IDQwOTYpCisJCQlod19kZXNjLT5mc3RhdHVzMCA9IGh3X2Rlc2MtPmZzdGF0dXMwIHwgKFhPUl9CTE9DS19TSVpFXzQwOTYgPDwgMTEpOworCQlicmVhazsKKwljYXNlIERNQV9NRU1DUFk6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9wcmludGsoS0VSTl9FUlIsIHNsb3QtPmFzeW5jX3R4LmNoYW4tPmRldmljZS0+ZGV2LAorCQkJCSAgICJlcnJvcjogdW5zdXBwb3J0ZWQgb3BlcmF0aW9uICVkLlxuIixzbG90LT50eXBlKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgY29tY2VydG9fc2V0X2J1ZmZfaW5mb19pbmJvdW5kKHN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90ICpzbG90LCBkbWFfYWRkcl90ICpzcmMpCit7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9pbmJvdW5kX2Rlc2MgKmh3X2Rlc2MgPSBzbG90LT5od19kZXNjX2luYm91bmQ7CisJaW50IGk7CisKKwlpZihzbG90LT5zcmNfY250ID4gQ09NQ0VSVE9fWE9SX01BWF9TUkMpeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBzbG90LT5hc3luY190eC5jaGFuLT5kZXZpY2UtPmRldiwKKwkJCQkJCSAgICJlcnJvcjogbWF4IHNvdXJjZSBhdmFpbGFibGUgaXMgJWQuXG4iLENPTUNFUlRPX1hPUl9NQVhfU1JDKTsKKwkJcmV0dXJuOworCX0KKworCWZvcihpPTA7IGk8c2xvdC0+c3JjX2NudDsgaSsrKSB7CisJCWh3X2Rlc2MtPmJ1ZmZfaW5mb1tpKjJdID0gc3JjW2ldOworCQlpZihpID09IHNsb3QtPnNyY19jbnQgLSAxKQorCQkJaHdfZGVzYy0+YnVmZl9pbmZvW2kqMiArIDFdID0gc2xvdC0+bGVuIHwgQkxBU1Q7CisJCWVsc2UKKwkJCWh3X2Rlc2MtPmJ1ZmZfaW5mb1tpKjIgKyAxXSA9IHNsb3QtPmxlbjsKKwl9Cit9CisKKy8qIC0tLS0tLS0gU2V0IG91dGJvdW5kIGZyYW1lIGRlc2NyaXB0b3IgLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBjb21jZXJ0b19zZXRfbmV4dF9kZXNjX291dGJvdW5kKHN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90ICpzbG90LCB1MzIgbmV4dF9kZXNjX2FkZHIpCit7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9vdXRib3VuZF9kZXNjICpod19kZXNjID0gc2xvdC0+aHdfZGVzY19vdXRib3VuZDsKKwlod19kZXNjLT5uZXh0X2Rlc2MgPSBuZXh0X2Rlc2NfYWRkcjsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9fc2V0X2Zjb250cm9sX291dGJvdW5kKHN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90ICpzbG90KQoreworCXN0cnVjdCBjb21jZXJ0b194b3Jfb3V0Ym91bmRfZGVzYyAqaHdfZGVzYyA9IHNsb3QtPmh3X2Rlc2Nfb3V0Ym91bmQ7CisKKwlzd2l0Y2ggKHNsb3QtPnR5cGUpIHsKKwljYXNlIERNQV9YT1I6CisJY2FzZSBETUFfWE9SX1ZBTDoKKwljYXNlIERNQV9NRU1DUFk6CisJCWh3X2Rlc2MtPmZjb250cm9sID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgc2xvdC0+YXN5bmNfdHguY2hhbi0+ZGV2aWNlLT5kZXYsCisJCQkJICAgImVycm9yOiB1bnN1cHBvcnRlZCBvcGVyYXRpb24gJWQuXG4iLHNsb3QtPnR5cGUpOworCQlyZXR1cm47CisJfQorfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b19zZXRfYnVmZl9pbmZvX291dGJvdW5kKHN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90ICpzbG90LCBkbWFfYWRkcl90IGRlc3QpCit7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9vdXRib3VuZF9kZXNjICpod19kZXNjID0gc2xvdC0+aHdfZGVzY19vdXRib3VuZDsKKworCWh3X2Rlc2MtPmJ1ZmZfaW5mb1swXSA9IGRlc3Q7CisJaHdfZGVzYy0+YnVmZl9pbmZvWzFdID0gc2xvdC0+bGVuIHwgQkxBU1Q7Cit9CisKKy8qIC0tLS0tLS0gUmVhZCBpbmJvdW5kIGZyYW1lIGRlc2NyaXB0b3IgLS0tLS0tLSAqLworCitzdGF0aWMgdTMyIGNvbWNlcnRvX2dldF9idWZmX2luZm9faW5ib3VuZChzdHJ1Y3QgY29tY2VydG9feG9yX2Rlc2Nfc2xvdCAqc2xvdCwgdTE2IGkpCit7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9pbmJvdW5kX2Rlc2MgKmh3X2Rlc2MgPSBzbG90LT5od19kZXNjX2luYm91bmQ7CisJcmV0dXJuIGh3X2Rlc2MtPmJ1ZmZfaW5mb1tpKjJdOworfQorCisvKiAtLS0tLS0tIFJlYWQgb3V0Ym91bmQgZnJhbWUgZGVzY3JpcHRvciAtLS0tLS0tICovCisKK3N0YXRpYyB1MzIgY29tY2VydG9fZ2V0X2ZzdGF0dXMwX291dGJvdW5kKHN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90ICpzbG90KQoreworCXN0cnVjdCBjb21jZXJ0b194b3Jfb3V0Ym91bmRfZGVzYyAqaHdfZGVzYyA9IHNsb3QtPmh3X2Rlc2Nfb3V0Ym91bmQ7CisJcmV0dXJuIGh3X2Rlc2MtPmZzdGF0dXMwOworfQorCitzdGF0aWMgdTMyIGNvbWNlcnRvX2dldF9idWZmX2luZm9fb3V0Ym91bmQoc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKnNsb3QsIHUxNiBpKQoreworCXN0cnVjdCBjb21jZXJ0b194b3Jfb3V0Ym91bmRfZGVzYyAqaHdfZGVzYyA9IHNsb3QtPmh3X2Rlc2Nfb3V0Ym91bmQ7CisJcmV0dXJuIGh3X2Rlc2MtPmJ1ZmZfaW5mb1tpKjJdOworfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b194b3JfaW5ib3VuZF9kZXNjX2luaXQoc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKnNsb3QsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1hX2FkZHJfdCAqc3JjKQoreworCXN0cnVjdCBjb21jZXJ0b194b3JfaW5ib3VuZF9kZXNjICpod19kZXNjID0gc2xvdC0+aHdfZGVzY19pbmJvdW5kOworCisJbWVtc2V0KGh3X2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgY29tY2VydG9feG9yX2luYm91bmRfZGVzYykpOworCWNvbWNlcnRvX3NldF9mY29udHJvbF9pbmJvdW5kKHNsb3QpOworCWNvbWNlcnRvX3NldF9mc3RhdHVzMF9pbmJvdW5kKHNsb3QpOworCWNvbWNlcnRvX3NldF9uZXh0X2Rlc2NfaW5ib3VuZChzbG90LCAwKTsKKwljb21jZXJ0b19zZXRfYnVmZl9pbmZvX2luYm91bmQoc2xvdCwgc3JjKTsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9feG9yX291dGJvdW5kX2Rlc2NfaW5pdChzdHJ1Y3QgY29tY2VydG9feG9yX2Rlc2Nfc2xvdCAqc2xvdCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1hX2FkZHJfdCBkZXN0KQoreworCXN0cnVjdCBjb21jZXJ0b194b3Jfb3V0Ym91bmRfZGVzYyAqaHdfZGVzYyA9IHNsb3QtPmh3X2Rlc2Nfb3V0Ym91bmQ7CisKKwltZW1zZXQoaHdfZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCBjb21jZXJ0b194b3Jfb3V0Ym91bmRfZGVzYykpOworCWNvbWNlcnRvX3NldF9mY29udHJvbF9vdXRib3VuZChzbG90KTsKKwljb21jZXJ0b19zZXRfbmV4dF9kZXNjX291dGJvdW5kKHNsb3QsIDApOworCisJaWYoZGVzdCkKKwkJY29tY2VydG9fc2V0X2J1ZmZfaW5mb19vdXRib3VuZChzbG90LCBkZXN0KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9ucyBvZiByZWdpc3RlciBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogLS0tLS0tLSBTZXQgaW5ib3VuZCByZWdpc3RlciAtLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3hvcl9zZXRfcmVnaXN0ZXJfbTJpb19jb250cm9sKHN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoLCB1MzIgdmFsdWUpCit7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBNMklPX0NPTlRST0woY29tY2VydG9feG9yX2NoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3hvcl9zZXRfcmVnaXN0ZXJfbTJpb19oZWFkKHN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoLCB1MzIgdmFsdWUpCit7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBNMklPX0hFQUQoY29tY2VydG9feG9yX2NoKSk7Cit9CisKKy8qIC0tLS0tLS0gU2V0IG91dGJvdW5kIHJlZ2lzdGVyIC0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgY29tY2VydG9feG9yX3NldF9yZWdpc3Rlcl9pbzJtX2hlYWQoc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2gsIHUzMiB2YWx1ZSkKK3sKKwlfX3Jhd193cml0ZWwodmFsdWUsIElPMk1fSEVBRChjb21jZXJ0b194b3JfY2gpKTsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9feG9yX3NldF9yZWdpc3Rlcl9pbzJtX2lycV9lbmFibGUoc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2gsIHUzMiB2YWx1ZSkKK3sKKwlfX3Jhd193cml0ZWwodmFsdWUsIElPMk1fSVJRX0VOQUJMRShjb21jZXJ0b194b3JfY2gpKTsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9feG9yX3NldF9yZWdpc3Rlcl9pbzJtX2lycV9zdGF0dXMoc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2gsIHUzMiB2YWx1ZSkKK3sKKwlfX3Jhd193cml0ZWwodmFsdWUsIElPMk1fSVJRX1NUQVRVUyhjb21jZXJ0b194b3JfY2gpKTsKK30KKworLyogLS0tLS0tLSBSZWFkIGluYm91bmQgcmVnaXN0ZXIgLS0tLS0tLSAqLworCitzdGF0aWMgdTMyIGNvbWNlcnRvX3hvcl9nZXRfcmVnaXN0ZXJfbTJpb19jb250cm9sKHN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoKQoreworCXJldHVybiBfX3Jhd19yZWFkbChNMklPX0NPTlRST0woY29tY2VydG9feG9yX2NoKSk7Cit9CisKKy8qIC0tLS0tLS0gUmVhZCBvdXRib3VuZCByZWdpc3RlciAtLS0tLS0tICovCisKK3N0YXRpYyB1MzIgY29tY2VydG9feG9yX2dldF9yZWdpc3Rlcl9pbzJtX2NvbnRyb2woc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2gpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKElPMk1fQ09OVFJPTChjb21jZXJ0b194b3JfY2gpKTsKK30KKworc3RhdGljIHUzMiBjb21jZXJ0b194b3JfZ2V0X3JlZ2lzdGVyX2lvMm1faGVhZChzdHJ1Y3QgY29tY2VydG9feG9yX2NoYW4gKmNvbWNlcnRvX3hvcl9jaCkKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoSU8yTV9IRUFEKGNvbWNlcnRvX3hvcl9jaCkpOworfQorCitzdGF0aWMgdTMyIGNvbWNlcnRvX3hvcl9nZXRfcmVnaXN0ZXJfaW8ybV9pcnFfc3RhdHVzKHN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoKQoreworCXJldHVybiBfX3Jhd19yZWFkbChJTzJNX0lSUV9TVEFUVVMoY29tY2VydG9feG9yX2NoKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX2R1bXBfeG9yX3JlZ3Moc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2gpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IF9fcmF3X3JlYWRsKE0ySU9fQ09OVFJPTChjb21jZXJ0b194b3JfY2gpKTsKKwlkZXZfcHJpbnRrKEtFUk5fRVJSLCBjb21jZXJ0b194b3JfY2gtPmRldmljZS0+ZGV2aWNlLmRldiwKKwkJCSAgICJNMklPX0NPTlRST0wgICAgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKE0ySU9fSEVBRChjb21jZXJ0b194b3JfY2gpKTsKKwlkZXZfcHJpbnRrKEtFUk5fRVJSLCBjb21jZXJ0b194b3JfY2gtPmRldmljZS0+ZGV2aWNlLmRldiwKKwkJCSAgICJNMklPX0hFQUQgICAgICAgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKE0ySU9fQlVSU1QoY29tY2VydG9feG9yX2NoKSk7CisJZGV2X3ByaW50ayhLRVJOX0VSUiwgY29tY2VydG9feG9yX2NoLT5kZXZpY2UtPmRldmljZS5kZXYsCisJCQkgICAiTTJJT19CVVJTVCAgICAgICAgICAgMHglOHguXG4iLHZhbCk7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChNMklPX0ZMRU4oY29tY2VydG9feG9yX2NoKSk7CisJZGV2X3ByaW50ayhLRVJOX0VSUiwgY29tY2VydG9feG9yX2NoLT5kZXZpY2UtPmRldmljZS5kZXYsCisJCQkgICAiTTJJT19GTEVOICAgICAgICAgICAgMHglOHguXG4iLHZhbCk7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChNMklPX0lSUV9FTkFCTEUoY29tY2VydG9feG9yX2NoKSk7CisJZGV2X3ByaW50ayhLRVJOX0VSUiwgY29tY2VydG9feG9yX2NoLT5kZXZpY2UtPmRldmljZS5kZXYsCisJCQkgICAiTTJJT19JUlFfRU5BQkxFICAgICAgMHglOHguXG4iLHZhbCk7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChNMklPX0lSUV9TVEFUVVMoY29tY2VydG9feG9yX2NoKSk7CisJZGV2X3ByaW50ayhLRVJOX0VSUiwgY29tY2VydG9feG9yX2NoLT5kZXZpY2UtPmRldmljZS5kZXYsCisJCQkgICAiTTJJT19JUlFfU1RBVFVTICAgICAgMHglOHguXG4iLHZhbCk7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChNMklPX1JFU0VUKGNvbWNlcnRvX3hvcl9jaCkpOworCWRldl9wcmludGsoS0VSTl9FUlIsIGNvbWNlcnRvX3hvcl9jaC0+ZGV2aWNlLT5kZXZpY2UuZGV2LAorCQkJICAgIk0ySU9fUkVTRVQgICAgICAgICAgIDB4JTh4LlxuIix2YWwpOworCisJdmFsID0gX19yYXdfcmVhZGwoSU8yTV9DT05UUk9MKGNvbWNlcnRvX3hvcl9jaCkpOworCWRldl9wcmludGsoS0VSTl9FUlIsIGNvbWNlcnRvX3hvcl9jaC0+ZGV2aWNlLT5kZXZpY2UuZGV2LAorCQkJICAgIklPMk1fQ09OVFJPTCAgICAgICAgIDB4JTh4LlxuIix2YWwpOworCisJdmFsID0gX19yYXdfcmVhZGwoSU8yTV9IRUFEKGNvbWNlcnRvX3hvcl9jaCkpOworCWRldl9wcmludGsoS0VSTl9FUlIsIGNvbWNlcnRvX3hvcl9jaC0+ZGV2aWNlLT5kZXZpY2UuZGV2LAorCQkJICAgIklPMk1fSEVBRCAgICAgICAgICAgIDB4JTh4LlxuIix2YWwpOworCisJdmFsID0gX19yYXdfcmVhZGwoSU8yTV9CVVJTVChjb21jZXJ0b194b3JfY2gpKTsKKwlkZXZfcHJpbnRrKEtFUk5fRVJSLCBjb21jZXJ0b194b3JfY2gtPmRldmljZS0+ZGV2aWNlLmRldiwKKwkJCSAgICJJTzJNX0JVUlNUICAgICAgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKElPMk1fRkxFTihjb21jZXJ0b194b3JfY2gpKTsKKwlkZXZfcHJpbnRrKEtFUk5fRVJSLCBjb21jZXJ0b194b3JfY2gtPmRldmljZS0+ZGV2aWNlLmRldiwKKwkJCSAgICJJTzJNX0ZMRU4gICAgICAgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKElPMk1fSVJRX0VOQUJMRShjb21jZXJ0b194b3JfY2gpKTsKKwlkZXZfcHJpbnRrKEtFUk5fRVJSLCBjb21jZXJ0b194b3JfY2gtPmRldmljZS0+ZGV2aWNlLmRldiwKKwkJCSAgICJJTzJNX0lSUV9FTkFCTEUgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKElPMk1fSVJRX1NUQVRVUyhjb21jZXJ0b194b3JfY2gpKTsKKwlkZXZfcHJpbnRrKEtFUk5fRVJSLCBjb21jZXJ0b194b3JfY2gtPmRldmljZS0+ZGV2aWNlLmRldiwKKwkJCSAgICJJTzJNX0lSUV9TVEFUVVMgICAgICAweCU4eC5cbiIsdmFsKTsKKworCXZhbCA9IF9fcmF3X3JlYWRsKElPMk1fUkVTRVQoY29tY2VydG9feG9yX2NoKSk7CisJZGV2X3ByaW50ayhLRVJOX0VSUiwgY29tY2VydG9feG9yX2NoLT5kZXZpY2UtPmRldmljZS5kZXYsCisJCQkgICAiSU8yTV9SRVNFVCAgICAgICAgICAgMHglOHguXG4iLHZhbCk7CisKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9feG9yX3JlZ2lzdGVyX2luaXQoc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2gpCit7CisJdTMyIHZhbHVlOworCisJLyogTTJJT19DT05UUk9MOiBFbmFibGUgRE9OT1NUQSAqLworCXZhbHVlID0gTTJJT19ET05PU1RBOworCWNvbWNlcnRvX3hvcl9zZXRfcmVnaXN0ZXJfbTJpb19jb250cm9sKGNvbWNlcnRvX3hvcl9jaCx2YWx1ZSk7CisKKwkvKiBJTzJNX0lSUV9FTkFCTEU6IEVuYWJsZSBJUlFGUkRZTiwgSVJRRkxTVCBhbmQgSVJRRkxTSCovCisJdmFsdWUgPSBJTzJNX0lSUUZSRFlOIHwgSU8yTV9JUlFGTFNUIHwgSU8yTV9JUlFGTFNIOworCWNvbWNlcnRvX3hvcl9zZXRfcmVnaXN0ZXJfaW8ybV9pcnFfZW5hYmxlKGNvbWNlcnRvX3hvcl9jaCx2YWx1ZSk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGRtYV9jb29raWVfdCBjb21jZXJ0b194b3JfcnVuX3R4X2NvbXBsZXRlX2FjdGlvbnMoc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKnNsb3QsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tY2VydG9feG9yX2NoYW4gKmNvbWNlcnRvX3hvcl9jaCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtYV9jb29raWVfdCBjb29raWUpCit7CisJdTE2IHNyY19jbnQ7CisKKwlpZihzbG90LT5hc3luY190eC5jb29raWUgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgY29va2llLiIpOworCisJaWYoc2xvdC0+YXN5bmNfdHguY29va2llID4wICkgeworCQljb29raWUgPSBzbG90LT5hc3luY190eC5jb29raWU7CisJCXNyY19jbnQgPSBzbG90LT5zcmNfY250OworCisJCWlmKHNsb3QtPmFzeW5jX3R4LmNhbGxiYWNrKQorCQkJc2xvdC0+YXN5bmNfdHguY2FsbGJhY2soc2xvdC0+YXN5bmNfdHguY2FsbGJhY2tfcGFyYW0pOworCisJCWlmKHNsb3QtPmxlbikgeworCQkJc3RydWN0IGRldmljZSAqZGV2ID0gY29tY2VydG9feG9yX2NoLT5kZXZpY2UtPmRldmljZS5kZXY7CisJCQllbnVtIGRtYV9jdHJsX2ZsYWdzIGZsYWdzID0gc2xvdC0+YXN5bmNfdHguZmxhZ3M7CisJCQlkbWFfYWRkcl90IHNyYywgZGVzdDsKKworCQkJZGVzdCA9IGNvbWNlcnRvX2dldF9idWZmX2luZm9fb3V0Ym91bmQoc2xvdCwwKTsKKwkJCWlmKCEoZmxhZ3MgJiBETUFfQ09NUExfU0tJUF9ERVNUX1VOTUFQKSkgeworCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcjsKKworCQkJCWlmKHNyY19jbnQgPiAxKQorCQkJCQlkaXIgPSBETUFfQklESVJFQ1RJT05BTDsKKwkJCQllbHNlCisJCQkJCWRpciA9IERNQV9GUk9NX0RFVklDRTsKKworCQkJCWRtYV91bm1hcF9wYWdlKGRldiwgZGVzdCwgc2xvdC0+bGVuLCBkaXIpOworCQkJfQorCisJCQlpZighKGZsYWdzICYgRE1BX0NPTVBMX1NLSVBfU1JDX1VOTUFQKSkgeworCQkJCXdoaWxlKHNyY19jbnQtLSl7CisJCQkJCXNyYyA9IGNvbWNlcnRvX2dldF9idWZmX2luZm9faW5ib3VuZChzbG90LCBzcmNfY250KTsKKwkJCQkJaWYoc3JjID09IGRlc3QpCisJCQkJCQljb250aW51ZTsKKwkJCQkJZG1hX3VubWFwX3BhZ2UoZGV2LCBzcmMsIHNsb3QtPmxlbiwgRE1BX1RPX0RFVklDRSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWRtYV9ydW5fZGVwZW5kZW5jaWVzKCZzbG90LT5hc3luY190eCk7CisJcmV0dXJuIGNvb2tpZTsKK30KKworc3RhdGljIGludCBjb21jZXJ0b194b3JfY2xlYW5fY29tcGxldGVkX3Nsb3RzKHN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoKQoreworCXN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90ICppdGVyLCAqX19pdGVyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGl0ZXIsIF9faXRlciwgJmNvbWNlcnRvX3hvcl9jaC0+Y29tcGxldGVkX3Nsb3RzLCBjb21wbGV0ZWRfbm9kZSkgeworCQlpZihhc3luY190eF90ZXN0X2FjaygmaXRlci0+YXN5bmNfdHgpKSB7CisJCQlsaXN0X2RlbCgmaXRlci0+Y29tcGxldGVkX25vZGUpOworCQkJaXRlci0+YnVzeSA9IDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fY29tY2VydG9feG9yX3Nsb3RfY2xlYW51cChzdHJ1Y3QgY29tY2VydG9feG9yX2NoYW4gKmNvbWNlcnRvX3hvcl9jaCkKK3sKKwlzdHJ1Y3QgY29tY2VydG9feG9yX2Rlc2Nfc2xvdCAqaXRlciwgKl9faXRlcjsKKwlkbWFfY29va2llX3QgY29va2llID0gMDsKKwl1MzIgY3VycmVudF9kZXNjID0gY29tY2VydG9feG9yX2dldF9yZWdpc3Rlcl9pbzJtX2hlYWQoY29tY2VydG9feG9yX2NoKTsKKwlpbnQgc2Vlbl9jdXJyZW50ID0gMDsKKworCWNvbWNlcnRvX3hvcl9jbGVhbl9jb21wbGV0ZWRfc2xvdHMoY29tY2VydG9feG9yX2NoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVyLF9faXRlciwmY29tY2VydG9feG9yX2NoLT5jaGFpbixjaGFpbl9ub2RlKSB7CisJCXByZWZldGNoKF9faXRlcik7CisJCXByZWZldGNoKCZfX2l0ZXItPmFzeW5jX3R4KTsKKworCQlpZihzZWVuX2N1cnJlbnQpCisJCQlicmVhazsKKworCQlpZihpdGVyLT5od19kZXNjX291dGJvdW5kX2RtYSA9PSBjdXJyZW50X2Rlc2MpIHsKKwkJCXNlZW5fY3VycmVudCA9IDE7CisKKwkJCS8qIFdoZW4gd2UgYXJyaXZlZCBoZXJlLCB0aGUgaGFyZHdhcmUgbWF5IGluIHR3bworCQkJICogcG9zc2libGUgc2l0dWF0aW9uczoKKwkJCSAqCisJCQkgKiAgICAxLiBOb3Qgd29ya2luZywgc3RvcHBlZAorCQkJICogICAgMi4gV29ya2luZyBvbiBjdXJyZW50X2Rlc2MKKwkJCSAqCisJCQkgKiBGb3IgY2FzZSAxLCBmb2xsb3dpbmcgaWYgc3RhdGVtZW50IHdpbGwgYmUgZmFsc2UgYW5kIHdlJ2xsCisJCQkgKiBjb250aW51ZSB0byBjbGVhbiB0aGlzIHNsb3QuCisJCQkgKiBGb3IgY2FzZSAyLCB3ZSBqdXN0IGJyZWFrIGFuZCBsZWF2ZSB0aGUgbGFzdCBzbG90CisJCQkgKiB0byBiZSBjbGVhbmVkIGF0IG5leHQgZXhlY3V0aW9uLgorCQkJICovCisKKwkJCWlmKCEoY29tY2VydG9feG9yX2dldF9yZWdpc3Rlcl9tMmlvX2NvbnRyb2woY29tY2VydG9feG9yX2NoKSYoMHgxKSkgJiYKKwkJCQkJIShjb21jZXJ0b194b3JfZ2V0X3JlZ2lzdGVyX2lvMm1fY29udHJvbChjb21jZXJ0b194b3JfY2gpJigweDEpKSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmKGl0ZXItPnhvcl9jaGVja19yZXN1bHQgJiYgaXRlci0+YXN5bmNfdHguY29va2llKQorCQkJKml0ZXItPnhvcl9jaGVja19yZXN1bHQgPSBjb21jZXJ0b19nZXRfZnN0YXR1czBfb3V0Ym91bmQoaXRlcikmKDB4MSk7CisKKwkJY29va2llID0gY29tY2VydG9feG9yX3J1bl90eF9jb21wbGV0ZV9hY3Rpb25zKGl0ZXIsY29tY2VydG9feG9yX2NoLGNvb2tpZSk7CisJCWxpc3RfZGVsKCZpdGVyLT5jaGFpbl9ub2RlKTsKKwkJaWYoIWFzeW5jX3R4X3Rlc3RfYWNrKCZpdGVyLT5hc3luY190eCkpCisJCQlsaXN0X2FkZF90YWlsKCZpdGVyLT5jb21wbGV0ZWRfbm9kZSwgJmNvbWNlcnRvX3hvcl9jaC0+Y29tcGxldGVkX3Nsb3RzKTsKKwkJZWxzZQorCQkJaXRlci0+YnVzeSA9IDA7CisJfQorCisJaWYoY29va2llID4gMCkKKwkJY29tY2VydG9feG9yX2NoLT5jb21wbGV0ZWRfY29va2llID0gY29va2llOworfQorCisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3hvcl9zbG90X2NsZWFudXAoc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2gpCit7CisJc3Bpbl9sb2NrX2JoKCZjb21jZXJ0b194b3JfY2gtPmxvY2spOworCV9fY29tY2VydG9feG9yX3Nsb3RfY2xlYW51cChjb21jZXJ0b194b3JfY2gpOworCXNwaW5fdW5sb2NrX2JoKCZjb21jZXJ0b194b3JfY2gtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b194b3JfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2ggPSAoc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICopIGRhdGE7CisJY29tY2VydG9feG9yX3Nsb3RfY2xlYW51cChjb21jZXJ0b194b3JfY2gpOworfQorCitzdGF0aWMgc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKgorY29tY2VydG9feG9yX2FsbG9jX3Nsb3Qoc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2gpCit7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKml0ZXIsICpfX2l0ZXIgPSBOVUxMOworCWludCBzbG90X2ZvdW5kLCByZXRyeSA9IDA7CisKK3JldHJ5OgorCXNsb3RfZm91bmQgPSAwOworCWlmKHJldHJ5ID09IDAgKQorCQlpdGVyID0gY29tY2VydG9feG9yX2NoLT5sYXN0X3VzZWQ7CisJZWxzZQorCQlpdGVyID0gbGlzdF9lbnRyeSgmY29tY2VydG9feG9yX2NoLT5hbGxfc2xvdHMsc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QsIHNsb3Rfbm9kZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUoCisJCWl0ZXIsIF9faXRlciwgJmNvbWNlcnRvX3hvcl9jaC0+YWxsX3Nsb3RzLCBzbG90X25vZGUpIHsKKwkJCXByZWZldGNoKF9faXRlcik7CisJCQlwcmVmZXRjaCgmX19pdGVyLT5hc3luY190eCk7CisJCQlpZihpdGVyLT5idXN5KSB7CisJCQkJaWYgKHJldHJ5KQorCQkJCQlicmVhazsKKwkJCQlzbG90X2ZvdW5kPTA7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWl0ZXItPmFzeW5jX3R4LmNvb2tpZSA9IC1FQlVTWTsKKwkJCWl0ZXItPnhvcl9jaGVja19yZXN1bHQgPSBOVUxMOworCQkJaXRlci0+YnVzeSA9IDE7CisJCQljb21jZXJ0b194b3JfY2gtPmxhc3RfdXNlZCA9IGl0ZXI7CisJCQlyZXR1cm4gaXRlcjsKKwl9CisKKwlpZighcmV0cnkrKykKKwkJZ290byByZXRyeTsKKworCXRhc2tsZXRfc2NoZWR1bGUoJmNvbWNlcnRvX3hvcl9jaC0+aXJxX3Rhc2tsZXQpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBkbWFfY29va2llX3QgY29tY2VydG9fZGVzY19hc3NpZ25fY29va2llKHN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKiBzbG90KQoreworCWRtYV9jb29raWVfdCBjb29raWUgPSBjb21jZXJ0b194b3JfY2gtPmNoYW4uY29va2llOworCisJaWYoKytjb29raWUgPCAwKQorCQljb29raWUgPSAxOworCWNvbWNlcnRvX3hvcl9jaC0+Y2hhbi5jb29raWUgPSBzbG90LT5hc3luY190eC5jb29raWUgPSBjb29raWU7CisJcmV0dXJuIGNvb2tpZTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gWE9SIEFQSSBGdW5jdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgZW51bSBkbWFfc3RhdHVzIGNvbWNlcnRvX3hvcl9zdGF0dXMoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtYV9jb29raWVfdCBjb29raWUsCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRtYV90eF9zdGF0ZSAqdHhzdGF0ZSkKK3sKKwlzdHJ1Y3QgY29tY2VydG9feG9yX2NoYW4gKmNvbWNlcnRvX3hvcl9jaCA9IHRvX2NvbWNlcnRvX3hvcl9jaGFuKGNoYW4pOworCWRtYV9jb29raWVfdCBsYXN0X3VzZWQ7CisJZG1hX2Nvb2tpZV90IGxhc3RfY29tcGxldGU7CisKKwlsYXN0X3VzZWQgPSBjaGFuLT5jb29raWU7CisJbGFzdF9jb21wbGV0ZSA9IGNvbWNlcnRvX3hvcl9jaC0+Y29tcGxldGVkX2Nvb2tpZTsKKwlkbWFfc2V0X3R4X3N0YXRlKHR4c3RhdGUsIGxhc3RfY29tcGxldGUsIGxhc3RfdXNlZCwgMCk7CisKKwlyZXR1cm4gZG1hX2FzeW5jX2lzX2NvbXBsZXRlKGNvb2tpZSwgbGFzdF9jb21wbGV0ZSwgbGFzdF91c2VkKTsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9feG9yX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoID0gdG9fY29tY2VydG9feG9yX2NoYW4oY2hhbik7CisKKwlpZihjb21jZXJ0b194b3JfY2gtPnBlbmRpbmcgPj0gQ09NQ0VSVE9fWE9SX1RIUkVTSE9MRCAmJiBjb21jZXJ0b194b3JfY2gtPnRvX2JlX3N0YXJ0ZWQpIHsKKwkJY29tY2VydG9feG9yX2NoLT5wZW5kaW5nID0gMDsKKwkJY29tY2VydG9feG9yX3NldF9yZWdpc3Rlcl9tMmlvX2hlYWQoY29tY2VydG9feG9yX2NoLCBjb21jZXJ0b194b3JfY2gtPnRvX2JlX3N0YXJ0ZWQtPmFzeW5jX3R4LnBoeXMpOworCQljb21jZXJ0b194b3Jfc2V0X3JlZ2lzdGVyX2lvMm1faGVhZChjb21jZXJ0b194b3JfY2gsIGNvbWNlcnRvX3hvcl9jaC0+dG9fYmVfc3RhcnRlZC0+aHdfZGVzY19vdXRib3VuZF9kbWEpOworCQljb21jZXJ0b194b3JfY2gtPnRvX2JlX3N0YXJ0ZWQgPSBOVUxMOworCX0KK30KKworc3RhdGljIGRtYV9jb29raWVfdCBjb21jZXJ0b194b3JfdHhfc3VibWl0KHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpCit7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKnNsb3QgPSB0b19jb21jZXJ0b194b3Jfc2xvdCh0eCk7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKm9sZF9jaGFpbl90YWlsOworCWRtYV9jb29raWVfdCBjb29raWU7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2g7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCWNoYW4gPSB0eC0+Y2hhbjsKKwljb21jZXJ0b194b3JfY2ggPSB0b19jb21jZXJ0b194b3JfY2hhbihjaGFuKTsKKworCXNwaW5fbG9ja19iaCgmY29tY2VydG9feG9yX2NoLT5sb2NrKTsKKwljb29raWUgPSBjb21jZXJ0b19kZXNjX2Fzc2lnbl9jb29raWUoY29tY2VydG9feG9yX2NoLCBzbG90KTsKKworCS8qIElmIGNoYWluIGxpc3QgaXMgZW1wdHksIHRoZSBoYXJkd2FyZSBpcyBhYnNvbHV0ZWx5IHN0b3BwZWQuCisJICogVGh1cywgd2UgbmVlZCBvbmx5IHJlc2V0IHRoZSBoZWFkIHJlZ2lzdGVyIGluIG9yZGVyIHRvIHN0YXJ0CisJICogdGhlIERNQQorCSAqLworCisJaWYobGlzdF9lbXB0eSgmY29tY2VydG9feG9yX2NoLT5jaGFpbikpeworCQlsaXN0X2FkZF90YWlsKCZzbG90LT5jaGFpbl9ub2RlLCAmY29tY2VydG9feG9yX2NoLT5jaGFpbik7CisJCWNvbWNlcnRvX3hvcl9jaC0+dG9fYmVfc3RhcnRlZCA9IHNsb3Q7CisJCWNvbWNlcnRvX3hvcl9jaC0+cGVuZGluZysrOworCQljb21jZXJ0b194b3JfaXNzdWVfcGVuZGluZygmY29tY2VydG9feG9yX2NoLT5jaGFuKTsKKwl9CisJZWxzZSB7CisKKwkvKiBJZiBjaGFpbiBsaXN0IGlzIG5vdCBlbXB0eSwgdGhlIGhhcmR3YXJlIG1heSBvciBtYXkgbm90IHN0b3BwZWQuCisJICogICAgIC0gSXQgbWF5IG5vdCBzdG9wcGVkIGJlY2F1c2UgdGhlIGNoYWluIGlzIG5vdCBlbXB0eS4gVGhhdCBpcyB0bworCSAqICAgICAgIHNheSwgdGhlIGhhcmR3YXJlIHN0aWxsIGhhdmUgcmVxdWVzdCB0byBwcm9jZXNzCisJICogICAgIC0gSXQgbWF5IHN0b3BwZWQgYmVjYXVzZSB0aGUgaGFyZHdhcmUgaGFzIGFscmVhZHkgZmluaXNoZWQgdGhlCisJICogICAgICAgcHJvY2Vzc2luZy4gQnV0IGp1c3QgaGF2ZW4ndCBjbGVhcmVkIHRoZSBjaGFpbi4gKFRoZSBjaGFpbiBjYW4KKwkgKiAgICAgICBiZSBvbmx5IGNsZWFyZWQgaW4gdGhlIHRhc2tsZXQuKQorCSAqIEZvciB3aGF0ZXZlciBjYXNlLCB3ZSBqdXN0OgorCSAqICAgICAtIHVwZGF0ZSB0aGUgRk5leHQgZmllbGQgb2YgbGFzdCBlbGVtZW50IGluIGNoYWluLgorCSAqICAgICAtIHNldCBoZWFkIHJlZ2lzdGVyIHRvIHJlc3RhcnQgdGhlIFhPUiBwcm9jZXNzaW5nIGlmIHRoZSBoYXJkd2FyZQorCSAqICAgICAgIGlzIG5vdCB3b3JraW5nCisJICovCisKKwkJb2xkX2NoYWluX3RhaWwgPSBsaXN0X2VudHJ5KGNvbWNlcnRvX3hvcl9jaC0+Y2hhaW4ucHJldiwKKwkJCQkgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90LAorCQkJCSAgICAgICAgICAgICAgICAgICAgY2hhaW5fbm9kZSk7CisKKwkJbGlzdF9hZGRfdGFpbCgmc2xvdC0+Y2hhaW5fbm9kZSwmY29tY2VydG9feG9yX2NoLT5jaGFpbik7CisKKwkJY29tY2VydG9fc2V0X25leHRfZGVzY19vdXRib3VuZChvbGRfY2hhaW5fdGFpbCxzbG90LT5od19kZXNjX291dGJvdW5kX2RtYSk7CisJCWNvbWNlcnRvX3NldF9uZXh0X2Rlc2NfaW5ib3VuZChvbGRfY2hhaW5fdGFpbCxzbG90LT5hc3luY190eC5waHlzKTsKKworCQlpZighKGNvbWNlcnRvX3hvcl9nZXRfcmVnaXN0ZXJfbTJpb19jb250cm9sKGNvbWNlcnRvX3hvcl9jaCkmKDB4MSkpICYmCisJCQkJIShjb21jZXJ0b194b3JfZ2V0X3JlZ2lzdGVyX2lvMm1fY29udHJvbChjb21jZXJ0b194b3JfY2gpJigweDEpKSl7CisKKwkJCWlmKCFjb21jZXJ0b194b3JfY2gtPnRvX2JlX3N0YXJ0ZWQpCisJCQkJY29tY2VydG9feG9yX2NoLT50b19iZV9zdGFydGVkID0gc2xvdDsKKwkJCWNvbWNlcnRvX3hvcl9jaC0+cGVuZGluZysrOworCQkJY29tY2VydG9feG9yX2lzc3VlX3BlbmRpbmcoJmNvbWNlcnRvX3hvcl9jaC0+Y2hhbik7CisJCX0KKwl9CisgICAgc3Bpbl91bmxvY2tfYmgoJmNvbWNlcnRvX3hvcl9jaC0+bG9jayk7CisgICAgcmV0dXJuIGNvb2tpZTsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9feG9yX2ZyZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoID0gdG9fY29tY2VydG9feG9yX2NoYW4oY2hhbik7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKml0ZXIsICpfX2l0ZXI7CisJaW50IGluX3VzZV9kZXNjcyA9IDA7CisKKwljb21jZXJ0b194b3Jfc2xvdF9jbGVhbnVwKGNvbWNlcnRvX3hvcl9jaCk7CisKKwlzcGluX2xvY2tfYmgoJmNvbWNlcnRvX3hvcl9jaC0+bG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXRlciwgX19pdGVyLCAmY29tY2VydG9feG9yX2NoLT5jaGFpbiwgY2hhaW5fbm9kZSkgeworCQlpbl91c2VfZGVzY3MrKzsKKwkJbGlzdF9kZWwoJml0ZXItPmNoYWluX25vZGUpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVyLCBfX2l0ZXIsICZjb21jZXJ0b194b3JfY2gtPmNvbXBsZXRlZF9zbG90cywgY29tcGxldGVkX25vZGUpIHsKKwkJaW5fdXNlX2Rlc2NzKys7CisJCWxpc3RfZGVsKCZpdGVyLT5jb21wbGV0ZWRfbm9kZSk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoaXRlciwgX19pdGVyLCAmY29tY2VydG9feG9yX2NoLT5hbGxfc2xvdHMsIHNsb3Rfbm9kZSkgeworCQlsaXN0X2RlbCgmaXRlci0+c2xvdF9ub2RlKTsKKwkJa2ZyZWUoaXRlcik7CisJCWNvbWNlcnRvX3hvcl9jaC0+c2xvdF9hbGxvY2F0ZWQtLTsKKwl9CisKKwljb21jZXJ0b194b3JfY2gtPmxhc3RfdXNlZCA9IE5VTEw7CisKKwlzcGluX3VubG9ja19iaCgmY29tY2VydG9feG9yX2NoLT5sb2NrKTsKKworCWlmKGluX3VzZV9kZXNjcykKKwkJZGV2X2Vycihjb21jZXJ0b194b3JfY2gtPmRldmljZS0+ZGV2aWNlLmRldiwKKwkJCQkiZnJlZWluZyAlZCBpbiB1c2UgZGVzY3JpcHRvcnMhXG4iLCBpbl91c2VfZGVzY3MpOworfQorCitzdGF0aWMgaW50IGNvbWNlcnRvX3hvcl9hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICpjb21jZXJ0b194b3JfY2ggPSB0b19jb21jZXJ0b194b3JfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgY29tY2VydG9feG9yX2Rlc2Nfc2xvdCAqc2xvdCA9IE5VTEw7CisJaW50IG51bV9zbG90c19wZXJfcG9vbCA9IFBBR0VfU0laRSAvIChDT01DRVJUT19YT1JfSU5CT1VORF9ERVNDX1NJWkUgKyBDT01DRVJUT19YT1JfT1VUQk9VTkRfREVTQ19TSVpFKTsKKwlpbnQgdG90YWxfc2xvdHMgPSBQT09MX05VTUJFUiAqIG51bV9zbG90c19wZXJfcG9vbDsKKwlpbnQgZ2FwID0gUEFHRV9TSVpFIC0gbnVtX3Nsb3RzX3Blcl9wb29sICogKENPTUNFUlRPX1hPUl9JTkJPVU5EX0RFU0NfU0laRSArIENPTUNFUlRPX1hPUl9PVVRCT1VORF9ERVNDX1NJWkUpOworCWludCBpLGo7CisJY2hhciAqZG1hX2Rlc2NfcG9vbF92aXJ0X2FkZHI7CisJY2hhciAqZG1hX2Rlc2NfcG9vbF9hZGRyOworCisJaSA9IGogPSBjb21jZXJ0b194b3JfY2gtPnNsb3RfYWxsb2NhdGVkOworCWogJT0gbnVtX3Nsb3RzX3Blcl9wb29sOworCisJd2hpbGUoIGkgPCB0b3RhbF9zbG90cykgeworCisJCXNsb3QgPSBremFsbG9jKHNpemVvZigqc2xvdCksIEdGUF9LRVJORUwpOworCQlpZighc2xvdCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY29tY2VydG8gWE9SIENoYW5uZWwgb25seSBpbml0aWFsaXplZCAlZCBzbG90IGRlc2NyaXB0b3JzLlxuIiwgaSk7CisJCQlicmVhazsKKwkJfQorCisJCWRtYV9kZXNjX3Bvb2xfdmlydF9hZGRyID0gKGNoYXIgKikgY29tY2VydG9feG9yX2NoLT5kZXZpY2UtPmRtYV9kZXNjX3Bvb2xfdmlydFtpL251bV9zbG90c19wZXJfcG9vbF07CisJCXNsb3QtPmh3X2Rlc2NfaW5ib3VuZCA9ICh2b2lkICopICZkbWFfZGVzY19wb29sX3ZpcnRfYWRkcltqKkNPTUNFUlRPX1hPUl9JTkJPVU5EX0RFU0NfU0laRV07CisJCXNsb3QtPmh3X2Rlc2Nfb3V0Ym91bmQgPSAodm9pZCAqKSAmZG1hX2Rlc2NfcG9vbF92aXJ0X2FkZHJbbnVtX3Nsb3RzX3Blcl9wb29sKkNPTUNFUlRPX1hPUl9JTkJPVU5EX0RFU0NfU0laRSArIGdhcCArIGoqQ09NQ0VSVE9fWE9SX09VVEJPVU5EX0RFU0NfU0laRV07CisKKwkJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3JfaW5pdCgmc2xvdC0+YXN5bmNfdHgsIGNoYW4pOworCQlzbG90LT5hc3luY190eC50eF9zdWJtaXQgPSBjb21jZXJ0b194b3JfdHhfc3VibWl0OworCisJCUlOSVRfTElTVF9IRUFEKCZzbG90LT5zbG90X25vZGUpOworCQlJTklUX0xJU1RfSEVBRCgmc2xvdC0+Y2hhaW5fbm9kZSk7CisJCUlOSVRfTElTVF9IRUFEKCZzbG90LT5jb21wbGV0ZWRfbm9kZSk7CisKKwkJZG1hX2Rlc2NfcG9vbF9hZGRyID0gKGNoYXIgKikgY29tY2VydG9feG9yX2NoLT5kZXZpY2UtPmRtYV9kZXNjX3Bvb2xbaS9udW1fc2xvdHNfcGVyX3Bvb2xdOworCQlzbG90LT5hc3luY190eC5waHlzID0gKGRtYV9hZGRyX3QpICZkbWFfZGVzY19wb29sX2FkZHJbaipDT01DRVJUT19YT1JfSU5CT1VORF9ERVNDX1NJWkVdOworCQlzbG90LT5od19kZXNjX291dGJvdW5kX2RtYSA9IChkbWFfYWRkcl90KSAmZG1hX2Rlc2NfcG9vbF9hZGRyW251bV9zbG90c19wZXJfcG9vbCpDT01DRVJUT19YT1JfSU5CT1VORF9ERVNDX1NJWkUgKyBnYXAgKyBqKkNPTUNFUlRPX1hPUl9PVVRCT1VORF9ERVNDX1NJWkVdOworCQlzbG90LT5idXN5PTA7CisKKwkJaSsrOworCQlpZigrK2ogPT0gbnVtX3Nsb3RzX3Blcl9wb29sKQorCQkJaj0wOworCisJCXNwaW5fbG9ja19iaCgmY29tY2VydG9feG9yX2NoLT5sb2NrKTsKKwkJY29tY2VydG9feG9yX2NoLT5zbG90X2FsbG9jYXRlZCA9IGk7CisJCWxpc3RfYWRkX3RhaWwoJnNsb3QtPnNsb3Rfbm9kZSwgJmNvbWNlcnRvX3hvcl9jaC0+YWxsX3Nsb3RzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNvbWNlcnRvX3hvcl9jaC0+bG9jayk7CisKKwl9CisKKwlpZihjb21jZXJ0b194b3JfY2gtPnNsb3RfYWxsb2NhdGVkICYmICFjb21jZXJ0b194b3JfY2gtPmxhc3RfdXNlZCkKKwkJY29tY2VydG9feG9yX2NoLT5sYXN0X3VzZWQgPSBsaXN0X2VudHJ5KGNvbWNlcnRvX3hvcl9jaC0+YWxsX3Nsb3RzLm5leHQsIHN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90LCBzbG90X25vZGUpOworCisJcmV0dXJuIGNvbWNlcnRvX3hvcl9jaC0+c2xvdF9hbGxvY2F0ZWQgPyBjb21jZXJ0b194b3JfY2gtPnNsb3RfYWxsb2NhdGVkIDogLUVOT01FTTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitjb21jZXJ0b194b3JfcHJlcF9kbWFfbWVtY3B5KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkZXN0LCBkbWFfYWRkcl90IHNyYywKKwkJCQlzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoID0gdG9fY29tY2VydG9feG9yX2NoYW4oY2hhbik7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKnNsb3Q7CisKKwlzcGluX2xvY2tfYmgoJmNvbWNlcnRvX3hvcl9jaC0+bG9jayk7CisJc2xvdCA9IGNvbWNlcnRvX3hvcl9hbGxvY19zbG90KGNvbWNlcnRvX3hvcl9jaCk7CisJaWYoc2xvdCkgeworCQlzbG90LT50eXBlID0gRE1BX01FTUNQWTsKKwkJc2xvdC0+bGVuID0gbGVuOworCQlzbG90LT5zcmNfY250ID0gMTsKKwkJc2xvdC0+YXN5bmNfdHguZmxhZ3MgPSBmbGFnczsKKwkJY29tY2VydG9feG9yX2luYm91bmRfZGVzY19pbml0KHNsb3QsJnNyYyk7CisKKwkJY29tY2VydG9feG9yX291dGJvdW5kX2Rlc2NfaW5pdChzbG90LGRlc3QpOworCX0KKwlzcGluX3VubG9ja19iaCgmY29tY2VydG9feG9yX2NoLT5sb2NrKTsKKworCXJldHVybiBzbG90ID8gJnNsb3QtPmFzeW5jX3R4IDogTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitjb21jZXJ0b194b3JfcHJlcF9kbWFfeG9yKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkZXN0LCBkbWFfYWRkcl90ICpzcmMsCisJCSAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNfY250LCBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoID0gdG9fY29tY2VydG9feG9yX2NoYW4oY2hhbik7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKnNsb3Q7CisKKwlpZih1bmxpa2VseShsZW4hPTI1NiYmbGVuIT01MTImJmxlbiE9MTAyNCYmbGVuIT0yMDQ4JiZsZW4hPTQwOTYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTGVuZ3RoICVkIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFhPUi5cbiIsIGxlbik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwaW5fbG9ja19iaCgmY29tY2VydG9feG9yX2NoLT5sb2NrKTsKKwlzbG90ID0gY29tY2VydG9feG9yX2FsbG9jX3Nsb3QoY29tY2VydG9feG9yX2NoKTsKKwlpZihzbG90KSB7CisJCXNsb3QtPnR5cGUgPSBETUFfWE9SOworCQlzbG90LT5sZW4gPSBsZW47CisJCXNsb3QtPnNyY19jbnQgPSBzcmNfY250OworCQlzbG90LT5hc3luY190eC5mbGFncyA9IGZsYWdzOworCQljb21jZXJ0b194b3JfaW5ib3VuZF9kZXNjX2luaXQoc2xvdCxzcmMpOworCisJCWNvbWNlcnRvX3hvcl9vdXRib3VuZF9kZXNjX2luaXQoc2xvdCxkZXN0KTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmNvbWNlcnRvX3hvcl9jaC0+bG9jayk7CisKKwlyZXR1cm4gc2xvdCA/ICZzbG90LT5hc3luY190eCA6IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorY29tY2VydG9feG9yX3ByZXBfZG1hX3hvcl92YWwoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHUzMiAqcmVzdWx0LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9feG9yX2NoID0gdG9fY29tY2VydG9feG9yX2NoYW4oY2hhbik7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgKnNsb3Q7CisKKwlpZih1bmxpa2VseShsZW4hPTI1NiYmbGVuIT01MTImJmxlbiE9MTAyNCYmbGVuIT0yMDQ4JiZsZW4hPTQwOTYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTGVuZ3RoICVkIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFhPUi5cbiIsIGxlbik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwaW5fbG9ja19iaCgmY29tY2VydG9feG9yX2NoLT5sb2NrKTsKKwlzbG90ID0gY29tY2VydG9feG9yX2FsbG9jX3Nsb3QoY29tY2VydG9feG9yX2NoKTsKKworCWlmKHNsb3QpIHsKKwkJc2xvdC0+dHlwZSA9IERNQV9YT1JfVkFMOworCQlzbG90LT5sZW4gPSBsZW47CisJCXNsb3QtPnNyY19jbnQgPSBzcmNfY250OworCQlzbG90LT5hc3luY190eC5mbGFncyA9IGZsYWdzOworCQlzbG90LT54b3JfY2hlY2tfcmVzdWx0ID0gcmVzdWx0OworCQljb21jZXJ0b194b3JfaW5ib3VuZF9kZXNjX2luaXQoc2xvdCxzcmMpOworCisJCWNvbWNlcnRvX3hvcl9vdXRib3VuZF9kZXNjX2luaXQoc2xvdCwwKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmNvbWNlcnRvX3hvcl9jaC0+bG9jayk7CisKKwlyZXR1cm4gc2xvdCA/ICZzbG90LT5hc3luY190eCA6IE5VTEw7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjb21jZXJ0b194b3JfaW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY29tY2VydG9feG9yX2NoYW4gKmNvbWNlcnRvX3hvcl9jaCA9IGRhdGE7CisJaW50IGRvX3Rhc2tzZXQ9MDsKKwl1MzIgaW50cl9jYXVzZSA9IGNvbWNlcnRvX3hvcl9nZXRfcmVnaXN0ZXJfaW8ybV9pcnFfc3RhdHVzKGNvbWNlcnRvX3hvcl9jaCk7CisKKwlpZihpbnRyX2NhdXNlICYgSVJRX0lSUUZSRFlOKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICJJUlFGUkRZTjogQSBmcmFtZSBpcyBzdGFydGVkIGJ1dCB0aGUgZnJhbWUgaXMgbm90IHJlYWR5Iik7CisJCWNvbWNlcnRvX2R1bXBfeG9yX3JlZ3MoY29tY2VydG9feG9yX2NoKTsKKwkJY29tY2VydG9feG9yX3NldF9yZWdpc3Rlcl9pbzJtX2lycV9zdGF0dXMoY29tY2VydG9feG9yX2NoLDE8PDApOworCQlkb190YXNrc2V0PTE7CisJfQorCisJaWYoaW50cl9jYXVzZSAmIElSUV9JUlFGTFNUKSB7CisJICAgIGNvbWNlcnRvX3hvcl9zZXRfcmVnaXN0ZXJfaW8ybV9pcnFfc3RhdHVzKGNvbWNlcnRvX3hvcl9jaCwxPDwxKTsKKwkJZG9fdGFza3NldD0xOworCX0KKworCWlmKGludHJfY2F1c2UgJiBJUlFfSVJRRkRPTikKKwkJY29tY2VydG9feG9yX3NldF9yZWdpc3Rlcl9pbzJtX2lycV9zdGF0dXMoY29tY2VydG9feG9yX2NoLDE8PDIpOworCisJaWYoaW50cl9jYXVzZSAmIElSUV9JUlFGTFNIKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICJJUlFGTFNIOiBJTyBoYXMgbW9yZSBkYXRhIHRoYW4gdGhlIG1lbW9yeSBidWZmZXIiKTsKKwkJY29tY2VydG9fZHVtcF94b3JfcmVncyhjb21jZXJ0b194b3JfY2gpOworCQljb21jZXJ0b194b3Jfc2V0X3JlZ2lzdGVyX2lvMm1faXJxX3N0YXR1cyhjb21jZXJ0b194b3JfY2gsMTw8Myk7CisJCWRvX3Rhc2tzZXQ9MTsKKwl9CisKKwlpZihpbnRyX2NhdXNlICYgSVJRX0lSUUZMRU4pIHsKKwkJY29tY2VydG9feG9yX3NldF9yZWdpc3Rlcl9pbzJtX2lycV9zdGF0dXMoY29tY2VydG9feG9yX2NoLDE8PDQpOworCQlkb190YXNrc2V0PTE7CisJfQorCisJaWYoaW50cl9jYXVzZSAmIElSUV9JUlFGVEhMRCkgeworCQlwcmludGsoS0VSTl9BTEVSVCAiSVJRRlRITEQ6IEZyYW1lIHRocmVzaG9sZCByZWFjaGVkLiBGTEVOPUZUSExETCIpOworCQljb21jZXJ0b19kdW1wX3hvcl9yZWdzKGNvbWNlcnRvX3hvcl9jaCk7CisJCWNvbWNlcnRvX3hvcl9zZXRfcmVnaXN0ZXJfaW8ybV9pcnFfc3RhdHVzKGNvbWNlcnRvX3hvcl9jaCwxPDw1KTsKKwkJZG9fdGFza3NldD0xOworCX0KKworCWlmKGludHJfY2F1c2UgJiBJUlFfSVJRRkNUUkwpIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIklSUUZDVFJMOiAxIGZyYW1lIGlzIGNvbXBsZXRlZCBvciB3aGVuIGEgZnJhbWUgaXMgc3RhcnRlZCBidXQgbm90IHJlYWR5Iik7CisJCWNvbWNlcnRvX2R1bXBfeG9yX3JlZ3MoY29tY2VydG9feG9yX2NoKTsKKwkJY29tY2VydG9feG9yX3NldF9yZWdpc3Rlcl9pbzJtX2lycV9zdGF0dXMoY29tY2VydG9feG9yX2NoLDE8PDYpOworCQlkb190YXNrc2V0PTE7CisJfQorCisJaWYoZG9fdGFza3NldCkKKwkgICAgCXRhc2tsZXRfc2NoZWR1bGUoJmNvbWNlcnRvX3hvcl9jaC0+aXJxX3Rhc2tsZXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjZGVmaW5lIENPTUNFUlRPX1hPUl9OVU1fU1JDX1RFU1QgNAorc3RhdGljIGludCBfX2RldmluaXQgY29tY2VydG9feG9yX3hvcl9zZWxmX3Rlc3Qoc3RydWN0IGNvbWNlcnRvX3hvcl9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgaSwgc3JjX2lkeDsKKwlzdHJ1Y3QgcGFnZSAqZGVzdDsKKwlzdHJ1Y3QgcGFnZSAqeG9yX3NyY3NbQ09NQ0VSVE9fWE9SX05VTV9TUkNfVEVTVF07CisJc3RydWN0IHBhZ2UgKnplcm9fc3VtX3NyY3NbQ09NQ0VSVE9fWE9SX05VTV9TUkNfVEVTVCsxXTsKKwlkbWFfYWRkcl90IGRtYV9zcmNzW0NPTUNFUlRPX1hPUl9OVU1fU1JDX1RFU1RdOworCWRtYV9hZGRyX3QgZG1hX3plcm9fc3Jjc1tDT01DRVJUT19YT1JfTlVNX1NSQ19URVNUKzFdOworCWRtYV9hZGRyX3QgZGVzdF9kbWE7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eDsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOworCWRtYV9jb29raWVfdCBjb29raWU7CisJdTggY21wX2J5dGUgPSAwOworCXUzMiBjbXBfd29yZDsKKwl1MzIgemVyb19zdW1fcmVzdWx0OworCWludCBlcnIgPSAwOworCXN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9fY2hhbjsKKworCWZvciAoc3JjX2lkeCA9IDA7IHNyY19pZHggPCBDT01DRVJUT19YT1JfTlVNX1NSQ19URVNUOyBzcmNfaWR4KyspIHsKKwkJeG9yX3NyY3Nbc3JjX2lkeF0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIXhvcl9zcmNzW3NyY19pZHhdKSB7CisJCQl3aGlsZSAoc3JjX2lkeC0tKQorCQkJCV9fZnJlZV9wYWdlKHhvcl9zcmNzW3NyY19pZHhdKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJZGVzdCA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXN0KSB7CisJCXdoaWxlIChzcmNfaWR4LS0pCisJCQlfX2ZyZWVfcGFnZSh4b3Jfc3Jjc1tzcmNfaWR4XSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoc3JjX2lkeCA9IDA7IHNyY19pZHggPCBDT01DRVJUT19YT1JfTlVNX1NSQ19URVNUOyBzcmNfaWR4KyspIHsKKwkJdTggKnB0ciA9IHBhZ2VfYWRkcmVzcyh4b3Jfc3Jjc1tzcmNfaWR4XSk7CisJCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkU7IGkrKykKKwkJCXB0cltpXSA9ICgxIDw8IHNyY19pZHgpOworCX0KKworCWZvciAoc3JjX2lkeCA9IDA7IHNyY19pZHggPCBDT01DRVJUT19YT1JfTlVNX1NSQ19URVNUOyBzcmNfaWR4KyspCisJCWNtcF9ieXRlIF49ICh1OCkgKDEgPDwgc3JjX2lkeCk7CisKKwljbXBfd29yZCA9IChjbXBfYnl0ZSA8PCAyNCkgfCAoY21wX2J5dGUgPDwgMTYpIHwKKwkJCShjbXBfYnl0ZSA8PCA4KSB8IGNtcF9ieXRlOworCisJbWVtc2V0KHBhZ2VfYWRkcmVzcyhkZXN0KSwgMCwgUEFHRV9TSVpFKTsKKworCWRtYV9jaGFuID0gY29udGFpbmVyX29mKGRldmljZS0+ZGV2aWNlLmNoYW5uZWxzLm5leHQsCisJCQkgICAgICAgICAgICAgICAgc3RydWN0IGRtYV9jaGFuLAorCQkJICAgICAgICAgICAgICAgIGRldmljZV9ub2RlKTsKKwlpZiAoY29tY2VydG9feG9yX2FsbG9jX2NoYW5fcmVzb3VyY2VzKGRtYV9jaGFuKSA8IDEpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZGVzdF9kbWEgPSBkbWFfbWFwX3BhZ2UoZG1hX2NoYW4tPmRldmljZS0+ZGV2LCBkZXN0LCAwLAorCQkJICAgICAgICAgICAgICAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwljb21jZXJ0b19jaGFuID0gdG9fY29tY2VydG9feG9yX2NoYW4oZG1hX2NoYW4pOworCisJZm9yIChpID0gMDsgaSA8IENPTUNFUlRPX1hPUl9OVU1fU1JDX1RFU1Q7IGkrKykKKwkJZG1hX3NyY3NbaV0gPSBkbWFfbWFwX3BhZ2UoZG1hX2NoYW4tPmRldmljZS0+ZGV2LCB4b3Jfc3Jjc1tpXSwKKwkJCQkgICAgICAgICAgICAgICAgICAgMCwgUEFHRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKKworCXR4ID0gY29tY2VydG9feG9yX3ByZXBfZG1hX3hvcihkbWFfY2hhbiwgZGVzdF9kbWEsIGRtYV9zcmNzLAorCQkJICAgICAgICAgICAgICAgICBDT01DRVJUT19YT1JfTlVNX1NSQ19URVNULCBQQUdFX1NJWkUsIDApOworCisJY29va2llID0gY29tY2VydG9feG9yX3R4X3N1Ym1pdCh0eCk7CisJY29tY2VydG9feG9yX2lzc3VlX3BlbmRpbmcoZG1hX2NoYW4pOworCWFzeW5jX3R4X2Fjayh0eCk7CisJbXNsZWVwKDgpOworCisJaWYgKGNvbWNlcnRvX3hvcl9zdGF0dXMoZG1hX2NoYW4sIGNvb2tpZSwgTlVMTCkgIT0gRE1BX1NVQ0NFU1MpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZG1hX2NoYW4tPmRldmljZS0+ZGV2LAorCQkJCSAgICJTZWxmLXRlc3QgeG9yIHRpbWVkIG91dCwgZGlzYWJsaW5nXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Jlc291cmNlczsKKwl9CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZXZpY2UtPmRldmljZS5kZXYsIGRlc3RfZG1hLAorCQkJICAgICAgICAgICAgICAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKwlmb3IgKGkgPSAwOyBpIDwgKFBBR0VfU0laRSAvIHNpemVvZih1MzIpKTsgaSsrKSB7CisJCXUzMiAqcHRyID0gcGFnZV9hZGRyZXNzKGRlc3QpOworCQlpZiAocHRyW2ldICE9IGNtcF93b3JkKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBkbWFfY2hhbi0+ZGV2aWNlLT5kZXYsCisJCQkJCSAgICJTZWxmLXRlc3QgeG9yIGZhaWxlZCBjb21wYXJlLCBkaXNhYmxpbmcuIgorCQkJCQkgICAiIGluZGV4ICVkLCBkYXRhICV4LCBleHBlY3RlZCAleFxuIiwgaSwKKwkJCQkJICAgcHRyW2ldLCBjbXBfd29yZCk7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBmcmVlX3Jlc291cmNlczsKKwkJfQorCX0KKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXZpY2UtPmRldmljZS5kZXYsZGVzdF9kbWEsCisJCQkgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFLCBETUFfVE9fREVWSUNFKTsKKworCWlmKCFkbWFfaGFzX2NhcChETUFfWE9SX1ZBTCxkbWFfY2hhbi0+ZGV2aWNlLT5jYXBfbWFzaykpCisJCWdvdG8gZnJlZV9yZXNvdXJjZXM7CisKKwlmb3IoaSA9IDA7IGkgPCBDT01DRVJUT19YT1JfTlVNX1NSQ19URVNUOyBpKyspCisJCXplcm9fc3VtX3NyY3NbaV09eG9yX3NyY3NbaV07CisJemVyb19zdW1fc3Jjc1tpXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJZm9yIChzcmNfaWR4ID0gMDsgc3JjX2lkeCA8IDE7IHNyY19pZHgrKykgeworCQl1OCAqcHRyID0gcGFnZV9hZGRyZXNzKHplcm9fc3VtX3NyY3NbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFOyBpKyspCisJCQlwdHJbaV0gPSAxIHwgMTw8MSB8IDE8PDIgfCAxPDwzOworCX0KKworCXplcm9fc3VtX3Jlc3VsdD0xOworCisJZm9yKGk9MDtpPENPTUNFUlRPX1hPUl9OVU1fU1JDX1RFU1QrMTtpKyspCisJCWRtYV96ZXJvX3NyY3NbaV09ZG1hX21hcF9wYWdlKGRtYV9jaGFuLT5kZXZpY2UtPmRldiwKKwkJCQkgICAgICAgICAgICAgICAgIHplcm9fc3VtX3NyY3NbaV0sMCxQQUdFX1NJWkUsCisJCQkJICAgICAgICAgICAgICAgICBETUFfVE9fREVWSUNFKTsKKwl0eCA9IGNvbWNlcnRvX3hvcl9wcmVwX2RtYV94b3JfdmFsKGRtYV9jaGFuLGRtYV96ZXJvX3NyY3MsCisJCQkgICAgICAgICAgICAgICAgICAgICBDT01DRVJUT19YT1JfTlVNX1NSQ19URVNUKzEsIFBBR0VfU0laRSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICZ6ZXJvX3N1bV9yZXN1bHQsCisJCQkgICAgICAgICAgICAgICAgICAgICBETUFfQ1RSTF9BQ0spOworCWNvb2tpZSA9IGNvbWNlcnRvX3hvcl90eF9zdWJtaXQodHgpOworCWNvbWNlcnRvX3hvcl9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFuKTsKKwltc2xlZXAoOCk7CisKKwlpZiAoY29tY2VydG9feG9yX3N0YXR1cyhkbWFfY2hhbiwgY29va2llLCBOVUxMKSAhPSBETUFfU1VDQ0VTUykgeworCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBkbWFfY2hhbi0+ZGV2aWNlLT5kZXYsCisJCQkJICAgIlNlbGYtdGVzdCB6ZXJvIHN1bSB0aW1lZCBvdXQsIGRpc2FibGluZ1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9yZXNvdXJjZXM7CisJfQorCisJaWYoemVyb19zdW1fcmVzdWx0ICE9IDApIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZG1hX2NoYW4tPmRldmljZS0+ZGV2LAorCQkJCSAgICJTZWxmLXRlc3QgemVybyBzdW0gZmFpbGVkIGNvbXBhcmUsIGRpc2FibGluZ1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9yZXNvdXJjZXM7CisJfQorCV9fZnJlZV9wYWdlKHplcm9fc3VtX3NyY3NbQ09NQ0VSVE9fWE9SX05VTV9TUkNfVEVTVF0pOworZnJlZV9yZXNvdXJjZXM6CisJY29tY2VydG9feG9yX2ZyZWVfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pOworb3V0OgorCXNyY19pZHggPSBDT01DRVJUT19YT1JfTlVNX1NSQ19URVNUOworCisJd2hpbGUgKHNyY19pZHgtLSkKKwkJX19mcmVlX3BhZ2UoeG9yX3NyY3Nbc3JjX2lkeF0pOworCV9fZnJlZV9wYWdlKGRlc3QpOworCXJldHVybiBlcnI7CisKK30KKworc3RhdGljIGludCBfX2RldmluaXQgY29tY2VydG9feG9yX21lbWNweV9zZWxmX3Rlc3Qoc3RydWN0IGNvbWNlcnRvX3hvcl9kZXZpY2UgKmRldmljZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcGFnZSAqZGVzdDsKKwlzdHJ1Y3QgcGFnZSAqc3JjOworCWRtYV9hZGRyX3Qgc3JjX2RtYTsKKwlkbWFfYWRkcl90IGRlc3RfZG1hOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CisJc3RydWN0IGRtYV9jaGFuICpkbWFfY2hhbjsKKwlkbWFfY29va2llX3QgY29va2llOworCWludCBlcnIgPSAwOworCXN0cnVjdCBjb21jZXJ0b194b3JfY2hhbiAqY29tY2VydG9fY2hhbjsKKworCXNyYyA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFzcmMpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVzdCA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXN0KSB7CisJCV9fZnJlZV9wYWdlKHNyYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIEZpbGwgaW4gc3JjIGJ1ZmZlciAqLworCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkU7IGkrKykgeworCQl1OCAqcHRyID0gcGFnZV9hZGRyZXNzKHNyYyk7CisJCSgodTggKikgcHRyKVtpXSA9ICh1OClpOworCX0KKworCW1lbXNldChwYWdlX2FkZHJlc3MoZGVzdCksIDAsIFBBR0VfU0laRSk7CisKKwlkbWFfY2hhbiA9IGNvbnRhaW5lcl9vZihkZXZpY2UtPmRldmljZS5jaGFubmVscy5uZXh0LAorCQkJICAgICAgICAgICAgICAgIHN0cnVjdCBkbWFfY2hhbiwKKwkJCSAgICAgICAgICAgICAgICBkZXZpY2Vfbm9kZSk7CisJaWYgKGNvbWNlcnRvX3hvcl9hbGxvY19jaGFuX3Jlc291cmNlcyhkbWFfY2hhbikgPCAxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWRlc3RfZG1hID0gZG1hX21hcF9wYWdlKGRtYV9jaGFuLT5kZXZpY2UtPmRldiwgZGVzdCwgMCwKKwkJCSAgICAgICAgICAgICAgICBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisJY29tY2VydG9fY2hhbiA9IHRvX2NvbWNlcnRvX3hvcl9jaGFuKGRtYV9jaGFuKTsKKworCXNyY19kbWEgPSBkbWFfbWFwX3BhZ2UoZG1hX2NoYW4tPmRldmljZS0+ZGV2LCBzcmMsCisJCQkJICAgICAgICAwLCBQQUdFX1NJWkUsIERNQV9UT19ERVZJQ0UpOworCisJdHggPSBjb21jZXJ0b194b3JfcHJlcF9kbWFfbWVtY3B5KGRtYV9jaGFuLCBkZXN0X2RtYSwgc3JjX2RtYSwKKwkJCSAgICAgICAgICAgICAgICAgUEFHRV9TSVpFLCAwKTsKKworCWNvb2tpZSA9IGNvbWNlcnRvX3hvcl90eF9zdWJtaXQodHgpOworCWNvbWNlcnRvX3hvcl9pc3N1ZV9wZW5kaW5nKGRtYV9jaGFuKTsKKwlhc3luY190eF9hY2sodHgpOworCW1zbGVlcCg4KTsKKworCWlmIChjb21jZXJ0b194b3Jfc3RhdHVzKGRtYV9jaGFuLCBjb29raWUsIE5VTEwpICE9IERNQV9TVUNDRVNTKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsIGRtYV9jaGFuLT5kZXZpY2UtPmRldiwKKwkJCQkgICAiU2VsZi10ZXN0IHhvciB0aW1lZCBvdXQsIGRpc2FibGluZ1xuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9yZXNvdXJjZXM7CisJfQorCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGV2aWNlLT5kZXZpY2UuZGV2LCBkZXN0X2RtYSwKKwkJCSAgICAgICAgICAgICAgICBQQUdFX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CisKKwlpZiAobWVtY21wKHBhZ2VfYWRkcmVzcyhzcmMpLCBwYWdlX2FkZHJlc3MoZGVzdCksIFBBR0VfU0laRSkpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZG1hX2NoYW4tPmRldmljZS0+ZGV2LAorCQkJICAgIlNlbGYtdGVzdCBjb3B5IGZhaWxlZCBjb21wYXJlLCBkaXNhYmxpbmdcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOworCX0KKworZnJlZV9yZXNvdXJjZXM6CisJY29tY2VydG9feG9yX2ZyZWVfY2hhbl9yZXNvdXJjZXMoZG1hX2NoYW4pOworb3V0OgorCV9fZnJlZV9wYWdlKHNyYyk7CisJX19mcmVlX3BhZ2UoZGVzdCk7CisJcmV0dXJuIGVycjsKKworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBjb21jZXJ0b194b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9kZXZpY2UgKmNvbWNlcnRvX3hvcl9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZG1hX2RldiA9ICZjb21jZXJ0b194b3JfZGV2LT5kZXZpY2U7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICAgKmNvbWNlcnRvX3hvcl9jaDsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sICpfX2NoYW47CisJaW50IGk7CisJaW50IGlycTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwwKTsKKworCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcihkbWFfZGV2KTsKKworCWZvcihpPTA7aTxQT09MX05VTUJFUjtpKyspCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIFBBR0VfU0laRSwKKwkJCQkgICAgICAgICAgY29tY2VydG9feG9yX2Rldi0+ZG1hX2Rlc2NfcG9vbF92aXJ0W2ldLAorCQkJCSAgICAgICAgICBjb21jZXJ0b194b3JfZGV2LT5kbWFfZGVzY19wb29sW2ldKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGFuLCBfX2NoYW4sICZkbWFfZGV2LT5jaGFubmVscywKKwkJCSAgICAgICAgICAgICAgICAgZGV2aWNlX25vZGUpIHsKKwkJY29tY2VydG9feG9yX2NoID0gdG9fY29tY2VydG9feG9yX2NoYW4oY2hhbik7CisJCWRldm1fZnJlZV9pcnEoJnBkZXYtPmRldiwgaXJxLCBjb21jZXJ0b194b3JfY2gpOworCQlsaXN0X2RlbCgmY2hhbi0+ZGV2aWNlX25vZGUpOworCQlkZXZtX2lvdW5tYXAoJnBkZXYtPmRldiwgY29tY2VydG9feG9yX2NoLT5tbXJfYmFzZSk7CisJCWtmcmVlKGNvbWNlcnRvX3hvcl9jaCk7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldixOVUxMKTsKKwlrZnJlZShjb21jZXJ0b194b3JfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjb21jZXJ0b194b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgICAgICAqaW87CisJc3RydWN0IGRtYV9kZXZpY2UgICAgKmRtYV9kZXY7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9kZXZpY2UgKmNvbWNlcnRvX3hvcl9kZXY7CisJc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuICAgKmNvbWNlcnRvX3hvcl9jaDsKKwlpbnQgICAgICAgICAgICAgICAgICBpcnE7CisJaW50ICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKwlpbnQgICAgICAgICAgICAgICAgICBpOworCisJLyogUmV0cmlldmUgcmVsYXRlZCByZXNvdXJjZXMobWVtLCBpcnEpIGZyb20gcGxhdGZvcm1fZGV2aWNlICovCisJaW8gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldixJT1JFU09VUkNFX01FTSwwKTsKKwlpZighaW8pCisJCXJldHVybiAtRU5PREVWOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LDApOworCWlmKGlycTwwKQorCQlyZXR1cm4gaXJxOworCisJLyogSW5pdGlhbGl6ZSBjb21jZXJ0b194b3JfZGV2aWNlICovCisJY29tY2VydG9feG9yX2RldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNvbWNlcnRvX3hvcl9kZXYpLCBHRlBfS0VSTkVMKTsKKworCWlmKCFjb21jZXJ0b194b3JfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRtYV9kZXYgPSAmY29tY2VydG9feG9yX2Rldi0+ZGV2aWNlOworCUlOSVRfTElTVF9IRUFEKCZkbWFfZGV2LT5jaGFubmVscyk7CisKKwlmb3IoaSA9IDAgOyBpIDwgUE9PTF9OVU1CRVI7IGkrKykKKwl7CisJCWNvbWNlcnRvX3hvcl9kZXYtPmRtYV9kZXNjX3Bvb2xfdmlydFtpXSA9IGRtYV9hbGxvY193cml0ZWNvbWJpbmUoJnBkZXYtPmRldiwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRSwKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21jZXJ0b194b3JfZGV2LT5kbWFfZGVzY19wb29sW2ldLAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmKCFjb21jZXJ0b194b3JfZGV2LT5kbWFfZGVzY19wb29sX3ZpcnRbaV0pCisJCXsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9mcmVlX2RtYTsKKwkJfQorCX0KKworCWRtYV9jYXBfc2V0KERNQV9YT1IsZG1hX2Rldi0+Y2FwX21hc2spOworCWRtYV9jYXBfc2V0KERNQV9YT1JfVkFMLGRtYV9kZXYtPmNhcF9tYXNrKTsKKy8vCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksZG1hX2Rldi0+Y2FwX21hc2spOworCisJZG1hX2Rldi0+ZGV2ID0gJnBkZXYtPmRldjsKKwlkbWFfZGV2LT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPSBjb21jZXJ0b194b3JfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CisJZG1hX2Rldi0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMgID0gY29tY2VydG9feG9yX2ZyZWVfY2hhbl9yZXNvdXJjZXM7CisJZG1hX2Rldi0+ZGV2aWNlX3R4X3N0YXR1cyAgICAgICAgICAgID0gY29tY2VydG9feG9yX3N0YXR1czsKKwlkbWFfZGV2LT5kZXZpY2VfaXNzdWVfcGVuZGluZyAgICAgICAgPSBjb21jZXJ0b194b3JfaXNzdWVfcGVuZGluZzsKKwlkbWFfZGV2LT5kZXZpY2VfcHJlcF9kbWFfeG9yICAgICAgICAgPSBjb21jZXJ0b194b3JfcHJlcF9kbWFfeG9yOworCWRtYV9kZXYtPmRldmljZV9wcmVwX2RtYV94b3JfdmFsICAgICA9IGNvbWNlcnRvX3hvcl9wcmVwX2RtYV94b3JfdmFsOworLy8JZG1hX2Rldi0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IGNvbWNlcnRvX3hvcl9wcmVwX2RtYV9tZW1jcHk7CisJZG1hX2Rldi0+bWF4X3hvciA9IENPTUNFUlRPX1hPUl9NQVhfU1JDOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldixjb21jZXJ0b194b3JfZGV2KTsKKworCS8qIEluaXRpYWxpemUgY29tY2VydG9feG9yX2NoYW4gKi8KKworCWNvbWNlcnRvX3hvcl9jaCAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldixzaXplb2YoKmNvbWNlcnRvX3hvcl9jaCksR0ZQX0tFUk5FTCk7CisJaWYoIWNvbWNlcnRvX3hvcl9jaCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2RtYTsKKwl9CisKKwljb21jZXJ0b194b3JfY2gtPmRldmljZSA9IGNvbWNlcnRvX3hvcl9kZXY7CisJY29tY2VydG9feG9yX2NoLT5wZW5kaW5nID0gMDsKKwljb21jZXJ0b194b3JfY2gtPnNsb3RfYWxsb2NhdGVkID0gMDsKKwljb21jZXJ0b194b3JfY2gtPmNvbXBsZXRlZF9jb29raWUgPSAwOworCWNvbWNlcnRvX3hvcl9jaC0+bW1yX2Jhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgaW8tPnN0YXJ0LHJlc291cmNlX3NpemUoaW8pKTsKKwlpZighY29tY2VydG9feG9yX2NoLT5tbXJfYmFzZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2NoOworCX0KKworCXRhc2tsZXRfaW5pdCgmY29tY2VydG9feG9yX2NoLT5pcnFfdGFza2xldCxjb21jZXJ0b194b3JfdGFza2xldCwodW5zaWduZWQgbG9uZyljb21jZXJ0b194b3JfY2gpOworCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIGNvbWNlcnRvX3hvcl9pbnRlcnJ1cHRfaGFuZGxlciwKKwkJCSAgICAgICAgICAgICAgIDAsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBjb21jZXJ0b194b3JfY2gpOworCWlmKHJldCkKKwkJZ290byBlcnJfZnJlZV9yZW1hcDsKKworCXNwaW5fbG9ja19pbml0KCZjb21jZXJ0b194b3JfY2gtPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZjb21jZXJ0b194b3JfY2gtPmFsbF9zbG90cyk7CisJSU5JVF9MSVNUX0hFQUQoJmNvbWNlcnRvX3hvcl9jaC0+Y2hhaW4pOworCUlOSVRfTElTVF9IRUFEKCZjb21jZXJ0b194b3JfY2gtPmNvbXBsZXRlZF9zbG90cyk7CisJY29tY2VydG9feG9yX2NoLT5jaGFuLmRldmljZSA9IGRtYV9kZXY7CisKKwlsaXN0X2FkZF90YWlsKCZjb21jZXJ0b194b3JfY2gtPmNoYW4uZGV2aWNlX25vZGUsJmRtYV9kZXYtPmNoYW5uZWxzKTsKKworCWNvbWNlcnRvX3hvcl9yZWdpc3Rlcl9pbml0KGNvbWNlcnRvX3hvcl9jaCk7CisKKwlpZiAoZG1hX2hhc19jYXAoRE1BX1hPUiwgZG1hX2Rldi0+Y2FwX21hc2spKSB7CisJCXJldCA9IGNvbWNlcnRvX3hvcl94b3Jfc2VsZl90ZXN0KGNvbWNlcnRvX3hvcl9kZXYpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJ4b3Igc2VsZiB0ZXN0IHJldHVybmVkICVkXG4iLCByZXQpOworCQlpZihyZXQpCisJCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwlpZiAoZG1hX2hhc19jYXAoRE1BX01FTUNQWSwgZG1hX2Rldi0+Y2FwX21hc2spKSB7CisJCXJldCA9IGNvbWNlcnRvX3hvcl9tZW1jcHlfc2VsZl90ZXN0KGNvbWNlcnRvX3hvcl9kZXYpOworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJtZW1jcHkgc2VsZiB0ZXN0IHJldHVybmVkICVkXG4iLCByZXQpOworCQlpZihyZXQpCisJCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwkKKwlyZXQgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKGRtYV9kZXYpOworCisJaWYgKHJldCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY2hhbm5lbCAlZFxuIixyZXQpOworCQlnb3RvIGVycl9mcmVlX2lycTsKKwl9CisKKwlnb3RvIG91dDsKKworZXJyX2ZyZWVfaXJxOgorCWRldm1fZnJlZV9pcnEoJnBkZXYtPmRldiwgaXJxLCBjb21jZXJ0b194b3JfY2gpOworZXJyX2ZyZWVfcmVtYXA6CisJZGV2bV9pb3VubWFwKCZwZGV2LT5kZXYsIGNvbWNlcnRvX3hvcl9jaC0+bW1yX2Jhc2UpOworZXJyX2ZyZWVfY2g6CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBjb21jZXJ0b194b3JfY2gpOworZXJyX2ZyZWVfZG1hOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsTlVMTCk7CisJd2hpbGUoaS0tKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LFBBR0VfU0laRSxjb21jZXJ0b194b3JfZGV2LT5kbWFfZGVzY19wb29sX3ZpcnRbaV0sCisJCQljb21jZXJ0b194b3JfZGV2LT5kbWFfZGVzY19wb29sW2ldKTsKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIGNvbWNlcnRvX3hvcl9kZXYpOworb3V0OgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNvbWNlcnRvX3hvcl9kcml2ZXIgPSB7CisJLnByb2JlICAgICAgICA9IGNvbWNlcnRvX3hvcl9wcm9iZSwKKwkucmVtb3ZlICAgICAgID0gY29tY2VydG9feG9yX3JlbW92ZSwKKwkuZHJpdmVyICAgICAgID0geworCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCQkubmFtZSAgPSAiY29tY2VydG9feG9yIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgY29tY2VydG9feG9yX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjb21jZXJ0b194b3JfZHJpdmVyKTsKKwlyZXR1cm4gcmV0OworfQorbW9kdWxlX2luaXQoY29tY2VydG9feG9yX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY29tY2VydG9feG9yX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY29tY2VydG9feG9yX2RyaXZlcik7CisJcmV0dXJuOworfQorbW9kdWxlX2V4aXQoY29tY2VydG9feG9yX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlhPUiBlbmdpbmUgZHJpdmVyIGZvciBNaW5kc3BlZWQgQ29tY2VydG8gQzIwMDAgZGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvY29tY2VydG9feG9yLmggYi9kcml2ZXJzL2RtYS9jb21jZXJ0b194b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTM1MzRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEvY29tY2VydG9feG9yLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBjb21jZXJ0b194b3IuaAorICoKKyAqICBDcmVhdGVkIG9uOiBNYXkgMTEsIDIwMTIKKyAqICAgICAgQXV0aG9yOiBid2FuZworICovCisKKyNpZm5kZWYgQ09NQ0VSVE9fWE9SX0hfCisjZGVmaW5lIENPTUNFUlRPX1hPUl9IXworCisjaW5jbHVkZTxsaW51eC90eXBlcy5oPgorI2luY2x1ZGU8bGludXgvaW8uaD4KKyNpbmNsdWRlPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGU8bGludXgvaW50ZXJydXB0Lmg+CisKKyNkZWZpbmUgUE9PTF9OVU1CRVIgNAorI2RlZmluZSBDT01DRVJUT19YT1JfSU5CT1VORF9ERVNDX1NJWkUgICAgICAgICA2NAorI2RlZmluZSBDT01DRVJUT19YT1JfT1VUQk9VTkRfREVTQ19TSVpFICAgICAgICAzMgorI2RlZmluZSBDT01DRVJUT19YT1JfTUFYX1NSQyAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIENPTUNFUlRPX1hPUl9NQVhfREVTVCAgICAgICAgICAgICAgICAgIDIKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fWE9SX0VYVEVOREVEX1RFU1QKKyNkZWZpbmUgQ09NQ0VSVE9fWE9SX1RIUkVTSE9MRCAgICAgICAgICAgICAgICAgMTAwCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0NPTUNFUlRPX1hPUl9FWFRFTkRFRF9URVNUCisjZGVmaW5lIENPTUNFUlRPX1hPUl9USFJFU0hPTEQgICAgICAgICAgICAgICAgIDEKKyNlbmRpZgorCisjZGVmaW5lIE0ySU9fQ09OVFJPTChjaGFuKSAgICAgICAgICAgICAgIChjaGFuLT5tbXJfYmFzZSkKKyNkZWZpbmUgTTJJT19IRUFEKGNoYW4pICAgICAgICAgICAgICAgICAgKGNoYW4tPm1tcl9iYXNlICsgMHg0KQorI2RlZmluZSBNMklPX0JVUlNUKGNoYW4pICAgICAgICAgICAgICAgICAoY2hhbi0+bW1yX2Jhc2UgKyAweDgpCisjZGVmaW5lIE0ySU9fRkxFTihjaGFuKSAgICAgICAgICAgICAgICAgIChjaGFuLT5tbXJfYmFzZSArIDB4QykKKyNkZWZpbmUgTTJJT19JUlFfRU5BQkxFKGNoYW4pICAgICAgICAgICAgKGNoYW4tPm1tcl9iYXNlICsgMHgxMCkKKyNkZWZpbmUgTTJJT19JUlFfU1RBVFVTKGNoYW4pICAgICAgICAgICAgKGNoYW4tPm1tcl9iYXNlICsgMHgxNCkKKyNkZWZpbmUgTTJJT19SRVNFVChjaGFuKSAgICAgICAgICAgICAgICAgKGNoYW4tPm1tcl9iYXNlICsgMHgyMCkKKworI2RlZmluZSBJTzJNX0NPTlRST0woY2hhbikgICAgICAgICAgICAgICAoY2hhbi0+bW1yX2Jhc2UgKyAweDgwKQorI2RlZmluZSBJTzJNX0hFQUQoY2hhbikgICAgICAgICAgICAgICAgICAoY2hhbi0+bW1yX2Jhc2UgKyAweDg0KQorI2RlZmluZSBJTzJNX0JVUlNUKGNoYW4pICAgICAgICAgICAgICAgICAoY2hhbi0+bW1yX2Jhc2UgKyAweDg4KQorI2RlZmluZSBJTzJNX0ZMRU4oY2hhbikgICAgICAgICAgICAgICAgICAoY2hhbi0+bW1yX2Jhc2UgKyAweDhDKQorI2RlZmluZSBJTzJNX0lSUV9FTkFCTEUoY2hhbikgICAgICAgICAgICAoY2hhbi0+bW1yX2Jhc2UgKyAweDkwKQorI2RlZmluZSBJTzJNX0lSUV9TVEFUVVMoY2hhbikgICAgICAgICAgICAoY2hhbi0+bW1yX2Jhc2UgKyAweDk0KQorI2RlZmluZSBJTzJNX1JFU0VUKGNoYW4pICAgICAgICAgICAgICAgICAoY2hhbi0+bW1yX2Jhc2UgKyAweEEwKQorCisvLwlNZW0gdG8gSU8gQ29udHJvbAorI2RlZmluZSBNMklPX1NUQVJUCSgxIDw8IDApCisjZGVmaW5lIE0ySU9fRkxFTkVOCSgxIDw8IDEpCisjZGVmaW5lIE0ySU9fRkNPTQkoMSA8PCAyKQorI2RlZmluZSBNMklPX0RPTk9TVE9QCSgxIDw8IDMpCisjZGVmaW5lIE0ySU9fRE9OT1NUQQkoMSA8PCA0KQorCisvLwlJTyB0byBNZW06IERNQSBDb250cm9sCisjZGVmaW5lIElPMk1fSVJRRlJEWU4JKDEgPDwgMCkKKyNkZWZpbmUgSU8yTV9JUlFGTFNUCSgxIDw8IDEpCisjZGVmaW5lIElPMk1fSVJRRkRPTgkoMSA8PCAyKQorI2RlZmluZSBJTzJNX0lSUUZMU0gJKDEgPDwgMykKKyNkZWZpbmUgSU8yTV9JUlFGTEVOCSgxIDw8IDQpCisjZGVmaW5lIElPMk1fSVJRRlRITEQJKDEgPDwgNSkKKworLy8gSVJRIFN0YXR1cyBSZWdpc3RlcgorI2RlZmluZSBJUlFfSVJRRlJEWU4JKDEgPDwgMCkKKyNkZWZpbmUgSVJRX0lSUUZMU1QJKDEgPDwgMSkKKyNkZWZpbmUgSVJRX0lSUUZET04JKDEgPDwgMikKKyNkZWZpbmUgSVJRX0lSUUZMU0gJKDEgPDwgMykKKyNkZWZpbmUgSVJRX0lSUUZMRU4JKDEgPDwgNCkKKyNkZWZpbmUgSVJRX0lSUUZUSExECSgxIDw8IDUpCisjZGVmaW5lIElSUV9JUlFGQ1RSTAkoMSA8PCA2KQorCisvLyBJbmJvdW5kIEZyYW1lIGFuZCBCdWZmZXIgRGVzY3JpcHRvciBQcm9ncmFtbWluZworCisvLyBCQ29udHJvbAorI2RlZmluZSBCTEFTVAkoMSA8PCAxNikKKyNkZWZpbmUgQkZJWAkoMSA8PCAxNykKKworLy8gQmxvY2sgU2l6ZQorI2RlZmluZSBYT1JfQkxPQ0tfU0laRV8yNTYJMAorI2RlZmluZSBYT1JfQkxPQ0tfU0laRV81MTIJMQorI2RlZmluZSBYT1JfQkxPQ0tfU0laRV8xMDI0CTIKKyNkZWZpbmUgWE9SX0JMT0NLX1NJWkVfMjA0OAkzCisjZGVmaW5lIFhPUl9CTE9DS19TSVpFXzQwOTYJNAorCitzdHJ1Y3QgY29tY2VydG9feG9yX2RldmljZSB7CisJZG1hX2FkZHJfdCAgICAgICAgICAgICAgIGRtYV9kZXNjX3Bvb2xbUE9PTF9OVU1CRVJdOworCXZvaWQgICAgICAgICAgICAgICAgICAgICAqZG1hX2Rlc2NfcG9vbF92aXJ0W1BPT0xfTlVNQkVSXTsKKwlzdHJ1Y3QgZG1hX2RldmljZSAgICAgICAgZGV2aWNlOworfTsKKworc3RydWN0IGNvbWNlcnRvX3hvcl9kZXNjX3Nsb3QgeworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICAgICBzbG90X25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICAgIGNoYWluX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICAgIGNvbXBsZXRlZF9ub2RlOworCWVudW0gZG1hX3RyYW5zYWN0aW9uX3R5cGUgICAgICB0eXBlOworCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqaHdfZGVzY19pbmJvdW5kOworCXZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAqaHdfZGVzY19vdXRib3VuZDsKKwlkbWFfYWRkcl90ICAgICAgICAgICAgICAgICAgICAgaHdfZGVzY19vdXRib3VuZF9kbWE7CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c3k7CisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jbnQ7CisJc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgYXN5bmNfdHg7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICp4b3JfY2hlY2tfcmVzdWx0OworfTsKKworc3RydWN0IGNvbWNlcnRvX3hvcl9jaGFuIHsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZzsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdF9hbGxvY2F0ZWQ7CisJZG1hX2Nvb2tpZV90ICAgICAgICAgICAgICAgIGNvbXBsZXRlZF9jb29raWU7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgICAgIGxvY2s7CisJdm9pZCBfX2lvbWVtICAgICAgICAgICAgICAgICptbXJfYmFzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgYWxsX3Nsb3RzOworCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICBjaGFpbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgY29tcGxldGVkX3Nsb3RzOworCXN0cnVjdCBjb21jZXJ0b194b3JfZGV2aWNlICAgICAgICAqZGV2aWNlOworCXN0cnVjdCBkbWFfY2hhbgkJICAgICAgICBjaGFuOworCXN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90ICAgICAqbGFzdF91c2VkOworCXN0cnVjdCBjb21jZXJ0b194b3JfZGVzY19zbG90ICAgICAqdG9fYmVfc3RhcnRlZDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgICAgICAgaXJxX3Rhc2tsZXQ7Cit9OworCitzdHJ1Y3QgY29tY2VydG9feG9yX2luYm91bmRfZGVzYyB7CisJdTMyICBuZXh0X2Rlc2M7CisJdTMyICBmY29udHJvbDsKKwl1MzIgIGZzdGF0dXMwOworCXUzMiAgZnN0YXR1czE7CisJdTMyICBidWZmX2luZm9bMTJdOyAvLyA2IEJ1ZmZlciBEZXNjcmlwdG9ycworfTsKKworc3RydWN0IGNvbWNlcnRvX3hvcl9vdXRib3VuZF9kZXNjIHsKKwl1MzIgIG5leHRfZGVzYzsKKwl1MzIgIGZjb250cm9sOworCXUzMiAgZnN0YXR1czA7CisJdTMyICBmc3RhdHVzMTsKKwl1MzIgIGJ1ZmZfaW5mb1s0XTsgLy8gMiBCdWZmZXIgRGVzY3JpcHRvcnMKK307CisKKworI2VuZGlmIC8qIENPTUNFUlRPX1hPUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL0tjb25maWcgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwppbmRleCA0ZTA0MTU3Li5lYTgzZmU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwaW8vS2NvbmZpZwpAQCAtMTQ3LDYgKzE0NywxMyBAQAogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IHRoZSBYaWxpbnggRlBHQSBHUElPIGRldmljZQogCitjb25maWcgR1BJT19DMksKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBBUkNIX004NlhYWAorCWJvb2wgIkNvbWNlcnRvIDIwMDAgR1BJTyBzdXBwb3J0IgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IHRoZSBDb21jZXJ0byAyMDAwIEdQSU8gZGV2aWNlCisKIGNvbmZpZyBHUElPX1ZSNDFYWAogCXRyaXN0YXRlICJORUMgVlI0MTAwIHNlcmllcyBHZW5lcmFsLXB1cnBvc2UgSS9PIFVpbnQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIENQVV9WUjQxWFgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZSBiL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQppbmRleCA0ZTAxOGQ2Li45MjQzNDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCkBAIC02MiwzICs2Miw1IEBACiBvYmotJChDT05GSUdfR1BJT19XTTgzNTApCSs9IGdwaW8td204MzUwLm8KIG9iai0kKENPTkZJR19HUElPX1dNODk5NCkJKz0gZ3Bpby13bTg5OTQubwogb2JqLSQoQ09ORklHX0dQSU9fWElMSU5YKQkrPSBncGlvLXhpbGlueC5vCitvYmotJChDT05GSUdfR1BJT19DMkspCQkrPSBncGlvLWMyay5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWMyay5jIGIvZHJpdmVycy9ncGlvL2dwaW8tYzJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5ZDdkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWMyay5jCkBAIC0wLDAgKzEsMTUyIEBACisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tY29tbW9uLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bWFjaC9ncGlvLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgImMyay1ncGlvIgorc3RhdGljIERFRklORV9TUElOTE9DSyhjMmtfZ3Bpb19sb2NrKTsKKworc3RhdGljIHN0cnVjdCBjMmtfZ3Bpb19jaGlwIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7Cit9OworCitzdGF0aWMgaW50IGMya19pc19ncGlvX3JzdmQodW5zaWduZWQgb2Zmc2V0KQoreworCWlmIChvZmZzZXQgPCAzMikKKwkJcmV0dXJuICgoYzJrX2dwaW9fcGluX3N0YXQuYzJrX2dwaW9fcGluc18wXzMxID4+IG9mZnNldCkgJiAweDEpID8gMSA6IDAgOworCWVsc2UgaWYgKG9mZnNldCA8IDY0KQorCQlyZXR1cm4gKChjMmtfZ3Bpb19waW5fc3RhdC5jMmtfZ3Bpb19waW5zXzMyXzYzID4+IChvZmZzZXQgLSAzMikpICYgMHgxKSA/IDEgOiAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYzJrX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlpZiAob2Zmc2V0IDwgMzIpCisJCXJldHVybiBfX3Jhd19yZWFkbChDT01DRVJUT19HUElPX0lOUFVUX1JFRykgJiAoMHgxIDw8IG9mZnNldCk7CisJZWxzZSBpZiAob2Zmc2V0IDwgNjQpCisJCXJldHVybiBfX3Jhd19yZWFkbChDT01DRVJUT19HUElPXzYzXzMyX1BJTl9JTlBVVCkgJiAoMHgxIDw8IChvZmZzZXQgLSAzMikpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Mya19ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwl1MzIgZGF0YTsKKworCWlmIChvZmZzZXQgPCAzMikgeworCQlkYXRhID0gX19yYXdfcmVhZGwoQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHKTsKKwkJaWYgKHZhbHVlKQorCQkJZGF0YSB8PSAoMSA8PCBvZmZzZXQpOworCQllbHNlCisJCQlkYXRhICY9IH4oMSA8PCBvZmZzZXQpOworCQlfX3Jhd193cml0ZWwoZGF0YSwgQ09NQ0VSVE9fR1BJT19PVVRQVVRfUkVHKTsKKwl9IGVsc2UgeworCQlkYXRhID0gX19yYXdfcmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUKTsKKwkJaWYgKHZhbHVlKQorCQkJZGF0YSB8PSAoMSA8PCAob2Zmc2V0IC0gMzIpKTsKKwkJZWxzZQorCQkJZGF0YSAmPSB+KDEgPDwgKG9mZnNldCAtIDMyKSk7CisJCV9fcmF3X3dyaXRlbChkYXRhLCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVQpOworCX0KK30KKworc3RhdGljIHZvaWQgYzJrX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXUzMiBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAob2Zmc2V0ID4gNjMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjMmtfZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlfX2Mya19ncGlvX3NldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMya19ncGlvX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBjMmtfZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9mZnNldCA+IDYzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjMmtfaXNfZ3Bpb19yc3ZkKG9mZnNldCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJHUElPLSVkIGlzIHJlc2VydmVkIGFuZCBjYW5ub3QgYmUgdXNlZCBcbiIsIG9mZnNldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjMmtfZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlpZiAob2Zmc2V0IDwgMzIpCisJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChDT01DRVJUT19HUElPX09FX1JFRykgJiB+KDB4MSA8PCBvZmZzZXQpLCBDT01DRVJUT19HUElPX09FX1JFRyk7CisJZWxzZQorCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoQ09NQ0VSVE9fR1BJT182M18zMl9QSU5fT1VUUFVUX0VOKSAmIH4oMHgxIDw8IChvZmZzZXQgLSAzMikpLCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVRfRU4pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYzJrX2dwaW9fbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYzJrX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZGF0YTsKKworCWlmIChvZmZzZXQgPiA2MykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYzJrX2lzX2dwaW9fcnN2ZChvZmZzZXQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiR1BJTy0lZCBpcyByZXNlcnZlZCBhbmQgY2Fubm90IGJlIHVzZWQgXG4iLCBvZmZzZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYzJrX2dwaW9fbG9jaywgZmxhZ3MpOworCisJaWYgKG9mZnNldCA8IDMyKSB7CisJCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChDT01DRVJUT19HUElPX09FX1JFRykgfCAoMHgxIDw8IG9mZnNldCksIENPTUNFUlRPX0dQSU9fT0VfUkVHKTsKKwkJX19jMmtfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKENPTUNFUlRPX0dQSU9fNjNfMzJfUElOX09VVFBVVF9FTikgfCAoMHgxIDw8IChvZmZzZXQgLSAzMikpLCBDT01DRVJUT19HUElPXzYzXzMyX1BJTl9PVVRQVVRfRU4pOworCQlfX2Mya19ncGlvX3NldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjMmtfZ3Bpb19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjMmtfZ3Bpb19jaGlwIGMya19ncGlvX2NoaXAgPSB7CisJLmNoaXAgPSB7CisJCS5sYWJlbAkJCT0gRFJWX05BTUUsCisJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJCS5kaXJlY3Rpb25faW5wdXQJPSBjMmtfZGlyZWN0aW9uX2lucHV0LAorCQkuZGlyZWN0aW9uX291dHB1dAk9IGMya19kaXJlY3Rpb25fb3V0cHV0LAorCQkuc2V0CQkJPSBjMmtfZ3Bpb19zZXQsCisJCS5nZXQJCQk9IGMya19ncGlvX2dldCwKKwkJLmJhc2UJCQk9IDAsCisJCS5uZ3BpbwkJCT0gQzJLX0dQSU9fTlJfR1BJT1MsCisJfSwKK307CisKK3ZvaWQgX19pbml0IGMya19pbml0X2dwaW8odm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZjMmtfZ3Bpb19jaGlwLmNoaXApOworCisJaWYgKHJldCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQzJLIEdQSU8gcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsIHJldCk7Cit9CitwdXJlX2luaXRjYWxsKGMya19pbml0X2dwaW8pOworCitNT0RVTEVfQVVUSE9SKCJNaW5kc3BlZWQgVGVjaG5vbG9naWVzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNPTUNFUlRPIDIwMDAgR1BJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUyhEUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9LY29uZmlnIGIvZHJpdmVycy9pMmMvS2NvbmZpZwppbmRleCA1ZjEzYzYyLi4zMTUxNTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL0tjb25maWcKQEAgLTQ0LDcgKzQ0LDcgQEAKIAkgIHByb2dyYW1zIHVzZSB0aGUgSTJDIGJ1cy4gIEluZm9ybWF0aW9uIG9uIGhvdyB0byBkbyB0aGlzIGlzCiAJICBjb250YWluZWQgaW4gdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9pMmMvZGV2LWludGVyZmFjZT4uCiAKLQkgIFRoaXMgc3VwcG9ydCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlIAorCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGkyYy1kZXYuCiAKIGNvbmZpZyBJMkNfTVVYCkBAIC04Niw2ICs4Niw3IEBACiAKIHNvdXJjZSBkcml2ZXJzL2kyYy9hbGdvcy9LY29uZmlnCiBzb3VyY2UgZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKK3NvdXJjZSBkcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCiAKIGNvbmZpZyBJMkNfREVCVUdfQ09SRQogCWJvb2wgIkkyQyBDb3JlIGRlYnVnZ2luZyBtZXNzYWdlcyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvTWFrZWZpbGUKaW5kZXggYmVlZTZiMi4uYTI5ZDQ2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pMmMvTWFrZWZpbGUKQEAgLTcsNyArNyw3IEBACiBvYmotJChDT05GSUdfSTJDX1NNQlVTKQkJKz0gaTJjLXNtYnVzLm8KIG9iai0kKENPTkZJR19JMkNfQ0hBUkRFVikJKz0gaTJjLWRldi5vCiBvYmotJChDT05GSUdfSTJDX01VWCkJCSs9IGkyYy1tdXgubwotb2JqLXkJCQkJKz0gYWxnb3MvIGJ1c3Nlcy8gbXV4ZXMvCitvYmoteQkJCQkrPSBhbGdvcy8gYnVzc2VzLyBjaGlwcy8gbXV4ZXMvCiAKIGNjZmxhZ3MtJChDT05GSUdfSTJDX0RFQlVHX0NPUkUpIDo9IC1EREVCVUcKIENGTEFHU19pMmMtY29yZS5vIDo9IC1Xbm8tZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggYTNhZmFjNC4uMTAxMGE0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTMwOCw2ICszMDgsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGkyYy1hdTE1NTAuCiAKK2NvbmZpZyBJMkNfQ09NQ0VSVE8KKwl0cmlzdGF0ZSAiQ29tY2VydG8gSTJDIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIEkyQyAmJiAoQVJDSF9DT01DRVJUTykKKwloZWxwCisJCUlmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQorCQlDb21jZXJ0byBJMkMgaW50ZXJmYWNlLgorCisJCVRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkJd2lsbCBiZSBjYWxsZWQgaTJjLWNvbWNlcnRvLgorCiBjb25maWcgSTJDX0JMQUNLRklOX1RXSQogCXRyaXN0YXRlICJCbGFja2ZpbiBUV0kgSTJDIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBCTEFDS0ZJTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCmluZGV4IGZiYTZkYTYuLmY5NjA2NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKQEAgLTMxLDYgKzMxLDcgQEAKIG9iai0kKENPTkZJR19JMkNfQVQ5MSkJCSs9IGkyYy1hdDkxLm8KIG9iai0kKENPTkZJR19JMkNfQVUxNTUwKQkrPSBpMmMtYXUxNTUwLm8KIG9iai0kKENPTkZJR19JMkNfQkxBQ0tGSU5fVFdJKQkrPSBpMmMtYmZpbi10d2kubworb2JqLSQoQ09ORklHX0kyQ19DT01DRVJUTykgICAgICArPSBpMmMtY29tY2VydG8ubwogb2JqLSQoQ09ORklHX0kyQ19DUE0pCQkrPSBpMmMtY3BtLm8KIG9iai0kKENPTkZJR19JMkNfREFWSU5DSSkJKz0gaTJjLWRhdmluY2kubwogb2JqLSQoQ09ORklHX0kyQ19ERVNJR05XQVJFX1BMQVRGT1JNKQkrPSBpMmMtZGVzaWdud2FyZS1wbGF0Zm9ybS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNvbWNlcnRvLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNvbWNlcnRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJjODY0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY29tY2VydG8uYwpAQCAtMCwwICsxLDc0NCBAQAorLyoKKyAqICBkcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNvbWNlcnRvLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgorI2luY2x1ZGUgPG1hY2gvaTJjLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgorCitNT0RVTEVfQVVUSE9SKCJNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWNlcnRvIEkyQyBidXMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgU1BFRURfSElHSF9LSFoJCTM0MDAKKyNkZWZpbmUgU1BFRURfRlVMTF9LSFoJCTQwMAorI2RlZmluZSBTUEVFRF9OT1JNQUxfS0haCTEwMAorCitzdGF0aWMgaW50IGZvcmNlX3BvbGwgPSAwOworc3RhdGljIHN0cnVjdCBjbGsgKmNsa19pMmM7Cittb2R1bGVfcGFyYW0oZm9yY2VfcG9sbCwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlX3BvbGwsICJGb3JjZSBwb2xsaW5nIG1vZGU6IDA9aW50ZXJydXB0IG1vZGUsIHBvbGxpbmcgbW9kZSBvdGhlcndpc2UiKTsKKworc3RhdGljIGludCBzcGVlZCA9IDA7Cittb2R1bGVfcGFyYW0oc3BlZWQsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHNwZWVkLCAiSTJDIHNwZWVkOiAwPXN0YW5kYXJkLCAxPWZhc3QsIDI9aGlnaCBzcGVlZCIpOworCitzdHJ1Y3QgY29tY2VydG9faTJjCit7CisJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwdGVyOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJdW5zaWduZWQgbG9uZwkJbWVtYmFzZTsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSppbzsKKwlpbnQJCQlpcnE7CisJdTMyCQkJc3BlZWRfa2h6OworCisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKKwlzdHJ1Y3QgaTJjX21zZwkJKm1zZzsKKwlpbnQJCQltc2dfc3RhdGU7CisJaW50CQkJbXNnX3N0YXR1czsJLyogPCAwOiBlcnJvciwgPT0gMDogc3VjY2VzcywgPiAwOiBtZXNzYWdlIGluIHByb2dyZXNzICovCisJaW50CQkJbXNnX2xlbjsKKwlpbnQJCQltc2dfcmV0cmllczsKK307CisKKyNkZWZpbmUgUkVHX0FERFIoaTJjLCBvZmZzZXQpCQkoKGkyYyktPm1lbWJhc2UgKyAob2Zmc2V0KSkKKyNkZWZpbmUgUkRfUkVHKGkyYywgb2Zmc2V0KQkJX19yYXdfcmVhZGIoUkVHX0FERFIoaTJjLCBvZmZzZXQpKQorI2RlZmluZSBXUl9SRUcoaTJjLCBvZmZzZXQsIGJ5dGUpCV9fcmF3X3dyaXRlYihieXRlLCBSRUdfQUREUihpMmMsIG9mZnNldCkpCisjZGVmaW5lIFJEX0RBVEEoaTJjKQkJCVJEX1JFRyhpMmMsIENPTUNFUlRPX0kyQ19EQVRBKQorI2RlZmluZSBXUl9EQVRBKGkyYywgYnl0ZSkJCVdSX1JFRyhpMmMsIENPTUNFUlRPX0kyQ19EQVRBLCBieXRlKQorI2RlZmluZSBSRF9DTlRSKGkyYykJCQlSRF9SRUcoaTJjLCBDT01DRVJUT19JMkNfQ05UUikKKyNkZWZpbmUgV1JfQ05UUihpMmMsIGJ5dGUpCQlXUl9SRUcoaTJjLCBDT01DRVJUT19JMkNfQ05UUiwgYnl0ZSkKKyNkZWZpbmUgUkRfU1RBVChpMmMpCQkJUkRfUkVHKGkyYywgQ09NQ0VSVE9fSTJDX1NUQVQpCisjZGVmaW5lIFdSX0NDUkZTKGkyYywgYnl0ZSkJCVdSX1JFRyhpMmMsIENPTUNFUlRPX0kyQ19DQ1JGUywgYnl0ZSkKKyNkZWZpbmUgV1JfQ0NSSChpMmMsIGJ5dGUpCQlXUl9SRUcoaTJjLCBDT01DRVJUT19JMkNfQ0NSSCwgYnl0ZSkKKyNkZWZpbmUgV1JfUkVTRVQoaTJjLCBieXRlKQkJV1JfUkVHKGkyYywgQ09NQ0VSVE9fSTJDX1JFU0VULCBieXRlKQorCitlbnVtCit7CisJVFJfSURMRSA9IDAsCisJVFJfU1RBUlRfQUNLLAorCVRSX0FERFJfQUNLLAorCVRSX0RBVEFfQUNLLAorCVJYX0RBVEFfTkFDSywKK307CisKK3N0YXRpYyB1OCBjb21jZXJ0b19pMmNfY2FsY3VsYXRlX2RpdmlkZXJzKHN0cnVjdCBjb21jZXJ0b19pMmMgKmkyYykKK3sKKwlpbnQgbSwgbiwgaHosIHNwZWVkX2h6OworCWludCBzYXZlZF9uLCBzYXZlZF9tLCBzYXZlZF9oejsKKwl1OCBkaXZpZGVyczsKKwl1bnNpZ25lZCBpbnQgaTJjX2NsazsKKworCS8qIEdldCB0aGUgaTJjIGNsb2NrIHJhdGUgKi8KKwlpMmNfY2xrID0gY2xrX2dldF9yYXRlKGNsa19pMmMpOworCisJc3BlZWRfaHogPSBpMmMtPnNwZWVkX2toeiAqIDEwMDA7CisJc2F2ZWRfaHogPSBzYXZlZF9uID0gc2F2ZWRfbSA9IDA7CisKKwlmb3IgKG0gPSAwOyBtIDwgMTY7IG0rKykgeworCQlmb3IgKG4gPSAwOyBuIDwgODsgbisrKSB7CisJCQloeiA9IGkyY19jbGsgLyAoKDEgPDwgbikgKiAobSArIDEpICogMTApOworCQkJaWYgKCFzYXZlZF9oeiB8fCBhYnMoc3BlZWRfaHogLSBoeikgPCBhYnMoc3BlZWRfaHogLSBzYXZlZF9oeikpIHsKKwkJCQlzYXZlZF9uID0gbjsKKwkJCQlzYXZlZF9tID0gbTsKKwkJCQlzYXZlZF9oeiA9IGh6OworCQkJfQorCQl9CisJfQorCisJZGl2aWRlcnMgPSAoc2F2ZWRfbSA8PCAzKSB8IHNhdmVkX247CisJZGV2X2RiZyhpMmMtPmRldiwgIiVzOiBzcGVlZD0lZGtIeiwgTT0lZCwgTj0lZCwgZGl2aWRlcnM9MHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sCisJCXNhdmVkX2h6LzEwMDAsIHNhdmVkX20sIHNhdmVkX24sIGRpdmlkZXJzKTsKKwlwcmludGsoIiVzOiBzcGVlZD0lZGtIeiwgTT0lZCwgTj0lZCwgZGl2aWRlcnM9MHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIHNhdmVkX2h6LzEwMDAsIHNhdmVkX20sIHNhdmVkX24sIGRpdmlkZXJzKTsKKworCXJldHVybiBkaXZpZGVyczsKK30KKworLyoKKyAqIFJldHVybnMgdGhlIHRpbWVvdXQgKGluIGppZmZpZXMpIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZS4KKyAqLworc3RhdGljIGludCBjb21jZXJ0b19pMmNfY2FsY3VsYXRlX3RpbWVvdXQoc3RydWN0IGNvbWNlcnRvX2kyYyAqaTJjLCBzdHJ1Y3QgaTJjX21zZyAqbXNnKQoreworCWludCB0aW1lb3V0OworCisJLyogaWYgbm8gdGltZW91dCB3YXMgc3BlY2lmaWVkLCBjYWxjdWxhdGUgaXQgKi8KKwlpZiAoaTJjLT5hZGFwdGVyLT50aW1lb3V0IDw9IDApIHsKKwkJaWYgKGkyYy0+aXJxID49IDApIHsKKwkJCS8qIGZvciB0aGUgaW50ZXJydXB0IG1vZGUgY2FsY3VsYXRlIHRpbWVvdXQgZm9yICdmdWxsJyBtZXNzYWdlICovCisJCQl0aW1lb3V0ID0gKChpbnQpbXNnLT5sZW4pICogMTA7CS8qIGNvbnZlcnQgYXBwcm94LiB0byBiaXRzICovCisJCQl0aW1lb3V0IC89IGkyYy0+c3BlZWRfa2h6OwkvKiBjb252ZXJ0IHRvIGJpdHMgcGVyIG1zIChub3RlIG9mIGtIeiBzY2FsZSkgKi8KKwkJCXRpbWVvdXQgKz0gdGltZW91dCA+PiAxOwkvKiBhZGQgNTAlICovCisJCQl0aW1lb3V0ID0gdGltZW91dCpIWiAvIDEwMDA7CS8qIGNvbnZlcnQgdG8gamlmZmllcyAqLworCQkJaWYgKHRpbWVvdXQgPCBIWiAvIDUpCQkvKiBhdCBsZWFzdCAyMDBtcyAqLworCQkJCXRpbWVvdXQgPSBIWiAvIDU7CisJCX0KKwkJZWxzZQorCQkJdGltZW91dCA9IEhaOwkJCS8qIDEgc2Vjb25kIGZvciB0aGUgcG9sbGluZyBtb2RlICovCisJfQorCWVsc2UKKwkJdGltZW91dCA9IGkyYy0+YWRhcHRlci0+dGltZW91dDsKKworCXJldHVybiB0aW1lb3V0OworfQorCisvKgorICogSW5pdGlhbGl6ZSBJMkMgY29yZS4gWmVybyBDTlRSIGFuZCBEQVRBLCB0cnkgUkVTRVQuIFNob3J0IGJ1c3kgd2FpdCBhbmQgY2hlY2sgY29yZSBzdGF0dXMuCisgKiBBZnRlciB0aGF0IHNldCBkaXZpZGVycyBmb3IgY2hvb3NlbiBzcGVlZC4KKyAqLworc3RhdGljIHZvaWQgY29tY2VydG9faTJjX3Jlc2V0KHN0cnVjdCBjb21jZXJ0b19pMmMgKmkyYykKK3sKKwl1OCBzdGF0dXMsIGRpdmlkZXJzOworCisJZGV2X2RiZyhpMmMtPmRldiwgIiVzXG4iLCBfX0ZVTkNUSU9OX18pOworCisJV1JfQ05UUihpMmMsIDApOworCVdSX0RBVEEoaTJjLCAwKTsKKwlXUl9SRVNFVChpMmMsIDEpOworCisJdWRlbGF5KDEwKTsKKworCXN0YXR1cyA9IFJEX1NUQVQoaTJjKTsKKwlpZiAoc3RhdHVzICE9IFNUQVRfTk9fUkVMRVZBTlRfSU5GTykKKwkJZGV2X3dhcm4oaTJjLT5kZXYsICIlczogdW5leHBlY3RlZCBzdGF0dXMgYWZ0ZXIgcmVzZXQ6IDB4JTAyeFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCisJLyogZGl2aWRlcnMgc2hvdWxkIGJlIHBsYWNlZCBpbiBDQ1JIIGZvciBoaWdoLXNwZWQgbW9kZSBhbmQgaW4gQ0NSRlMgZm9yIHN0YW5kYXJkL2Z1bGwgbW9kZXMgKi8KKwlkaXZpZGVycyA9IGNvbWNlcnRvX2kyY19jYWxjdWxhdGVfZGl2aWRlcnMoaTJjKTsKKwlpZiAoaTJjLT5zcGVlZF9raHogPT0gU1BFRURfSElHSF9LSFopCisJCVdSX0NDUkgoaTJjLCBkaXZpZGVycyk7CisJZWxzZQorCQlXUl9DQ1JGUyhpMmMsIGRpdmlkZXJzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbWNlcnRvX2kyY19tZXNzYWdlX2NvbXBsZXRlKHN0cnVjdCBjb21jZXJ0b19pMmMgKmkyYywgaW50IHN0YXR1cykKK3sKKwlpMmMtPm1zZ19zdGF0dXMgPSBzdGF0dXM7CisJV1JfQ05UUihpMmMsIENOVFJfU1RQKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY29tY2VydG9faTJjX21lc3NhZ2VfaW5fcHJvZ3Jlc3Moc3RydWN0IGNvbWNlcnRvX2kyYyAqaTJjKQoreworCXJldHVybiBpMmMtPm1zZ19zdGF0dXMgPiAwOworfQorCisvKgorICogV2FpdCBldmVudC4gVGhpcyBmdW5jdGlvbiBzbGVlcHMgaW4gcG9sbGluZyBtb2RlLCBpbiBpbnRlcnJ1cHQKKyAqIG1vZGUgaXQgZW5hYmxlcyBJUlEgZnJvbSBJMkMgY29yZSBhbmQgZXhpdHMgaW1tZWRpYXRlbHkuCisgKi8KK3N0YXRpYyBpbnQgY29tY2VydG9faTJjX3dhaXQoc3RydWN0IGNvbWNlcnRvX2kyYyAqaTJjLCB1OCBjbnRyKQoreworCWNudHIgJj0gfihDTlRSX0lGTEcgfCBDTlRSX0lFTik7CS8qIGNsZWFyIGJvdGggSUZMRyBhbmQgSUVOICovCisKKwlpZiAoaTJjLT5pcnEgPCAwKSB7CisJCXVsb25nIGppZmZpZXNfbWFyayA9IGppZmZpZXMgKyBjb21jZXJ0b19pMmNfY2FsY3VsYXRlX3RpbWVvdXQoaTJjLCBpMmMtPm1zZyk7CisKKwkJV1JfQ05UUihpMmMsIGNudHIpOworCQl3aGlsZSAoKFJEX0NOVFIoaTJjKSAmIENOVFJfSUZMRykgPT0gMCkgeworCQkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJCXNjaGVkdWxlKCk7CisKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGppZmZpZXNfbWFyaykpIHsKKwkJCQlkZXZfZGJnKGkyYy0+ZGV2LCAiJXM6IHBvbGxpbmcgdHJhbnNmZXIgdGltZW91dFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQljb21jZXJ0b19pMmNfbWVzc2FnZV9jb21wbGV0ZShpMmMsIC1FVElNRSk7CisJCQkJY29tY2VydG9faTJjX3Jlc2V0KGkyYyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJV1JfQ05UUihpMmMsIGNudHIgfCBDTlRSX0lFTik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX2kyY19zdGF0ZV9pZGxlKHN0cnVjdCBjb21jZXJ0b19pMmMgKmkyYywgdTggKmNudHIpCit7CisJaWYgKHVubGlrZWx5KGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX05PU1RBUlQpKSB7CisJCWkyYy0+bXNnX3N0YXRlID0gVFJfQUREUl9BQ0s7CisJfQorCWVsc2UgeworCQkqY250ciA9IENOVFJfU1RQfENOVFJfU1RBOwkvKiBTUFR8U1RBIHRvIGF1dG8gcmVjb3ZlciBmcm9tIGJ1cyBlcnJvciBzdGF0ZSB0cmFuc3BhcmVudGx5IGF0IHRoZSBzdGFydCBvZiB0aGUgdHJhbnNmZXIgKi8KKwkJaTJjLT5tc2dfc3RhdGUgPSBUUl9TVEFSVF9BQ0s7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b19pMmNfc3RhdGVfc3RhcnRfYWNrKHN0cnVjdCBjb21jZXJ0b19pMmMgKmkyYywgdTggKmNudHIpCit7CisJdTggc3RhdHVzLCBhZGRyOworCisJKmNudHIgPSAwOwkvKiB6ZXJvIElGTEcsIElFTiAoZm9yIHRoZSBpbnRlcnJ1cHQgbW9kZSBpdCB3aWxsIGJlIGVuYWJsZWQgaW4gd2FpdCBmdW5jdGlvbikgKi8KKworCXN0YXR1cyA9IFJEX1NUQVQoaTJjKTsKKworCWlmIChzdGF0dXMgPT0gU1RBVF9TVEFSVCB8fCBzdGF0dXMgPT0gU1RBVF9TVEFSVF9SRVBFQVRFRCkgeworCQlpMmMtPm1zZ19zdGF0ZSA9IFRSX0FERFJfQUNLOworCisJCWFkZHIgPSBpMmMtPm1zZy0+YWRkciA8PCAxOworCQlpZiAoaTJjLT5tc2ctPmZsYWdzICYgSTJDX01fUkQpCisJCQlhZGRyIHw9IDE7CisJCWlmIChpMmMtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9SRVZfRElSX0FERFIpCisJCQlhZGRyIF49IDE7CQkvKiBpbnZlcnQgUlcgYml0IGlmIGl0J3MgcmVxdWVzdGVkICovCisKKwkJV1JfREFUQShpMmMsIGFkZHIpOwkJLyogd3JpdGUgYWRkcmVzcyBhbmQgcmVhZC93cml0ZSBiaXQgKi8KKwl9IGVsc2UgeworCQlkZXZfZGJnKGkyYy0+ZGV2LCAiJXM6IHVuZXhwZWN0ZWQgc3RhdGUgKCUjeCkgb24gc3RhcnQgcGhhc2UsICVzXG4iLAorCQkJX19GVU5DVElPTl9fLCBzdGF0dXMsIGkyYy0+bXNnX3JldHJpZXMgPiAxID8gInJldHJ5aW5nIjoiYWJvcnRpbmciKTsKKworCQlpZiAoLS1pMmMtPm1zZ19yZXRyaWVzIDwgMCkKKwkJCWNvbWNlcnRvX2kyY19tZXNzYWdlX2NvbXBsZXRlKGkyYywgLTEpOworCQllbHNlCisJCQljb21jZXJ0b19pMmNfc3RhdGVfaWRsZShpMmMsIGNudHIpOworCX0KK30KKworc3RhdGljIHZvaWQgY29tY2VydG9faTJjX3J4KHN0cnVjdCBjb21jZXJ0b19pMmMgKmkyYykKK3sKKwl1OCBzdGF0dXMsIGNudHIgPSAwOworCityZXN0YXJ0OgorCXN3aXRjaCAoaTJjLT5tc2dfc3RhdGUpIHsKKwljYXNlIFRSX0lETEU6CisJCWNvbWNlcnRvX2kyY19zdGF0ZV9pZGxlKGkyYywgJmNudHIpOworCQlpZiAodW5saWtlbHkoaTJjLT5tc2ctPmZsYWdzICYgSTJDX01fTk9TVEFSVCkpCisJCQlnb3RvIHJlc3RhcnQ7CS8qIG5lZWRlZCB0byBhdm9pZCBldmVudCBsb3NzIGluIGludGVycnVwdCBtb2RlICovCisJCWJyZWFrOworCisJY2FzZSBUUl9TVEFSVF9BQ0s6CisJCWNvbWNlcnRvX2kyY19zdGF0ZV9zdGFydF9hY2soaTJjLCAmY250cik7CisJCWJyZWFrOworCisJY2FzZSBUUl9BRERSX0FDSzoKKwkJaWYgKHVubGlrZWx5KGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX05PU1RBUlQpKSB7CisJCQkvKiB3ZSBjYW4gZW50ZXIgdGhpcyBzdGF0ZSBpZiBza2lwIHN0YXJ0L2FkZHIgZmxhZyBpcyBzZXQsIHNvIGZha2UgZ29vZCBhY2sgKi8KKwkJCXN0YXR1cyA9IFNUQVRfQUREUl9SRF9BQ0s7CisJCX0KKwkJZWxzZSB7CisJCQlzdGF0dXMgPSBSRF9TVEFUKGkyYyk7CisJCQkvKiBjaGVjayB3aGV0aGVyIHdlIHNob3VsZCBpZ25vcmUgTkFDSyAqLworCQkJaWYgKHN0YXR1cyA9PSBTVEFUX0RBVEFfUkRfTkFDSyAmJiAoaTJjLT5tc2ctPmZsYWdzICYgSTJDX01fSUdOT1JFX05BSykpCisJCQkJc3RhdHVzID0gU1RBVF9EQVRBX1JEX0FDSzsKKwkJfQorCisJCWlmIChsaWtlbHkoc3RhdHVzID09IFNUQVRfQUREUl9SRF9BQ0spKSB7CisJCQkvKiBzdGFydCByZWNlcHRpb24gcGhhc2UgLSB3YWl0IHVudGlsIGRhdGEgaXMgcmVhZHkgYW5kIGxvb3AgaW4gUlhfREFUQV9BQ0sgc3RhdGUKKwkJCSAqIHVudGlsIHdlIHJlYWQgYWxsIHRoZSBkYXRhLCBzZW5kaW5nIEFDSyBhZnRlciBlYWNoIGJ5dGUgKGJ1dCB0aGUgbGFzdCkKKwkJCSAqLworCQkJaTJjLT5tc2dfbGVuID0gMDsKKwkJCWlmIChpMmMtPm1zZy0+bGVuID4gMSkgeworCQkJCWkyYy0+bXNnX3N0YXRlID0gVFJfREFUQV9BQ0s7CisJCQkJY250ciA9IENOVFJfQUFLOworCQkJfQorCQkJZWxzZSBpZiAoaTJjLT5tc2ctPmxlbiA9PSAxKSB7CisJCQkJaTJjLT5tc2dfc3RhdGUgPSBSWF9EQVRBX05BQ0s7CisJCQl9CisJCQllbHNlIHsJLyogbm90aGluZyB0byByZWNlaXZlLCBzZW5kIFNUT1AgYW5kIHNpZ25hbCBzdWNjZXNzICovCisJCQkJY29tY2VydG9faTJjX21lc3NhZ2VfY29tcGxldGUoaTJjLCAwKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWRldl9kYmcoaTJjLT5kZXYsICIlczogdW5leHBlY3RlZCBzdGF0ZSAoJSN4KSBvbiBhZGRyZXNzIHBoYXNlLCAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cywgaTJjLT5tc2dfcmV0cmllcyA+IDEgPyAicmV0cnlpbmciOiJhYm9ydGluZyIpOworCisJCQlpZiAoLS1pMmMtPm1zZ19yZXRyaWVzIDwgMCkKKwkJCQljb21jZXJ0b19pMmNfbWVzc2FnZV9jb21wbGV0ZShpMmMsIC0xKTsKKwkJCWVsc2UKKwkJCQljb21jZXJ0b19pMmNfc3RhdGVfaWRsZShpMmMsICZjbnRyKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVFJfREFUQV9BQ0s6CisJCXN0YXR1cyA9IFJEX1NUQVQoaTJjKTsKKworCQlpZiAobGlrZWx5KHN0YXR1cyA9PSBTVEFUX0RBVEFfUkRfQUNLKSkgeworCQkJaTJjLT5tc2ctPmJ1ZltpMmMtPm1zZ19sZW4rK10gPSBSRF9EQVRBKGkyYyk7CisJCQlpZiAobGlrZWx5KGkyYy0+bXNnLT5sZW4gLSBpMmMtPm1zZ19sZW4gPiAxKSkgeworCQkJCWNudHIgPSBDTlRSX0FBSzsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWkyYy0+bXNnX3N0YXRlID0gUlhfREFUQV9OQUNLOworCQkJCS8qIE5BQ0sgc2hvdWxkIGJlIHRyYW5zbWl0dGVkIG9uIHRoZSBsYXN0IGJ5dGUgKi8KKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWRldl9kYmcoaTJjLT5kZXYsICIlczogdW5leHBlY3RlZCBzdGF0ZSAoJSN4KSBvbiByZWFkIHBoYXNlXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQljb21jZXJ0b19pMmNfbWVzc2FnZV9jb21wbGV0ZShpMmMsIC0xKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUlhfREFUQV9OQUNLOgorCQlzdGF0dXMgPSBSRF9TVEFUKGkyYyk7CisJCWlmIChsaWtlbHkoc3RhdHVzID09IFNUQVRfREFUQV9SRF9OQUNLKSkgeworCQkJaTJjLT5tc2ctPmJ1ZltpMmMtPm1zZ19sZW4rK10gPSBSRF9EQVRBKGkyYyk7CisJCQljb21jZXJ0b19pMmNfbWVzc2FnZV9jb21wbGV0ZShpMmMsIDApOworCQl9CisJCWVsc2UgeworCQkJZGV2X2RiZyhpMmMtPmRldiwgIiVzOiB1bmV4cGVjdGVkIHN0YXRlICglI3gpIG9uIGZpbmlzaGluZyByZWFkIHBoYXNlXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQljb21jZXJ0b19pMmNfbWVzc2FnZV9jb21wbGV0ZShpMmMsIC0xKTsKKwkJfQorCX0KKworCS8qIG5vIHdhaXQgaWYgd2UgY29tcGxldGVkIG1lc3NhZ2UgKi8KKwlpZiAoY29tY2VydG9faTJjX21lc3NhZ2VfaW5fcHJvZ3Jlc3MoaTJjKSkKKwkJY29tY2VydG9faTJjX3dhaXQoaTJjLCBjbnRyKTsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9faTJjX3R4KHN0cnVjdCBjb21jZXJ0b19pMmMgKmkyYykKK3sKKwl1OCBzdGF0dXMsIGNudHIgPSAwOworCityZXN0YXJ0OgorCXN3aXRjaCAoaTJjLT5tc2dfc3RhdGUpIHsKKwljYXNlIFRSX0lETEU6CisJCWNvbWNlcnRvX2kyY19zdGF0ZV9pZGxlKGkyYywgJmNudHIpOworCQlpZiAodW5saWtlbHkoaTJjLT5tc2ctPmZsYWdzICYgSTJDX01fTk9TVEFSVCkpCisJCQlnb3RvIHJlc3RhcnQ7CS8qIG5lZWRlZCB0byBhdm9pZCBldmVudCBsb3NzIGluIGludGVycnVwdCBtb2RlICovCisJCWJyZWFrOworCisJY2FzZSBUUl9TVEFSVF9BQ0s6CisJCWNvbWNlcnRvX2kyY19zdGF0ZV9zdGFydF9hY2soaTJjLCAmY250cik7CisJCWJyZWFrOworCisJY2FzZSBUUl9BRERSX0FDSzoKKwkJaWYgKHVubGlrZWx5KGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX05PU1RBUlQpKSB7CisJCQkvKiB3ZSBjYW4gZW50ZXIgdGhpcyBzdGF0ZSBpZiBza2lwIHN0YXJ0L2FkZHIgZmxhZyBpcyBzZXQsIHNvIGZha2UgZ29vZCBhY2sgKi8KKwkJCXN0YXR1cyA9IFNUQVRfQUREUl9XUl9BQ0s7CisJCX0KKwkJZWxzZSB7CisJCQlzdGF0dXMgPSBSRF9TVEFUKGkyYyk7CisJCQlpZiAoc3RhdHVzID09IFNUQVRfREFUQV9XUl9OQUNLICYmIChpMmMtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9JR05PUkVfTkFLKSkKKwkJCQlzdGF0dXMgPSBTVEFUX0RBVEFfV1JfQUNLOworCQl9CisKKwkJaWYgKGxpa2VseShzdGF0dXMgPT0gU1RBVF9BRERSX1dSX0FDSykpIHsKKwkJCS8qIHN0YXJ0IHJlY2VwdGlvbiBwaGFzZSAtIHdhaXQgdW50aWwgZGF0YSBpcyByZWFkeSBhbmQgbG9vcCBpbiBUWF9EQVRBX0FDSyBzdGF0ZQorCQkJICogdW50aWwgd2UgcmVhZCBhbGwgdGhlIGRhdGEsIHNlbmRpbmcgQUNLIGFmdGVyIGVhY2ggYnl0ZSAoYnV0IHRoZSBsYXN0KQorCQkJICovCisJCQlpMmMtPm1zZ19zdGF0ZSA9IFRSX0RBVEFfQUNLOworCQkJaTJjLT5tc2dfbGVuID0gMDsKKwkJCWlmIChsaWtlbHkoaTJjLT5tc2ctPmxlbiAhPSAwKSkgeworCQkJCVdSX0RBVEEoaTJjLCBpMmMtPm1zZy0+YnVmW2kyYy0+bXNnX2xlbisrXSk7CisJCQkJLy9wcmludGsoImNvbWNlcnRvX2kyY190eDogaTJjLT5tc2ctPmJ1ZltpMmMtPm1zZ19sZW4gLSAxXT0lZFxuIiwgaTJjLT5tc2ctPmJ1ZltpMmMtPm1zZ19sZW4gLSAxXSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQkvKiBub3RoaW5nIHRvIHRyYW5zbWl0LCBzZW5kIFNUT1AgYW5kIHNpZ25hbCBzdWNjZXNzICovCisJCQkJY29tY2VydG9faTJjX21lc3NhZ2VfY29tcGxldGUoaTJjLCAwKTsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWRldl9kYmcoaTJjLT5kZXYsICIlczogdW5leHBlY3RlZCBzdGF0ZSAoJSN4KSBvbiBhZGRyZXNzIHBoYXNlLCAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cywgaTJjLT5tc2dfcmV0cmllcyA+IDEgPyAicmV0cnlpbmciOiJhYm9ydGluZyIpOworCisJCQlpZiAoLS1pMmMtPm1zZ19yZXRyaWVzIDwgMCkKKwkJCQljb21jZXJ0b19pMmNfbWVzc2FnZV9jb21wbGV0ZShpMmMsIC0xKTsKKwkJCWVsc2UKKwkJCQljb21jZXJ0b19pMmNfc3RhdGVfaWRsZShpMmMsICZjbnRyKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgVFJfREFUQV9BQ0s6CisJCXN0YXR1cyA9IFJEX1NUQVQoaTJjKTsKKwkJaWYgKHN0YXR1cyA9PSBTVEFUX0RBVEFfV1JfTkFDSyAmJiAoaTJjLT5tc2ctPmZsYWdzICYgSTJDX01fSUdOT1JFX05BSykpCisJCQlzdGF0dXMgPSBTVEFUX0RBVEFfV1JfQUNLOworCisJCWlmIChsaWtlbHkoc3RhdHVzID09IFNUQVRfREFUQV9XUl9BQ0spKSB7CisJCQlpZiAoaTJjLT5tc2ctPmxlbiA+IGkyYy0+bXNnX2xlbikKKwkJCQlXUl9EQVRBKGkyYywgaTJjLT5tc2ctPmJ1ZltpMmMtPm1zZ19sZW4rK10pOworCQkJZWxzZQorCQkJCWNvbWNlcnRvX2kyY19tZXNzYWdlX2NvbXBsZXRlKGkyYywgMCk7CisJCX0KKwkJZWxzZSB7CisJCQlkZXZfZGJnKGkyYy0+ZGV2LCAiJXM6IHVuZXhwZWN0ZWQgc3RhdGUgKCUjeCkgb24gcmVhZCBkYXRhIHBoYXNlXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQljb21jZXJ0b19pMmNfbWVzc2FnZV9jb21wbGV0ZShpMmMsIC0xKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoY29tY2VydG9faTJjX21lc3NhZ2VfaW5fcHJvZ3Jlc3MoaTJjKSkKKwkJY29tY2VydG9faTJjX3dhaXQoaTJjLCBjbnRyKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGNvbWNlcnRvX2kyY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBjb21jZXJ0b19pMmMgKmkyYyA9IGRldl9pZDsKKworCWlmICghKFJEX0NOVFIoaTJjKSAmIENOVFJfSUZMRykpCisJCWdvdG8gbm9uZTsKKworCS8qIElSUSBlbmFibGUvZGlzYWJsZSBsb2dpYyBpcyBoaWRkZW4gaW4gc3RhdGUgaGFuZGxlcnMsIGFsbCB3ZSBuZWVkIGlzIHRvIHdha2UKKwkgKiBwcm9jZXNzIHdoZW4gbWVzc2FnZSBjb21wbGV0ZWQuCisJICovCisJaWYgKGkyYy0+bXNnLT5mbGFncyAmIEkyQ19NX1JEKQorCQljb21jZXJ0b19pMmNfcngoaTJjKTsKKwllbHNlCisJCWNvbWNlcnRvX2kyY190eChpMmMpOworCisJaWYgKCFjb21jZXJ0b19pMmNfbWVzc2FnZV9pbl9wcm9ncmVzcyhpMmMpKSB7CisJCVdSX0NOVFIoaTJjLCBSRF9DTlRSKGkyYykgJiB+Q05UUl9JRU4pOwkvKiBkaXNhYmxlIGludGVycnVwdCB1bmNvbmRpdGlvbmFsbHkgKi8KKwkJd2FrZV91cCgmaTJjLT53YWl0KTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Citub25lOgorCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIHZvaWQgY29tY2VydG9faTJjX21lc3NhZ2VfcHJvY2VzcyhzdHJ1Y3QgY29tY2VydG9faTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICptc2cpCit7CisJaTJjLT5tc2cgPSBtc2c7CisJaTJjLT5tc2dfc3RhdGUgPSBUUl9JRExFOworCWkyYy0+bXNnX3N0YXR1cyA9IDE7CisJaTJjLT5tc2dfcmV0cmllcyA9IGkyYy0+YWRhcHRlci0+cmV0cmllczsKKworcG9sbGluZ19tb2RlOgorCWlmIChtc2ctPmZsYWdzICYgSTJDX01fUkQpCisJCWNvbWNlcnRvX2kyY19yeChpMmMpOworCWVsc2UKKwkJY29tY2VydG9faTJjX3R4KGkyYyk7CisKKwlpZiAoaTJjLT5pcnEgPCAwKSB7CisJCS8qaWYgKGkyYy0+bXNnICE9IE5VTEwpKi8KKwkJCWdvdG8gcG9sbGluZ19tb2RlOworCX0KKwllbHNlIHsKKwkJaW50IHRpbWVvdXQsIHJlczsKKwkJdWxvbmcgZmxhZ3M7CisKKwkJdGltZW91dCA9IGNvbWNlcnRvX2kyY19jYWxjdWxhdGVfdGltZW91dChpMmMsIG1zZyk7CisKKwkJcmVzID0gd2FpdF9ldmVudF90aW1lb3V0KGkyYy0+d2FpdCwgaTJjLT5tc2dfc3RhdHVzIDw9IDAsIHRpbWVvdXQpOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCQkvKiBjaGVjayBpZiB3ZSB0aW1lZCBvdXQgYW5kIHNldCByZXNwZWN0aXZlIGVycm9yIGNvZGVzICovCisJCWlmIChyZXMgPT0gMCkgeworCQkJaWYgKGNvbWNlcnRvX2kyY19tZXNzYWdlX2luX3Byb2dyZXNzKGkyYykpIHsKKwkJCQlkZXZfZGJnKGkyYy0+ZGV2LCAiJXM6IGludGVycnVwdCB0cmFuc2ZlciB0aW1lb3V0XG4iLCBfX0ZVTkNUSU9OX18pOworCQkJCWNvbWNlcnRvX2kyY19tZXNzYWdlX2NvbXBsZXRlKGkyYywgLUVUSU1FKTsKKwkJCQljb21jZXJ0b19pMmNfcmVzZXQoaTJjKTsKKwkJCX0KKwkJfQorCisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9Cit9CisKKy8qCisgKiBHZW5lcmljIG1hc3RlciB0cmFuc2ZlciBlbnRyeXBvaW50LgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHByb2Nlc3NlZCBtZXNzYWdlcyBvciBlcnJvciB2YWx1ZQorICovCitzdGF0aWMgaW50IGNvbWNlcnRvX2kyY19tYXN0ZXJfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpMmNfbXNnIG1zZ3NbXSwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgY29tY2VydG9faTJjICppMmMgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXB0ZXIpOworCWludCBpOworCisJZGV2X2RiZyhpMmMtPmRldiwgIiVzOiAlZCBtZXNzYWdlcyB0byBwcm9jZXNzXG4iLCBfX0ZVTkNUSU9OX18sIG51bSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJZGV2X2RiZyhpMmMtPmRldiwgIiVzOiBtZXNzYWdlICMlZDogYWRkcj0lI3gsIGZsYWdzPSUjeCwgbGVuPSV1XG4iLCBfX0ZVTkNUSU9OX18sCisJCQlpLCBtc2dzW2ldLmFkZHIsIG1zZ3NbaV0uZmxhZ3MsIG1zZ3NbaV0ubGVuKTsKKworCQljb21jZXJ0b19pMmNfbWVzc2FnZV9wcm9jZXNzKGkyYywgJm1zZ3NbaV0pOworCisJCWlmIChpMmMtPm1zZ19zdGF0dXMgPCAwKSB7CisJCQlkZXZfZGJnKGkyYy0+ZGV2LCAiJXM6IHRyYW5zZmVyIGZhaWxlZCBvbiBtZXNzYWdlICMlZCAoYWRkcj0lI3gsIGZsYWdzPSUjeCwgbGVuPSV1KVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGksIG1zZ3NbaV0uYWRkciwgbXNnc1tpXS5mbGFncywgbXNnc1tpXS5sZW4pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaTJjLT5tc2dfc3RhdHVzID09IC0xKQorCQlpMmMtPm1zZ19zdGF0dXMgPSAtRUlPOworCisJaWYgKGkyYy0+bXNnX3N0YXR1cyA9PSAwKQorCQlpMmMtPm1zZ19zdGF0dXMgPSBudW07CisKKwlyZXR1cm4gaTJjLT5tc2dfc3RhdHVzOworfQorCitzdGF0aWMgdTMyIGNvbWNlcnRvX2kyY19mdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gKEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUwpOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gY29tY2VydG9faTJjX2FsZ28gPSB7CisJLm1hc3Rlcl94ZmVyCT0gY29tY2VydG9faTJjX21hc3Rlcl94ZmVyLAorCS5mdW5jdGlvbmFsaXR5CT0gY29tY2VydG9faTJjX2Z1bmN0aW9uYWxpdHksCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGNvbWNlcnRvX2kyY19hZGFwdGVyID0geworCS5uYW1lCQk9ICJjb21jZXJ0b19pMmMiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuYWxnbwkJPSAmY29tY2VydG9faTJjX2FsZ28sCisJLnRpbWVvdXQJPSAwLAkvKiA8PSB6ZXJvIG1lYW5zIHRoYXQgd2UgY2FsY3VsYXRlIHRpbWVvdXQgaW4gcnVuLXRpbWUsIGNhbiBiZSBjaGFuZ2VkIHdpdGggaW9jdGwgY2FsbCAqLworCS5yZXRyaWVzCT0gMCwJLyogbm8gcmV0cmllcyBieSBkZWZhdWx0IC0gbGV0IHRoZSB1c2VyIGRlY2lkZSB3aGF0J3MgdGhlIGJlc3QsIGNhbiBiZSBjaGFuZ2VkIHdpdGggaW9jdGwgY2FsbCAqLworfTsKKworc3RhdGljIGludCBjb21jZXJ0b19pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY29tY2VydG9faTJjICppMmM7CisJc3RydWN0IHJlc291cmNlICppcnE7CisJaW50IHJlcyA9IC0xOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCisJLyogUHV0IHRoZSBJMkMgZGV2aWNlIE91dC1PZi1SZXNldCovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9JMkMsMCk7CisKKwkvKiBDbG9jayBkaXZpZGVyIGNvbmZpZ3VyYXRpb24sIGdldCB0aGUgaTJjIGNsb2NrKi8KKwljbGtfaTJjID0gY2xrX2dldChOVUxMLCAic3BpX2kyYyIpOworCWlmIChJU19FUlIoY2xrX2kyYykpeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gb2J0YWluIGkyYyBjbG9jazogJWxkXG4iLCBfX2Z1bmNfXywgUFRSX0VSUihjbGtfaTJjKSk7CisJCXJldHVybiBQVFJfRVJSKGNsa19pMmMpOworCX0KKworCS8qRW5hYmxlIHRoZSBpMmMgY2xvY2sgKi8KKwlyZXMgPSBjbGtfZW5hYmxlKGNsa19pMmMpOyAKKwlpZiAocmVzKXsKKwkJcHJfZXJyKCIlczogaTJjIGNsb2NrIGZhaWxlZCB0byBlbmFibGU6XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlpMmMgPSBremFsbG9jKHNpemVvZigqaTJjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGkyYyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBmYWlsZWQgYWxsb2NhdGUgbWVtb3J5XG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXMgPSAtRU5PTUVNOworCQlnb3RvIGVycjA7CisJfQorCisJaTJjLT5hZGFwdGVyID0gJmNvbWNlcnRvX2kyY19hZGFwdGVyOworCWkyYy0+YWRhcHRlci0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaTJjLT5kZXYgPSAmcGRldi0+ZGV2OworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmaTJjLT53YWl0KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGkyYyk7CisJaTJjX3NldF9hZGFwZGF0YSgmY29tY2VydG9faTJjX2FkYXB0ZXIsIGkyYyk7CisKKwlpMmMtPmlvID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoaTJjLT5pbyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzOiBubyBJTyByZWdpb24gc3BlY2lmaWVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXMgPSAtRU5PRU5UOworCQlnb3RvIGVycjE7CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaTJjLT5pby0+c3RhcnQsIGkyYy0+aW8tPmVuZCAtIGkyYy0+aW8tPnN0YXJ0ICsgMSwgIkkyQyIpKSB7CisJCWRldl9lcnIoaTJjLT5kZXYsICIlczogZmFpbGVkIHRvIHJlcXVlc3QgbWVtb3J5IHJlZ2lvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBlcnIxOworCX0KKworCWkyYy0+bWVtYmFzZSA9IEFQQl9WQUREUihpMmMtPmlvLT5zdGFydCk7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChpcnEgPT0gTlVMTCAmJiAhZm9yY2VfcG9sbCkgeworCQlkZXZfd2FybihpMmMtPmRldiwgIiVzOiBubyBJUlEgc3BlY2lmaWVkIGluIHJlc291cmNlcywgcG9sbGluZyBtb2RlIGZvcmNlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZm9yY2VfcG9sbCA9IDE7CisJCWkyYy0+aXJxID0gLTE7CisJfQorCisJaWYgKHNwZWVkID09IDApIHsKKwkJaTJjLT5zcGVlZF9raHogPSBTUEVFRF9OT1JNQUxfS0haOworCX0KKwllbHNlIGlmIChzcGVlZCA9PSAxKSB7CisJCWkyYy0+c3BlZWRfa2h6ID0gU1BFRURfRlVMTF9LSFo7CisJfQorCWVsc2UgaWYgKHNwZWVkID09IDIpIHsKKwkJaTJjLT5zcGVlZF9raHogPSBTUEVFRF9ISUdIX0tIWjsKKwl9CisJZWxzZSB7CisJCWRldl9lcnIoaTJjLT5kZXYsICIlczogaW52YWxpZCAnc3BlZWQnIG1vZHVsZSBvcHRpb24gcHJvdmlkZWQgKCVkLCBtdXN0IGJlIDAsMSwyIGZvciBub3JtYWwvZnVsbC9oaWdoIG1vZGVzKVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgc3BlZWQpOworCQlnb3RvIGVycjI7CisJfQorCisKKwljb21jZXJ0b19pMmNfcmVzZXQoaTJjKTsKKworCWlmICghZm9yY2VfcG9sbCkgeworCQlpMmMtPmlycSA9IGlycS0+c3RhcnQ7CisKKwkJcmVzID0gcmVxdWVzdF9pcnEoaTJjLT5pcnEsIGNvbWNlcnRvX2kyY19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCAiSTJDIiwgaTJjKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCWRldl93YXJuKGkyYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byByZXF1ZXN0IElSUSVkLCBwb2xsaW5nIG1vZGUgZm9yY2VkXG4iLCBfX0ZVTkNUSU9OX18sIGkyYy0+aXJxKTsKKwkJCWZvcmNlX3BvbGwgPSAxOworCQkJaTJjLT5pcnEgPSAtMTsKKwkJfQorCX0KKwllbHNlCisJCWkyYy0+aXJxID0gLTE7CisKKwlpZiAoaTJjX2FkZF9hZGFwdGVyKCZjb21jZXJ0b19pMmNfYWRhcHRlcikgIT0gMCkgeworCQlkZXZfZXJyKGkyYy0+ZGV2LCAiJXM6IGZhaWxlZCB0byBhZGQgSTJDIGFkYXB0ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXJyMzsKKwl9CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlczogSTJDIGFkYXB0ZXIgcmVnaXN0ZXJlZFxuIiwgX19GVU5DVElPTl9fKTsKKworCXJldHVybiAwOworCitlcnIzOgorCWlmIChpMmMtPmlycSA+PSAwKQorCQlmcmVlX2lycShpMmMtPmlycSwgaTJjKTsKKworZXJyMjoKKwlyZWxlYXNlX21lbV9yZWdpb24oaTJjLT5pby0+c3RhcnQsIGkyYy0+aW8tPmVuZCAtIGkyYy0+aW8tPmVuZCArIDEpOworCitlcnIxOgorCWtmcmVlKGkyYyk7CisKK2VycjA6CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBjb21jZXJ0b19pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNvbWNlcnRvX2kyYyAqaTJjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZXZfZGJnKGkyYy0+ZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWkyY19kZWxfYWRhcHRlcihpMmMtPmFkYXB0ZXIpOworCisJaWYgKGkyYy0+aXJxID49IDApCisJCWZyZWVfaXJxKGkyYy0+aXJxLCBpMmMpOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKGkyYy0+aW8tPnN0YXJ0LCBpMmMtPmlvLT5lbmQgLSBpMmMtPmlvLT5zdGFydCArIDEpOworCisJa2ZyZWUoaTJjKTsKKworCS8qIERpc2FibGUgdGhlIENsb2NrICovCisJY2xrX2Rpc2FibGUoY2xrX2kyYyk7CisJY2xrX3B1dChjbGtfaTJjKTsKKworCS8qIFB1dCB0aGUgSTJDIGRldmljZSBpbiByZXNldCBzdGF0ZSovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9JMkMsMSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBjb21jZXJ0b19pMmNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJLyogTm8gbmVlZCB0byBzdXNwZW5kIGNsaWVudCBkcml2ZXJzIGhlcmUuIEJlY2F1c2UgY2xpZW50cyBhcmUKKwkgKiBjaGlsZHJlbiwgY2xpZW50IGRyaXZlcnMgZ2V0IHN1c3BlbmRlZCBiZWZvcmUgYWRhcHRlciBkcml2ZXIKKwkqLworCQorCS8qIFNvIGRvIHRoZSBDbG9jayBkaXNhYmxlIGhlcmUgLCBUaGlzIGNsb2NrIGlzIGRlcGVuZHMgdXBvbiBMZWdhY3kgU1BJKi8KKwljbGtfZGlzYWJsZShjbGtfaTJjKTsKKwlyZXR1cm4gMDsKK30KKwkKK3N0YXRpYyBpbnQgY29tY2VydG9faTJjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJLyogTm8gbmVlZCB0byBzdXNwZW5kIGNsaWVudCBkcml2ZXJzIGhlcmUuIEJlY2F1c2UgY2xpZW50cyBhcmUKKwkgKiBjaGlsZHJlbiwgY2xpZW50IGRyaXZlcnMgZ2V0IHN1c3BlbmRlZCBiZWZvcmUgYWRhcHRlciBkcml2ZXIKKwkqLworCisJLyogU28gZG8gdGhlIENsb2NrIEVuYWJsZSBoZXJlICwgVGhpcyBjbG9jayBpcyBkZXBlbmRzIHVwb24gTGVnYWN5IFNQSSovCisJcmV0ID0gY2xrX2VuYWJsZShjbGtfaTJjKTsKKwlpZiAocmV0KQorCXsKKwkJcHJfZXJyKCIlczogSTJDIGNsb2NrIGVuYWJsZSBmYWlsZWQgXG4iLF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY29tY2VydG9faTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJjb21jZXJ0b19pMmMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IGNvbWNlcnRvX2kyY19wcm9iZSwKKwkucmVtb3ZlCT0gY29tY2VydG9faTJjX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGNvbWNlcnRvX2kyY19zdXNwZW5kLAorCS5yZXN1bWUgID0gY29tY2VydG9faTJjX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgY29tY2VydG9faTJjX2luaXQodm9pZCkKK3sKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjb21jZXJ0b19pMmNfZHJpdmVyKSkgeworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb21jZXJ0b19pMmNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjb21jZXJ0b19pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoY29tY2VydG9faTJjX2luaXQpOworbW9kdWxlX2V4aXQoY29tY2VydG9faTJjX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNlMDkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwpAQCAtMCwwICsxLDE1IEBACisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIGNoaXAgZHJpdmVycyBjb25maWd1cmF0aW9uCisjCisjICoqKiBERVBSRUNBVEVEISBEbyBub3QgYWRkIG5ldyBlbnRyaWVzISBTZWUgTWFrZWZpbGUgKioqCisjCisKK21lbnUgIk1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydCIKKworY29uZmlnIEVFUFJPTV9BVAorCXRyaXN0YXRlICJJMmMtZWVwcm9tLWF0IgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgVGhpcyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gcmVhZCBhbmQgd3JpdGUgdGhlIEVFUFJPTSBhbmQgcmVzZXQgdGhlIGNoaXAuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvY2hpcHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhMWUyYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIG1pc2NlbGxhbmVvdXMgSTJDIGNoaXAgZHJpdmVycy4KKyMKKyMgRG8gbm90IGFkZCBuZXcgZHJpdmVycyB0byB0aGlzIGRpcmVjdG9yeSEgSXQgaXMgREVQUkVDQVRFRC4KKyMKKyMgRGV2aWNlIGRyaXZlcnMgYXJlIGJldHRlciBncm91cGVkIGFjY29yZGluZyB0byB0aGUgZnVuY3Rpb25hbGl0eSB0aGV5CisjIGltcGxlbWVudCByYXRoZXIgdGhhbiB0byB0aGUgYnVzIHRoZXkgYXJlIGNvbm5lY3RlZCB0by4gSW4gcGFydGljdWxhcjoKKyMgKiBIYXJkd2FyZSBtb25pdG9yaW5nIGNoaXAgZHJpdmVycyBnbyB0byBkcml2ZXJzL2h3bW9uCisjICogUlRDIGNoaXAgZHJpdmVycyBnbyB0byBkcml2ZXJzL3J0YworIyAqIEkvTyBleHBhbmRlciBkcml2ZXJzIGdvIHRvIGRyaXZlcnMvZ3BpbworIworCitvYmotJChDT05GSUdfRUVQUk9NX0FUKQkrPSBlZXByb20ubworCitpZmVxICgkKENPTkZJR19JMkNfREVCVUdfQ0hJUCkseSkKK0VYVFJBX0NGTEFHUyArPSAtRERFQlVHCitlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2VlcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZWFhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYwpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitNT0RVTEVfQVVUSE9SKCJNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkkyQyBFRVBST00gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgQ09ORklHX0VFUFJPTV9QQUdFX1NJWkUgMTI4CisjZGVmaW5lIENPTkZJR19FRVBST01fQ0hJUF9TSVpFICg1MTIqMTAyNCkKKyNkZWZpbmUgQ09ORklHX0VFUFJPTV9XUklURV9USU1FIDUKKworI2RlZmluZSBFRVBST01fUEFHRQkoQ09ORklHX0VFUFJPTV9QQUdFX1NJWkUpCisjZGVmaW5lIEVFUFJPTV9TSVpFCShDT05GSUdfRUVQUk9NX0NISVBfU0laRSkKKyNkZWZpbmUgRUVQUk9NX1dBSVQJKENPTkZJR19FRVBST01fV1JJVEVfVElNRSkKKworI2RlZmluZSBEUlZfTkFNRQkiZWVwcm9tIgorCitzdHJ1Y3QgaTJjX2NsaWVudCAqZWVwcm9tX2kyY19jbGllbnQ7CisKK3N0YXRpYyBpbmxpbmUgaW50IGVlcHJvbV9zZXRfYWRkcmVzcyhzdHJ1Y3QgaTJjX21zZyAqbXNnLCB1MzIgYWRkcikKK3sKKwlpbnQgYWRkcl9sZW4gPSAxOworCisJbXNnLT5idWZbMF0gPSBhZGRyID4+IDg7CisJbXNnLT5sZW4rKzsKKwlpZiAoRUVQUk9NX1NJWkUgPiAyNTYpIHsKKwkJbXNnLT5idWZbMV0gPSBhZGRyICYgMjU1OworCQltc2ctPmxlbisrOworCQlhZGRyX2xlbisrOworCX0KKworCXJldHVybiBhZGRyX2xlbjsKK30KKworc3RhdGljIGludCBlZXByb21fc2V0X3BvaW50ZXIoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIGFkZHIpCit7CisJaW50IGVycjsKKwl1OCBidWZbMl07CisJc3RydWN0IGkyY19tc2cgbXNnID0KKwl7CisJCS5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkuZmxhZ3MgPSAwLAorCQkubGVuID0gMCwKKwkJLmJ1ZiA9IGJ1ZiwKKwl9OworCisJZWVwcm9tX3NldF9hZGRyZXNzKCZtc2csIGFkZHIpOworCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgJm1zZywgMSkpICE9IDEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJyZWFkIHRyYW5zYWN0aW9uIGZhaWxlZCAtIGNvdWxkbid0IHNldCBhZGRyZXNzLCBjb2RlOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWVwcm9tX3JlYWRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB2b2lkICpidWYsIGludCBsZW4pCit7CisJaW50IGVyciwgaSA9IDA7CisJc3RydWN0IGkyY19tc2cJbXNnID0KKwl7CisJCS5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJLmxlbiA9IGxlbiwKKwkJLmJ1ZiA9IGJ1ZiwKKwl9OworCisJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCAmbXNnLCAxKSkgIT0gMSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlYWQgdHJhbnNhY3Rpb24gZmFpbGVkLCBjb2RlOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWVwcm9tX3dyaXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIGFkZHIsIHZvaWQgKmJ1Ziwgdm9pZCAqc3JjLCBpbnQgbGVuKQoreworCWludCBlcnI7CisJc3RydWN0IGkyY19tc2cgbXNnID0KKwl7CisJCS5hZGRyID0gY2xpZW50LT5hZGRyLAorCQkuZmxhZ3MgPSAwLAorCQkubGVuID0gbGVuLAorCQkuYnVmID0gYnVmLAorCX07CisKKwkvKiBzZXQgYWRkcmVzcyBhbmQgY29weSBkYXRhIGp1c3QgYWZ0ZXIgYWRkcmVzcyBieXRlcyAqLworCW1lbWNweShidWYgKyBlZXByb21fc2V0X2FkZHJlc3MoJm1zZywgYWRkciksIHNyYywgbGVuKTsKKworCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgJm1zZywgMSkpICE9IDEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ3cml0ZSB0cmFuc2FjdGlvbiBmYWlsZWQsIGNvZGU6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZGVsYXkoRUVQUk9NX1dBSVQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWVwcm9tX3JlYWRfd3JpdGUoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwgbG9mZl90IG9mZnMsIHNpemVfdCBsZW4sIGludCByZWFkKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CisJaW50IGNvdW50OworCisJaWYgKG9mZnMgKyBsZW4gPiBFRVBST01fU0laRSkKKwkJbGVuID0gRUVQUk9NX1NJWkUgLSBvZmZzOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCisJaWYgKHJlYWQpIHsKKwkJY291bnQgPSBlZXByb21fc2V0X3BvaW50ZXIoY2xpZW50LCBvZmZzKTsJLyogZm9yIHRoZSByZWFkIHRyYW5zYWN0aW9uIHNldCBhZGRyZXNzIG9uY2UgYXQgc3RhcnQgKi8KKwkJaWYgKGNvdW50ID09IDApCisJCQljb3VudCA9IGVlcHJvbV9yZWFkX2RhdGEoY2xpZW50LCBidWYsIGxlbik7CisJCWlmIChjb3VudCA9PSAwKQorCQkJY291bnQgPSBsZW47CisJfQorCWVsc2UgeworCQl1OCAqdHhidWYgPSBrbWFsbG9jKEVFUFJPTV9QQUdFICsgMiwgR0ZQX0tFUk5FTCk7CisJCXUzMiB0bXA7CisJCWludCByZXEsIGVycjsKKworCQlpZiAodHhidWYgIT0gTlVMTCkgeworCQkJLyogd3JpdGUgYWxsIGRhdGEgaW4gbm8gbW9yZSB0aGFuIG9uZSBwYWdlIHNpemUgdHJhbnNhY3Rpb24gKi8KKwkJCWNvdW50ID0gMDsKKworCQkJZG8geworCQkJCXRtcCA9IChvZmZzICsgY291bnQgKyBFRVBST01fUEFHRSkgJiB+KEVFUFJPTV9QQUdFIC0gMSk7CisJCQkJcmVxID0gdG1wIC0gb2ZmcyAtIGNvdW50OworCQkJCWlmIChyZXEgKyBjb3VudCA+IGxlbikKKwkJCQkJcmVxID0gbGVuIC0gY291bnQ7CisKKwkJCQllcnIgPSBlZXByb21fd3JpdGVfZGF0YShjbGllbnQsIG9mZnMrY291bnQsIHR4YnVmLCBidWYrY291bnQsIHJlcSk7CisJCQkJaWYgKGVyciA8IDApIHsKKwkJCQkJY291bnQgPSBlcnI7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWNvdW50ICs9IHJlcTsKKwkJCX0gd2hpbGUgKGNvdW50IDwgbGVuKTsKKworCQkJa2ZyZWUodHhidWYpOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCWNvdW50ID0gLUVOT01FTTsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZWVwcm9tX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBpID0gMDsKKwlsb2ZmX3Qgb2ZmID0gMHg1MDsKKwlzaXplX3QgcmV0LCBjb3VudCA9IDQ7CisKKwlyZXQgPSBlZXByb21fcmVhZF93cml0ZSgmZGV2LT5rb2JqLCBidWYsIG9mZiArIGksIGNvdW50LCAxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVlcHJvbV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlsb2ZmX3Qgb2ZmID0gMHg1MDsKKworCXJldHVybiBlZXByb21fcmVhZF93cml0ZSgmZGV2LT5rb2JqLCBidWYsIG9mZiwgY291bnQsIDApOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZWVwcm9tX2F0dHIgPSBfX0FUVFIoZWVwcm9tLCAwNjQ0LCBlZXByb21fcmVhZCwgZWVwcm9tX3dyaXRlKTsKKworaW50IGVlcHJvbV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVyciA9IDA7CisKKwljbGllbnQgPSBlZXByb21faTJjX2NsaWVudDsKKworCWVyciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldi5rb2JqLCAmZWVwcm9tX2F0dHIpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIG5vZGVcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZWVwcm9tX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmY2xpZW50LT5kZXYua29iaiwgJmVlcHJvbV9hdHRyKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGVlcHJvbV9zdXNwZW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVlcHJvbV9yZXN1bWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKyAgICAgICAgIHJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgZWVwcm9tX3N1c3BlbmQgICAgICAgICBOVUxMCisjZGVmaW5lIGVlcHJvbV9yZXN1bWUgICAgICAgICAgTlVMTAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgZWVwcm9tX2lkdGFibGVbXSA9IHsKKwl7ICJlZXByb20iLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGVlcHJvbV9pZHRhYmxlKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGVlcHJvbV9kcml2ZXIgPSB7CisJLmlkX3RhYmxlICAgICAgID0gZWVwcm9tX2lkdGFibGUsCisJLnByb2JlCQk9IGVlcHJvbV9wcm9iZSwKKwkucmVtb3ZlIAk9IF9fZGV2ZXhpdF9wKGVlcHJvbV9yZW1vdmUpLAorCS5zdXNwZW5kICAgICAgICA9IGVlcHJvbV9zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgICA9IGVlcHJvbV9yZXN1bWUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICA9IERSVl9OQU1FLAorCQkub3duZXIgID1USElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgMHg1MCwgSTJDX0NMSUVOVF9FTkQgfTsKKworc3RhdGljIGludCBlZXByb21faW5pdCh2b2lkKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXA7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGkyY19pbmZvOworCisJaTJjX2FkYXAgPSBpMmNfZ2V0X2FkYXB0ZXIoMCk7CisJbWVtc2V0KCZpMmNfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRfaW5mbykpOworCXN0cmxjcHkoaTJjX2luZm8udHlwZSwgImVlcHJvbSIsIEkyQ19OQU1FX1NJWkUpOworCWVlcHJvbV9pMmNfY2xpZW50ID0gaTJjX25ld19wcm9iZWRfZGV2aWNlKGkyY19hZGFwLCAmaTJjX2luZm8sIG5vcm1hbF9pMmMsIE5VTEwpOworCisJaTJjX3B1dF9hZGFwdGVyKGkyY19hZGFwKTsKKworCWkyY19hZGRfZHJpdmVyKCZlZXByb21fZHJpdmVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlZXByb21fZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZlZXByb21fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZWVwcm9tX2luaXQpOworbW9kdWxlX2V4aXQoZWVwcm9tX2V4aXQpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKaW5kZXggNThkOGM2ZC4uNTA0MGNlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwpAQCAtMjksNiArMjksMTYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KIAorI2lmIGRlZmluZWQoQ09ORklHX09DRl9ETV9DUllQVCkKKyN1bmRlZiBETV9ERUJVRworI2lmZGVmIERNX0RFQlVHCisjZGVmaW5lIGRtcHJpbnRrIHByaW50aworI2Vsc2UKKyNkZWZpbmUgZG1wcmludGsoZm10LGFyZ3MuLi4pCisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG9kZXYuaD4KKyNlbmRpZiAvKiBDT05GSUdfT0NGX0RNX0NSWVBUICovCisKICNkZWZpbmUgRE1fTVNHX1BSRUZJWCAiY3J5cHQiCiAKIC8qCkBAIC0xNDYsNiArMTU2LDEwIEBACiAJc2VjdG9yX3QgaXZfb2Zmc2V0OwogCXVuc2lnbmVkIGludCBpdl9zaXplOwogCisjaWYgZGVmaW5lZChDT05GSUdfT0NGX0RNX0NSWVBUKQorCXN0cnVjdCBjcnlwdG9pbmkJY3JfZG07CS8qIE9DRiBzZXNzaW9uICovCisJdWludDY0X3QJb2NmX2NyeXB0b2lkOwkvKiBPQ0Ygc2Vzc3Npb24gSUQgKi8KKyNlbmRpZgogCS8qCiAJICogRHVwbGljYXRlZCBwZXIgY3B1IHN0YXRlLiBBY2Nlc3MgdGhyb3VnaAogCSAqIHBlcl9jcHVfcHRyKCkgb25seS4KQEAgLTI2OSw3ICsyODMsNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQllc3Npdl90Zm0gPSBwZXJfY3B1X3B0cihjYy0+Y3B1LCBjcHUpLT5pdl9wcml2YXRlLAorCQllc3Npdl90Zm0gPSBwZXJfY3B1X3B0cihjYy0+Y3B1LCBjcHUpLT5pdl9wcml2YXRlOwogCiAJCWVyciA9IGNyeXB0b19jaXBoZXJfc2V0a2V5KGVzc2l2X3RmbSwgZXNzaXYtPnNhbHQsCiAJCQkJICAgIGNyeXB0b19oYXNoX2RpZ2VzdHNpemUoZXNzaXYtPmhhc2hfdGZtKSk7CkBAIC0zMDUsNyArMzE5LDcgQEAKIAkJCQkJICAgICBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKIAkJCQkJICAgICB1OCAqc2FsdCwgdW5zaWduZWQgc2FsdHNpemUpCiB7Ci0Jc3RydWN0IGNyeXB0b19jaXBoZXIgKmVzc2l2X3RmbTsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqZXNzaXZfdGZtPU5VTEw7CiAJaW50IGVycjsKIAogCS8qIFNldHVwIHRoZSBlc3Npdl90Zm0gd2l0aCB0aGUgZ2l2ZW4gc2FsdCAqLwpAQCAtMzE1LDggKzMyOSwxMiBAQAogCQlyZXR1cm4gZXNzaXZfdGZtOwogCX0KIAorI2lmICBkZWZpbmVkKENPTkZJR19PQ0ZfRE1fQ1JZUFQpCisJaWYgKGNyeXB0b19jaXBoZXJfYmxvY2tzaXplKGVzc2l2X3RmbSkgIT0gY2MtPml2X3NpemUpIHsKKyNlbHNlCiAJaWYgKGNyeXB0b19jaXBoZXJfYmxvY2tzaXplKGVzc2l2X3RmbSkgIT0KIAkgICAgY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKGFueV90Zm0oY2MpKSkgeworI2VuZGlmCiAJCXRpLT5lcnJvciA9ICJCbG9jayBzaXplIG9mIEVTU0lWIGNpcGhlciBkb2VzICIKIAkJCSAgICAibm90IG1hdGNoIElWIHNpemUgb2YgYmxvY2sgY2lwaGVyIjsKIAkJY3J5cHRvX2ZyZWVfY2lwaGVyKGVzc2l2X3RmbSk7CkBAIC00MTksNiArNDM3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmICFkZWZpbmVkKENPTkZJR19PQ0ZfRE1fQ1JZUFQpCiBzdGF0aWMgaW50IGNyeXB0X2l2X2JlbmJpX2N0cihzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgc3RydWN0IGRtX3RhcmdldCAqdGksCiAJCQkgICAgICBjb25zdCBjaGFyICpvcHRzKQogewpAQCAtNDU5LDYgKzQ3OCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IGNyeXB0X2l2X251bGxfZ2VuKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLCB1OCAqaXYsCiAJCQkgICAgIHN0cnVjdCBkbV9jcnlwdF9yZXF1ZXN0ICpkbXJlcSkKQEAgLTYzNCwxMSArNjU0LDEzIEBACiAJLmdlbmVyYXRvciA9IGNyeXB0X2l2X2Vzc2l2X2dlbgogfTsKIAorI2lmICFkZWZpbmVkKENPTkZJR19PQ0ZfRE1fQ1JZUFQpCiBzdGF0aWMgc3RydWN0IGNyeXB0X2l2X29wZXJhdGlvbnMgY3J5cHRfaXZfYmVuYmlfb3BzID0gewogCS5jdHIJICAgPSBjcnlwdF9pdl9iZW5iaV9jdHIsCiAJLmR0cgkgICA9IGNyeXB0X2l2X2JlbmJpX2R0ciwKIAkuZ2VuZXJhdG9yID0gY3J5cHRfaXZfYmVuYmlfZ2VuCiB9OworI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRfaXZfb3BlcmF0aW9ucyBjcnlwdF9pdl9udWxsX29wcyA9IHsKIAkuZ2VuZXJhdG9yID0gY3J5cHRfaXZfbnVsbF9nZW4KQEAgLTY4Nyw2ICs3MDksMjc1IEBACiAJCWNyeXB0b19hYmxrY2lwaGVyX2FsaWdubWFzayhhbnlfdGZtKGNjKSkgKyAxKTsKIH0KIAorc3RhdGljIHZvaWQga2NyeXB0ZF9jcnlwdF9yZWFkX2RvbmUoc3RydWN0IGRtX2NyeXB0X2lvICppbyk7CitzdGF0aWMgdm9pZCBjcnlwdF9hbGxvY19yZXEoc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MsCisJCQkgICAgc3RydWN0IGNvbnZlcnRfY29udGV4dCAqY3R4KTsKK3N0YXRpYyB2b2lkIGNyeXB0X2luY19wZW5kaW5nKHN0cnVjdCBkbV9jcnlwdF9pbyAqaW8pOworc3RhdGljIHZvaWQgY3J5cHRfZGVjX3BlbmRpbmcoc3RydWN0IGRtX2NyeXB0X2lvICppbyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19PQ0ZfRE1fQ1JZUFQpCitzdHJ1Y3Qgb2NmX3dyX3ByaXYgeworCXUzMgkJCWRtX29jZl93cl9jb21wbGV0ZWQ7CS8qIE51bSBvZiB3ciBjb21wbGV0aW9ucyAqLworCXUzMgkJCWRtX29jZl93cl9wZW5kaW5nOwkvKiBOdW0gb2Ygd3IgcGVuZGluZ3MgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAlkbV9vY2Zfd3JfcXVldWU7CS8qIHdhaXRpbmcgUSwgZm9yIHdyIGNvbXBsZXRpb24gKi8KK307CisKK3N0cnVjdCBvY2ZfcmRfcHJpdiB7CisJdTMyCQkJZG1fb2NmX3JkX2NvbXBsZXRlZDsJLyogTnVtIG9mIHJkIGNvbXBsZXRpb25zICovCisJdTMyCQkJZG1fb2NmX3JkX3BlbmRpbmc7CS8qIE51bSBvZiByZCBwZW5kaW5ncyAqLworCXdhaXRfcXVldWVfaGVhZF90CWRtX29jZl9yZF9xdWV1ZTsJLyogd2FpdGluZyBRLCBmb3IgcmQgY29tcGxldGlvbiAqLworfTsKKworc3RhdGljIGludCBkbV9vY2Zfd3JfY2Ioc3RydWN0IGNyeXB0b3AgKmNycCkKK3sKKwlzdHJ1Y3Qgb2NmX3dyX3ByaXYgKm9jZl93cl9wcml2OworCisJaWYoY3JwID09IE5VTEwpIHsKKwkJcHJpbnRrKCJkbV9vY2Zfd3JfY2I6IGNycCBpcyBOVUxMISEgXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJb2NmX3dyX3ByaXYgPSAoc3RydWN0IG9jZl93cl9wcml2KiljcnAtPmNycF9vcGFxdWU7CisKKwlvY2Zfd3JfcHJpdi0+ZG1fb2NmX3dyX2NvbXBsZXRlZCsrOworCisJLyogaWYgbm8gbW9yZSBwZW5kaW5nIGZvciByZWFkLCB3YWtlIHVwIHRoZSByZWFkIHRhc2suICovCisJaWYob2NmX3dyX3ByaXYtPmRtX29jZl93cl9jb21wbGV0ZWQgPT0gb2NmX3dyX3ByaXYtPmRtX29jZl93cl9wZW5kaW5nKQorCQl3YWtlX3VwKCZvY2Zfd3JfcHJpdi0+ZG1fb2NmX3dyX3F1ZXVlKTsKKworCWNyeXB0b19mcmVlcmVxKGNycCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG1fb2NmX3JkX2NiKHN0cnVjdCBjcnlwdG9wICpjcnApCit7CisJc3RydWN0IG9jZl9yZF9wcml2ICpvY2ZfcmRfcHJpdjsKKworCWlmKGNycCA9PSBOVUxMKSB7CisJCXByaW50aygiZG1fb2NmX3JkX2NiOiBjcnAgaXMgTlVMTCEhIFxuIik7CisJCXJldHVybiAwOworCX0KKworCW9jZl9yZF9wcml2ID0gKHN0cnVjdCBvY2ZfcmRfcHJpdiopY3JwLT5jcnBfb3BhcXVlOworCisJb2NmX3JkX3ByaXYtPmRtX29jZl9yZF9jb21wbGV0ZWQrKzsKKworCS8qIGlmIG5vIG1vcmUgcGVuZGluZyBmb3IgcmVhZCwgd2FrZSB1cCB0aGUgcmVhZCB0YXNrLiAqLworCWlmKG9jZl9yZF9wcml2LT5kbV9vY2ZfcmRfY29tcGxldGVkID09IG9jZl9yZF9wcml2LT5kbV9vY2ZfcmRfcGVuZGluZykKKwkJd2FrZV91cCgmb2NmX3JkX3ByaXYtPmRtX29jZl9yZF9xdWV1ZSk7CisKKwljcnlwdG9fZnJlZXJlcShjcnApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBkbV9vY2ZfcHJvY2VzcyhzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpvdXQsCisJCXN0cnVjdCBzY2F0dGVybGlzdCAqaW4sIHVuc2lnbmVkIGludCBsZW4sIHU4ICppdiwgaW50IGl2X3NpemUsIGludCB3cml0ZSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgY3J5cHRvcCAqY3JwOworCXN0cnVjdCBjcnlwdG9kZXNjICpjcmRhID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqaW5fcGFnZSA9IHNnX3BhZ2UoaW4pOworCXN0cnVjdCBwYWdlICpvdXRfcGFnZSA9IHNnX3BhZ2Uob3V0KTsKKwlpbnQgcj0wOworCisJaWYoIWl2KSB7CisJCXByaW50aygiZG1fb2NmX3Byb2Nlc3M6IG9ubHkgQ0JDIG1vZGUgaXMgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwljcnAgPSBjcnlwdG9fZ2V0cmVxKDEpOyAgLyogb25seSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gKi8KKwlpZiAoIWNycCkgeworCQlwcmludGsoIlxuZG1fb2NmX3Byb2Nlc3M6IGNyeXB0b19nZXRyZXEgZmFpbGVkISFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljcmRhID0gY3JwLT5jcnBfZGVzYzsKKworCWNyZGEtPmNyZF9mbGFncyAgPSAod3JpdGUpPyBDUkRfRl9FTkNSWVBUOiAwOworCWNyZGEtPmNyZF9hbGcgICAgPSBjYy0+Y3JfZG0uY3JpX2FsZzsKKwljcmRhLT5jcmRfc2tpcCAgID0gMDsKKwljcmRhLT5jcmRfbGVuICAgID0gbGVuOworCWNyZGEtPmNyZF9pbmplY3QgPSAwOyAvKiBOQSAqLworCWNyZGEtPmNyZF9rbGVuICAgPSBjYy0+Y3JfZG0uY3JpX2tsZW47CisJY3JkYS0+Y3JkX2tleSAgICA9IGNjLT5jcl9kbS5jcmlfa2V5OworCisJaWYgKGl2KSB7CisJCS8vY3JkYS0+Y3JkX2ZsYWdzIHw9IChDUkRfRl9JVl9QUkVTRU5UKTsKKwkJY3JkYS0+Y3JkX2ZsYWdzIHw9IChDUkRfRl9JVl9FWFBMSUNJVCB8IENSRF9GX0lWX1BSRVNFTlQpOworCQlpZiggaXZfc2l6ZSA+IEVBTEdfTUFYX0JMT0NLX0xFTiApIHsKKwkJCXByaW50aygiZG1fb2NmX3Byb2Nlc3M6IGl2IGlzIHRvbyBiaWchIVxuIik7CisJCX0KKwkJbWVtY3B5KCZjcmRhLT5jcmRfaXYsIGl2LCBpdl9zaXplKTsKKwl9CisKKworCS8vZG1wcmludGsoImxlbjogJWRcbiIsbGVuKTsKKwljcnAtPmNycF9pbGVuID0gbGVuOyAvKiBUb3RhbCBpbnB1dCBsZW5ndGggKi8KKwkvL2NycC0+Y3JwX2ZsYWdzID0gQ1JZUFRPX0ZfQ0JJTU07CisJY3JwLT5jcnBfZmxhZ3MgPSBDUllQVE9fRl9DQklNTSB8IENSWVBUT19GX0JBVENIOworCWNycC0+Y3JwX2J1ZiA9IHBhZ2VfYWRkcmVzcyhpbl9wYWdlKSArIGluLT5vZmZzZXQ7CisJY3JwLT5jcnBfb3V0X2J1ZiA9IHBhZ2VfYWRkcmVzcyhvdXRfcGFnZSkgKyBvdXQtPm9mZnNldDsKKwljcnAtPmNycF9vcGFxdWUgPSBwcml2OworCWlmKHdyaXRlKSB7CisJCWNycC0+Y3JwX2NhbGxiYWNrID0gZG1fb2NmX3dyX2NiOworCX0KKwllbHNlIHsKKwkJY3JwLT5jcnBfY2FsbGJhY2sgPSBkbV9vY2ZfcmRfY2I7CisJfQorCWNycC0+Y3JwX3NpZCA9IGNjLT5vY2ZfY3J5cHRvaWQ7CisJciA9IGNyeXB0b19kaXNwYXRjaChjcnApOworCWlmIChyID09IEVOT01FTSkgeworCQlkbXByaW50aygiY3J5cHRvX2Rpc3BhdGNoIHJldHVybmVkIEVOT01FTSBcbiIpOworCX0KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBvY2ZfY3J5cHRfY29udmVydF9ibG9jayhzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywKKwkJCQlzdHJ1Y3QgY29udmVydF9jb250ZXh0ICpjdHgsCisJCQkJc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxLAorCQkJCWludCB3cml0ZSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZfaW4gPSBiaW9faW92ZWNfaWR4KGN0eC0+YmlvX2luLCBjdHgtPmlkeF9pbik7CisJc3RydWN0IGJpb192ZWMgKmJ2X291dCA9IGJpb19pb3ZlY19pZHgoY3R4LT5iaW9fb3V0LCBjdHgtPmlkeF9vdXQpOworCXN0cnVjdCBkbV9jcnlwdF9yZXF1ZXN0ICpkbXJlcTsKKwl1OCBpdltjYy0+aXZfc2l6ZV07CisJaW50IHIgPSAwOworCisJZG1yZXEgPSBkbXJlcV9vZl9yZXEoY2MsIHJlcSk7CisJZG1yZXEtPml2X3NlY3RvciA9IGN0eC0+c2VjdG9yOworCWRtcmVxLT5jdHggPSBjdHg7CisJc2dfaW5pdF90YWJsZSgmZG1yZXEtPnNnX2luLCAxKTsKKwlzZ19zZXRfcGFnZSgmZG1yZXEtPnNnX2luLCBidl9pbi0+YnZfcGFnZSwgMSA8PCBTRUNUT1JfU0hJRlQsCisJCSAgICBidl9pbi0+YnZfb2Zmc2V0ICsgY3R4LT5vZmZzZXRfaW4pOworCisJc2dfaW5pdF90YWJsZSgmZG1yZXEtPnNnX291dCwgMSk7CisJc2dfc2V0X3BhZ2UoJmRtcmVxLT5zZ19vdXQsIGJ2X291dC0+YnZfcGFnZSwgMSA8PCBTRUNUT1JfU0hJRlQsCisJCSAgICBidl9vdXQtPmJ2X29mZnNldCArIGN0eC0+b2Zmc2V0X291dCk7CisKKwljdHgtPm9mZnNldF9pbiArPSAxIDw8IFNFQ1RPUl9TSElGVDsKKwlpZiAoY3R4LT5vZmZzZXRfaW4gPj0gYnZfaW4tPmJ2X2xlbikgeworCQljdHgtPm9mZnNldF9pbiA9IDA7CisJCWN0eC0+aWR4X2luKys7CisJfQorCisJY3R4LT5vZmZzZXRfb3V0ICs9IDEgPDwgU0VDVE9SX1NISUZUOworCWlmIChjdHgtPm9mZnNldF9vdXQgPj0gYnZfb3V0LT5idl9sZW4pIHsKKwkJY3R4LT5vZmZzZXRfb3V0ID0gMDsKKwkJY3R4LT5pZHhfb3V0Kys7CisJfQorCisJaWYgKGNjLT5pdl9nZW5fb3BzKSB7CisJCXIgPSBjYy0+aXZfZ2VuX29wcy0+Z2VuZXJhdG9yKGNjLCBpdiwgZG1yZXEpOworCQlpZiAociA8IDApCisJCQlyZXR1cm4gcjsKKwkJciA9IGRtX29jZl9wcm9jZXNzKGNjLCAmZG1yZXEtPnNnX291dCwgJmRtcmVxLT5zZ19pbiwgZG1yZXEtPnNnX2luLmxlbmd0aCwgaXYsIGNjLT5pdl9zaXplLCB3cml0ZSwgcHJpdik7CisJfSBlbHNlIHsKKwkJciA9IGRtX29jZl9wcm9jZXNzKGNjLCAmZG1yZXEtPnNnX2luLCAmZG1yZXEtPnNnX2luLCBkbXJlcS0+c2dfaW4ubGVuZ3RoLCBOVUxMLCAwLCB3cml0ZSwgcHJpdik7CisJfQorCisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiBFbmNyeXB0IC8gZGVjcnlwdCBkYXRhIGZyb20gb25lIGJpbyB0byBhbm90aGVyIG9uZSAoY2FuIGJlIHRoZSBzYW1lIG9uZSkKKyAqLworc3RhdGljIGludCBvY2ZfY3J5cHRfY29udmVydChzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYywKKwkJCSBzdHJ1Y3QgY29udmVydF9jb250ZXh0ICpjdHgsIHN0cnVjdCBkbV9jcnlwdF9pbyAqaW8pCit7CisJaW50IHIgPSAwOworCWxvbmcgd3JfdGltZW91dCA9IDMwMDAwMDsKKwlsb25nIHJkX3RpbWVvdXQgPSAzMDAwMDA7CisJbG9uZyB3cl90bSwgcmRfdG07CisJaW50IG51bSA9IDAsIG51bTEgPTA7CisJdm9pZCAqcHJpdiA9IE5VTEw7CisJc3RydWN0IG9jZl93cl9wcml2ICpvY2Zfd3JfcHJpdiA9IE5VTEw7CisJc3RydWN0IG9jZl9yZF9wcml2ICpvY2ZfcmRfcHJpdiA9IE5VTEw7CisJaW50IHdyaXRlPTA7CisJc3RydWN0IGNyeXB0X2NwdSAqdGhpc19jYyA9IHRoaXNfY3J5cHRfY29uZmlnKGNjKTsKKworCWF0b21pY19zZXQoJmN0eC0+cGVuZGluZywgMSk7CisKKworCWlmKGJpb19kYXRhX2RpcihjdHgtPmJpb19pbikgPT0gV1JJVEUpIHsKKwkJd3JpdGUgPSAxOworCQlvY2Zfd3JfcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBvY2Zfd3JfcHJpdiksR0ZQX0tFUk5FTCk7CisJCWlmKCFvY2Zfd3JfcHJpdikgeworCQkJcHJpbnRrKCJvY2ZfY3J5cHRfY29udmVydDogb3V0IG9mIG1lbW9yeSBcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJb2NmX3dyX3ByaXYtPmRtX29jZl93cl9wZW5kaW5nID0gMDsKKwkJb2NmX3dyX3ByaXYtPmRtX29jZl93cl9jb21wbGV0ZWQgPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvY2Zfd3JfcHJpdi0+ZG1fb2NmX3dyX3F1ZXVlKTsKKwkJcHJpdiA9IG9jZl93cl9wcml2OworCX0KKwllbHNlIHsKKwkJb2NmX3JkX3ByaXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2NmX3JkX3ByaXYpLEdGUF9LRVJORUwpOworCQlpZighb2NmX3JkX3ByaXYpIHsKKwkJCXByaW50aygib2NmX2NyeXB0X2NvbnZlcnQ6IG91dCBvZiBtZW1vcnkgXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW9jZl9yZF9wcml2LT5kbV9vY2ZfcmRfcGVuZGluZyA9IDA7CisJCW9jZl9yZF9wcml2LT5kbV9vY2ZfcmRfY29tcGxldGVkID0gMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmb2NmX3JkX3ByaXYtPmRtX29jZl9yZF9xdWV1ZSk7CisJCXByaXYgPSBvY2ZfcmRfcHJpdjsKKwl9CisKKwl3aGlsZShjdHgtPmlkeF9pbiA8IGN0eC0+YmlvX2luLT5iaV92Y250ICYmCisJICAgICAgY3R4LT5pZHhfb3V0IDwgY3R4LT5iaW9fb3V0LT5iaV92Y250KSB7CisKKwkJY3J5cHRfYWxsb2NfcmVxKGNjLCBjdHgpOworCisJCWF0b21pY19pbmMoJmN0eC0+cGVuZGluZyk7CisKKwkJaWYoYmlvX2RhdGFfZGlyKGN0eC0+YmlvX2luKSA9PSBXUklURSkgeworCQkJbnVtKys7CisJCX0KKwkJLyogaWYgbGFzdCByZWFkIGluIHRoZSBjb250ZXh0IC0gc2VuZCB0aGUgaW8sIHNvIHRoZSBPQ0YgcmVhZCBjYWxsYmFjayB3aWxsIHJlbGVhc2UgdGhlIElPLiAqLworCQllbHNlIHsKKwkJCW51bTErKzsKKwkJfQorCisJCXIgPSBvY2ZfY3J5cHRfY29udmVydF9ibG9jayhjYywgY3R4LCB0aGlzX2NjLT5yZXEsIHdyaXRlLCBwcml2KTsKKworCQlzd2l0Y2ggKHIpIHsKKwkJCWNhc2UgMDoKKwkJCQlhdG9taWNfZGVjKCZjdHgtPnBlbmRpbmcpOworCQkJCWN0eC0+c2VjdG9yKys7CisJCQkJLy9jb25kX3Jlc2NoZWQoKTsKKwkJCQljb250aW51ZTsKKwkJCS8qIGVycm9yICovCisJCQlkZWZhdWx0OgorCQkJCWF0b21pY19kZWMoJmN0eC0+cGVuZGluZyk7CisJCQkJLy9yZXR1cm4gcjsKKwkJfQorCX0KKworCWlmKGJpb19kYXRhX2RpcihjdHgtPmJpb19pbikgPT0gV1JJVEUpIHsKKwkJb2NmX3dyX3ByaXYtPmRtX29jZl93cl9wZW5kaW5nICs9IG51bTsKKwkJd3JfdG0gPSB3YWl0X2V2ZW50X3RpbWVvdXQob2NmX3dyX3ByaXYtPmRtX29jZl93cl9xdWV1ZSwKKwkJCQkJKG9jZl93cl9wcml2LT5kbV9vY2Zfd3JfcGVuZGluZyA9PSBvY2Zfd3JfcHJpdi0+ZG1fb2NmX3dyX2NvbXBsZXRlZCkKKwkJCQkJCQkJCQksIG1zZWNzX3RvX2ppZmZpZXMod3JfdGltZW91dCkgKTsKKwkJaWYgKCF3cl90bSkgeworCQkJcHJpbnRrKCJvY2ZfY3J5cHRfY29udmVydDogd3Igd29yayB3YXMgbm90IGZpbmlzaGVkIGluICVsZCBtc2VjcywgJWQgcGVuZGluZyAlZCBjb21wbGV0ZWQuXG4iLAorCQkJCQl3cl90aW1lb3V0LCBvY2Zfd3JfcHJpdi0+ZG1fb2NmX3dyX3BlbmRpbmcsIG9jZl93cl9wcml2LT5kbV9vY2Zfd3JfY29tcGxldGVkKTsKKwkJfQorCQlrZnJlZShvY2Zfd3JfcHJpdik7CisJfQorCWVsc2UgeworCQlvY2ZfcmRfcHJpdi0+ZG1fb2NmX3JkX3BlbmRpbmcgKz0gbnVtMTsKKwkJcmRfdG0gPSB3YWl0X2V2ZW50X3RpbWVvdXQob2NmX3JkX3ByaXYtPmRtX29jZl9yZF9xdWV1ZSwKKwkJCQkJKG9jZl9yZF9wcml2LT5kbV9vY2ZfcmRfcGVuZGluZyA9PSBvY2ZfcmRfcHJpdi0+ZG1fb2NmX3JkX2NvbXBsZXRlZCkKKwkJCQkJCQkJCQksIG1zZWNzX3RvX2ppZmZpZXMocmRfdGltZW91dCkgKTsKKwkJaWYgKCFyZF90bSkgeworCQkJcHJpbnRrKCJvY2ZfY3J5cHRfY29udmVydDogcmQgd29yayB3YXMgbm90IGZpbmlzaGVkIGluICVsZCBtc2VjcywgJWQgcGVuZGluZyAlZCBjb21wbGV0ZWQuXG4iLAorCQkJCQlyZF90aW1lb3V0LCBvY2ZfcmRfcHJpdi0+ZG1fb2NmX3JkX3BlbmRpbmcsIG9jZl9yZF9wcml2LT5kbV9vY2ZfcmRfY29tcGxldGVkKTsKKwkJfQorCQlrZnJlZShvY2ZfcmRfcHJpdik7CisJfQorCisJcmV0dXJuIHI7Cit9CisjZW5kaWYgLypDT05GSUdfT0NGX0RNX0NSWVBUKi8KKwogc3RhdGljIGludCBjcnlwdF9jb252ZXJ0X2Jsb2NrKHN0cnVjdCBjcnlwdF9jb25maWcgKmNjLAogCQkJICAgICAgIHN0cnVjdCBjb252ZXJ0X2NvbnRleHQgKmN0eCwKIAkJCSAgICAgICBzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEpCkBAIC03NDksMTUgKzEwNDAsMTkgQEAKIAkJCSAgICBzdHJ1Y3QgY29udmVydF9jb250ZXh0ICpjdHgpCiB7CiAJc3RydWN0IGNyeXB0X2NwdSAqdGhpc19jYyA9IHRoaXNfY3J5cHRfY29uZmlnKGNjKTsKKyNpZiAhZGVmaW5lZChDT05GSUdfT0NGX0RNX0NSWVBUKQogCXVuc2lnbmVkIGtleV9pbmRleCA9IGN0eC0+c2VjdG9yICYgKGNjLT50Zm1zX2NvdW50IC0gMSk7CisjZW5kaWYKIAogCWlmICghdGhpc19jYy0+cmVxKQogCQl0aGlzX2NjLT5yZXEgPSBtZW1wb29sX2FsbG9jKGNjLT5yZXFfcG9vbCwgR0ZQX05PSU8pOwogCisjaWYgIWRlZmluZWQoQ09ORklHX09DRl9ETV9DUllQVCkKIAlhYmxrY2lwaGVyX3JlcXVlc3Rfc2V0X3RmbSh0aGlzX2NjLT5yZXEsIHRoaXNfY2MtPnRmbXNba2V5X2luZGV4XSk7CiAJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jYWxsYmFjayh0aGlzX2NjLT5yZXEsCiAJICAgIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HIHwgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLAogCSAgICBrY3J5cHRkX2FzeW5jX2RvbmUsIGRtcmVxX29mX3JlcShjYywgdGhpc19jYy0+cmVxKSk7CisjZW5kaWYKIH0KIAogLyoKQEAgLTExMDIsMTAgKzEzOTcsMTggQEAKIAkJc2VjdG9yICs9IGJpb19zZWN0b3JzKGNsb25lKTsKIAogCQljcnlwdF9pbmNfcGVuZGluZyhpbyk7CisjaWYgZGVmaW5lZChDT05GSUdfT0NGX0RNX0NSWVBUKQorCQlyID0gb2NmX2NyeXB0X2NvbnZlcnQoY2MsICZpby0+Y3R4LCBpbyk7CiAKKwkJaWYociA8IDApIHsKKwkJCXByaW50aygiXG4lcygpIG9jZl9jcnlwdF9jb252ZXJ0IGZhaWxlZFxuIixfX0ZVTkNUSU9OX18pOworCQkJaW8tPmVycm9yID0gLUVJTzsKKwkJfQorI2Vsc2UKIAkJciA9IGNyeXB0X2NvbnZlcnQoY2MsICZpby0+Y3R4KTsKIAkJaWYgKHIgPCAwKQogCQkJaW8tPmVycm9yID0gLUVJTzsKKyNlbmRpZgogCiAJCWNyeXB0X2ZpbmlzaGVkID0gYXRvbWljX2RlY19hbmRfdGVzdCgmaW8tPmN0eC5wZW5kaW5nKTsKIApAQCAtMTE3Nyw5ICsxNDgwLDE3IEBACiAJY3J5cHRfY29udmVydF9pbml0KGNjLCAmaW8tPmN0eCwgaW8tPmJhc2VfYmlvLCBpby0+YmFzZV9iaW8sCiAJCQkgICBpby0+c2VjdG9yKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX09DRl9ETV9DUllQVCkKKwlyID0gb2NmX2NyeXB0X2NvbnZlcnQoY2MsICZpby0+Y3R4LCBpbyk7CisJaWYociA8IDApIHsKKwkJcHJpbnRrKCJcbiVzKCkgb2NmX2NyeXB0X2NvbnZlcnQgZmFpbGVkXG4iLF9fRlVOQ1RJT05fXyk7CisJCWlvLT5lcnJvciA9IC1FSU87CisJfQorI2Vsc2UKIAlyID0gY3J5cHRfY29udmVydChjYywgJmlvLT5jdHgpOwogCWlmIChyIDwgMCkKIAkJaW8tPmVycm9yID0gLUVJTzsKKyNlbmRpZgogCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlvLT5jdHgucGVuZGluZykpCiAJCWtjcnlwdGRfY3J5cHRfcmVhZF9kb25lKGlvKTsKQEAgLTEzNDEsNyArMTY1MiwxMSBAQAogCiAJc2V0X2JpdChETV9DUllQVF9LRVlfVkFMSUQsICZjYy0+ZmxhZ3MpOwogCisjaWYgIWRlZmluZWQoQ09ORklHX09DRl9ETV9DUllQVCkKIAlyID0gY3J5cHRfc2V0a2V5X2FsbGNwdXMoY2MpOworI2Vsc2UKKwlyID0gMDsKKyNlbmRpZgogCiBvdXQ6CiAJLyogSGV4IGtleSBzdHJpbmcgbm90IG5lZWRlZCBhZnRlciBoZXJlLCBzbyB3aXBlIGl0LiAqLwpAQCAtMTM1NSw3ICsxNjcwLDExIEBACiAJY2xlYXJfYml0KERNX0NSWVBUX0tFWV9WQUxJRCwgJmNjLT5mbGFncyk7CiAJbWVtc2V0KCZjYy0+a2V5LCAwLCBjYy0+a2V5X3NpemUgKiBzaXplb2YodTgpKTsKIAorI2lmICFkZWZpbmVkKENPTkZJR19PQ0ZfRE1fQ1JZUFQpCiAJcmV0dXJuIGNyeXB0X3NldGtleV9hbGxjcHVzKGNjKTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgY3J5cHRfZHRyKHN0cnVjdCBkbV90YXJnZXQgKnRpKQpAQCAtMTM3OSw4ICsxNjk4LDE0IEBACiAJCQljcHVfY2MgPSBwZXJfY3B1X3B0cihjYy0+Y3B1LCBjcHUpOwogCQkJaWYgKGNwdV9jYy0+cmVxKQogCQkJCW1lbXBvb2xfZnJlZShjcHVfY2MtPnJlcSwgY2MtPnJlcV9wb29sKTsKKyNpZiAhZGVmaW5lZChDT05GSUdfT0NGX0RNX0NSWVBUKQogCQkJY3J5cHRfZnJlZV90Zm1zKGNjLCBjcHUpOworI2VuZGlmCiAJCX0KKyNpZiBkZWZpbmVkKENPTkZJR19PQ0ZfRE1fQ1JZUFQpCisJaWYoY2MtPm9jZl9jcnlwdG9pZCkKKwkJY3J5cHRvX2ZyZWVzZXNzaW9uKGNjLT5vY2ZfY3J5cHRvaWQpOworI2VuZGlmCiAKIAlpZiAoY2MtPmJzKQogCQliaW9zZXRfZnJlZShjYy0+YnMpOwpAQCAtMTQxNCw3ICsxNzM5LDExIEBACiAJc3RydWN0IGNyeXB0X2NvbmZpZyAqY2MgPSB0aS0+cHJpdmF0ZTsKIAljaGFyICp0bXAsICpjaXBoZXIsICpjaGFpbm1vZGUsICppdm1vZGUsICppdm9wdHMsICprZXljb3VudDsKIAljaGFyICpjaXBoZXJfYXBpID0gTlVMTDsKKyNpZiAhZGVmaW5lZChDT05GSUdfT0NGX0RNX0NSWVBUKQogCWludCBjcHUsIHJldCA9IC1FSU5WQUw7CisjZWxzZQorCWludCByZXQgPSAtRUlOVkFMOworI2VuZGlmCiAKIAkvKiBDb252ZXJ0IHRvIGNyeXB0byBhcGkgZGVmaW5pdGlvbj8gKi8KIAlpZiAoc3RyY2hyKGNpcGhlcl9pbiwgJygnKSkgewpAQCAtMTQ4Nyw2ICsxODE2LDQwIEBACiAJCWdvdG8gYmFkX21lbTsKIAl9CiAKKwkvKiBJbml0aWFsaXplIGFuZCBzZXQga2V5ICovCisJcmV0ID0gY3J5cHRfc2V0X2tleShjYywga2V5KTsKKwlpZiAocmV0IDwgMCkgeworCQl0aS0+ZXJyb3IgPSAiRXJyb3IgZGVjb2RpbmcgYW5kIHNldHRpbmcga2V5IjsKKwkJZ290byBiYWQ7CisJfQorCisjaWYgZGVmaW5lZChDT05GSUdfT0NGX0RNX0NSWVBUKQorCS8qIHByZXBhcmUgYSBuZXcgT0NGIHNlc3Npb24gKi8KKwltZW1zZXQoJmNjLT5jcl9kbSwgMCwgc2l6ZW9mKHN0cnVjdCBjcnlwdG9pbmkpKTsKKworCWlmKChzdHJjbXAoY2lwaGVyLCJhZXMiKSA9PSAwKSAmJiAoc3RyY21wKGNoYWlubW9kZSwgImNiYyIpID09IDApKQorCQljYy0+Y3JfZG0uY3JpX2FsZyAgPSBDUllQVE9fQUVTX0NCQzsKKwllbHNlIGlmKChzdHJjbXAoY2lwaGVyLCJkZXMiKSA9PSAwKSAmJiAoc3RyY21wKGNoYWlubW9kZSwgImNiYyIpID09IDApKQorCQljYy0+Y3JfZG0uY3JpX2FsZyAgPSBDUllQVE9fREVTX0NCQzsKKwllbHNlIGlmKChzdHJjbXAoY2lwaGVyLCJkZXMzX2VkZSIpID09IDApICYmIChzdHJjbXAoY2hhaW5tb2RlLCAiY2JjIikgPT0gMCkpCisJCWNjLT5jcl9kbS5jcmlfYWxnICA9IENSWVBUT18zREVTX0NCQzsKKwllbHNlIHsKKwkJZG1wcmludGsoIlxuY3J5cHRfY3RyOiB1c2luZyBPQ0Y6IHVua25vd24gY2lwaGVyIG9yIGJhZCBjaGFpbiBtb2RlXG4iKTsKKwkJdGktPmVycm9yID0gRE1fTVNHX1BSRUZJWCAidXNpbmcgT0NGOiB1bmtub3duIGNpcGhlciBvciBiYWQgY2hhaW4gbW9kZSI7CisJCWdvdG8gYmFkOworCX0KKworCS8vZG1wcmludGsoImtleSBzaXplIGlzICVkXG4iLGNjLT5rZXlfc2l6ZSk7CisJY2MtPmNyX2RtLmNyaV9rbGVuID0gY2MtPmtleV9zaXplKjg7CisJY2MtPmNyX2RtLmNyaV9rZXkgID0gY2MtPmtleTsKKwljYy0+Y3JfZG0uY3JpX25leHQgPSBOVUxMOworCisJaWYoY3J5cHRvX25ld3Nlc3Npb24oJmNjLT5vY2ZfY3J5cHRvaWQsICZjYy0+Y3JfZG0sIENSWVBUT0NBUF9GX0hBUkRXQVJFIHwgQ1JZUFRPQ0FQX0ZfU09GVFdBUkUpKXsKKwkJZG1wcmludGsoImNyeXB0X2N0cjogY3J5cHRvX25ld3Nlc3Npb24gZmFpbGVkXG4iKTsKKwkJdGktPmVycm9yID0gRE1fTVNHX1BSRUZJWCAiY3J5cHRvX25ld3Nlc3Npb24gZmFpbGVkIjsKKwkJZ290byBiYWQ7CisJfQorI2Vsc2UKIAkvKiBBbGxvY2F0ZSBjaXBoZXIgKi8KIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CiAJCXJldCA9IGNyeXB0X2FsbG9jX3RmbXMoY2MsIGNwdSwgY2lwaGVyX2FwaSk7CkBAIC0xNDk2LDEzICsxODU5LDYgQEAKIAkJfQogCX0KIAotCS8qIEluaXRpYWxpemUgYW5kIHNldCBrZXkgKi8KLQlyZXQgPSBjcnlwdF9zZXRfa2V5KGNjLCBrZXkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXRpLT5lcnJvciA9ICJFcnJvciBkZWNvZGluZyBhbmQgc2V0dGluZyBrZXkiOwotCQlnb3RvIGJhZDsKLQl9Ci0KIAkvKiBJbml0aWFsaXplIElWICovCiAJY2MtPml2X3NpemUgPSBjcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoYW55X3RmbShjYykpOwogCWlmIChjYy0+aXZfc2l6ZSkKQEAgLTE1MTMsNiArMTg2OSw3IEBACiAJCURNV0FSTigiU2VsZWN0ZWQgY2lwaGVyIGRvZXMgbm90IHN1cHBvcnQgSVZzIik7CiAJCWl2bW9kZSA9IE5VTEw7CiAJfQorI2VuZGlmLypDT05GSUdfT0NGX0RNX0NSWVBUKi8KIAogCS8qIENob29zZSBpdm1vZGUsIHNlZSBjb21tZW50cyBhdCBpdiBjb2RlLiAqLwogCWlmIChpdm1vZGUgPT0gTlVMTCkKQEAgLTE1MjMsOCArMTg4MCwxMCBAQAogCQljYy0+aXZfZ2VuX29wcyA9ICZjcnlwdF9pdl9wbGFpbjY0X29wczsKIAllbHNlIGlmIChzdHJjbXAoaXZtb2RlLCAiZXNzaXYiKSA9PSAwKQogCQljYy0+aXZfZ2VuX29wcyA9ICZjcnlwdF9pdl9lc3Npdl9vcHM7CisjaWYgIWRlZmluZWQoQ09ORklHX09DRl9ETV9DUllQVCkKIAllbHNlIGlmIChzdHJjbXAoaXZtb2RlLCAiYmVuYmkiKSA9PSAwKQogCQljYy0+aXZfZ2VuX29wcyA9ICZjcnlwdF9pdl9iZW5iaV9vcHM7CisjZW5kaWYKIAllbHNlIGlmIChzdHJjbXAoaXZtb2RlLCAibnVsbCIpID09IDApCiAJCWNjLT5pdl9nZW5fb3BzID0gJmNyeXB0X2l2X251bGxfb3BzOwogCWVsc2UgaWYgKHN0cmNtcChpdm1vZGUsICJsbWsiKSA9PSAwKSB7CkBAIC0xNTQxLDYgKzE5MDAsMTcgQEAKIAkJZ290byBiYWQ7CiAJfQogCisjaWYgZGVmaW5lZChDT05GSUdfT0NGX0RNX0NSWVBUKQorCXN3aXRjaCAoY2MtPmNyX2RtLmNyaV9hbGcpIHsKKwkJY2FzZSBDUllQVE9fQUVTX0NCQzoKKwkJCWNjLT5pdl9zaXplID0gMTY7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNjLT5pdl9zaXplID0gODsKKwkJCWJyZWFrOworCX0KKyNlbmRpZgorCiAJLyogQWxsb2NhdGUgSVYgKi8KIAlpZiAoY2MtPml2X2dlbl9vcHMgJiYgY2MtPml2X2dlbl9vcHMtPmN0cikgewogCQlyZXQgPSBjYy0+aXZfZ2VuX29wcy0+Y3RyKGNjLCB0aSwgaXZvcHRzKTsKQEAgLTE1NTAsNiArMTkyMCw3IEBACiAJCX0KIAl9CiAKKyNpZiAhZGVmaW5lZChDT05GSUdfT0NGX0RNX0NSWVBUKQogCS8qIEluaXRpYWxpemUgSVYgKHNldCBrZXlzIGZvciBFU1NJViBldGMpICovCiAJaWYgKGNjLT5pdl9nZW5fb3BzICYmIGNjLT5pdl9nZW5fb3BzLT5pbml0KSB7CiAJCXJldCA9IGNjLT5pdl9nZW5fb3BzLT5pbml0KGNjKTsKQEAgLTE1NTgsNiArMTkyOSw3IEBACiAJCQlnb3RvIGJhZDsKIAkJfQogCX0KKyNlbmRpZgogCiAJcmV0ID0gMDsKIGJhZDoKQEAgLTE2MTMsMTAgKzE5ODUsMTIgQEAKIAl9CiAKIAljYy0+ZG1yZXFfc3RhcnQgPSBzaXplb2Yoc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCk7CisjaWYgIWRlZmluZWQoQ09ORklHX09DRl9ETV9DUllQVCkKIAljYy0+ZG1yZXFfc3RhcnQgKz0gY3J5cHRvX2FibGtjaXBoZXJfcmVxc2l6ZShhbnlfdGZtKGNjKSk7CiAJY2MtPmRtcmVxX3N0YXJ0ID0gQUxJR04oY2MtPmRtcmVxX3N0YXJ0LCBjcnlwdG9fdGZtX2N0eF9hbGlnbm1lbnQoKSk7CiAJY2MtPmRtcmVxX3N0YXJ0ICs9IGNyeXB0b19hYmxrY2lwaGVyX2FsaWdubWFzayhhbnlfdGZtKGNjKSkgJgogCQkJICAgfihjcnlwdG9fdGZtX2N0eF9hbGlnbm1lbnQoKSAtIDEpOworI2VuZGlmCiAKIAljYy0+cmVxX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9rbWFsbG9jX3Bvb2woTUlOX0lPUywgY2MtPmRtcmVxX3N0YXJ0ICsKIAkJCXNpemVvZihzdHJ1Y3QgZG1fY3J5cHRfcmVxdWVzdCkgKyBjYy0+aXZfc2l6ZSk7CkBAIC0xODk1LDYgKzIyNjksMTAgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KF9jcnlwdF9pb19wb29sKTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfT0NGX0RNX0NSWVBUCisJcHJpbnRrKCJkbV9jcnlwdCB1c2luZyB0aGUgT0NGIGZvciBjcnlwdG8gYWNjZWxlcmF0aW9uLlxuIik7CisjZW5kaWYKKwogCXJldHVybiByOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggMmQ5N2JmMC4uMDk4NDZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtNTcxLDEyICs1NzEsMzAgQEAKIAkJCWJlc3RfZ29vZF9zZWN0b3JzID0gc2VjdG9yczsKIAogCQlkaXN0ID0gYWJzKHRoaXNfc2VjdG9yIC0gY29uZi0+bWlycm9yc1tkaXNrXS5oZWFkX3Bvc2l0aW9uKTsKKwkJLyogUHJlZmVyIGlkbGUgZGlzaywgYnV0IHN0aWxsIGNob29zZSBiZXN0IGlmIG1vcmUgdGhhbiBvbmUgaWRsZSBkaXNrOgorCQkgKiBXZSBhZGQgYW4gYXJ0aWZpY2FsLCBhcmJpdHJhcnkgKE1heC8yKSB3ZWlnaHQgdG8gYnVzeSBkaXNrcyB0byBmYXZvciAKKwkJICogaWRsZSBkaXNrcy4gSWYgdGhlIGRpc3RhbmNlIGlzIGdyZWF0ZXIgdGhhbiBNYXgvMiwgdGhlbiB3ZSBtYWtlIGl0CisJCSAqIHRoZSBtYXhpbXVtIHZhbHVlLiBXZSBtYXkgbm90IGNob29zZSB0aGUgc21hbGxlciBkaXN0YW5jZSBpZiBhbGwgZGlza3MKKwkJICogZmFsbCBpbnRvIHRoYXQgc2l0dWF0aW9uLCBidXQgc2luY2UgYWxsIGRpc2tzIHdpbGwgaGF2ZSBsb25nIHNlZWsgdGltZXMKKwkJICogd2UgZG9uJ3QgcmVhbGx5IGNhcmUuCisJCSAqIFdlIG1heSBlbmQgdXAgY2hvb3NpbmcgYSBidXN5IGRpc2sgaWYgaWRsZSBkaXNrcyBoYXZlIGEgdmVyeSBoaWdoIAorCQkgKiBkaXN0YW5jZSwgYnV0IHRoaXMgbWF5IGFjdHVhbGx5IGJlIHByZWZlcmFibGUgdG8gbWluaW1pemUgc2VlayB0aW1lcy4KKwkJICogSWYgZGlzdCA9PSAwLCB3ZSBjaG9vc2UgdGhhdCBkaXNrIGV2ZW4gaWYgaXQgYnVzeSB0byBhZ2FpbiBtaW5pbWl6ZSBzZWVrCisJCSAqIHRpbWVzLCBhcyBpdCBpcyBsaWtlbHkgYSBzZXF1ZW50aWFsIHJlYWQgd2l0aCBhIHNpbmdsZSBwZW5kaW5nIHJlcXVlc3QuCisJCSAqIFRPRE86IHVzZSBwZXIgZGlzayBuZXh0X3NlcV9zZWN0IHRvIGJldHRlciBkZXRlY3Qgc2VxdWVudGlhbCByZWFkcz8KKwkJICovCisJCWlmIChkaXN0ID09IDApIHsKKwkJCWJlc3RfZGlzayA9IGRpc2s7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYXRvbWljX3JlYWQoJnJkZXYtPm5yX3BlbmRpbmcpICE9IDApIHsKKwkJCWlmIChkaXN0IDwgTWF4U2VjdG9yLzIpCisJCQkJZGlzdCArPSBNYXhTZWN0b3IgLyAyOyAKKwkJCWVsc2UgZGlzdCA9IE1heFNlY3RvciAtIDE7CisJCX0KIAkJaWYgKGNob29zZV9maXJzdAogCQkgICAgLyogRG9uJ3QgY2hhbmdlIHRvIGFub3RoZXIgZGlzayBmb3Igc2VxdWVudGlhbCByZWFkcyAqLwotCQkgICAgfHwgY29uZi0+bmV4dF9zZXFfc2VjdCA9PSB0aGlzX3NlY3RvcgotCQkgICAgfHwgZGlzdCA9PSAwCi0JCSAgICAvKiBJZiBkZXZpY2UgaXMgaWRsZSwgdXNlIGl0ICovCi0JCSAgICB8fCBhdG9taWNfcmVhZCgmcmRldi0+bnJfcGVuZGluZykgPT0gMCkgeworCQkgICAgfHwgY29uZi0+bmV4dF9zZXFfc2VjdCA9PSB0aGlzX3NlY3RvcikgewogCQkJYmVzdF9kaXNrID0gZGlzazsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggMjZlZjYzYS4uMjMxNjEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtNDg1LDYgKzQ4NSwyOCBAQAogc3RhdGljIHZvaWQKIHJhaWQ1X2VuZF93cml0ZV9yZXF1ZXN0KHN0cnVjdCBiaW8gKmJpLCBpbnQgZXJyb3IpOwogCisjaWZkZWYgQ09ORklHX1JBSURfWkVST19DT1BZCitzdGF0aWMgaW5saW5lIHZvaWQgcjVkZXZfc3dpdGNoX3BhZ2Uoc3RydWN0IHI1ZGV2ICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCUJVR19PTihkZXYtPnBhZ2Vfc2F2ZSAhPSBOVUxMKTsKKwlCVUdfT04oZGV2LT5wYWdlICE9IGJpb19pb3ZlY19pZHgoJmRldi0+cmVxLCAwKS0+YnZfcGFnZSk7CisJLyogVGhlIHBvaW50ZXIgbXVzdCBiZSByZXN0b3JlZCB3aGVuZXZlciB0aGUgTE9DS0VEIGdldHMgY2xlYXJlZC4gKi8KKwlkZXYtPnBhZ2Vfc2F2ZSA9IGRldi0+cGFnZTsKKwlkZXYtPnBhZ2UgPSBiaW9faW92ZWNfaWR4KCZkZXYtPnJlcSwgMCktPmJ2X3BhZ2UgPSBwYWdlOworCWttYXAoZGV2LT5wYWdlKTsgLyogZm9yIHN5bmNfeG9yIG9uIDMyLWJpdCBzeXN0ZW1zICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByNWRldl9yZXN0b3JlX3BhZ2Uoc3RydWN0IHI1ZGV2ICpkZXYpCit7CisJQlVHX09OKGRldi0+cGFnZV9zYXZlID09IE5VTEwpOworCUJVR19PTihkZXYtPnBhZ2UgIT0gYmlvX2lvdmVjX2lkeCgmZGV2LT5yZXEsIDApLT5idl9wYWdlKTsKKwlCVUdfT04oZGV2LT5wYWdlID09IGRldi0+cGFnZV9zYXZlKTsKKwlrdW5tYXAoZGV2LT5wYWdlX3NhdmUpOworCWRldi0+cGFnZSA9IGJpb19pb3ZlY19pZHgoJmRldi0+cmVxLCAwKS0+YnZfcGFnZSA9IGRldi0+cGFnZV9zYXZlOworCWRldi0+cGFnZV9zYXZlID0gTlVMTDsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBvcHNfcnVuX2lvKHN0cnVjdCBzdHJpcGVfaGVhZCAqc2gsIHN0cnVjdCBzdHJpcGVfaGVhZF9zdGF0ZSAqcykKIHsKIAlzdHJ1Y3QgcjVjb25mICpjb25mID0gc2gtPnJhaWRfY29uZjsKQEAgLTU4NSw2ICs2MDcsMTEgQEAKIAkJCQlzZXRfYml0KFNUUklQRV9ERUdSQURFRCwgJnNoLT5zdGF0ZSk7CiAJCQlwcl9kZWJ1Zygic2tpcCBvcCAlbGQgb24gZGlzYyAlZCBmb3Igc2VjdG9yICVsbHVcbiIsCiAJCQkJYmktPmJpX3J3LCBpLCAodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOworI2lmZGVmIENPTkZJR19SQUlEX1pFUk9fQ09QWQorICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVzdF9iaXQoUjVfRGlyZWN0QWNjZXNzLCAmc2gtPmRldltpXS5mbGFncykpIHsKKwkJCSAgICAgICByNWRldl9yZXN0b3JlX3BhZ2UoJnNoLT5kZXZbaV0pOworICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKIAkJCWNsZWFyX2JpdChSNV9MT0NLRUQsICZzaC0+ZGV2W2ldLmZsYWdzKTsKIAkJCXNldF9iaXQoU1RSSVBFX0hBTkRMRSwgJnNoLT5zdGF0ZSk7CiAJCX0KQEAgLTc4MSw5ICs4MDgsMjMgQEAKIAkJX19mdW5jX18sICh1bnNpZ25lZCBsb25nIGxvbmcpc2gtPnNlY3RvciwgdGFyZ2V0KTsKIAlCVUdfT04oIXRlc3RfYml0KFI1X1dhbnRjb21wdXRlLCAmdGd0LT5mbGFncykpOwogCisjaWYgMAogCWZvciAoaSA9IGRpc2tzOyBpLS07ICkKIAkJaWYgKGkgIT0gdGFyZ2V0KQogCQkJeG9yX3NyY3NbY291bnQrK10gPSBzaC0+ZGV2W2ldLnBhZ2U7CisjZWxzZQorICAgICAgIGZvciAoaSA9IGRpc2tzOyBpLS07ICkgeworICAgICAgICAgICAgICAgc3RydWN0IHI1ZGV2ICpkZXYgPSAmc2gtPmRldltpXTsKKyAgICAgICAgICAgICAgIHN0cnVjdCBwYWdlICpwZyA9IGRldi0+cGFnZTsKKyAgICAgICAgICAgICAgIGlmIChpICE9IHRhcmdldCkgeworI2lmZGVmIENPTkZJR19SQUlEX1pFUk9fQ09QWQorICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVzdF9iaXQoUjVfRGlyZWN0QWNjZXNzLCAmZGV2LT5mbGFncykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGcgPSBkZXYtPnJlcS5iaV9pb192ZWNbMF0uYnZfcGFnZTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICB4b3Jfc3Jjc1tjb3VudCsrXSA9IHBnOworICAgICAgICAgICAgICAgfQorICAgICAgIH0KKyNlbmRpZgogCiAJYXRvbWljX2luYygmc2gtPmNvdW50KTsKIApAQCAtMTAyMCw4ICsxMDYxLDE5IEBACiAJZm9yIChpID0gZGlza3M7IGktLTsgKSB7CiAJCXN0cnVjdCByNWRldiAqZGV2ID0gJnNoLT5kZXZbaV07CiAJCS8qIE9ubHkgcHJvY2VzcyBibG9ja3MgdGhhdCBhcmUga25vd24gdG8gYmUgdXB0b2RhdGUgKi8KKyNpZiAwCiAJCWlmICh0ZXN0X2JpdChSNV9XYW50ZHJhaW4sICZkZXYtPmZsYWdzKSkKIAkJCXhvcl9zcmNzW2NvdW50KytdID0gZGV2LT5wYWdlOworI2Vsc2UKKyAgICAgICAgICAgICAgIGlmICh0ZXN0X2JpdChSNV9XYW50ZHJhaW4sICZkZXYtPmZsYWdzKSkgeworICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGFnZSAqcGcgPSBkZXYtPnBhZ2U7CisjaWZkZWYgQ09ORklHX1JBSURfWkVST19DT1BZCisgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0X2JpdChSNV9EaXJlY3RBY2Nlc3MsICZkZXYtPmZsYWdzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZyA9IGRldi0+cmVxLmJpX2lvX3ZlY1swXS5idl9wYWdlOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgIHhvcl9zcmNzW2NvdW50KytdID0gcGc7CisgICAgICAgICAgICAgICB9CisjZW5kaWYKIAl9CiAKIAlpbml0X2FzeW5jX3N1Ym1pdCgmc3VibWl0LCBBU1lOQ19UWF9GRU5DRXxBU1lOQ19UWF9YT1JfRFJPUF9EU1QsIHR4LApAQCAtMTAzMSwxMiArMTA4Myw1NSBAQAogCXJldHVybiB0eDsKIH0KIAorI2lmZGVmIENPTkZJR19SQUlEX1pFUk9fQ09QWQorc3RhdGljIHN0cnVjdCBwYWdlICpyYWlkNV96ZXJvX2NvcHkoc3RydWN0IGJpbyAqYmlvLCBzZWN0b3JfdCBzZWN0b3IpCit7CisgICAgICAgc2VjdG9yX3QgYmlfc2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CisgICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworICAgICAgIHN0cnVjdCBiaW9fdmVjICpidjsKKyAgICAgICBpbnQgaTsKKworICAgICAgIGJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGkpIHsKKyAgICAgICAgICAgICAgIGlmIChzZWN0b3IgPT0gYmlfc2VjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gYmlvX2lvdmVjX2lkeChiaW8sIGkpLT5idl9wYWdlOworCisgICAgICAgICAgICAgICBiaV9zZWN0b3IgKz0gYmlvX2lvdmVjX2lkeChiaW8sIGkpLT5idl9sZW4gPj4gOTsKKyAgICAgICAgICAgICAgIGlmIChiaV9zZWN0b3IgPj0gc2VjdG9yICsgU1RSSVBFX1NFQ1RPUlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlIHN0cmlwZSBpcyBjb3ZlcmVkIGJ5IG9uZSBwYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlID09IGJpb19pb3ZlY19pZHgoYmlvLCBpKS0+YnZfcGFnZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFBhZ2VDb25zdGFudChwYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICB9CisgICAgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworCisKIHN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgogb3BzX3J1bl9iaW9kcmFpbihzdHJ1Y3Qgc3RyaXBlX2hlYWQgKnNoLCBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQogewogCWludCBkaXNrcyA9IHNoLT5kaXNrczsKIAlpbnQgaTsKIAorI2lmZGVmIENPTkZJR19SQUlEX1pFUk9fQ09QWQorLy9UaGlzIGlzIHRoZSB3b3JrYXJvdW5kIGZvciB0aGUgZGF0YSBjb3JydXB0aW9uIHdoaWNoIGhhcHBlbnMgaW4gdGhlIHJlYWQtbW9kaWZ5LXdyaXRlIHdyaXRlcyBzY2VuYXJpbworICAgICAgICBpbnQgd3JpdGVfY291bnQgPSAwOworICAgICAgICBpbnQgZG9femVyb19jb3B5ID0gMDsKKworICAgICAgICBmb3IgKGkgPSBkaXNrczsgaS0tOyApCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcjVkZXYgKmRldiA9ICZzaC0+ZGV2W2ldOworICAgICAgICAgICAgICAgIGlmKGRldi0+dG93cml0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2NvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYod3JpdGVfY291bnQgPT0gKGRpc2tzLTEpKQorICAgICAgICAgICAgICAgIGRvX3plcm9fY29weSA9IDE7CisjZW5kaWYKKwogCXByX2RlYnVnKCIlczogc3RyaXBlICVsbHVcbiIsIF9fZnVuY19fLAogCQkodW5zaWduZWQgbG9uZyBsb25nKXNoLT5zZWN0b3IpOwogCkBAIC0xMDUyLDEwICsxMTQ3LDMwIEBACiAJCQlkZXYtPnRvd3JpdGUgPSBOVUxMOwogCQkJQlVHX09OKGRldi0+d3JpdHRlbik7CiAJCQl3YmkgPSBkZXYtPndyaXR0ZW4gPSBjaG9zZW47Ci0JCQlzcGluX3VubG9ja19pcnEoJnNoLT5yYWlkX2NvbmYtPmRldmljZV9sb2NrKTsKKyNpZmRlZiBDT05GSUdfUkFJRF9aRVJPX0NPUFkKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0X2JpdChSNV9MT0NLRUQsICZkZXYtPmZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgQlVHX09OKHRlc3RfYml0KFI1X0RpcmVjdEFjY2VzcywgJmRldi0+ZmxhZ3MpKTsKKwkJICAgICAgIHNwaW5fdW5sb2NrX2lycSgmc2gtPnJhaWRfY29uZi0+ZGV2aWNlX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdiaS0+YmlfbmV4dCAmJiB0ZXN0X2JpdChSNV9PVkVSV1JJVEUsICZkZXYtPmZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGVzdF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncykgJiYgZG9femVyb19jb3B5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBhZ2UgKnBnID0gcmFpZDVfemVyb19jb3B5KHdiaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+c2VjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9iaXQoUjVfRGlyZWN0QWNjZXNzLCAmZGV2LT5mbGFncyk7CisJCQkJICAgICAgIHI1ZGV2X3N3aXRjaF9wYWdlKGRldiwgcGcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9iaXQoUjVfT1ZFUldSSVRFLCAmZGV2LT5mbGFncyk7CisJCQkJICAgICAgIGNvbnRpbnVlOworCQkJICAgICAgIH0KKwkJICAgICAgIH0KIAotCQkJd2hpbGUgKHdiaSAmJiB3YmktPmJpX3NlY3RvciA8Ci0JCQkJZGV2LT5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgeworCQkgICAgICAgY2xlYXJfYml0KFI1X09WRVJXUklURSwgJmRldi0+ZmxhZ3MpOworCQkgICAgICAgc2V0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpOworI2Vsc2UKKwkJICAgICAgIHNwaW5fdW5sb2NrX2lycSgmc2gtPnJhaWRfY29uZi0+ZGV2aWNlX2xvY2spOworI2VuZGlmCisJCSAgICAgICB3aGlsZSAod2JpICYmIHdiaS0+Ymlfc2VjdG9yIDwKKwkJCQkgICAgICAgZGV2LT5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgewogCQkJCWlmICh3YmktPmJpX3J3ICYgUkVRX0ZVQSkKIAkJCQkJc2V0X2JpdChSNV9XYW50RlVBLCAmZGV2LT5mbGFncyk7CiAJCQkJdHggPSBhc3luY19jb3B5X2RhdGEoMSwgd2JpLCBkZXYtPnBhZ2UsCkBAIC0xMDg2LDEzICsxMjAxLDE3IEBACiAJZm9yIChpID0gZGlza3M7IGktLTsgKSB7CiAJCXN0cnVjdCByNWRldiAqZGV2ID0gJnNoLT5kZXZbaV07CiAKKyNpZmRlZiBDT05GSUdfUkFJRF9aRVJPX0NPUFkKKwkJaWYgKChkZXYtPndyaXR0ZW4gJiYgIXRlc3RfYml0KFI1X0RpcmVjdEFjY2VzcywgJmRldi0+ZmxhZ3MpKSB8fCBpID09IHBkX2lkeCB8fCBpID09IHFkX2lkeCkgeworI2Vsc2UKIAkJaWYgKGRldi0+d3JpdHRlbiB8fCBpID09IHBkX2lkeCB8fCBpID09IHFkX2lkeCkgeworI2VuZGlmCiAJCQlzZXRfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncyk7CiAJCQlpZiAoZnVhKQogCQkJCXNldF9iaXQoUjVfV2FudEZVQSwgJmRldi0+ZmxhZ3MpOwogCQl9CiAJfQotCisJCQogCWlmIChzaC0+cmVjb25zdHJ1Y3Rfc3RhdGUgPT0gcmVjb25zdHJ1Y3Rfc3RhdGVfZHJhaW5fcnVuKQogCQlzaC0+cmVjb25zdHJ1Y3Rfc3RhdGUgPSByZWNvbnN0cnVjdF9zdGF0ZV9kcmFpbl9yZXN1bHQ7CiAJZWxzZSBpZiAoc2gtPnJlY29uc3RydWN0X3N0YXRlID09IHJlY29uc3RydWN0X3N0YXRlX3ByZXhvcl9kcmFpbl9ydW4pCkBAIC0xMTI5LDE1ICsxMjQ4LDM5IEBACiAJCXhvcl9kZXN0ID0geG9yX3NyY3NbY291bnQrK10gPSBzaC0+ZGV2W3BkX2lkeF0ucGFnZTsKIAkJZm9yIChpID0gZGlza3M7IGktLTsgKSB7CiAJCQlzdHJ1Y3QgcjVkZXYgKmRldiA9ICZzaC0+ZGV2W2ldOworI2lmIDAKIAkJCWlmIChkZXYtPndyaXR0ZW4pCiAJCQkJeG9yX3NyY3NbY291bnQrK10gPSBkZXYtPnBhZ2U7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGFnZSAqcGcgPSBkZXYtPnBhZ2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldi0+d3JpdHRlbikgeworI2lmZGVmIENPTkZJR19SQUlEX1pFUk9fQ09QWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0X2JpdChSNV9EaXJlY3RBY2Nlc3MsICZkZXYtPmZsYWdzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnID0gZGV2LT5yZXEuYmlfaW9fdmVjWzBdLmJ2X3BhZ2U7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4b3Jfc3Jjc1tjb3VudCsrXSA9IHBnOworICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKIAkJfQogCX0gZWxzZSB7CiAJCXhvcl9kZXN0ID0gc2gtPmRldltwZF9pZHhdLnBhZ2U7CiAJCWZvciAoaSA9IGRpc2tzOyBpLS07ICkgewogCQkJc3RydWN0IHI1ZGV2ICpkZXYgPSAmc2gtPmRldltpXTsKKyNpZiAwCiAJCQlpZiAoaSAhPSBwZF9pZHgpCiAJCQkJeG9yX3NyY3NbY291bnQrK10gPSBkZXYtPnBhZ2U7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGFnZSAqcGcgPSBkZXYtPnBhZ2U7CisKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gcGRfaWR4KSB7CisjaWZkZWYgQ09ORklHX1JBSURfWkVST19DT1BZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RfYml0KFI1X0RpcmVjdEFjY2VzcywgJmRldi0+ZmxhZ3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGcgPSBkZXYtPnJlcS5iaV9pb192ZWNbMF0uYnZfcGFnZTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvcl9zcmNzW2NvdW50KytdID0gcGc7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgogCQl9CiAJfQogCkBAIC0xNzAwLDYgKzE4NDMsMTIgQEAKIAkJc2V0X2JpdChSNV9NYWRlR29vZCwgJnNoLT5kZXZbaV0uZmxhZ3MpOwogCiAJcmRldl9kZWNfcGVuZGluZyhjb25mLT5kaXNrc1tpXS5yZGV2LCBjb25mLT5tZGRldik7CisKKyNpZmRlZiBDT05GSUdfUkFJRF9aRVJPX0NPUFkKKyAgICAgICBpZiAodGVzdF9iaXQoUjVfRGlyZWN0QWNjZXNzLCAmc2gtPmRldltpXS5mbGFncykpIHsKKwkgICAgICAgcjVkZXZfcmVzdG9yZV9wYWdlKCZzaC0+ZGV2W2ldKTsKKyAgICAgICB9CisjZW5kaWYKIAkKIAljbGVhcl9iaXQoUjVfTE9DS0VELCAmc2gtPmRldltpXS5mbGFncyk7CiAJc2V0X2JpdChTVFJJUEVfSEFORExFLCAmc2gtPnN0YXRlKTsKQEAgLTI1MjAsNyArMjY2OSwxMSBAQAogCQlpZiAoc2gtPmRldltpXS53cml0dGVuKSB7CiAJCQlkZXYgPSAmc2gtPmRldltpXTsKIAkJCWlmICghdGVzdF9iaXQoUjVfTE9DS0VELCAmZGV2LT5mbGFncykgJiYKLQkJCQl0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpKSB7CisJCQkJKHRlc3RfYml0KFI1X1VQVE9EQVRFLCAmZGV2LT5mbGFncykKKyNpZmRlZiBDT05GSUdfUkFJRF9aRVJPX0NPUFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0ZXN0X2JpdChSNV9EaXJlY3RBY2Nlc3MsICZkZXYtPmZsYWdzKQorI2VuZGlmCisJCQkJKSkgewogCQkJCS8qIFdlIGNhbiByZXR1cm4gYW55IHdyaXRlIHJlcXVlc3RzICovCiAJCQkJc3RydWN0IGJpbyAqd2JpLCAqd2JpMjsKIAkJCQlpbnQgYml0bWFwX2VuZCA9IDA7CkBAIC0yNTI4LDYgKzI2ODEsOSBAQAogCQkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJCQl3YmkgPSBkZXYtPndyaXR0ZW47CiAJCQkJZGV2LT53cml0dGVuID0gTlVMTDsKKyNpZmRlZiBDT05GSUdfUkFJRF9aRVJPX0NPUFkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9iaXQoUjVfRGlyZWN0QWNjZXNzLCAmZGV2LT5mbGFncyk7CisjZW5kaWYKIAkJCQl3aGlsZSAod2JpICYmIHdiaS0+Ymlfc2VjdG9yIDwKIAkJCQkJZGV2LT5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUykgewogCQkJCQl3YmkyID0gcjVfbmV4dF9iaW8od2JpLCBkZXYtPnNlY3Rvcik7CkBAIC0zMjI3LDcgKzMzODMsMTEgQEAKIAkJLyogQWxsIHRoZSAnd3JpdHRlbicgYnVmZmVycyBhbmQgdGhlIHBhcml0eSBibG9jayBhcmUgcmVhZHkgdG8KIAkJICogYmUgd3JpdHRlbiBiYWNrIHRvIGRpc2sKIAkJICovCisjaWZkZWYgQ09ORklHX1JBSURfWkVST19DT1BZCisJCUJVR19PTighdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W3NoLT5wZF9pZHhdLmZsYWdzKSAmJiAhdGVzdF9iaXQoUjVfRGlyZWN0QWNjZXNzLCAmc2gtPmRldltzaC0+cGRfaWR4XS5mbGFncykpOworI2Vsc2UKIAkJQlVHX09OKCF0ZXN0X2JpdChSNV9VUFRPREFURSwgJnNoLT5kZXZbc2gtPnBkX2lkeF0uZmxhZ3MpKTsKKyNlbmRpZgogCQlCVUdfT04oc2gtPnFkX2lkeCA+PSAwICYmCiAJCSAgICAgICAhdGVzdF9iaXQoUjVfVVBUT0RBVEUsICZzaC0+ZGV2W3NoLT5xZF9pZHhdLmZsYWdzKSk7CiAJCWZvciAoaSA9IGRpc2tzOyBpLS07ICkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS5oIGIvZHJpdmVycy9tZC9yYWlkNS5oCmluZGV4IGUxMGM1NTMuLjlhMWMyYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDUuaAorKysgYi9kcml2ZXJzL21kL3JhaWQ1LmgKQEAgLTIwOCw2ICsyMDgsNyBAQAogCWF0b21pY190CQljb3VudDsJICAgICAgLyogbnIgb2YgYWN0aXZlIHRocmVhZC9yZXF1ZXN0cyAqLwogCWludAkJCWJtX3NlcTsJLyogc2VxdWVuY2UgbnVtYmVyIGZvciBiaXRtYXAgZmx1c2hlcyAqLwogCWludAkJCWRpc2tzOwkJLyogZGlza3MgaW4gc3RyaXBlICovCisJaW50IAkJemVyb19jb3B5X2NvdW50OwogCWVudW0gY2hlY2tfc3RhdGVzCWNoZWNrX3N0YXRlOwogCWVudW0gcmVjb25zdHJ1Y3Rfc3RhdGVzIHJlY29uc3RydWN0X3N0YXRlOwogCS8qKgpAQCAtMjI4LDEwICsyMjksMTEgQEAKIAlzdHJ1Y3QgcjVkZXYgewogCQlzdHJ1Y3QgYmlvCXJlcTsKIAkJc3RydWN0IGJpb192ZWMJdmVjOwotCQlzdHJ1Y3QgcGFnZQkqcGFnZTsKKwkJc3RydWN0IHBhZ2UJKnBhZ2UsICpwYWdlX3NhdmU7OwogCQlzdHJ1Y3QgYmlvCSp0b3JlYWQsICpyZWFkLCAqdG93cml0ZSwgKndyaXR0ZW47CiAJCXNlY3Rvcl90CXNlY3RvcjsJCQkvKiBzZWN0b3Igb2YgdGhpcyBwYWdlICovCiAJCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJCWRtYV9hZGRyX3QJcGdfZG1hOwogCX0gZGV2WzFdOyAvKiBhbGxvY2F0ZWQgd2l0aCBleHRyYSBzcGFjZSBkZXBlbmRpbmcgb2YgUkFJRCBnZW9tZXRyeSAqLwogfTsKIApAQCAtMjc1LDYgKzI3NywxNCBAQAogI2RlZmluZQlSNV9XYW50RlVBCTE0CS8qIFdyaXRlIHNob3VsZCBiZSBGVUEgKi8KICNkZWZpbmUJUjVfV3JpdGVFcnJvcgkxNQkvKiBnb3QgYSB3cml0ZSBlcnJvciAtIG5lZWQgdG8gcmVjb3JkIGl0ICovCiAjZGVmaW5lCVI1X01hZGVHb29kCTE2CS8qIEEgYmFkIGJsb2NrIGhhcyBiZWVuIGZpeGVkIGJ5IHdyaXRpbmcgdG8gaXQqLworCisjaWZkZWYgQ09ORklHX1JBSURfWkVST19DT1BZCisjZGVmaW5lIFI1X0RpcmVjdEFjY2VzcyAxNyAvKiBhY2Nlc3MgY2FjaGVkIHBhZ2VzIGRpcmVjdGx5IGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2ggcGFnZXMgKi8KKyNkZWZpbmUgUjVfRGlyZWN0QWNjZXNzTG9jayAxOAorI2VuZGlmCisKKwogLyoKICAqIFdyaXRlIG1ldGhvZAogICovCkBAIC0zMDYsNiArMzE2LDcgQEAKIAlTVFJJUEVfQklPRklMTF9SVU4sCiAJU1RSSVBFX0NPTVBVVEVfUlVOLAogCVNUUklQRV9PUFNfUkVRX1BFTkRJTkcsCisJU1RSSVBFX1pFUk9fQ09QWV9PUFMsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9LY29uZmlnCmluZGV4IDI4M2Q4ODcuLmI2ZDdlOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvS2NvbmZpZworKysgYi9kcml2ZXJzL210ZC9kZXZpY2VzL0tjb25maWcKQEAgLTk4LDcgKzk4LDcgQEAKIGNvbmZpZyBNMjVQWFhfVVNFX0ZBU1RfUkVBRAogCWJvb2wgIlVzZSBGQVNUX1JFQUQgT1BDb2RlIGFsbG93aW5nIFNQSSBDTEsgPD0gNTBNSHoiCiAJZGVwZW5kcyBvbiBNVERfTTI1UDgwCi0JZGVmYXVsdCB5CisJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBGQVNUX1JFQUQgYWNjZXNzIHN1cHBvcnRlZCBieSBTVCBNMjVQeHguCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMgYi9kcml2ZXJzL210ZC9kZXZpY2VzL20yNXA4MC5jCmluZGV4IDlmOTk4MmYuLjA1MDZkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL2RldmljZXMvbTI1cDgwLmMKKysrIGIvZHJpdmVycy9tdGQvZGV2aWNlcy9tMjVwODAuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvZmxhc2guaD4KIAorCiAvKiBGbGFzaCBvcGNvZGVzLiAqLwogI2RlZmluZQlPUENPREVfV1JFTgkJMHgwNgkvKiBXcml0ZSBlbmFibGUgKi8KICNkZWZpbmUJT1BDT0RFX1JEU1IJCTB4MDUJLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgKi8KQEAgLTEwMCw2ICsxMDEsNTQgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKG10ZCwgc3RydWN0IG0yNXAsIG10ZCk7CiB9CiAKKworaW50IG0yNXA4MF93cml0ZV90aGVuX3JlYWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJY29uc3Qgdm9pZCAqdHhidWYsIHVuc2lnbmVkIG5fdHgsCisJCXZvaWQgKnJ4YnVmLCB1bnNpZ25lZCBuX3J4KQoreworCXN0YXRpYyBERUZJTkVfTVVURVgobTI1cDgwX2xvY2spOworCWludAkJCXN0YXR1czsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UJbWVzc2FnZTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXhbMl07CisJdTgJCQkqbG9jYWxfYnVmOworCXVfY2hhciByeF9kYXRhWzhdOworCWludCBsZW5fdG9fdHggPSAwOworCWludCBsZW5fdHhfdG90YWwgPSAwOworCWludCBsZW5fdHhfZG9uZSA9IDA7CisKKwkvKiBVc2UgcHJlYWxsb2NhdGVkIERNQS1zYWZlIGJ1ZmZlci4gIFdlIGNhbid0IGF2b2lkIGNvcHlpbmcgaGVyZSwKKwkgKiAoYXMgYSBwdXJlIGNvbnZlbmllbmNlIHRoaW5nKSwgYnV0IHdlIGNhbiBrZWVwIGhlYXAgY29zdHMKKwkgKiBvdXQgb2YgdGhlIGhvdCBwYXRoIC4uLgorCSAqLworCWlmICgobl90eCArIG5fcngpID4gOCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiIyMjIyMgJXM6IHNpemUgZ3JlYXRlciB0aGFuIDggIyMjIyMjIyMjXG4iLF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7CisJbWVtc2V0KHgsIDAsIHNpemVvZiB4KTsKKworCWxlbl90b190eCA9IG5fdHggKyBuX3J4OworCisJeFswXS5sZW4gPSBsZW5fdG9fdHg7CisJeFswXS50eF9idWYgPSB0eGJ1ZjsKKwl4WzBdLnJ4X2J1ZiA9ICZyeF9kYXRhWzBdOworCisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhbMF0sICZtZXNzYWdlKTsKKworCW11dGV4X2xvY2soJm0yNXA4MF9sb2NrKTsKKworCS8qIGRvIHRoZSBpL28gKi8KKwlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKKwlpZiAoc3RhdHVzID09IDApCisJCW1lbWNweShyeGJ1ZiwgcnhfZGF0YSArIG5fdHgsIG5fcngpOworCisJbXV0ZXhfdW5sb2NrKCZtMjVwODBfbG9jayk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKQEAgLTExNyw3ICsxNjYsNyBAQAogCXU4IGNvZGUgPSBPUENPREVfUkRTUjsKIAl1OCB2YWw7CiAKLQlyZXR2YWwgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKGZsYXNoLT5zcGksICZjb2RlLCAxLCAmdmFsLCAxKTsKKwlyZXR2YWwgPSBtMjVwODBfd3JpdGVfdGhlbl9yZWFkKGZsYXNoLT5zcGksICZjb2RlLCAxLCAmdmFsLCAxKTsKIAogCWlmIChyZXR2YWwgPCAwKSB7CiAJCWRldl9lcnIoJmZsYXNoLT5zcGktPmRldiwgImVycm9yICVkIHJlYWRpbmcgU1JcbiIsCkBAIC0xNDgsNyArMTk3LDcgQEAKIHsKIAl1OAljb2RlID0gT1BDT0RFX1dSRU47CiAKLQlyZXR1cm4gc3BpX3dyaXRlX3RoZW5fcmVhZChmbGFzaC0+c3BpLCAmY29kZSwgMSwgTlVMTCwgMCk7CisJcmV0dXJuIG0yNXA4MF93cml0ZV90aGVuX3JlYWQoZmxhc2gtPnNwaSwgJmNvZGUsIDEsIE5VTEwsIDApOwogfQogCiAvKgpAQCAtMTU4LDcgKzIwNyw3IEBACiB7CiAJdTgJY29kZSA9IE9QQ09ERV9XUkRJOwogCi0JcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoZmxhc2gtPnNwaSwgJmNvZGUsIDEsIE5VTEwsIDApOworCXJldHVybiBtMjVwODBfd3JpdGVfdGhlbl9yZWFkKGZsYXNoLT5zcGksICZjb2RlLCAxLCBOVUxMLCAwKTsKIH0KIAogLyoKQEAgLTI0OSw4ICsyOTgsOCBAQAogICovCiBzdGF0aWMgaW50IGVyYXNlX3NlY3RvcihzdHJ1Y3QgbTI1cCAqZmxhc2gsIHUzMiBvZmZzZXQpCiB7Ci0JcHJfZGVidWcoIiVzOiAlcyAlZEtpQiBhdCAweCUwOHhcbiIsIGRldl9uYW1lKCZmbGFzaC0+c3BpLT5kZXYpLAotCQkJX19mdW5jX18sIGZsYXNoLT5tdGQuZXJhc2VzaXplIC8gMTAyNCwgb2Zmc2V0KTsKKwlwcl9kZWJ1ZygiJXM6ICVzICVkS2lCIGF0IDB4JTA4eCBjbWRzeiAlZFxuIiwgZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksCisJCQlfX2Z1bmNfXywgZmxhc2gtPm10ZC5lcmFzZXNpemUgLyAxMDI0LCBvZmZzZXQsIG0yNXBfY21kc3ooZmxhc2gpKTsKIAogCS8qIFdhaXQgdW50aWwgZmluaXNoZWQgcHJldmlvdXMgd3JpdGUgY29tbWFuZC4gKi8KIAlpZiAod2FpdF90aWxsX3JlYWR5KGZsYXNoKSkKQEAgLTMzOSw2ICszODgsNyBAQAogICogUmVhZCBhbiBhZGRyZXNzIHJhbmdlIGZyb20gdGhlIGZsYXNoIGNoaXAuICBUaGUgYWRkcmVzcyByYW5nZQogICogbWF5IGJlIGFueSBzaXplIHByb3ZpZGVkIGl0IGlzIHdpdGhpbiB0aGUgcGh5c2ljYWwgYm91bmRhcmllcy4KICAqLworI2lmIDAKIHN0YXRpYyBpbnQgbTI1cDgwX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBmcm9tLCBzaXplX3QgbGVuLAogCXNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1ZikKIHsKQEAgLTM3MSw2ICs0MjEsOCBAQAogCXRbMV0ubGVuID0gbGVuOwogCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CiAKKwlwcl9kZWJ1ZygiJXM6IHRbMF0ubGVuIDB4JXggdFsxXS5sZW4gMHgleFxuIixfX2Z1bmNfXywgdFswXS5sZW4sIHRbMV0ubGVuKTsKKwogCS8qIEJ5dGUgY291bnQgc3RhcnRzIGF0IHplcm8uICovCiAJKnJldGxlbiA9IDA7CiAKQEAgLTQwMCwxNCArNDUyLDk1IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgorCitzdGF0aWMgaW50IG0yNXA4MF9yZWFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwgc2l6ZV90IGxlbiwKKwlzaXplX3QgKnJldGxlbiwgdV9jaGFyICpidWYpCit7CisJc3RydWN0IG0yNXAgKmZsYXNoID0gbXRkX3RvX20yNXAobXRkKTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRbMl07CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CisJaW50IGxlbl90b190eCA9IDA7CisJaW50IGxlbl90eF90b3RhbCA9IDA7CisJaW50IGxlbl90eF9kb25lID0gMDsKKwlpbnQgaTsKKwl1X2NoYXIgcnhfZGF0YVs4XTsKKwlpbnQgY21kX3NpemUgPSBtMjVwX2NtZHN6KGZsYXNoKTsKKwlpbnQgbWF4X2RhdGFfbGVuID0gOCAtIG0yNXBfY21kc3ooZmxhc2gpOworCisJcHJfZGVidWcoIiVzOiAlcyBmcm9tIDB4JTA4eCxsZW4gJXpkXG4iLCBkZXZfbmFtZSgmZmxhc2gtPnNwaS0+ZGV2KSwKKwkJCV9fZnVuY19fLCAodTMyKWZyb20sIGxlbik7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJaWYgKGZyb20gKyBsZW4gPiBmbGFzaC0+bXRkLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUobGVuX3R4X2RvbmUgPCBsZW4pCisJeworCisJCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCQltZW1zZXQodCwgMCwgKHNpemVvZiB0KSk7CisKKwkJaWYoKGxlbiAtIGxlbl90eF9kb25lKSA8IG1heF9kYXRhX2xlbikKKwkJCWxlbl90b190eCA9IGxlbiAtIGxlbl90eF9kb25lOworCQllbHNlCisJCQlsZW5fdG9fdHggPSBtYXhfZGF0YV9sZW47CisJCS8qIE5PVEU6CisJCSAqIE9QQ09ERV9GQVNUX1JFQUQgKGlmIGF2YWlsYWJsZSkgaXMgZmFzdGVyLgorCQkgKiBTaG91bGQgYWRkIDEgYnl0ZSBEVU1NWV9CWVRFLgorCQkgKi8KKwkJdFswXS50eF9idWYgPSBmbGFzaC0+Y29tbWFuZDsKKwkJdFswXS5yeF9idWYgPSAmcnhfZGF0YVswXSA7CisJCXRbMF0ubGVuID0gY21kX3NpemUgKyBsZW5fdG9fdHg7CisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzBdLCAmbSk7CisKKworCQkvKiBCeXRlIGNvdW50IHN0YXJ0cyBhdCB6ZXJvLiAqLworCQkqcmV0bGVuID0gMDsKKworCQltdXRleF9sb2NrKCZmbGFzaC0+bG9jayk7CisKKwkJLyogV2FpdCB0aWxsIHByZXZpb3VzIHdyaXRlL2VyYXNlIGlzIGRvbmUuICovCisJCWlmICh3YWl0X3RpbGxfcmVhZHkoZmxhc2gpKSB7CisJCQkvKiBSRVZJU0lUIHN0YXR1cyByZXR1cm4/PyAqLworCQkJbXV0ZXhfdW5sb2NrKCZmbGFzaC0+bG9jayk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qIEZJWE1FIHN3aXRjaCB0byBPUENPREVfRkFTVF9SRUFELiAgSXQncyByZXF1aXJlZCBmb3IgaGlnaGVyCisJCSAqIGNsb2NrczsgYW5kIGF0IHRoaXMgd3JpdGluZywgZXZlcnkgY2hpcCB0aGlzIGRyaXZlciBoYW5kbGVzCisJCSAqIHN1cHBvcnRzIHRoYXQgb3Bjb2RlLgorCQkgKi8KKworCQkvKiBTZXQgdXAgdGhlIHdyaXRlIGRhdGEgYnVmZmVyLiAqLworCQlmbGFzaC0+Y29tbWFuZFswXSA9IE9QQ09ERV9SRUFEOworCQltMjVwX2FkZHIyY21kKGZsYXNoLCBmcm9tICsgbGVuX3R4X2RvbmUsIGZsYXNoLT5jb21tYW5kKTsKKworCQlzcGlfc3luYyhmbGFzaC0+c3BpLCAmbSk7CisKKwkJbWVtY3B5KGJ1ZiArIGxlbl90eF9kb25lLCAmcnhfZGF0YVtjbWRfc2l6ZV0sIGxlbl90b190eCk7CisKKwkJbGVuX3R4X2RvbmUgKz0gbGVuX3RvX3R4Oy8vdmFsaWQgZGF0YSB3aGljaCB3aWxsIGJlIHJlYWQgb3V0IG9mIDggYnl0ZXMKKworCQltdXRleF91bmxvY2soJmZsYXNoLT5sb2NrKTsKKwl9CisKKwkqcmV0bGVuID0gbGVuX3R4X2RvbmU7CisKKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIFdyaXRlIGFuIGFkZHJlc3MgcmFuZ2UgdG8gdGhlIGZsYXNoIGNoaXAuICBEYXRhIG11c3QgYmUgd3JpdHRlbiBpbgogICogRkxBU0hfUEFHRVNJWkUgY2h1bmtzLiAgVGhlIGFkZHJlc3MgcmFuZ2UgbWF5IGJlIGFueSBzaXplIHByb3ZpZGVkCiAgKiBpdCBpcyB3aXRoaW4gdGhlIHBoeXNpY2FsIGJvdW5kYXJpZXMuCiAgKi8KKyNpZiAwCiBzdGF0aWMgaW50IG0yNXA4MF93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAotCXNpemVfdCAqcmV0bGVuLCBjb25zdCB1X2NoYXIgKmJ1ZikKKwkJc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQogewogCXN0cnVjdCBtMjVwICpmbGFzaCA9IG10ZF90b19tMjVwKG10ZCk7CiAJdTMyIHBhZ2Vfb2Zmc2V0LCBwYWdlX3NpemU7CkBAIC00OTYsNiArNjI5LDc4IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgorCitzdGF0aWMgaW50IG0yNXA4MF93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLCBzaXplX3QgbGVuLAorCQlzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpCit7CisJc3RydWN0IG0yNXAgKmZsYXNoID0gbXRkX3RvX20yNXAobXRkKTsKKwl1MzIgcGFnZV9vZmZzZXQsIHBhZ2Vfc2l6ZTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRbMl07CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CisJdV9jaGFyIHR4X2J1Zls4XTsKKwlpbnQgbGVuX3RvX3R4ID0gMDsKKwlpbnQgbGVuX3R4X3RvdGFsID0gMDsKKwlpbnQgbGVuX3R4X2RvbmUgPSAwOworCWludCBjbWRfc2l6ZSA9IG0yNXBfY21kc3ooZmxhc2gpOworCWludCBtYXhfZGF0YV9sZW4gPSA4IC0gbTI1cF9jbWRzeihmbGFzaCk7CisKKwlwcl9kZWJ1ZygiJXM6ICVzIHRvIDB4JTA4eCwgbGVuICV6ZFxuIiwgZGV2X25hbWUoJmZsYXNoLT5zcGktPmRldiksCisJCQlfX2Z1bmNfXywgKHUzMil0bywgbGVuKTsKKworCSpyZXRsZW4gPSAwOworCisJLyogc2FuaXR5IGNoZWNrcyAqLworCWlmICghbGVuKQorCQlyZXR1cm4oMCk7CisKKwlpZiAodG8gKyBsZW4gPiBmbGFzaC0+bXRkLnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZmxhc2gtPmxvY2spOworCisJd2hpbGUobGVuX3R4X2RvbmUgPCBsZW4pCisJeworCisJCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCQltZW1zZXQodCwgMCwgKHNpemVvZiB0KSk7CisKKwkJaWYoKGxlbiAtIGxlbl90eF9kb25lKSA8IG1heF9kYXRhX2xlbikKKwkJCWxlbl90b190eCA9IGxlbiAtIGxlbl90eF9kb25lOworCQllbHNlCisJCQlsZW5fdG9fdHggPSBtYXhfZGF0YV9sZW47CisKKwkJLyogU2V0IHVwIHRoZSBvcGNvZGUgaW4gdGhlIHdyaXRlIGJ1ZmZlci4gKi8KKwkJZmxhc2gtPmNvbW1hbmRbMF0gPSBPUENPREVfUFA7CisJCW0yNXBfYWRkcjJjbWQoZmxhc2gsIHRvICsgbGVuX3R4X2RvbmUsIGZsYXNoLT5jb21tYW5kKTsKKwkJbWVtY3B5KCZ0eF9idWZbMF0sIGZsYXNoLT5jb21tYW5kLCBjbWRfc2l6ZSk7CisJCW1lbWNweSgmdHhfYnVmW2NtZF9zaXplXSwgYnVmICsgbGVuX3R4X2RvbmUsIGxlbl90b190eCk7CisKKwkJdFswXS50eF9idWYgPSAmdHhfYnVmWzBdOworCQl0WzBdLmxlbiA9IGNtZF9zaXplICsgbGVuX3RvX3R4OworCisJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzBdLCAmbSk7CisKKwkJLyogV2FpdCB1bnRpbCBmaW5pc2hlZCBwcmV2aW91cyB3cml0ZSBjb21tYW5kLiAqLworCQlpZiAod2FpdF90aWxsX3JlYWR5KGZsYXNoKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZmbGFzaC0+bG9jayk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXdyaXRlX2VuYWJsZShmbGFzaCk7CisKKwkJc3BpX3N5bmMoZmxhc2gtPnNwaSwgJm0pOworCisJCWxlbl90eF9kb25lICs9IGxlbl90b190eDsvL3ZhbGlkIGRhdGEgd2hpY2ggc2VudCBvdXQgb2YgOCBieXRlcworCX0KKworCSpyZXRsZW4gPSBsZW5fdHhfZG9uZTsKKworCW11dGV4X3VubG9jaygmZmxhc2gtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKIAogc3RhdGljIGludCBzc3Rfd3JpdGUoc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCB0bywgc2l6ZV90IGxlbiwKIAkJc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQpAQCAtNzgzLDcgKzk4OCw3IEBACiAJICogc3RyaW5nIGZvciBhZnRlciB2ZW5kb3Itc3BlY2lmaWMgZGF0YSwgYWZ0ZXIgdGhlIHRocmVlIGJ5dGVzCiAJICogd2UgdXNlIGhlcmUuICBTdXBwb3J0aW5nIHNvbWUgY2hpcHMgbWlnaHQgcmVxdWlyZSB1c2luZyBpdC4KIAkgKi8KLQl0bXAgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgJmNvZGUsIDEsIGlkLCA1KTsKKwl0bXAgPSBtMjVwODBfd3JpdGVfdGhlbl9yZWFkKHNwaSwgJmNvZGUsIDEsIGlkLCA1KTsKIAlpZiAodG1wIDwgMCkgewogCQlwcl9kZWJ1ZygiJXM6IGVycm9yICVkIHJlYWRpbmcgSkVERUMgSURcbiIsCiAJCQkJZGV2X25hbWUoJnNwaS0+ZGV2KSwgdG1wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9tYXBzL01ha2VmaWxlCmluZGV4IDQ1ZGNiOGIuLmNlYmMxMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9NYWtlZmlsZQpAQCAtNTgsMyArNTgsNCBAQAogb2JqLSQoQ09ORklHX01URF9CQ005NjNYWCkJKz0gYmNtOTYzeHgtZmxhc2gubwogb2JqLSQoQ09ORklHX01URF9MQVRDSF9BRERSKQkrPSBsYXRjaC1hZGRyLWZsYXNoLm8KIG9iai0kKENPTkZJR19NVERfTEFOVElRKQkrPSBsYW50aXEtZmxhc2gubworb2JqLSQoQ09ORklHX01URF9DT01DRVJUT19OT1IpICArPSBjb21jZXJ0by1ub3IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9jb21jZXJ0by1ub3IuYyBiL2RyaXZlcnMvbXRkL21hcHMvY29tY2VydG8tbm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwOTdmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbXRkL21hcHMvY29tY2VydG8tbm9yLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9tdGQvbWFwcy9jb21jZXJ0by1ub3IuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwOCBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKnBhcnRfcHJvYmVzW10gPSB7ICJjbWRsaW5lcGFydCIsIE5VTEwgfTsKKworc3RydWN0IGNvbWNlcnRvZmxhc2hfaW5mbyB7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisJc3RydWN0IG1hcF9pbmZvIG1hcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNvbWNlcnRvZmxhc2hfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBjb21jZXJ0b2ZsYXNoX2luZm8gKmluZm87CisJc3RydWN0IGZsYXNoX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwZGV2LT5yZXNvdXJjZTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCisKKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvbWNlcnRvZmxhc2hfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBjb21jZXJ0b2ZsYXNoX2luZm8pKTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHNpemUsICJmbGFzaCIpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXRfZnJlZV9pbmZvOworCX0KKworCWluZm8tPm1hcC52aXJ0ID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpZiAoIWluZm8tPm1hcC52aXJ0KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisKKwlpbmZvLT5tYXAubmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCWluZm8tPm1hcC5waHlzID0gcmVzLT5zdGFydDsKKwlpbmZvLT5tYXAuc2l6ZSA9IHNpemU7CisJaW5mby0+bWFwLmJhbmt3aWR0aCA9IHBkYXRhLT53aWR0aDsKKwkvLyBpbmZvLT5tYXAuc2V0X3ZwcCAgPSBjb21jZXJ0b19zZXRfdnBwOworCisJc2ltcGxlX21hcF9pbml0KCZpbmZvLT5tYXApOworCisJaW5mby0+bXRkID0gZG9fbWFwX3Byb2JlKHBkYXRhLT5tYXBfbmFtZSwgJmluZm8tPm1hcCk7CisJaWYgKCFpbmZvLT5tdGQpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisJaW5mby0+bXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CisKKyAgICAgICAgZXJyID0gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihpbmZvLT5tdGQsIHBhcnRfcHJvYmVzLCBwZGV2LT5yZXNvdXJjZS0+c3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwZGF0YS0+cGFydHMsIHBkYXRhLT5ucl9wYXJ0cyk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBwYXJzZSBwYXJ0aXRpb25zXG4iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgfQorCisJcmV0dXJuIDA7CisKKyAgICAgIG91dF9pb3VubWFwOgorCWlvdW5tYXAoaW5mby0+bWFwLnZpcnQpOworICAgICAgb3V0X3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgc2l6ZSk7CisgICAgICBvdXRfZnJlZV9pbmZvOgorCWtmcmVlKGluZm8pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgY29tY2VydG9mbGFzaF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY29tY2VydG9mbGFzaF9pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisgICAgICAgIHN0cnVjdCBmbGFzaF9wbGF0Zm9ybV9kYXRhICpwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworICAgICAgICBpZighaW5mbykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoaW5mby0+bXRkKSB7CisgICAgICAgICAgICAgICAgbXRkX2RldmljZV91bnJlZ2lzdGVyKGluZm8tPm10ZCk7CisgICAgICAgICAgICAgICAgbWFwX2Rlc3Ryb3koaW5mby0+bXRkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5mby0+bWFwLnZpcnQpCisgICAgICAgICAgICAgICAgaW91bm1hcChpbmZvLT5tYXAudmlydCk7CisKKyAgICAgICAgaWYgKGluZm8tPnJlcykgeworICAgICAgICAgICAgICAgIHJlbGVhc2VfcmVzb3VyY2UoaW5mby0+cmVzKTsKKyAgICAgICAgICAgICAgICBrZnJlZShpbmZvLT5yZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBsYXQtPmV4aXQpCisgICAgICAgICAgICAgICAgcGxhdC0+ZXhpdCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNvbWNlcnRvZmxhc2hfZHJpdmVyID0geworCS5wcm9iZSA9IGNvbWNlcnRvZmxhc2hfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGNvbWNlcnRvZmxhc2hfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJjb21jZXJ0b2ZsYXNoIiwKKwkJICAgfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNvbWNlcnRvZmxhc2hfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNvbWNlcnRvZmxhc2hfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNvbWNlcnRvZmxhc2hfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjb21jZXJ0b2ZsYXNoX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNvbWNlcnRvZmxhc2hfaW5pdCk7Cittb2R1bGVfZXhpdChjb21jZXJ0b2ZsYXNoX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1URCBOT1IgbWFwIGRyaXZlciBmb3IgTWluZHNwZWVkIENvbWNlcnRvIGJvYXJkcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCmluZGV4IGNjZTdiNzAuLmU3YTk0NDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCkBAIC00Niw2ICs0NiwxOCBAQAogCSAgRUNDIGNvZGVzLiBUaGV5IGFyZSB1c2VkIHdpdGggTkFORCBkZXZpY2VzIHJlcXVpcmluZyBtb3JlIHRoYW4gMSBiaXQKIAkgIG9mIGVycm9yIGNvcnJlY3Rpb24uCiAKK2NvbmZpZyBOQU5EX0NPTUNFUlRPX0VDQ184X0hXX0JDSAorCWJvb2wKKwlkZXBlbmRzIG9uIE1URF9OQU5EX0NPTUNFUlRPCisJZGVmYXVsdCBuCisJcHJvbXB0ICJDb21jZXJ0byBFQ0MtOCBzeW5kcm9tZSBjYWxjdWxhdGlvbiB1c2luZyBCQ0giCisKK2NvbmZpZyBOQU5EX0NPTUNFUlRPX0VDQ18yNF9IV19CQ0gKKwlib29sCisJZGVwZW5kcyBvbiBNVERfTkFORF9DT01DRVJUTworCWRlZmF1bHQgeQorCXByb21wdCAiQ29tY2VydG8gRUNDLTI0IHN5bmRyb21lIGNhbGN1bGF0aW9uIHVzaW5nIEJDSCIKKwogY29uZmlnIE1URF9TTV9DT01NT04KIAl0cmlzdGF0ZQogCWRlZmF1bHQgbgpAQCAtNTM3LDQgKzU0OSwxMCBAQAogCSAgRW5hYmxlcyBzdXBwb3J0IGZvciBOQU5EIEZsYXNoIGNoaXBzIG9uIHRoZSBTVCBNaWNyb2VsZWN0cm9uaWNzCiAJICBGbGV4aWJsZSBTdGF0aWMgTWVtb3J5IENvbnRyb2xsZXIgKEZTTUMpCiAKK2NvbmZpZyBNVERfTkFORF9DT01DRVJUTworICAgICAgICB0cmlzdGF0ZSAiQ29tY2VydG8gTkFORCBkcml2ZXIiCisJZGVwZW5kcyBvbiBNVERfTkFORCAmJiAoQVJDSF9DT01DRVJUTykKKwloZWxwCisJCUNvbWNlcnRvIE5BTkQgRHJpdmVyLgorCiBlbmRpZiAjIE1URF9OQU5ECmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlIGIvZHJpdmVycy9tdGQvbmFuZC9NYWtlZmlsZQppbmRleCA2MThmNGJhLi4wNzYzOTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKQEAgLTQ5LDUgKzQ5LDYgQEAKIG9iai0kKENPTkZJR19NVERfTkFORF9SSUNPSCkJCSs9IHI4NTIubwogb2JqLSQoQ09ORklHX01URF9OQU5EX0paNDc0MCkJCSs9IGp6NDc0MF9uYW5kLm8KIG9iai0kKENPTkZJR19NVERfTkFORF9HUE1JX05BTkQpCSs9IGdwbWktbmFuZC8KK29iai0kKENPTkZJR19NVERfTkFORF9DT01DRVJUTykJCSs9IGNvbWNlcnRvX25hbmQubwogCiBuYW5kLW9ianMgOj0gbmFuZF9iYXNlLm8gbmFuZF9iYnQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9jb21jZXJ0b19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2NvbWNlcnRvX25hbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM0MzlhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9jb21jZXJ0b19uYW5kLmMKQEAgLTAsMCArMSw3NTkgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9tdGQvbmFuZC9jb21jZXJ0by1uYW5kLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgT3ZlcnZpZXc6CisgKiAgIFRoaXMgaXMgYSBkZXZpY2UgZHJpdmVyIGZvciB0aGUgTkFORCBmbGFzaCBkZXZpY2UgZm91bmQgb24gdGhlCisgKiAgIENvbWNlcnRvIGJvYXJkIHdoaWNoIHV0aWxpemVzIHRoZSBUb3NoaWJhIFRDNThWNjRBRlQgcGFydC4gVGhpcyBpcworICogICBhIDEyOE1pYml0ICg4TWlCIHggOCBiaXRzKSBOQU5EIGZsYXNoIGRldmljZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bWFjaC9lY2MuaD4KKworLyoKKyAqIE1URCBzdHJ1Y3R1cmUgZm9yIENvbWNlcnRvIGJvYXJkCisgKi8KK3N0cnVjdCBjb21jZXJ0b19uYW5kX2luZm8geworCXN0cnVjdCBtdGRfcGFydGl0aW9uCSpwYXJ0czsKKwlzdHJ1Y3QgbXRkX2luZm8JCSptdGQ7Cit9OworCitzdGF0aWMgdm9pZCBfX2lvbWVtICplY2NfYmFzZV9hZGRyOworCisvKgorICogRGVmaW5lIHBhcnRpdGlvbnMgZm9yIGZsYXNoIGRldmljZQorICovCisKKy8qIFBhcnRpdGlvbnMgY29taW5nIGZyb20gY29tbWFuZCBsaW5lKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwYXJ0X3Byb2Jlc1tdID0geyAiY21kbGluZXBhcnQiLCBOVUxMIH07CisKK3VpbnQzMl90IENPTUNFUlRPX05BTkRfQUxFID0gMHgwMDAwMDIwMDsKK3VpbnQzMl90IENPTUNFUlRPX05BTkRfQ0xFID0gMHgwMDAwMDQwMDsKKworI2lmZGVmIENPTkZJR19OQU5EX0NPTUNFUlRPX0VDQ18yNF9IV19CQ0gKKy8qCisgKiBzcGFyZSBhcmVhIGxheW91dCBmb3IgQkNIIEVDQyBieXRlcyBjYWxjdWxhdGVkIG92ZXIgNTEyLUJ5dGVzIEVDQyBibG9jayBzaXplCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgY29tY2VydG9fZWNjX2luZm9fNTEyX2JjaCA9IHsKKwkuZWNjYnl0ZXMgPSA0MiwKKwkuZWNjcG9zID0gezAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLAorCQkgIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLAorCQkgIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLAorCQkgIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MX0sCisJLm9vYmZyZWUgPSB7CisJCXsub2Zmc2V0ID0gNDMsIC5sZW5ndGggPSAxM30KKwl9Cit9OworCisvKgorICogc3BhcmUgYXJlYSBsYXlvdXQgZm9yIEJDSCBFQ0MgYnl0ZXMgY2FsY3VsYXRlZCBvdmVyIDEwMjQtQnl0ZXMgRUNDIGJsb2NrIHNpemUKKyAqLworc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBjb21jZXJ0b19lY2NfaW5mb18xMDI0X2JjaCA9IHsKKwkuZWNjYnl0ZXMgPSA0MiwKKwkuZWNjcG9zID0gezAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLAorCQkgIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLAorCQkgIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLAorCQkgIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MX0sCisJLm9vYmZyZWUgPSB7CisJCXsub2Zmc2V0ID0gNDMsIC5sZW5ndGggPSAxM30KKwl9Cit9OworCisjZWxpZiBDT05GSUdfTkFORF9DT01DRVJUT19FQ0NfOF9IV19CQ0gKKworLyoKKyAqIHNwYXJlIGFyZWEgbGF5b3V0IGZvciBCQ0ggRUNDIGJ5dGVzIGNhbGN1bGF0ZWQgb3ZlciA1MTItQnl0ZXMgRUNDIGJsb2NrIHNpemUKKyAqLworc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBjb21jZXJ0b19lY2NfaW5mb181MTJfYmNoID0geworCS5lY2NieXRlcyA9IDE0LAorCS5lY2Nwb3MgPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwKKwkJICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9LAorCS5vb2JmcmVlID0geworCQl7Lm9mZnNldCA9IDE1LCAubGVuZ3RoID0gMX0KKwl9Cit9OworCisvKgorICogc3BhcmUgYXJlYSBsYXlvdXQgZm9yIEJDSCBFQ0MgYnl0ZXMgY2FsY3VsYXRlZCBvdmVyIDEwMjQtQnl0ZXMgRUNDIGJsb2NrIHNpemUKKyAqLworc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBjb21jZXJ0b19lY2NfaW5mb18xMDI0X2JjaCA9IHsKKwkuZWNjYnl0ZXMgPSAxNCwKKwkuZWNjcG9zID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsCisJCSAgIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfSwKKwkub29iZnJlZSA9IHsKKwkJey5vZmZzZXQgPSAxNSwgLmxlbmd0aCA9IDE3fQorCX0KK307CisKKyNlbHNlCisKKy8qCisgKiBzcGFyZSBhcmVhIGxheW91dCBmb3IgSGFtbWluZyBFQ0MgYnl0ZXMgY2FsY3VsYXRlZCBvdmVyIDUxMi1CeXRlcyBFQ0MgYmxvY2sKKyAqIHNpemUKKyAqLworc3RhdGljIHN0cnVjdCBuYW5kX2VjY2xheW91dCBjb21jZXJ0b19lY2NfaW5mb181MTJfaGFtbSA9IHsKKwkuZWNjYnl0ZXMgPSA0LAorCS5lY2Nwb3MgPSB7MCwgMSwgMiwgM30sCisJLm9vYmZyZWUgPSB7CisJCXsub2Zmc2V0ID0gNSwgLmxlbmd0aCA9IDEyfQorCX0KK307CisKKy8qCisgKiBzcGFyZSBhcmVhIGxheW91dCBmb3IgSGFtbWluZyBFQ0MgYnl0ZXMgY2FsY3VsYXRlZCBvdmVyIDEwMjQtQnl0ZXMgRUNDIGJsb2NrCisgKiBzaXplCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgY29tY2VydG9fZWNjX2luZm9fMTAyNF9oYW1tID0geworCS5lY2NieXRlcyA9IDQsCisJLmVjY3BvcyA9IHswLCAxLCAyLCAzfSwKKwkub29iZnJlZSA9IHsKKwkJey5vZmZzZXQgPSA1LCAubGVuZ3RoID0gMjh9CisJfQorfTsKKyNlbmRpZgorCitzdGF0aWMgdWludDhfdCBiYnRfcGF0dGVybltdID0geyAnQicsICdiJywgJ3QnLCAnMCcgfTsKK3N0YXRpYyB1aW50OF90IG1pcnJvcl9wYXR0ZXJuW10gPSB7ICcxJywgJ3QnLCAnYicsICdCJyB9OworCitzdGF0aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIGJidF9tYWluX2Rlc2NyID0geworCS5vcHRpb25zID0gTkFORF9CQlRfTEFTVEJMT0NLIHwgTkFORF9CQlRfQ1JFQVRFIHwgTkFORF9CQlRfV1JJVEUKKwkJfCBOQU5EX0JCVF84QklUIHwgTkFORF9CQlRfVkVSU0lPTiB8IE5BTkRfQkJUX1BFUkNISVAsCisJLm9mZnMgPSA0NCwKKwkubGVuID0gNCwKKwkudmVyb2ZmcyA9IDQ4LAorCS5tYXhibG9ja3MgPSA4LAorCS5wYXR0ZXJuID0gYmJ0X3BhdHRlcm4sCit9OworCitzdGF0aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIGJidF9taXJyb3JfZGVzY3IgPSB7CisJLm9wdGlvbnMgPSBOQU5EX0JCVF9MQVNUQkxPQ0sgfCBOQU5EX0JCVF9DUkVBVEUgfCBOQU5EX0JCVF9XUklURQorCQl8IE5BTkRfQkJUXzhCSVQgfCBOQU5EX0JCVF9WRVJTSU9OIHwgTkFORF9CQlRfUEVSQ0hJUCwKKwkub2ZmcyA9IDQ0LAorCS5sZW4gPSA0LAorCS52ZXJvZmZzID0gNDgsCisJLm1heGJsb2NrcyA9IDgsCisJLnBhdHRlcm4gPSBtaXJyb3JfcGF0dGVybiwKK307CisKK3N0YXRpYyB1aW50OF90IHNjYW5fZmZfcGF0dGVybltdID0geyAweGZmIH07CisKKyNpZmRlZiBDT05GSUdfTkFORF9DT01DRVJUT19FQ0NfMjRfSFdfQkNICitzdGF0aWMgc3RydWN0IG5hbmRfYmJ0X2Rlc2NyIGMyMDAwX2JhZGJsb2NrX3BhdHRlcm4gPSB7CisJLm9mZnMgPSA0MiwKKwkubGVuID0gMSwKKwkucGF0dGVybiA9IHNjYW5fZmZfcGF0dGVybgorfTsKKyNlbGlmIENPTkZJR19OQU5EX0NPTUNFUlRPX0VDQ184X0hXX0JDSAorc3RhdGljIHN0cnVjdCBuYW5kX2JidF9kZXNjciBjMjAwMF9iYWRibG9ja19wYXR0ZXJuID0geworCS5vZmZzID0gMTQsCisJLmxlbiA9IDEsCisJLnBhdHRlcm4gPSBzY2FuX2ZmX3BhdHRlcm4KK307CisjZW5kaWYKKworLyoqIERpc2FibGUvRW5hYmxlIHNoaWZ0aW5nIG9mIGRhdGEgdG8gcGFyaXR5IG1vZHVsZQorICoKKyAqIEBwYXJhbVtpbl0gZW5fZGlzX3NoaWZ0ICBFbmFibGUgb3IgZGlzYWJsZSBzaGlmdCB0byBwYXJpdHkgbW9kdWxlLgorICoKKyAqLworc3RhdGljIHZvaWQgY29tY2VydG9fZWNjX3NoaWZ0KHVpbnQ4X3QgZW5fZGlzX3NoaWZ0KQoreworCXdyaXRlbF9yZWxheGVkKGVuX2Rpc19zaGlmdCwgZWNjX2Jhc2VfYWRkciArIEVDQ19TSElGVF9FTl9DRkcpOworfQorCisvKiogSW5pdGlhbGl6ZXMgaC93IEVDQyB3aXRoIHByb3BlciBjb25maWd1cmF0aW9uIHZhbHVlcy4KKyAqCisgKiBAcGFyYW1baW5dIG10ZAlNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBtb2RlCVNlbGVjdCBiZXR3ZWVuIEJDSCBhbmQgSGFtbWluZworICoKKyAqLworc3RhdGljIHZvaWQgY29tY2VydG9fZW5hYmxlX2h3X2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgaW50IG1vZGUpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9kZXZpY2UgPSAoc3RydWN0IG5hbmRfY2hpcCAqKShtdGQtPnByaXYpOworCXVpbnQzMl90IGVjY19nZW5fY2ZnX3ZhbCA9IDA7CisKKworCS8qIENTNCB3aWxsIGhhdmUgdGhlIG9wdGlvbiBmb3IgRUNDIGNhbGN1bGF0aW9uICovCisJd3JpdGVsX3JlbGF4ZWQoRUNDX0NTNF9TRUwsIGVjY19iYXNlX2FkZHIgKyBFQ0NfQ1NfU0VMX0NGRyk7CisKKwkvKiBwYXJpdHkgY2FsY3VsYXRpb24gZm9yIHdyaXRlLCBzeW5kcm9tZSBjYWxjdWxhdGlvbiBmb3IgcmVhZC4qLworCShtb2RlID09IE5BTkRfRUNDX1dSSVRFKSA/IChlY2NfZ2VuX2NmZ192YWwgfD0gUFJUWV9DQUxDKSA6IChlY2NfZ2VuX2NmZ192YWwgJj0gU1lORFJPTUVfQ0FMQyk7CisKKyNpZiBkZWZpbmVkIChDT05GSUdfTkFORF9DT01DRVJUT19FQ0NfOF9IV19CQ0gpIHx8IGRlZmluZWQgKENPTkZJR19OQU5EX0NPTUNFUlRPX0VDQ18yNF9IV19CQ0gpCisJZWNjX2dlbl9jZmdfdmFsICY9IEJDSF9NT0RFOworCWVjY19nZW5fY2ZnX3ZhbCA9IChlY2NfZ2VuX2NmZ192YWwgJiB+KEVDQ19MVkxfTUFTSykpIHwgKEVDQ19MVkxfVkFMIDw8IEVDQ19MVkxfU0hJRlQpOworI2Vsc2UKKwllY2NfZ2VuX2NmZ192YWwgfD0gSEFNTV9NT0RFOworI2VuZGlmCisKKwllY2NfZ2VuX2NmZ192YWwgPSAoZWNjX2dlbl9jZmdfdmFsICYgfihCTEtfU0laRV9NQVNLKSkgfCBuYW5kX2RldmljZS0+ZWNjLnNpemU7CisKKwl3cml0ZWxfcmVsYXhlZChlY2NfZ2VuX2NmZ192YWwsIGVjY19iYXNlX2FkZHIgKyBFQ0NfR0VOX0NGRyk7CisJLyogUmVzZXQgcGFyaXR5IG1vZHVsZSBhbmQgbGF0Y2ggY29uZmlndXJlZCB2YWx1ZXMgKi8KKwl3cml0ZWxfcmVsYXhlZChFQ0NfSU5JVCwgZWNjX2Jhc2VfYWRkciArIEVDQ19JTklUX0NGRyk7CisJY29tY2VydG9fZWNjX3NoaWZ0KEVDQ19TSElGVF9FTkFCTEUpOworCXJldHVybjsKK30KKworLyoqIHdyaXRlcyBFQ0MgYnl0ZXMgZ2VuZXJhdGVkIGJ5IHRoZSBwYXJpdHkgbW9kdWxlIGludG8gdGhlIGZsYXNoCisgKgorICogQHBhcmFtW2luXSBtdGQJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gZGF0CXJhdyBkYXRhCisgKiBAcGFyYW1baW5dIGVjY19jb2RlCWJ1ZmZlciBmb3IgRUNDCisgKgorICovCitzdGF0aWMgaW50IGNvbWNlcnRvX2NhbGN1bGF0ZV9lY2Moc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJICBjb25zdCB1aW50OF90ICpkYXQsCisJCQkJICB1aW50OF90ICplY2NfY29kZSkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kX2RldmljZSA9IG10ZC0+cHJpdjsKKwl1aW50MzJfdCBlY2NfYnl0ZXMgPSBuYW5kX2RldmljZS0+ZWNjLmJ5dGVzOworCXVpbnQ4X3QgZHVtbXlfdmFyID0gMHhGRjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvID0gamlmZmllcyArIDI7CisKKwljb21jZXJ0b19lY2Nfc2hpZnQoRUNDX1NISUZUX0RJU0FCTEUpOworCisJZG8geworCQlpZiAoKHJlYWRsX3JlbGF4ZWQoZWNjX2Jhc2VfYWRkciArIEVDQ19JRExFX1NUQVQpKSAmIEVDQ19JRExFKQorCQkJYnJlYWs7CisJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lbykpOworCisJY29tY2VydG9fZWNjX3NoaWZ0KEVDQ19TSElGVF9FTkFCTEUpOworCisJd3JpdGVsX3JlbGF4ZWQoRUNDX1BBUklUWV9PVVRfRU4sIGVjY19iYXNlX2FkZHIgKyBFQ0NfUFJUWV9PVVRfU0VMX0NGRyk7CisKKwkvKiBFdmVuIHRob3VnaCB3ZSBkbyBhIGR1bW15IHdyaXRlIHRvIE5BTkQgZmxhc2gsIGFjdHVhbCBFQ0MgYnl0ZXMgYXJlCisJICogd3JpdHRlbiB0byB0aGUgRUNDIGxvY2F0aW9uIGluIHRoZSBmbGFzaC4gKi8KKwlmb3IgKCA7IGVjY19ieXRlczsgZWNjX2J5dGVzLS0pCisJCXdyaXRlYihkdW1teV92YXIsIG5hbmRfZGV2aWNlLT5JT19BRERSX1cpOworCisJY29tY2VydG9fZWNjX3NoaWZ0KEVDQ19TSElGVF9ESVNBQkxFKTsKKwl3cml0ZWxfcmVsYXhlZChFQ0NfUEFSSVRZX09VVF9ESVNBQkxFLCBlY2NfYmFzZV9hZGRyICsgRUNDX1BSVFlfT1VUX1NFTF9DRkcpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBDaGVja3MgRUNDIHJlZ2lzdGVycyBmb3IgZXJyb3JzIGFuZCB3aWxsIGNvcnJlY3QgdGhlbSwgaWYgY29ycmVjdGFibGUKKyAqCisgKiBAcGFyYW1baW5dIG10ZAlNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBkYXQJcmF3IGRhdGEKKyAqIEBwYXJhbVtpbl0gcmVhZF9lY2MgIEVDQyByZWFkIG91dCBmcm9tIGZsYXNoCisgKiBAcGFyYW1baW5dIGNhbGNfZWNjCUVDQyBjYWxjdWxhdGVkIG92ZXIgdGhlIHJhdyBkYXRhCisgKgorICovCitzdGF0aWMgaW50IGNvbWNlcnRvX2NvcnJlY3RfZWNjKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpkYXQsCisJCXVpbnQ4X3QgKnJlYWRfZWNjLCB1aW50OF90ICpjYWxjX2VjYykKK3sKKyNpZiAhZGVmaW5lZCAoQ09ORklHX05BTkRfQ09NQ0VSVE9fRUNDXzhfSFdfQkNIKSAmJiAhZGVmaW5lZCAoQ09ORklHX05BTkRfQ09NQ0VSVE9fRUNDXzI0X0hXX0JDSCkKKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kX2RldmljZSA9IG10ZC0+cHJpdjsKKyNlbHNlCisJdWludDhfdCBlcnJfY291bnQgPSAwOworCXVpbnQzMl90IGVycl9jb3JyX2RhdGFfcHJldjsKKyNlbmRpZgorCXVpbnQzMl90IGVycl9jb3JyX2RhdGE7CisJdWludDE2X3QgbWFzaywgaW5kZXg7CisJdWludDMyX3QgdGVtcF9uYW5kX2VjY19lcnJvcnNbNF07CisJdW5zaWduZWQgbG9uZyB0aW1lbyA9IGppZmZpZXMgKyAyOworCisJIC8qIFdhaXQgZm9yIHN5bmRyb21lIGNhbGN1bGF0aW9uIHRvIGNvbXBsZXRlICovCisJZG8geworCQlpZiAoKHJlYWRsX3JlbGF4ZWQoZWNjX2Jhc2VfYWRkciArIEVDQ19JRExFX1NUQVQpKSAmIEVDQ19JRExFKQorCQkJYnJlYWs7CisJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lbykpOworCisJIC8qIElmIG5vIGNvcnJlY3Rpb24gaXMgcmVxdWlyZWQgKi8KKwlpZiAobGlrZWx5KCEoKHJlYWRsX3JlbGF4ZWQoZWNjX2Jhc2VfYWRkciArIEVDQ19QT0xZX1NUQVQpKSAmIEVDQ19DT1JSX1JFUSkpKSB7CisJCXJldHVybiAwOworCX0KKyAKKwkvKiBFcnJvciBmb3VuZCEgQ29ycmVjdGlvbiByZXF1aXJlZCAqLworI2lmIGRlZmluZWQgKENPTkZJR19OQU5EX0NPTUNFUlRPX0VDQ184X0hXX0JDSCkgfHwgZGVmaW5lZCAoQ09ORklHX05BTkRfQ09NQ0VSVE9fRUNDXzI0X0hXX0JDSCkKKwkvKiBJbml0aWF0ZSBjb3JyZWN0aW9uIG9wZXJhdGlvbiAqLworCXdyaXRlbF9yZWxheGVkKEVDQ19QT0xZX1NUQVJULCBlY2NfYmFzZV9hZGRyICsgRUNDX1BPTFlfU1RBUlRfQ0ZHKTsKKworCXVkZWxheSgyNSk7CisKKwllcnJfY29ycl9kYXRhX3ByZXYgPSAwOworCS8qIFJlYWQgQ29ycmVjdGlvbiBkYXRhIHN0YXR1cyByZWdpc3RlciB0aWxsIGhlYWRlciBpcyAweDdGRCAqLworCWRvIHsKKwkJZXJyX2NvcnJfZGF0YV9wcmV2ID0gcmVhZGxfcmVsYXhlZChlY2NfYmFzZV9hZGRyICsgRUNDX0NPUlJfREFUQV9TVEFUKTsKKwkJaWYgKChlcnJfY29ycl9kYXRhX3ByZXYgPj4gRUNDX0JDSF9JTkRFWF9TSElGVCkgPT0gMHg4N0ZEKQorCQkJYnJlYWs7CisKKwkJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOworCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvKSk7CisKKwl1ZGVsYXkoMjUpOworCWVycl9jb3JyX2RhdGEgPSAweDA7CisJLyogc3RhcnQgcmVhZGluZyBlcnJvciBsb2NhdGlvbnMgKi8KKwl3aGlsZSAoKChlcnJfY29ycl9kYXRhID4+IDE2KSAhPSAgMHg4N0ZFKSkgeworCQllcnJfY29ycl9kYXRhID0gcmVhZGxfcmVsYXhlZChlY2NfYmFzZV9hZGRyICsgRUNDX0NPUlJfREFUQV9TVEFUKTsKKwkJaWYgKChlcnJfY29ycl9kYXRhID4+IDE2KSA9PSAgMHg4N0ZFKQorCQkJYnJlYWs7CisJCWlmIChlcnJfY29ycl9kYXRhID09IGVycl9jb3JyX2RhdGFfcHJldikKKwkJCWNvbnRpbnVlOworCQllcnJfY29ycl9kYXRhX3ByZXYgPSBlcnJfY29ycl9kYXRhOworCQlpbmRleCA9IChlcnJfY29ycl9kYXRhID4+IDE2KSAmIDB4N0ZGOworCQltYXNrID0gZXJyX2NvcnJfZGF0YSAmIDB4RkZGRjsKKwkJKigodWludDE2X3QgKikoZGF0ICsgKGluZGV4ICogMikpKSBePSBtYXNrOworCQl3aGlsZSAobWFzaykgeworCQkJaWYgKG1hc2sgJiAxKQorCQkJCWVycl9jb3VudCsrOworCQkJbWFzayA+Pj0gMTsKKwkJfQorCX0KKworCWlmICghKChyZWFkbF9yZWxheGVkKGVjY19iYXNlX2FkZHIgKyBFQ0NfQ09SUl9ET05FX1NUQVQpKSAmIEVDQ19ET05FKSkgeworCQl0ZW1wX25hbmRfZWNjX2Vycm9yc1swXSArPSAxIDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUNDOiB1bmNvcnJlY3RhYmxlIGVycm9yIDEgISEhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBibG9jayBoYXMgdW5jb3JyZWN0YWJsZSBudW1iZXIgb2YgZXJyb3JzICovCisJaWYgKChyZWFkbF9yZWxheGVkKGVjY19iYXNlX2FkZHIgKyBFQ0NfQ09SUl9TVEFUKSkgJiBFQ0NfVU5DT1JSKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVDQzogdW5jb3JyZWN0YWJsZSBlcnJvciAgMiAhISFcbiIpOworCQl0ZW1wX25hbmRfZWNjX2Vycm9yc1sxXSArPSAxIDsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJdGVtcF9uYW5kX2VjY19lcnJvcnNbM10gKz0gZXJyX2NvdW50OworCisjZWxzZQkJLyogSGFtbWluZyBNb2RlICovCisJCWlmIChyZWFkbF9yZWxheGVkKGVjY19iYXNlX2FkZHIgKyBFQ0NfUE9MWV9TVEFUKSA9PSBFQ0NfVU5DT1JSX0VSUl9IQU1NKSB7CisJCQkvKiAyIG9yIG1vcmUgZXJyb3JzIGRldGVjdGVkIGFuZCBoZW5jZSBjYW5ub3QKKwkJCWJlIGNvcnJlY3RlZCAqLworCQkJcmV0dXJuIC0xOyAvKiB1bmNvcnJlY3RhYmxlICovCisJCX0gZWxzZSB7ICAvKiAxLWJpdCBjb3JyZWN0YWJsZSBlcnJvciAqLworCQkJZXJyX2NvcnJfZGF0YSA9IHJlYWRsX3JlbGF4ZWQoZWNjX2Jhc2VfYWRkciArIEVDQ19DT1JSX0RBVEFfU1RBVCk7CisJCQlpbmRleCA9IChlcnJfY29ycl9kYXRhID4+IDE2KSAmIDB4MUZGOworCisJCQlpZiAobmFuZF9kZXZpY2UtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSB7CisJCQkJbWFzayA9IDEgPDwgKGVycl9jb3JyX2RhdGEgJiAweEYpOworCQkJCSooKHVpbnQxNl90ICopKGRhdCArIGluZGV4KSkgXj0gbWFzazsKKwkJCX0gZWxzZSB7CisJCQkJbWFzayA9IDEgPDwgKGVycl9jb3JyX2RhdGEgJiAweDcpOworCQkJCSooZGF0ICsgaW5kZXgpIF49IG1hc2s7CisJCQl9CisJCQlyZXR1cm4gMTsKKworCQl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqIHdyaXRlcyBzaW5nbGUgcGFnZSB0byB0aGUgTkFORCBkZXZpY2UgYWxvbmcgd2l0aCB0aGUgRUNDIGJ5dGVzCisgKgorICogQHBhcmFtW2luXSBtdGQJTVREIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gY2hpcCAgICAgIG5hbmQgY2hpcCBpbmZvIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBidWYJZGF0YSBidWZmZXIKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGNvbWNlcnRvX25hbmRfd3JpdGVfcGFnZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJCQkJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKKwkJCQkJY29uc3QgdWludDhfdCAqYnVmKQoreworCWludCBpLCBlY2NzaXplID0gY2hpcC0+ZWNjLnNpemU7CisJaW50IGVjY2J5dGVzID0gY2hpcC0+ZWNjLmJ5dGVzOworCWludCBlY2NzdGVwcyA9IGNoaXAtPmVjYy5zdGVwczsKKwljb25zdCB1aW50OF90ICpwID0gYnVmOworCXVpbnQ4X3QgKm9vYiA9IGNoaXAtPm9vYl9wb2k7CisKKwkvKiBDUzQgd2lsbCBoYXZlIHRoZSBvcHRpb24gZm9yIEVDQyBjYWxjdWxhdGlvbiAqLworCXdyaXRlbF9yZWxheGVkKEVDQ19DUzRfU0VMLCBlY2NfYmFzZV9hZGRyICsgRUNDX0NTX1NFTF9DRkcpOworCisJZm9yIChpID0gMDsgZWNjc3RlcHM7IGVjY3N0ZXBzLS0sIGkgKz0gZWNjYnl0ZXMsIHAgKz0gZWNjc2l6ZSkgeworCisJCWNoaXAtPmVjYy5od2N0bChtdGQsIE5BTkRfRUNDX1dSSVRFKTsKKwkJY2hpcC0+d3JpdGVfYnVmKG10ZCwgcCwgZWNjc2l6ZSk7CisKKwkJY2hpcC0+ZWNjLmNhbGN1bGF0ZShtdGQsIHAsIG9vYik7CisJCW9vYiArPSBlY2NieXRlczsKKworCQlpZiAoY2hpcC0+ZWNjLnBvc3RwYWQpIHsKKwkJCWNoaXAtPndyaXRlX2J1ZihtdGQsIG9vYiwgY2hpcC0+ZWNjLnBvc3RwYWQpOworCQkJb29iICs9IGNoaXAtPmVjYy5wb3N0cGFkOworCQl9CisJfQorCisJLyogQ2FsY3VsYXRlIHJlbWFpbmluZyBvb2IgYnl0ZXMgKi8KKwlpID0gbXRkLT5vb2JzaXplIC0gKG9vYiAtIGNoaXAtPm9vYl9wb2kpOworCWlmIChpKQorCQljaGlwLT53cml0ZV9idWYobXRkLCBvb2IsIGkpOworfQorCisvKiogcmVhZHMgc2luZ2xlIHBhZ2UgZnJvbSB0aGUgTkFORCBkZXZpY2UgYW5kIHdpbGwgcmVhZCBFQ0MgYnl0ZXMgZnJvbSBmbGFzaC4gQQorICogZnVuY3Rpb24gY2FsbCB0byBjb21jZXJ0b19jb3JyZWN0X2VjYygpIHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgZGF0YS4KKyAqCisgKiBAcGFyYW1baW5dIG10ZAlNVEQgZGV2aWNlIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBjaGlwICAgICAgbmFuZCBjaGlwIGluZm8gc3RydWN0dXJlCisgKiBAcGFyYW1baW5dIGJ1ZglkYXRhIGJ1ZmZlcgorICoKKyAqLworc3RhdGljIGludCBjb21jZXJ0b19uYW5kX3JlYWRfcGFnZV9od2VjYyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwKKwkJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwgdWludDhfdCAqYnVmLCBpbnQgcGFnZSkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kX2RldmljZSA9IG10ZC0+cHJpdjsKKwlpbnQgaSwgZWNjc2l6ZSA9IG5hbmRfZGV2aWNlLT5lY2Muc2l6ZTsKKwlpbnQgZWNjYnl0ZXMgPSBuYW5kX2RldmljZS0+ZWNjLmJ5dGVzOworCWludCBlY2NzdGVwcyA9IG5hbmRfZGV2aWNlLT5lY2Muc3RlcHM7CisJdWludDhfdCAqcCA9IGJ1ZjsKKwl1aW50OF90ICplY2NfY29kZSA9IG5hbmRfZGV2aWNlLT5idWZmZXJzLT5lY2Njb2RlOworCXVpbnQ4X3QgZWNjX2J5dGVzID0gbmFuZF9kZXZpY2UtPmVjYy5ieXRlczsKKwl1aW50OF90IHN0YXQ7CisJdWludDhfdCAqb29iID0gbmFuZF9kZXZpY2UtPm9vYl9wb2k7CisKKwlmb3IgKDsgZWNjc3RlcHM7IGVjY3N0ZXBzLS0sIGkgKz0gZWNjYnl0ZXMsIHAgKz0gZWNjc2l6ZSkgeworCQljaGlwLT5lY2MuaHdjdGwobXRkLCBOQU5EX0VDQ19SRUFEKTsKKwkJY2hpcC0+cmVhZF9idWYobXRkLCBwLCBlY2NzaXplKTsKKwkJY2hpcC0+cmVhZF9idWYobXRkLCBlY2NfY29kZSwgZWNjX2J5dGVzKTsKKworCQlzdGF0ID0gY2hpcC0+ZWNjLmNvcnJlY3QobXRkLCBwLCBvb2IsIE5VTEwpOworCQlpZiAoc3RhdCA8IDApCisJCQltdGQtPmVjY19zdGF0cy5mYWlsZWQrKzsKKwkJZWxzZQorCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHN0YXQ7CisKKwkJY29tY2VydG9fZWNjX3NoaWZ0KEVDQ19TSElGVF9ESVNBQkxFKTsKKworCQlpZiAoY2hpcC0+ZWNjLnBvc3RwYWQpIHsKKwkJCWNoaXAtPnJlYWRfYnVmKG10ZCwgb29iLCBjaGlwLT5lY2MucG9zdHBhZCk7CisJCQlvb2IgKz0gY2hpcC0+ZWNjLnBvc3RwYWQ7CisJCX0KKwl9CisJLyogQ2FsY3VsYXRlIHJlbWFpbmluZyBvb2IgYnl0ZXMgKi8KKwlpID0gbXRkLT5vb2JzaXplIC0gKG9vYiAtIGNoaXAtPm9vYl9wb2kpOworCWlmIChpKQorCQljaGlwLT5yZWFkX2J1ZihtdGQsIG9vYiwgaSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTkFORCBIYXJkd2FyZSBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICoJaGFyZHdhcmUgc3BlY2lmaWMgYWNjZXNzIHRvIGNvbnRyb2wtbGluZXMKKyovCit2b2lkIGNvbWNlcnRvX25hbmRfaHdjb250cm9sKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgY3RybCkKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCisKKwlpZiAoY3RybCAmIE5BTkRfQ1RSTF9DSEFOR0UpIHsKKwkJaWYgKGN0cmwgJiBOQU5EX05DRSkKKwkJCWNvbWNlcnRvX2dwaW9fc2V0XzAoQ09NQ0VSVE9fTkFORF9DRSk7CisJCWVsc2UKKwkJCWNvbWNlcnRvX2dwaW9fc2V0XzEoQ09NQ0VSVE9fTkFORF9DRSk7CisJfQorCisJaWYgKGNtZCA9PSBOQU5EX0NNRF9OT05FKQorCQlyZXR1cm47CisKKwkgaWYgKGN0cmwgJiBOQU5EX0NMRSkKKwkJIHdyaXRlYihjbWQsIGNoaXAtPklPX0FERFJfVyArIENPTUNFUlRPX05BTkRfQ0xFKTsKKwkgZWxzZSBpZiAoY3RybCAmIE5BTkRfQUxFKQorCQl3cml0ZWIoY21kLCBjaGlwLT5JT19BRERSX1cgKyBDT01DRVJUT19OQU5EX0FMRSk7CisJIGVsc2UKKwkJcmV0dXJuOworCit9CisKK2ludCBjb21jZXJ0b19uYW5kX3JlYWR5KHN0cnVjdCBtdGRfaW5mbyAqbXRkKQoreworCXJldHVybiBjb21jZXJ0b19ncGlvX3JlYWQoQ09NQ0VSVE9fTkFORF9CUikgPyAxIDogMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTkFORCBQcm9iZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGNvbWNlcnRvX25hbmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY29tY2VydG9fbmFuZF9pbmZvICppbmZvOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmRfZGV2aWNlOworCWludCBlcnIgPSAwOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBpbmZvIHN0cnVjdHVyZSAqLworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tY2VydG9fbmFuZF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmZvKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImNvbWNlcnRvIG5hbmQ6IHVuYWJsZSB0byBhbGxvY2F0ZSBpbmZvIHN0cnVjdHVyZVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBjb21jZXJ0b19uYW5kX2luZm8pKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgTVREIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwltdGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXRkX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10ZCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJjb21jZXJ0byBuYW5kOiB1bmFibGUgdG8gYWxsb2NhdGUgbXRkIGluZm8gc3RydWN0dXJlXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfaW5mbzsKKwl9CisJbWVtc2V0KG10ZCwgMCwgc2l6ZW9mKHN0cnVjdCBtdGRfaW5mbykpOworCisJLyogTGluayB0aGUgcHJpdmF0ZSBkYXRhIHdpdGggdGhlIE1URCBzdHJ1Y3R1cmUgKi8KKwlpbmZvLT5tdGQgPSBtdGQ7CisJbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJLyogQWxsb2NhdGUgcG9pbnRlciB0byBuYW5kX2RldmljZSBkYXRhICovCisJbmFuZF9kZXZpY2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmFuZF9jaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW5kX2RldmljZSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJjb21jZXJ0byBuYW5kOiB1bmFibGUgdG8gYWxsb2NhdGUgbmFuZCBjaGlwIHN0cnVjdHVyZVxuIik7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X210ZDsKKwl9CisJbWVtc2V0KG5hbmRfZGV2aWNlLCAwLCBzaXplb2Yoc3RydWN0IG5hbmRfY2hpcCkpOworCisJLyogTGluayB0aGUgcHJpdmF0ZSBkYXRhIHdpdGggdGhlIE1URCBzdHJ1Y3R1cmUgKi8KKwltdGQtPnByaXYgPSBuYW5kX2RldmljZTsKKworCXByaW50ayhLRVJOX0lORk8gInBkZXYtPnJlc291cmNlLT5zdGFydCA9ICV4LCBwZGV2LT5yZXNvdXJjZS0+ZW5kID0gJXhcbiIsIHBkZXYtPnJlc291cmNlLT5zdGFydCwgcGRldi0+cmVzb3VyY2UtPmVuZCk7CisKKwkvKk1hcCBwaHlzaWNhbCBhZGRyZXNzIG9mIG5hbmQgaW50byB2aXJ0dWFsIHNwYWNlICovCisJbmFuZF9kZXZpY2UtPklPX0FERFJfUiA9IGlvcmVtYXBfbm9jYWNoZShwZGV2LT5yZXNvdXJjZS0+c3RhcnQsIHBkZXYtPnJlc291cmNlLT5lbmQgLSBwZGV2LT5yZXNvdXJjZS0+c3RhcnQgKyAxKTsKKwlpZiAobmFuZF9kZXZpY2UtPklPX0FERFJfUiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY29tY2VydG8gbmFuZDogY2Fubm90IG1hcCBuYW5kIG1lbW9yeVxuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2lvcjsKKwl9CisKKwllY2NfYmFzZV9hZGRyID0gaW9yZW1hcChDT01DRVJUT19BWElfRVhQX0VDQ19CQVNFLCAweEZGRkYpOworCWlmICghZWNjX2Jhc2VfYWRkcikgeworCQlwcmludGsoS0VSTl9FUlIgImNvbWNlcnRvIG5hbmQ6IGNhbm5vdCBtYXAgZWNjIGNvbmZpZ1xuIik7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0X2lvcjsKKwl9CisKKwkvKiBUaGlzIGlzIHRoZSBzYW1lIGFkZHJlc3MgdG8gcmVhZCBhbmQgd3JpdGUgKi8KKwluYW5kX2RldmljZS0+SU9fQUREUl9XID0gbmFuZF9kZXZpY2UtPklPX0FERFJfUjsKKworCXByaW50ayhLRVJOX0lORk8gIm5hbmRfcHJvYmU6ICVzIGJhc2U6IDB4JTA4eCBcbiIsIHBkZXYtPm5hbWUsIChyZXNvdXJjZV9zaXplX3QpIG5hbmRfZGV2aWNlLT5JT19BRERSX1IpOworCisJLyogU2V0IGFkZHJlc3Mgb2YgaGFyZHdhcmUgY29udHJvbCBmdW5jdGlvbiAqLworCW5hbmRfZGV2aWNlLT5jbWRfY3RybCA9IGNvbWNlcnRvX25hbmRfaHdjb250cm9sOworCW5hbmRfZGV2aWNlLT5kZXZfcmVhZHkgPSBjb21jZXJ0b19uYW5kX3JlYWR5OworCisJLyogMjAgdXMgY29tbWFuZCBkZWxheSB0aW1lICovCisJbmFuZF9kZXZpY2UtPmNoaXBfZGVsYXkgPSAyMDsKKworCW5hbmRfZGV2aWNlLT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXX1NZTkRST01FOworLy8JbmFuZF9kZXZpY2UtPmVjYy5tb2RlID0gTkFORF9FQ0NfU09GVF9CQ0g7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DMktfQVNJQykgJiYgZGVmaW5lZChDT05GSUdfTkFORF9UWVBFX1NMQykKKwluYW5kX2RldmljZS0+b3B0aW9ucyA9IE5BTkRfQlVTV0lEVEhfMTY7CisjZWxzZQorCW5hbmRfZGV2aWNlLT5vcHRpb25zID0gMDsKKyNlbmRpZgorCisJLyogU2NhbiB0byBmaW5kIGV4aXN0ZW5jZSBvZiB0aGUgZGV2aWNlICovCisJaWYgKG5hbmRfc2Nhbl9pZGVudChtdGQsIDEsIE5VTEwpKSB7CisJCWVyciA9IC1FTlhJTzsKKwkJZ290byBvdXRfbmFuZDsKKwl9CisKKyNpZiAxCisJaWYgKG5hbmRfZGV2aWNlLT5lY2MubW9kZSA9PSBOQU5EX0VDQ19IV19TWU5EUk9NRSkgeworCQluYW5kX2RldmljZS0+ZWNjLmh3Y3RsID0gY29tY2VydG9fZW5hYmxlX2h3X2VjYzsKKwkJbmFuZF9kZXZpY2UtPmVjYy53cml0ZV9wYWdlID0gY29tY2VydG9fbmFuZF93cml0ZV9wYWdlX2h3ZWNjOworCQluYW5kX2RldmljZS0+ZWNjLnJlYWRfcGFnZSA9IGNvbWNlcnRvX25hbmRfcmVhZF9wYWdlX2h3ZWNjOworCQluYW5kX2RldmljZS0+ZWNjLmNhbGN1bGF0ZSA9IGNvbWNlcnRvX2NhbGN1bGF0ZV9lY2M7CisJCW5hbmRfZGV2aWNlLT5lY2MuY29ycmVjdCA9IGNvbWNlcnRvX2NvcnJlY3RfZWNjOworCisJCXN3aXRjaCAobXRkLT53cml0ZXNpemUpIHsKKwkJY2FzZSA1MTI6CisJCQluYW5kX2RldmljZS0+ZWNjLnNpemUgPSBtdGQtPndyaXRlc2l6ZTsKKyNpZiBkZWZpbmVkIChDT05GSUdfTkFORF9DT01DRVJUT19FQ0NfMjRfSFdfQkNIKQorCQkJbmFuZF9kZXZpY2UtPmVjYy5sYXlvdXQgPSAmY29tY2VydG9fZWNjX2luZm9fNTEyX2JjaDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MuYnl0ZXMgPSA0MjsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucHJlcGFkID0gMDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucG9zdHBhZCA9IDE0OworI2VsaWYgZGVmaW5lZCAoQ09ORklHX05BTkRfQ09NQ0VSVE9fRUNDXzhfSFdfQkNIKQorCQkJbmFuZF9kZXZpY2UtPmVjYy5sYXlvdXQgPSAmY29tY2VydG9fZWNjX2luZm9fNTEyX2JjaDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MuYnl0ZXMgPSAxNDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucHJlcGFkID0gMDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucG9zdHBhZCA9IDI7CisjZWxzZQorCQkJbmFuZF9kZXZpY2UtPmVjYy5sYXlvdXQgPSAmY29tY2VydG9fZWNjX2luZm9fNTEyX2hhbW07CisJCQluYW5kX2RldmljZS0+ZWNjLmJ5dGVzID0gNDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucHJlcGFkID0gMDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucG9zdHBhZCA9IDI7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIDEwMjQ6CisJCQluYW5kX2RldmljZS0+ZWNjLnNpemUgPSBtdGQtPndyaXRlc2l6ZTsKKyNpZmRlZiBDT05GSUdfTkFORF9DT01DRVJUT19FQ0NfMjRfSFdfQkNICisJCQluYW5kX2RldmljZS0+ZWNjLmxheW91dCA9ICZjb21jZXJ0b19lY2NfaW5mb18xMDI0X2JjaDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MuYnl0ZXMgPSA0MjsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucHJlcGFkID0gMDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucG9zdHBhZCA9IDE0OworI2VsaWYgQ09ORklHX05BTkRfQ09NQ0VSVE9fRUNDXzhfSFdfQkNICisJCQluYW5kX2RldmljZS0+ZWNjLmxheW91dCA9ICZjb21jZXJ0b19lY2NfaW5mb18xMDI0X2JjaDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MuYnl0ZXMgPSAxNDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucHJlcGFkID0gMDsKKwkJCW5hbmRfZGV2aWNlLT5lY2MucG9zdHBhZCA9IDE4OworI2Vsc2UKKwkJCW5hbmRfZGV2aWNlLT5lY2MubGF5b3V0ID0gJmNvbWNlcnRvX2VjY19pbmZvXzEwMjRfaGFtbTsKKwkJCW5hbmRfZGV2aWNlLT5lY2MuYnl0ZXMgPSA0OworCQkJbmFuZF9kZXZpY2UtPmVjYy5wcmVwYWQgPSAwOworCQkJbmFuZF9kZXZpY2UtPmVjYy5wb3N0cGFkID0gMTg7CisjZW5kaWYKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJVc2luZyBkZWZhdWx0IHZhbHVlcyBmb3IgaHcgZWNjXG4iKTsKKwkJCW5hbmRfZGV2aWNlLT5lY2Muc2l6ZSA9ICAxMDI0OworI2lmZGVmIENPTkZJR19OQU5EX0NPTUNFUlRPX0VDQ18yNF9IV19CQ0gKKwkJCW5hbmRfZGV2aWNlLT5lY2MubGF5b3V0ID0gJmNvbWNlcnRvX2VjY19pbmZvXzEwMjRfYmNoOworCQkJbmFuZF9kZXZpY2UtPmVjYy5ieXRlcyA9IDQyOworCQkJbmFuZF9kZXZpY2UtPmVjYy5wcmVwYWQgPSAwOworCQkJbmFuZF9kZXZpY2UtPmVjYy5wb3N0cGFkID0gMTQ7CisjZWxpZiBDT05GSUdfTkFORF9DT01DRVJUT19FQ0NfOF9IV19CQ0gKKwkJCW5hbmRfZGV2aWNlLT5lY2MubGF5b3V0ID0gJmNvbWNlcnRvX2VjY19pbmZvXzEwMjRfYmNoOworCQkJbmFuZF9kZXZpY2UtPmVjYy5ieXRlcyA9IDE0OworCQkJbmFuZF9kZXZpY2UtPmVjYy5wcmVwYWQgPSAwOworCQkJbmFuZF9kZXZpY2UtPmVjYy5wb3N0cGFkID0gMTg7CisjZWxzZQorCQkJbmFuZF9kZXZpY2UtPmVjYy5sYXlvdXQgPSAmY29tY2VydG9fZWNjX2luZm9fMTAyNF9oYW1tOworCQkJbmFuZF9kZXZpY2UtPmVjYy5ieXRlcyA9IDQ7CisJCQluYW5kX2RldmljZS0+ZWNjLnByZXBhZCA9IDA7CisJCQluYW5kX2RldmljZS0+ZWNjLnBvc3RwYWQgPSAxODsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKwluYW5kX2RldmljZS0+ZWNjLnN0ZXBzID0gbXRkLT53cml0ZXNpemUgLyBuYW5kX2RldmljZS0+ZWNjLnNpemU7CisJaWYobmFuZF9kZXZpY2UtPmVjYy5zdGVwcyAqIG5hbmRfZGV2aWNlLT5lY2Muc2l6ZSAhPSBtdGQtPndyaXRlc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgZWNjIHBhcmFtZXRlcnNcbiIpOworCQlCVUcoKTsKKwl9CisJbmFuZF9kZXZpY2UtPmVjYy50b3RhbCA9IG5hbmRfZGV2aWNlLT5lY2Muc3RlcHMgKiBuYW5kX2RldmljZS0+ZWNjLmJ5dGVzOworCisKKwluYW5kX2RldmljZS0+YmJ0X3RkID0gJmJidF9tYWluX2Rlc2NyOworCW5hbmRfZGV2aWNlLT5iYnRfbWQgPSAmYmJ0X21pcnJvcl9kZXNjcjsKKwluYW5kX2RldmljZS0+YmFkYmxvY2tfcGF0dGVybiA9ICZjMjAwMF9iYWRibG9ja19wYXR0ZXJuOworCW5hbmRfZGV2aWNlLT5iYnRfb3B0aW9ucyB8PSBOQU5EX0JCVF9VU0VfRkxBU0g7CisKKwl9IGVsc2UgeworCQluYW5kX2RldmljZS0+ZWNjLm1vZGUgPSBOQU5EX0VDQ19TT0ZUOworCX0KKworI2VuZGlmCisKKwluYW5kX2RldmljZS0+b3B0aW9ucyB8PSBOQU5EX05PX1NVQlBBR0VfV1JJVEU7CisKKwlpZihuYW5kX3NjYW5fdGFpbChtdGQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmFuZF9zY2FuX3RhaWwgcmV0dXJuZWQgZXJyb3JcbiIpOworCQllcnIgPSAtRU5YSU87CisJCWdvdG8gb3V0X2lvcjsKKwl9CisKKwkvKk5hbWUgb2YgdGhlIG10ZCBkZXZpY2UgKi8KKwltdGQtPm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKworCS8qIExpbmsgdGhlIGluZm8gc3R1Y3R1cmUgd2l0aCBwbGF0Zm9ybV9kZXZpY2UgKi8KKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKKworCWVyciA9IG10ZF9kZXZpY2VfcGFyc2VfcmVnaXN0ZXIobXRkLCBwYXJ0X3Byb2JlcywgTlVMTCwgTlVMTCwgNCk7CisKKwlpZiAoZXJyKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgcGFyc2UgcGFydGl0aW9uc1xuIik7CisJCXJldHVybiBlcnI7CisJfQorCisKKwlnb3RvIG91dDsKKworICAgICAgb3V0X2lvcjoKKwlpb3VubWFwKG5hbmRfZGV2aWNlLT5JT19BRERSX1IpOworCWlvdW5tYXAoZWNjX2Jhc2VfYWRkcik7CisgICAgICBvdXRfbmFuZDoKKwlrZnJlZShuYW5kX2RldmljZSk7CisgICAgICBvdXRfbXRkOgorCWtmcmVlKG10ZCk7CisgICAgICBvdXRfaW5mbzoKKwlrZnJlZShpbmZvKTsKKyAgICAgIG91dDoKKwlyZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOQU5EIFJlbW92ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGNvbWNlcnRvX25hbmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNvbWNlcnRvX25hbmRfaW5mbyAqaW5mbyA9CisJICAgIChzdHJ1Y3QgY29tY2VydG9fbmFuZF9pbmZvICopcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG10ZF9pbmZvICptdGQgPSBpbmZvLT5tdGQ7CisJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9kZXZpY2UgPSAoc3RydWN0IG5hbmRfY2hpcCAqKW10ZC0+cHJpdjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJLyogUmVsZWFzZSByZXNvdXJjZXMsIHVucmVnaXN0ZXIgZGV2aWNlICovCisJbmFuZF9yZWxlYXNlKGluZm8tPm10ZCk7CisKKwkvKkRlcmVnaXN0ZXIgdmlydHVhbCBhZGRyZXNzICovCisJaW91bm1hcChuYW5kX2RldmljZS0+SU9fQUREUl9SKTsKKwlpb3VubWFwKGVjY19iYXNlX2FkZHIpOworCisJa2ZyZWUobmFuZF9kZXZpY2UpOworCisJLyogRnJlZSB0aGUgTVREIGRldmljZSBzdHJ1Y3R1cmUgKi8KKwlrZnJlZShtdGQpOworCisJa2ZyZWUoaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRHJpdmVyIFJlZ2lzdHJhdGlvbgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNvbWNlcnRvX25hbmRfZHJpdmVyID0geworCS5wcm9iZSA9IGNvbWNlcnRvX25hbmRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGNvbWNlcnRvX25hbmRfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJjb21jZXJ0b25hbmQiLAorCQkgICB9LAorfTsKKworaW50IF9faW5pdCBjb21jZXJ0b19uYW5kX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjb21jZXJ0b19uYW5kX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb21jZXJ0b19uYW5kX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY29tY2VydG9fbmFuZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChjb21jZXJ0b19uYW5kX2luaXQpOworbW9kdWxlX2V4aXQoY29tY2VydG9fbmFuZF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCb2FyZC1zcGVjaWZpYyBnbHVlIGxheWVyIGZvciBOQU5EIGZsYXNoIG9uIENvbWNlcnRvIGJvYXJkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jIGIvZHJpdmVycy9tdGQvbmFuZC9uYW5kX2Jhc2UuYwppbmRleCAzZWQ5YzVlLi5lZDRkNzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmRfYmFzZS5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbmFuZF9iYXNlLmMKQEAgLTMyNjIsNiArMzI2Miw5IEBACiAJCWNhc2UgMTI4OgogCQkJY2hpcC0+ZWNjLmxheW91dCA9ICZuYW5kX29vYl8xMjg7CiAJCQlicmVhazsKKwkJY2FzZSAyMjQ6CisJCQljaGlwLT5lY2MubGF5b3V0ID0gJm5hbmRfb29iXzEyODsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJfd2FybigiTm8gb29iIHNjaGVtZSBkZWZpbmVkIGZvciBvb2JzaXplICVkXG4iLAogCQkJCSAgIG10ZC0+b29ic2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCmluZGV4IGE3MDI0NDMuLmNkMDgyYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnCkBAIC0xOSw2ICsxOSwxMSBAQAogCXRyaXN0YXRlICJEcml2ZXJzIGZvciBNYXJ2ZWxsIFBIWXMiCiAJLS0taGVscC0tLQogCSAgQ3VycmVudGx5IGhhcyBhIGRyaXZlciBmb3IgdGhlIDg4RTEwMTFTCisKK2NvbmZpZyBBVEhFUk9TX1BIWQorCXRyaXN0YXRlICJEcml2ZXJzIGZvciBBdGhlcm9zIFBIWXMiCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIEFSODAzNSBhbmQgQVI4MzI3CiAJCiBjb25maWcgREFWSUNPTV9QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgRGF2aWNvbSBQSFlzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlCmluZGV4IDIzMzMyMTUuLmEwMGZhZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiAKIG9iai0kKENPTkZJR19QSFlMSUIpCQkrPSBsaWJwaHkubwogb2JqLSQoQ09ORklHX01BUlZFTExfUEhZKQkrPSBtYXJ2ZWxsLm8KK29iai0kKENPTkZJR19BVEhFUk9TX1BIWSkJKz0gYXRoZXJvcy5vCiBvYmotJChDT05GSUdfREFWSUNPTV9QSFkpCSs9IGRhdmljb20ubwogb2JqLSQoQ09ORklHX0NJQ0FEQV9QSFkpCSs9IGNpY2FkYS5vCiBvYmotJChDT05GSUdfTFhUX1BIWSkJCSs9IGx4dC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvYXRoZXJvcy5jIGIvZHJpdmVycy9uZXQvcGh5L2F0aGVyb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjIzOGNhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGh5L2F0aGVyb3MuYwpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIERyaXZlciBmb3IgQXRoZXJvcyBQSFlzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworLyogQXRoZXJvcyBQSFkgcmVnaXN0ZXJzKi8KKyNkZWZpbmUgQVI4eF9JTlRSX0VOCQkJMHgxMgorI2RlZmluZSBBUjh4X0lOVFJfU1RTCQkJMHgxMworI2RlZmluZSBBUjh4X0RFQlVHX1BPUlRfQUREUgkJMHgxRAorI2RlZmluZSBBUjh4X0RFQlVHX1BPUlRfREFUQQkJMHgxRQorCisvKiBJbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZSBBUjh4X0lOVFJfTUFTSwkJCTB4ZmMwMworCisvKiBBdGhlcm9zIFBIWSByZWdpc3RlcnMgb24gZGVidWcgcG9ydCAqLworLyogUkdNSUkgUnggY2xvY2sgY29udHJvbCAqLworI2RlZmluZSBBUjh4X0RCR19SR01JSV9SWENMS19DVFJMCTB4MDAKKyNkZWZpbmUgQVI4eF9EQkdfUkdNSUlfUlhDTEtfTUFTSwkweDgwMDAKKworLypSR01JSSBUeCBjbG9jayBjb250cm9sICovCisjZGVmaW5lIEFSOHhfREJHX1JHTUlJX1RYQ0xLX0NUUkwJMHgwNQorI2RlZmluZSBBUjh4X0RCR19SR01JSV9UWENMS19NQVNLCTB4MDEwMAorCisjZGVmaW5lIFBIWV9JRF9BUjgwMzUJCQkweDAwNGRkMDcyCisjZGVmaW5lIFBIWV9JRF9BUjgwMzMJCQkweDAwNGRkMDc0CisjZGVmaW5lIFBIWV9JRF9BUjgzMjcJCQkweDAwNGRkMDMzCisKK01PRFVMRV9ERVNDUklQVElPTigiQXRoZXJvcyBQSFkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgYXI4eF9waHlfZGJnX3JlYWQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgaW50IHJlZ19hZGRyKQoreworCXBoeV93cml0ZShwaHlkZXYsIEFSOHhfREVCVUdfUE9SVF9BRERSLCByZWdfYWRkcik7CisJcmV0dXJuICBwaHlfcmVhZChwaHlkZXYsIEFSOHhfREVCVUdfUE9SVF9EQVRBKTsKK30KKworc3RhdGljIHZvaWQgYXI4eF9waHlfZGJnX3dyaXRlKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsICBpbnQgcmVnX2FkZHIsIHUzMiB2YWwpCit7CisJcGh5X3dyaXRlKHBoeWRldiwgQVI4eF9ERUJVR19QT1JUX0FERFIsIHJlZ19hZGRyKTsKKwlwaHlfd3JpdGUocGh5ZGV2LCBBUjh4X0RFQlVHX1BPUlRfREFUQSwgdmFsKTsKK30KKworaW50IGFyOHhfYWRkX3NrZXcoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgdG1wLCBlcnI7CisKKwkvKiBFbmFibGUgUnggZGVsYXkgKi8KKwl0bXAgPSBhcjh4X3BoeV9kYmdfcmVhZChwaHlkZXYsIEFSOHhfREJHX1JHTUlJX1JYQ0xLX0NUUkwpOworCXRtcCB8PSBBUjh4X0RCR19SR01JSV9SWENMS19NQVNLOworCWFyOHhfcGh5X2RiZ193cml0ZShwaHlkZXYsIEFSOHhfREJHX1JHTUlJX1JYQ0xLX0NUUkwsIHRtcCk7CisJLyogRW5hYmxlIFR4IGRlbGF5ICovCisJdG1wID0gYXI4eF9waHlfZGJnX3JlYWQocGh5ZGV2LCBBUjh4X0RCR19SR01JSV9UWENMS19DVFJMKTsKKwl0bXAgfD0gQVI4eF9EQkdfUkdNSUlfVFhDTEtfTUFTSzsKKwlhcjh4X3BoeV9kYmdfd3JpdGUocGh5ZGV2LCBBUjh4X0RCR19SR01JSV9UWENMS19DVFJMLCB0bXApOworCisJZXJyID0gZ2VucGh5X3Jlc3RhcnRfYW5lZyhwaHlkZXYpOworCisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYXI4eF9hZGRfc2tldyk7CisKK3N0YXRpYyBpbnQgYXI4eF9jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCBlcnIgPSAwOworCisJaWYgKHBoeWRldi0+aW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSSkKKwkJZXJyID0gYXI4eF9hZGRfc2tldyhwaHlkZXYpOworCisJcmV0dXJuIGVycjsKKworfQorCisKK3N0YXRpYyBpbnQgYXI4eF9hY2tfaW50ZXJydXB0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAocGh5ZGV2LT5pbnRlcnJ1cHRzID09IFBIWV9JTlRFUlJVUFRfRU5BQkxFRCkKKwkJZXJyID0gcGh5X3JlYWQocGh5ZGV2LCBBUjh4X0lOVFJfU1RTKTsKKworCXJldHVybiAoZXJyIDwgMCkgPyBlcnIgOiAwOworfQorCitzdGF0aWMgaW50IGFyOHhfY29uZmlnX2ludHIoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgZXJyOworCisJaWYgKHBoeWRldi0+aW50ZXJydXB0cyA9PSBQSFlfSU5URVJSVVBUX0VOQUJMRUQpCisJCWVyciA9IHBoeV93cml0ZShwaHlkZXYsIEFSOHhfSU5UUl9FTiwgQVI4eF9JTlRSX01BU0spOworCWVsc2UgeworCQkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyAqLworCQllcnIgPSBwaHlfcmVhZChwaHlkZXYsIEFSOHhfSU5UUl9TVFMpOworCisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBBUjh4X0lOVFJfRU4sIDApOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIEF0aGVyb3MgQXI4MDM1ICovCitzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYXI4MDM1X2RyaXZlciA9IHsKKwkucGh5X2lkCQk9IFBIWV9JRF9BUjgwMzUsCisJLm5hbWUJCT0gIkF0aGVyb3MgQVI4MDM1IiwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZjAwLAorCS5mZWF0dXJlcwk9IFBIWV9HQklUX0ZFQVRVUkVTLAorCS5mbGFncwkJPSBQSFlfSEFTX0lOVEVSUlVQVCwKKwkuY29uZmlnX2luaXQJPSAmYXI4eF9jb25maWdfaW5pdCwKKwkuY29uZmlnX2FuZWcJPSAmZ2VucGh5X2NvbmZpZ19hbmVnLAorCS5yZWFkX3N0YXR1cwk9ICZnZW5waHlfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQJPSAmYXI4eF9hY2tfaW50ZXJydXB0LAorCS5jb25maWdfaW50cgk9ICZhcjh4X2NvbmZpZ19pbnRyLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gJmdlbnBoeV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gJmdlbnBoeV9yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyIAk9IHsgLm93bmVyID0gVEhJU19NT0RVTEUsfSwKK307CisKKy8qIEF0aGVyb3MgQXI4MzI3ICovCitzdGF0aWMgc3RydWN0IHBoeV9kcml2ZXIgYXI4MzI3X2RyaXZlciA9IHsKKwkucGh5X2lkCQk9IFBIWV9JRF9BUjgzMjcsCisJLm5hbWUJCT0gIkF0aGVyb3MgQVI4MzI3IiwKKwkucGh5X2lkX21hc2sJPSAweGZmZmZmZjAwLAorCS5mZWF0dXJlcwk9IFBIWV9HQklUX0ZFQVRVUkVTLAorCS5mbGFncwkJPSBQSFlfSEFTX0lOVEVSUlVQVCwKKwkuY29uZmlnX2luaXQJPSAmYXI4eF9jb25maWdfaW5pdCwKKwkuY29uZmlnX2FuZWcJPSAmZ2VucGh5X2NvbmZpZ19hbmVnLAorCS5yZWFkX3N0YXR1cwk9ICZnZW5waHlfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQJPSAmYXI4eF9hY2tfaW50ZXJydXB0LAorCS5jb25maWdfaW50cgk9ICZhcjh4X2NvbmZpZ19pbnRyLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kCT0gJmdlbnBoeV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gJmdlbnBoeV9yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyIAk9IHsgLm93bmVyID0gVEhJU19NT0RVTEUsfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFyOHhfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZhcjgwMzVfZHJpdmVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHBoeV9kcml2ZXJfcmVnaXN0ZXIoJmFyODMyN19kcml2ZXIpOworCWlmIChlcnIgPCAwKQorCQlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJmFyODAzNV9kcml2ZXIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFyOHhfZXhpdCh2b2lkKQoreworCXBoeV9kcml2ZXJfdW5yZWdpc3RlcigmYXI4MDM1X2RyaXZlcik7CisJcGh5X2RyaXZlcl91bnJlZ2lzdGVyKCZhcjgzMjdfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYXI4eF9pbml0KTsKK21vZHVsZV9leGl0KGFyOHhfZXhpdCk7CisKK3N0YXRpYyBzdHJ1Y3QgbWRpb19kZXZpY2VfaWQgX19tYXliZV91bnVzZWQgYXRoZXJvc190YmxbXSA9IHsKKwl7IFBIWV9JRF9BUjgwMzUsIDB4ZmZmZmZmMDAgfSwKKwl7IFBIWV9JRF9BUjgzMjcsIDB4ZmZmZmZmMDAgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUobWRpbywgYXRoZXJvc190YmwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYyBiL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKaW5kZXggODNhNWE1YS4uMGE3MjhhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYworKysgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCkBAIC0zNSw2ICszNSwxMSBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCisjaWZkZWYgQ09ORklHX0FSQ0hfTTg2WFhYCisjaW5jbHVkZSA8bWFjaC9jb21jZXJ0by0yMDAwL3BtLmg+CisjZW5kaWYKKworCiBNT0RVTEVfREVTQ1JJUFRJT04oIlBIWSBsaWJyYXJ5Iik7CiBNT0RVTEVfQVVUSE9SKCJBbmR5IEZsZW1pbmciKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTg4NSw3ICs4OTAsMTcgQEAKIGludCBnZW5waHlfc3VzcGVuZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewogCWludCB2YWx1ZTsKLQorI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCS8qIENoZWNrIGZvciB0aGUgQml0X01hc2sgYml0IGZvciBXb0wsIGlmIGl0IGlzIGVuYWJsZWQKKwkgKiB0aGVuIHdlIGFyZSBub3QgZ29pbmcgc3VzcGVuZCB0aGUgV29MIGRldmljZSAsIGFzIGJ5CisJICogdGhpcyBkZXZpY2UgLCB3ZSB3aWxsIHdha2UgZnJvbSBTeXN0ZW0gUmVzdW1lLgorCSAqLworCWlmICggIShob3N0X3V0aWxwZV9zaGFyZWRfcG11X2JpdG1hc2sgJiBXT0xfSVJRICkpeworCQkvKiBXZSB3aWxsIGp1c3QgcmV0dXJuCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKIAltdXRleF9sb2NrKCZwaHlkZXYtPmxvY2spOwogCiAJdmFsdWUgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9CTUNSKTsKQEAgLTkwMCw3ICs5MTUsMTcgQEAKIGludCBnZW5waHlfcmVzdW1lKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCiB7CiAJaW50IHZhbHVlOwotCisjaWZkZWYgQ09ORklHX0FSQ0hfTTg2WFhYCisJLyogQ2hlY2sgZm9yIHRoZSBCaXRfTWFzayBiaXQgZm9yIFdvTCwgaWYgaXQgaXMgZW5hYmxlZAorCSAqIHRoZW4gd2UgYXJlIG5vdCBnb2luZyBzdXNwZW5kIHRoZSBXb0wgZGV2aWNlICwgYXMgYnkKKwkgKiB0aGlzIGRldmljZSAsIHdlIHdpbGwgd2FrZSBmcm9tIFN5c3RlbSBSZXN1bWUuCisJICovCisJaWYgKCAhKGhvc3RfdXRpbHBlX3NoYXJlZF9wbXVfYml0bWFzayAmIFdPTF9JUlEgKSl7CisJCS8qIFdlIHdpbGwganVzdCByZXR1cm4KKwkJICovCisJCXJldHVybiAwOworCX0KKyNlbmRpZgogCW11dGV4X2xvY2soJnBoeWRldi0+bG9jayk7CiAKIAl2YWx1ZSA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX0JNQ1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMgYi9kcml2ZXJzL25ldC9wcHAvcHBwX2dlbmVyaWMuYwppbmRleCAzZWQ5ODNjLi5mMDM1MjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHAvcHBwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL25ldC9wcHAvcHBwX2dlbmVyaWMuYwpAQCAtNTMsNiArNTMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRlApCisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2VuZGlmCiAKICNkZWZpbmUgUFBQX1ZFUlNJT04JIjIuNC4yIgogCkBAIC01NTksNiArNTYyLDkgQEAKIAlzdHJ1Y3QgcHBwICpwcHA7CiAJaW50IGVyciA9IC1FRkFVTFQsIHZhbCwgdmFsMiwgaTsKIAlzdHJ1Y3QgcHBwX2lkbGUgaWRsZTsKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19GUCkKKyAgICAgICAgc3RydWN0IHBwcF9pZGxlIGZwcGlkbGU7CisjZW5kaWYKIAlzdHJ1Y3QgbnBpb2N0bCBucGk7CiAJaW50IHVuaXQsIGNmbGFnczsKIAlzdHJ1Y3Qgc2xjb21wcmVzcyAqdmo7CkBAIC03MzgsNiArNzQ0LDMwIEBACiAJCWVyciA9IDA7CiAJCWJyZWFrOwogCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRlApCisJY2FzZSBQUFBJT0NTRlBQSURMRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZmcHBpZGxlLCBhcmdwLCBzaXplb2YoZnBwaWRsZSkpKQorCQkJYnJlYWs7CisKKwkJcHBwX3htaXRfbG9jayhwcHApOworCisJCWlmICh0aW1lX2FmdGVyKChqaWZmaWVzIC0gKGZwcGlkbGUueG1pdF9pZGxlICogSFopKSAsIHBwcC0+bGFzdF94bWl0KSkKKwkJCXBwcC0+bGFzdF94bWl0ID0gKGppZmZpZXMgLSBmcHBpZGxlLnhtaXRfaWRsZSAqIEhaKTsKKworCQlwcHBfeG1pdF91bmxvY2socHBwKTsKKworCQlwcHBfcmVjdl9sb2NrKHBwcCk7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoKGppZmZpZXMgLSAoZnBwaWRsZS5yZWN2X2lkbGUgKiBIWikpICwgcHBwLT5sYXN0X3JlY3YpKQorCQkJcHBwLT5sYXN0X3JlY3YgPSAoamlmZmllcyAtIGZwcGlkbGUucmVjdl9pZGxlICogSFopOworCisJCXBwcF9yZWN2X3VubG9jayhwcHApOworCisJCWVyciA9IDA7CisJCWJyZWFrOworI2VuZGlmCisKKwogI2lmZGVmIENPTkZJR19QUFBfRklMVEVSCiAJY2FzZSBQUFBJT0NTUEFTUzoKIAl7CkBAIC0yODI1LDggKzI4NTUsMTAgQEAKIAkJZ290byBvdXQ7CiAJd3JpdGVfbG9ja19iaCgmcGNoLT51cGwpOwogCXJldCA9IC1FSU5WQUw7Ci0JaWYgKHBjaC0+cHBwKQotCQlnb3RvIG91dGw7CisJaWYgKHBjaC0+cHBwKSB7CisJCXdyaXRlX3VubG9ja19iaCgmcGNoLT51cGwpOworCQlnb3RvIG91dDsKKwl9CiAKIAlwcHBfbG9jayhwcHApOwogCWlmIChwY2gtPmZpbGUuaGRybGVuID4gcHBwLT5maWxlLmhkcmxlbikKQEAgLTI4MzksMTAgKzI4NzEsMjEgQEAKIAlwY2gtPnBwcCA9IHBwcDsKIAlhdG9taWNfaW5jKCZwcHAtPmZpbGUucmVmY250KTsKIAlwcHBfdW5sb2NrKHBwcCk7Ci0JcmV0ID0gMDsKIAotIG91dGw6CiAJd3JpdGVfdW5sb2NrX2JoKCZwY2gtPnVwbCk7CisKKy8qV2UgbmVlZCB0byByZXZpc2l0IGJlbG93IGNoYW5nZXMgd2hlbiBQUFBvRSBhdXRvbW9kZSBpcyBpbnRyb2R1Y2VkIHRvIEMySyovCisjaWYgMAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0ZQKQorCWlmICgocHBwLT5kZXYpICYmICghcHBwLT5jbG9zaW5nKSkgeworCQlydG5sX2xvY2soKTsKKwkJcnRtc2dfaWZpbmZvKFJUTV9ORVdMSU5LLCBwcHAtPmRldiwgMCk7CisJCXJ0bmxfdW5sb2NrKCk7CisJfQorI2VuZGlmCisjZW5kaWYKKworCXJldCA9IDA7CiAgb3V0OgogCW11dGV4X3VubG9jaygmcG4tPmFsbF9wcHBfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0yODY4LDYgKzI5MTEsMTggQEAKIAkJaWYgKC0tcHBwLT5uX2NoYW5uZWxzID09IDApCiAJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBwcC0+ZmlsZS5yd2FpdCk7CiAJCXBwcF91bmxvY2socHBwKTsKKworLypXZSBuZWVkIHRvIHJldmlzaXQgYmVsb3cgY2hhbmdlcyB3aGVuIFBQUG9FIGF1dG9tb2RlIGlzIGludHJvZHVjZWQgdG8gQzJLKi8KKyNpZiAwCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRlApCisJCWlmICgocHBwLT5kZXYpICYmICghcHBwLT5jbG9zaW5nKSkgeworCQkJcnRubF9sb2NrKCk7CisJCQlydG1zZ19pZmluZm8oUlRNX05FV0xJTkssIHBwcC0+ZGV2LCAwKTsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCX0KKyNlbmRpZgorI2VuZGlmCisKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnBwcC0+ZmlsZS5yZWZjbnQpKQogCQkJcHBwX2Rlc3Ryb3lfaW50ZXJmYWNlKHBwcCk7CiAJCWVyciA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHAvcHBwb2UuYyBiL2RyaXZlcnMvbmV0L3BwcC9wcHBvZS5jCmluZGV4IDQ5YzZkYTkuLjUzY2MxMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcC9wcHBvZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcC9wcHBvZS5jCkBAIC05NDAsOCArOTQwLDE2IEBACiAKIAlza2ItPnByb3RvY29sID0gY3B1X3RvX2JlMTYoRVRIX1BfUFBQX1NFUyk7CiAJc2tiLT5kZXYgPSBkZXY7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQkKKwlpZigoc2tiLT5pcHNlY19vZmZsb2FkID09IDEpICYmICghc2tiLT5zcCkpCisJeworCQkgIGRldl9oYXJkX2hlYWRlcihza2IsIGRldiwgRVRIX1BfUFBQX1NFUywKKwkJCSBkZXYtPmRldl9hZGRyLCBwby0+cHBwb2VfcGEucmVtb3RlLCBkYXRhX2xlbik7CiAKLQlkZXZfaGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QX1BQUF9TRVMsCisJfQorCWVsc2UKKyNlbmRpZgorCQlkZXZfaGFyZF9oZWFkZXIoc2tiLCBkZXYsIEVUSF9QX1BQUF9TRVMsCiAJCQlwby0+cHBwb2VfcGEucmVtb3RlLCBOVUxMLCBkYXRhX2xlbik7CiAKIAlkZXZfcXVldWVfeG1pdChza2IpOwpAQCAtMTAwNCwxNyArMTAxMiwzMyBAQAogewogCXN0cnVjdCBwcHBveF9zb2NrICpwbzsKIAljaGFyICpkZXZfbmFtZTsKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19GUCkKKwljaGFyICpwcHBfbmFtZTsKKyNlbmRpZgogCiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7Ci0JCXNlcV9wdXRzKHNlcSwgIklkICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgIERldmljZVxuIik7CisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRlApCisJCXNlcV9wdXRzKHNlcSwgIklkICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgIERldmljZSAgUFBQRGV2aWNlXG4iKTsKKyNlbHNlCisgCQlzZXFfcHV0cyhzZXEsICJJZCAgICAgICBBZGRyZXNzICAgICAgICAgICAgICBEZXZpY2VcbiIpOworI2VuZGlmCiAJCWdvdG8gb3V0OwogCX0KIAogCXBvID0gdjsKIAlkZXZfbmFtZSA9IHBvLT5wcHBvZV9wYS5kZXY7CiAKLQlzZXFfcHJpbnRmKHNlcSwgIiUwOFggJXBNICU4c1xuIiwKLQkJcG8tPnBwcG9lX3BhLnNpZCwgcG8tPnBwcG9lX3BhLnJlbW90ZSwgZGV2X25hbWUpOworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0ZQKQorCXBwcF9uYW1lID0gcHBwX2Rldl9uYW1lKCZwby0+Y2hhbik7CisJaWYgKCFwcHBfbmFtZSkKKwkJZ290byBvdXQ7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiUwNFggJXBNICU4cyAgICAgICAlc1xuIiwKKwkJbnRvaHMocG8tPnBwcG9lX3BhLnNpZCksIHBvLT5wcHBvZV9wYS5yZW1vdGUsIGRldl9uYW1lLCBwcHBfbmFtZSk7CisjZWxzZQorIAlzZXFfcHJpbnRmKHNlcSwgIiUwOFggJXBNICU4c1xuIiwKKyAJCXBvLT5wcHBvZV9wYS5zaWQsIHBvLT5wcHBvZV9wYS5yZW1vdGUsIGRldl9uYW1lKTsKKyNlbmRpZgogb3V0OgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jIGIvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCmluZGV4IGI4NzNiNWQuLjI4NjQ3ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYworKysgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKQEAgLTQ5LDYgKzQ5LDE0IEBACiAKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSIyMi1BdWctMjAwNSIKIAorI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorLyogCisgKiBXZSBhbGxsb2NhdGUgZXh0cmEgNjQgQnl0ZXMgdG8gcmVzZXJ2ZSBoZWFkcm9vbSBpbiB0aGUgc2tfYnVmZiAKKyAqIFRvIGJlIHVzZWQgYnkgRmFzdCBQYXRoIChIZWFkIFJvb20gbXVzdCBiZSA0IEJ5dGUgYWxpZ25lZCAKKyAqIGJlY2F1c2UgVVNCIDIuMCBjb250cm9sbGVyIGRvZXNuJ3Qgc3VwcG9ydCAyIGJ5dGUgYWxpZ25tZW50CisgKi8KKyNkZWZpbmUgQzJLX1VTQk5FVF9TS0JfSEVBRFJPT01fRkFTVF9QQVRIIDY0CisjZW5kaWYKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtMzQ0LDEzICszNTIsMjYgQEAKIAl1bnNpZ25lZCBsb25nCQlsb2NrZmxhZ3M7CiAJc2l6ZV90CQkJc2l6ZSA9IGRldi0+cnhfdXJiX3NpemU7CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9NODZYWFgKKyAgICAvKiAKKyAgICAgKiBXZSBhbGxsb2NhdGUgZXh0cmEgNjQgQnl0ZXMgdG8gcmVzZXJ2ZSBoZWFkcm9vbSBpbiB0aGUgc2tfYnVmZiAKKyAgICAgKiBUbyBiZSB1c2VkIGJ5IEZhc3QgUGF0aCAoSGVhZCBSb29tIG11c3QgYmUgNCBCeXRlIGFsaWduZWQgCisgICAgICogYmVjYXVzZSBVU0IgMi4wIGNvbnRyb2xsZXIgZG9lc24ndCBzdXBwb3J0IDIgYnl0ZSBhbGlnbm1lbnQKKyAgICAgKi8KKwlpZiAoKHNrYiA9IGFsbG9jX3NrYiAoc2l6ZSArIEMyS19VU0JORVRfU0tCX0hFQURST09NX0ZBU1RfUEFUSCwgZmxhZ3MpKSA9PSBOVUxMKSB7CisjZWxzZQogCWlmICgoc2tiID0gYWxsb2Nfc2tiIChzaXplICsgTkVUX0lQX0FMSUdOLCBmbGFncykpID09IE5VTEwpIHsKKyNlbmRpZiAgICAgICAgCiAJCW5ldGlmX2RiZyhkZXYsIHJ4X2VyciwgZGV2LT5uZXQsICJubyByeCBza2JcbiIpOwogCQl1c2JuZXRfZGVmZXJfa2V2ZW50IChkZXYsIEVWRU5UX1JYX01FTU9SWSk7CiAJCXVzYl9mcmVlX3VyYiAodXJiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCXNrYl9yZXNlcnZlIChza2IsIEMyS19VU0JORVRfU0tCX0hFQURST09NX0ZBU1RfUEFUSCk7CisjZWxzZQogCXNrYl9yZXNlcnZlIChza2IsIE5FVF9JUF9BTElHTik7CisjZW5kaWYgICAgICAgIAogCiAJZW50cnkgPSAoc3RydWN0IHNrYl9kYXRhICopIHNrYi0+Y2I7CiAJZW50cnktPnVyYiA9IHVyYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IDUzZWI0ZTUuLmM3NmI5MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtNzYyLDYgKzc2MiwxMyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbGQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtczNjLgogCitjb25maWcgUlRDX0RSVl9DMksKKwl0cmlzdGF0ZSAiTWluZHNwZWVkIEMyMDAwIFNvQyBSVEMiCisJZGVwZW5kcyBvbiBBUkNIX004NlhYWAorCWRlZmF1bHQgeQorCWhlbHAKKwkJQ29tY2VydG8gQzIwMDAgUlRDIChSZWFsdGltZSBDbG9jaykgZHJpdmVyLgorCiBjb25maWcgUlRDX0RSVl9FUDkzWFgKIAl0cmlzdGF0ZSAiQ2lycnVzIExvZ2ljIEVQOTNYWCIKIAlkZXBlbmRzIG9uIEFSQ0hfRVA5M1hYCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCmluZGV4IDZlNjk4MjMuLmZhZTMyZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC05MSw2ICs5MSw3IEBACiBvYmotJChDT05GSUdfUlRDX0RSVl9SWDg1ODEpCSs9IHJ0Yy1yeDg1ODEubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUzM1MzkwQSkJKz0gcnRjLXMzNTM5MGEubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfUzNDKQkrPSBydGMtczNjLm8KK29iai0kKENPTkZJR19SVENfRFJWX0MySykgICAgICArPSBydGMtYzJrLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1NBMTEwMCkJKz0gcnRjLXNhMTEwMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9TSCkJKz0gcnRjLXNoLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1NQRUFSKQkrPSBydGMtc3BlYXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWMyay5jIGIvZHJpdmVycy9ydGMvcnRjLWMyay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZjg2MTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtYzJrLmMKQEAgLTAsMCArMSw1MzAgQEAKKy8qIAorICogZHJpdmVycy9ydGMvcnRjLWMyay5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5taW5kc3BlZWQuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNpbmNsdWRlIDxsaW51eC9ydGMvcnRjLWMyay5oPgorCisvKiBJbml0aWFsIGJ5IGRlZmF1bHQgdmFsdWVzICovCisjZGVmaW5lCVlFQVIJCTExMiAvKiAyMDEyICovIAorI2RlZmluZQlNT05USAkJNiAvKiA2ICovCisjZGVmaW5lCURBVEUJCTEyIC8qIDE4ICovIAorI2RlZmluZQlEQVkJCTMgLy8wOlNVTkRBWSAxOk1PTkRBWSAyOlRVRVNEQVkgMzpXRURORVNEQVkgNDpUSFVSU0RBWSA1OkZSSURBWSA2OlNBVFVSREFZCisjZGVmaW5lCUhPVVIJCTE4IC8vMjQgaG91cnMgdGltZSBmb3JtYXQKKyNkZWZpbmUJTUlOCQkyNQorI2RlZmluZQlTRUMJCTEKKy8qRW5kKi8KKworI2RlZmluZQlDMktfUlRDX1JUQ0FMTV9TRUNFTgkweDgxCisjZGVmaW5lCUMyS19SVENfUlRDQUxNX01JTkVOCTB4ODIKKyNkZWZpbmUJQzJLX1JUQ19SVENBTE1fSE9VUkVOCTB4ODQKKyNkZWZpbmUJQzJLX1JUQ19SVENBTE1fREFURUVOCTB4ODgKKyNkZWZpbmUJQzJLX1JUQ19SVENBTE1fREFZRU4JMHg5MAorI2RlZmluZQlDMktfUlRDX1JUQ0FMTV9NT05FTgkweEEwCisjZGVmaW5lCUMyS19SVENfUlRDQUxNX1lFQVJFTgkweEMwCisjZGVmaW5lCUMyS19SVENfUlRDQUxNX0dMT0JBTEVOCTB4ODAKKworI2RlZmluZQlDMktfUlRDX1JUQ0FMTV9BTE1FTgkweGZmCisjZGVmaW5lCURJU0FCTEVfQUxMX0FMQU0JMHgwCisKKyNkZWZpbmUJQzJLX1JUQ0FMTV9BTE1FTgkoMHgzPDwwKQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlICpjMmtfcnRjX21lbTsKK3N0YXRpYyB2b2xhdGlsZSBjaGFyIF9faW9tZW0gKmMya19ydGNfYmFzZTsKK3N0YXRpYyBpbnQgcnRjX2FsYXJtbm87CisKKyNkZWZpbmUgd3JpdGVsX3J0Yyh2LGEpCQkoKihpbnQgKikoYSkgPSAodikpCisjZGVmaW5lIHJlYWRsX3J0YyhhKQkJKCooaW50ICopKGEpKQorCit2b2lkIHJ0Y19yZWdfd3JpdGUodW5zaWduZWQgaW50IFdyRGF0YSwgdm9sYXRpbGUgY2hhciAqV3JBZCkKK3sgCisJdW5zaWduZWQgaW50IFdyQWRkciA9ICh1bnNpZ25lZCBpbnQpV3JBZDsKKwl1bnNpZ25lZCBpbnQgV3JpdGVEYXRhOworCisJV3JpdGVEYXRhID0gKDB4MDAwMEZGRkYgJiBXckRhdGEpOworCisJLyogVGhlIGNvcmUgQVBCIHJ1bnMgYXQgMjUwSHogLHdoZXJlIGFzIHRoZSBSVEMgQVBCIHJ1bnMgYXQgNTBNSHouCisJICogU28gdGhlIGRlbGF5IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgYmV0d2VlbiB0d28gQVBCIHJlcXVlc3RzLCBvdGhlcgorCSAqIHdpc2UgdHJhbnNhY3Rpb24gZ2V0cyBkcm9wcGVkLgorCSAqIEVhY2ggQ29yZSB0aW1lIHVuaXQgPSA0MDAwcHMgLCBSVEMgdGltZSB1bml0ID0gMjAwMDBwcy4gNSB0aW1lcyAKKwkgKiBjb3JlIHRpbWUgdW5pdCA9IFJUQyB0aW1lIHVuaXQuIAorCSAqLworCisJd3JpdGVsX3J0YyhXcml0ZURhdGEsIFdyQWRkcik7CisKKwl1ZGVsYXkoNSk7CisKKwlyZXR1cm47Cit9CisKK2ludCBydGNfcmVnX3JlYWQodm9sYXRpbGUgY2hhciAqUmRBZCkKK3sgCisJdW5zaWduZWQgaW50ICpSZEFkZHIgPSAodW5zaWduZWQgaW50KilSZEFkOyAKKwl1bnNpZ25lZCBpbnQgV3JpdGVEYXRhLFJlYWREYXRhOworCisJV3JpdGVEYXRhID0gMHgwMDAxMDAwMDsKKworCS8qIFRoZSBjb3JlIEFQQiBydW5zIGF0IDI1MEh6ICx3aGVyZSBhcyB0aGUgUlRDIEFQQiBydW5zIGF0IDUwTUh6LgorCSAqIFNvIHRoZSBkZWxheSBuZWVkIHRvIGJlIGluc2VydGVkIGJldHdlZW4gdHdvIEFQQiByZXF1ZXN0cywgb3RoZXIKKwkgKiB3aXNlIHRyYW5zYWN0aW9uIGdldHMgZHJvcHBlZC4KKwkgKiBFYWNoIENvcmUgdGltZSB1bml0ID0gNDAwMHBzICwgUlRDIHRpbWUgdW5pdCA9IDIwMDAwcHMuIDUgdGltZXMgCisJICogY29yZSB0aW1lIHVuaXQgPSBSVEMgdGltZSB1bml0LgorCSAqLworCisJd3JpdGVsX3J0YyhXcml0ZURhdGEsIFJkQWRkcik7CisKKwkvKiBUaGUgY29yZSBBUEIgcnVucyBhdCAyNTBIeiAsd2hlcmUgYXMgdGhlIFJUQyBBUEIgcnVucyBhdCA1ME1Iei4KKwkgKiBTbyB0aGUgZGVsYXkgbmVlZCB0byBiZSBpbnNlcnRlZCBiZXR3ZWVuIHR3byBBUEIgcmVxdWVzdHMsIG90aGVyCisJICogd2lzZSB0cmFuc2FjdGlvbiBnZXRzIGRyb3BwZWQuCisJICogRWFjaCBDb3JlIHRpbWUgdW5pdCA9IDQwMDBwcyAsIFJUQyB0aW1lIHVuaXQgPSAyMDAwMHBzLiA1IHRpbWVzIAorCSAqIGNvcmUgdGltZSB1bml0ID0gUlRDIHRpbWUgdW5pdC4gCisJICovCisKKwl1ZGVsYXkoNSk7CisKKwlSZWFkRGF0YSA9IHJlYWRsX3J0YyhSZEFkZHIpOworCisJd2hpbGUgKCAoMHgwMDAxMDAwMCAmIFJlYWREYXRhKSAhPSAweDEwMDAwKQorCXsKKwkJdWRlbGF5KDUpOworCQlSZWFkRGF0YSA9IHJlYWRsX3J0YyhSZEFkZHIpOworCX0KKworCXJldHVybigoMHgwMDAwRkZGRiAmIFJlYWREYXRhKSk7ICAgIAorfQorCit2b2lkIGRiZ19ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKK3sKKwlwcmludGsgKCJcbiVzOiBcCisJCQlcblx0cnRjX3RtLT50bV9zZWM9JWQgXAorCQkJXG5cdHJ0Y190bS0+dG1fbWluPSVkIFwKKwkJCVxuXHRydGNfdG0tPnRtX2hvdXI9JWQgXAorCQkJXG5cdHJ0Y190bS0+dG1fbWRheT0lZCBcCisJCQlcblx0cnRjX3RtLT50bV93ZGF5PSVkIFwKKwkJCVxuXHRydGNfdG0tPnRtX21vbj0lZCBcCisJCQlcblx0cnRjX3RtLT50bV95ZWFyPSVkIFxuXG4iLCBfX2Z1bmNfXywgXAorCQkJcnRjX3RtLT50bV9zZWMsIHJ0Y190bS0+dG1fbWluLCBydGNfdG0tPnRtX2hvdXIsIHJ0Y190bS0+dG1fbWRheSxcCisJCQlydGNfdG0tPnRtX3dkYXksIHJ0Y190bS0+dG1fbW9uLCBydGNfdG0tPnRtX3llYXIpOworfQorCisvKiBJUlEgSGFuZGxlcnMgKi8KKworc3RhdGljIGlycXJldHVybl90IGMya19ydGNfYWxhcm1pcnEoaW50IGlycSwgdm9pZCAqaWQpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJkZXYgPSBpZDsKKworCXByX2RlYnVnICgiJXM6IGlycT0lZDogQWxhcmFtIFJhbmcgLi4uLi4uLi4uLi4uLi4hISFcbiBcCisJCQlcblx0KigweCV4KT0weCV4IFwKKwkJCVxuXHQqKDB4JXgpPTB4JXggXG4iLCBfX2Z1bmNfXywgaXJxLCBcCisJCQkodW5zaWduZWQgaW50KShjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX1JUQ0FMTSksIHJ0Y19yZWdfcmVhZChjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX1JUQ0FMTSksXAorCQkJKHVuc2lnbmVkIGludCkoYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19SVENJTSksIHJ0Y19yZWdfcmVhZChjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX1JUQ0lNKSk7CisKKwlydGNfdXBkYXRlX2lycShyZGV2LCAxLCBSVENfQUYgfCBSVENfSVJRRik7CisJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogRElTQkFCTElORyBhbGFybQorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICovCisJcnRjX3JlZ193cml0ZShESVNBQkxFX0FMTF9BTEFNLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX1JUQ0FMTSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBESVNCQUJMSU5HIHRoZSBhbGFybSBpbnRlcnJ1cHQKKwkgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqLworCXJ0Y19yZWdfd3JpdGUoRElTQUJMRV9BTExfQUxBTSwgYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19SVENJTSk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiBESVNCQUJMSU5HIHRoZSBhbGFybSBQRU5ESU5HIGJpdAorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICovCisJcnRjX3JlZ193cml0ZShESVNBQkxFX0FMTF9BTEFNLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX1JUQ1BFTkQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBUaW1lIHJlYWQvd3JpdGUgKi8KK3N0YXRpYyBpbnQgYzJrX3J0Y19nZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJcnRjX3RtLT50bV95ZWFyID0gcnRjX3JlZ19yZWFkKGMya19ydGNfYmFzZSArIEMyS19SVENfQkNEWUVBUik7CisJcnRjX3RtLT50bV9tb24gPSBydGNfcmVnX3JlYWQoYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19CQ0RNT04pOworCXJ0Y190bS0+dG1fbWRheSA9IHJ0Y19yZWdfcmVhZChjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0JDRERBVEUpOworCXJ0Y190bS0+dG1fd2RheSA9IHJ0Y19yZWdfcmVhZChjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0JDRERBWSk7CisJcnRjX3RtLT50bV9ob3VyID0gcnRjX3JlZ19yZWFkKGMya19ydGNfYmFzZSArIEMyS19SVENfQkNESE9VUik7CisJcnRjX3RtLT50bV9taW4gID0gcnRjX3JlZ19yZWFkKGMya19ydGNfYmFzZSArIEMyS19SVENfQkNETUlOKTsKKwlydGNfdG0tPnRtX3NlYyAgPSBydGNfcmVnX3JlYWQoYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19CQ0RTRUMpOworCisJcHJfZGVidWcoIiVzOiBCQ0Q6XG4gXAorCQkJXG5cdHllYXIubW9uLmRhdGUuZGF5IGhyOm1pbjpzZWNcbiBcCisJCQlcblx0MHgleC4weCV4LjB4JXguMHgleCAweCV4OjB4JXg6MHgleFxuIixfX2Z1bmNfXyxcCisJCQlydGNfdG0tPnRtX3llYXIsIHJ0Y190bS0+dG1fbW9uLCBydGNfdG0tPnRtX21kYXkscnRjX3RtLT50bV93ZGF5LFwKKwkJCXJ0Y190bS0+dG1faG91ciwgcnRjX3RtLT50bV9taW4sIHJ0Y190bS0+dG1fc2VjKTsKKworCXJ0Y190bS0+dG1fc2VjID0gYmNkMmJpbihydGNfdG0tPnRtX3NlYyk7CisJcnRjX3RtLT50bV9taW4gPSBiY2QyYmluKHJ0Y190bS0+dG1fbWluKTsKKwlydGNfdG0tPnRtX2hvdXIgPSBiY2QyYmluKHJ0Y190bS0+dG1faG91cik7CisJcnRjX3RtLT50bV9tZGF5ID0gYmNkMmJpbihydGNfdG0tPnRtX21kYXkpOworCXJ0Y190bS0+dG1fd2RheSA9IGJjZDJiaW4ocnRjX3RtLT50bV93ZGF5KTsKKwlydGNfdG0tPnRtX21vbiA9IGJjZDJiaW4ocnRjX3RtLT50bV9tb24pOworCXJ0Y190bS0+dG1feWVhciA9IGJjZDJiaW4ocnRjX3RtLT50bV95ZWFyKTsKKworCXJ0Y190bS0+dG1feWVhciArPSAxMDA7CisKKwlydGNfdG0tPnRtX21vbiAtPSAxOworCisJcmV0dXJuIHJ0Y192YWxpZF90bShydGNfdG0pOworfQorCisjZGVmaW5lCUMyS19SVENfUlRDQ09OX1NUQVJUQgkoMHgxPDwwKSAvKiBSVEMgSGFsdCAqLworI2RlZmluZQlDMktfUlRDX1JUQ0NPTl9SVENFTgkoMHgxPDwxKSAvKiBSVEMgV3JpdGUgRW5hYmxlICovCisjZGVmaW5lCUMyS19SVENfUlRDQ09OX0NMS1JTVAkoMHgxPDwyKSAvKiBSVEMgUkVTRVQgKi8KKworc3RhdGljIGludCBjMmtfcnRjX3NldHRpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCWludCB5ZWFyID0gdG0tPnRtX3llYXIgLSAxMDA7CisKKwlwcl9kZWJ1ZygiJXM6IFdpbGwgc2V0OlwKKwkJCVxuJTA0ZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmRcbiIsX19mdW5jX18sXAorCQkJdG0tPnRtX3llYXIrMTkwMCwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksIFwKKwkJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCWlmICh5ZWFyIDwgMCB8fCB5ZWFyID49IDEwMCkgeworCQlkZXZfZXJyKGRldiwgInJ0YyBvbmx5IHN1cHBvcnRzIDEwMCB5ZWFyc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJ0Y19yZWdfd3JpdGUoKEMyS19SVENfUlRDQ09OX1NUQVJUQiB8IEMyS19SVENfUlRDQ09OX1JUQ0VOIHwgQzJLX1JUQ19SVENDT05fQ0xLUlNUKSwgXAorCQkJYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19SVENDT04pOworCisJcnRjX3JlZ193cml0ZShiaW4yYmNkKHRtLT50bV9taW4pLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0JDRE1JTik7CisJcnRjX3JlZ193cml0ZShiaW4yYmNkKHRtLT50bV9ob3VyKSwgYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19CQ0RIT1VSKTsKKwlydGNfcmVnX3dyaXRlKGJpbjJiY2QodG0tPnRtX21kYXkpLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0JDRERBVEUpOworCXJ0Y19yZWdfd3JpdGUoYmluMmJjZCh0bS0+dG1fd2RheSksIGMya19ydGNfYmFzZSArIEMyS19SVENfQkNEREFZKTsKKwlydGNfcmVnX3dyaXRlKGJpbjJiY2QodG0tPnRtX21vbisxKSwgYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19CQ0RNT04pOworCXJ0Y19yZWdfd3JpdGUoYmluMmJjZCh5ZWFyKSwgYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19CQ0RZRUFSKTsKKwlydGNfcmVnX3dyaXRlKGJpbjJiY2QodG0tPnRtX3NlYyksIGMya19ydGNfYmFzZSArIEMyS19SVENfQkNEU0VDKTsKKworCXJ0Y19yZWdfd3JpdGUoKEMyS19SVENfUlRDQ09OX1JUQ0VOIHwgQzJLX1JUQ19SVENDT05fQ0xLUlNUKSwgYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19SVENDT04pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYzJrX3J0Y19zZXRhaWUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW5hYmxlZCkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJcHJfZGVidWcgKCIlczogYWllPSVkXG4iLCBfX2Z1bmNfXywgZW5hYmxlZCk7CisKKwl0bXAgPSBydGNfcmVnX3JlYWQoYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19SVENJTSkgJiB+QzJLX1JUQ0FMTV9BTE1FTjsKKworCWlmIChlbmFibGVkKQorCQl0bXAgfD0gQzJLX1JUQ0FMTV9BTE1FTjsKKworCXJ0Y19yZWdfd3JpdGUodG1wLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX1JUQ0lNKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGMya19ydGNfZ2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgKmFsbV90bSA9ICZhbHJtLT50aW1lOworCXVuc2lnbmVkIGludCBhbG1fZW47CisKKwlhbG1fdG0tPnRtX3NlYyAgPSBydGNfcmVnX3JlYWQoYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19BTE1TRUMpOworCWFsbV90bS0+dG1fbWluICA9IHJ0Y19yZWdfcmVhZChjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0FMTU1JTik7CisJYWxtX3RtLT50bV9ob3VyID0gcnRjX3JlZ19yZWFkKGMya19ydGNfYmFzZSArIEMyS19SVENfQUxNSE9VUik7CisJYWxtX3RtLT50bV9tb24gID0gcnRjX3JlZ19yZWFkKGMya19ydGNfYmFzZSArIEMyS19SVENfQUxNTU9OKTsKKwlhbG1fdG0tPnRtX21kYXkgPSBydGNfcmVnX3JlYWQoYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19BTE1EQVRFKTsKKwlhbG1fdG0tPnRtX3dkYXkgPSBydGNfcmVnX3JlYWQoYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19BTE1EQVkpOworCWFsbV90bS0+dG1feWVhciA9IHJ0Y19yZWdfcmVhZChjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0FMTVlFQVIpOworCisJYWxtX2VuID0gcnRjX3JlZ19yZWFkKGMya19ydGNfYmFzZSArIEMyS19SVENfUlRDQUxNKTsKKworCWFscm0tPmVuYWJsZWQgPSAoYWxtX2VuICYgQzJLX1JUQ19SVENBTE1fQUxNRU4pID8gMSA6IDA7CisKKwlwcl9kZWJ1ZygiJXM6IGFsbV9lbj0lZCwgJTA0ZC4lMDJkLiUwMmQuJTAyZCAgJTAyZDolMDJkOiUwMmRcbiIsX19mdW5jX18sCisJCQlhbG1fZW4sCisJCQkxOTAwICsgYWxtX3RtLT50bV95ZWFyLCBhbG1fdG0tPnRtX21vbiwgYWxtX3RtLT50bV9tZGF5LAorCQkJYWxtX3RtLT50bV93ZGF5LCBhbG1fdG0tPnRtX2hvdXIsIGFsbV90bS0+dG1fbWluLCBhbG1fdG0tPnRtX3NlYyk7CisKKwkvKiBkZWNvZGUgdGhlIGFsYXJtIGVuYWJsZSBmaWVsZCAqLworCisJaWYgKGFsbV9lbiAmIEMyS19SVENfUlRDQUxNX1NFQ0VOKQorCQlhbG1fdG0tPnRtX3NlYyA9IGJjZDJiaW4oYWxtX3RtLT50bV9zZWMpOworCWVsc2UKKwkJYWxtX3RtLT50bV9zZWMgPSAtMTsKKworCWlmIChhbG1fZW4gJiBDMktfUlRDX1JUQ0FMTV9NSU5FTikKKwkJYWxtX3RtLT50bV9taW4gPSBiY2QyYmluKGFsbV90bS0+dG1fbWluKTsKKwllbHNlCisJCWFsbV90bS0+dG1fbWluID0gLTE7CisKKwlpZiAoYWxtX2VuICYgQzJLX1JUQ19SVENBTE1fSE9VUkVOKQorCQlhbG1fdG0tPnRtX2hvdXIgPSBiY2QyYmluKGFsbV90bS0+dG1faG91cik7CisJZWxzZQorCQlhbG1fdG0tPnRtX2hvdXIgPSAtMTsKKworCWlmIChhbG1fZW4gJiBDMktfUlRDX1JUQ0FMTV9EQVlFTikKKwkJYWxtX3RtLT50bV9tZGF5ID0gYmNkMmJpbihhbG1fdG0tPnRtX21kYXkpOworCWVsc2UKKwkJYWxtX3RtLT50bV9tZGF5ID0gLTE7CisKKwlpZiAoYWxtX2VuICYgQzJLX1JUQ19SVENBTE1fTU9ORU4pIHsKKwkJYWxtX3RtLT50bV9tb24gPSBiY2QyYmluKGFsbV90bS0+dG1fbW9uKTsKKwkJYWxtX3RtLT50bV9tb24gLT0gMTsKKwl9IGVsc2UgeworCQlhbG1fdG0tPnRtX21vbiA9IC0xOworCX0KKworCWlmIChhbG1fZW4gJiBDMktfUlRDX1JUQ0FMTV9ZRUFSRU4peworCQlhbG1fdG0tPnRtX3llYXIgPSBiY2QyYmluKGFsbV90bS0+dG1feWVhcik7CisJCWFsbV90bS0+dG1feWVhciArPSAxMDA7CisJfQorCWVsc2UKKwkJYWxtX3RtLT50bV95ZWFyID0gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjMmtfcnRjX3NldGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCisJcHJfZGVidWcoIiVzOiAlZCwgJTA0ZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmRcbiIsX19mdW5jX18sCisJCQlhbHJtLT5lbmFibGVkLAorCQkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uICsgMSwgdG0tPnRtX21kYXksCisJCQl0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CisKKwlydGNfcmVnX3dyaXRlKDB4MywgKGMya19ydGNfYmFzZSArIEMyS19SVENfUlRDSU0pKTsgLy9lbmFibGUgYWxhcm0gaW50ZXJydXB0IG1vZGUKKwlydGNfcmVnX3dyaXRlKDB4ZmYsIChjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX1JUQ0FMTSkpOyAvL2VuYWJsZSBhbGwgYWxhcm1zLgorCisJaWYgKHRtLT50bV9zZWMgPCA2MCAmJiB0bS0+dG1fc2VjID49IDApIHsKKwkJcnRjX3JlZ193cml0ZShiaW4yYmNkKHRtLT50bV9zZWMpLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0FMTVNFQyk7CisJfQorCisJaWYgKHRtLT50bV9taW4gPCA2MCAmJiB0bS0+dG1fbWluID49IDApIHsKKwkJcnRjX3JlZ193cml0ZShiaW4yYmNkKHRtLT50bV9taW4pLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0FMTU1JTik7CisJfQorCisJaWYgKHRtLT50bV9ob3VyIDwgMjQgJiYgdG0tPnRtX2hvdXIgPj0gMCkgeworCQlydGNfcmVnX3dyaXRlKGJpbjJiY2QodG0tPnRtX2hvdXIpLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0FMTUhPVVIpOworCX0KKworCWlmICh0bS0+dG1fbWRheSA8IDMyICYmIHRtLT50bV9tZGF5ID49IDEpIHsKKwkJcnRjX3JlZ193cml0ZShiaW4yYmNkKHRtLT50bV9tZGF5KSwgYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19BTE1EQVRFKTsKKwl9CisKKwlpZiAodG0tPnRtX3dkYXkgPCA3ICYmIHRtLT50bV93ZGF5ID49IDApIHsKKwkJcnRjX3JlZ193cml0ZShiaW4yYmNkKHRtLT50bV93ZGF5KSwgYzJrX3J0Y19iYXNlICsgQzJLX1JUQ19BTE1EQVkpOworCX0KKworCWlmICh0bS0+dG1fbW9uIDwgMTIgJiYgdG0tPnRtX21vbiA+PSAwKSB7CisJCXJ0Y19yZWdfd3JpdGUoYmluMmJjZCh0bS0+dG1fbW9uKzEpLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0FMTU1PTik7CisJfQorCisJaWYgKHRtLT50bV95ZWFyID49IDEpIHsKKwkJaW50IHllYXIgPSB0bS0+dG1feWVhciAtIDEwMDsKKworCQlpZiAoeWVhciA8IDAgfHwgeWVhciA+PSAxMDApIHsKKwkJCWRldl9lcnIoZGV2LCAicnRjIG9ubHkgc3VwcG9ydHMgMTAwIHllYXJzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcnRjX3JlZ193cml0ZShiaW4yYmNkKHllYXIpLCBjMmtfcnRjX2Jhc2UgKyBDMktfUlRDX0FMTVlFQVIpOworCX0KKworCWMya19ydGNfc2V0YWllKGRldiwgYWxybS0+ZW5hYmxlZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGMya19ydGNvcHMgPSB7CisJLnJlYWRfdGltZQk9IGMya19ydGNfZ2V0dGltZSwKKwkuc2V0X3RpbWUJPSBjMmtfcnRjX3NldHRpbWUsCisJLnJlYWRfYWxhcm0JPSBjMmtfcnRjX2dldGFsYXJtLAorCS5zZXRfYWxhcm0JPSBjMmtfcnRjX3NldGFsYXJtLAorCS5hbGFybV9pcnFfZW5hYmxlID0gYzJrX3J0Y19zZXRhaWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBjMmtfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisKKwlmcmVlX2lycShydGNfYWxhcm1ubywgcnRjKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwljMmtfcnRjX3NldGFpZSgmZGV2LT5kZXYsIDApOworCisJaW91bm1hcChjMmtfcnRjX2Jhc2UpOworCXJlbGVhc2VfcmVzb3VyY2UoYzJrX3J0Y19tZW0pOworCWtmcmVlKGMya19ydGNfbWVtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciBfX2luaXRkYXRhIGJhbm5lcltdID0gIkMyMDAwIFJUQywgKGMpIDIwMTIgTWluZHNwZWVkIFRlY2hub2xvZ2llc1xuIjsKKworc3RhdGljIGludCBfX2RldmluaXQgYzJrX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHJ0Y190aW1lIHJ0Y190bTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJcnRjX2FsYXJtbm8gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChydGNfYWxhcm1ubyA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIGZvciBhbGFybVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIGdldCB0aGUgbWVtb3J5IHJlZ2lvbiAqLworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgcmVnaW9uIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcHJfZGVidWcgKCIlczogYWxhcm0gaXJxPSVkIHJlcy0+c3RhcnQ9MHgleCByZXMtPmVuZD0weCV4XG4iLCBfX2Z1bmNfXywgXAorCQkJcnRjX2FsYXJtbm8sIHJlcy0+c3RhcnQsIHJlcy0+ZW5kKTsKKworCWMya19ydGNfbWVtID0gcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKKwkJCXBkZXYtPm5hbWUpOworCWlmIChjMmtfcnRjX21lbSA9PSBOVUxMKSB7CisJCXByaW50aygiJXM6IGZhaWxlZCB0byByZXNlcnZlIG1lbW9yeSByZWdpb25cbiIsIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfbm9yZXM7CisJfQorCisJYzJrX3J0Y19iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChjMmtfcnRjX2Jhc2UgPT0gTlVMTCkgeworCQlwcmludGsgKCIlczogZmFpbGVkIGlvcmVtYXAoKVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9ub21hcDsKKwl9CisKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisKKwkvKiByZWdpc3RlciBSVEMgYW5kIGV4aXQgKi8KKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoImMyayIsICZwZGV2LT5kZXYsICZjMmtfcnRjb3BzLAorCQkJVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgYXR0YWNoIHJ0Y1xuIik7CisJCXJldCA9IFBUUl9FUlIocnRjKTsKKwkJZ290byBlcnJfbm9ydGM7CisJfSBlbHNlCisJCXByaW50ayhiYW5uZXIpOworCisJLyogQ2hlY2sgUlRDIFRpbWUgKi8KKwljMmtfcnRjX2dldHRpbWUoTlVMTCwgJnJ0Y190bSk7CisKKwlpZiAocnRjX3ZhbGlkX3RtKCZydGNfdG0pKSB7CisJCXJ0Y190bS50bV95ZWFyCT0gWUVBUjsKKwkJcnRjX3RtLnRtX21vbgk9IE1PTlRIOworCQlydGNfdG0udG1fbWRheQk9IERBVEU7CisJCXJ0Y190bS50bV93ZGF5CT0gREFZOworCQlydGNfdG0udG1faG91cgk9IEhPVVI7CisJCXJ0Y190bS50bV9taW4JPSBNSU47CisJCXJ0Y190bS50bV9zZWMJPSBTRUM7CisKKwkJYzJrX3J0Y19zZXR0aW1lKE5VTEwsICZydGNfdG0pOworCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJXYXJuaW5nOiBJbnZhbGlkIFJUQyB2YWx1ZSBzbyBpbml0aWFsaXppbmcgaXRcbiIpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShydGNfYWxhcm1ubywgYzJrX3J0Y19hbGFybWlycSwKKwkJCUlSUUZfRElTQUJMRUQsICAicnRjLWFsYXJtIiwgcnRjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIklSUSVkIGVycm9yICVkXG4iLCBydGNfYWxhcm1ubywgcmV0KTsKKwkJZ290byBlcnJfYWxhcm1faXJxOworCX0KKworCXJldHVybiAwOworCitlcnJfYWxhcm1faXJxOgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCitlcnJfbm9ydGM6CisJaW91bm1hcChjMmtfcnRjX2Jhc2UpOworCitlcnJfbm9tYXA6CisJcmVsZWFzZV9yZXNvdXJjZShjMmtfcnRjX21lbSk7CisKK2Vycl9ub3JlczoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qIFJUQyBQb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgKi8KK3N0YXRpYyBpbnQgYzJrX3J0Y19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjMmtfcnRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYzJrX3J0Y19zdXNwZW5kIE5VTEwKKyNkZWZpbmUgYzJrX3J0Y19yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjMmtfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYzJrX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGMya19ydGNfcmVtb3ZlKSwKKwkuc3VzcGVuZAk9IGMya19ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGMya19ydGNfcmVzdW1lLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJjMmstcnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGMya19ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmMya19ydGNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGMya19ydGNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjMmtfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGMya19ydGNfaW5pdCk7Cittb2R1bGVfZXhpdChjMmtfcnRjX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1pbmRzcGVlZCBSVEMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTYXRlbmRyYSBQcmF0YXAgPHNhdGVuZHJhLnByYXRhcEBnbWFpbC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmMyay1ydGMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IDc1ODc3OTYuLjdhZWEyYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtMzczLDYgKzM3MywyMCBAQAogCiAJICBPciBmb3IgdGhlIERTNTcwLCBzZWUgIlhQUyBTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkgKHYyLjAwYikiCiAKK2NvbmZpZyBTUElfTVNQRF9MT1dfU1BFRUQKKwl0cmlzdGF0ZSAiTVNQRCBTUEkgbG93LXNwZWVkIGNvbnRyb2xsZXIgbW9kdWxlIgorCXNlbGVjdCBTUElfREVTSUdOV0FSRQorCWRlZmF1bHQgU1BJX01BU1RFUgorCWhlbHAKKwkJVGhpcyBleHBvc2VzIHRoZSBNU1BEIFNQSSBsb3ctc3BlZWQgY29udHJvbGxlci4KKworY29uZmlnIFNQSV9NU1BEX0hJR0hfU1BFRUQKKwl0cmlzdGF0ZSAiTVNQRCBTUEkgaGlnaC1zcGVlZCBjb250cm9sbGVyIG1vZHVsZSIKKwlzZWxlY3QgU1BJX0RFU0lHTldBUkUKKwlkZWZhdWx0IFNQSV9NQVNURVIKKwloZWxwCisJCVRoaXMgZXhwb3NlcyB0aGUgTVNQRCBTUEkgaGlnaC1zcGVlZCBjb250cm9sbGVyLgorCiBjb25maWcgU1BJX05VQzkwMAogCXRyaXN0YXRlICJOdXZvdG9uIE5VQzkwMCBzZXJpZXMgU1BJIgogCWRlcGVuZHMgb24gQVJDSF9XOTBYOTAwICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvTWFrZWZpbGUgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQppbmRleCA2MWMzMjYxLi40MWM2NTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3NwaS9NYWtlZmlsZQpAQCAtMTksOCArMTksMjYgQEAKIG9iai0kKENPTkZJR19TUElfQklUQkFORykJCSs9IHNwaS1iaXRiYW5nLm8KIG9iai0kKENPTkZJR19TUElfQlVUVEVSRkxZKQkJKz0gc3BpLWJ1dHRlcmZseS5vCiBvYmotJChDT05GSUdfU1BJX0NPTERGSVJFX1FTUEkpCQkrPSBzcGktY29sZGZpcmUtcXNwaS5vCisKK1NQSV9NU1BEPW4KK2lmZXEgKCQoQ09ORklHX1NQSV9NU1BEX0hJR0hfU1BFRUQpLG0pCisgICAgU1BJX01TUEQ9bQorZW5kaWYKK2lmZXEgKCQoQ09ORklHX1NQSV9NU1BEX0xPV19TUEVFRCksbSkKKyAgICBTUElfTVNQRD1tCitlbmRpZgoraWZlcSAoJChDT05GSUdfU1BJX01TUERfSElHSF9TUEVFRCkseSkKKyAgICBTUElfTVNQRD15CitlbmRpZgoraWZlcSAoJChDT05GSUdfU1BJX01TUERfTE9XX1NQRUVEKSx5KQorICAgIFNQSV9NU1BEPXkKK2VuZGlmCisjb2JqLSQoU1BJX01TUEQpCQkJCSs9IHNwaS1jMjAwMC1kbWEubworI29iai0kKFNQSV9NU1BEKQkJCQkrPSBzcGktYzIwMDAubworCiBvYmotJChDT05GSUdfU1BJX0RBVklOQ0kpCQkrPSBzcGktZGF2aW5jaS5vCi1vYmotJChDT05GSUdfU1BJX0RFU0lHTldBUkUpCQkrPSBzcGktZHcubworb2JqLSQoQ09ORklHX1NQSV9ERVNJR05XQVJFKQkJKz0gZGVzaWdud2FyZV9zcGkubworI29iai0kKENPTkZJR19TUElfREVTSUdOV0FSRSkJCSs9IHNwaS1kdy5vCiBvYmotJChDT05GSUdfU1BJX0RXX01NSU8pCQkrPSBzcGktZHctbW1pby5vCiBvYmotJChDT05GSUdfU1BJX0RXX1BDSSkJCSs9IHNwaS1kdy1taWRwY2kubwogc3BpLWR3LW1pZHBjaS1vYmpzCQkJOj0gc3BpLWR3LXBjaS5vIHNwaS1kdy1taWQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvY29tY2VydG9fc3BpLmMgYi9kcml2ZXJzL3NwaS9jb21jZXJ0b19zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjUzN2FmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvY29tY2VydG9fc3BpLmMKQEAgLTAsMCArMSw2NDAgQEAKKy8qCisgKiBNaW5kc3BlZWQgU1BJIGNvbnRyb2xsZXIgZHJpdmVyIChtYXN0ZXIgbW9kZSBvbmx5KQorICoKKyAqIEF1dGhvcjogU2F0ZW5kcmEgUHJhdGFwCisgKglzYXRlbmRyYS5wcmF0YXBAbWluZHNwZWVkLmNvbQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGlfYml0YmFuZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvY29tY2VydG9fc3BpLmg+CisKKyNkZWZpbmUgU1BJX1ZFUlNJT04gICAgICAgICAgICAgIjAuMC4xIgorCisjZGVmaW5lIHNwaV9lcnIoZGV2LCBmbXQsIGFyZ3MuLi4pICAgICAgZGV2X2VycihkZXYsICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgIyNhcmdzKQorI2RlZmluZSBzcGlfZGJnKGRldiwgZm10LCBhcmdzLi4uKSAgICAgIGRldl9kYmcoZGV2LCAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjYXJncykKKyNkZWZpbmUgc3BpX3dhcm4oZGV2LCBmbXQsIGFyZ3MuLi4pICAgICBkZXZfd2FybihkZXYsICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXywgIyNhcmdzKQorICAgICAgICAgCitzdHJ1Y3QgY29tY2VydG9fc3BpIHsKKwkvKiBiaXRiYW5nIGhhcyB0byBiZSBmaXJzdCAqLworCXN0cnVjdCBzcGlfYml0YmFuZyBiaXRiYW5nOworICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkb25lOworCXN0cnVjdCByZXNvdXJjZSBtZW07IC8qIHBoeXMgbWVtICovCisJdm9pZCBfX2lvbWVtCSpyZWdzOwkvKiB2aXJ0LiBhZGRyZXNzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVycyAqLworCisJdTMyCQlpcnE7CisKKwl1OCAqcnhfcHRyOwkJLyogcG9pbnRlciBpbiB0aGUgVHggYnVmZmVyICovCisJY29uc3QgdTggKnR4X3B0cjsJLyogcG9pbnRlciBpbiB0aGUgUnggYnVmZmVyICovCisJaW50IHJlbWFpbmluZ19ieXRlczsJLyogdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHRyYW5zZmVyICovCisJdTggYml0c19wZXJfd29yZDsKKworICAgIGludCAoKmRvX3JlYWQ4KSh2b2lkIF9faW9tZW0gKiwgdTggKmJ1ZiwgdW5zaWduZWQgaW50ICpsZW4pOworICAgIGludCAoKmRvX3dyaXRlOCkodm9pZCBfX2lvbWVtICosIHU4ICpidWYsIHVuc2lnbmVkIGludCAqbGVuKTsKKworICAgIGludCAoKmRvX3JlYWQxNikodm9pZCBfX2lvbWVtICosIHUxNiAqYnVmLCB1bnNpZ25lZCBpbnQgKmxlbik7CisgICAgaW50ICgqZG9fd3JpdGUxNikodm9pZCBfX2lvbWVtICosIHUxNiAqYnVmLCB1bnNpZ25lZCBpbnQgKmxlbik7CisKKyAgICBpbnQgKCpkb193cml0ZV9yZWFkKSh2b2lkIF9faW9tZW0gKiwgdTggZnMsIHU4ICp3YnVmLCB1bnNpZ25lZCBpbnQgKndsZW4sIHU4ICpyYnVmLCB1bnNpZ25lZCBpbnQgKnJsZW4pOworfTsKKworc3RhdGljIGludCBkb193cml0ZV9yZWFkX3RyYW5zZmVyKHZvaWQgX19pb21lbSAqcmVnX2Jhc2UsIHU4IGZzLCB1OCAqd2J1ZiwgdW5zaWduZWQgaW50ICp3bGVuLCB1OCAqcmJ1ZiwgdW5zaWduZWQgaW50ICpybGVuKQoreworICAgIHUzMiBzciwgZHI7CisgICAgdW5zaWduZWQgaW50IHdsZW5fbm93ID0gMCwgcmxlbl9ub3cgPSAwOworICAgIGludCByYyA9IDA7CisKKyAgICB3aGlsZSAod2xlbl9ub3cgPCAqd2xlbikgeworICAgICAgICBzciA9IF9fcmF3X3JlYWRsKHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX1NSKTsKKworICAgICAgICBpZiAoc3IgJiBURk5GKSB7CisgICAgICAgICAgICBpZiAod2xlbl9ub3cgPCAqd2xlbikgeworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRldyhjcHVfdG9fbGUxNigodTE2KSAqd2J1ZiksIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0RSKTsKKyAgICAgICAgICAgICAgICB3YnVmKys7CisgICAgICAgICAgICAgICAgd2xlbl9ub3crKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChybGVuX25vdyA8ICpybGVuKSB7CisgICAgICAgIHNyID0gX19yYXdfcmVhZGwocmVnX2Jhc2UgKyBDT01DRVJUT19TUElfU1IpOworCisgICAgICAgIGlmIChzciAmIChSRkYgfCBEQ09MKSkgeworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNyICYgUkZORSkgeworICAgICAgICAgICAgZHIgPSBfX3Jhd19yZWFkdyhyZWdfYmFzZSArIENPTUNFUlRPX1NQSV9EUik7CisgICAgICAgICAgICBpZiAocmxlbl9ub3cgPCAqcmxlbikgeworICAgICAgICAgICAgICAgICpyYnVmID0gKHU4KSAobGUxNl90b19jcHUoZHIpICYgMHhmZik7CisgICAgICAgICAgICAgICAgcmJ1ZisrOworICAgICAgICAgICAgICAgIHJsZW5fbm93Kys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK291dDoKKyAgICAqcmxlbiA9IHJsZW5fbm93OworICAgICp3bGVuID0gd2xlbl9ub3c7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKgorICogICogZG9fd3JpdGVfb25seV90cmFuc2ZlcjggLQorICogICAqCisgKiAgICAqCisgKiAgICAgKi8KK3N0YXRpYyBpbnQgZG9fd3JpdGVfb25seV90cmFuc2Zlcjgodm9pZCBfX2lvbWVtICpyZWdfYmFzZSwgdTggKmJ1ZiwgdW5zaWduZWQgaW50ICpsZW4pCit7CisgICAgdW5zaWduZWQgaW50IGxlbl9ub3c7CisgICAgaW50IHJjID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdG1wID0gKmxlbjsKKyAgICB1MzIgZHIgPSAodTMyKXJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0RSOworICAgIHUzMiB0eGZsciA9ICh1MzIpcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfVFhGTFI7CisKKyAgICB3aGlsZSAodG1wKQorICAgIHsKKyAgICAgICAgbGVuX25vdyA9IDggLSBfX3Jhd19yZWFkbCh0eGZscik7CisgICAgICAgIGlmIChsZW5fbm93ID4gdG1wKQorICAgICAgICAgICAgbGVuX25vdyA9IHRtcDsKKworICAgICAgICB0bXAgLT0gbGVuX25vdzsKKworICAgICAgICAvKiB3YXJtLXVwCisgICAgICAgICAqIHdyaXRlCisgICAgICAgICAqIGZpZm8KKyAgICAgICAgICogdG8KKyAgICAgICAgICogYXZvaWQKKyAgICAgICAgICogdW5kZXJydW5zCisgICAgICAgICAqICovCisgICAgICAgIHdoaWxlIChsZW5fbm93LS0pCisgICAgICAgICAgICBfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYoKHUxNikgKmJ1ZisrKSwgZHIpOworICAgIH0KKworICAgICpsZW4gLT0gdG1wOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioKKyAqICAqIGRvX3dyaXRlX29ubHlfdHJhbnNmZXIgLQorICogICAqCisgKiAgICAqCisgKiAgICAgKi8KKworc3RhdGljIGludCBkb193cml0ZV9vbmx5X3RyYW5zZmVyMTYodm9pZCBfX2lvbWVtICpyZWdfYmFzZSwgdTE2ICpidWYsIHVuc2lnbmVkIGludCAqbGVuKQoreworICAgIHVuc2lnbmVkIGludCBsZW5fbm93OworICAgIGludCByYyA9IDA7CisgICAgdW5zaWduZWQgaW50IHRtcCA9ICpsZW47CisgICAgdTMyIGRyID0gKHUzMilyZWdfYmFzZSArIENPTUNFUlRPX1NQSV9EUjsKKyAgICB1MzIgdHhmbHIgPSAodTMyKXJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX1RYRkxSOworCisgICAgd2hpbGUgKHRtcCkKKyAgICB7CisgICAgICAgIGxlbl9ub3cgPSA4IC0gX19yYXdfcmVhZGwodHhmbHIpOworICAgICAgICBpZiAobGVuX25vdyA+IHRtcCkKKyAgICAgICAgICAgIGxlbl9ub3cgPSB0bXA7CisKKyAgICAgICAgdG1wIC09IGxlbl9ub3c7CisKKyAgICAgICAgLyogd2FybS11cAorICAgICAgICAgKiB3cml0ZQorICAgICAgICAgKiBmaWZvCisgICAgICAgICAqIHRvCisgICAgICAgICAqIGF2b2lkCisgICAgICAgICAqIHVuZGVycnVucworICAgICAgICAgKiAqLworICAgICAgICB3aGlsZSAobGVuX25vdy0tKQorICAgICAgICAgICAgX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KCpidWYrKyksIGRyKTsKKyAgICB9CisKKyAgICAqbGVuIC09IHRtcDsKKworICAgIHJldHVybiByYzsKK30KKworCisvKioKKyAqICAqIGRvX3JlYWRfb25seV90cmFuc2ZlciAtCisgKiAgICoKKyAqICAgICoKKyAqICAgICAqLworc3RhdGljIGludCBkb19yZWFkX29ubHlfdHJhbnNmZXI4KHZvaWQgX19pb21lbSAqcmVnX2Jhc2UsIHU4ICpidWYsIHVuc2lnbmVkIGludCAqbGVuKQoreworICAgIHVuc2lnbmVkIGludCBsZW5fbm93OworICAgIGludCByYyA9IDA7CisgICAgdW5zaWduZWQgaW50IHRtcCA9ICpsZW47CisgICAgdTMyIGRyID0gKHUzMilyZWdfYmFzZSArIENPTUNFUlRPX1NQSV9EUjsKKyAgICB1MzIgcnhmbHIgPSAodTMyKXJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX1JYRkxSOworCisgICAgLyogc3RhcnQgdGhlIHNlcmlhbCBjbG9jayAqLworICAgIF9fcmF3X3dyaXRldygwLCBkcik7CisKKyAgICB3aGlsZSAodG1wKQorICAgIHsKKyAgICAgICAgbGVuX25vdyA9IF9fcmF3X3JlYWRsKHJ4ZmxyKTsKKyAgICAgICAgaWYgKGxlbl9ub3cgPiB0bXApCisgICAgICAgICAgICBsZW5fbm93ID0gdG1wOworCisgICAgICAgIHRtcCAtPSBsZW5fbm93OworCisgICAgICAgIHdoaWxlIChsZW5fbm93LS0pIHsKKyAgICAgICAgICAgICpidWYgPSAodTgpIChsZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhkcikpICYgMHhmZik7CisgICAgICAgICAgICBidWYrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpsZW4gLT0gdG1wOworCisgICAgcmV0dXJuIHJjOworfQorCisvKioKKyAqICAqIGRvX3JlYWRfb25seV90cmFuc2ZlciAtCisgKiAgICoKKyAqICAgICoKKyAqICAgICAqLworc3RhdGljIGludCBkb19yZWFkX29ubHlfdHJhbnNmZXIxNih2b2lkIF9faW9tZW0gKnJlZ19iYXNlLCB1MTYgKmJ1ZiwgdW5zaWduZWQgaW50ICpsZW4pCit7CisgICAgdW5zaWduZWQgaW50IGxlbl9ub3c7CisgICAgaW50IHJjID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdG1wID0gKmxlbjsKKyAgICB1MzIgZHIgPSAodTMyKXJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0RSOworICAgIHUzMiByeGZsciA9ICh1MzIpcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfUlhGTFI7CisKKyAgICAvKiBzdGFydCB0aGUgc2VyaWFsIGNsb2NrICovCisgICAgX19yYXdfd3JpdGV3KDAsIGRyKTsKKworICAgIHdoaWxlICh0bXApCisgICAgeworICAgICAgICBsZW5fbm93ID0gX19yYXdfcmVhZGwocnhmbHIpOworICAgICAgICBpZiAobGVuX25vdyA+IHRtcCkKKyAgICAgICAgICAgIGxlbl9ub3cgPSB0bXA7CisKKyAgICAgICAgdG1wIC09IGxlbl9ub3c7CisKKyAgICAgICAgd2hpbGUgKGxlbl9ub3ctLSkgeworICAgICAgICAgICAgKmJ1ZiA9IGxlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KGRyKSk7CisgICAgICAgICAgICBidWYrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICpsZW4gLT0gdG1wOworCisgICAgcmV0dXJuIHJjOworfQorCisKKworaW50IGNvbWNlcnRvX3NwaV9kb190cmFuc2ZlcihzdHJ1Y3QgY29tY2VydG9fc3BpICp4c3BpLCBzdHJ1Y3Qgc3BpX2NsaWVudF9jb25mICpjY29uZiwgc3RydWN0IGNvbWNlcnRvX3RyYW5zZmVyICp0cmFuc2ZlcikKK3sKKyAgICB1MzIgY3RybHIwLCBjdHJscjEsIGJhdWRyID0gMCwgc2VyID0gMDsKKyAgICBpbnQgcmM7CisgICAgdm9pZCBfX2lvbWVtICpyZWdfYmFzZSA9IHhzcGktPnJlZ3M7CisKKyAgICBiYXVkciA9IHRyYW5zZmVyLT5iYXVkcjsKKyAgICBzZXIgPSB0cmFuc2Zlci0+c2VyOworICAgIC8qIG1ha2Ugc3VyZSBsYXN0IHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkICovCisgICAgd2hpbGUgKF9fcmF3X3JlYWRsKHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX1NSKSAmIEJVU1kpIDsKKworICAgIGN0cmxyMCA9IHRyYW5zZmVyLT5jdHJscjA7CisKKyAgICBfX3Jhd193cml0ZWwoMCwgcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfU1NJRU5SKTsKKworICAgIHN3aXRjaCAodHJhbnNmZXItPm1vZGUgJiAweDBmKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTUElfVFJBTlNGRVJfTU9ERV9XUklURV9PTkxZOgorICAgICAgICAgICAgY3RybHIwIHw9ICgweDAwMDEgPDwgOCk7CisKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbChjdHJscjAsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0NUUkxSMCk7CisgICAgICAgICAgICBfX3Jhd193cml0ZWwoYmF1ZHIsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0JBVURSKTsKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbChzZXIsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX1NFUik7CisgICAgICAgICAgICBfX3Jhd193cml0ZWwoOCwgcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfUlhGVExSKTsKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgwLCByZWdfYmFzZSArIENPTUNFUlRPX1NQSV9UWEZUTFIpOworICAgICAgICAgICAgX19yYXdfd3JpdGVsKDAsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0lNUik7CisgICAgICAgICAgICBfX3Jhd193cml0ZWwoMSwgcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfU1NJRU5SKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zZmVyLT5mcyA8PSA4KQorICAgICAgICAgICAgICAgIHJjID0geHNwaS0+ZG9fd3JpdGU4KHJlZ19iYXNlLCB0cmFuc2Zlci0+d2J1ZiwgJnRyYW5zZmVyLT53bGVuKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByYyA9IHhzcGktPmRvX3dyaXRlMTYocmVnX2Jhc2UsICh1MTYgKikgdHJhbnNmZXItPndidWYsICZ0cmFuc2Zlci0+d2xlbik7CisKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1BJX1RSQU5TRkVSX01PREVfUkVBRF9PTkxZOgorICAgICAgICAgICAgY3RybHIwIHw9ICgweDAwMDIgPDwgOCk7CisgICAgICAgICAgICBjdHJscjEgPSB0cmFuc2Zlci0+cmxlbiAtIDE7CisKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbChjdHJscjAsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0NUUkxSMCk7CisKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbChjdHJscjEsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0NUUkxSMSk7CisgICAgICAgICAgICBfX3Jhd193cml0ZWwoYmF1ZHIsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0JBVURSKTsKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbChzZXIsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX1NFUik7CisgICAgICAgICAgICBfX3Jhd193cml0ZWwoOCwgcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfUlhGVExSKTsKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgwLCByZWdfYmFzZSArIENPTUNFUlRPX1NQSV9UWEZUTFIpOworICAgICAgICAgICAgX19yYXdfd3JpdGVsKDAsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0lNUik7CisgICAgICAgICAgICBfX3Jhd193cml0ZWwoMSwgcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfU1NJRU5SKTsKKworICAgICAgICAgICAgaWYgKHRyYW5zZmVyLT5mcyA8PSA4KQorICAgICAgICAgICAgICAgIHJjID0geHNwaS0+ZG9fcmVhZDgocmVnX2Jhc2UsIHRyYW5zZmVyLT5yYnVmLCAmdHJhbnNmZXItPnJsZW4pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJjID0geHNwaS0+ZG9fcmVhZDE2KHJlZ19iYXNlLCAodTE2ICopIHRyYW5zZmVyLT5yYnVmLCAmdHJhbnNmZXItPnJsZW4pOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNQSV9UUkFOU0ZFUl9NT0RFX1dSSVRFX1JFQUQ6CisgICAgICAgICAgICBjdHJscjAgfD0gKDB4MDAwMCA8PCA4KTsKKworICAgICAgICAgICAgX19yYXdfd3JpdGVsKGN0cmxyMCwgcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfQ1RSTFIwKTsKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbChiYXVkciwgcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfQkFVRFIpOworICAgICAgICAgICAgX19yYXdfd3JpdGVsKHNlciwgcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfU0VSKTsKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbCg4LCByZWdfYmFzZSArIENPTUNFUlRPX1NQSV9SWEZUTFIpOworICAgICAgICAgICAgX19yYXdfd3JpdGVsKDAsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX1RYRlRMUik7CisgICAgICAgICAgICBfX3Jhd193cml0ZWwoMCwgcmVnX2Jhc2UgKyBDT01DRVJUT19TUElfSU1SKTsKKyAgICAgICAgICAgIF9fcmF3X3dyaXRlbCgxLCByZWdfYmFzZSArIENPTUNFUlRPX1NQSV9TU0lFTlIpOworCisgICAgICAgICAgICByYyA9IHhzcGktPmRvX3dyaXRlX3JlYWQocmVnX2Jhc2UsIHRyYW5zZmVyLT5mcywgdHJhbnNmZXItPndidWYsICZ0cmFuc2Zlci0+d2xlbiwgdHJhbnNmZXItPnJidWYsICZ0cmFuc2Zlci0+cmxlbik7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworc3RhdGljIGludCBjb21jZXJ0b19zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKyAgICBpbnQgcmMgPSAwOworCisgICAgc3BpX2RiZygmc3BpLT5kZXYsICJiaXRzIHBlciB3b3JkICV1LCBtYXggc3BlZWQgJXVIeiwgbW9kZSAlI3hcbiIsCisgICAgICAgICAgICBzcGktPmJpdHNfcGVyX3dvcmQsIHNwaS0+bWF4X3NwZWVkX2h6LCBzcGktPm1vZGUpOworCisgICAgaWYgKCFzcGktPmJpdHNfcGVyX3dvcmQpCisgICAgICAgIHNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisKKyAgICBpZiAoc3BpLT5iaXRzX3Blcl93b3JkIDwgU1BJX0ZSQU1FX1NJWkVfTUlOIHx8IHNwaS0+Yml0c19wZXJfd29yZCA+IFNQSV9GUkFNRV9TSVpFX01BWCkgeworICAgICAgICBzcGlfZXJyKCZzcGktPmRldiwgImJpdHMgcGVyIHdvcmQgKGZyYW1lIHNpemUpICV1IG91dCBvZiByYW5nZSAldS4uJXVcbiIsCisgICAgICAgICAgICAgICAgc3BpLT5tYXhfc3BlZWRfaHosIFNQSV9GUkFNRV9TSVpFX01JTiwgU1BJX0ZSQU1FX1NJWkVfTUFYKTsKKyAgICAgICAgcmMgPSAtRUlOVkFMOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoc3BpLT5tYXhfc3BlZWRfaHogPCBTUElfU1BFRURfTUlOKSB7CisgICAgICAgIHNwaV9lcnIoJnNwaS0+ZGV2LCAic3VjaCBsb3cgc3BlZWQgJXUgaXNuJ3Qgc3VwcG9ydGVkLCBtaW4gaXMgJXVcbiIsCisgICAgICAgICAgICAgICAgc3BpLT5tYXhfc3BlZWRfaHosIFNQSV9TUEVFRF9NSU4pOworICAgICAgICByYyA9IC1FSU5WQUw7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGlmIChzcGktPm1heF9zcGVlZF9oeiA+IFNQSV9TUEVFRF9NQVgpIHsKKyAgICAgICAgc3BpX3dhcm4oJnNwaS0+ZGV2LCAiZGVjcmVhc2luZyBzcGVlZCAldSB0byBtYXggc3VwcG9ydGVkICV1XG4iLAorICAgICAgICAgICAgICAgIHNwaS0+bWF4X3NwZWVkX2h6LCBTUElfU1BFRURfTUFYKTsKKyAgICAgICAgc3BpLT5tYXhfc3BlZWRfaHogPSBTUElfU1BFRURfTUFYOworICAgIH0KKworICAgIGlmIChzcGktPmNoaXBfc2VsZWN0ID4gU1BJX0NISVBfU0VMRUNUX01BWCkgeworICAgICAgICBzcGlfZXJyKCZzcGktPmRldiwgImNoaXAgc2VsZWN0ICV1IG91dCBvZiByYW5nZSAwLi4ldVxuIiwKKyAgICAgICAgICAgICAgICBzcGktPm1heF9zcGVlZF9oeiwgU1BJX0NISVBfU0VMRUNUX01BWCk7CisgICAgICAgIHJjID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSB7CisgICAgICAgIHNwaV9lcnIoJnNwaS0+ZGV2LCAiY2hpcCBzZWxlY3QgYWN0aXZlIGhpZ2ggaXNuJ3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmMgPSAtRUlOVkFMOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoc3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkgeworICAgICAgICBzcGlfZXJyKCZzcGktPmRldiwgIkxTQiBmaXJzdCBtb2RlIGlzbid0IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJjID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCitlcnI6CisgICAgcmV0dXJuIHJjOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzcGlfc2V0X2NvbnRyb2wgKHN0cnVjdCBjb21jZXJ0b19zcGkgKnhzcGksIHN0cnVjdCBzcGlfY2xpZW50X2NvbmYgKmNjb25mLCBzdHJ1Y3QgY29tY2VydG9fdHJhbnNmZXIgKmN0KQoreworICAgIHUzMiBjdHJscjA7CisgICAgc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKyAgICBzdHJ1Y3QgY29tY2VydG9fc3BpX3BsYXRmb3JtICpwZGF0YSA9IChzdHJ1Y3QgY29tY2VydG9fc3BpX3BsYXRmb3JtICopeHNwaS0+ZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKyAgICBzdHJ1Y3Qgc3BpX2NsaWVudF9jb25mICpzY2MgPSAoc3RydWN0IHNwaV9jbGllbnRfY29uZiAqKXBkYXRhLT5kZXZpY2VzLT5wbGF0Zm9ybV9kYXRhOworCisgICAgbWFzdGVyID0geHNwaS0+Yml0YmFuZy5tYXN0ZXI7CisKKyAgICBjY29uZi0+Y3NfbXNrID0gc2NjLT5jc19tc2s7CisgICAgY2NvbmYtPnNjX3BvbGFyaXR5ID0gc2NjLT5zY19wb2xhcml0eTsKKyAgICBjY29uZi0+c2NfcGhhc2UgPSBzY2MtPnNjX3BoYXNlOworICAgIGNjb25mLT5zY19yYXRlID0gc2NjLT5zY19yYXRlOworICAgIGNjb25mLT5jc19kZWxheSA9IHNjYy0+Y3NfZGVsYXk7CisKKyAgICBjdHJscjAgPSAoKGNjb25mLT5zY19wb2xhcml0eSAmIDB4MSkgPDwgNykgfCAoKGNjb25mLT5zY19waGFzZSAmIDB4MSkgPDwgNikgfCAoKChjdC0+ZnMgLSAxKSAmIDB4ZikgPDwgMCk7CisKKyAgICBjdC0+Y3RybHIwID0gY3RybHIwOworICAgIGN0LT5tb2RlID0gbWFzdGVyLT5tb2RlX2JpdHM7CisKKyAgICAvKiBGSVhNRTogdGhpcyB3aWxsIGJlIGZpeGVkIGFmdGVyIGNsb2NrIFBMTCBpbXBsZW1lbnRhdGlvbiBkb25lLiovCisgICAgY3QtPmJhdWRyID0gcGRhdGEtPmNsb2NrX3JhdGUgLyBjY29uZi0+c2NfcmF0ZTsKKyAgICBjdC0+c2VyID0gY2NvbmYtPmNzX21zayAmIHBkYXRhLT5jc19tc2s7Cit9CisKK2ludCBjb21jZXJ0b19zcGlfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZykKK3sKKyAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICAgICAqdCA9IE5VTEw7CisgICAgc3RydWN0IGNvbWNlcnRvX3RyYW5zZmVyICAgICBjdDsKKyAgICBzdHJ1Y3Qgc3BpX2NsaWVudF9jb25mIGNjb25mOworICAgIGludCByZXQgPSAwOworICAgIHN0cnVjdCBjb21jZXJ0b19zcGkgKnhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKworICAgIGN0LmZzID0gODsKKworICAgIHNwaV9zZXRfY29udHJvbCh4c3BpLCAmY2NvbmYsICZjdCk7CisKKyAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5ICh0LCAmbWVzZy0+dHJhbnNmZXJzLCB0cmFuc2Zlcl9saXN0KSB7CisgICAgICAgIGN0LndidWYgPSAodTggKil0LT50eF9idWY7CisgICAgICAgIGN0LnJidWYgPSAodTggKil0LT5yeF9idWY7CisgICAgICAgIGN0LndsZW4gPSB0LT5sZW47CisgICAgICAgIGN0LnJsZW4gPSB0LT5sZW47CisKKyAgICAgICAgcmV0ID0gY29tY2VydG9fc3BpX2RvX3RyYW5zZmVyKHhzcGksICZjY29uZiwgJmN0KTsKKworICAgICAgICBpZiAocmV0ID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb21jZXJ0b19zcGlfaHdfaW5pdChzdHJ1Y3QgY29tY2VydG9fc3BpICp4c3BpKQoreworICAgIHZvaWQgX19pb21lbSAqcmVnX2Jhc2UgPSB4c3BpLT5yZWdzOworCisgICAgLyogZW5hYmxlIFNQSSBidXMgOiBGSVhNRSAqLworICAgIC8vY29tY2VydG9fZ3Bpb19jdHJsKDB4MSA8PCA5LCAweDEgPDwgOSk7CisKKworICAgIC8qIGRpc2FibGUgU1BJIG9wZXJhdGlvbiAqLworICAgIHdyaXRlbCgwLCByZWdfYmFzZSArIENPTUNFUlRPX1NQSV9TU0lFTlIpOworCisgICAgLyogbWFzayBhbGwgU1BJIGlycSdzICovCisgICAgd3JpdGVsKDAsIHJlZ19iYXNlICsgQ09NQ0VSVE9fU1BJX0lNUik7Cit9CisKK3N0cnVjdCBzcGlfbWFzdGVyICpjb21jZXJ0b19zcGlfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwKKwl1MzIgaXJxLCBzMTYgYnVzX251bSwgaW50IG51bV9jcykKK3sKKyAgICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IGNvbWNlcnRvX3NwaSAqeHNwaTsKKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoZGV2LCBzaXplb2Yoc3RydWN0IGNvbWNlcnRvX3NwaSkpOworCWlmICghbWFzdGVyKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHRoZSBzcGktPm1vZGUgYml0cyB1bmRlcnN0b29kIGJ5IHRoaXMgZHJpdmVyOiAqLworCW1hc3Rlci0+bW9kZV9iaXRzID0gU1BJX0NQT0wgfCBTUElfQ1BIQTsKKworCXhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisgICAgLy9tZW1jcHkoJih4c3BpLT5kZXYpLCBwZGV2LCBzaXplb2Yoc3RydWN0IHBsYXRmb3JtX2RldmljZSkpOworICAgIHhzcGktPmRldiA9IHBkZXY7CisJeHNwaS0+Yml0YmFuZy5tYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChtYXN0ZXIpOworCXhzcGktPmJpdGJhbmcubWFzdGVyLT5zZXR1cCA9IGNvbWNlcnRvX3NwaV9zZXR1cDsKKwl4c3BpLT5iaXRiYW5nLm1hc3Rlci0+dHJhbnNmZXIgPSBjb21jZXJ0b19zcGlfdHJhbnNmZXI7CisJeHNwaS0+Yml0YmFuZy5tYXN0ZXItPmNsZWFudXAgPSBOVUxMOworCisJaW5pdF9jb21wbGV0aW9uKCZ4c3BpLT5kb25lKTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSwKKwkJY29tY2VydG9fU1BJX05BTUUpKQorCQlnb3RvIHB1dF9tYXN0ZXI7CisKKwl4c3BpLT5yZWdzID0gaW9yZW1hcChtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCWlmICh4c3BpLT5yZWdzID09IE5VTEwpIHsKKwkJZGV2X3dhcm4oZGV2LCAiaW9yZW1hcCBmYWlsdXJlXG4iKTsKKwkJZ290byBtYXBfZmFpbGVkOworCX0KKworCW1hc3Rlci0+YnVzX251bSA9IGJ1c19udW07CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IG51bV9jczsKKwltYXN0ZXItPmRldi5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOworCisJeHNwaS0+bWVtID0gKm1lbTsKKwl4c3BpLT5pcnEgPSBpcnE7CisKKwl4c3BpLT5kb19yZWFkOCA9IGRvX3JlYWRfb25seV90cmFuc2Zlcjg7CisJeHNwaS0+ZG9fd3JpdGU4ID0gZG9fd3JpdGVfb25seV90cmFuc2Zlcjg7CisKKwl4c3BpLT5kb19yZWFkMTYgPSBkb19yZWFkX29ubHlfdHJhbnNmZXIxNjsKKwl4c3BpLT5kb193cml0ZTE2ID0gZG9fd3JpdGVfb25seV90cmFuc2ZlcjE2OworCisgICAgeHNwaS0+ZG9fd3JpdGVfcmVhZCA9IGRvX3dyaXRlX3JlYWRfdHJhbnNmZXI7CisKKwkvKiBTUEkgY29udHJvbGxlciBpbml0aWFsaXphdGlvbnMgKi8KKwljb21jZXJ0b19zcGlfaHdfaW5pdCh4c3BpKTsKKworCS8qIFJlZ2lzdGVyIGZvciBTUEkgSW50ZXJydXB0IDogRklYTUUqLworICAgIC8qCisJcmV0ID0gcmVxdWVzdF9pcnEoeHNwaS0+aXJxLCBjb21jZXJ0b19zcGlfaXJxLCAwLCBjb21jZXJ0b19TUElfTkFNRSwgeHNwaSk7CisJaWYgKHJldCkKKwkJZ290byB1bm1hcF9pbzsKKyAgICAKKworCXJldCA9IHNwaV9iaXRiYW5nX3N0YXJ0KCZ4c3BpLT5iaXRiYW5nKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAic3BpX2JpdGJhbmdfc3RhcnQgRkFJTEVEXG4iKTsKKwkJZ290byBmcmVlX2lycTsKKwl9CisgICAgKi8KKwlkZXZfaW5mbyhkZXYsICJhdCAweCUwOGxsWCBtYXBwZWQgdG8gMHglcCwgaXJxPSVkXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKW1lbS0+c3RhcnQsIHhzcGktPnJlZ3MsIHhzcGktPmlycSk7CisJcmV0dXJuIG1hc3RlcjsKKworLyogRklYTUUgKi8KKy8vZnJlZV9pcnE6CisJLy9mcmVlX2lycSh4c3BpLT5pcnEsIHhzcGkpOworCS8vaW91bm1hcCh4c3BpLT5yZWdzKTsKK21hcF9mYWlsZWQ6CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CitwdXRfbWFzdGVyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGNvbWNlcnRvX3NwaV9pbml0KTsKKwordm9pZCBjb21jZXJ0b19zcGlfZGVpbml0KHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCit7CisJc3RydWN0IGNvbWNlcnRvX3NwaSAqeHNwaTsKKworCXhzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwkvL0ZJWE1FIHNwaV9iaXRiYW5nX3N0b3AoJnhzcGktPmJpdGJhbmcpOworCS8vZnJlZV9pcnEoeHNwaS0+aXJxLCB4c3BpKTsKKwlpb3VubWFwKHhzcGktPnJlZ3MpOworCisJcmVsZWFzZV9tZW1fcmVnaW9uKHhzcGktPm1lbS5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmeHNwaS0+bWVtKSk7CisJc3BpX21hc3Rlcl9wdXQoeHNwaS0+Yml0YmFuZy5tYXN0ZXIpOworCisgICAgIHNwaV91bnJlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworfQorRVhQT1JUX1NZTUJPTChjb21jZXJ0b19zcGlfZGVpbml0KTsKKworc3RhdGljIGludCBfX2RldmluaXQgY29tY2VydG9fc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY29tY2VydG9fc3BpX3BsYXRmb3JtICpwZGF0YTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IGlycSwgbnVtX2NzID0gMDsKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworICAgIGludCByYyA9IC1FSU5WQUw7CisgICAgaW50IGk7CisKKwlwZGF0YSA9IChzdHJ1Y3QgY29tY2VydG9fc3BpX3BsYXRmb3JtICopZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCWlmIChwZGF0YSkgeworCQludW1fY3MgPSBwZGF0YS0+bnVtX2NoaXBzZWxlY3Q7CisJfQorCisJaWYgKCFudW1fY3MpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJNaXNzaW5nIHNsYXZlIHNlbGVjdCBjb25maWd1cmF0aW9uIGRhdGFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgZGV2LT5udW1fcmVzb3VyY2VzKTsKKwlpZiAoIXIpCisJCXJldHVybiAtRU5PREVWOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShkZXYsIDApOworCWlmIChpcnEgPCAwKQorCQlyZXR1cm4gLUVOWElPOworCisJbWFzdGVyID0gY29tY2VydG9fc3BpX2luaXQoZGV2LCByLCBpcnEsIGRldi0+aWQsIG51bV9jcyk7CisKKwlpZiAoIW1hc3RlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocGRhdGEpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fZGV2aWNlczsgaSsrKQorCQkJc3BpX25ld19kZXZpY2UobWFzdGVyLCBwZGF0YS0+ZGV2aWNlcyArIGkpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgbWFzdGVyKTsKKworICAgIHJjID0gc3BpX3JlZ2lzdGVyX21hc3RlcihtYXN0ZXIpOworCisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgc3BpX2VycigmZGV2LT5kZXYsICJlcnJvciByZWdpc3RlcmluZyBTUEkgbWFzdGVyXG4iKTsKKyAgICAgICAgZ290byBlcnIxOworICAgIH0KKworCXJldHVybiAwOworCitlcnIxOgorICAgIHNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGNvbWNlcnRvX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWNvbWNlcnRvX3NwaV9kZWluaXQocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShkZXYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNvbWNlcnRvX3NwaV9kcml2ZXIgPSB7CisJLnByb2JlID0gY29tY2VydG9fc3BpX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChjb21jZXJ0b19zcGlfcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9IGNvbWNlcnRvX1NQSV9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgY29tY2VydG9fc3BpX3BsdGZtX2luaXQodm9pZCkKK3sKKyAgICBwcmludGsoS0VSTl9JTkZPICJjMmstc3BpOiAlczogbG9hZGVkIHZlcnNpb24gJXNcbiIsIF9fRlVOQ1RJT05fXywgU1BJX1ZFUlNJT04pOworCisJaWYocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjb21jZXJ0b19zcGlfZHJpdmVyKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgImMyay1zcGk6ICVzOiBlcnJvciByZWdpc3RlcmluZyBkcml2ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGdvdG8gZXJyMDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZXJyMDoKKyAgICByZXR1cm4gLTE7Cit9Cittb2R1bGVfaW5pdChjb21jZXJ0b19zcGlfcGx0Zm1faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjb21jZXJ0b19zcGlfcGx0Zm1fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjb21jZXJ0b19zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGNvbWNlcnRvX3NwaV9wbHRmbV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiU2F0ZW5kcmEgUHJhdGFwIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1pbmRzcGVlZCBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9kZXNpZ253YXJlX3NwaS5jIGIvZHJpdmVycy9zcGkvZGVzaWdud2FyZV9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTIwNDZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkvZGVzaWdud2FyZV9zcGkuYwpAQCAtMCwwICsxLDc5MyBAQAorLyoKKyAqIGRlc2lnbndhcmVfc3BpLmMKKyAqCisgKiBTeW5vcHN5cyBEZXNpZ25XYXJlIEFNQkEgU1BJIGNvbnRyb2xsZXIgZHJpdmVyIChtYXN0ZXIgbW9kZSBvbmx5KQorICoKKyAqIEF1dGhvcjogQmFydWNoIFNpYWNoLCBUayBPcGVuIFN5c3RlbXMKKyAqCWJhcnVjaC1Oc3dUdTlTMVczUDZnYlB2RWdtdzJ3QC4uLm9yZworICoKKyAqIEJhc2Ugb24gdGhlIFhpbGlueCBTUEkgY29udHJvbGxlciBkcml2ZXIgYnkgTW9udGFWaXN0YQorICoKKyAqIDIwMDItMjAwNyAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZAorICogImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICogMjAwOCwgMjAwOSAoYykgUHJvdmlnZW50IEx0ZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9kZXNpZ253YXJlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CisKKyNkZWZpbmUgREVTSUdOV0FSRV9TUElfTkFNRSAiY29tY2VydG9fc3BpIgorCisvKiBSZWdpc3RlciBkZWZpbml0aW9ucyBhcyBwZXIgIkRlc2lnbldhcmUgRFdfYXBiX3NzaSBEYXRhYm9vayIsIENhcHR1cmUgNi4gKi8KKworI2RlZmluZSBEV1NQSV9DVFJMUjAgICAgICAgIDB4MDAKKyNkZWZpbmUgRFdTUElfQ1RSTFIxICAgICAgICAweDA0CisjZGVmaW5lIERXU1BJX1NTSUVOUiAgICAgICAgMHgwOAorI2RlZmluZSBEV1NQSV9NV0NSICAgICAgICAgIDB4MEMKKyNkZWZpbmUgRFdTUElfU0VSICAgICAgICAgICAweDEwCisjZGVmaW5lIERXU1BJX0JBVURSICAgICAgICAgMHgxNAorI2RlZmluZSBEV1NQSV9UWEZUTFIgICAgICAgIDB4MTgKKyNkZWZpbmUgRFdTUElfUlhGVExSICAgICAgICAweDFDCisjZGVmaW5lIERXU1BJX1RYRkxSICAgICAgICAgMHgyMAorI2RlZmluZSBEV1NQSV9SWEZMUiAgICAgICAgIDB4MjQKKyNkZWZpbmUgRFdTUElfU1IgICAgICAgICAgICAweDI4CisjZGVmaW5lIERXU1BJX0lNUiAgICAgICAgICAgMHgyQworI2RlZmluZSBEV1NQSV9JU1IgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgRFdTUElfUklTUiAgICAgICAgICAweDM0CisjZGVmaW5lIERXU1BJX1RYT0lDUiAgICAgICAgMHgzOAorI2RlZmluZSBEV1NQSV9SWE9JQ1IgICAgICAgIDB4M0MKKyNkZWZpbmUgRFdTUElfUlhVSUNSICAgICAgICAweDQwCisjZGVmaW5lIERXU1BJX0lDUiAgICAgICAgICAgMHg0NAorI2RlZmluZSBEV1NQSV9ETUFDUiAgICAgICAgIDB4NEMKKyNkZWZpbmUgRFdTUElfRE1BVERMUiAgICAgICAweDUwCisjZGVmaW5lIERXU1BJX0RNQVJETFIgICAgICAgMHg1NAorI2RlZmluZSBEV1NQSV9JRFIgICAgICAgICAgIDB4NTgKKyNkZWZpbmUgRFdTUElfU1NJX0NPTVBfVkVSU0lPTiAweDVDCisjZGVmaW5lIERXU1BJX0RSICAgICAgICAgICAgMHg2MAorCisjZGVmaW5lIERXU1BJX0NUUkxSMF9ERlNfTUFTSwkweDAwMGYKKyNkZWZpbmUgRFdTUElfQ1RSTFIwX1NDUE9MCTB4MDA4MAorI2RlZmluZSBEV1NQSV9DVFJMUjBfU0NQSAkweDAwNDAKKyNkZWZpbmUgRFdTUElfQ1RSTFIwX1RNT0RfTUFTSwkweDAzMDAKKworI2RlZmluZSBEV1NQSV9TUl9CVVNZX01BU0sJMHgwMQorI2RlZmluZSBEV1NQSV9TUl9URk5GX01BU0sJMHgwMgorI2RlZmluZSBEV1NQSV9TUl9URkVfTUFTSwkweDA0CisjZGVmaW5lIERXU1BJX1NSX1JGTkVfTUFTSwkweDA4CisjZGVmaW5lIERXU1BJX1NSX1JGRl9NQVNLCTB4MTAKKworI2RlZmluZSBEV1NQSV9JU1JfVFhFSVNfTUFTSwkweDAxCisjZGVmaW5lIERXU1BJX0lTUl9SWEZJU19NQVNLCTB4MTAKKworI2RlZmluZSBEV1NQSV9JTVJfVFhFSU1fTUFTSwkweDAxCisjZGVmaW5lIERXU1BJX0lNUl9SWEZJTV9NQVNLCTB4MTAKKworc3RydWN0IGRlc2lnbndhcmVfc3BpIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgICB3b3JrOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHB1bXBfdHJhbnNmZXJzOworCisJc3RydWN0IG11dGV4ICAgICAgICAgbG9jazsgLyogbG9jayB0aGlzIHN0cnVjdCBleGNlcHQgZnJvbSBxdWV1ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgICAgIHF1ZXVlOyAvKiBzcGlfbWVzc2FnZSBxdWV1ZSAqLworCXNwaW5sb2NrX3QgICAgICAgICAgIHFsb2NrOyAvKiBsb2NrIHRoZSBxdWV1ZSAqLworCisJdm9pZCBfX2lvbWVtCSpyZWdzOwkvKiB2aXJ0LiBhZGRyZXNzIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGludCBzc2lfY2xrOwkvKiBjbG9jayBpbiBIeiAqLworCXVuc2lnbmVkIGludCB0eF9maWZvX2RlcHRoOyAvKiBieXRlcyBpbiBUWCBGSUZPICovCisJdW5zaWduZWQgaW50IHJ4X2ZpZm9fZGVwdGg7IC8qIGJ5dGVzIGluIFJYIEZJRk8gKi8KKworCXUzMgkJaXJxOworCisJdTggYml0c19wZXJfd29yZDsJLyogY3VycmVudCBkYXRhIGZyYW1lIHNpemUgKi8KKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0eF90OyAvKiBjdXJyZW50IHR4IHRyYW5zZmVyICovCisJc3RydWN0IHNwaV90cmFuc2ZlciAqcnhfdDsgLyogY3VycmVudCByeCB0cmFuc2ZlciAqLworCWNvbnN0IHU4ICp0eF9wdHI7ICAgICAgIC8qIGN1cnJlbnQgdHggYnVmZmVyICovCisJdTggKnJ4X3B0cjsgICAgICAgICAgICAgLyogY3VycmVudCByeCBidWZmZXIgKi8KKwlpbnQgcmVtYWluaW5nX3R4X2J5dGVzOwkvKiBieXRlcyBsZWZ0IHRvIHR4IGluIHRoZSBjdXJyZW50IHRyYW5zZmVyICovCisJaW50IHJlbWFpbmluZ19yeF9ieXRlczsJLyogYnl0ZXMgbGVmdCB0byByeCBpbiB0aGUgY3VycmVudCB0cmFuc2ZlciAqLworCWludCBzdGF0dXM7ICAgICAgICAgICAgIC8qIHN0YXR1cyBvZiB0aGUgY3VycmVudCBzcGlfdHJhbnNmZXIgKi8KKworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7IC8qIHNpZ25hbCB0aGUgZW5kIG9mIHR4IGZvciBjdXJyZW50IHNlcXVlbmNlICovCisKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOyAvKiBjdXJyZW50IHNwaSBzbGF2ZSBkZXZpY2UgKi8KKwlzdHJ1Y3QgY2xrCSpjbGtfc3BpOworCXN0cnVjdCBsaXN0X2hlYWQgKnRyYW5zZmVyc19saXN0OyAvKiBoZWFkIG9mIHRoZSBjdXJyZW50IHNlcXVlbmNlICovCisJdW5zaWduZWQgaW50IHR4X2NvdW50LCByeF9jb3VudDsgLyogYnl0ZXMgaW4gdGhlIGN1cnJlbnQgc2VxdWVuY2UgKi8KK307CisKK3N0YXRpYyB2b2lkIGR3c3BpX2luaXRfaHcoc3RydWN0IGRlc2lnbndhcmVfc3BpICpkd3NwaSkKK3sKKwl1MTYgY3RybHIwOworCisJLyogRGlzYWJsZSB0aGUgU1BJIG1hc3RlciAqLworCXdyaXRlbCgwLCBkd3NwaS0+cmVncyArIERXU1BJX1NTSUVOUik7CisJLyogRGlzYWJsZSBhbGwgdGhlIGludGVycnVwdHMganVzdCBpbiBjYXNlICovCisJd3JpdGVsKDAsIGR3c3BpLT5yZWdzICsgRFdTUElfSU1SKTsKKwkvKiBTZXQgVFggZW1wdHkgSVJRIHRocmVzaG9sZCAqLworCXdyaXRldyhkd3NwaS0+dHhfZmlmb19kZXB0aCAvIDIsIGR3c3BpLT5yZWdzICsgRFdTUElfVFhGVExSKTsKKworICAgIC8qIFNldCB0cmFuc21pdCAmIHJlY2VpdmUgbW9kZSAqLworCWN0cmxyMCA9IHJlYWR3KGR3c3BpLT5yZWdzICsgRFdTUElfQ1RSTFIwKTsKKyAgICBjdHJscjAgJj0gfkRXU1BJX0NUUkxSMF9UTU9EX01BU0s7CisJd3JpdGV3KGN0cmxyMCwgZHdzcGktPnJlZ3MgKyBEV1NQSV9DVFJMUjApOworfQorCitzdGF0aWMgdm9pZCBkd3NwaV9iYXVkY2ZnKHN0cnVjdCBkZXNpZ253YXJlX3NwaSAqZHdzcGksIHUzMiBzcGVlZF9oeikKK3sKKwl1MTYgZGl2ID0gKHNwZWVkX2h6KSA/IGR3c3BpLT5zc2lfY2xrL3NwZWVkX2h6IDogMHhmZmZmOworCisJd3JpdGV3KGRpdiwgZHdzcGktPnJlZ3MgKyBEV1NQSV9CQVVEUik7Cit9CisKK3N0YXRpYyB2b2lkIGR3c3BpX2VuYWJsZShzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKmR3c3BpLCBpbnQgb24pCit7CisJd3JpdGVsKG9uID8gMSA6IDAsIGR3c3BpLT5yZWdzICsgRFdTUElfU1NJRU5SKTsKK30KKworc3RhdGljIHZvaWQgZGVzaWdud2FyZV9zcGlfY2hpcHNlbGVjdChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBpbnQgb24pCit7CisJc3RydWN0IGRlc2lnbndhcmVfc3BpICpkd3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworI2lmIDAKKwlsb25nIGdwaW8gPSAobG9uZykgc3BpLT5jb250cm9sbGVyX2RhdGE7CisJdW5zaWduZWQgYWN0aXZlID0gc3BpLT5tb2RlICYgU1BJX0NTX0hJR0g7CisjZW5kaWYKKwkvKgorCSAqIE5vdGUsIHRoZSBTUEkgY29udHJvbGxlciBtdXN0IGhhdmUgYmVlbiBlbmFibGVkIGF0IHRoaXMgcG9pbnQsIGkuZS4KKwkgKiBTU0lFTlIgPT0gMQorCSAqLworCisJaWYgKG9uKSB7CisJI2lmIDAKKworCQkvKiBUdXJuIHRoZSBhY3R1YWwgY2hpcCBzZWxlY3Qgb24gZm9yIEdQSU8gY2hpcCBzZWxlY3RzICovCisJCWlmIChncGlvID49IDApCisJCQlncGlvX3NldF92YWx1ZShncGlvLCBhY3RpdmUpOworCSNlbmRpZgorCQkvKiBBY3RpdmF0ZSBzbGF2ZSBvbiB0aGUgU1BJIGNvbnRyb2xsZXIgKi8KKwkJd3JpdGVsKDEgPDwgc3BpLT5jaGlwX3NlbGVjdCwgZHdzcGktPnJlZ3MgKyBEV1NQSV9TRVIpOworCX0gZWxzZSB7CisJCS8qIERlc2VsZWN0IHRoZSBzbGF2ZSBvbiB0aGUgU1BJIGJ1cyAqLworCQl3cml0ZWwoMCwgZHdzcGktPnJlZ3MgKyBEV1NQSV9TRVIpOworCSNpZiAwCisJCWlmIChncGlvID49IDApCisJCQlncGlvX3NldF92YWx1ZShncGlvLCAhYWN0aXZlKTsKKwkjZW5kaWYKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGVzaWdud2FyZV9zcGlfc2V0dXBfdHJhbnNmZXIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJc3RydWN0IHNwaV90cmFuc2ZlciAqdCkKK3sKKwl1OCBiaXRzX3Blcl93b3JkOworCXUzMiBoejsKKwlzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKmR3c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisJdTE2IGN0cmxyMCA9IHJlYWR3KGR3c3BpLT5yZWdzICsgRFdTUElfQ1RSTFIwKTsKKworCWJpdHNfcGVyX3dvcmQgPSAodCkgPyAodC0+Yml0c19wZXJfd29yZCA/IHQtPmJpdHNfcGVyX3dvcmQgOiBzcGktPmJpdHNfcGVyX3dvcmQpIDogc3BpLT5iaXRzX3Blcl93b3JkOworCWh6ID0gKHQpID8gKHQtPnNwZWVkX2h6ID8gdC0+c3BlZWRfaHogOiBzcGktPm1heF9zcGVlZF9oeikgOiBzcGktPm1heF9zcGVlZF9oejsKKworCWlmIChiaXRzX3Blcl93b3JkIDwgNCB8fCBiaXRzX3Blcl93b3JkID4gMTYpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICIlcywgdW5zdXBwb3J0ZWQgYml0c19wZXJfd29yZD0lZFxuIiwKKwkJCV9fZnVuY19fLCBiaXRzX3Blcl93b3JkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJY3RybHIwICY9IH5EV1NQSV9DVFJMUjBfREZTX01BU0s7CisJCWN0cmxyMCB8PSBiaXRzX3Blcl93b3JkIC0gMTsKKworCQlkd3NwaS0+Yml0c19wZXJfd29yZCA9IGJpdHNfcGVyX3dvcmQ7CisJfQorCisJLyogU2V0IHRoZSBTUEkgY2xvY2sgcGhhc2UgYW5kIHBvbGFyaXR5ICovCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUEhBKQorCQljdHJscjAgfD0gRFdTUElfQ1RSTFIwX1NDUEg7CisJZWxzZQorCQljdHJscjAgJj0gfkRXU1BJX0NUUkxSMF9TQ1BIOworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJY3RybHIwIHw9IERXU1BJX0NUUkxSMF9TQ1BPTDsKKwllbHNlCisJCWN0cmxyMCAmPSB+RFdTUElfQ1RSTFIwX1NDUE9MOworCisJd3JpdGV3KGN0cmxyMCwgZHdzcGktPnJlZ3MgKyBEV1NQSV9DVFJMUjApOworCisJLyogc2V0IHNwZWVkICovCisJZHdzcGlfYmF1ZGNmZyhkd3NwaSwgaHopOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHRoZSBzcGktPm1vZGUgYml0cyBjdXJyZW50bHkgdW5kZXJzdG9vZCBieSB0aGlzIGRyaXZlcjogKi8KKyNkZWZpbmUgTU9ERUJJVFMgKFNQSV9DUE9MIHwgU1BJX0NQSEEpCisKK3N0YXRpYyBpbnQgZGVzaWdud2FyZV9zcGlfc2V0dXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKmR3c3BpOworCWludCByZXR2YWw7CisKKwlkd3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOworCisJaWYgKCFzcGktPmJpdHNfcGVyX3dvcmQpCisJCXNwaS0+Yml0c19wZXJfd29yZCA9IDg7CisKKwlpZiAoc3BpLT5tb2RlICYgfk1PREVCSVRTKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiJXMsIFNQIHVuc3VwcG9ydGVkIG1vZGUgYml0cyAleFxuIiwKKwkJCV9fZnVuY19fLCBzcGktPm1vZGUgJiB+TU9ERUJJVFMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3BpLT5jaGlwX3NlbGVjdCA+IHNwaS0+bWFzdGVyLT5udW1fY2hpcHNlbGVjdCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCQkic2V0dXA6IGludmFsaWQgY2hpcHNlbGVjdCAldSAoJXUgZGVmaW5lZClcbiIsCisJCQkJc3BpLT5jaGlwX3NlbGVjdCwgc3BpLT5tYXN0ZXItPm51bV9jaGlwc2VsZWN0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dmFsID0gZGVzaWdud2FyZV9zcGlfc2V0dXBfdHJhbnNmZXIoc3BpLCBOVUxMKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWRldl9kYmcoJnNwaS0+ZGV2LCAiJXMsIG1vZGUgJWQsICV1IGJpdHMvdywgJXUgbnNlYy9iaXRcbiIsCisJCV9fZnVuY19fLCBzcGktPm1vZGUgJiBNT0RFQklUUywgc3BpLT5iaXRzX3Blcl93b3JkLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXNpZ253YXJlX3NwaV9kb190eChzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKmR3c3BpKQoreworCXU4IHNyOworCWludCBieXRlc190b190eCA9IGR3c3BpLT5yZW1haW5pbmdfdHhfYnl0ZXM7CisJdTggdmFsaWRfdHhfZmlmb19ieXRlcyA9IHJlYWRiKGR3c3BpLT5yZWdzICsgRFdTUElfVFhGTFIpOworCXU4IHZhbGlkX3J4X2ZpZm9fYnl0ZXMgPSByZWFkYihkd3NwaS0+cmVncyArIERXU1BJX1JYRkxSKTsKKwlpbnQgdHhfbGltaXQgPSBtaW4oZHdzcGktPnR4X2ZpZm9fZGVwdGggLSB2YWxpZF90eF9maWZvX2J5dGVzLFwKKwkJCWR3c3BpLT5yeF9maWZvX2RlcHRoIC0gdmFsaWRfcnhfZmlmb19ieXRlcyk7CisKKwkvKiBGaWxsIHRoZSBUeCBGSUZPIHdpdGggYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZSAqLworCXNyID0gcmVhZGIoZHdzcGktPnJlZ3MgKyBEV1NQSV9TUik7CisJd2hpbGUgKChzciAmIERXU1BJX1NSX1RGTkZfTUFTSykgJiYgZHdzcGktPnJlbWFpbmluZ190eF9ieXRlcyA+IDApIHsKKwkJaWYgKGR3c3BpLT5iaXRzX3Blcl93b3JkIDw9IDgpIHsKKwkJCXU4IGRyID0gKGR3c3BpLT50eF9wdHIpID8gKmR3c3BpLT50eF9wdHIrKyA6IDA7CisKKwkJCXdyaXRlYihkciwgZHdzcGktPnJlZ3MgKyBEV1NQSV9EUik7CisJCQlkd3NwaS0+cmVtYWluaW5nX3R4X2J5dGVzLS07CisJCX0gZWxzZSB7CisJCQl1MTYgZHIgPSAoZHdzcGktPnR4X3B0cikgPyAqKHUxNiAqKSBkd3NwaS0+dHhfcHRyIDogMDsKKworCQkJZHdzcGktPnR4X3B0ciArPSAyOworCQkJd3JpdGV3KGRyLCBkd3NwaS0+cmVncyArIERXU1BJX0RSKTsKKwkJCWR3c3BpLT5yZW1haW5pbmdfdHhfYnl0ZXMgLT0gMjsKKwkJfQorCisJCWlmKGR3c3BpLT5iaXRzX3Blcl93b3JkIDw9IDgpeworCQkJLS10eF9saW1pdDsKKwkJfWVsc2V7CisJCQl0eF9saW1pdCAtPSAyOworCQl9CisKKwkJaWYgKHR4X2xpbWl0IDw9IDApCisJCQlicmVhazsKKworCQlzciA9IHJlYWRiKGR3c3BpLT5yZWdzICsgRFdTUElfU1IpOworCX0KKworCWR3c3BpLT50eF9jb3VudCArPSBieXRlc190b190eCAtIGR3c3BpLT5yZW1haW5pbmdfdHhfYnl0ZXM7Cit9CisKKy8qIFJldHVybiAxIHdoZW4gZG9uZSwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgZGVzaWdud2FyZV9zcGlfZmlsbF90eF9maWZvKHN0cnVjdCBkZXNpZ253YXJlX3NwaSAqZHdzcGkpCit7CisJdW5zaWduZWQgY3NfY2hhbmdlID0gMDsKKwl1bnNpZ25lZCBpbnQgc2VyOworCisJc2VyID0gcmVhZHcoZHdzcGktPnJlZ3MgKyBEV1NQSV9TRVIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKGR3c3BpLT50eF90LCBkd3NwaS0+dHJhbnNmZXJzX2xpc3QsCisJCXRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKGR3c3BpLT5yZW1haW5pbmdfdHhfYnl0ZXMgPT0gMCkgeworCQkJLyogSW5pdGlhbGl6ZSBuZXcgc3BpX3RyYW5zZmVyICovCisJCQlkd3NwaS0+dHhfcHRyID0gZHdzcGktPnR4X3QtPnR4X2J1ZjsKKwkJCWR3c3BpLT5yZW1haW5pbmdfdHhfYnl0ZXMgPSBkd3NwaS0+dHhfdC0+bGVuOworCQkJZHdzcGktPnN0YXR1cyA9IDA7CisKKwkJCWlmICghZHdzcGktPnR4X3QtPnR4X2J1ZiAmJiAhZHdzcGktPnR4X3QtPnJ4X2J1ZgorCQkJCQkmJiBkd3NwaS0+dHhfdC0+bGVuKSB7CisJCQkJZHdzcGktPnN0YXR1cyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChjc19jaGFuZ2UpCisJCQkJYnJlYWs7CisJCX0KKworCQlkZXNpZ253YXJlX3NwaV9kb190eChkd3NwaSk7CisKKwkJLyogRG9uJ3QgYWR2YW5jZSBkd3NwaS0+dHhfdCwgd2UnbGwgZ2V0IGJhY2sgdG8gdGhpcworCQkgKiBzcGlfdHJhbnNmZXIgbGF0ZXIKKwkJICovCisJCWlmIChkd3NwaS0+cmVtYWluaW5nX3R4X2J5dGVzID4gMCkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKworCQljc19jaGFuZ2UgPSBkd3NwaS0+dHhfdC0+Y3NfY2hhbmdlOworCX0KKworCWNvbXBsZXRlKCZkd3NwaS0+ZG9uZSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZGVzaWdud2FyZV9zcGlfZG9fcngoc3RydWN0IGRlc2lnbndhcmVfc3BpICpkd3NwaSkKK3sKKwl1OCBzcjsKKwlpbnQgYnl0ZXNfdG9fcnggPSBkd3NwaS0+cmVtYWluaW5nX3J4X2J5dGVzOworCisJc3IgPSByZWFkYihkd3NwaS0+cmVncyArIERXU1BJX1NSKTsKKworCWlmIChzciAmIERXU1BJX1NSX1JGRl9NQVNLKSB7CisJI2lmIDAKKwkJZGV2X2Vycihkd3NwaS0+ZGV2LCAiJXM6IFJYIEZJRk8gb3ZlcmZsb3dcbiIsIF9fZnVuY19fKTsKKwkJZHdzcGktPnN0YXR1cyA9IC1FSU87CisJI2VuZGlmCisJfQorCisJLyogUmVhZCBhcyBsb25nIGFzIFJYIEZJRk8gaXMgbm90IGVtcHR5ICovCisJd2hpbGUgKChzciAmIERXU1BJX1NSX1JGTkVfTUFTSykgIT0gMAorCQkJJiYgZHdzcGktPnJlbWFpbmluZ19yeF9ieXRlcyA+IDApIHsKKwkJaW50IHJ4X2xldmVsID0gcmVhZGwoZHdzcGktPnJlZ3MgKyBEV1NQSV9SWEZMUik7CisKKwkJd2hpbGUgKHJ4X2xldmVsLS0gJiYgZHdzcGktPnJlbWFpbmluZ19yeF9ieXRlcyA+IDApIHsKKwkJCWlmIChkd3NwaS0+Yml0c19wZXJfd29yZCA8PSA4KSB7CisJCQkJdTggZGF0YTsKKworCQkJCWRhdGEgPSByZWFkYihkd3NwaS0+cmVncyArIERXU1BJX0RSKTsKKwkJCQlkd3NwaS0+cmVtYWluaW5nX3J4X2J5dGVzLS07CisJCQkJaWYgKGR3c3BpLT5yeF9wdHIpCisJCQkJCSpkd3NwaS0+cnhfcHRyKysgPSBkYXRhOworCQkJfSBlbHNlIHsKKwkJCQl1MTYgZGF0YTsKKworCQkJCWRhdGEgPSByZWFkdyhkd3NwaS0+cmVncyArIERXU1BJX0RSKTsKKwkJCQlkd3NwaS0+cmVtYWluaW5nX3J4X2J5dGVzIC09IDI7CisJCQkJaWYgKGR3c3BpLT5yeF9wdHIpIHsKKwkJCQkJKih1MTYgKikgZHdzcGktPnJ4X3B0ciA9IGRhdGE7CisJCQkJCWR3c3BpLT5yeF9wdHIgKz0gMjsKKwkJCQl9CisJCQl9CisJCX0KKwkJc3IgPSByZWFkYihkd3NwaS0+cmVncyArIERXU1BJX1NSKTsKKwl9CisKKwlkd3NwaS0+cnhfY291bnQgKz0gKGJ5dGVzX3RvX3J4IC0gZHdzcGktPnJlbWFpbmluZ19yeF9ieXRlcyk7Cit9CisKKy8qIHJldHVybiAxIGlmIGNzX2NoYW5nZSBpcyB0cnVlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGludCBkZXNpZ253YXJlX3NwaV9yZWFkX3J4X2ZpZm8oc3RydWN0IGRlc2lnbndhcmVfc3BpICpkd3NwaSkKK3sKKwl1bnNpZ25lZCBjc19jaGFuZ2UgPSAwOworCXVuc2lnbmVkIGludCBzZXI7CisKKwlzZXIgPSByZWFkdyhkd3NwaS0+cmVncyArIERXU1BJX1NFUik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20oZHdzcGktPnJ4X3QsIGR3c3BpLT50cmFuc2ZlcnNfbGlzdCwKKwkJCXRyYW5zZmVyX2xpc3QpIHsKKwkJaWYgKGR3c3BpLT5yZW1haW5pbmdfcnhfYnl0ZXMgPT0gMCkgeworCQkJZHdzcGktPnJ4X3B0ciA9IGR3c3BpLT5yeF90LT5yeF9idWY7CisJCQlkd3NwaS0+cmVtYWluaW5nX3J4X2J5dGVzID0gZHdzcGktPnJ4X3QtPmxlbjsKKworCQkJaWYgKGNzX2NoYW5nZSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCisJCWRlc2lnbndhcmVfc3BpX2RvX3J4KGR3c3BpKTsKKworCQkvKiBUaGUgcnggYnVmZmVyIGlzIGZpbGxpbmcgdXAgd2l0aCBtb3JlIGJ5dGVzLiBEb24ndCBhZHZhbmNlCisJCSAqIGR3c3BpLT5yeF90LCBhcyB3ZSBoYXZlIG1vcmUgYnl0ZXMgdG8gcmVhZCBpbiB0aGlzCisJCSAqIHNwaV90cmFuc2Zlci4KKwkJICovCisJCWlmIChkd3NwaS0+cmVtYWluaW5nX3J4X2J5dGVzID4gMCkKKwkJCXJldHVybiAwOworCisJCWNzX2NoYW5nZSA9IGR3c3BpLT5yeF90LT5jc19jaGFuZ2U7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGludGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2Ygc3BpX3RyYW5zZmVyIGVsZW1lbnRzLgorICogc3RvcCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IG9yIHdoZW4gdC0+Y3NfY2hhbmdlIGlzIHRydWUuCisgKi8KK3N0YXRpYyB2b2lkIGRlc2lnbndhcmVfc3BpX2RvX3RyYW5zZmVycyhzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKmR3c3BpKQoreworCWludCB0eF9kb25lLCBjc19jaGFuZ2U7CisKKwlpbml0X2NvbXBsZXRpb24oJmR3c3BpLT5kb25lKTsKKworCS8qIHRyYW5zZmVyIGtpY2tvZmYgKi8KKwl0eF9kb25lID0gZGVzaWdud2FyZV9zcGlfZmlsbF90eF9maWZvKGR3c3BpKTsKKwlkZXNpZ253YXJlX3NwaV9jaGlwc2VsZWN0KGR3c3BpLT5zcGksIDEpOworCisJaWYgKCF0eF9kb25lKSB7CisJCS8qIEVuYWJsZSB0aGUgdHJhbnNtaXQgZW1wdHkgaW50ZXJydXB0LCB3aGljaCB3ZSB1c2UgdG8KKwkJICogZGV0ZXJtaW5lIHByb2dyZXNzIG9uIHRoZSB0cmFuc21pc3Npb24gaW4gY2FzZSB3ZSdyZQorCQkgKiBub3QgZG9uZSB5ZXQuCisJCSAqLworCQl3cml0ZWIoRFdTUElfSU1SX1RYRUlNX01BU0ssIGR3c3BpLT5yZWdzICsgRFdTUElfSU1SKTsKKworCQkvKiB3YWl0IGZvciB0eCBjb21wbGV0aW9uICovCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmR3c3BpLT5kb25lKTsKKwl9CisKKwkvKiBUaGlzIGRlbGF5IHNob3VsZCBiZSBnb29kIGVub3VnaCBmb3IgMTAwS0h6IHNwaSB0cmFuc2ZlcnMuIFNsb3dlcgorCSAqIHRyYW5zZmVycyBtYXkgbmVlZCBhIGxvbmdlciBkZWxheS4KKwkgKi8KKwl1ZGVsYXkoMTApOworCisJLyogZ2V0IHJlbWFpbmluZyByeCBieXRlcyAqLworICAgIGRvIHsKKwkJY3NfY2hhbmdlID0gZGVzaWdud2FyZV9zcGlfcmVhZF9yeF9maWZvKGR3c3BpKTsKKwl9IHdoaWxlIChyZWFkYihkd3NwaS0+cmVncyArIERXU1BJX1NSKSAmCisJCQkoRFdTUElfU1JfQlVTWV9NQVNLIHwgRFdTUElfU1JfUkZORV9NQVNLKSk7CisKKwkvKiB0cmFuc2FjdGlvbiBpcyBkb25lICovCisJZGVzaWdud2FyZV9zcGlfY2hpcHNlbGVjdChkd3NwaS0+c3BpLCAwKTsKKworCWlmIChkd3NwaS0+c3RhdHVzIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKCFjc19jaGFuZ2UgJiYgKGR3c3BpLT5yZW1haW5pbmdfcnhfYnl0ZXMgPiAwIHx8CisJCQlkd3NwaS0+cmVtYWluaW5nX3R4X2J5dGVzID4gMCkpIHsKKwkjaWYgMAorCQlkZXZfZXJyKGR3c3BpLT5kZXYsICIlczogcmVtYWluaW5nX3J4X2J5dGVzID0gJWQsICIKKwkJCQkicmVtYWluaW5nX3R4X2J5dGVzID0gJWRcbiIsCisJCQkJX19mdW5jX18sICBkd3NwaS0+cmVtYWluaW5nX3J4X2J5dGVzLAorCQkJCWR3c3BpLT5yZW1haW5pbmdfdHhfYnl0ZXMpOworCSNlbmRpZgorCQlkd3NwaS0+c3RhdHVzID0gLUVJTzsKKyAgICB9CisKKwlpZiAoZHdzcGktPnJ4X2NvdW50ICE9IGR3c3BpLT50eF9jb3VudCkgeworCSNpZiAwCisJCWRldl9lcnIoZHdzcGktPmRldiwgIiVzOiByeF9jb3VudCA9PSAlZCwgdHhfY291bnQgPT0gJWRcbiIsCisJCQkJX19mdW5jX18sIGR3c3BpLT5yeF9jb3VudCwgZHdzcGktPnR4X2NvdW50KTsKKwkjZW5kaWYKKwkJZHdzcGktPnN0YXR1cyA9IC1FSU87CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlc2lnbndhcmVfc3BpX3RyYW5zZmVyKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzZykKK3sKKwlzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKmR3c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7CisKKwltZXNnLT5hY3R1YWxfbGVuZ3RoID0gMDsKKwltZXNnLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisKKwkvKiB3ZSBjYW4ndCBibG9jayBoZXJlLCBzbyB3ZSB1c2UgYSBzcGlubG9jaworCSAqIGhlcmUgaW5zdGVhZCBvZiB0aGUgZ2xvYmFsIG11dGV4CisJICovCisJc3Bpbl9sb2NrKCZkd3NwaS0+cWxvY2spOworCWxpc3RfYWRkX3RhaWwoJm1lc2ctPnF1ZXVlLCAmZHdzcGktPnF1ZXVlKTsKKwlxdWV1ZV93b3JrKGR3c3BpLT53b3JrcXVldWUsICZkd3NwaS0+d29yayk7CisJc3Bpbl91bmxvY2soJmR3c3BpLT5xbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzaWdud2FyZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKmR3c3BpID0gY29udGFpbmVyX29mKHdvcmssCisJCQlzdHJ1Y3QgZGVzaWdud2FyZV9zcGksIHdvcmspOworCisJbXV0ZXhfbG9jaygmZHdzcGktPmxvY2spOworCXNwaW5fbG9jaygmZHdzcGktPnFsb2NrKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmZHdzcGktPnF1ZXVlKSkgeworCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm07CisKKwkJbSA9IGNvbnRhaW5lcl9vZihkd3NwaS0+cXVldWUubmV4dCwgc3RydWN0IHNwaV9tZXNzYWdlLCBxdWV1ZSk7CisJCWxpc3RfZGVsX2luaXQoJm0tPnF1ZXVlKTsKKwkJc3Bpbl91bmxvY2soJmR3c3BpLT5xbG9jayk7CisKKwkJZHdzcGktPnNwaSA9IG0tPnNwaTsKKwkJZHdzcGktPnR4X3QgPSBkd3NwaS0+cnhfdCA9CisJCQlsaXN0X2ZpcnN0X2VudHJ5KCZtLT50cmFuc2ZlcnMsIHN0cnVjdCBzcGlfdHJhbnNmZXIsCisJCQkJCXRyYW5zZmVyX2xpc3QpOworCisJCS8qCisJCSAqIEludGVyYXRlIHRocm91Z2ggZ3JvdXBzIG9mIHNwaV90cmFuc2ZlciBzdHJ1Y3RzCisJCSAqIHRoYXQgYXJlIHNlcGFyYXRlZCBieSBjc19jaGFuZ2UgYmVpbmcgdHJ1ZQorCQkgKi8KKwkJZHdzcGktPnRyYW5zZmVyc19saXN0ID0gJm0tPnRyYW5zZmVyczsKKwkJZG8geworCQkJZHdzcGktPnJlbWFpbmluZ190eF9ieXRlcyA9CisJCQkJZHdzcGktPnJlbWFpbmluZ19yeF9ieXRlcyA9IDA7CisJCQlkd3NwaS0+dHhfY291bnQgPSBkd3NwaS0+cnhfY291bnQgPSAwOworCQkJZGVzaWdud2FyZV9zcGlfc2V0dXBfdHJhbnNmZXIobS0+c3BpLCBkd3NwaS0+dHhfdCk7CisJCQlkd3NwaV9lbmFibGUoZHdzcGksIDEpOworCQkJZGVzaWdud2FyZV9zcGlfZG9fdHJhbnNmZXJzKGR3c3BpKTsKKwkJCWR3c3BpX2VuYWJsZShkd3NwaSwgMCk7CisJCQlpZiAoZHdzcGktPnN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQltLT5hY3R1YWxfbGVuZ3RoICs9CisJCQkJZHdzcGktPnR4X2NvdW50OyAvKiBzYW1lIGFzIHJ4X2NvdW50ICovCisJCX0gd2hpbGUgKCZkd3NwaS0+dHhfdC0+dHJhbnNmZXJfbGlzdCAhPSAmbS0+dHJhbnNmZXJzKTsKKworCQltLT5zdGF0dXMgPSBkd3NwaS0+c3RhdHVzOworCQltLT5jb21wbGV0ZShtLT5jb250ZXh0KTsKKwkJc3Bpbl9sb2NrKCZkd3NwaS0+cWxvY2spOworCX0KKwlzcGluX3VubG9jaygmZHdzcGktPnFsb2NrKTsKKwltdXRleF91bmxvY2soJmR3c3BpLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZGVzaWdud2FyZV9wdW1wX3RyYW5zZmVycyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGRlc2lnbndhcmVfc3BpICpkd3NwaSA9IChzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKikgZGF0YTsKKworCWRlc2lnbndhcmVfc3BpX3JlYWRfcnhfZmlmbyhkd3NwaSk7CisJaWYgKCFkZXNpZ253YXJlX3NwaV9maWxsX3R4X2ZpZm8oZHdzcGkpKQorCQkvKiByZWVuYWJsZSB0aGUgaW50ZXJydXB0ICovCisJCXdyaXRlYihEV1NQSV9JTVJfVFhFSU1fTUFTSywgZHdzcGktPnJlZ3MgKyBEV1NQSV9JTVIpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZGVzaWdud2FyZV9zcGlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKmR3c3BpID0gZGV2X2lkOworCisJdGFza2xldF9zY2hlZHVsZSgmZHdzcGktPnB1bXBfdHJhbnNmZXJzKTsKKwkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgZm9yIG5vdyAqLworCXdyaXRlYigwLCBkd3NwaS0+cmVncyArIERXU1BJX0lNUik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGRlc2lnbndhcmVfc3BpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKK30KKworc3RhdGljIGludCBfX2luaXQgZGVzaWdud2FyZV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisJc3RydWN0IGRlc2lnbndhcmVfc3BpICpkd3NwaTsKKwkvL3N0cnVjdCBkZXNpZ253YXJlX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlICpyOworCXN0cnVjdCBjbGsgKmNsa19zcGk7CisKKwlwZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJubyBkZXZpY2UgZGF0YSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyAgICAgICAgaWYobWVtY21wKHBkYXRhLT5jbGtfbmFtZSwgIkRVUyIsIDMpKQorICAgICAgICAgICAgICAgIGMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfTEVHQUNZX1NQSSwgMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX0ZBU1RfU1BJLCAwKTsKKworCWNsa19zcGkgPSBjbGtfZ2V0KE5VTEwscGRhdGEtPmNsa19uYW1lKTsKKwlpZiAoSVNfRVJSKGNsa19zcGkpKSB7CisJCXJldCA9IFBUUl9FUlIoY2xrX3NwaSk7CisJCXByX2VycigiJXM6VW5hYmxlIHRvIG9idGFpbiBzcGkgY2xvY2s6ICVkXG4iLFwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCWNsa19lbmFibGUoY2xrX3NwaSk7CisKKwlwcmludGsgKCIlczpJbml0aWFsaXppbmcgU1BJIENvbnRyb2xsZXIgOiBVc2luZyBkbWE9JWQgQ0xLKCVzKT0lbGQgSHpcbiIsIF9fZnVuY19fLCBcCisJCQlwZGF0YS0+dXNlX2RtYSwgcGRhdGEtPmNsa19uYW1lLCBjbGtfZ2V0X3JhdGUoY2xrX3NwaSkpOworCisJLyogR2V0IHJlc291cmNlcyhtZW1vcnksIElSUSkgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgKi8KKwltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBkZXNpZ253YXJlX3NwaSkpOworCWlmIChtYXN0ZXIgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9ub21lbTsKKwl9CisKKwltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEE7CisJbWFzdGVyLT5idXNfbnVtID0gcGRhdGEtPmJ1c19udW07CisJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IHBkYXRhLT5udW1fY2hpcHNlbGVjdHM7CisJbWFzdGVyLT5zZXR1cCA9IGRlc2lnbndhcmVfc3BpX3NldHVwOworCW1hc3Rlci0+dHJhbnNmZXIgPSBkZXNpZ253YXJlX3NwaV90cmFuc2ZlcjsKKwltYXN0ZXItPmNsZWFudXAgPSBkZXNpZ253YXJlX3NwaV9jbGVhbnVwOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgbWFzdGVyKTsKKworCXIgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHIgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHB1dF9tYXN0ZXI7CisJfQorCisJZHdzcGkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJZHdzcGktPmNsa19zcGkgPSBjbGtfc3BpOworCWR3c3BpLT5zc2lfY2xrID0gY2xrX2dldF9yYXRlKGR3c3BpLT5jbGtfc3BpKTsKKwkvL2R3c3BpLT5zc2lfY2xrID0gcGRhdGEtPm1heF9mcmVxOworCWR3c3BpLT50eF9maWZvX2RlcHRoID0gVFhfRklGT19ERVBUSDsKKwlkd3NwaS0+cnhfZmlmb19kZXB0aCA9IFJYX0ZJRk9fREVQVEg7CisjaWYgMAorCWR3c3BpLT50eF9maWZvX2RlcHRoID0gcGRhdGEtPnR4X2ZpZm9fZGVwdGg7CisJZHdzcGktPnJ4X2ZpZm9fZGVwdGggPSBwZGF0YS0+cnhfZmlmb19kZXB0aDsKKyNlbmRpZgorCWR3c3BpLT5kZXYgPSAmZGV2LT5kZXY7CisJc3Bpbl9sb2NrX2luaXQoJmR3c3BpLT5xbG9jayk7CisJbXV0ZXhfaW5pdCgmZHdzcGktPmxvY2spOworCUlOSVRfTElTVF9IRUFEKCZkd3NwaS0+cXVldWUpOworCUlOSVRfV09SSygmZHdzcGktPndvcmssIGRlc2lnbndhcmVfd29yayk7CisJZHdzcGktPndvcmtxdWV1ZSA9CisJCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGRldl9uYW1lKG1hc3Rlci0+ZGV2LnBhcmVudCkpOworCQorCWlmIChkd3NwaS0+d29ya3F1ZXVlID09IE5VTEwpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIHB1dF9tYXN0ZXI7CisJfQorCXRhc2tsZXRfaW5pdCgmZHdzcGktPnB1bXBfdHJhbnNmZXJzLCBkZXNpZ253YXJlX3B1bXBfdHJhbnNmZXJzLAorCQkJKHVuc2lnbmVkIGxvbmcpIGR3c3BpKTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LAorCQkJci0+ZW5kIC0gci0+c3RhcnQgKyAxLCBERVNJR05XQVJFX1NQSV9OQU1FKSkgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZGVzdHJveV93cTsKKwl9CisKKwlkd3NwaS0+cmVncyA9IGlvcmVtYXAoci0+c3RhcnQsIHItPmVuZCAtIHItPnN0YXJ0ICsgMSk7CisJaWYgKGR3c3BpLT5yZWdzID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBkZXN0cm95X3dxOworCX0KKworCWR3c3BpLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKGRldiwgMCk7CisJaWYgKGR3c3BpLT5pcnEgPCAwKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byB1bm1hcF9pbzsKKwl9CisKKwkvKiBTUEkgY29udHJvbGxlciBpbml0aWFsaXphdGlvbnMgKi8KKwlkd3NwaV9pbml0X2h3KGR3c3BpKTsKKworCS8qIFJlZ2lzdGVyIGZvciBTUEkgSW50ZXJydXB0ICovCisJcmV0ID0gcmVxdWVzdF9pcnEoZHdzcGktPmlycSwgZGVzaWdud2FyZV9zcGlfaXJxLCAwLAorCQkJREVTSUdOV0FSRV9TUElfTkFNRSwgZHdzcGkpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byB1bm1hcF9pbzsKKworCXJldCA9IHNwaV9yZWdpc3Rlcl9tYXN0ZXIobWFzdGVyKTsKKyAgICBpZiAocmV0IDwgMCkKKwkJZ290byBmcmVlX2lycTsKKworCWRldl9pbmZvKCZkZXYtPmRldiwgImF0IDB4JTA4WCBtYXBwZWQgdG8gMHglMDhYLCBpcnE9JWRcbiIsCisJCQlyLT5zdGFydCwgKHUzMilkd3NwaS0+cmVncywgZHdzcGktPmlycSk7CisKKwlyZXR1cm4gcmV0OworCitmcmVlX2lycToKKwlmcmVlX2lycShkd3NwaS0+aXJxLCBkd3NwaSk7Cit1bm1hcF9pbzoKKwlpb3VubWFwKGR3c3BpLT5yZWdzKTsKK2Rlc3Ryb3lfd3E6CisJZGVzdHJveV93b3JrcXVldWUoZHdzcGktPndvcmtxdWV1ZSk7CitwdXRfbWFzdGVyOgorCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CitlcnJfbm9tZW06CisJY2xrX2Rpc2FibGUoY2xrX3NwaSk7CisJY2xrX3B1dChjbGtfc3BpKTsKK2Vycl9jbGs6CisgICAgICAgIGlmKG1lbWNtcChwZGF0YS0+Y2xrX25hbWUsICJEVVMiLCAzKSkKKyAgICAgICAgICAgICAgICBjMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX0xFR0FDWV9TUEksIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9GQVNUX1NQSSwgMSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkZXNpZ253YXJlX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXNpZ253YXJlX3NwaSAqZHdzcGk7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfcGRhdGEgKnBkYXRhOworCisJbWFzdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlkd3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCWZyZWVfaXJxKGR3c3BpLT5pcnEsIGR3c3BpKTsKKwlpb3VubWFwKGR3c3BpLT5yZWdzKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShkd3NwaS0+d29ya3F1ZXVlKTsKKwl0YXNrbGV0X2tpbGwoJmR3c3BpLT5wdW1wX3RyYW5zZmVycyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCAwKTsKKwlzcGlfbWFzdGVyX3B1dChtYXN0ZXIpOworCWNsa19kaXNhYmxlKGR3c3BpLT5jbGtfc3BpKTsKKwljbGtfcHV0KGR3c3BpLT5jbGtfc3BpKTsKKworICAgICAgICBwZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisgICAgICAgIGlmKCFwZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYobWVtY21wKHBkYXRhLT5jbGtfbmFtZSwgIkRVUyIsIDMpKQorICAgICAgICAgICAgICAgIGMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfTEVHQUNZX1NQSSwgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX0ZBU1RfU1BJLCAxKTsKKworCXJldHVybiAwOworfQorCisjaWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGRlc2lnbndhcmVfc3BpX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBkZXNpZ253YXJlX3NwaSAqZHdzcGk7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKworCW1hc3RlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWR3c3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisgICAgICAgIC8qIERpc2FibGUgdGhlIFNQSSBtYXN0ZXIgKi8KKyAgICAgICAgd3JpdGVsKDAsIGR3c3BpLT5yZWdzICsgRFdTUElfU1NJRU5SKTsKKworICAgICAgICBjbGtfZGlzYWJsZShkd3NwaS0+Y2xrX3NwaSk7CisKKyAgICAgICAgcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBkZXNpZ253YXJlX3NwaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGVzaWdud2FyZV9zcGkgKmR3c3BpOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CisKKwltYXN0ZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlkd3NwaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworICAgICAgICBjbGtfZW5hYmxlKGR3c3BpLT5jbGtfc3BpKTsKKwlkd3NwaV9pbml0X2h3KGR3c3BpKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiB3b3JrIHdpdGggaG90cGx1ZyBhbmQgY29sZHBsdWcgKi8KK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBERVNJR05XQVJFX1NQSV9OQU1FKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZGVzaWdud2FyZV9zcGlfZHJpdmVyID0geworCS5wcm9iZSAgPSBkZXNpZ253YXJlX3NwaV9wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AoZGVzaWdud2FyZV9zcGlfcmVtb3ZlKSwKKyNpZiBDT05GSUdfUE0KKyAgICAgICAgLnN1c3BlbmQgICAgICAgID0gZGVzaWdud2FyZV9zcGlfc3VzcGVuZCwKKyAgICAgICAgLnJlc3VtZSAgICAgICAgID0gZGVzaWdud2FyZV9zcGlfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBERVNJR05XQVJFX1NQSV9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGVzaWdud2FyZV9zcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRlc2lnbndhcmVfc3BpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChkZXNpZ253YXJlX3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGRlc2lnbndhcmVfc3BpX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZGVzaWdud2FyZV9zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGRlc2lnbndhcmVfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCYXJ1Y2ggU2lhY2ggPGJhcnVjaC1Oc3dUdTlTMVczUDZnYlB2RWdtdzJ3QC4uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3lub3BzeXMgRGVzaWduV2FyZSBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYzIwMDAtZG1hLmMgYi9kcml2ZXJzL3NwaS9zcGktYzIwMDAtZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5MjkyMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1jMjAwMC1kbWEuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgTWluZHNwZWVkIFRlY2hub2xvZ2llcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNpbmNsdWRlICJzcGktZHcuaCIKKworI2luY2x1ZGUgInNwaS1jMjAwMC1kbWEuaCIKKworc3RydWN0IHNwaV9kbWEgeworICAgICAgICBzdHJ1Y3Qgc3BpX2RtYV9zbGF2ZSAgICAgIGRtYXNfdHg7CisgICAgICAgIHN0cnVjdCBzcGlfZG1hX3NsYXZlICAgICAgZG1hc19yeDsKK307CisKKy8qIG9wdGlvbmFsICovCitzdGF0aWMgYm9vbCBzcGlfZG1hX2NoYW5fZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCit7CisgICAgICAgIHN0cnVjdCBkd19zcGkgKmR3cyA9IHBhcmFtOworCisgICAgICAgIHJldHVybiBkd3MtPm1hc3RlciAmJiAoJmR3cy0+bWFzdGVyLT5kZXYgPT0gY2hhbi0+ZGV2aWNlLT5kZXYpOworfQorCitzdGF0aWMgaW50IHNwaV9kbWFfaW5pdChzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisgICAgICAgIHN0cnVjdCBzcGlfZG1hICpkd19kbWEgPSBkd3MtPmRtYV9wcml2OworICAgICAgICBzdHJ1Y3Qgc3BpX2RtYV9zbGF2ZSAqcnhzLCAqdHhzOworICAgICAgICBkbWFfY2FwX21hc2tfdCBtYXNrOworCisgICAgICAgIGRtYV9jYXBfemVybyhtYXNrKTsKKyAgICAgICAgZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKKworICAgICAgICAvKiAxLiBJbml0IHJ4IGNoYW5uZWwgKi8KKyAgICAgICAgZHdzLT5yeGNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIHNwaV9kbWFfY2hhbl9maWx0ZXIsIGR3cyk7CisgICAgICAgIGlmICghZHdzLT5yeGNoYW4pCisgICAgICAgICAgICAgICAgZ290byBlcnJfZXhpdDsKKyAgICAgICAgcnhzID0gJmR3X2RtYS0+ZG1hc19yeDsKKyAgICAgICAgcnhzLT5oc19tb2RlID0gTE5XX0RNQV9IV19IUzsKKyAgICAgICAgcnhzLT5jZmdfbW9kZSA9IExOV19ETUFfUEVSX1RPX01FTTsKKyAgICAgICAgZHdzLT5yeGNoYW4tPnByaXZhdGUgPSByeHM7CisKKyAgICAgICAgLyogMi4gSW5pdCB0eCBjaGFubmVsICovCisgICAgICAgIGR3cy0+dHhjaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBzcGlfZG1hX2NoYW5fZmlsdGVyLCBkd3MpOworICAgICAgICBpZiAoIWR3cy0+dHhjaGFuKQorICAgICAgICAgICAgICAgIGdvdG8gZnJlZV9yeGNoYW47CisgICAgICAgIHR4cyA9ICZkd19kbWEtPmRtYXNfdHg7CisgICAgICAgIHR4cy0+aHNfbW9kZSA9IExOV19ETUFfSFdfSFM7CisgICAgICAgIHR4cy0+Y2ZnX21vZGUgPSBMTldfRE1BX01FTV9UT19QRVI7CisgICAgICAgIGR3cy0+dHhjaGFuLT5wcml2YXRlID0gdHhzOworCisgICAgICAgIGR3cy0+ZG1hX2luaXRlZCA9IDE7CisgICAgICAgIHJldHVybiAwOworCitmcmVlX3J4Y2hhbjoKKyAgICAgICAgZG1hX3JlbGVhc2VfY2hhbm5lbChkd3MtPnJ4Y2hhbik7CitlcnJfZXhpdDoKKyAgICAgICAgcmV0dXJuIC0xOworCit9CisKK3N0YXRpYyB2b2lkIHNwaV9kbWFfZXhpdChzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisgICAgICAgIGRtYV9yZWxlYXNlX2NoYW5uZWwoZHdzLT50eGNoYW4pOworICAgICAgICBkbWFfcmVsZWFzZV9jaGFubmVsKGR3cy0+cnhjaGFuKTsKK30KKworLyoKKyAqIGR3cy0+ZG1hX2NoYW5fZG9uZSBpcyBjbGVhcmVkIGJlZm9yZSB0aGUgZG1hIHRyYW5zZmVyIHN0YXJ0cywKKyAqIGNhbGxiYWNrIGZvciByeC90eCBjaGFubmVsIHdpbGwgZWFjaCBpbmNyZW1lbnQgaXQgYnkgMS4KKyAqIFJlYWNoaW5nIDIgbWVhbnMgdGhlIHdob2xlIHNwaSB0cmFuc2FjdGlvbiBpcyBkb25lLgorICovCitzdGF0aWMgdm9pZCBkd19zcGlfZG1hX2RvbmUodm9pZCAqYXJnKQoreworICAgICAgICBzdHJ1Y3QgZHdfc3BpICpkd3MgPSBhcmc7CisKKyAgICAgICAgaWYgKCsrZHdzLT5kbWFfY2hhbl9kb25lICE9IDIpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBkd19zcGlfeGZlcl9kb25lKGR3cyk7Cit9CisKK3N0YXRpYyBpbnQgc3BpX2RtYV90cmFuc2ZlcihzdHJ1Y3QgZHdfc3BpICpkd3MsIGludCBjc19jaGFuZ2UpCit7CisgICAgICAgIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkZXNjID0gTlVMTCwgKnJ4ZGVzYyA9IE5VTEw7CisgICAgICAgIHN0cnVjdCBkbWFfY2hhbiAqdHhjaGFuLCAqcnhjaGFuOworICAgICAgICBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyB0eGNvbmYsIHJ4Y29uZjsKKyAgICAgICAgdTE2IGRtYV9jdHJsID0gMDsKKworICAgICAgICAvKiAxLiBzZXR1cCBETUEgcmVsYXRlZCByZWdpc3RlcnMgKi8KKyAgICAgICAgaWYgKGNzX2NoYW5nZSkgeworICAgICAgICAgICAgICAgIHNwaV9lbmFibGVfY2hpcChkd3MsIDApOworICAgICAgICAgICAgICAgIGR3X3dyaXRldyhkd3MsIERXX1NQSV9ETUFSRExSLCAweGYpOworICAgICAgICAgICAgICAgIGR3X3dyaXRldyhkd3MsIERXX1NQSV9ETUFURExSLCAweDEwKTsKKyAgICAgICAgICAgICAgICBpZiAoZHdzLT50eF9kbWEpCisgICAgICAgICAgICAgICAgICAgICAgICBkbWFfY3RybCB8PSAweDI7CisgICAgICAgICAgICAgICAgaWYgKGR3cy0+cnhfZG1hKQorICAgICAgICAgICAgICAgICAgICAgICAgZG1hX2N0cmwgfD0gMHgxOworICAgICAgICAgICAgICAgIGR3X3dyaXRldyhkd3MsIERXX1NQSV9ETUFDUiwgZG1hX2N0cmwpOworICAgICAgICAgICAgICAgIHNwaV9lbmFibGVfY2hpcChkd3MsIDEpOworICAgICAgICB9CisKKyAgICAgICAgZHdzLT5kbWFfY2hhbl9kb25lID0gMDsKKyAgICAgICAgdHhjaGFuID0gZHdzLT50eGNoYW47CisgICAgICAgIHJ4Y2hhbiA9IGR3cy0+cnhjaGFuOworCisgICAgICAgIC8qIDIuIFByZXBhcmUgdGhlIFRYIGRtYSB0cmFuc2ZlciAqLworICAgICAgICB0eGNvbmYuZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKKyAgICAgICAgdHhjb25mLmRzdF9hZGRyID0gZHdzLT5kbWFfYWRkcjsKKyAgICAgICAgdHhjb25mLmRzdF9tYXhidXJzdCA9IExOV19ETUFfTVNJWkVfMTY7CisgICAgICAgIHR4Y29uZi5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOworICAgICAgICB0eGNvbmYuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzsKKworICAgICAgICB0eGNoYW4tPmRldmljZS0+ZGV2aWNlX2NvbnRyb2wodHhjaGFuLCBETUFfU0xBVkVfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICZ0eGNvbmYpOworCisgICAgICAgIG1lbXNldCgmZHdzLT50eF9zZ2wsIDAsIHNpemVvZihkd3MtPnR4X3NnbCkpOworICAgICAgICBkd3MtPnR4X3NnbC5kbWFfYWRkcmVzcyA9IGR3cy0+dHhfZG1hOworICAgICAgICBkd3MtPnR4X3NnbC5sZW5ndGggPSBkd3MtPmxlbjsKKworICAgICAgICB0eGRlc2MgPSB0eGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2codHhjaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHdzLT50eF9zZ2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9UT19ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DT01QTF9TS0lQX0RFU1RfVU5NQVApOworICAgICAgICB0eGRlc2MtPmNhbGxiYWNrID0gZHdfc3BpX2RtYV9kb25lOworICAgICAgICB0eGRlc2MtPmNhbGxiYWNrX3BhcmFtID0gZHdzOworCisgICAgICAgIC8qIDMuIFByZXBhcmUgdGhlIFJYIGRtYSB0cmFuc2ZlciAqLworICAgICAgICByeGNvbmYuZGlyZWN0aW9uID0gRE1BX0ZST01fREVWSUNFOworICAgICAgICByeGNvbmYuc3JjX2FkZHIgPSBkd3MtPmRtYV9hZGRyOworICAgICAgICByeGNvbmYuc3JjX21heGJ1cnN0ID0gTE5XX0RNQV9NU0laRV8xNjsKKyAgICAgICAgcnhjb25mLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7CisgICAgICAgIHJ4Y29uZi5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOworCisgICAgICAgIHJ4Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfY29udHJvbChyeGNoYW4sIERNQV9TTEFWRV9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgJnJ4Y29uZik7CisKKyAgICAgICAgbWVtc2V0KCZkd3MtPnJ4X3NnbCwgMCwgc2l6ZW9mKGR3cy0+cnhfc2dsKSk7CisgICAgICAgIGR3cy0+cnhfc2dsLmRtYV9hZGRyZXNzID0gZHdzLT5yeF9kbWE7CisgICAgICAgIGR3cy0+cnhfc2dsLmxlbmd0aCA9IGR3cy0+bGVuOworCisgICAgICAgIHJ4ZGVzYyA9IHJ4Y2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZyhyeGNoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkd3MtPnJ4X3NnbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0ZST01fREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ09NUExfU0tJUF9ERVNUX1VOTUFQKTsKKyAgICAgICAgcnhkZXNjLT5jYWxsYmFjayA9IGR3X3NwaV9kbWFfZG9uZTsKKyAgICAgICAgcnhkZXNjLT5jYWxsYmFja19wYXJhbSA9IGR3czsKKworICAgICAgICAvKiByeCBtdXN0IGJlIHN0YXJ0ZWQgYmVmb3JlIHR4IGR1ZSB0byBzcGkgaW5zdGluY3QgKi8KKyAgICAgICAgcnhkZXNjLT50eF9zdWJtaXQocnhkZXNjKTsKKyAgICAgICAgdHhkZXNjLT50eF9zdWJtaXQodHhkZXNjKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHdfc3BpX2RtYV9vcHMgc3BpX2RtYV9vcHMgPSB7CisgICAgICAgIC5kbWFfaW5pdCAgICAgICA9IHNwaV9kbWFfaW5pdCwKKyAgICAgICAgLmRtYV9leGl0ICAgICAgID0gc3BpX2RtYV9leGl0LAorICAgICAgICAuZG1hX3RyYW5zZmVyICAgPSBzcGlfZG1hX3RyYW5zZmVyLAorfTsKKworaW50IGR3X3NwaV9kbWFfaW5pdChzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisgICAgICAgIGR3cy0+ZG1hX3ByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3BpX2RtYSksIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIWR3cy0+ZG1hX3ByaXYpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisKKyAgICAgICAgZHdzLT5kbWFfb3BzID0gJnNwaV9kbWFfb3BzOworCisgICAgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWMyMDAwLWRtYS5oIGIvZHJpdmVycy9zcGkvc3BpLWMyMDAwLWRtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWRhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktYzIwMDAtZG1hLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqICBzcGktYzIwMDAtZG1hLmggCisgKgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqCisgKi8KKyNpZm5kZWYgX19TUElfQzIwMDBfRE1BX0hfXworI2RlZmluZSBfX1NQSV9DMjAwMF9ETUFfSF9fXworCisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisKKyNkZWZpbmUgRE1BX1BSRVBfQ0lSQ1VMQVJfTElTVAkJKDEgPDwgMTApCisKKy8qRE1BIG1vZGUgY29uZmlndXJhdGlvbnMqLworZW51bSBzcGlfZG1hX21vZGUgeworCUxOV19ETUFfUEVSX1RPX01FTSA9IDAsIC8qcGVyaXBocmFsIHRvIG1lbW9yeSBjb25maWd1cmF0aW9uKi8KKwlMTldfRE1BX01FTV9UT19QRVIsCS8qbWVtb3J5IHRvIHBlcmlwaHJhbCBjb25maWd1cmF0aW9uKi8KKwlMTldfRE1BX01FTV9UT19NRU0sCS8qbWVtIHRvIG1lbSBjb25mZyAodGVzdGluZyBvbmx5KSovCit9OworCisvKkRNQSBoYW5kc2hha2luZyovCitlbnVtIHNwaV9kbWFfaHNfbW9kZSB7CisJTE5XX0RNQV9IV19IUyA9IDAsCS8qSFcgSGFuZHNoYWtpbmcgb25seSovCisJTE5XX0RNQV9TV19IUyA9IDEsCS8qU1cgSGFuZHNoYWtpbmcgbm90IHJlY29tbWVuZGVkKi8KK307CisKKy8qQnVyc3Qgc2l6ZSBjb25maWd1cmF0aW9uKi8KK2VudW0gc3BpX2RtYV9tc2l6ZSB7CisJTE5XX0RNQV9NU0laRV8xID0gMHgwLAorCUxOV19ETUFfTVNJWkVfNCA9IDB4MSwKKwlMTldfRE1BX01TSVpFXzggPSAweDIsCisJTE5XX0RNQV9NU0laRV8xNiA9IDB4MywKKwlMTldfRE1BX01TSVpFXzMyID0gMHg0LAorCUxOV19ETUFfTVNJWkVfNjQgPSAweDUsCit9OworCisvKioKKyAqIHN0cnVjdCBzcGlfZG1hX3NsYXZlIC0gRE1BIHNsYXZlIHN0cnVjdHVyZQorICoKKyAqIEBkaXJuOiBETUEgdHJmIGRpcmVjdGlvbgorICogQHNyY193aWR0aDogdHggcmVnaXN0ZXIgd2lkdGgKKyAqIEBkc3Rfd2lkdGg6IHJ4IHJlZ2lzdGVyIHdpZHRoCisgKiBAaHNfbW9kZTogSFcvU1cgaGFuZHNoYWtpbmcgbW9kZQorICogQGNmZ19tb2RlOiBETUEgZGF0YSB0cmFuc2ZlciBtb2RlIChwZXItcGVyL21lbS1wZXIvbWVtLW1lbSkKKyAqIEBzcmNfbXNpemU6IFNvdXJjZSBETUEgYnVyc3Qgc2l6ZQorICogQGRzdF9tc2l6ZTogRHN0IERNQSBidXJzdCBzaXplCisgKiBAcGVyX2FkZHI6IFBlcmlwaHJhbCBhZGRyZXNzCisgKiBAZGV2aWNlX2luc3RhbmNlOiBETUEgcGVyaXBoZXJhbCBkZXZpY2UgaW5zdGFuY2UsIHdlIGNhbiBoYXZlIG11bHRpcGxlCisgKgkJcGVyaXBoZXJhbCBkZXZpY2UgY29ubmVjdGVkIHRvIHNpbmdsZSBETUFDCisgKi8KK3N0cnVjdCBzcGlfZG1hX3NsYXZlIHsKKwllbnVtIHNwaV9kbWFfaHNfbW9kZQloc19tb2RlOyAgLypoYW5kc2hha2luZyovCisJZW51bSBzcGlfZG1hX21vZGUJCWNmZ19tb2RlOyAvKm1vZGUgY29uZmlndXJhdGlvbiovCisJdW5zaWduZWQgaW50CQlkZXZpY2VfaW5zdGFuY2U7IC8qMCwgMSBmb3IgcGVyaXBocmFsIGluc3RhbmNlKi8KKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZwkJZG1hX3NsYXZlOworfTsKKworI2VuZGlmIC8qX19TUElfQzIwMDBfRE1BX0hfXyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYzIwMDAuYyBiL2RyaXZlcnMvc3BpL3NwaS1jMjAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzBhM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktYzIwMDAuYwpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIE1lbW9yeS1tYXBwZWQgaW50ZXJmYWNlIGRyaXZlciBmb3IgRFcgU1BJIENvcmUKKyAqIEF1dGhvcjogU2F0ZW5kcmEgUHJhdGFwIDxzYXRlbmRyYS5wcmF0YXBAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KKworI2luY2x1ZGUgInNwaS1kdy5oIgorCisjZGVmaW5lIERSSVZFUl9OQU1FICJjb21jZXJ0b19zcGkiCisKK2V4dGVybiBpbnQgZHdfc3BpX2RtYV9pbml0KHN0cnVjdCBkd19zcGkgKmR3cyk7CisKKyNkZWZpbmUJQ0xLX05BTUUJMTAKK3N0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSB7CisgICAgICAgIGludCB1c2VfZG1hOworICAgICAgICBpbnQgbnVtX2NoaXBzZWxlY3RzOworCWludCBidXNfbnVtOworCXUzMiBtYXhfZnJlcTsKKwljaGFyIGNsa19uYW1lW0NMS19OQU1FXTsKK307CisKK3N0cnVjdCBkd19zcGlfYzIwMDAgeworCXN0cnVjdCBkd19zcGkgIGR3czsKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGR3X3NwaV9jMjAwMF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkd19zcGlfYzIwMDAgKmR3c21taW87CisJc3RydWN0IGR3X3NwaSAqZHdzOworCXN0cnVjdCByZXNvdXJjZSAqbWVtLCAqaW9hcmVhOworCXN0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSAqcGRhdGE7CisJc3RydWN0IGNsayAqY2xrX3NwaTsKKwlpbnQgcmV0OworCisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZighcGRhdGEpCisJeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9lbmQ7CisJfQorCisJZHdzbW1pbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkd19zcGlfYzIwMDApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWR3c21taW8pIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZW5kOworCX0KKworCWR3cyA9ICZkd3NtbWlvLT5kd3M7CisKKwljbGtfc3BpID0gY2xrX2dldChOVUxMLHBkYXRhLT5jbGtfbmFtZSk7CisJaWYgKElTX0VSUihjbGtfc3BpKSkgeworCQlyZXQgPSBQVFJfRVJSKGNsa19zcGkpOworCQlwcl9lcnIoIiVzOlVuYWJsZSB0byBvYnRhaW4gc3BpIGNsb2NrOiAlZFxuIixcCisJCQlfX2Z1bmNfXywgcmV0KTsKKwkJZ290byBlcnJfa2ZyZWU7CisJfQorCWR3cy0+Y2xrX3NwaT1jbGtfc3BpOworCisJZHdzLT5tYXhfZnJlcSA9IGNsa19nZXRfcmF0ZShkd3MtPmNsa19zcGkpOworCisJcHJpbnRrICgiJXM6SW5pdGlhbGl6aW5nIFNQSSBDb250cm9sbGVyIDogdXNlX2RtYT0lZCBDTEsoJXMpPSVkIEh6XG4iLCBfX2Z1bmNfXywgXAorCQkJcGRhdGEtPnVzZV9kbWEsIHBkYXRhLT5jbGtfbmFtZSwgZHdzLT5tYXhfZnJlcSk7CisKKwlpZihtZW1jbXAocGRhdGEtPmNsa19uYW1lLCAiRFVTIiwgMykpCisJCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfTEVHQUNZX1NQSSwgMCk7CisJZWxzZQkKKwkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9GQVNUX1NQSSwgMCk7CisJCisJaWYocGRhdGEtPnVzZV9kbWEpIC8qIERNQSAqLworCXsKKwkJcmV0ID0gZHdfc3BpX2RtYV9pbml0KGR3cyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9jbGs7CisJfQorCisJZHdzLT5idXNfbnVtID0gcGRhdGEtPmJ1c19udW07CisJZHdzLT5udW1fY3MgPSBwZGF0YS0+bnVtX2NoaXBzZWxlY3RzOworCisJLyogR2V0IGJhc2ljIGlvIHJlc291cmNlIGFuZCBtYXAgaXQgKi8KKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghbWVtKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1lbSByZXNvdXJjZT9cbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9jbGs7CisJfQorCisJaW9hcmVhID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSwKKwkJCXBkZXYtPm5hbWUpOworCWlmICghaW9hcmVhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlNQSSByZWdpb24gYWxyZWFkeSBjbGFpbWVkXG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9jbGs7CisJfQorCisJZHdzLT5yZWdzID0gaW9yZW1hcF9ub2NhY2hlKG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSk7CisJaWYgKCFkd3MtPnJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiU1BJIHJlZ2lvbiBhbHJlYWR5IG1hcHBlZFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnOworCX0KKworCWR3cy0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoZHdzLT5pcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSByZXNvdXJjZT9cbiIpOworCQlyZXQgPSBkd3MtPmlycTsgLyogLUVOWElPICovCisJCWdvdG8gZXJyX3VubWFwOworCX0KKworCWR3cy0+cGFyZW50X2RldiA9ICZwZGV2LT5kZXY7CisKKwlyZXQgPSBkd19zcGlfYWRkX2hvc3QoZHdzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bm1hcDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGR3c21taW8pOworCXJldHVybiAwOworCitlcnJfdW5tYXA6CisJaW91bm1hcChkd3MtPnJlZ3MpOworZXJyX3JlbGVhc2VfcmVnOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworZXJyX2NsazoKKwlpZihtZW1jbXAocGRhdGEtPmNsa19uYW1lLCAiRFVTIiwgMykpCisJCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfTEVHQUNZX1NQSSwgMSk7CisJZWxzZQkKKwkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9GQVNUX1NQSSwgMSk7CisJCisJY2xrX3B1dChkd3MtPmNsa19zcGkpOworZXJyX2tmcmVlOgorCWtmcmVlKGR3c21taW8pOworZXJyX2VuZDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkd19zcGlfYzIwMDBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGR3X3NwaV9jMjAwMCAqZHdzbW1pbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzcGlfY29udHJvbGxlcl9wZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlICptZW07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWR3X3NwaV9yZW1vdmVfaG9zdCgmZHdzbW1pby0+ZHdzKTsKKwlpb3VubWFwKGR3c21taW8tPmR3cy5yZWdzKTsKKworCWNsa19wdXQoZHdzbW1pby0+ZHdzLmNsa19zcGkpOworCWtmcmVlKGR3c21taW8pOworCisJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZighcGRhdGEpCisJeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihtZW1jbXAocGRhdGEtPmNsa19uYW1lLCAiRFVTIiwgMykpCisJCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfTEVHQUNZX1NQSSwgMSk7CisJZWxzZQkKKwkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9GQVNUX1NQSSwgMSk7CisJCisJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24obWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGMyMDAwX3NwaV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHdfc3BpX2MyMDAwICpkd3NtbWlvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGR3X3NwaSAqZHdzID0gJmR3c21taW8tPmR3czsKKworCXJldHVybiBkd19zcGlfc3VzcGVuZF9ob3N0KGR3cyk7Cit9CisKK3N0YXRpYyBpbnQgYzIwMDBfc3BpX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkd19zcGlfYzIwMDAgKmR3c21taW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZHdfc3BpICpkd3MgPSAmZHdzbW1pby0+ZHdzOworCisJcmV0dXJuIGR3X3NwaV9yZXN1bWVfaG9zdChkd3MpOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGR3X3NwaV9jMjAwMF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGR3X3NwaV9jMjAwMF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGR3X3NwaV9jMjAwMF9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kICAgICAgICA9IGMyMDAwX3NwaV9zdXNwZW5kLAorCS5yZXN1bWUgICAgICAgICA9IGMyMDAwX3NwaV9yZXN1bWUsCisjZW5kaWYKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUklWRVJfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGR3X3NwaV9jMjAwMF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJTYXRlbmRyYSBQcmF0YXAgPHNhdGVuZHJhLnByYXRhcEBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lbW9yeS1tYXBwZWQgSS9PIGludGVyZmFjZSBkcml2ZXIgZm9yIERXIFNQSSBDb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZHcuYyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5jCmluZGV4IDA4MjQ1OGQuLjJjMDgwNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5jCkBAIC0yNCw2ICsyNCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2lmZGVmIENPTkZJR19DMktfREVWRlJFUV9EVworCSNpbmNsdWRlIDxsaW51eC9jMmstZGV2ZnJlcS5oPgorCSNpbmNsdWRlIDxsaW51eC9kZXZmcmVxLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgInNwaS1kdy5oIgogCkBAIC02Miw2ICs2OCw0OCBAQAogCXZvaWQgKCpjc19jb250cm9sKSh1MzIgY29tbWFuZCk7CiB9OwogCisjaWZkZWYgQ09ORklHX0MyS19ERVZGUkVRX0RXCitzdGF0aWMgZGV2ZnJlcV9jb3VudGVycyBkYzsKKworc3RhdGljIGludCBzZXRfc3BpX2ZyZXEoc3RydWN0IGMya19kZXZmcmVxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKmZyZXEpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IGNvbnRhaW5lcl9vZihkYXRhLT5kZXYsIHN0cnVjdCBzcGlfZGV2aWNlLCBkZXYpOworCXN0cnVjdCBkd19zcGkgKmR3cyA9IGNvbnRhaW5lcl9vZigmc3BpLCBzdHJ1Y3QgZHdfc3BpLCBjdXJfZGV2KTsKKwlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwOworCXUzMiBjbGtfZGl2OworCisJLyogT25seSBhbGxvYyBvbiBmaXJzdCBzZXR1cCAqLworCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKKworCWlmICghY2hpcCkKKwl7CisJCWNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKKwkJaWYgKCFjaGlwKSB7CisJCQljaGlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoaXBfZGF0YSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFjaGlwKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJaWYgKCgqZnJlcSA8PSBkYXRhLT5tYXhfZnJlcSkgJiYgKCpmcmVxID49IGRhdGEtPm1pbl9mcmVxKSkKKwl7CisJCWNoaXAtPnNwZWVkX2h6ID0gKHUzMikqZnJlcTsKKwkJY2xrX2RpdiA9IGR3cy0+bWF4X2ZyZXEgLyBjaGlwLT5zcGVlZF9oejsKKwkJY2xrX2RpdiA9IChjbGtfZGl2ICsgMSkgJiAweGZmZmU7CisKKwkJY2hpcC0+Y2xrX2RpdiA9IGNsa19kaXY7CisJCXNwaV9zZXRfY2xrKGR3cywgY2hpcC0+Y2xrX2Rpdik7CisJfQorCWVsc2UKKwl7CisJCXByaW50ayAoS0VSTl9FUlIgIiVzOiBUcnlpbmcgdG8gc2V0IG91dCBvZiByYW5nZSBzcGkgZnJlcTogJWx1XG5cCisJCQkiLCBfX2Z1bmNfXywgKmZyZXEpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIHN0YXRpYyBpbnQgc3BpX3Nob3dfcmVnc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewpAQCAtMzk0LDYgKzQ0MiwxMCBAQAogCXUzMiBzcGVlZCA9IDA7CiAJdTMyIGNyMCA9IDA7CiAKKyNpZmRlZiBDT05GSUdfQzJLX0RFVkZSRVFfRFcKKwlkZXZmcmVxX2Z1bmNfc3RhcnQoJmRjKTsKKyNlbmRpZgorCiAJLyogR2V0IGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gKi8KIAltZXNzYWdlID0gZHdzLT5jdXJfbXNnOwogCXRyYW5zZmVyID0gZHdzLT5jdXJfdHJhbnNmZXI7CkBAIC01NDgsNiArNjAwLDEwIEBACiAJaWYgKGNoaXAtPnBvbGxfbW9kZSkKIAkJcG9sbF90cmFuc2Zlcihkd3MpOwogCisjaWZkZWYgQ09ORklHX0MyS19ERVZGUkVRX0RXCisJZGV2ZnJlcV9mdW5jX2VuZCgmZGMpOworI2VuZGlmCisKIAlyZXR1cm47CiAKIGVhcmx5X2V4aXQ6CkBAIC01OTgsNiArNjU0LDkgQEAKIHsKIAlzdHJ1Y3QgZHdfc3BpICpkd3MgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIENPTkZJR19DMktfREVWRlJFUV9EVworCWRldmZyZXFfZnVuY19zdGFydCgmZGMpOworI2VuZGlmCiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHdzLT5sb2NrLCBmbGFncyk7CiAKQEAgLTYyNiw2ICs2ODUsOSBAQAogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmR3cy0+bG9jaywgZmxhZ3MpOworI2lmZGVmIENPTkZJR19DMktfREVWRlJFUV9EVworCWRldmZyZXFfZnVuY19lbmQoJmRjKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC04MDEsNiArODYzLDQ5IEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX0MyS19ERVZGUkVRX0RXCisjZGVmaW5lCVNQSV9NQVhGUkVRX01IWgkyMDAwMDAwCisjZGVmaW5lCVNQSV9NSU5GUkVRX01IWgkxMDAwMDAwCisjZGVmaW5lCVBPTExJTkdfTVMJMTAwMAorI2RlZmluZQlPUFBfVEFCTEVfU0laRQk0CisKK3N0cnVjdCBkZXZmcmVxX2Rldl9wcm9maWxlIHNwaV9kZXZmcmVxX3Byb2ZpbGU7IAorc3RydWN0IGMya19kZXZmcmVxX2RhdGEgZGV2ZnJlcV9zcGlfZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgYzJrX2RldmZyZXFfb3BwX3RhYmxlIHNwaV9vcHBfdGJsW09QUF9UQUJMRV9TSVpFXTsKKworLyogCisgKiBpbnRpYWxpemUgT1BQIHRhYmxlLCBwcm9maWxlIGRhdGEgKGluaXRpYWwgZnJlcSwgcG9sbGluZyBpbnRlcnZhbCksCisgKiBtYXgvbWluIGZyZXEgc3VwcG9ydGVkIGJ5IFNQSSBjb250cm9sbGVyLgorICovCitzdGF0aWMgdm9pZCBpbml0X3NwaV9kZXZmcmVxX2RhdGEoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgYzJrX2RldmZyZXFfb3BwX3RhYmxlIG9wcF90YmxbT1BQX1RBQkxFX1NJWkVdID0geworCQl7MSwgMTAwMDAwMCwgMH0sCisJCXsyLCAyMDAwMDAwLCAwfSwKKwkJezMsIDQwMDAwMDAsIDB9LAorCQl7MCwgMCwgMH0sCisJfTsKKworCXdoaWxlIChpIDwgc2l6ZW9mKG9wcF90YmwpKQorCXsKKwkJc3BpX29wcF90YmxbaV0uaWR4ID0gb3BwX3RibFtpXS5pZHg7CisJCXNwaV9vcHBfdGJsW2ldLmZyZXEgPSBvcHBfdGJsW2ldLmZyZXE7CisJCXNwaV9vcHBfdGJsW2ldLnZvbHQgPSBvcHBfdGJsW2ldLnZvbHQ7CisJCWkrKzsKKwl9CisKKwlzcGlfZGV2ZnJlcV9wcm9maWxlLmluaXRpYWxfZnJlcSA9IGR3cy0+bWF4X2ZyZXE7CisJc3BpX2RldmZyZXFfcHJvZmlsZS5wb2xsaW5nX21zID0gUE9MTElOR19NUzsKKworCWRldmZyZXFfc3BpX2RhdGEuZGV2ZnJlcV9wcm9maWxlID0gJnNwaV9kZXZmcmVxX3Byb2ZpbGU7CisJZGV2ZnJlcV9zcGlfZGF0YS5vcHBfdGFibGUgPSAmc3BpX29wcF90YmxbMF07CisJZGV2ZnJlcV9zcGlfZGF0YS5zZXRfZnJlcSA9IHNldF9zcGlfZnJlcTsKKwlkZXZmcmVxX3NwaV9kYXRhLm1heF9mcmVxID0gU1BJX01BWEZSRVFfTUhaOworCWRldmZyZXFfc3BpX2RhdGEubWluX2ZyZXEgPSBTUElfTUlORlJFUV9NSFo7Cit9CisjZW5kaWYKKwogaW50IF9fZGV2aW5pdCBkd19zcGlfYWRkX2hvc3Qoc3RydWN0IGR3X3NwaSAqZHdzKQogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXI7CkBAIC04MTQsNiArOTE5LDggQEAKIAkJZ290byBleGl0OwogCX0KIAorCWNsa19lbmFibGUoZHdzLT5jbGtfc3BpKTsKKwogCWR3cy0+bWFzdGVyID0gbWFzdGVyOwogCWR3cy0+dHlwZSA9IFNTSV9NT1RPX1NQSTsKIAlkd3MtPnByZXZfY2hpcCA9IE5VTEw7CkBAIC04NjcsNiArOTc0LDE0IEBACiAJfQogCiAJbXJzdF9zcGlfZGVidWdmc19pbml0KGR3cyk7CisKKyNpZmRlZiBDT05GSUdfQzJLX0RFVkZSRVFfRFcKKwlpbml0X3NwaV9kZXZmcmVxX2RhdGEoZHdzKTsKKworCXJldCA9IGMya19kcml2ZXJfZGV2ZnJlcSgmbWFzdGVyLT5kZXYsICZkZXZmcmVxX3NwaV9kYXRhKTsKKwlpZihyZXQgPCAwKQorCQlnb3RvIGVycl9xdWV1ZV9hbGxvYzsKKyNlbmRpZgogCXJldHVybiAwOwogCiBlcnJfcXVldWVfYWxsb2M6CkBAIC04NzcsNiArOTkyLDcgQEAKIAlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKIAlmcmVlX2lycShkd3MtPmlycSwgZHdzKTsKIGVycl9mcmVlX21hc3RlcjoKKwljbGtfZGlzYWJsZShkd3MtPmNsa19zcGkpOwogCXNwaV9tYXN0ZXJfcHV0KG1hc3Rlcik7CiBleGl0OgogCXJldHVybiByZXQ7CkBAIC05MDAsMTIgKzEwMTYsMTIgQEAKIAlpZiAoZHdzLT5kbWFfb3BzICYmIGR3cy0+ZG1hX29wcy0+ZG1hX2V4aXQpCiAJCWR3cy0+ZG1hX29wcy0+ZG1hX2V4aXQoZHdzKTsKIAlzcGlfZW5hYmxlX2NoaXAoZHdzLCAwKTsKLQkvKiBEaXNhYmxlIGNsayAqLwotCXNwaV9zZXRfY2xrKGR3cywgMCk7CiAJZnJlZV9pcnEoZHdzLT5pcnEsIGR3cyk7CiAKIAkvKiBEaXNjb25uZWN0IGZyb20gdGhlIFNQSSBmcmFtZXdvcmsgKi8KIAlzcGlfdW5yZWdpc3Rlcl9tYXN0ZXIoZHdzLT5tYXN0ZXIpOworCS8qIERpc2FibGUgY2xrICovCisJY2xrX2Rpc2FibGUoZHdzLT5jbGtfc3BpKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGR3X3NwaV9yZW1vdmVfaG9zdCk7CiAKQEAgLTkxNyw3ICsxMDMzLDkgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOwotCXNwaV9zZXRfY2xrKGR3cywgMCk7CisKKwljbGtfZGlzYWJsZShkd3MtPmNsa19zcGkpOworCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGR3X3NwaV9zdXNwZW5kX2hvc3QpOwpAQCAtOTI2LDYgKzEwNDQsNyBAQAogewogCWludCByZXQ7CiAKKwljbGtfZW5hYmxlKGR3cy0+Y2xrX3NwaSk7CiAJc3BpX2h3X2luaXQoZHdzKTsKIAlyZXQgPSBzdGFydF9xdWV1ZShkd3MpOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZHcuaCBiL2RyaXZlcnMvc3BpL3NwaS1kdy5oCmluZGV4IDljNTdjMDcuLmI0YmQyOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy5oCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5oCkBAIC05Miw2ICs5Miw3IEBACiBzdHJ1Y3QgZHdfc3BpIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwogCXN0cnVjdCBzcGlfZGV2aWNlCSpjdXJfZGV2OworCXN0cnVjdCBjbGsJCSpjbGtfc3BpOwogCXN0cnVjdCBkZXZpY2UJCSpwYXJlbnRfZGV2OwogCWVudW0gZHdfc3NpX3R5cGUJdHlwZTsKIAljaGFyCQkJbmFtZVsxNl07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaTIvS2NvbmZpZyBiL2RyaXZlcnMvc3BpMi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYjYwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaTIvS2NvbmZpZwpAQCAtMCwwICsxLDE1IEBACisjCisjIENoYXJhY3RlciBkZXZpY2UgY29uZmlndXJhdGlvbgorIworCittZW51ICJTUEkyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoQVJDSF9DT01DRVJUTykKK2NvbmZpZyBTUEkyCisJdHJpc3RhdGUgIk1pbmRzcGVlZCBTUEkgc3VwcG9ydCIKKwloZWxwCisJICBNaW5kc3BlZWQgU1BJIChTZXJpYWwgUGhlcmlwaGVyYWwgSW50ZXJmYWNlIGJ1cykgY29yZSBzdXBwb3J0CisKK3NvdXJjZSBkcml2ZXJzL3NwaTIvYnVzc2VzL0tjb25maWcKKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaTIvTWFrZWZpbGUgYi9kcml2ZXJzL3NwaTIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiNTFmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpMi9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBzcGkgY29yZS4KKyMKKworb2JqLSQoQ09ORklHX1NQSTIpICs9IHNwaS1jb3JlLm8KK29iai15CQkgICs9IGJ1c3Nlcy8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkyL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9zcGkyL2J1c3Nlcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxM2Y0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaTIvYnVzc2VzL0tjb25maWcKQEAgLTAsMCArMSwxNSBAQAorCittZW51ICJTUEkgSGFyZHdhcmUgQnVzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTUEkyCisKK2NvbmZpZyBTUEkyX01TUERfTE9XX1NQRUVECisJdHJpc3RhdGUgIkNvbWNlcnRvIExvdy1zcGVlZCIKKwlkZXBlbmRzIG9uIFNQSTIKKwlkZWZhdWx0IHkKKworY29uZmlnIFNQSTJfTVNQRF9ISUdIX1NQRUVECisJdHJpc3RhdGUgIkNvbWNlcnRvIEhpZ2gtc3BlZWQiCisJZGVwZW5kcyBvbiBTUEkyCisJZGVmYXVsdCB5CisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpMi9idXNzZXMvTWFrZWZpbGUgYi9kcml2ZXJzL3NwaTIvYnVzc2VzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNTNiZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaTIvYnVzc2VzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKK1NQSTJfTVNQRD1uCitpZmVxICgkKENPTkZJR19TUEkyX01TUERfSElHSF9TUEVFRCksbSkKKyAgICBTUEkyX01TUEQ9bQorZW5kaWYKK2lmZXEgKCQoQ09ORklHX1NQSTJfTVNQRF9MT1dfU1BFRUQpLG0pCisgICAgU1BJMl9NU1BEPW0KK2VuZGlmCitpZmVxICgkKENPTkZJR19TUEkyX01TUERfSElHSF9TUEVFRCkseSkKKyAgICBTUEkyX01TUEQ9eQorZW5kaWYKK2lmZXEgKCQoQ09ORklHX1NQSTJfTVNQRF9MT1dfU1BFRUQpLHkpCisgICAgU1BJMl9NU1BEPXkKK2VuZGlmCisKK29iai0kKFNQSTJfTVNQRCkgICAgICAgICs9IGNvbWNlcnRvX3NwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaTIvYnVzc2VzL2NvbWNlcnRvX3NwaS5jIGIvZHJpdmVycy9zcGkyL2J1c3Nlcy9jb21jZXJ0b19zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGUyZDZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkyL2J1c3Nlcy9jb21jZXJ0b19zcGkuYwpAQCAtMCwwICsxLDc3MiBAQAorLyoKKyAqICBkcml2ZXJzL3NwaTIvYnVzc2VzL2NvbWNlcnRvX3NwaS5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA1IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiAhZGVmaW5lZCAoQVVUT0NPTkZfSU5DTFVERUQpCisjaWYgMAorCSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NpemVzLmg+CisjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgImNvbWNlcnRvX3NwaS5oIgorCisvKiovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKy8qKi8KKworLyoqCisgKiBkb193cml0ZV9yZWFkX3RyYW5zZmVyOCAtCisgKgorICoKKyAqLworc3RhdGljIGludCBkb193cml0ZV9yZWFkX3RyYW5zZmVyOChzdHJ1Y3QgY29tY2VydG9fc3BpICpzcGksIHU4ICp3YnVmLCB1bnNpZ25lZCBpbnQgKndsZW4sIHU4ICpyYnVmLCB1bnNpZ25lZCBpbnQgKnJsZW4sIHUzMiBzZXJfcmVnKQoreworCXVuc2lnbmVkIGludCBsZW5fbm93OworCWludCByYyA9IDA7CisJdW5zaWduZWQgaW50IHd0bXAgPSAqd2xlbiwgcnRtcCA9ICpybGVuOworCXUzMiBkciA9IHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9EUjsKKwl1MzIgdHhmbHIgPSBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfVFhGTFI7CisJdTMyIHJ4ZmxyID0gc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1JYRkxSOworCWludCBzZXJfZG9uZSA9IDA7CisKKy8vCXByaW50ayhLRVJOX0lORk8gImRvX3dyaXRlX3JlYWRfdHJhbnNmZXIoJSNseCwgJSNseCwgJWQsICUjbHgsICVkKVxuIiwgKHVuc2lnbmVkIGxvbmcpc3BpLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpd2J1ZiwgKndsZW4sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylyYnVmLCAqcmxlbik7CisKKwl3aGlsZSAod3RtcCB8fCBydG1wKSB7CisJCWxlbl9ub3cgPSA4IC0gX19yYXdfcmVhZGwodHhmbHIpOworCQlpZiAobGVuX25vdyA+IHd0bXApCisJCQlsZW5fbm93ID0gd3RtcDsKKworCQl3dG1wIC09IGxlbl9ub3c7CisKKwkJLyogd2FybS11cCB3cml0ZSBmaWZvIHRvIGF2b2lkIHVuZGVycnVucyAqLworCQl3aGlsZSAobGVuX25vdy0tKQorCQkJX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KCh1MTYpICp3YnVmKyspLCBkcik7CisKKwkJaWYgKCFzZXJfZG9uZSl7CisJCQlfX3Jhd193cml0ZWwoc2VyX3JlZywgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1NFUik7CisJCQlzZXJfZG9uZSA9IDE7CisJCX0KKworCQlsZW5fbm93ID0gX19yYXdfcmVhZGwocnhmbHIpOworCQlpZiAobGVuX25vdyA+IHJ0bXApCisJCQlsZW5fbm93ID0gcnRtcDsKKworCQlydG1wIC09IGxlbl9ub3c7CisKKwkJd2hpbGUgKGxlbl9ub3ctLSkgeworCQkJKnJidWYgPSAodTgpIChsZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhkcikpICYgMHhmZik7CisJCQlyYnVmKys7CisJCX0KKwl9CisKKwkqcmxlbiAtPSBydG1wOworCSp3bGVuIC09IHd0bXA7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogZG9fd3JpdGVfcmVhZF90cmFuc2ZlcjE2IC0KKyAqCisgKi8KK3N0YXRpYyBpbnQgZG9fd3JpdGVfcmVhZF90cmFuc2ZlcjE2KHN0cnVjdCBjb21jZXJ0b19zcGkgKnNwaSwgdTE2ICp3YnVmLCB1bnNpZ25lZCBpbnQgKndsZW4sIHUxNiAqcmJ1ZiwgdW5zaWduZWQgaW50ICpybGVuLCB1MzIgc2VyX3JlZykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuX25vdzsKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCB3dG1wID0gKndsZW4sIHJ0bXAgPSAqcmxlbjsKKwl1bnNpZ25lZCBpbnQgd3BhZGRpbmcsIHJwYWRkaW5nOworCXUzMiBkciA9IHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9EUjsKKwl1MzIgdHhmbHIgPSBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfVFhGTFI7CisJdTMyIHJ4ZmxyID0gc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1JYRkxSOworCWludCBzZXJfZG9uZSA9IDA7CisKKy8vCXByaW50ayhLRVJOX0lORk8gImRvX3dyaXRlX3JlYWRfdHJhbnNmZXIoJSNseCwgJSNseCwgJWQsICUjbHgsICVkKVxuIiwgKHVuc2lnbmVkIGxvbmcpc3BpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl3YnVmLCAqd2xlbiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXJidWYsICpybGVuKTsKKworCWlmICh3dG1wID4gcnRtcCkgeworCQl3cGFkZGluZyAgPSAwOworCQlycGFkZGluZyA9IHd0bXAgLSBydG1wOworCX0gZWxzZSB7CisJCXdwYWRkaW5nID0gcnRtcCAtIHd0bXA7CisJCXJwYWRkaW5nID0gMDsKKwl9CisKKwl3aGlsZSAod3RtcCB8fCBydG1wKSB7CisJCWxlbl9ub3cgPSA4IC0gX19yYXdfcmVhZGwodHhmbHIpOworCisJCWlmICh3dG1wKSB7CisJCQlpZiAobGVuX25vdyA+IHd0bXApCisJCQkJbGVuX25vdyA9IHd0bXA7CisKKwkJCXd0bXAgLT0gbGVuX25vdzsKKworCQkJd2hpbGUgKGxlbl9ub3ctLSkKKwkJCQlfX3Jhd193cml0ZXcoY3B1X3RvX2xlMTYoKndidWYrKyksIGRyKTsKKworCQl9IGVsc2UgaWYgKHdwYWRkaW5nKSB7CisJCQlpZiAobGVuX25vdyA+IHdwYWRkaW5nKQorCQkJCWxlbl9ub3cgPSB3cGFkZGluZzsKKworCQkJd3BhZGRpbmcgLT0gbGVuX25vdzsKKworCQkJd2hpbGUgKGxlbl9ub3ctLSkKKwkJCQlfX3Jhd193cml0ZXcoMCwgZHIpOworCQl9CisKKwkJaWYgKCFzZXJfZG9uZSl7CisJCQlfX3Jhd193cml0ZWwoc2VyX3JlZywgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1NFUik7CisJCQlzZXJfZG9uZSA9IDE7CisJCX0KKworCQlsZW5fbm93ID0gX19yYXdfcmVhZGwocnhmbHIpOworCQlpZiAocnRtcCkgeworCQkJaWYgKGxlbl9ub3cgPiBydG1wKQorCQkJCWxlbl9ub3cgPSBydG1wOworCisJCQlydG1wIC09IGxlbl9ub3c7CisKKwkJCXdoaWxlIChsZW5fbm93LS0pIHsKKwkJCQkqcmJ1ZiA9IGxlMTZfdG9fY3B1KF9fcmF3X3JlYWR3KGRyKSk7CisJCQkJcmJ1ZisrOworCQkJfQorCQl9IGVsc2UgaWYgKHJwYWRkaW5nKSB7CisJCQlpZiAobGVuX25vdyA+IHJwYWRkaW5nKQorCQkJCWxlbl9ub3cgPSBycGFkZGluZzsKKworCQkJcnBhZGRpbmcgLT0gbGVuX25vdzsKKworCQkJd2hpbGUgKGxlbl9ub3ctLSkKKwkJCQlfX3Jhd19yZWFkdyhkcik7CisJCX0KKwl9CisKKwkqcmxlbiAtPSBydG1wOworCSp3bGVuIC09IHd0bXA7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBkb193cml0ZV9vbmx5X3RyYW5zZmVyOCAtCisgKgorICoKKyAqLworc3RhdGljIGludCBkb193cml0ZV9vbmx5X3RyYW5zZmVyOChzdHJ1Y3QgY29tY2VydG9fc3BpICpzcGksIHU4ICpidWYsIHVuc2lnbmVkIGludCAqbGVuLCB1MzIgc2VyX3JlZykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuX25vdzsKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCB0bXAgPSAqbGVuOworCXUzMiBkciA9IHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9EUjsKKwl1MzIgdHhmbHIgPSBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfVFhGTFI7CisJaW50IHNlcl9kb25lID0gMDsKKworLy8JcHJpbnRrKEtFUk5fSU5GTyAiZG9fd3JpdGVfb25seV90cmFuc2ZlcjgoJSNseCwgJSNseCwgJWQpXG4iLCAodW5zaWduZWQgbG9uZylzcGksICh1bnNpZ25lZCBsb25nKWJ1ZiwgKmxlbik7CisKKwl3aGlsZSAodG1wKSB7CisJCWxlbl9ub3cgPSA4IC0gX19yYXdfcmVhZGwodHhmbHIpOworCQlpZiAobGVuX25vdyA+IHRtcCkKKwkJCWxlbl9ub3cgPSB0bXA7CisKKwkJdG1wIC09IGxlbl9ub3c7CisKKwkJd2hpbGUgKGxlbl9ub3ctLSkKKwkJCV9fcmF3X3dyaXRldyhjcHVfdG9fbGUxNigodTE2KSAqYnVmKyspLCBkcik7CisKKwkJaWYgKCFzZXJfZG9uZSkKKwkJeworCQkJX19yYXdfd3JpdGVsKHNlcl9yZWcsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9TRVIpOworCQkJc2VyX2RvbmUgPSAxOworCQl9CisJfQorCisJKmxlbiAtPSB0bXA7CisKKy8vICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiZXhpdCBkb193cml0ZV9vbmx5X3RyYW5zZmVyKCVkLCAlZClcbiIsICpsZW4sIHJjKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBkb193cml0ZV9vbmx5X3RyYW5zZmVyIC0KKyAqCisgKgorICovCitzdGF0aWMgaW50IGRvX3dyaXRlX29ubHlfdHJhbnNmZXIxNihzdHJ1Y3QgY29tY2VydG9fc3BpICpzcGksIHUxNiAqYnVmLCB1bnNpZ25lZCBpbnQgKmxlbiwgdTMyIHNlcl9yZWcpCit7CisJdW5zaWduZWQgaW50IGxlbl9ub3c7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBpbnQgdG1wID0gKmxlbjsKKwl1MzIgZHIgPSBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfRFI7CisJdTMyIHR4ZmxyID0gc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1RYRkxSOworCWludCBzZXJfZG9uZSA9IDA7CisKKy8vICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiZG9fd3JpdGVfb25seV90cmFuc2ZlciglI2x4LCAlI2x4LCAlZClcbiIsICh1bnNpZ25lZCBsb25nKXNwaSwgKHVuc2lnbmVkIGxvbmcpYnVmLCAqbGVuKTsKKworCXdoaWxlICh0bXApIHsKKwkJbGVuX25vdyA9IDggLSBfX3Jhd19yZWFkbCh0eGZscik7CisJCWlmIChsZW5fbm93ID4gdG1wKQorCQkJbGVuX25vdyA9IHRtcDsKKworCQl0bXAgLT0gbGVuX25vdzsKKworCQl3aGlsZSAobGVuX25vdy0tKQorCQkJX19yYXdfd3JpdGV3KGNwdV90b19sZTE2KCpidWYrKyksIGRyKTsKKworCQlpZiAoIXNlcl9kb25lKQorCQl7CisJCQlfX3Jhd193cml0ZWwoc2VyX3JlZywgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1NFUik7CisJCQlzZXJfZG9uZSA9IDE7CisJCX0KKwl9CisKKwkqbGVuIC09IHRtcDsKKworLy8gICAgICBwcmludGsoS0VSTl9JTkZPICJleGl0IGRvX3dyaXRlX29ubHlfdHJhbnNmZXIoJWQsICVkKVxuIiwgKmxlbiwgcmMpOworCisJcmV0dXJuIHJjOworfQorCisKKy8qKgorICogZG9fcmVhZF9vbmx5X3RyYW5zZmVyIC0KKyAqCisgKgorICovCitzdGF0aWMgaW50IGRvX3JlYWRfb25seV90cmFuc2Zlcjgoc3RydWN0IGNvbWNlcnRvX3NwaSAqc3BpLCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgKmxlbikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuX25vdzsKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCB0bXAgPSAqbGVuOworCXUzMiBkciA9IHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9EUjsKKwl1MzIgcnhmbHIgPSBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfUlhGTFI7CisKKy8vCXByaW50ayhLRVJOX0lORk8gImRvX3JlYWRfb25seV90cmFuc2ZlcjgoJSNseCwgJSNseCwgJWQpXG4iLCAodW5zaWduZWQgbG9uZylzcGksICh1bnNpZ25lZCBsb25nKWJ1ZiwgKmxlbik7CisKKwkvKiBzdGFydCB0aGUgc2VyaWFsIGNsb2NrICovCisJX19yYXdfd3JpdGV3KDAsIGRyKTsKKworCXdoaWxlICh0bXApIHsKKwkJbGVuX25vdyA9IF9fcmF3X3JlYWRsKHJ4ZmxyKTsKKwkJaWYgKGxlbl9ub3cgPiB0bXApCisJCQlsZW5fbm93ID0gdG1wOworCisJCXRtcCAtPSBsZW5fbm93OworCisJCXdoaWxlIChsZW5fbm93LS0pIHsKKwkJCSpidWYgPSAodTgpIChsZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhkcikpICYgMHhmZik7CisJCQlidWYrKzsKKwkJfQorCX0KKworCSpsZW4gLT0gdG1wOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGRvX3JlYWRfb25seV90cmFuc2ZlciAtCisgKgorICoKKyAqLworc3RhdGljIGludCBkb19yZWFkX29ubHlfdHJhbnNmZXIxNihzdHJ1Y3QgY29tY2VydG9fc3BpICpzcGksIHUxNiAqYnVmLCB1bnNpZ25lZCBpbnQgKmxlbikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuX25vdzsKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCB0bXAgPSAqbGVuOworCXUzMiBkciA9IHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9EUjsKKwl1MzIgcnhmbHIgPSBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfUlhGTFI7CisKKy8vICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiZG9fcmVhZF9vbmx5X3RyYW5zZmVyKCUjbHgsICUjbHgsICVkKVxuIiwgKHVuc2lnbmVkIGxvbmcpc3BpLCAodW5zaWduZWQgbG9uZylidWYsICpsZW4pOworCisJLyogc3RhcnQgdGhlIHNlcmlhbCBjbG9jayAqLworCV9fcmF3X3dyaXRldygwLCBkcik7CisKKwl3aGlsZSAodG1wKSB7CisJCWxlbl9ub3cgPSBfX3Jhd19yZWFkbChyeGZscik7CisJCWlmIChsZW5fbm93ID4gdG1wKQorCQkJbGVuX25vdyA9IHRtcDsKKworCQl0bXAgLT0gbGVuX25vdzsKKworCQl3aGlsZSAobGVuX25vdy0tKSB7CisJCQkqYnVmID0gbGUxNl90b19jcHUoX19yYXdfcmVhZHcoZHIpKTsKKwkJCWJ1ZisrOworCQl9CisJfQorCisJKmxlbiAtPSB0bXA7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBjb21jZXJ0b19zcGlfZG9fdHJhbnNmZXIgLQorICoKKyAqCisgKi8KK3N0YXRpYyBpbnQgY29tY2VydG9fc3BpX2RvX3RyYW5zZmVyKHN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXIsIHN0cnVjdCBzcGlfY2xpZW50X2NvbmZpZyAqY29uZmlnKQoreworCXN0cnVjdCBjb21jZXJ0b19zcGkgKnNwaSA9IChzdHJ1Y3QgY29tY2VydG9fc3BpICopYWRhcHRlci0+ZGF0YTsKKwl1MzIgY3RybHIwLCBjdHJscjEsIGJhdWRyLCBzZXI7CisJaW50IHJjOworCisvLyAgICAgIHByaW50ayhLRVJOX0lORk8gImNvbWNlcnRvX3NwaV9kb190cmFuc2ZlciglI2x4LCAlI2x4LCAlI2x4KVxuIiwgKHVuc2lnbmVkIGxvbmcpIGFkYXB0ZXIsICh1bnNpZ25lZCBsb25nKSB0cmFuc2ZlciwgKHVuc2lnbmVkIGxvbmcpIGNvbmZpZyk7CisKKwkvKiBtYWtlIHN1cmUgbGFzdCB0cmFuc2FjdGlvbiBpcyBmaW5pc2hlZCAqLworCXdoaWxlIChfX3Jhd19yZWFkbChzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfU1IpICYgQlVTWSkgOworCisJaWYgKGNvbmZpZy0+YmFfZGVsYXkpCisJCXVkZWxheShjb25maWctPmJhX2RlbGF5KTsKKworCWN0cmxyMCA9ICgoY29uZmlnLT5zY19wb2xhcml0eSAmIDB4MSkgPDwgNykgfCAoKGNvbmZpZy0+c2NfcGhhc2UgJiAweDEpIDw8IDYpIHwgKCgodHJhbnNmZXItPmZzIC0gMSkgJiAweGYpIDw8IDApOworCisJYmF1ZHIgPSBzcGktPmNsb2NrX3JhdGUgLyBjb25maWctPnNjX3JhdGU7CisKKwlzZXIgPSBjb25maWctPmNzX21zayAmIGFkYXB0ZXItPmNhcHMuY3NfbXNrOworCisJX19yYXdfd3JpdGVsKDAsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9TU0lFTlIpOworCisJc3dpdGNoICh0cmFuc2Zlci0+bW9kZSAmIDB4MGYpIHsKKwlkZWZhdWx0OgorCQlyYyA9IC0xOworCQlicmVhazsKKworCWNhc2UgU1BJX1RSQU5TRkVSX01PREVfV1JJVEVfT05MWToKKwkJY3RybHIwIHw9ICgweDAwMDEgPDwgOCk7CisKKwkJX19yYXdfd3JpdGVsKGN0cmxyMCwgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX0NUUkxSMCk7CisJCV9fcmF3X3dyaXRlbChiYXVkciwgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX0JBVURSKTsKKwkJLy9fX3Jhd193cml0ZWwoc2VyLCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfU0VSKTsKKwkJX19yYXdfd3JpdGVsKDgsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9SWEZUTFIpOworCQlfX3Jhd193cml0ZWwoMCwgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1RYRlRMUik7CisJCV9fcmF3X3dyaXRlbCgwLCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfSU1SKTsKKwkJX19yYXdfd3JpdGVsKDEsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9TU0lFTlIpOworCisJCWlmICh0cmFuc2Zlci0+ZnMgPD0gOCkKKwkJCXJjID0gZG9fd3JpdGVfb25seV90cmFuc2Zlcjgoc3BpLCB0cmFuc2Zlci0+d2J1ZiwgJnRyYW5zZmVyLT53bGVuLCBzZXIpOworCQllbHNlCisJCQlyYyA9IGRvX3dyaXRlX29ubHlfdHJhbnNmZXIxNihzcGksICh1MTYgKikgdHJhbnNmZXItPndidWYsICZ0cmFuc2Zlci0+d2xlbiwgc2VyKTsKKworCQlicmVhazsKKworCWNhc2UgU1BJX1RSQU5TRkVSX01PREVfUkVBRF9PTkxZOgorCQljdHJscjAgfD0gKDB4MDAwMiA8PCA4KTsKKwkJY3RybHIxID0gdHJhbnNmZXItPnJsZW4gLSAxOworCisJCV9fcmF3X3dyaXRlbChjdHJscjAsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9DVFJMUjApOworCQlfX3Jhd193cml0ZWwoY3RybHIxLCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfQ1RSTFIxKTsKKwkJX19yYXdfd3JpdGVsKGJhdWRyLCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfQkFVRFIpOworCQlfX3Jhd193cml0ZWwoc2VyLCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfU0VSKTsKKwkJX19yYXdfd3JpdGVsKDgsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9SWEZUTFIpOworCQlfX3Jhd193cml0ZWwoMCwgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1RYRlRMUik7CisJCV9fcmF3X3dyaXRlbCgwLCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfSU1SKTsKKwkJX19yYXdfd3JpdGVsKDEsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9TU0lFTlIpOworCisJCWlmICh0cmFuc2Zlci0+ZnMgPD0gOCkKKwkJCXJjID0gZG9fcmVhZF9vbmx5X3RyYW5zZmVyOChzcGksIHRyYW5zZmVyLT5yYnVmLCAmdHJhbnNmZXItPnJsZW4pOworCQllbHNlCisJCQlyYyA9IGRvX3JlYWRfb25seV90cmFuc2ZlcjE2KHNwaSwgKHUxNiAqKSB0cmFuc2Zlci0+cmJ1ZiwgJnRyYW5zZmVyLT5ybGVuKTsKKwkKKwkJYnJlYWs7CisKKwljYXNlIFNQSV9UUkFOU0ZFUl9NT0RFX1dSSVRFX1JFQUQ6CisJCWN0cmxyMCB8PSAoMHgwMDAwIDw8IDgpOworCisJCV9fcmF3X3dyaXRlbChjdHJscjAsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9DVFJMUjApOworCQlfX3Jhd193cml0ZWwoYmF1ZHIsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9CQVVEUik7CisJLy8JX19yYXdfd3JpdGVsKHNlciwgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1NFUik7CisJCV9fcmF3X3dyaXRlbCg4LCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfUlhGVExSKTsKKwkJX19yYXdfd3JpdGVsKDAsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9UWEZUTFIpOworCQlfX3Jhd193cml0ZWwoMCwgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX0lNUik7CisJCV9fcmF3X3dyaXRlbCgxLCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfU1NJRU5SKTsKKworCQlpZiAodHJhbnNmZXItPmZzIDw9IDgpCisJCXJjID0gZG9fd3JpdGVfcmVhZF90cmFuc2Zlcjgoc3BpLCB0cmFuc2Zlci0+d2J1ZiwgJnRyYW5zZmVyLT53bGVuLCB0cmFuc2Zlci0+cmJ1ZiwgJnRyYW5zZmVyLT5ybGVuLCBzZXIpOworCQllbHNlCisJCXJjID0gZG9fd3JpdGVfcmVhZF90cmFuc2ZlcjE2KHNwaSwgKHUxNiAqKSB0cmFuc2Zlci0+d2J1ZiwgJnRyYW5zZmVyLT53bGVuLCAodTE2ICopIHRyYW5zZmVyLT5yYnVmLCAmdHJhbnNmZXItPnJsZW4sIHNlcik7CisKKwkJYnJlYWs7CisJfQorCisJaWYgKGNvbmZpZy0+YmFfZGVsYXkpIHsKKwkJdWRlbGF5KGNvbmZpZy0+YmFfZGVsYXkpOworCSAgICAgICAgLyogbWFrZSBzdXJlIHRoaXMgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQgKi8KKyAgICAgICAgCXdoaWxlIChfX3Jhd19yZWFkbChzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfU1IpICYgQlVTWSkgOworCX0KKworCV9fcmF3X3dyaXRlbCgwLCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfU0VSKTsKKworCXJldHVybiByYzsKK30KKworI2lmIDAKKy8qKgorICogY29tY2VydG9fc3BpX2lycV9oYW5kbGVyIC0KKyAqCisgKgorICovCitpcnFyZXR1cm5fdCBjb21jZXJ0b19zcGlfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IGNvbWNlcnRvX3NwaSAqc3BpID0gKHN0cnVjdCBjb21jZXJ0b19zcGkgKilkZXZfaWQ7CisJc3RydWN0IHNwaV9hZGFwdGVyICphZGFwdGVyID0gc3BpLT5hZGFwdGVyOworCXUzMiBjYWxsYmFja19zdGF0dXMgPSAwOworCXUzMiBzdGF0dXM7CisJdTMyIGltcjsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKworCXByaW50ayhLRVJOX0lORk8gImNvbWNlcnRvX3NwaV9pcnFfaGFuZGxlciglZCwgJSNseCwgJSNseClcbiIsIGlycSwgKHVuc2lnbmVkIGxvbmcpZGV2X2lkLCAodW5zaWduZWQgbG9uZylyZWdzKTsKKworCXN0YXR1cyA9IHJlYWRsKHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9JU1IpOworCWlmICghc3RhdHVzKQorCQlnb3RvIG91dDsKKworCXByaW50ayhLRVJOX0lORk8gInN0YXR1cyAleFxuIiwgc3RhdHVzKTsKKworCXJldCA9IElSUV9IQU5ETEVEOworCisJaWYgKHN0YXR1cyAmIFRYRUlTKSB7CisJCWNhbGxiYWNrX3N0YXR1cyB8PSBTUElfV1JJVEVfRE9ORTsKKworCQlwcmludGsoS0VSTl9JTkZPICIleCAleFxuIiwgcmVhZGwoc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1NSKSwgcmVhZGwoc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1RYRkxSKSk7CisKKwkJLyogZGlzYWJsZSBmaWZvIGVtcHR5IGludGVycnVwdCAqLworCQlpbXIgPSByZWFkbChzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfSU1SKSAmIH4oVFhFSU0pOworCQl3cml0ZWwoaW1yLCBzcGktPm1lbWJhc2UgKyBDT01DRVJUT19TUElfSU1SKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgVFhPSVMpIHsKKwkJY2FsbGJhY2tfc3RhdHVzIHw9IFNQSV9XUklURV9FUlJPUjsKKwl9CisKKwlpZiAoc3RhdHVzICYgUlhVSVMpIHsKKwkJY2FsbGJhY2tfc3RhdHVzIHw9IFNQSV9SRUFEX0VSUk9SOworCX0KKworCWlmIChzdGF0dXMgJiBSWE9JUykgeworCQljYWxsYmFja19zdGF0dXMgfD0gU1BJX1JFQURfRVJST1I7CisJfQorCisJaWYgKHN0YXR1cyAmIFJYRklTKSB7CisJCWNhbGxiYWNrX3N0YXR1cyB8PSBTUElfREFUQV9BVkFJTEFCTEU7CisJfQorCisJc3BpX2NhbGxiYWNrKGFkYXB0ZXIsIGNhbGxiYWNrX3N0YXR1cyk7CisKKwkvKiBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCXJlYWRsKHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9JQ1IpOworCisgICAgICBvdXQ6CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKioKKyAqIGNvbWNlcnRvX3NwaV9od19pbml0IC0KKyAqCisgKgorICovCitzdGF0aWMgdm9pZCBjb21jZXJ0b19zcGlfaHdfaW5pdChzdHJ1Y3QgY29tY2VydG9fc3BpICpzcGkpCit7CisvLwlwcmludGsoS0VSTl9JTkZPICJjb21jZXJ0b19zcGlfaHdfaW5pdCglI2x4KVxuIiwgKHVuc2lnbmVkIGxvbmcpc3BpKTsKKworI2lmbmRlZiBDT05GSUdfQVJDSF9NODNYWFgKKwkvKiBlbmFibGUgU1BJIGJ1czogbm90IG5lZWRlZCBmb3IgYzJrICovCisJLy9jb21jZXJ0b19ncGlvX2N0cmwoMHgzIDw8IDQsIDB4MyA8PCA0KTsKKyNlbmRpZgorCisJLyogZGlzYWJsZSBTUEkgb3BlcmF0aW9uICovCisJd3JpdGVsKDAsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9TU0lFTlIpOworCisJLyogbWFzayBhbGwgU1BJIGlycSdzICovCisJd3JpdGVsKDAsIHNwaS0+bWVtYmFzZSArIENPTUNFUlRPX1NQSV9JTVIpOworfQorCisvKioKKyAqIGNvbWNlcnRvX3NwaV9od19yZXNldCAtCisgKgorICoKKyAqLworc3RhdGljIHZvaWQgY29tY2VydG9fc3BpX2h3X3Jlc2V0KHN0cnVjdCBjb21jZXJ0b19zcGkgKnNwaSkKK3sKKwkvKiBkaXNhYmxlIFNQSSBvcGVyYXRpb24gKi8KKwl3cml0ZWwoMCwgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX1NTSUVOUik7CisKKwkvKiBtYXNrIGFsbCBTUEkgaXJxJ3MgKi8KKwl3cml0ZWwoMCwgc3BpLT5tZW1iYXNlICsgQ09NQ0VSVE9fU1BJX0lNUik7CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfTTgzWFhYCisJLyogZGlzYWJsZSBTUEkgYnVzOiBub3QgbmVlZGVkIGZvciBjMmsgKi8KKwkvL2NvbWNlcnRvX2dwaW9fY3RybCgweDAgPDwgNCwgMHgzIDw8IDQpOworI2VuZGlmCit9CisjaWYgMAorc3RydWN0IHNwaV9hZGFwdGVyIGNvbWNlcnRvX3NwaV9hZGFwdGVyID0geworCS5uYW1lID0gImNvbWNlcnRvX3NwaSIsCisJLmRvX3RyYW5zZmVyID0gY29tY2VydG9fc3BpX2RvX3RyYW5zZmVyLAorfTsKKyNlbmRpZgorCisjZGVmaW5lICAgICAgICBTUEkyX0RSVl9OQU1FX0xFTiAgICAgICAxNQorY2hhciBzcGkyX2Rydl9uYW1lW1NQSTJfRFJWX05BTUVfTEVOXSA9ICJjb21jZXJ0b19zcGkiOworCisvKioKKyogY29tY2VydG9fc3BpX3Byb2JlIC0KKyAqCisgKgorICovCitzdGF0aWMgaW50IF9faW5pdCBjb21jZXJ0b19zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY29tY2VydG9fc3BpICpzcGk7CisJc3RydWN0IHNwaV9hZGFwdGVyICpsYWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIGxlbjsKKworLy8JcHJpbnRrKEtFUk5fSU5GTyAiY29tY2VydG9fc3BpX3Byb2JlKCUjbHgpXG4iLCAodW5zaWduZWQgbG9uZykgcGRldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNvbWNlcnRvX3NwaV9wcm9iZSglI2x4KVwKKwkJCVxucGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ9MHgleFwKKwkJCVxucGRldi0+cmVzb3VyY2VbMF0uZW5kPTB4JXhcCisJCQlcbnBkZXYtPm5hbWU9JXNcCisJCQlcbnBkZXYtPmlkPSVkXG4iLCBfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcpIHBkZXYsIFwKKwkJCXBkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCBwZGV2LT5yZXNvdXJjZVswXS5lbmQsIHBkZXYtPm5hbWUsIHBkZXYtPmlkKTsKKworCisJc3BpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvbWNlcnRvX3NwaSksIEdGUF9LRVJORUwpOworCWlmIChzcGkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICJjb21jZXJ0b19zcGk6IGVycm9yIGFsbG9jYXRpbmcgbWVtb3J5Iik7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlsYWRhcHRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcGlfYWRhcHRlciksIEdGUF9LRVJORUwpOworCWlmIChsYWRhcHRlciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBFcnJvciBhbGxvY2F0aW5nIG1lbW9yeTogbGFkYXB0ZXI9MHgleCIsIF9fZnVuY19fLFwKKwkJCQkodW5zaWduZWQgaW50KWxhZGFwdGVyKTsKKwkJZ290byBlcnIxOworCX0KKworCWJhc2UgPSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwlsZW4gPSBwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDE7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihiYXNlLCBsZW4sIENPTUNFUlRPX1NQSV9EUklWRVJfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29tY2VydG9fc3BpOiBlcnJvciByZXF1ZXN0aW5nIG1lbW9yeSByZWdpb24gJSNseCAtICUjbHgiLCBiYXNlLCBiYXNlICsgbGVuKTsKKwkJZ290byBlcnIyOworCX0KKworCS8qIGlvLXJlbWFwZWQgaW4gYXJjaC9hcm0vbW0uYyAqLworCWlmKHBkZXYtPmlkID09IDApCisJCXNwaS0+bWVtYmFzZSA9IEFQQl9WQUREUihwZGV2LT5yZXNvdXJjZVswXS5zdGFydCk7CisJZWxzZQorCQlpZihwZGV2LT5pZCA9PSAxKQorCQkJc3BpLT5tZW1iYXNlID0gQVhJX1ZBRERSKHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0KTsKKwkJZWxzZQorCQl7CisJCQlwcmludGsgKEtFUk5fSU5GTyAiJXM6IE5vIHN1cHBvcnQgZm9yIHBkZXYtPmlkID0gJWRcbiIsXAorCQkJCQlfX2Z1bmNfXywgcGRldi0+aWQpOworCQkJZ290byBlcnIzOworCQl9CisKKwlwcmludGsgKEtFUk5fSU5GTyAiJXM6IHBkZXYtPmlkPSVkIHNwaS0+bWVtYmFzZT0weCV4XG4iLCBfX2Z1bmNfXyxcCisJCQlwZGV2LT5pZCwgKHVuc2lnbmVkIGludClzcGktPm1lbWJhc2UpOworCS8vc3BpLT5tZW1iYXNlID0gaW9yZW1hcChwZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgbGVuKTsKKwlzcGktPmlycSA9IHBkZXYtPnJlc291cmNlWzFdLnN0YXJ0OworCisJLy9wcmF0YXBjIHB3cl9tZ210X2Nsa19yZXN0b3JlKENPTVBPTkVOVF9TUEkpOworCisJY29tY2VydG9fc3BpX2h3X2luaXQoc3BpKTsKKyNpZiAwCisJaWYgKHJlcXVlc3RfaXJxKHNwaS0+aXJxLCBjb21jZXJ0b19zcGlfaXJxX2hhbmRsZXIsIFNBX1NISVJRLCBDT01DRVJUT19TUElfRFJJVkVSX05BTUUsIHNwaSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY29tY2VydG9fc3BpOiBlcnJvciByZXF1ZXN0aW5nIGlycSAlZFxuIiwgSVJRX1NQSSk7CisJCWdvdG8gZXJyMjsKKwl9CisjZW5kaWYKKwlzcGktPmFkYXB0ZXIgPSBsYWRhcHRlcjsKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwlsYWRhcHRlci0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisjZW5kaWYKKwlsYWRhcHRlci0+bmFtZSA9IHNwaTJfZHJ2X25hbWU7CisJbGFkYXB0ZXItPmRvX3RyYW5zZmVyID0gY29tY2VydG9fc3BpX2RvX3RyYW5zZmVyOworCWxhZGFwdGVyLT5kYXRhID0gc3BpOworCWxhZGFwdGVyLT5jYXBzLm1heF9zY19yYXRlID0gQ09NQ0VSVE9fREVGQVVMVEFYSUNMSyAvIDI7CisJbGFkYXB0ZXItPmNhcHMubWluX3NjX3JhdGUgPSBDT01DRVJUT19ERUZBVUxUQVhJQ0xLIC8gMHhmZmZmOworCWxhZGFwdGVyLT5jYXBzLm1heF9mcyA9IDE2OworCWxhZGFwdGVyLT5jYXBzLm1pbl9mcyA9IDQ7CisJbGFkYXB0ZXItPmNhcHMubWF4X25mcmFtZSA9IDB4ZmZmZjsKKwlsYWRhcHRlci0+Y2Fwcy5taW5fbmZyYW1lID0gMTsKKwlsYWRhcHRlci0+Y2Fwcy5jc19tc2sgPSAweGY7CisJbGFkYXB0ZXItPmJ1c19udW0gPSBwZGV2LT5pZDsKKworCXByaW50ayAoIiVzOiBsYWRhcHRlci0+YnVzX251bT0weCV4XG4iLCBfX2Z1bmNfXyxcCisJCQlsYWRhcHRlci0+YnVzX251bSk7CisKKwlpZiAoc3BpX2FkZF9hZGFwdGVyKGxhZGFwdGVyKSkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczplcnJvciBhZGRpbmcgYWRhcHRlclxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjM7CisJfQorCisJc3BpLT5jbG9ja19yYXRlID0gQ09NQ0VSVE9fREVGQVVMVEFYSUNMSzsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzcGkpOworCisJcmV0dXJuIDA7CisKK2VycjM6CisjaWYgMAorCWZyZWVfaXJxKHNwaS0+aXJxLCBzcGkpOworCisgICAgICBlcnIyOgorI2VuZGlmCisJcmVsZWFzZV9tZW1fcmVnaW9uKGJhc2UsIGxlbik7CitlcnIyOgorCWtmcmVlKGxhZGFwdGVyKTsKKworZXJyMToKKwlrZnJlZShzcGkpOworCisgICAgICBlcnIwOgorCXJldHVybiAtMTsKK30KKworLyoqCisgKiBjb21jZXJ0b19zcGlfcmVtb3ZlIC0KKyAqCisgKgorICovCitzdGF0aWMgaW50IGNvbWNlcnRvX3NwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY29tY2VydG9fc3BpICpzcGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGJhc2UsIGxlbjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJc3BpX2RlbF9hZGFwdGVyKHNwaS0+YWRhcHRlcik7CisKKwljb21jZXJ0b19zcGlfaHdfcmVzZXQoc3BpKTsKKworCS8vcHJhdGFwYyBwd3JfbWdtdF9jbGtfZG93bihDT01QT05FTlRfU1BJKTsKKworLy8gICAgICBmcmVlX2lycShzcGktPmlycSwgc3BpKTsKKworCWJhc2UgPSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKKwlsZW4gPSBwZGV2LT5yZXNvdXJjZVswXS5lbmQgLSBwZGV2LT5yZXNvdXJjZVswXS5zdGFydCArIDE7CisKKwlyZWxlYXNlX21lbV9yZWdpb24oYmFzZSwgbGVuKTsKKworCWtmcmVlKHNwaS0+YWRhcHRlcik7CisJa2ZyZWUoc3BpKTsKKworCXJldHVybiAwOworfQorCisvKiBGSVhNRTogIHdlIGFyZSBub3Qgc3VwcG9ydGluZyBQb3dlciBtYW5hZ2VtZW50IGluIFNQSS0yIGRyaXZlciAqLworI2lmIDAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgc3BpX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWludCByZXQ7CisJc3RydWN0IHNwaV9jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCAqX247CisJc3RydWN0IGNvbWNlcnRvX3NwaSAqc3BpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RhdGUuZXZlbnQgPSBQTV9FVkVOVF9TVVNQRU5EOworCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVtLCBfbiwgJnNwaS0+YWRhcHRlci0+Y2xpZW50cykgeworCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBzcGlfY2xpZW50LCBsaXN0KTsKKwkJaWYoY2xpZW50LT5kcml2ZXItPnN1c3BlbmQgIT0gTlVMTCkKKwkJCXJldCA9IGNsaWVudC0+ZHJpdmVyLT5zdXNwZW5kKGNsaWVudCxzdGF0ZSk7CisJCX0KKworCWlmKHJldCA9PSAwKQorCQlwd3JfbWdtdF9jbGtfZG93bihDT01QT05FTlRfU1BJKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sICpfbjsKKwlzdHJ1Y3QgY29tY2VydG9fc3BpICpzcGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwkKKwlwd3JfbWdtdF9jbGtfcmVzdG9yZShDT01QT05FTlRfU1BJKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVtLCBfbiwgJnNwaS0+YWRhcHRlci0+Y2xpZW50cykgeworCQljbGllbnQgPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBzcGlfY2xpZW50LCBsaXN0KTsKKwkJaWYoY2xpZW50LT5kcml2ZXItPnJlc3VtZSAhPSBOVUxMKQorCQkJY2xpZW50LT5kcml2ZXItPnJlc3VtZShjbGllbnQpOworCQl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNvbWNlcnRvX3NwaV9kcml2ZXIgPSB7CisJLnByb2JlID0gY29tY2VydG9fc3BpX3Byb2JlLAorCS5yZW1vdmUgPSBjb21jZXJ0b19zcGlfcmVtb3ZlLAorI2lmIDAKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IHNwaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gc3BpX3Jlc3VtZSwKKyNlbmRpZgorI2VuZGlmCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiY29tY2VydG9fc3BpIiwKKwl9LAorfTsKKworLyoqCisgKiBjb21jZXJ0b19zcGlfaW5pdCAtCisgKgorICoKKyAqLworc3RhdGljIGludCBfX2luaXQgY29tY2VydG9fc3BpX2luaXQodm9pZCkKK3sKKy8vCXByaW50ayhLRVJOX0lORk8gImNvbWNlcnRvX3NwaV9pbml0KClcbiIpOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY29tY2VydG9fc3BpX2RyaXZlcik7Cit9CisKKy8qKgorICogY29tY2VydG9fc3BpX2V4aXQgLQorICoKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBjb21jZXJ0b19zcGlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjb21jZXJ0b19zcGlfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21jZXJ0byBTUEkgYnVzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChjb21jZXJ0b19zcGlfaW5pdCk7Cittb2R1bGVfZXhpdChjb21jZXJ0b19zcGlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaTIvYnVzc2VzL2NvbWNlcnRvX3NwaS5oIGIvZHJpdmVycy9zcGkyL2J1c3Nlcy9jb21jZXJ0b19zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGVmNmMyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3BpMi9idXNzZXMvY29tY2VydG9fc3BpLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL3NwaTIvYnVzc2VzL2NvbWNlcnRvX3NwaS5oCisgKgorICogIENvcHlyaWdodCAoQykgTWluZHNwZWVkIFRlY2hub2xvZ2llcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaWZuZGVmIF9DT01DRVJUT19TUElfSAorI2RlZmluZSBfQ09NQ0VSVE9fU1BJX0gKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkyL3NwaS5oPgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgeworCWNoYXIgICAgICAgICAgICAqbmFtZTsKKwl1MzIgICAgICAgICAgICAgaWQ7CisJdTMyICAgICAgICAgICAgIG51bV9yZXNvdXJjZXM7CisJc3RydWN0IHJlc291cmNlICpyZXNvdXJjZTsKKworCXVuc2lnbmVkIGxvbmcgZGF0YTsKK307CisjZW5kaWYKKworI2RlZmluZSBDT01DRVJUT19TUElfRFJJVkVSX05BTUUJIkNvbWNlcnRvIFNQSSIKKworCisjZGVmaW5lIENPTUNFUlRPX1NQSV9DVFJMUjAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIENPTUNFUlRPX1NQSV9DVFJMUjEgICAgICAgICAgICAgICAweDA0CisjZGVmaW5lIENPTUNFUlRPX1NQSV9TU0lFTlIgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIENPTUNFUlRPX1NQSV9NV0NSICAgICAgICAgICAgICAgICAweDBDCisjZGVmaW5lIENPTUNFUlRPX1NQSV9TRVIgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIENPTUNFUlRPX1NQSV9CQVVEUiAgICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIENPTUNFUlRPX1NQSV9UWEZUTFIgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIENPTUNFUlRPX1NQSV9SWEZUTFIgICAgICAgICAgICAgICAweDFDCisjZGVmaW5lIENPTUNFUlRPX1NQSV9UWEZMUiAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIENPTUNFUlRPX1NQSV9SWEZMUiAgICAgICAgICAgICAgICAweDI0CisjZGVmaW5lIENPTUNFUlRPX1NQSV9TUiAgICAgICAgICAgICAgICAgICAweDI4CisjZGVmaW5lIENPTUNFUlRPX1NQSV9JTVIgICAgICAgICAgICAgICAgICAweDJDCisjZGVmaW5lIENPTUNFUlRPX1NQSV9JU1IgICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lIENPTUNFUlRPX1NQSV9SSVNSICAgICAgICAgICAgICAgICAweDM0CisjZGVmaW5lIENPTUNFUlRPX1NQSV9UWE9JQ1IgICAgICAgICAgICAgICAweDM4CisjZGVmaW5lIENPTUNFUlRPX1NQSV9SWE9JQ1IgICAgICAgICAgICAgICAweDNDCisjZGVmaW5lIENPTUNFUlRPX1NQSV9SWFVJQ1IgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lIENPTUNFUlRPX1NQSV9NU1RJQ1IgICAgICAgICAgICAgICAweDQ0CisjZGVmaW5lIENPTUNFUlRPX1NQSV9JQ1IgICAgICAgICAgICAgICAgICAweDQ4CisjZGVmaW5lIENPTUNFUlRPX1NQSV9JRFIgICAgICAgICAgICAgICAgICAweDU4CisjZGVmaW5lIENPTUNFUlRPX1NQSV9EUiAgICAgICAgICAgICAgICAgICAweDYwCisKKworLyogU1IgLSBzdGF0dXMgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBCVVNZCQkoMTw8MCkJLyogU1NJIGJ1c3kgZmxhZywgc2VyaWFsIHRyYW5zZmVyIGluIHByb2dyZXNzICovCisjZGVmaW5lIFRGTkYJCSgxPDwxKQkvKiBUcmFuc21pdCBGSUZPIG5vdCBmdWxsICovCisjZGVmaW5lIFRGRQkJKDE8PDIpCS8qIFRyYW5zbWl0IEZJRk8gZW1wdHkgKi8KKyNkZWZpbmUgUkZORQkJKDE8PDMpCS8qIFJlY2VpdmUgRklGTyBub3QgZW1wdHkgKi8KKyNkZWZpbmUgUkZGCQkoMTw8NCkJLyogUmVjZWl2ZSBGSUZPIGZ1bGwgKi8KKyNkZWZpbmUgVFhFCQkoMTw8NSkJLyogVHJhbnNtaXNzaW9uIGVycm9yICovCisjZGVmaW5lIERDT0wJCSgxPDw2KQkvKiBEYXRhIGNvbGxpc2lvbiBlcnJvciAqLworCisvKiBJbnRlcnJ1cHQgc3RhdHVzIGFmdGVyIGJlaW5nIG1hc2tlZCAqLworI2RlZmluZSBUWEVJUwkJKDE8PDApCS8qIFRyYW5zbWl0IEZJRk8gZW1wdHkgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBUWE9JUwkJKDE8PDEpCS8qIFRyYW5zbWl0IEZJRk8gb3ZlcmZsb3cgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSWFVJUwkJKDE8PDIpCS8qIFJlY2VpdmUgRklGTyB1bmRlcmZsb3cgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSWE9JUwkJKDE8PDMpCS8qIFJlY2VpdmUgRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFJYRklTCQkoMTw8NCkJLyogUmVjZWl2ZSBGSUZPIGZ1bGwgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBNU1RJUwkJKDE8PDUpCS8qIE11bHRpLU1hc3RlciBjb250ZW50aW9uIGludGVycnVwdCBzdGF0dXMgKi8KKworLyogSW50ZXJydXB0IHN0YXR1cyBiZWZvcmUgYmVpbmcgbWFza2VkICovCisjZGVmaW5lIFRYRUlSCQkoMTw8MCkJLyogVHJhbnNtaXQgRklGTyBlbXB0eSBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFRYT0lSCQkoMTw8MSkJLyogVHJhbnNtaXQgRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFJYVUlSCQkoMTw8MikJLyogUmVjZWl2ZSBGSUZPIHVuZGVyZmxvdyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFJYT0lSCQkoMTw8MykJLyogUmVjZWl2ZSBGSUZPIG92ZXJmbG93IGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgUlhGSVIJCSgxPDw0KQkvKiBSZWNlaXZlIEZJRk8gZnVsbCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIE1TVElSCQkoMTw8NSkJLyogTXVsdGktTWFzdGVyIGNvbnRlbnRpb24gaW50ZXJydXB0IHN0YXR1cyAqLworCisKKy8qIEludGVycnVwdCBtYXNrIHJlZ2lzdGVyICovCisjZGVmaW5lIFRYRUlNCQkoMTw8MCkJLyogVHJhbnNtaXQgRklGTyBlbXB0eSBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFRYT0lNCQkoMTw8MSkJLyogVHJhbnNtaXQgRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFJYVUlNCQkoMTw8MikJLyogUmVjZWl2ZSBGSUZPIHVuZGVyZmxvdyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFJYT0lNCQkoMTw8MykJLyogUmVjZWl2ZSBGSUZPIG92ZXJmbG93IGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgUlhGSU0JCSgxPDw0KQkvKiBSZWNlaXZlIEZJRk8gZnVsbCBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIE1TVElNCQkoMTw8NSkJLyogTXVsdGktTWFzdGVyIGNvbnRlbnRpb24gaW50ZXJydXB0IHN0YXR1cyAqLworCitzdHJ1Y3QgY29tY2VydG9fc3BpCit7CisJc3RydWN0IHNwaV9hZGFwdGVyICphZGFwdGVyOworCXVuc2lnbmVkIGxvbmcgbWVtYmFzZTsKKwlpbnQgaXJxOworCXVuc2lnbmVkIGxvbmcgY2xvY2tfcmF0ZTsKK307CisKKworI2VuZGlmIC8qIF9DT01DRVJUT19TUElfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkyL3NwaS1jb3JlLmMgYi9kcml2ZXJzL3NwaTIvc3BpLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjE3YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zcGkyL3NwaS1jb3JlLmMKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisgKiAgbGludXgvZHJpdmVycy9zcGkyL3NwaS1jb3JlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyAKKworI2lmICFkZWZpbmVkIChBVVRPQ09ORl9JTkNMVURFRCkKKyNpZiAwCisJI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkyL3NwaS5oPgorCitzdGF0aWMgTElTVF9IRUFEKHNwaV9hZGFwdGVycyk7CitzdGF0aWMgTElTVF9IRUFEKHNwaV9kcml2ZXJzKTsKKworLyoqCisgKiBzcGlfd3JpdGVfbWVtIC0KKyAqCisgKgorICovCitpbnQgc3BpX3dyaXRlX21lbShzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1OCBmcywgdTggKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRyYW5zZmVyOworCXN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCW1lbXNldCgmdHJhbnNmZXIsIDAsIHNpemVvZiAoc3RydWN0IHNwaV90cmFuc2ZlcikpOworCisJdHJhbnNmZXIuZnMgPSBmczsKKwl0cmFuc2Zlci5tb2RlID0gU1BJX1RSQU5TRkVSX01PREVfV1JJVEVfT05MWTsKKwl0cmFuc2Zlci53YnVmID0gYnVmZmVyOworCXRyYW5zZmVyLndsZW4gPSBsZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCXJjID0gYWRhcHRlci0+ZG9fdHJhbnNmZXIoYWRhcHRlciwgJnRyYW5zZmVyLCAmY2xpZW50LT5jb25maWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCS8qIGRlYXNzZXJ0IHRoZSBjaGlwIHNlbGVjdCBhdCBsZWFzdCBmb3IgdGhpcyBsb25nICovCisJdWRlbGF5ICgxICsgKCgxMDAwMDAwICogY2xpZW50LT5jb25maWcuY3NfZGVsYXkpIC8gY2xpZW50LT5jb25maWcuc2NfcmF0ZSkpOworCisJcmV0dXJuIHJjOworfQorCisKKy8qKgorICogc3BpX3dyaXRlX3NpbmdsZSAtCisgKgorICoKKyAqLworaW50IHNwaV93cml0ZV9zaW5nbGUoc3RydWN0IHNwaV9jbGllbnQgKmNsaWVudCwgdTggZnMsIHUxNiB2YWx1ZSkKK3sKKwlyZXR1cm4gc3BpX3dyaXRlX21lbShjbGllbnQsIGZzLCAodTggKikmdmFsdWUsIDEpOworfQorCisvKioKKyAqIHNwaV93cml0ZW4gLQorICoKKyAqCisgKi8KK2ludCBzcGlfd3JpdGVuKHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQsIHU0IHZhbHVlKQoreworCXJldHVybiBzcGlfd3JpdGVfbWVtKGNsaWVudCwgNCwgKHU4ICopJnZhbHVlLCAxKTsKK30KKworCisvKioKKyAqIHNwaV93cml0ZWIgLQorICoKKyAqCisgKi8KK2ludCBzcGlfd3JpdGViKHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQsIHU4IHZhbHVlKQoreworCXJldHVybiBzcGlfd3JpdGVfbWVtKGNsaWVudCwgOCwgJnZhbHVlLCAxKTsKK30KKworCisvKioKKyAqIHNwaV93cml0ZXcgLQorICoKKyAqCisgKi8KK2ludCBzcGlfd3JpdGV3KHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQsIHUxNiB2YWx1ZSkKK3sKKwlyZXR1cm4gc3BpX3dyaXRlX21lbShjbGllbnQsIDE2LCAodTggKikmdmFsdWUsIDEpOworfQorCisvKioKKyAqIHNwaV9yZWFkX21lbSAtCisgKgorICoKKyAqLworaW50IHNwaV9yZWFkX21lbShzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1OCBmcywgdTggKmJ1ZmZlciwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRyYW5zZmVyOworCXN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCW1lbXNldCgmdHJhbnNmZXIsIDAsIHNpemVvZiAoc3RydWN0IHNwaV90cmFuc2ZlcikpOworCisJdHJhbnNmZXIuZnMgPSBmczsKKwl0cmFuc2Zlci5tb2RlID0gU1BJX1RSQU5TRkVSX01PREVfUkVBRF9PTkxZOworCXRyYW5zZmVyLnJidWYgPSBidWZmZXI7CisJdHJhbnNmZXIucmxlbiA9IGxlbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisJcmMgPSBhZGFwdGVyLT5kb190cmFuc2ZlcihhZGFwdGVyLCAmdHJhbnNmZXIsICZjbGllbnQtPmNvbmZpZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworCisJLyogZGVhc3NlcnQgdGhlIGNoaXAgc2VsZWN0IGF0IGxlYXN0IGZvciB0aGlzIGxvbmcgKi8KKwl1ZGVsYXkgKDEgKyAoKDEwMDAwMDAgKiBjbGllbnQtPmNvbmZpZy5jc19kZWxheSkgLyBjbGllbnQtPmNvbmZpZy5zY19yYXRlKSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoqCisgKiBzcGlfcmVhZF9zaW5nbGUgLQorICoKKyAqCisgKi8KK2ludCBzcGlfcmVhZF9zaW5nbGUoc3RydWN0IHNwaV9jbGllbnQgKmNsaWVudCwgdTggZnMsIHUxNiAqdmFsdWUpCit7CisJcmV0dXJuIHNwaV9yZWFkX21lbShjbGllbnQsIGZzLCAodTggKikgdmFsdWUsIDEpOworfQorCisvKioKKyAqIHNwaV9yZWFkbiAtCisgKgorICoKKyAqLworaW50IHNwaV9yZWFkbihzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1NCAqdmFsdWUpCit7CisJcmV0dXJuIHNwaV9yZWFkX21lbShjbGllbnQsIDQsICh1OCAqKXZhbHVlLCAxKTsKK30KKworCisvKioKKyAqIHNwaV9yZWFkYiAtCisgKgorICoKKyAqLworaW50IHNwaV9yZWFkYihzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1OCAqdmFsdWUpCit7CisJcmV0dXJuIHNwaV9yZWFkX21lbShjbGllbnQsIDgsIHZhbHVlLCAxKTsKK30KKworCisvKioKKyAqIHNwaV9yZWFkdyAtCisgKgorICoKKyAqLworaW50IHNwaV9yZWFkdyhzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1MTYgKnZhbHVlKQoreworCXJldHVybiBzcGlfcmVhZF9tZW0oY2xpZW50LCAxNiwgKHU4ICopdmFsdWUsIDEpOworfQorCisKKy8qKgorICogc3BpX3JlYWRfbWVtIC0KKyAqCisgKgorICovCitpbnQgc3BpX3dyaXRlcmVhZF9tZW0oc3RydWN0IHNwaV9jbGllbnQgKmNsaWVudCwgdTggZnMsIHU4ICpyYnVmZmVyLCBpbnQgcmxlbiwgdTggKndidWZmZXIsIGludCB3bGVuKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgdHJhbnNmZXI7CisJc3RydWN0IHNwaV9hZGFwdGVyICphZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjOworCisJbWVtc2V0KCZ0cmFuc2ZlciwgMCwgc2l6ZW9mIChzdHJ1Y3Qgc3BpX3RyYW5zZmVyKSk7CisKKwl0cmFuc2Zlci5mcyA9IGZzOworCXRyYW5zZmVyLm1vZGUgPSBTUElfVFJBTlNGRVJfTU9ERV9XUklURV9SRUFEOworCXRyYW5zZmVyLnJidWYgPSByYnVmZmVyOworCXRyYW5zZmVyLnJsZW4gPSBybGVuOworCXRyYW5zZmVyLndidWYgPSB3YnVmZmVyOworCXRyYW5zZmVyLndsZW4gPSB3bGVuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKwlyYyA9IGFkYXB0ZXItPmRvX3RyYW5zZmVyKGFkYXB0ZXIsICZ0cmFuc2ZlciwgJmNsaWVudC0+Y29uZmlnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CisKKwkvKiBkZWFzc2VydCB0aGUgY2hpcCBzZWxlY3QgYXQgbGVhc3QgZm9yIHRoaXMgbG9uZyAqLworCXVkZWxheSAoMSArICgoMTAwMDAwMCAqIGNsaWVudC0+Y29uZmlnLmNzX2RlbGF5KSAvIGNsaWVudC0+Y29uZmlnLnNjX3JhdGUpKTsKKworCXJldHVybiByYzsKK30KKy8qKgorICogc3BpX2FkZF9hZGFwdGVyIC0KKyAqCisgKgorICovCitpbnQgc3BpX2FkZF9hZGFwdGVyKHN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc3BpX2RyaXZlciAqZHJpdmVyOworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlwcmludGsoS0VSTl9JTkZPICJTUEkgY29yZTogYWRkIGFkYXB0ZXIgJXNcbiIsIGFkYXB0ZXItPm5hbWUpOworCisjaWZkZWYgX1VTRV9EUklWRVJfTU9ERUxfCisJc3ByaW50ZihhZGFwdGVyLT5kZXYuYnVzX2lkLCAic3BpLSVkIiwgYWRhcHRlci0+bnIpOworCWFkYXB0ZXItPmRldi5kcml2ZXIgPSAmc3BpX2FkYXB0ZXJfZHJpdmVyOworCWFkYXB0ZXItPmRldi5yZWxlYXNlID0gJnNwaV9hZGFwdGVyX2Rldl9yZWxlYXNlOworCWRldmljZV9yZWdpc3RlcigmYWRhcHRlci0+ZGV2KTsKKyNlbmRpZgorCisJbGlzdF9hZGQoJmFkYXB0ZXItPmxpc3QsICZzcGlfYWRhcHRlcnMpOworCUlOSVRfTElTVF9IRUFEKCZhZGFwdGVyLT5jbGllbnRzKTsKKworCS8vYWRhcHRlci0+bG9jayA9IFNQSU5fTE9DS19VTkxPQ0tFRDsKKwkvL0Fib3ZlIG1ldGhvZCBpcyBvYnNvbGV0ZSBhbmQgbmV3IGlzIHVzZWQgYmVsb3cuCisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOyAKKworCWxpc3RfZm9yX2VhY2goaXRlbSwgJnNwaV9kcml2ZXJzKSB7CisJCWRyaXZlciA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IHNwaV9kcml2ZXIsIGxpc3QpOworCQlwcmludGsgKCIlczogTWF0Y2hpbmc6IGFkYXB0ZXItPmJ1c19udW09MHgleCBkcml2ZXItPmJ1c19pZCAweCV4XG4iLCBfX2Z1bmNfXyxcCisJCQkJYWRhcHRlci0+YnVzX251bSwgZHJpdmVyLT5idXNfaWQpOworCQlpZiAoZHJpdmVyLT5idXNfaWQgPT0gYWRhcHRlci0+YnVzX251bSkKKwkJeworCQkJcHJpbnRrICgiJXM6IEZvdW5kIGFkYXB0ZXIgMHgleCBcbiIsIF9fZnVuY19fLCBhZGFwdGVyLT5idXNfbnVtKTsKKwkJCS8qIFdlIGlnbm9yZSB0aGUgcmV0dXJuIGNvZGU7IGlmIGl0IGZhaWxzLCB0b28gYmFkICovCisJCQlkcml2ZXItPmF0dGFjaF9hZGFwdGVyKGFkYXB0ZXIpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3BpX2RlbF9hZGFwdGVyIC0KKyAqCisgKgorICovCitpbnQgc3BpX2RlbF9hZGFwdGVyKHN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sICpfbjsKKworCXByaW50ayhLRVJOX0lORk8gIlNQSSBjb3JlOiBkZWwgYWRhcHRlciAlc1xuIiwgYWRhcHRlci0+bmFtZSk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoaXRlbSwgX24sICZhZGFwdGVyLT5jbGllbnRzKSB7CisJCWNsaWVudCA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IHNwaV9jbGllbnQsIGxpc3QpOworCisJCWlmIChjbGllbnQtPmRyaXZlci0+ZGV0YWNoX2NsaWVudChjbGllbnQpKQorCQkJZ290byBvdXQ7CisJfQorCisJbGlzdF9kZWwoJmFkYXB0ZXItPmxpc3QpOworCisjaWZkZWYgX1VTRV9EUklWRVJfTU9ERUxfCisJZGV2aWNlX3VucmVnaXN0ZXIoJmFkYXB0ZXItPmRldik7CisjZW5kaWYKKworICAgICAgb3V0OgorCXJldHVybiAwOworfQorCisvKioKKyAqIHNwaV9hdHRhY2hfY2xpZW50IC0KKyAqCisgKgorICovCitpbnQgc3BpX2F0dGFjaF9jbGllbnQoc3RydWN0IHNwaV9jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3Qgc3BpX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJc3RydWN0IHNwaV9jbGllbnRfY29uZmlnICpjb25maWcgPSAmY2xpZW50LT5jb25maWc7CisJc3RydWN0IHNwaV9hZGFwdGVyX2NhcHMgKmNhcHMgPSAmYWRhcHRlci0+Y2FwczsKKworCXByaW50ayhLRVJOX0lORk8gIlNQSSBjb3JlOiBhdHRhY2ggY2xpZW50IHRvIGFkYXB0ZXIgJXNcbiIsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CisKKwlpZiAoKGNvbmZpZy0+c2NfcmF0ZSA+PSBjYXBzLT5tYXhfc2NfcmF0ZSkgfHwgKGNvbmZpZy0+c2NfcmF0ZSA8IGNhcHMtPm1pbl9zY19yYXRlKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJTUEkgY29yZTogY2xpZW50IHNlcmlhbCBjbG9jayByYXRlICVsZCBvdXQgb2YgcmFuZ2UgWyVsZCwgJWxkXSIsIGNvbmZpZy0+c2NfcmF0ZSwKKwkJICAgICAgIGNhcHMtPm1pbl9zY19yYXRlLCBjYXBzLT5tYXhfc2NfcmF0ZSk7CisKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGNvbmZpZy0+Y3NfbXNrICYgfmNhcHMtPmNzX21zaykgeworCQlwcmludGsoS0VSTl9JTkZPICJTUEkgY29yZTogY2xpZW50IGNzIG1hc2sgJSN4IG5vdCBzdXBwb3J0ZWQgJSN4IiwgY29uZmlnLT5jc19tc2ssCisJCSAgICAgICBjYXBzLT5jc19tc2spOworCisJCWdvdG8gZXJyOworCX0KKworI2lmZGVmIF9VU0VfRFJJVkVSX01PREVMXworCWRldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXZpY2UpOworI2VuZGlmCisJbGlzdF9hZGQoJmNsaWVudC0+bGlzdCwgJmFkYXB0ZXItPmNsaWVudHMpOworCisJcmV0dXJuIDA7CisKKyAgICAgIGVycjoKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogc3BpX2RldHRhY2hfY2xpZW50IC0KKyAqCisgKgorICovCitpbnQgc3BpX2RldGFjaF9jbGllbnQoc3RydWN0IHNwaV9jbGllbnQgKmNsaWVudCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJTUEkgY29yZTogY2xpZW50IGRldGFjaCBmcm9tIGFkYXB0ZXIgJXNcbiIsIGNsaWVudC0+YWRhcHRlci0+bmFtZSk7CisKKwlsaXN0X2RlbCgmY2xpZW50LT5saXN0KTsKKworI2lmZGVmIF9VU0VfRFJJVkVSX01PREVMXworCWRldmljZV91bnJlZ2lzdGVyKCZjbGllbnQtPmRldik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzcGlfYWRkX2RyaXZlciAtCisgKgorICoKKyAqLworaW50IHNwaV9hZGRfZHJpdmVyKHN0cnVjdCBzcGlfZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IHNwaV9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlwcmludGsoS0VSTl9JTkZPICJTUEkgY29yZTogYWRkIGRyaXZlciAlc1xuIiwgZHJpdmVyLT5uYW1lKTsKKworI2lmZGVmIF9VU0VfRFJJVkVSX01PREVMXworCWRyaXZlci0+ZHJpdmVyLm5hbWUgPSBkcml2ZXItPm5hbWU7CisJZHJpdmVyLT5kcml2ZXIuYnVzID0gJnNwaTJfYnVzX3R5cGU7CisJZHJpdmVyLT5kcml2ZXIucHJvYmUgPSBzcGlfZGV2aWNlX3Byb2JlOworCWRyaXZlci0+ZHJpdmVyLnJlbW92ZSA9IHNwaV9kZXZpY2VfcmVtb3ZlOworCisJaWYgKGRyaXZlcl9yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpKQorCQlnb3RvIGVycjsKKyNlbmRpZgorCWxpc3RfYWRkKCZkcml2ZXItPmxpc3QsICZzcGlfZHJpdmVycyk7CisKKwlsaXN0X2Zvcl9lYWNoKGl0ZW0sICZzcGlfYWRhcHRlcnMpIHsKKwkJYWRhcHRlciA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IHNwaV9hZGFwdGVyLCBsaXN0KTsKKwkJcHJpbnRrICgiJXM6IENoZWNraW5nOiBhZGFwdGVyIGJ1c19udW09MHgleCBkcml2ZXIgYnVzX2lkPTB4JXhcbiIsXAorCQkJCV9fZnVuY19fLCBhZGFwdGVyLT5idXNfbnVtLCBkcml2ZXItPmJ1c19pZCk7CisJCWlmIChkcml2ZXItPmJ1c19pZCA9PSBhZGFwdGVyLT5idXNfbnVtKQorCQl7CisJCQlwcmludGsgKCIlczogRm91bmQgYWRhcHRlciAweCV4XG4iLCBfX2Z1bmNfXywgYWRhcHRlci0+YnVzX251bSk7CisJCQlkcml2ZXItPmF0dGFjaF9hZGFwdGVyKGFkYXB0ZXIpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworI2lmZGVmIF9VU0VfRFJJVkVSX01PREVMXworICAgICAgZXJyOgorCXJldHVybiAtMTsKKyNlbmRpZgorfQorCisvKioKKyAqIHNwaV9kZWxfZHJpdmVyIC0KKyAqCisgKgorICovCitpbnQgc3BpX2RlbF9kcml2ZXIoc3RydWN0IHNwaV9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtMSwgKml0ZW0yLCAqX247CisJc3RydWN0IHNwaV9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJTUEkgY29yZTogZGVsZXRlIGRyaXZlciAlc1xuIiwgZHJpdmVyLT5uYW1lKTsKKworCWxpc3RfZm9yX2VhY2goaXRlbTEsICZzcGlfYWRhcHRlcnMpIHsKKwkJYWRhcHRlciA9IGxpc3RfZW50cnkoaXRlbTEsIHN0cnVjdCBzcGlfYWRhcHRlciwgbGlzdCk7CisKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZW0yLCBfbiwgJmFkYXB0ZXItPmNsaWVudHMpIHsKKwkJCWNsaWVudCA9IGxpc3RfZW50cnkoaXRlbTIsIHN0cnVjdCBzcGlfY2xpZW50LCBsaXN0KTsKKwkJCWlmIChjbGllbnQtPmRyaXZlciAhPSBkcml2ZXIpCisJCQkJY29udGludWU7CisKKwkJCWlmIChkcml2ZXItPmRldGFjaF9jbGllbnQoY2xpZW50KSkKKwkJCQlnb3RvIGVycjsKKwkJfQorCX0KKyNpZmRlZiBfVVNFX0RSSVZFUl9NT0RFTF8KKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOworI2VuZGlmCisJbGlzdF9kZWwoJmRyaXZlci0+bGlzdCk7CisKKwlyZXR1cm4gMDsKKworICAgICAgZXJyOgorCXJldHVybiAtMTsKK30KKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMCkKKy8qIG1hdGNoIGFsd2F5cyBzdWNjZWVkcywgYXMgd2Ugd2FudCB0aGUgcHJvYmUoKSB0byB0ZWxsIGlmIHdlIHJlYWxseSBhY2NlcHQgdGhpcyBtYXRjaCAqLworc3RhdGljIGludCBzcGkyX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBidXNfdHlwZSBzcGkyX2J1c190eXBlID0geworCS5uYW1lID0gInNwaTIiLAorCS5tYXRjaCA9IHNwaTJfZGV2aWNlX21hdGNoLAorfTsKKworLyoqCisgKiBzcGlfZHJpdmVyX2luaXQgLQorICoKKyAqCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNwaV9kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlwcmludGsoS0VSTl9JTkZPICJTUEkgY29yZTogbG9hZGVkIHZlcnNpb24gMC4yXG4iKTsKKworCXJldHZhbCA9IGJ1c19yZWdpc3Rlcigmc3BpMl9idXNfdHlwZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnIwOworCisjaWZkZWYgX1VTRV9EUklWRVJfTU9ERUxfCisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyKCZzcGlfZHJpdmVyKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjE7CisjZW5kaWYKKworCXJldHVybiAwOworCisjaWZkZWYgX1VTRV9EUklWRVJfTU9ERUxfCisgIGVycjE6CisJYnVzX3VucmVnaXN0ZXIoJnNwaTJfYnVzX3R5cGUpOworI2VuZGlmCisKKyAgZXJyMDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHNwaV9kcml2ZXJfZXhpdCAtCisgKgorICoKKyAqLworc3RhdGljIHZvaWQgX19leGl0IHNwaV9kcml2ZXJfZXhpdCh2b2lkKQoreworI2lmZGVmIF9VU0VfRFJJVkVSX01PREVMXworCWRyaXZlcl91bnJlZ2lzdGVyKCZzcGlfZHJpdmVyKTsKKyNlbmRpZgorCWJ1c191bnJlZ2lzdGVyKCZzcGkyX2J1c190eXBlKTsKK30KKworc3Vic3lzX2luaXRjYWxsKHNwaV9kcml2ZXJfaW5pdCk7CisjZWxzZSAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNwaV9kcml2ZXJfaW5pdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlNQSSBjb3JlOiBsb2FkZWQgdmVyc2lvbiAwLjJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzcGlfZHJpdmVyX2V4aXQodm9pZCkKK3sKKworfQorCittb2R1bGVfaW5pdChzcGlfZHJpdmVyX2luaXQpOworCisjZW5kaWYgLyogTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSAqLworCittb2R1bGVfZXhpdChzcGlfZHJpdmVyX2V4aXQpOworCitFWFBPUlRfU1lNQk9MKHNwaV9hZGRfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0woc3BpX2RlbF9kcml2ZXIpOworCitFWFBPUlRfU1lNQk9MKHNwaV9hZGRfYWRhcHRlcik7CitFWFBPUlRfU1lNQk9MKHNwaV9kZWxfYWRhcHRlcik7CisKK0VYUE9SVF9TWU1CT0woc3BpX2F0dGFjaF9jbGllbnQpOworRVhQT1JUX1NZTUJPTChzcGlfZGV0YWNoX2NsaWVudCk7CisKK0VYUE9SVF9TWU1CT0woc3BpX3dyaXRlX3NpbmdsZSk7CitFWFBPUlRfU1lNQk9MKHNwaV93cml0ZV9tZW0pOworCitFWFBPUlRfU1lNQk9MKHNwaV93cml0ZW4pOworRVhQT1JUX1NZTUJPTChzcGlfd3JpdGViKTsKK0VYUE9SVF9TWU1CT0woc3BpX3dyaXRldyk7CisKK0VYUE9SVF9TWU1CT0woc3BpX3JlYWRfbWVtKTsKK0VYUE9SVF9TWU1CT0woc3BpX3JlYWRfc2luZ2xlKTsKK0VYUE9SVF9TWU1CT0woc3BpX3dyaXRlcmVhZF9tZW0pOworCitFWFBPUlRfU1lNQk9MKHNwaV9yZWFkbik7CitFWFBPUlRfU1lNQk9MKHNwaV9yZWFkYik7CitFWFBPUlRfU1lNQk9MKHNwaV9yZWFkdyk7CisKK01PRFVMRV9BVVRIT1IoIlJ1aSBTb3VzYSA8cnVpLnNvdXNhQG1pbmRzcGVlZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNQSSBjb3JlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9LY29uZmlnIGIvZHJpdmVycy90dHkvS2NvbmZpZwppbmRleCA4MzBjZDYyLi5iZmI1NDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdHR5L0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgVlQKIAlib29sICJWaXJ0dWFsIHRlcm1pbmFsIiBpZiBFWFBFUlQKLQlkZXBlbmRzIG9uICFTMzkwICYmICFVTUwKKwlkZXBlbmRzIG9uICFTMzkwICYmICFVTUwgJiYgIUFSQ0hfQ09NQ0VSVE8KIAlzZWxlY3QgSU5QVVQKIAlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAuYwppbmRleCA3MDU4NWI2Li5hZDkwMDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLmMKQEAgLTQ4LDYgKzQ4LDEyIEBACiAjaW5jbHVkZSAic3VuY29yZS5oIgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfQVJDSF9NODZYWFgKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CitzdGF0aWMgc3RydWN0IGNsayAqdWFydF9jbGs7ICAgICAvKlVBUlQgQ2xvY2soRFVTKSBkZXBlbmRzIHVwb24gdGhlIEFYSSovCisjZW5kaWYgCisKIC8qCiAgKiBDb25maWd1cmF0aW9uOgogICogICBzaGFyZV9pcnFzIC0gd2hldGhlciB3ZSBwYXNzIElSUUZfU0hBUkVEIHRvIHJlcXVlc3RfaXJxKCkuICBUaGlzIG9wdGlvbgpAQCAtNDIwLDEwICs0MjYsMzYgQEAKIAlyZXR1cm4gcmVhZGIocC0+bWVtYmFzZSArIG9mZnNldCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9NODZYWFgKK3ZvaWQgc2VyaWFsODI1MF9jbGVhcl9hbmRfcmVpbml0X2ZpZm9zKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcCk7CisKK3ZvaWQgZHc4MjUwX2ZvcmNlX2lkbGUoc3RydWN0IHVhcnRfcG9ydCAqcCkKK3sKKwlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCwgcG9ydCk7CisKKwlzZXJpYWw4MjUwX2NsZWFyX2FuZF9yZWluaXRfZmlmb3ModXApOworCSh2b2lkKXAtPnNlcmlhbF9pbihwLCBVQVJUX1JYKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBtZW1fc2VyaWFsX291dChzdHJ1Y3QgdWFydF9wb3J0ICpwLCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCiB7Ci0Jb2Zmc2V0ID0gbWFwXzgyNTBfb3V0X3JlZyhwLCBvZmZzZXQpIDw8IHAtPnJlZ3NoaWZ0OwotCXdyaXRlYih2YWx1ZSwgcC0+bWVtYmFzZSArIG9mZnNldCk7CisJaW50IG9mZnNldDEgPSBtYXBfODI1MF9vdXRfcmVnKHAsIG9mZnNldCkgPDwgcC0+cmVnc2hpZnQ7CisJd3JpdGViKHZhbHVlLCBwLT5tZW1iYXNlICsgb2Zmc2V0MSk7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9NODZYWFgKKwkvKiBNYWtlIHN1cmUgTENSIHdyaXRlIHdhc24ndCBpZ25vcmVkICovCisJaWYgKG9mZnNldCA9PSBVQVJUX0xDUikgeworCQlpbnQgdHJpZXMgPSAxMDAwOworCQl3aGlsZSAodHJpZXMtLSkgeworCQkJaWYgKHZhbHVlID09IHAtPnNlcmlhbF9pbihwLCBVQVJUX0xDUikpCisJCQkJcmV0dXJuOworCQkJZHc4MjUwX2ZvcmNlX2lkbGUocCk7CisJCQl3cml0ZWIodmFsdWUsIHAtPm1lbWJhc2UgKyBvZmZzZXQxKTsKKwkJfQorCQlkZXZfZXJyKHAtPmRldiwgIkNvdWxkbid0IHNldCBMQ1IgdG8gJWRcbiIsIHZhbHVlKTsKKwl9CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgbWVtMzJfc2VyaWFsX291dChzdHJ1Y3QgdWFydF9wb3J0ICpwLCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCkBAIC02MTYsNiArNjQ4LDE3IEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX0FSQ0hfTTg2WFhYCit2b2lkIHNlcmlhbDgyNTBfY2xlYXJfYW5kX3JlaW5pdF9maWZvcyhzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApCit7CisgICAgICAgICB1bnNpZ25lZCBjaGFyIGZjcjsKKworICAgICAgICAgc2VyaWFsODI1MF9jbGVhcl9maWZvcyhwKTsKKyAgICAgICAgIGZjciA9IHVhcnRfY29uZmlnW3AtPnBvcnQudHlwZV0uZmNyOworICAgICAgICAgc2VyaWFsX291dHAocCwgVUFSVF9GQ1IsIGZjcik7Cit9CisjZW5kaWYKKwogLyoKICAqIElFUiBzbGVlcCBzdXBwb3J0LiAgVUFSVHMgd2hpY2ggaGF2ZSBFRlJzIG5lZWQgdGhlICJleHRlbmRlZAogICogY2FwYWJpbGl0eSIgYml0IGVuYWJsZWQuICBOb3RlIHRoYXQgb24gWFIxNkM4NTBzLCB3ZSBuZWVkIHRvCkBAIC0yMzQyLDExICsyMzg1LDE3IEBACiAJICogaGF2ZSBzdWZmaWNpZW50IEZJRk8gZW50cmllcyBmb3IgdGhlIGxhdGVuY3kgb2YgdGhlIHJlbW90ZQogCSAqIFVBUlQgdG8gcmVzcG9uZC4gIElPVywgYXQgbGVhc3QgMzIgYnl0ZXMgb2YgRklGTy4KIAkgKi8KKyNpZmRlZiBDT05GSUdfQVJDSF9NODZYWFgKKwl1cC0+bWNyICY9IH5VQVJUX01DUl9BRkU7CisgICAgICAgIGlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKKyAgICAgICAgICAgICAgIHVwLT5tY3IgfD0gVUFSVF9NQ1JfQUZFOworI2Vsc2UKIAlpZiAodXAtPmNhcGFiaWxpdGllcyAmIFVBUlRfQ0FQX0FGRSAmJiB1cC0+cG9ydC5maWZvc2l6ZSA+PSAzMikgewogCQl1cC0+bWNyICY9IH5VQVJUX01DUl9BRkU7CiAJCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKIAkJCXVwLT5tY3IgfD0gVUFSVF9NQ1JfQUZFOwogCX0KKyNlbmRpZgogCiAJLyoKIAkgKiBPaywgd2UncmUgbm93IGNoYW5naW5nIHRoZSBwb3J0IHN0YXRlLiAgRG8gaXQgd2l0aApAQCAtMzA1NSw2ICszMTA0LDMxIEBACiAJc3RydWN0IHVhcnRfcG9ydCBwb3J0OwogCWludCByZXQsIGksIGlycWZsYWcgPSAwOwogCisjaWZkZWYgQ09ORklHX0FSQ0hfTTg2WFhYCisJdW5zaWduZWQgbG9uZyB1YXJ0X3JhdGU7CisKKwkvKiBUYWtlIHRoZSBGYXN0LVVBUlQgZGV2aWNlIE91dC1PZi1SZXNldCovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9GQVNUX1VBUlQsMCk7CisKKwkvKiBHZXQgdGhlIEZBU1QtVUFSVCBjbGsgc3RydWN0dXJlIGZyb20gRFVTICovCQorCXVhcnRfY2xrID0gY2xrX2dldChOVUxMLCJEVVMiKTsKKwkKKwlpZiAoSVNfRVJSKHVhcnRfY2xrKSkgeworCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IFVBUlQgY2xvY2s6ICVsZFxuIixfX2Z1bmNfXyxQVFJfRVJSKHVhcnRfY2xrKSk7CisJCXJldHVybiBQVFJfRVJSKHVhcnRfY2xrKTsKKyAgICAgICAgfQorCQorCS8qIEVuYWJsZSB0aGUgRkFTVC1VQVJUIENsb2NrICovCisJcmV0ID0gY2xrX2VuYWJsZSh1YXJ0X2Nsayk7CisJaWYgKHJldCl7CisgICAgICAgICAgICAgICAgcHJfZXJyKCIlczogVUFSVCBjbG9jayBmYWlsZWQgdG8gZW5hYmxlOlxuIixfX2Z1bmNfXyk7CisJCXJldHVybiAgcmV0OyAgICAgICAKKwl9CisJCisJLyogR2V0IHRoZSBVQVJUIENsb2NrIGluIEh6ICovCisJdWFydF9yYXRlID0gY2xrX2dldF9yYXRlKHVhcnRfY2xrKTsKKyNlbmRpZgorCiAJbWVtc2V0KCZwb3J0LCAwLCBzaXplb2Yoc3RydWN0IHVhcnRfcG9ydCkpOwogCiAJaWYgKHNoYXJlX2lycXMpCkBAIC0zMDY1LDcgKzMxMzksMTEgQEAKIAkJcG9ydC5tZW1iYXNlCQk9IHAtPm1lbWJhc2U7CiAJCXBvcnQuaXJxCQk9IHAtPmlycTsKIAkJcG9ydC5pcnFmbGFncwkJPSBwLT5pcnFmbGFnczsKLQkJcG9ydC51YXJ0Y2xrCQk9IHAtPnVhcnRjbGs7CisjaWZkZWYgQ09ORklHX0FSQ0hfTTg2WFhYCisJCXBvcnQudWFydGNsawkJPSB1YXJ0X3JhdGU7ICAgIC8qIEFzc2lnbmluZyB0aGUgcmF0ZSB2YWx1ZSB0byB0aGUgcG9ydHMgKi8KKyNlbHNlCQorCQlwb3J0LnVhcnRjbGsJCT0gcC0+dWFydGNsazsgICAvKiBBc3NpZ25pbmcgdGhlIHJhdGUgdmFsdWUgZ290IGZyb20gUGxhdGZyb20gZGV2aWNlKi8KKyNlbmRpZgogCQlwb3J0LnJlZ3NoaWZ0CQk9IHAtPnJlZ3NoaWZ0OwogCQlwb3J0LmlvdHlwZQkJPSBwLT5pb3R5cGU7CiAJCXBvcnQuZmxhZ3MJCT0gcC0+ZmxhZ3M7CkBAIC0zMDg4LDYgKzMxNjYsNyBAQAogCQkJCXAtPmlycSwgcmV0KTsKIAkJfQogCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0zMTA0LDkgKzMxODMsMTkgQEAKIAkJaWYgKHVwLT5wb3J0LmRldiA9PSAmZGV2LT5kZXYpCiAJCQlzZXJpYWw4MjUwX3VucmVnaXN0ZXJfcG9ydChpKTsKIAl9CisjaWZkZWYgQ09ORklHX0FSQ0hfTTg2WFhYCisJLypEaXNhYmxlIHRoZSBGYXN0LVVBUlQgY2xvY2sgaGVyZSovCisJY2xrX2Rpc2FibGUodWFydF9jbGspOwkKKwljbGtfcHV0KHVhcnRfY2xrKTsKKworCS8qIFB1dCB0aGUgIEZhc3QtVUFSVCBkZXZpY2UgaW4gUmVzZXQqLworCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfRkFTVF9VQVJULDEpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIAorI2lmIENPTkZJR19QTQogc3RhdGljIGludCBzZXJpYWw4MjUwX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJaW50IGk7CkBAIC0zMTE4LDYgKzMyMDcsMTYgQEAKIAkJCXVhcnRfc3VzcGVuZF9wb3J0KCZzZXJpYWw4MjUwX3JlZywgJnVwLT5wb3J0KTsKIAl9CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9NODZYWFgKKwkvKiBOb3cgRG8gdGhlIEZBU1RfVUFSVF9DTE9DSyBnYXRpbmcgaGVyZSwgYmUgc3VyZSBubyBvdGhlciBkZXZpY2VzCisJICogYXJlIHVzaW5nIHRoZSBEVVMgY2xvY2sgdG8gc2h1dGRvd24gdGhlIGNsb2NrLiAKKwkgKiBIZXJlIGFib3ZlIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSBEVVMgLCBoZW5lY2UgaXQgd2lsbCBiZSBub3QKKwkgKiBnYXRlZCAsIHVubGVzcyBhbmQgdW50aWwgRE1BL0ZBU1QtU1BJIHdpbGwgZGlzYWJsZSB0aGUgRFVTIGNsb2NrIAorCSAqIHRvIG1ha2UgdGhlIHVzZWNvdW50IDAuCisJKi8KKwljbGtfZGlzYWJsZSh1YXJ0X2Nsayk7CisjZW5kaWYKKwogCXJldHVybiAwOwogfQogCkBAIC0zMTI1LDYgKzMyMjQsMjAgQEAKIHsKIAlpbnQgaTsKIAorI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCS8qIE5vdyBFbmFibGUgdGhlIEZBU1RfVUFSVF9DTE9DSyBoZXJlICwgYmVmb3JlIAorCSAqIGJlZm9yZSByZXN1bWluZyBhbnkgb3BlcnRpb25zLgorCSAqLworCWlmIChjbGtfZW5hYmxlKHVhcnRfY2xrKSl7CisgICAgICAgICAgICAgICAgcHJfZXJyKCIlczogVW5hYmxlIHRvIGVuYWJsZSBGQVNULVVBUlQgY2xvY2s6IFxuIixfX2Z1bmNfXyk7CisJCS8qIEhlcmUgd2UgYXJlIG5vdCBhYmxlIHRvIGVuYWJsZSB0aGUgRkFTVC1VQVJUIGNsb2NrICwgCisJCSAqIGJlYWNhdXNlIG9mIGNsa19kaXNhYmxlIHVuYWJsZSB0byBzaHV0ZG93biggdXNlY291bnQgaXMgCisJCSAqIG5vdCB6ZXJvICxkdWUgdG8gZGVwZW5kYW5jeSB3aXRoIERNQSBhbmQgRkFTVC1TUEkpIGNsb2NrCisJCSAqIHNvIExldCByZXN1bWUgdGhlIHBvcnQgb25seSAuCisJCSAqLyAKKyAgICAgICAgfQorI2VuZGlmCisKIAlmb3IgKGkgPSAwOyBpIDwgVUFSVF9OUjsgaSsrKSB7CiAJCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSAmc2VyaWFsODI1MF9wb3J0c1tpXTsKIApAQCAtMzEzNCwxMiArMzI0NywxNSBAQAogCiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2VyaWFsODI1MF9pc2FfZHJpdmVyID0gewogCS5wcm9iZQkJPSBzZXJpYWw4MjUwX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2VyaWFsODI1MF9yZW1vdmUpLAorI2lmIENPTkZJR19QTQogCS5zdXNwZW5kCT0gc2VyaWFsODI1MF9zdXNwZW5kLAogCS5yZXN1bWUJCT0gc2VyaWFsODI1MF9yZXN1bWUsCisjZW5kaWYKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2VyaWFsODI1MCIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL0tjb25maWcKaW5kZXggNzkxZjExYi4uZTVkMjViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9LY29uZmlnCkBAIC04MCw3ICs4MCw4IEBACiAjIHNvbWUgbm9uLVBDSSBIQ0RzIGltcGxlbWVudCB4SENJCiBjb25maWcgVVNCX0FSQ0hfSEFTX1hIQ0kKIAlib29sZWFuCi0JZGVmYXVsdCBQQ0kKKyAgICAgICAgZGVmYXVsdCB5CisjCWRlZmF1bHQgUENJCiAKICMgQVJNIFNBMTExMSBjaGlwcyBoYXZlIGEgbm9uLVBDSSBiYXNlZCAiT0hDSS1jb21wYXRpYmxlIiBVU0IgaG9zdCBpbnRlcmZhY2UuCiBjb25maWcgVVNCCkBAIC0xODEsNCArMTgyLDYgQEAKIAogc291cmNlICJkcml2ZXJzL3VzYi9vdGcvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3VzYi9kd2Nfb3RnL0tjb25maWciCisKIGVuZGlmICMgVVNCX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL01ha2VmaWxlIGIvZHJpdmVycy91c2IvTWFrZWZpbGUKaW5kZXggNzVlY2E3Ni4uZmYxOWViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvTWFrZWZpbGUKQEAgLTQ5LDYgKzQ5LDggQEAKIG9iai0kKENPTkZJR19VU0JfQVRNKQkJKz0gYXRtLwogb2JqLSQoQ09ORklHX1VTQl9TUEVFRFRPVUNIKQkrPSBhdG0vCiAKK29iai0kKENPTkZJR19EV0NfT1RHKQkJKz0gZHdjX290Zy8KKwogb2JqLSQoQ09ORklHX1VTQl9NVVNCX0hEUkMpCSs9IG11c2IvCiBvYmotJChDT05GSUdfVVNCX1JFTkVTQVNfVVNCSFMpCSs9IHJlbmVzYXNfdXNiaHMvCiBvYmotJChDT05GSUdfVVNCX09UR19VVElMUykJKz0gb3RnLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9LY29uZmlnIGIvZHJpdmVycy91c2IvZHdjX290Zy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjgyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL0tjb25maWcKQEAgLTAsMCArMSwzNyBAQAorY29uZmlnIERXQ19PVEcKKyAgICAgICAgdHJpc3RhdGUgIlN5bm9wc2lzIERXQ19PVEcgc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBVU0JfU1VQUE9SVAorICAgICAgICBoZWxwCisgICAgICAgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgU3lub3BzaXMgRFdDX09URyBJUCBjb3JlCisJCSAgZW1iZWJiZWQgb24gbWFueSBTT0NzIChyYWxpbmssIGluZmluZW9uLCBldGMpCisKK2Nob2ljZQorICAgICAgICBwcm9tcHQgIlVTQiBPcGVyYXRpb24gTW9kZSIKKyAgICAgICAgZGVwZW5kcyBvbiBEV0NfT1RHCisgICAgICAgIGRlZmF1bHQgRFdDX09UR19IT1NUX09OTFkKKworY29uZmlnIERXQ19PVEdfSE9TVF9PTkxZCisgICAgICAgIGJvb2wgIkhPU1QgT05MWSBNT0RFIgorICAgICAgICBkZXBlbmRzIG9uIERXQ19PVEcKKworY29uZmlnIERXQ19PVEdfREVWSUNFX09OTFkKKyAgICAgICAgYm9vbCAiREVWSUNFIE9OTFkgTU9ERSIKKyAgICAgICAgZGVwZW5kcyBvbiBEV0NfT1RHCitlbmRjaG9pY2UKKworY2hvaWNlCisgICAgICAgIHByb21wdCAiUGxhdGZvcm0iCisgICAgICAgIGRlcGVuZHMgb24gRFdDX09URworICAgICAgICBkZWZhdWx0IERXQ19PVEdfQ09NQ0VSVE8KKworY29uZmlnIERXQ19PVEdfQ09NQ0VSVE8KKyAgICAgICAgYm9vbCAiQ29tY2VydG8gMjAwMCIKKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX0NPTUNFUlRPCisgICAgICAgIGhlbHAKKyAgICAgICAgICBVU0IgMi4wIFVTQiBIb3N0IENvbnRyb2xsZXIKKwkJICBwbGF0Zm9ybSBzdXBwb3J0CitlbmRjaG9pY2UKKworY29uZmlnIERXQ19PVEdfREVCVUcKKyAgICAgICAgYm9vbCAiRW5hYmxlIGRlYnVnIG1vZGUiCisgICAgICAgIGRlcGVuZHMgb24gRFdDX09URwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjMWU5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvTWFrZWZpbGUKQEAgLTAsMCArMSwyOCBAQAorIworIyBNYWtlZmlsZSBmb3IgRFdDX290ZyBIaWdoc3BlZWQgVVNCIGNvbnRyb2xsZXIgZHJpdmVyCisjCisKK2lmZXEgKCQoQ09ORklHX0RXQ19PVEdfREVCVUcpLHkpCitlbmRpZgorCisjIFVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmbGFncyB0byBjb21waWxlIHRoZSBzb2Z0d2FyZSBpbiBob3N0LW9ubHkgb3IKKyMgZGV2aWNlLW9ubHkgbW9kZS4KK2lmZXEgKCQoQ09ORklHX0RXQ19PVEdfSE9TVF9PTkxZKSx5KQorRVhUUkFfQ0ZMQUdTICAgKz0gLUREV0NfSE9TVF9PTkxZCitFWFRSQV9DRkxBR1MgICArPSAtRERXQ19FTl9JU09DCitFWFRSQV9DRkxBR1MgICArPSAtRERXQ19MSU5VWAorRVhUUkFfQ0ZMQUdTCSs9IC1ERFdDX0xJQk1PRFVMRQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfRFdDX09UR19ERVZJQ0VfT05MWSkseSkKK0VYVFJBX0NGTEFHUyAgICs9IC1ERFdDX0RFVklDRV9PTkxZCitlbmRpZgorCitvYmotJChDT05GSUdfRFdDX09URykJOj0gZHdjX290Zy5vCisKK2R3Y19vdGctb2Jqcwk6PSBkd2Nfb3RnX2RyaXZlci5vIGR3Y19vdGdfYXR0ci5vCitkd2Nfb3RnLW9ianMJKz0gZHdjX290Z19jaWwubyBkd2Nfb3RnX2NpbF9pbnRyLm8KK2R3Y19vdGctb2JqcwkrPSBkd2Nfb3RnX2hjZF9saW51eC5vIGR3Y19vdGdfYWRwLm8gZHdjX290Z19jZmkubyAKK2R3Y19vdGctb2JqcwkrPSBkd2Nfb3RnX2hjZF9kZG1hLm8KK2R3Y19vdGctb2JqcwkrPSBkd2Nfb3RnX2hjZC5vIGR3Y19vdGdfaGNkX2ludHIubyBkd2Nfb3RnX2hjZF9xdWV1ZS5vCitkd2Nfb3RnLW9ianMJKz0gZHdjX2NvbW1vbl9saW51eC5vIGR3Y19tZW0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfY2MuYyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2NjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3YjIxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2NjLmMKQEAgLTAsMCArMSw1MzIgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9kd2NfY29tbW9uX3BvcnRfMi9kd2NfY2MuYyAkCisgKiAkUmV2aXNpb246ICM0ICQKKyAqICREYXRlOiAyMDEwLzExLzA0ICQKKyAqICRDaGFuZ2U6IDE2MjE2OTIgJAorICoKKyAqIFN5bm9wc3lzIFBvcnRhYmlsaXR5IExpYnJhcnkgU29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24KKyAqIChoZXJlaW5hZnRlciwgIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZgorICogU3lub3BzeXMsIEluYy4gdW5sZXNzIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcKKyAqIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogdW5kZXIgYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IKKyAqIExpY2Vuc2VkIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlCisgKiBwZXJtaXR0ZWQgdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeQorICogZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zCisgKiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLAorICogZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IgYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZAorICogaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbSBTeW5vcHN5cy4gSWYgeW91CisgKiBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIGJlbG93LCB0aGVuCisgKiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZmRlZiBEV0NfQ0NMSUIKKworI2luY2x1ZGUgImR3Y19jYy5oIgorCit0eXBlZGVmIHN0cnVjdCBkd2NfY2MKK3sKKwl1aW50MzJfdCB1aWQ7CisJdWludDhfdCBjaGlkWzE2XTsKKwl1aW50OF90IGNkaWRbMTZdOworCXVpbnQ4X3QgY2tbMTZdOworCXVpbnQ4X3QgKm5hbWU7CisJdWludDhfdCBsZW5ndGg7CisgICAgICAgIERXQ19DSVJDTEVRX0VOVFJZKGR3Y19jYykgbGlzdF9lbnRyeTsKK30gZHdjX2NjX3Q7CisKK0RXQ19DSVJDTEVRX0hFQUQoY29udGV4dF9saXN0LCBkd2NfY2MpOworCisvKiogVGhlIG1haW4gc3RydWN0dXJlIGZvciBDQyBtYW5hZ2VtZW50LiAgKi8KK3N0cnVjdCBkd2NfY2NfaWYKK3sKKwlkd2NfbXV0ZXhfdCAqbXV0ZXg7CisJY2hhciAqZmlsZW5hbWU7CisKKwl1bnNpZ25lZCBpc19ob3N0OjE7CisKKwlkd2Nfbm90aWZpZXJfdCAqbm90aWZpZXI7CisKKwlzdHJ1Y3QgY29udGV4dF9saXN0IGxpc3Q7Cit9OworCisjaWZkZWYgREVCVUcKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2J5dGVzKGNoYXIgKm5hbWUsIHVpbnQ4X3QgKmJ5dGVzLCBpbnQgbGVuKQoreworCWludCBpOworCURXQ19QUklOVEYoIiVzOiAiLCBuYW1lKTsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykgeworCQlEV0NfUFJJTlRGKCIlMDJ4ICIsIGJ5dGVzW2ldKTsKKwl9CisJRFdDX1BSSU5URigiXG4iKTsKK30KKyNlbHNlCisjZGVmaW5lIGR1bXBfYnl0ZXMoeC4uLikKKyNlbmRpZgorCitzdGF0aWMgZHdjX2NjX3QgKmFsbG9jX2NjKHZvaWQgKm1lbV9jdHgsIHVpbnQ4X3QgKm5hbWUsIHVpbnQzMl90IGxlbmd0aCkKK3sKKwlkd2NfY2NfdCAqY2MgPSBkd2NfYWxsb2MobWVtX2N0eCwgc2l6ZW9mKGR3Y19jY190KSk7CisJaWYgKCFjYykgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJRFdDX01FTVNFVChjYywgMCwgc2l6ZW9mKGR3Y19jY190KSk7CisKKwlpZiAobmFtZSkgeworCQljYy0+bGVuZ3RoID0gbGVuZ3RoOworCQljYy0+bmFtZSA9IGR3Y19hbGxvYyhtZW1fY3R4LCBsZW5ndGgpOworCQlpZiAoIWNjLT5uYW1lKSB7CisJCQlkd2NfZnJlZShtZW1fY3R4LCBjYyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCURXQ19NRU1DUFkoY2MtPm5hbWUsIG5hbWUsIGxlbmd0aCk7CisJfQorCisJcmV0dXJuIGNjOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2NjKHZvaWQgKm1lbV9jdHgsIGR3Y19jY190ICpjYykKK3sKKwlpZiAoY2MtPm5hbWUpIHsKKwkJZHdjX2ZyZWUobWVtX2N0eCwgY2MtPm5hbWUpOworCX0KKwlkd2NfZnJlZShtZW1fY3R4LCBjYyk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBuZXh0X3VpZChkd2NfY2NfaWZfdCAqY2NfaWYpCit7CisJdWludDMyX3QgdWlkID0gMDsKKwlkd2NfY2NfdCAqY2M7CisJRFdDX0NJUkNMRVFfRk9SRUFDSChjYywgJmNjX2lmLT5saXN0LCBsaXN0X2VudHJ5KSB7CisJCWlmIChjYy0+dWlkID4gdWlkKSB7CisJCQl1aWQgPSBjYy0+dWlkOworCQl9CisJfQorCisJaWYgKHVpZCA9PSAwKSB7CisJCXVpZCA9IDI1NTsKKwl9CisKKwlyZXR1cm4gdWlkICsgMTsKK30KKworc3RhdGljIGR3Y19jY190ICpjY19maW5kKGR3Y19jY19pZl90ICpjY19pZiwgdWludDMyX3QgdWlkKQoreworCWR3Y19jY190ICpjYzsKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIKGNjLCAmY2NfaWYtPmxpc3QsIGxpc3RfZW50cnkpIHsKKwkJaWYgKGNjLT51aWQgPT0gdWlkKSB7CisJCQlyZXR1cm4gY2M7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2NfZGF0YV9zaXplKGR3Y19jY19pZl90ICpjY19pZikKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisJZHdjX2NjX3QgKmNjOworCURXQ19DSVJDTEVRX0ZPUkVBQ0goY2MsICZjY19pZi0+bGlzdCwgbGlzdF9lbnRyeSkgeworCQlzaXplICs9ICg0OCArIDEpOworCQlpZiAoY2MtPm5hbWUpIHsKKwkJCXNpemUgKz0gY2MtPmxlbmd0aDsKKwkJfQorCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHVpbnQzMl90IGNjX21hdGNoX2NoaWQoZHdjX2NjX2lmX3QgKmNjX2lmLCB1aW50OF90ICpjaGlkKQoreworCXVpbnQzMl90IHVpZCA9IDA7CisJZHdjX2NjX3QgKmNjOworCisJRFdDX0NJUkNMRVFfRk9SRUFDSChjYywgJmNjX2lmLT5saXN0LCBsaXN0X2VudHJ5KSB7CisJCWlmIChEV0NfTUVNQ01QKGNjLT5jaGlkLCBjaGlkLCAxNikgPT0gMCkgeworCQkJdWlkID0gY2MtPnVpZDsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiB1aWQ7Cit9CitzdGF0aWMgdWludDMyX3QgY2NfbWF0Y2hfY2RpZChkd2NfY2NfaWZfdCAqY2NfaWYsIHVpbnQ4X3QgKmNkaWQpCit7CisJdWludDMyX3QgdWlkID0gMDsKKwlkd2NfY2NfdCAqY2M7CisKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIKGNjLCAmY2NfaWYtPmxpc3QsIGxpc3RfZW50cnkpIHsKKwkJaWYgKERXQ19NRU1DTVAoY2MtPmNkaWQsIGNkaWQsIDE2KSA9PSAwKSB7CisJCQl1aWQgPSBjYy0+dWlkOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHVpZDsKK30KKworLyogSW50ZXJuYWwgY2NfYWRkICovCitzdGF0aWMgaW50MzJfdCBjY19hZGQodm9pZCAqbWVtX2N0eCwgZHdjX2NjX2lmX3QgKmNjX2lmLCB1aW50OF90ICpjaGlkLAorCQkgICAgICB1aW50OF90ICpjZGlkLCB1aW50OF90ICpjaywgdWludDhfdCAqbmFtZSwgdWludDhfdCBsZW5ndGgpCit7CisJZHdjX2NjX3QgKmNjOworCXVpbnQzMl90IHVpZDsKKworCWlmIChjY19pZi0+aXNfaG9zdCkgeworCQl1aWQgPSBjY19tYXRjaF9jZGlkKGNjX2lmLCBjZGlkKTsKKwl9CisJZWxzZSB7CisJCXVpZCA9IGNjX21hdGNoX2NoaWQoY2NfaWYsIGNoaWQpOworCX0KKworCWlmICh1aWQpIHsKKwkJRFdDX0RFQlVHKCJSZXBsYWNpbmcgcHJldmlvdXMgY29ubmVjdGlvbiBjb250ZXh0IGlkPSVkIG5hbWU9JXAgbmFtZV9sZW49JWQiLCB1aWQsIG5hbWUsIGxlbmd0aCk7CisJCWNjID0gY2NfZmluZChjY19pZiwgdWlkKTsKKwl9CisJZWxzZSB7CisJCWNjID0gYWxsb2NfY2MobWVtX2N0eCwgbmFtZSwgbGVuZ3RoKTsKKwkJY2MtPnVpZCA9IG5leHRfdWlkKGNjX2lmKTsKKwkJRFdDX0NJUkNMRVFfSU5TRVJUX1RBSUwoJmNjX2lmLT5saXN0LCBjYywgbGlzdF9lbnRyeSk7CisJfQorCisJRFdDX01FTUNQWSgmKGNjLT5jaGlkWzBdKSwgY2hpZCwgMTYpOworCURXQ19NRU1DUFkoJihjYy0+Y2RpZFswXSksIGNkaWQsIDE2KTsKKwlEV0NfTUVNQ1BZKCYoY2MtPmNrWzBdKSwgY2ssIDE2KTsKKworCURXQ19ERUJVRygiQWRkZWQgY29ubmVjdGlvbiBjb250ZXh0IGlkPSVkIG5hbWU9JXAgbmFtZV9sZW49JWQiLCBjYy0+dWlkLCBuYW1lLCBsZW5ndGgpOworCWR1bXBfYnl0ZXMoIkNISUQiLCBjYy0+Y2hpZCwgMTYpOworCWR1bXBfYnl0ZXMoIkNESUQiLCBjYy0+Y2RpZCwgMTYpOworCWR1bXBfYnl0ZXMoIkNLIiwgY2MtPmNrLCAxNik7CisJcmV0dXJuIGNjLT51aWQ7Cit9CisKKy8qIEludGVybmFsIGNjX2NsZWFyICovCitzdGF0aWMgdm9pZCBjY19jbGVhcih2b2lkICptZW1fY3R4LCBkd2NfY2NfaWZfdCAqY2NfaWYpCit7CisJd2hpbGUgKCFEV0NfQ0lSQ0xFUV9FTVBUWSgmY2NfaWYtPmxpc3QpKSB7CisJCWR3Y19jY190ICpjYyA9IERXQ19DSVJDTEVRX0ZJUlNUKCZjY19pZi0+bGlzdCk7CisJCURXQ19DSVJDTEVRX1JFTU9WRV9JTklUKCZjY19pZi0+bGlzdCwgY2MsIGxpc3RfZW50cnkpOworCQlmcmVlX2NjKG1lbV9jdHgsIGNjKTsKKwl9Cit9CisKK2R3Y19jY19pZl90ICpkd2NfY2NfaWZfYWxsb2Modm9pZCAqbWVtX2N0eCwgdm9pZCAqbXR4X2N0eCwgCisJCQkgICAgIGR3Y19ub3RpZmllcl90ICpub3RpZmllciwgdW5zaWduZWQgaXNfaG9zdCkKK3sKKwlkd2NfY2NfaWZfdCAqY2NfaWYgPSBOVUxMOworCisJLyogQWxsb2NhdGUgYSBjb21tb25fY2NfaWYgc3RydWN0dXJlICovCisJY2NfaWYgPSBkd2NfYWxsb2MobWVtX2N0eCwgc2l6ZW9mKGR3Y19jY19pZl90KSk7CisKKwlpZiAoIWNjX2lmKQorCQlyZXR1cm4gTlVMTDsKKworI2lmIChkZWZpbmVkKERXQ19MSU5VWCkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfTVVURVhFUykpCisJRFdDX01VVEVYX0FMTE9DX0xJTlVYX0RFQlVHKGNjX2lmLT5tdXRleCk7CisjZWxzZQorCWNjX2lmLT5tdXRleCA9IGR3Y19tdXRleF9hbGxvYyhtdHhfY3R4KTsKKyNlbmRpZgorCWlmICghY2NfaWYtPm11dGV4KSB7CisJCWR3Y19mcmVlKG1lbV9jdHgsIGNjX2lmKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJRFdDX0NJUkNMRVFfSU5JVCgmY2NfaWYtPmxpc3QpOworCWNjX2lmLT5pc19ob3N0ID0gaXNfaG9zdDsKKwljY19pZi0+bm90aWZpZXIgPSBub3RpZmllcjsKKwlyZXR1cm4gY2NfaWY7Cit9CisKK3ZvaWQgZHdjX2NjX2lmX2ZyZWUodm9pZCAqbWVtX2N0eCwgdm9pZCAqbXR4X2N0eCwgZHdjX2NjX2lmX3QgKmNjX2lmKQoreworI2lmIChkZWZpbmVkKERXQ19MSU5VWCkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfTVVURVhFUykpCisJRFdDX01VVEVYX0ZSRUUoY2NfaWYtPm11dGV4KTsKKyNlbHNlCisJZHdjX211dGV4X2ZyZWUobXR4X2N0eCwgY2NfaWYtPm11dGV4KTsKKyNlbmRpZgorCWNjX2NsZWFyKG1lbV9jdHgsIGNjX2lmKTsKKwlkd2NfZnJlZShtZW1fY3R4LCBjY19pZik7Cit9CisKK3N0YXRpYyB2b2lkIGNjX2NoYW5nZWQoZHdjX2NjX2lmX3QgKmNjX2lmKQoreworCWlmIChjY19pZi0+bm90aWZpZXIpIHsKKwkJZHdjX25vdGlmeShjY19pZi0+bm90aWZpZXIsIERXQ19DQ19MSVNUX0NIQU5HRURfTk9USUZJQ0FUSU9OLCBjY19pZik7CisJfQorfQorCit2b2lkIGR3Y19jY19jbGVhcih2b2lkICptZW1fY3R4LCBkd2NfY2NfaWZfdCAqY2NfaWYpCit7CisJRFdDX01VVEVYX0xPQ0soY2NfaWYtPm11dGV4KTsKKwljY19jbGVhcihtZW1fY3R4LCBjY19pZik7CisJRFdDX01VVEVYX1VOTE9DSyhjY19pZi0+bXV0ZXgpOworCWNjX2NoYW5nZWQoY2NfaWYpOworfQorCitpbnQzMl90IGR3Y19jY19hZGQodm9pZCAqbWVtX2N0eCwgZHdjX2NjX2lmX3QgKmNjX2lmLCB1aW50OF90ICpjaGlkLAorCQkgICB1aW50OF90ICpjZGlkLCB1aW50OF90ICpjaywgdWludDhfdCAqbmFtZSwgdWludDhfdCBsZW5ndGgpCit7CisJdWludDMyX3QgdWlkOworCisJRFdDX01VVEVYX0xPQ0soY2NfaWYtPm11dGV4KTsKKwl1aWQgPSBjY19hZGQobWVtX2N0eCwgY2NfaWYsIGNoaWQsIGNkaWQsIGNrLCBuYW1lLCBsZW5ndGgpOworCURXQ19NVVRFWF9VTkxPQ0soY2NfaWYtPm11dGV4KTsKKwljY19jaGFuZ2VkKGNjX2lmKTsKKworCXJldHVybiB1aWQ7Cit9CisKK3ZvaWQgZHdjX2NjX2NoYW5nZSh2b2lkICptZW1fY3R4LCBkd2NfY2NfaWZfdCAqY2NfaWYsIGludDMyX3QgaWQsIHVpbnQ4X3QgKmNoaWQsCisJCSAgIHVpbnQ4X3QgKmNkaWQsIHVpbnQ4X3QgKmNrLCB1aW50OF90ICpuYW1lLCB1aW50OF90IGxlbmd0aCkKK3sKKwlkd2NfY2NfdCogY2M7CisKKwlEV0NfREVCVUcoIkNoYW5nZSBjb25uZWN0aW9uIGNvbnRleHQgJWQiLCBpZCk7CisKKwlEV0NfTVVURVhfTE9DSyhjY19pZi0+bXV0ZXgpOworCWNjID0gY2NfZmluZChjY19pZiwgaWQpOworCWlmICghY2MpIHsKKwkJRFdDX0VSUk9SKCJVaWQgJWQgbm90IGZvdW5kIGluIGNjIGxpc3RcbiIsIGlkKTsKKwkJRFdDX01VVEVYX1VOTE9DSyhjY19pZi0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNoaWQpIHsKKwkJRFdDX01FTUNQWSgmKGNjLT5jaGlkWzBdKSwgY2hpZCwgMTYpOworCX0KKwlpZiAoY2RpZCkgeworCQlEV0NfTUVNQ1BZKCYoY2MtPmNkaWRbMF0pLCBjZGlkLCAxNik7CisJfQorCWlmIChjaykgeworCQlEV0NfTUVNQ1BZKCYoY2MtPmNrWzBdKSwgY2ssIDE2KTsKKwl9CisKKwlpZiAobmFtZSkgeworCQlpZiAoY2MtPm5hbWUpIHsKKwkJCWR3Y19mcmVlKG1lbV9jdHgsIGNjLT5uYW1lKTsKKwkJfQorCQljYy0+bmFtZSA9IGR3Y19hbGxvYyhtZW1fY3R4LCBsZW5ndGgpOworCQlpZiAoIWNjLT5uYW1lKSB7CisJCQlEV0NfRVJST1IoIk91dCBvZiBtZW1vcnkgaW4gZHdjX2NjX2NoYW5nZSgpXG4iKTsKKwkJCURXQ19NVVRFWF9VTkxPQ0soY2NfaWYtPm11dGV4KTsKKwkJCXJldHVybjsKKwkJfQorCQljYy0+bGVuZ3RoID0gbGVuZ3RoOworCQlEV0NfTUVNQ1BZKGNjLT5uYW1lLCBuYW1lLCBsZW5ndGgpOworCX0KKworCURXQ19NVVRFWF9VTkxPQ0soY2NfaWYtPm11dGV4KTsKKworCWNjX2NoYW5nZWQoY2NfaWYpOworCisJRFdDX0RFQlVHKCJDaGFuZ2VkIGNvbm5lY3Rpb24gY29udGV4dCBpZD0lZFxuIiwgaWQpOworCWR1bXBfYnl0ZXMoIk5ldyBDSElEIiwgY2MtPmNoaWQsIDE2KTsKKwlkdW1wX2J5dGVzKCJOZXcgQ0RJRCIsIGNjLT5jZGlkLCAxNik7CisJZHVtcF9ieXRlcygiTmV3IENLIiwgY2MtPmNrLCAxNik7Cit9CisKK3ZvaWQgZHdjX2NjX3JlbW92ZSh2b2lkICptZW1fY3R4LCBkd2NfY2NfaWZfdCAqY2NfaWYsIGludDMyX3QgaWQpCit7CisJZHdjX2NjX3QgKmNjOworCisJRFdDX0RFQlVHKCJSZW1vdmluZyBjb25uZWN0aW9uIGNvbnRleHQgJWQiLCBpZCk7CisKKwlEV0NfTVVURVhfTE9DSyhjY19pZi0+bXV0ZXgpOworCWNjID0gY2NfZmluZChjY19pZiwgaWQpOworCWlmICghY2MpIHsKKwkJRFdDX0VSUk9SKCJVaWQgJWQgbm90IGZvdW5kIGluIGNjIGxpc3RcbiIsIGlkKTsKKwkJRFdDX01VVEVYX1VOTE9DSyhjY19pZi0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJRFdDX0NJUkNMRVFfUkVNT1ZFX0lOSVQoJmNjX2lmLT5saXN0LCBjYywgbGlzdF9lbnRyeSk7CisJRFdDX01VVEVYX1VOTE9DSyhjY19pZi0+bXV0ZXgpOworCWZyZWVfY2MobWVtX2N0eCwgY2MpOworCisJY2NfY2hhbmdlZChjY19pZik7Cit9CisKK3VpbnQ4X3QgKmR3Y19jY19kYXRhX2Zvcl9zYXZlKHZvaWQgKm1lbV9jdHgsIGR3Y19jY19pZl90ICpjY19pZiwgdW5zaWduZWQgaW50ICpsZW5ndGgpCit7CisJdWludDhfdCAqYnVmLCAqeDsKKwl1aW50OF90IHplcm8gPSAwOworCWR3Y19jY190ICpjYzsKKworCURXQ19NVVRFWF9MT0NLKGNjX2lmLT5tdXRleCk7CisJKmxlbmd0aCA9IGNjX2RhdGFfc2l6ZShjY19pZik7CisJaWYgKCEoKmxlbmd0aCkpIHsKKwkJRFdDX01VVEVYX1VOTE9DSyhjY19pZi0+bXV0ZXgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlEV0NfREVCVUcoIkNyZWF0aW5nIGRhdGEgZm9yIHNhdmluZyAobGVuZ3RoPSVkKSIsICpsZW5ndGgpOworCisJYnVmID0gZHdjX2FsbG9jKG1lbV9jdHgsICpsZW5ndGgpOworCWlmICghYnVmKSB7CisJCSpsZW5ndGggPSAwOworCQlEV0NfTVVURVhfVU5MT0NLKGNjX2lmLT5tdXRleCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXggPSBidWY7CisJRFdDX0NJUkNMRVFfRk9SRUFDSChjYywgJmNjX2lmLT5saXN0LCBsaXN0X2VudHJ5KSB7CisJCURXQ19NRU1DUFkoeCwgY2MtPmNoaWQsIDE2KTsKKwkJeCArPSAxNjsKKwkJRFdDX01FTUNQWSh4LCBjYy0+Y2RpZCwgMTYpOworCQl4ICs9IDE2OworCQlEV0NfTUVNQ1BZKHgsIGNjLT5jaywgMTYpOworCQl4ICs9IDE2OworCQlpZiAoY2MtPm5hbWUpIHsKKwkJCURXQ19NRU1DUFkoeCwgJmNjLT5sZW5ndGgsIDEpOworCQkJeCArPSAxOworCQkJRFdDX01FTUNQWSh4LCBjYy0+bmFtZSwgY2MtPmxlbmd0aCk7CisJCQl4ICs9IGNjLT5sZW5ndGg7CisJCX0KKwkJZWxzZSB7CisJCQlEV0NfTUVNQ1BZKHgsICZ6ZXJvLCAxKTsKKwkJCXggKz0gMTsKKwkJfQorCX0KKwlEV0NfTVVURVhfVU5MT0NLKGNjX2lmLT5tdXRleCk7CisKKwlyZXR1cm4gYnVmOworfQorCit2b2lkIGR3Y19jY19yZXN0b3JlX2Zyb21fZGF0YSh2b2lkICptZW1fY3R4LCBkd2NfY2NfaWZfdCAqY2NfaWYsIHVpbnQ4X3QgKmRhdGEsIHVpbnQzMl90IGxlbmd0aCkKK3sKKwl1aW50OF90IG5hbWVfbGVuZ3RoOworCXVpbnQ4X3QgKm5hbWU7CisJdWludDhfdCAqY2hpZDsKKwl1aW50OF90ICpjZGlkOworCXVpbnQ4X3QgKmNrOworCXVpbnQzMl90IGkgPSAwOworCisJRFdDX01VVEVYX0xPQ0soY2NfaWYtPm11dGV4KTsKKwljY19jbGVhcihtZW1fY3R4LCBjY19pZik7CisKKwl3aGlsZSAoaSA8IGxlbmd0aCkgeworCQljaGlkID0gJmRhdGFbaV07CisJCWkgKz0gMTY7CisJCWNkaWQgPSAmZGF0YVtpXTsKKwkJaSArPSAxNjsKKwkJY2sgPSAmZGF0YVtpXTsKKwkJaSArPSAxNjsKKworCQluYW1lX2xlbmd0aCA9IGRhdGFbaV07CisJCWkgKys7CisKKwkJaWYgKG5hbWVfbGVuZ3RoKSB7CisJCQluYW1lID0gJmRhdGFbaV07CisJCQlpICs9IG5hbWVfbGVuZ3RoOworCQl9CisJCWVsc2UgeworCQkJbmFtZSA9IE5VTEw7CisJCX0KKworCQkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZW4ndCBvdmVyZmxvd24gdGhlIGJ1ZmZlciAqLworCQlpZiAoaSA+IGxlbmd0aCkgeworCQkJRFdDX0VSUk9SKCJEYXRhIGZvcm1hdCBlcnJvciB3aGlsZSBhdHRlbXB0aW5nIHRvIGxvYWQgQ0NzICIKKwkJCQkgICIobmxlbj0lZCwgaXRlcj0lZCwgYnVmbGVuPSVkKS5cbiIsIG5hbWVfbGVuZ3RoLCBpLCBsZW5ndGgpOworCQkJYnJlYWs7CisJCX0KKworCQljY19hZGQobWVtX2N0eCwgY2NfaWYsIGNoaWQsIGNkaWQsIGNrLCBuYW1lLCBuYW1lX2xlbmd0aCk7CisJfQorCURXQ19NVVRFWF9VTkxPQ0soY2NfaWYtPm11dGV4KTsKKworCWNjX2NoYW5nZWQoY2NfaWYpOworfQorCit1aW50MzJfdCBkd2NfY2NfbWF0Y2hfY2hpZChkd2NfY2NfaWZfdCAqY2NfaWYsIHVpbnQ4X3QgKmNoaWQpCit7CisJdWludDMyX3QgdWlkID0gMDsKKworCURXQ19NVVRFWF9MT0NLKGNjX2lmLT5tdXRleCk7CisJdWlkID0gY2NfbWF0Y2hfY2hpZChjY19pZiwgY2hpZCk7CisJRFdDX01VVEVYX1VOTE9DSyhjY19pZi0+bXV0ZXgpOworCXJldHVybiB1aWQ7Cit9Cit1aW50MzJfdCBkd2NfY2NfbWF0Y2hfY2RpZChkd2NfY2NfaWZfdCAqY2NfaWYsIHVpbnQ4X3QgKmNkaWQpCit7CisJdWludDMyX3QgdWlkID0gMDsKKworCURXQ19NVVRFWF9MT0NLKGNjX2lmLT5tdXRleCk7CisJdWlkID0gY2NfbWF0Y2hfY2RpZChjY19pZiwgY2RpZCk7CisJRFdDX01VVEVYX1VOTE9DSyhjY19pZi0+bXV0ZXgpOworCXJldHVybiB1aWQ7Cit9CisKK3VpbnQ4X3QgKmR3Y19jY19jayhkd2NfY2NfaWZfdCAqY2NfaWYsIGludDMyX3QgaWQpCit7CisJdWludDhfdCAqY2sgPSBOVUxMOworCWR3Y19jY190ICpjYzsKKworCURXQ19NVVRFWF9MT0NLKGNjX2lmLT5tdXRleCk7CisJY2MgPSBjY19maW5kKGNjX2lmLCBpZCk7CisJaWYgKGNjKSB7CisJCWNrID0gY2MtPmNrOworCX0KKwlEV0NfTVVURVhfVU5MT0NLKGNjX2lmLT5tdXRleCk7CisKKwlyZXR1cm4gY2s7CisKK30KKwordWludDhfdCAqZHdjX2NjX2NoaWQoZHdjX2NjX2lmX3QgKmNjX2lmLCBpbnQzMl90IGlkKQoreworCXVpbnQ4X3QgKnJldHZhbCA9IE5VTEw7CisJZHdjX2NjX3QgKmNjOworCisJRFdDX01VVEVYX0xPQ0soY2NfaWYtPm11dGV4KTsKKwljYyA9IGNjX2ZpbmQoY2NfaWYsIGlkKTsKKwlpZiAoY2MpIHsKKwkJcmV0dmFsID0gY2MtPmNoaWQ7CisJfQorCURXQ19NVVRFWF9VTkxPQ0soY2NfaWYtPm11dGV4KTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3VpbnQ4X3QgKmR3Y19jY19jZGlkKGR3Y19jY19pZl90ICpjY19pZiwgaW50MzJfdCBpZCkKK3sKKwl1aW50OF90ICpyZXR2YWwgPSBOVUxMOworCWR3Y19jY190ICpjYzsKKworCURXQ19NVVRFWF9MT0NLKGNjX2lmLT5tdXRleCk7CisJY2MgPSBjY19maW5kKGNjX2lmLCBpZCk7CisJaWYgKGNjKSB7CisJCXJldHZhbCA9IGNjLT5jZGlkOworCX0KKwlEV0NfTVVURVhfVU5MT0NLKGNjX2lmLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCit1aW50OF90ICpkd2NfY2NfbmFtZShkd2NfY2NfaWZfdCAqY2NfaWYsIGludDMyX3QgaWQsIHVpbnQ4X3QgKmxlbmd0aCkKK3sKKwl1aW50OF90ICpyZXR2YWwgPSBOVUxMOworCWR3Y19jY190ICpjYzsKKworCURXQ19NVVRFWF9MT0NLKGNjX2lmLT5tdXRleCk7CisJKmxlbmd0aCA9IDA7CisJY2MgPSBjY19maW5kKGNjX2lmLCBpZCk7CisJaWYgKGNjKSB7CisJCSpsZW5ndGggPSBjYy0+bGVuZ3RoOworCQlyZXR2YWwgPSBjYy0+bmFtZTsKKwl9CisJRFdDX01VVEVYX1VOTE9DSyhjY19pZi0+bXV0ZXgpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmCS8qIERXQ19DQ0xJQiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfY2MuaCBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2NjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyYmJhZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2NjLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9kd2NfY29tbW9uX3BvcnRfMi9kd2NfY2MuaCAkCisgKiAkUmV2aXNpb246ICM0ICQKKyAqICREYXRlOiAyMDEwLzA5LzI4ICQKKyAqICRDaGFuZ2U6IDE1OTYxODIgJAorICoKKyAqIFN5bm9wc3lzIFBvcnRhYmlsaXR5IExpYnJhcnkgU29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24KKyAqIChoZXJlaW5hZnRlciwgIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZgorICogU3lub3BzeXMsIEluYy4gdW5sZXNzIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcKKyAqIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogdW5kZXIgYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IKKyAqIExpY2Vuc2VkIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlCisgKiBwZXJtaXR0ZWQgdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeQorICogZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zCisgKiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLAorICogZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IgYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZAorICogaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbSBTeW5vcHN5cy4gSWYgeW91CisgKiBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIGJlbG93LCB0aGVuCisgKiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgX0RXQ19DQ19IXworI2RlZmluZSBfRFdDX0NDX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEBmaWxlCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIENvbnRleHQgQ29udGV4dCBsaWJyYXJ5LgorICoKKyAqIFRoZSBtYWluIGRhdGEgc3RydWN0dXJlIGlzIGR3Y19jY19pZl90IHdoaWNoIGlzIHJldHVybmVkIGJ5IGVpdGhlciB0aGUKKyAqIGR3Y19jY19pZl9hbGxvYyBmdW5jdGlvbiBvciByZXR1cm5lZCBieSB0aGUgbW9kdWxlIHRvIHRoZSB1c2VyIHZpYSBhIHByb3ZpZGVkCisgKiBmdW5jdGlvbi4gVGhlIGRhdGEgc3RydWN0dXJlIGlzIG9wYXF1ZSBhbmQgc2hvdWxkIG9ubHkgYmUgbWFuaXB1bGF0ZWQgdmlhIHRoZQorICogZnVuY3Rpb25zIHByb3ZpZWQgaW4gdGhpcyBBUEkuCisgKgorICogSXQgbWFuYWdlcyBhIGxpc3Qgb2YgY29ubmVjdGlvbiBjb250ZXh0cyBhbmQgb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIHRvCisgKiBhZGQsIHJlbW92ZSwgcXVlcnksIHNlYXJjaCwgYW5kIGNoYW5nZSwgdGhvc2UgY29udGV4dHMuICBBZGRpdGlvbmFsbHksCisgKiBhIGR3Y19ub3RpZmllcl90IG9iamVjdCBjYW4gYmUgcmVxdWVzdGVkIGZyb20gdGhlIG1hbmFnZXIgc28gdGhhdAorICogdGhlIHVzZXIgY2FuIGJlIG5vdGlmaWVkIHdoZW5ldmVyIHRoZSBjb250ZXh0IGxpc3QgaGFzIGNoYW5nZWQuCisgKi8KKworI2luY2x1ZGUgImR3Y19vcy5oIgorI2luY2x1ZGUgImR3Y19saXN0LmgiCisjaW5jbHVkZSAiZHdjX25vdGlmaWVyLmgiCisKKworLyogTm90aWZpY2F0aW9ucyAqLworI2RlZmluZSBEV0NfQ0NfTElTVF9DSEFOR0VEX05PVElGSUNBVElPTiAiRFdDX0NDX0xJU1RfQ0hBTkdFRF9OT1RJRklDQVRJT04iCisKK3N0cnVjdCBkd2NfY2NfaWY7Cit0eXBlZGVmIHN0cnVjdCBkd2NfY2NfaWYgZHdjX2NjX2lmX3Q7CisKKworLyoqIEBuYW1lIENvbm5lY3Rpb24gQ29udGV4dCBPcGVyYXRpb25zICovCisvKiogQHsgKi8KKworLyoqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IgYSBkd2NfY2NfaWZfdCBzdHJ1Y3R1cmUsIGluaXRpYWxpemVzCisgKiBmaWVsZHMgdG8gZGVmYXVsdCB2YWx1ZXMsIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIG9yIE5VTEwgb24KKyAqIGVycm9yLiAqLworZXh0ZXJuIGR3Y19jY19pZl90ICpkd2NfY2NfaWZfYWxsb2Modm9pZCAqbWVtX2N0eCwgdm9pZCAqbXR4X2N0eCwKKwkJCQkgICAgZHdjX25vdGlmaWVyX3QgKm5vdGlmaWVyLCB1bnNpZ25lZCBpc19ob3N0KTsKKworLyoqIEZyZWVzIHRoZSBtZW1vcnkgZm9yIHRoZSBzcGVjaWZpZWQgQ0Mgc3RydWN0dXJlIGFsbG9jYXRlZCBmcm9tCisgKiBkd2NfY2NfaWZfYWxsb2MoKS4gKi8KK2V4dGVybiB2b2lkIGR3Y19jY19pZl9mcmVlKHZvaWQgKm1lbV9jdHgsIHZvaWQgKm10eF9jdHgsIGR3Y19jY19pZl90ICpjY19pZik7CisKKy8qKiBSZW1vdmVzIGFsbCBjb250ZXh0cyBmcm9tIHRoZSBjb25uZWN0aW9uIGNvbnRleHQgbGlzdCAqLworZXh0ZXJuIHZvaWQgZHdjX2NjX2NsZWFyKHZvaWQgKm1lbV9jdHgsIGR3Y19jY19pZl90ICpjY19pZik7CisKKy8qKiBBZGRzIGEgY29ubmVjdGlvbiBjb250ZXh0IChDSElELCBDSywgQ0RJRCwgTmFtZSkgdG8gdGhlIGNvbm5lY3Rpb24gY29udGV4dCBsaXN0LgorICogSWYgYSBDSElEIGFscmVhZHkgZXhpc3RzLCB0aGUgQ0sgYW5kIG5hbWUgYXJlIG92ZXJ3cml0dGVuLiAgU3RhdGlzdGljcyBhcmUKKyAqIG5vdCBvdmVyd3JpdHRlbi4KKyAqCisgKiBAcGFyYW0gY2NfaWYgVGhlIGNjX2lmIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBjaGlkIEEgcG9pbnRlciB0byB0aGUgMTYtYnl0ZSBDSElELiAgVGhpcyB2YWx1ZSB3aWxsIGJlIGNvcGllZC4KKyAqIEBwYXJhbSBjayBBIHBvaW50ZXIgdG8gdGhlIDE2LWJ5dGUgQ0suICBUaGlzIHZhbHVlIHdpbGwgYmUgY29waWVkLgorICogQHBhcmFtIGNkaWQgQSBwb2ludGVyIHRvIHRoZSAxNi1ieXRlIENESUQuICBUaGlzIHZhbHVlIHdpbGwgYmUgY29waWVkLgorICogQHBhcmFtIG5hbWUgQW4gb3B0aW9uYWwgaG9zdCBmcmllbmRseSBuYW1lIGFzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0aW9uIG1vZGVsCisgKiBzcGVjLiAgTXVzdCBiZSBhIFVURjE2LUxFIHVuaWNvZGUgc3RyaW5nLiAgQ2FuIGJlIE5VTEwgdG8gaW5kaWNhdGVkIG5vIG5hbWUuCisgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb3RoZSB1bmljb2RlIHN0cmluZy4KKyAqIEByZXR1cm4gQSB1bmlxdWUgaWRlbnRpZmllciB1c2VkIHRvIHJlZmVyIHRvIHRoaXMgY29udGV4dCB0aGF0IGlzIHZhbGlkIGZvcgorICogYXMgbG9uZyBhcyB0aGlzIGNvbnRleHQgaXMgc3RpbGwgaW4gdGhlIGxpc3QuICovCitleHRlcm4gaW50MzJfdCBkd2NfY2NfYWRkKHZvaWQgKm1lbV9jdHgsIGR3Y19jY19pZl90ICpjY19pZiwgdWludDhfdCAqY2hpZCwKKwkJCSAgdWludDhfdCAqY2RpZCwgdWludDhfdCAqY2ssIHVpbnQ4X3QgKm5hbWUsCisJCQkgIHVpbnQ4X3QgbGVuZ3RoKTsKKworLyoqIENoYW5nZXMgdGhlIENISUQsIENLLCBDRElELCBvciBOYW1lIHZhbHVlcyBvZiBhIGNvbm5lY3Rpb24gY29udGV4dCBpbiB0aGUKKyAqIGxpc3QsIHByZXNlcnZpbmcgYW55IGFjY3VtdWxhdGVkIHN0YXRpc3RpY3MuICBUaGlzIHdvdWxkIHR5cGljYWxseSBiZSBjYWxsZWQKKyAqIGlmIHRoZSBob3N0IGRlY2lkZWRzIHRvIGNoYW5nZSB0aGUgY29udGV4dCB3aXRoIGEgU0VUX0NPTk5FQ1RJT04gcmVxdWVzdC4KKyAqCisgKiBAcGFyYW0gY2NfaWYgVGhlIGNjX2lmIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29ubmVjdGlvbiBjb250ZXh0LgorICogQHBhcmFtIGNoaWQgQSBwb2ludGVyIHRvIHRoZSAxNi1ieXRlIENISUQuICBUaGlzIHZhbHVlIHdpbGwgYmUgY29waWVkLiAgTlVMTAorICogaW5kaWNhdGVzIG5vIGNoYW5nZS4KKyAqIEBwYXJhbSBjZGlkIEEgcG9pbnRlciB0byB0aGUgMTYtYnl0ZSBDRElELiAgVGhpcyB2YWx1ZSB3aWxsIGJlIGNvcGllZC4gIE5VTEwKKyAqIGluZGljYXRlcyBubyBjaGFuZ2UuCisgKiBAcGFyYW0gY2sgQSBwb2ludGVyIHRvIHRoZSAxNi1ieXRlIENLLiAgVGhpcyB2YWx1ZSB3aWxsIGJlIGNvcGllZC4gIE5VTEwKKyAqIGluZGljYXRlcyBubyBjaGFuZ2UuCisgKiBAcGFyYW0gbmFtZSBIb3N0IGZyaWVuZGx5IG5hbWUgVVRGMTYtTEUuICBOVUxMIGluZGljYXRlcyBubyBjaGFuZ2UuCisgKiBAcGFyYW0gbGVuZ3RoIExlbmd0aCBvZiBuYW1lLiAqLworZXh0ZXJuIHZvaWQgZHdjX2NjX2NoYW5nZSh2b2lkICptZW1fY3R4LCBkd2NfY2NfaWZfdCAqY2NfaWYsIGludDMyX3QgaWQsCisJCQkgIHVpbnQ4X3QgKmNoaWQsIHVpbnQ4X3QgKmNkaWQsIHVpbnQ4X3QgKmNrLAorCQkJICB1aW50OF90ICpuYW1lLCB1aW50OF90IGxlbmd0aCk7CisKKy8qKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGNvbnRleHQuCisgKiBAcGFyYW0gY2NfaWYgVGhlIGNjX2lmIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgY29ubmVjdGlvbiBjb250ZXh0IHRvIHJlbW92ZS4gKi8KK2V4dGVybiB2b2lkIGR3Y19jY19yZW1vdmUodm9pZCAqbWVtX2N0eCwgZHdjX2NjX2lmX3QgKmNjX2lmLCBpbnQzMl90IGlkKTsKKworLyoqIEdldCBhIGJpbmFyeSBibG9jayBvZiBkYXRhIGZvciB0aGUgY29ubmVjdGlvbiBjb250ZXh0IGxpc3QgYW5kIGF0dHJpYnV0ZXMuCisgKiBUaGlzIGRhdGEgY2FuIGJlIHVzZWQgYnkgdGhlIE9TIHNwZWNpZmljIGRyaXZlciB0byBzYXZlIHRoZSBjb25uZWN0aW9uCisgKiBjb250ZXh0IGxpc3QgaW50byBub24tdm9sYXRpbGUgbWVtb3J5LgorICoKKyAqIEBwYXJhbSBjY19pZiBUaGUgY2NfaWYgc3RydWN0dXJlLgorICogQHBhcmFtIGxlbmd0aCBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBidWZmZXIuCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIuICBUaGUgbWVtb3J5IGZvciB0aGlzIGJ1ZmZlciBzaG91bGQgYmUKKyAqIGZyZWVkIHdpdGggRFdDX0ZSRUUoKSBhZnRlciB1c2UuICovCitleHRlcm4gdWludDhfdCAqZHdjX2NjX2RhdGFfZm9yX3NhdmUodm9pZCAqbWVtX2N0eCwgZHdjX2NjX2lmX3QgKmNjX2lmLAorCQkJCSAgICAgdW5zaWduZWQgaW50ICpsZW5ndGgpOworCisvKiogUmVzdG9yZSB0aGUgY29ubmVjdGlvbiBjb250ZXh0IGxpc3QgZnJvbSB0aGUgYmluYXJ5IGRhdGEgdGhhdCB3YXMgcHJldmlvdXNseQorICogcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gZHdjX2NjX2RhdGFfZm9yX3NhdmUuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IHRoZSBPUyBzcGVjaWZpYworICogZHJpdmVyIHRvIGxvYWQgYSBjb25uZWN0aW9uIGNvbnRleHQgbGlzdCBmcm9tIG5vbi12b2xhdGlsZSBtZW1vcnkuCisgKgorICogQHBhcmFtIGNjX2lmIFRoZSBjY19pZiBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSBieXRlcyBhcyByZXR1cm5lZCBmcm9tIGR3Y19jY19kYXRhX2Zvcl9zYXZlLgorICogQHBhcmFtIGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhLiAqLworZXh0ZXJuIHZvaWQgZHdjX2NjX3Jlc3RvcmVfZnJvbV9kYXRhKHZvaWQgKm1lbV9jdHgsIGR3Y19jY19pZl90ICpjY19pZiwKKwkJCQkgICAgIHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBsZW5ndGgpOworCisvKiogRmluZCB0aGUgY29ubmVjdGlvbiBjb250ZXh0IGZyb20gdGhlIHNwZWNpZmllZCBDSElELgorICoKKyAqIEBwYXJhbSBjY19pZiBUaGUgY2NfaWYgc3RydWN0dXJlLgorICogQHBhcmFtIGNoaWQgQSBwb2ludGVyIHRvIHRoZSBDSElEIGRhdGEuCisgKiBAcmV0dXJuIEEgbm9uLXplcm8gaWRlbnRpZmllciBvZiB0aGUgY29ubmVjdGlvbiBjb250ZXh0IGlmIHRoZSBDSElEIG1hdGNoZXMuCisgKiBPdGhlcndpc2UgcmV0dXJucyAwLiAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19jY19tYXRjaF9jaGlkKGR3Y19jY19pZl90ICpjY19pZiwgdWludDhfdCAqY2hpZCk7CisKKy8qKiBGaW5kIHRoZSBjb25uZWN0aW9uIGNvbnRleHQgZnJvbSB0aGUgc3BlY2lmaWVkIENESUQuCisgKgorICogQHBhcmFtIGNjX2lmIFRoZSBjY19pZiBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gY2RpZCBBIHBvaW50ZXIgdG8gdGhlIENESUQgZGF0YS4KKyAqIEByZXR1cm4gQSBub24temVybyBpZGVudGlmaWVyIG9mIHRoZSBjb25uZWN0aW9uIGNvbnRleHQgaWYgdGhlIENISUQgbWF0Y2hlcy4KKyAqIE90aGVyd2lzZSByZXR1cm5zIDAuICovCitleHRlcm4gdWludDMyX3QgZHdjX2NjX21hdGNoX2NkaWQoZHdjX2NjX2lmX3QgKmNjX2lmLCB1aW50OF90ICpjZGlkKTsKKworLyoqIFJldHJpZXZlIHRoZSBDSyBmcm9tIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBjb250ZXh0LgorICoKKyAqIEBwYXJhbSBjY19pZiBUaGUgY2NfaWYgc3RydWN0dXJlLgorICogQHBhcmFtIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb25uZWN0aW9uIGNvbnRleHQuCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgQ0sgZGF0YS4gIFRoZSBtZW1vcnkgZG9lcyBub3QgbmVlZCB0byBiZSBmcmVlZC4gKi8KK2V4dGVybiB1aW50OF90ICpkd2NfY2NfY2soZHdjX2NjX2lmX3QgKmNjX2lmLCBpbnQzMl90IGlkKTsKKworLyoqIFJldHJpZXZlIHRoZSBDSElEIGZyb20gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGNvbnRleHQuCisgKgorICogQHBhcmFtIGNjX2lmIFRoZSBjY19pZiBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbm5lY3Rpb24gY29udGV4dC4KKyAqIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSBDSElEIGRhdGEuICBUaGUgbWVtb3J5IGRvZXMgbm90IG5lZWQgdG8gYmUgZnJlZWQuICovCitleHRlcm4gdWludDhfdCAqZHdjX2NjX2NoaWQoZHdjX2NjX2lmX3QgKmNjX2lmLCBpbnQzMl90IGlkKTsKKworLyoqIFJldHJpZXZlIHRoZSBDRElEIGZyb20gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGNvbnRleHQuCisgKgorICogQHBhcmFtIGNjX2lmIFRoZSBjY19pZiBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvbm5lY3Rpb24gY29udGV4dC4KKyAqIEByZXR1cm4gQSBwb2ludGVyIHRvIHRoZSBDRElEIGRhdGEuICBUaGUgbWVtb3J5IGRvZXMgbm90IG5lZWQgdG8gYmUgZnJlZWQuICovCitleHRlcm4gdWludDhfdCAqZHdjX2NjX2NkaWQoZHdjX2NjX2lmX3QgKmNjX2lmLCBpbnQzMl90IGlkKTsKKworZXh0ZXJuIHVpbnQ4X3QgKmR3Y19jY19uYW1lKGR3Y19jY19pZl90ICpjY19pZiwgaW50MzJfdCBpZCwgdWludDhfdCAqbGVuZ3RoKTsKKworLyoqIENoZWNrcyBhIGJ1ZmZlciBmb3Igbm9uLXplcm8uCisgKiBAcGFyYW0gaWQgQSBwb2ludGVyIHRvIGEgMTYgYnl0ZSBidWZmZXIuIAorICogQHJldHVybiB0cnVlIGlmIHRoZSAxNiBieXRlIHZhbHVlIGlzIG5vbi16ZXJvLiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkd2NfYXNzb2NfaXNfbm90X3plcm9faWQodWludDhfdCAqaWQpIHsKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKSB7CisJCWlmIChpZFtpXSkgcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKiogQ2hlY2tzIGEgYnVmZmVyIGZvciB6ZXJvLgorICogQHBhcmFtIGlkIEEgcG9pbnRlciB0byBhIDE2IGJ5dGUgYnVmZmVyLiAKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgMTYgYnl0ZSB2YWx1ZSBpcyB6ZXJvLiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkd2NfYXNzb2NfaXNfemVyb19pZCh1aW50OF90ICppZCkgeworCXJldHVybiAhZHdjX2Fzc29jX2lzX25vdF96ZXJvX2lkKGlkKTsKK30KKworLyoqIFByaW50cyBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIDE2LWJ5dGUgY2hpZCwgY2RpZCwgb3IgY2ssIGludG8KKyAqIGJ1ZmZlci4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGR3Y19wcmludF9pZF9zdHJpbmcoY2hhciAqYnVmZmVyLCB1aW50OF90ICppZCkgeworCWNoYXIgKnB0ciA9IGJ1ZmZlcjsKKwlpbnQgaTsKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKSB7CisJCXB0ciArPSBEV0NfU1BSSU5URihwdHIsICIlMDJ4IiwgaWRbaV0pOworCQlpZiAoaSA8IDE1KSB7CisJCQlwdHIgKz0gRFdDX1NQUklOVEYocHRyLCAiICIpOworCQl9CisJfQorCXJldHVybiBwdHIgLSBidWZmZXI7Cit9CisKKy8qKiBAfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0RXQ19DQ19IXyAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19jZmlfY29tbW9uLmggYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19jZmlfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1NmFmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2NmaV9jb21tb24uaApAQCAtMCwwICsxLDE0MiBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICogCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdCB1bmRlcgorICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAorICogd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKKyAqIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLCBkaXNjbG9zZSwgY29weSBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSBvcgorICogYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tCisgKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKKyAqIGJlbG93LCB0aGVuIHlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIiBCQVNJUworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmICFkZWZpbmVkKF9fRFdDX0NGSV9DT01NT05fSF9fKQorI2RlZmluZSBfX0RXQ19DRklfQ09NTU9OX0hfXworCisvLyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKioKKyAqIEBmaWxlIAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQ0ZJIHNwZWNpZmljIGNvbW1vbiBjb25zdGFudHMsIGludGVyZmFjZXMKKyAqIChmdW5jdGlvbnMgYW5kIG1hY3JvcykgYW5kIHN0cnVjdHVyZXMgZm9yIExpbnV4LiBObyBQQ0Qgc3BlY2lmaWMKKyAqIGRhdGEgc3RydWN0dXJlIG9yIGRlZmluaXRpb24gaXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhpcyBmaWxlLgorICoKKyAqLworCisvKiogVGhpcyBpcyBhIHJlcXVlc3QgZm9yIGFsbCBDb3JlIEZlYXR1cmVzICovCisjZGVmaW5lIFZFTl9DT1JFX0dFVF9GRUFUVVJFUwkJMHhCMQorCisvKiogVGhpcyBpcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSB2YWx1ZSBvZiBhIHNwZWNpZmljIENvcmUgRmVhdHVyZSAqLworI2RlZmluZSBWRU5fQ09SRV9HRVRfRkVBVFVSRQkJMHhCMgorCisvKiogVGhpcyBjb21tYW5kIGFsbG93cyB0aGUgaG9zdCB0byBzZXQgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgQ29yZSBGZWF0dXJlICovCisjZGVmaW5lIFZFTl9DT1JFX1NFVF9GRUFUVVJFCQkweEIzCisKKy8qKiBUaGlzIGNvbW1hbmQgYWxsb3dzIHRoZSBob3N0IHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgCisgKiBlaXRoZXIgYWxsIG9yIGFueSBzcGVjaWZpYyBDb3JlIEZlYXR1cmUgCisgKi8KKyNkZWZpbmUgVkVOX0NPUkVfUkVTRVRfRkVBVFVSRVMJCTB4QjQKKworLyoqIFRoaXMgY29tbWFuZCBmb3JjZXMgdGhlIFBDRCB0byB3cml0ZSB0aGUgZGVmZXJyZWQgdmFsdWVzIG9mIGEgQ29yZSBGZWF0dXJlcyAqLworI2RlZmluZSBWRU5fQ09SRV9BQ1RJVkFURV9GRUFUVVJFUwkweEI1CisKKy8qKiBUaGlzIHJlcXVlc3QgcmVhZHMgYSBEV09SRCB2YWx1ZSBmcm9tIGEgcmVnaXN0ZXIgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgKi8KKyNkZWZpbmUgVkVOX0NPUkVfUkVBRF9SRUdJU1RFUgkJMHhCNgorCisvKiogVGhpcyByZXF1ZXN0IHdyaXRlcyBhIERXT1JEIHZhbHVlIGludG8gYSByZWdpc3RlciBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldCAqLworI2RlZmluZSBWRU5fQ09SRV9XUklURV9SRUdJU1RFUgkJMHhCNworCisvKiogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIGhlYWRlciBvZiB0aGUgQ29yZSBGZWF0dXJlcyBkYXRhc2V0IHJldHVybmVkIHRvIAorICogIHRoZSBIb3N0CisgKi8KK3N0cnVjdCBjZmlfYWxsX2ZlYXR1cmVzX2hlYWRlciB7CisvKiogVGhlIGZlYXR1cmVzIGhlYWRlciBzdHJ1Y3R1cmUgbGVuZ3RoIGlzICovCisjZGVmaW5lIENGSV9BTExfRkVBVFVSRVNfSERSX0xFTgkJOAorCS8qKgorCSAqIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGZlYXR1cmVzIGRhdGFzZXQgcmV0dXJuZWQgdG8gdGhlIEhvc3QgCisJICovCisJdWludDE2X3Qgd1RvdGFsTGVuOworCisJLyoqCisJICogQ0ZJIHZlcnNpb24gbnVtYmVyIGluQmluYXJ5LUNvZGVkIERlY2ltYWwgKGkuZS4sIDEuMDAgaXMgMTAwSCkuCisJICogVGhpcyBmaWVsZCBpZGVudGlmaWVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBDRkkgU3BlY2lmaWNhdGlvbiB3aXRoIHdoaWNoIAorCSAqIHRoZSBkZXZpY2UgaXMgY29tcGxpYW50LgorCSAqLworCXVpbnQxNl90IHdWZXJzaW9uOworCisJLyoqIFRoZSBJRCBvZiB0aGUgQ29yZSAqLworCXVpbnQxNl90IHdDb3JlSUQ7CisjZGVmaW5lIENGSV9DT1JFX0lEX1VEQwkJMQorI2RlZmluZSBDRklfQ09SRV9JRF9PVEcJCTIKKyNkZWZpbmUgQ0ZJX0NPUkVfSURfV1VERVYJMworCisJLyoqIE51bWJlciBvZiBmZWF0dXJlcyByZXR1cm5lZCBieSBWRU5fQ09SRV9HRVRfRkVBVFVSRVMgcmVxdWVzdCAqLworCXVpbnQxNl90IHdOdW1GZWF0dXJlczsKK30gVVBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3QgY2ZpX2FsbF9mZWF0dXJlc19oZWFkZXIgY2ZpX2FsbF9mZWF0dXJlc19oZWFkZXJfdDsKKworLyoqIFRoaXMgc3RydWN0dXJlIGlzIGEgaGVhZGVyIG9mIHRoZSBDb3JlIEZlYXR1cmUgZGVzY3JpcHRvciBkYXRhc2V0IHJldHVybmVkIHRvIAorICogIHRoZSBIb3N0IGFmdGVyIHRoZSBWRU5fQ09SRV9HRVRfRkVBVFVSRVMgcmVxdWVzdAorICovCitzdHJ1Y3QgY2ZpX2ZlYXR1cmVfZGVzY19oZWFkZXIgeworI2RlZmluZSBDRklfRkVBVFVSRV9ERVNDX0hEUl9MRU4JOAorCisJLyoqIFRoZSBmZWF0dXJlIElEICovCisJdWludDE2X3Qgd0ZlYXR1cmVJRDsKKworCS8qKiBMZW5ndGggb2YgdGhpcyBmZWF0dXJlIGRlc2NyaXB0b3IgaW4gYnl0ZXMgLSBpbmNsdWRpbmcgdGhlCisJICogbGVuZ3RoIG9mIHRoZSBmZWF0dXJlIG5hbWUgc3RyaW5nCisJICovCisJdWludDE2X3Qgd0xlbmd0aDsKKworCS8qKiBUaGUgZGF0YSBsZW5ndGggb2YgdGhpcyBmZWF0dXJlIGluIGJ5dGVzICovCisJdWludDE2X3Qgd0RhdGFMZW5ndGg7CisKKwkvKiogCisJICogQXR0cmlidXRlcyBvZiB0aGlzIGZlYXR1cmVzIAorCSAqIEQwOiBBY2Nlc3MgcmlnaHRzCisJICogMCAtIFJlYWQvV3JpdGUKKwkgKiAxIC0gUmVhZCBvbmx5CisJICovCisJdWludDhfdCBibUF0dHJpYnV0ZXM7CisjZGVmaW5lIENGSV9GRUFUVVJFX0FUVFJfUk8JCTEKKyNkZWZpbmUgQ0ZJX0ZFQVRVUkVfQVRUUl9SVwkJMAorCisJLyoqIExlbmd0aCBvZiB0aGUgZmVhdHVyZSBuYW1lIGluIGJ5dGVzICovCisJdWludDhfdCBiTmFtZUxlbjsKKworCS8qKiBUaGUgZmVhdHVyZSBuYW1lIGJ1ZmZlciAqLworCS8vdWludDhfdCAqbmFtZTsKK30gVVBBQ0tFRDsKKwordHlwZWRlZiBzdHJ1Y3QgY2ZpX2ZlYXR1cmVfZGVzY19oZWFkZXIgY2ZpX2ZlYXR1cmVfZGVzY19oZWFkZXJfdDsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nIHJlZmVyZW5jZWQgYnkgaXRzIGlkIGZpZWxkLgorICogSXQgaXMgdmVyeSBzaW1pbGFyIHRvIHVzYl9zdHJpbmcgc3RydWN0dXJlIGJ1dCBoYXMgdGhlIGlkIGZpZWxkIHR5cGUgc2V0IHRvIDE2LWJpdC4KKyAqLworc3RydWN0IGNmaV9zdHJpbmcgeworCXVpbnQxNl90IGlkOworCWNvbnN0IHVpbnQ4X3QgKnM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgY2ZpX3N0cmluZyBjZmlfc3RyaW5nX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfY29tbW9uX2Zic2QuYyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2NvbW1vbl9mYnNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMDRiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2NvbW1vbl9mYnNkLmMKQEAgLTAsMCArMSwxMzA4IEBACisjaW5jbHVkZSAiZHdjX29zLmgiCisjaW5jbHVkZSAiZHdjX2xpc3QuaCIKKworI2lmZGVmIERXQ19DQ0xJQgorIyBpbmNsdWRlICJkd2NfY2MuaCIKKyNlbmRpZgorCisjaWZkZWYgRFdDX0NSWVBUT0xJQgorIyBpbmNsdWRlICJkd2NfbW9kcG93LmgiCisjIGluY2x1ZGUgImR3Y19kaC5oIgorIyBpbmNsdWRlICJkd2NfY3J5cHRvLmgiCisjZW5kaWYKKworI2lmZGVmIERXQ19OT1RJRllMSUIKKyMgaW5jbHVkZSAiZHdjX25vdGlmaWVyLmgiCisjZW5kaWYKKworLyogT1MtTGV2ZWwgSW1wbGVtZW50YXRpb25zICovCisKKy8qIFRoaXMgaXMgdGhlIEZyZWVCU0QgNy4wIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRFdDIHBsYXRmb3JtIGxpYnJhcnkuICovCisKKworLyogTUlTQyAqLworCit2b2lkICpEV0NfTUVNU0VUKHZvaWQgKmRlc3QsIHVpbnQ4X3QgYnl0ZSwgdWludDMyX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gbWVtc2V0KGRlc3QsIGJ5dGUsIHNpemUpOworfQorCit2b2lkICpEV0NfTUVNQ1BZKHZvaWQgKmRlc3QsIHZvaWQgY29uc3QgKnNyYywgdWludDMyX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gbWVtY3B5KGRlc3QsIHNyYywgc2l6ZSk7Cit9CisKK3ZvaWQgKkRXQ19NRU1NT1ZFKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdWludDMyX3Qgc2l6ZSkKK3sKKwliY29weShzcmMsIGRlc3QsIHNpemUpOworCXJldHVybiBkZXN0OworfQorCitpbnQgRFdDX01FTUNNUCh2b2lkICptMSwgdm9pZCAqbTIsIHVpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIG1lbWNtcChtMSwgbTIsIHNpemUpOworfQorCitpbnQgRFdDX1NUUk5DTVAodm9pZCAqczEsIHZvaWQgKnMyLCB1aW50MzJfdCBzaXplKQoreworCXJldHVybiBzdHJuY21wKHMxLCBzMiwgc2l6ZSk7Cit9CisKK2ludCBEV0NfU1RSQ01QKHZvaWQgKnMxLCB2b2lkICpzMikKK3sKKwlyZXR1cm4gc3RyY21wKHMxLCBzMik7Cit9CisKK2ludCBEV0NfU1RSTEVOKGNoYXIgY29uc3QgKnN0cikKK3sKKwlyZXR1cm4gc3RybGVuKHN0cik7Cit9CisKK2NoYXIgKkRXQ19TVFJDUFkoY2hhciAqdG8sIGNoYXIgY29uc3QgKmZyb20pCit7CisJcmV0dXJuIHN0cmNweSh0bywgZnJvbSk7Cit9CisKK2NoYXIgKkRXQ19TVFJEVVAoY2hhciBjb25zdCAqc3RyKQoreworCWludCBsZW4gPSBEV0NfU1RSTEVOKHN0cikgKyAxOworCWNoYXIgKm5ldyA9IERXQ19BTExPQ19BVE9NSUMobGVuKTsKKworCWlmICghbmV3KSB7CisJCXJldHVybiBOVUxMOworCX0KKworCURXQ19NRU1DUFkobmV3LCBzdHIsIGxlbik7CisJcmV0dXJuIG5ldzsKK30KKworaW50IERXQ19BVE9JKGNoYXIgKnN0ciwgaW50MzJfdCAqdmFsdWUpCit7CisJY2hhciAqZW5kID0gTlVMTDsKKworCSp2YWx1ZSA9IHN0cnRvbChzdHIsICZlbmQsIDApOworCWlmICgqZW5kID09ICdcMCcpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC0xOworfQorCitpbnQgRFdDX0FUT1VJKGNoYXIgKnN0ciwgdWludDMyX3QgKnZhbHVlKQoreworCWNoYXIgKmVuZCA9IE5VTEw7CisKKwkqdmFsdWUgPSBzdHJ0b3VsKHN0ciwgJmVuZCwgMCk7CisJaWYgKCplbmQgPT0gJ1wwJykgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKworI2lmZGVmIERXQ19VVEZMSUIKKy8qIEZyb20gdXNic3RyaW5nLmMgKi8KKworaW50IERXQ19VVEY4X1RPX1VURjE2TEUodWludDhfdCBjb25zdCAqcywgdWludDE2X3QgKmNwLCB1bnNpZ25lZCBsZW4pCit7CisJaW50CWNvdW50ID0gMDsKKwl1OAljOworCXUxNgl1Y2hhcjsKKworCS8qIHRoaXMgaW5zaXN0cyBvbiBjb3JyZWN0IGVuY29kaW5ncywgdGhvdWdoIG5vdCBtaW5pbWFsIG9uZXMuCisJICogQlVUIGl0IGN1cnJlbnRseSByZWplY3RzIGxlZ2l0IDQtYnl0ZSBVVEYtOCBjb2RlIHBvaW50cywKKwkgKiB3aGljaCBuZWVkIHN1cnJvZ2F0ZSBwYWlycy4gIChVbmljb2RlIDMuMSBjYW4gdXNlIHRoZW0uKQorCSAqLworCXdoaWxlIChsZW4gIT0gMCAmJiAoYyA9ICh1OCkgKnMrKykgIT0gMCkgeworCQlpZiAodW5saWtlbHkoYyAmIDB4ODApKSB7CisJCQkvLyAyLWJ5dGUgc2VxdWVuY2U6CisJCQkvLyAwMDAwMHl5eXl5eHh4eHh4ID0gMTEweXl5eXkgMTB4eHh4eHgKKwkJCWlmICgoYyAmIDB4ZTApID09IDB4YzApIHsKKwkJCQl1Y2hhciA9IChjICYgMHgxZikgPDwgNjsKKworCQkJCWMgPSAodTgpICpzKys7CisJCQkJaWYgKChjICYgMHhjMCkgIT0gMHhjMCkKKwkJCQkJZ290byBmYWlsOworCQkJCWMgJj0gMHgzZjsKKwkJCQl1Y2hhciB8PSBjOworCisJCQkvLyAzLWJ5dGUgc2VxdWVuY2UgKG1vc3QgQ0pLViBjaGFyYWN0ZXJzKToKKwkJCS8vIHp6enp5eXl5eXl4eHh4eHggPSAxMTEwenp6eiAxMHl5eXl5eSAxMHh4eHh4eAorCQkJfSBlbHNlIGlmICgoYyAmIDB4ZjApID09IDB4ZTApIHsKKwkJCQl1Y2hhciA9IChjICYgMHgwZikgPDwgMTI7CisKKwkJCQljID0gKHU4KSAqcysrOworCQkJCWlmICgoYyAmIDB4YzApICE9IDB4YzApCisJCQkJCWdvdG8gZmFpbDsKKwkJCQljICY9IDB4M2Y7CisJCQkJdWNoYXIgfD0gYyA8PCA2OworCisJCQkJYyA9ICh1OCkgKnMrKzsKKwkJCQlpZiAoKGMgJiAweGMwKSAhPSAweGMwKQorCQkJCQlnb3RvIGZhaWw7CisJCQkJYyAmPSAweDNmOworCQkJCXVjaGFyIHw9IGM7CisKKwkJCQkvKiBubyBib2d1cyBzdXJyb2dhdGVzICovCisJCQkJaWYgKDB4ZDgwMCA8PSB1Y2hhciAmJiB1Y2hhciA8PSAweGRmZmYpCisJCQkJCWdvdG8gZmFpbDsKKworCQkJLy8gNC1ieXRlIHNlcXVlbmNlIChzdXJyb2dhdGUgcGFpcnMsIGN1cnJlbnRseSByYXJlKToKKwkJCS8vIDExMTAxMTEwd3d3d3p6enp5eSArIDExMDExMXl5eXl4eHh4eHgKKwkJCS8vICAgICA9IDExMTEwdXV1IDEwdXV6enp6IDEweXl5eXl5IDEweHh4eHh4CisJCQkvLyAodXV1dXUgPSB3d3d3ICsgMSkKKwkJCS8vIEZJWE1FIGFjY2VwdCB0aGUgc3Vycm9nYXRlIGNvZGUgcG9pbnRzIChvbmx5KQorCQkJfSBlbHNlCisJCQkJZ290byBmYWlsOworCQl9IGVsc2UKKwkJCXVjaGFyID0gYzsKKwkJcHV0X3VuYWxpZ25lZCAoY3B1X3RvX2xlMTYgKHVjaGFyKSwgY3ArKyk7CisJCWNvdW50Kys7CisJCWxlbi0tOworCX0KKwlyZXR1cm4gY291bnQ7CitmYWlsOgorCXJldHVybiAtMTsKK30KKworI2VuZGlmCS8qIERXQ19VVEZMSUIgKi8KKworCisvKiBkd2NfZGVidWcuaCAqLworCitkd2NfYm9vbF90IERXQ19JTl9JUlEodm9pZCkKK3sKKy8vCXJldHVybiBpbl9pcnEoKTsKKwlyZXR1cm4gMDsKK30KKworZHdjX2Jvb2xfdCBEV0NfSU5fQkgodm9pZCkKK3sKKy8vCXJldHVybiBpbl9zb2Z0aXJxKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgRFdDX1ZQUklOVEYoY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisJdnByaW50Zihmb3JtYXQsIGFyZ3MpOworfQorCitpbnQgRFdDX1ZTTlBSSU5URihjaGFyICpzdHIsIGludCBzaXplLCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKwlyZXR1cm4gdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCBhcmdzKTsKK30KKwordm9pZCBEV0NfUFJJTlRGKGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJRFdDX1ZQUklOVEYoZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKK2ludCBEV0NfU1BSSU5URihjaGFyICpidWZmZXIsIGNoYXIgKmZvcm1hdCwgLi4uKQoreworCWludCByZXR2YWw7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlyZXR2YWwgPSB2c3ByaW50ZihidWZmZXIsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBEV0NfU05QUklOVEYoY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJaW50IHJldHZhbDsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCXJldHZhbCA9IHZzbnByaW50ZihidWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgX19EV0NfV0FSTihjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19WUFJJTlRGKGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIF9fRFdDX0VSUk9SKGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJRFdDX1ZQUklOVEYoZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgRFdDX0VYQ0VQVElPTihjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19WUFJJTlRGKGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworLy8JQlVHX09OKDEpOwk/Pz8KK30KKworI2lmZGVmIERFQlVHCit2b2lkIF9fRFdDX0RFQlVHKGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJRFdDX1ZQUklOVEYoZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisjZW5kaWYKKworCisvKiBkd2NfbWVtLmggKi8KKworI2lmIDAKK2R3Y19wb29sX3QgKkRXQ19ETUFfUE9PTF9DUkVBVEUodWludDMyX3Qgc2l6ZSwKKwkJCQl1aW50MzJfdCBhbGlnbiwKKwkJCQl1aW50MzJfdCBhbGxvYykKK3sKKwlzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wgPSBkbWFfcG9vbF9jcmVhdGUoIlBvb2wiLCBOVUxMLAorCQkJCQkJc2l6ZSwgYWxpZ24sIGFsbG9jKTsKKwlyZXR1cm4gKGR3Y19wb29sX3QgKilwb29sOworfQorCit2b2lkIERXQ19ETUFfUE9PTF9ERVNUUk9ZKGR3Y19wb29sX3QgKnBvb2wpCit7CisJZG1hX3Bvb2xfZGVzdHJveSgoc3RydWN0IGRtYV9wb29sICopcG9vbCk7Cit9CisKK3ZvaWQgKkRXQ19ETUFfUE9PTF9BTExPQyhkd2NfcG9vbF90ICpwb29sLCB1aW50NjRfdCAqZG1hX2FkZHIpCit7CisvLwlyZXR1cm4gZG1hX3Bvb2xfYWxsb2MoKHN0cnVjdCBkbWFfcG9vbCAqKXBvb2wsIEdGUF9LRVJORUwsIGRtYV9hZGRyKTsKKwlyZXR1cm4gZG1hX3Bvb2xfYWxsb2MoKHN0cnVjdCBkbWFfcG9vbCAqKXBvb2wsIE1fV0FJVE9LLCBkbWFfYWRkcik7Cit9CisKK3ZvaWQgKkRXQ19ETUFfUE9PTF9aQUxMT0MoZHdjX3Bvb2xfdCAqcG9vbCwgdWludDY0X3QgKmRtYV9hZGRyKQoreworCXZvaWQgKnZhZGRyID0gRFdDX0RNQV9QT09MX0FMTE9DKHBvb2wsIGRtYV9hZGRyKTsKKwltZW1zZXQoLi4pOworfQorCit2b2lkIERXQ19ETUFfUE9PTF9GUkVFKGR3Y19wb29sX3QgKnBvb2wsIHZvaWQgKnZhZGRyLCB2b2lkICpkYWRkcikKK3sKKwlkbWFfcG9vbF9mcmVlKHBvb2wsIHZhZGRyLCBkYWRkcik7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZG1hbWFwX2NiKHZvaWQgKmFyZywgYnVzX2RtYV9zZWdtZW50X3QgKnNlZ3MsIGludCBuc2VnLCBpbnQgZXJyb3IpCit7CisJaWYgKGVycm9yKQorCQlyZXR1cm47CisJKihidXNfYWRkcl90ICopYXJnID0gc2Vnc1swXS5kc19hZGRyOworfQorCit2b2lkICpfX0RXQ19ETUFfQUxMT0Modm9pZCAqZG1hX2N0eCwgdWludDMyX3Qgc2l6ZSwgZHdjX2RtYV90ICpkbWFfYWRkcikKK3sKKwlkd2NfZG1hY3R4X3QgKmRtYSA9IChkd2NfZG1hY3R4X3QgKilkbWFfY3R4OworCWludCBlcnJvcjsKKworCWVycm9yID0gYnVzX2RtYV90YWdfY3JlYXRlKAorI2lmIF9fRnJlZUJTRF92ZXJzaW9uID49IDcwMDAwMAorCQkJYnVzX2dldF9kbWFfdGFnKGRtYS0+ZGV2KSwJLyogcGFyZW50ICovCisjZWxzZQorCQkJTlVMTCwJCQkJLyogcGFyZW50ICovCisjZW5kaWYKKwkJCTQsIDAsCQkJCS8qIGFsaWdubWVudCwgYm91bmRzICovCisJCQlCVVNfU1BBQ0VfTUFYQUREUl8zMkJJVCwJLyogbG93YWRkciAqLworCQkJQlVTX1NQQUNFX01BWEFERFIsCQkvKiBoaWdoYWRkciAqLworCQkJTlVMTCwgTlVMTCwJCQkvKiBmaWx0ZXIsIGZpbHRlcmFyZyAqLworCQkJc2l6ZSwJCQkJLyogbWF4c2l6ZSAqLworCQkJMSwJCQkJLyogbnNlZ21lbnRzICovCisJCQlzaXplLAkJCQkvKiBtYXhzZWdzaXplICovCisJCQkwLAkJCQkvKiBmbGFncyAqLworCQkJTlVMTCwJCQkJLyogbG9ja2Z1bmMgKi8KKwkJCU5VTEwsCQkJCS8qIGxvY2thcmcgKi8KKwkJCSZkbWEtPmRtYV90YWcpOworCWlmIChlcnJvcikgeworCQlkZXZpY2VfcHJpbnRmKGRtYS0+ZGV2LCAiJXM6IGJ1c19kbWFfdGFnX2NyZWF0ZSBmYWlsZWQ6ICVkXG4iLAorCQkJICAgICAgX19mdW5jX18sIGVycm9yKTsKKwkJZ290byBmYWlsXzA7CisJfQorCisJZXJyb3IgPSBidXNfZG1hbWVtX2FsbG9jKGRtYS0+ZG1hX3RhZywgJmRtYS0+ZG1hX3ZhZGRyLAorCQkJCSBCVVNfRE1BX05PV0FJVCB8IEJVU19ETUFfQ09IRVJFTlQsICZkbWEtPmRtYV9tYXApOworCWlmIChlcnJvcikgeworCQlkZXZpY2VfcHJpbnRmKGRtYS0+ZGV2LCAiJXM6IGJ1c19kbWFtZW1fYWxsb2MoJWp1KSBmYWlsZWQ6ICVkXG4iLAorCQkJICAgICAgX19mdW5jX18sICh1aW50bWF4X3Qpc2l6ZSwgZXJyb3IpOworCQlnb3RvIGZhaWxfMTsKKwl9CisKKwlkbWEtPmRtYV9wYWRkciA9IDA7CisJZXJyb3IgPSBidXNfZG1hbWFwX2xvYWQoZG1hLT5kbWFfdGFnLCBkbWEtPmRtYV9tYXAsIGRtYS0+ZG1hX3ZhZGRyLCBzaXplLAorCQkJCWRtYW1hcF9jYiwgJmRtYS0+ZG1hX3BhZGRyLCBCVVNfRE1BX05PV0FJVCk7CisJaWYgKGVycm9yIHx8IGRtYS0+ZG1hX3BhZGRyID09IDApIHsKKwkJZGV2aWNlX3ByaW50ZihkbWEtPmRldiwgIiVzOiBidXNfZG1hbWFwX2xvYWQgZmFpbGVkOiAlZFxuIiwKKwkJCSAgICAgIF9fZnVuY19fLCBlcnJvcik7CisJCWdvdG8gZmFpbF8yOworCX0KKworCSpkbWFfYWRkciA9IGRtYS0+ZG1hX3BhZGRyOworCXJldHVybiBkbWEtPmRtYV92YWRkcjsKKworZmFpbF8yOgorCWJ1c19kbWFtYXBfdW5sb2FkKGRtYS0+ZG1hX3RhZywgZG1hLT5kbWFfbWFwKTsKK2ZhaWxfMToKKwlidXNfZG1hbWVtX2ZyZWUoZG1hLT5kbWFfdGFnLCBkbWEtPmRtYV92YWRkciwgZG1hLT5kbWFfbWFwKTsKKwlidXNfZG1hX3RhZ19kZXN0cm95KGRtYS0+ZG1hX3RhZyk7CitmYWlsXzA6CisJZG1hLT5kbWFfbWFwID0gTlVMTDsKKwlkbWEtPmRtYV90YWcgPSBOVUxMOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgX19EV0NfRE1BX0ZSRUUodm9pZCAqZG1hX2N0eCwgdWludDMyX3Qgc2l6ZSwgdm9pZCAqdmlydF9hZGRyLCBkd2NfZG1hX3QgZG1hX2FkZHIpCit7CisJZHdjX2RtYWN0eF90ICpkbWEgPSAoZHdjX2RtYWN0eF90ICopZG1hX2N0eDsKKworCWlmIChkbWEtPmRtYV90YWcgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChkbWEtPmRtYV9tYXAgIT0gTlVMTCkgeworCQlidXNfZG1hbWFwX3N5bmMoZG1hLT5kbWFfdGFnLCBkbWEtPmRtYV9tYXAsCisJCQkJQlVTX0RNQVNZTkNfUE9TVFJFQUQgfCBCVVNfRE1BU1lOQ19QT1NUV1JJVEUpOworCQlidXNfZG1hbWFwX3VubG9hZChkbWEtPmRtYV90YWcsIGRtYS0+ZG1hX21hcCk7CisJCWJ1c19kbWFtZW1fZnJlZShkbWEtPmRtYV90YWcsIGRtYS0+ZG1hX3ZhZGRyLCBkbWEtPmRtYV9tYXApOworCQlkbWEtPmRtYV9tYXAgPSBOVUxMOworCX0KKworCWJ1c19kbWFfdGFnX2Rlc3Ryb3koZG1hLT5kbWFfdGFnKTsKKwlkbWEtPmRtYV90YWcgPSBOVUxMOworfQorCit2b2lkICpfX0RXQ19BTExPQyh2b2lkICptZW1fY3R4LCB1aW50MzJfdCBzaXplKQoreworCXJldHVybiBtYWxsb2Moc2l6ZSwgTV9ERVZCVUYsIE1fV0FJVE9LIHwgTV9aRVJPKTsKK30KKwordm9pZCAqX19EV0NfQUxMT0NfQVRPTUlDKHZvaWQgKm1lbV9jdHgsIHVpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIG1hbGxvYyhzaXplLCBNX0RFVkJVRiwgTV9OT1dBSVQgfCBNX1pFUk8pOworfQorCit2b2lkIF9fRFdDX0ZSRUUodm9pZCAqbWVtX2N0eCwgdm9pZCAqYWRkcikKK3sKKwlmcmVlKGFkZHIsIE1fREVWQlVGKTsKK30KKworCisjaWZkZWYgRFdDX0NSWVBUT0xJQgorLyogZHdjX2NyeXB0by5oICovCisKK3ZvaWQgRFdDX1JBTkRPTV9CWVRFUyh1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCkKK3sKKwlnZXRfcmFuZG9tX2J5dGVzKGJ1ZmZlciwgbGVuZ3RoKTsKK30KKworaW50IERXQ19BRVNfQ0JDKHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IG1lc3NhZ2VsZW4sIHVpbnQ4X3QgKmtleSwgdWludDMyX3Qga2V5bGVuLCB1aW50OF90IGl2WzE2XSwgdWludDhfdCAqb3V0KQoreworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm07CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnZDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dzOworCisJdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiY2JjKGFlcykiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAodGZtID09IE5VTEwpIHsKKwkJcHJpbnRrKCJmYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yIGFlcyBDQkNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7CisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRfaXYodGZtLCBpdiwgMTYpOworCisJc2dfaW5pdF9vbmUoJnNnZCwgb3V0LCBtZXNzYWdlbGVuKTsKKwlzZ19pbml0X29uZSgmc2dzLCBtZXNzYWdlLCBtZXNzYWdlbGVuKTsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuZmxhZ3MgPSAwOworCisJaWYgKGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnZCwgJnNncywgbWVzc2FnZWxlbikpIHsKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHRmbSk7CisJCURXQ19FUlJPUigiQUVTIENCQyBlbmNyeXB0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHRmbSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEV0NfU0hBMjU2KHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IGxlbiwgdWludDhfdCAqb3V0KQoreworCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtOworCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaCgic2hhMjU2IiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCURXQ19FUlJPUigiRmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciBzaGEyNTY6ICVsZCIsIFBUUl9FUlIodGZtKSk7CisJCXJldHVybiAwOworCX0KKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmZsYWdzID0gMDsKKworCXNnX2luaXRfb25lKCZzZywgbWVzc2FnZSwgbGVuKTsKKwljcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsICZzZywgbGVuLCBvdXQpOworCWNyeXB0b19mcmVlX2hhc2godGZtKTsKKworCXJldHVybiAxOworfQorCitpbnQgRFdDX0hNQUNfU0hBMjU2KHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IG1lc3NhZ2VsZW4sCisJCSAgICB1aW50OF90ICprZXksIHVpbnQzMl90IGtleWxlbiwgdWludDhfdCAqb3V0KQoreworCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtOworCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaCgiaG1hYyhzaGEyNTYpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCURXQ19FUlJPUigiRmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciBobWFjKHNoYTI1Nik6ICVsZCIsIFBUUl9FUlIodGZtKSk7CisJCXJldHVybiAwOworCX0KKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmZsYWdzID0gMDsKKworCXNnX2luaXRfb25lKCZzZywgbWVzc2FnZSwgbWVzc2FnZWxlbik7CisJY3J5cHRvX2hhc2hfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOworCWNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgJnNnLCBtZXNzYWdlbGVuLCBvdXQpOworCWNyeXB0b19mcmVlX2hhc2godGZtKTsKKworCXJldHVybiAxOworfQorCisjZW5kaWYJLyogRFdDX0NSWVBUT0xJQiAqLworCisKKy8qIEJ5dGUgT3JkZXJpbmcgQ29udmVyc2lvbnMgKi8KKwordWludDMyX3QgRFdDX0NQVV9UT19MRTMyKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDMyX3QgRFdDX0NQVV9UT19CRTMyKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDMyX3QgRFdDX0xFMzJfVE9fQ1BVKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDMyX3QgRFdDX0JFMzJfVE9fQ1BVKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0NQVV9UT19MRTE2KHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0NQVV9UT19CRTE2KHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0xFMTZfVE9fQ1BVKHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0JFMTZfVE9fQ1BVKHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKworCisvKiBSZWdpc3RlcnMgKi8KKwordWludDMyX3QgRFdDX1JFQURfUkVHMzIodm9pZCAqaW9fY3R4LCB1aW50MzJfdCB2b2xhdGlsZSAqcmVnKQoreworCWR3Y19pb2N0eF90ICppbyA9IChkd2NfaW9jdHhfdCAqKWlvX2N0eDsKKwlidXNfc2l6ZV90IGlvciA9IChidXNfc2l6ZV90KXJlZzsKKworCXJldHVybiBidXNfc3BhY2VfcmVhZF80KGlvLT5pb3QsIGlvLT5pb2gsIGlvcik7Cit9CisKKyNpZiAwCit1aW50NjRfdCBEV0NfUkVBRF9SRUc2NCh2b2lkICppb19jdHgsIHVpbnQ2NF90IHZvbGF0aWxlICpyZWcpCit7CisJZHdjX2lvY3R4X3QgKmlvID0gKGR3Y19pb2N0eF90ICopaW9fY3R4OworCWJ1c19zaXplX3QgaW9yID0gKGJ1c19zaXplX3QpcmVnOworCisJcmV0dXJuIGJ1c19zcGFjZV9yZWFkXzgoaW8tPmlvdCwgaW8tPmlvaCwgaW9yKTsKK30KKyNlbmRpZgorCit2b2lkIERXQ19XUklURV9SRUczMih2b2lkICppb19jdHgsIHVpbnQzMl90IHZvbGF0aWxlICpyZWcsIHVpbnQzMl90IHZhbHVlKQoreworCWR3Y19pb2N0eF90ICppbyA9IChkd2NfaW9jdHhfdCAqKWlvX2N0eDsKKwlidXNfc2l6ZV90IGlvciA9IChidXNfc2l6ZV90KXJlZzsKKworCWJ1c19zcGFjZV93cml0ZV80KGlvLT5pb3QsIGlvLT5pb2gsIGlvciwgdmFsdWUpOworfQorCisjaWYgMAordm9pZCBEV0NfV1JJVEVfUkVHNjQodm9pZCAqaW9fY3R4LCB1aW50NjRfdCB2b2xhdGlsZSAqcmVnLCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlkd2NfaW9jdHhfdCAqaW8gPSAoZHdjX2lvY3R4X3QgKilpb19jdHg7CisJYnVzX3NpemVfdCBpb3IgPSAoYnVzX3NpemVfdClyZWc7CisKKwlidXNfc3BhY2Vfd3JpdGVfOChpby0+aW90LCBpby0+aW9oLCBpb3IsIHZhbHVlKTsKK30KKyNlbmRpZgorCit2b2lkIERXQ19NT0RJRllfUkVHMzIodm9pZCAqaW9fY3R4LCB1aW50MzJfdCB2b2xhdGlsZSAqcmVnLCB1aW50MzJfdCBjbGVhcl9tYXNrLAorCQkgICAgICB1aW50MzJfdCBzZXRfbWFzaykKK3sKKwlkd2NfaW9jdHhfdCAqaW8gPSAoZHdjX2lvY3R4X3QgKilpb19jdHg7CisJYnVzX3NpemVfdCBpb3IgPSAoYnVzX3NpemVfdClyZWc7CisKKwlidXNfc3BhY2Vfd3JpdGVfNChpby0+aW90LCBpby0+aW9oLCBpb3IsCisJCQkgIChidXNfc3BhY2VfcmVhZF80KGlvLT5pb3QsIGlvLT5pb2gsIGlvcikgJgorCQkJICAgfmNsZWFyX21hc2spIHwgc2V0X21hc2spOworfQorCisjaWYgMAordm9pZCBEV0NfTU9ESUZZX1JFRzY0KHZvaWQgKmlvX2N0eCwgdWludDY0X3Qgdm9sYXRpbGUgKnJlZywgdWludDY0X3QgY2xlYXJfbWFzaywKKwkJICAgICAgdWludDY0X3Qgc2V0X21hc2spCit7CisJZHdjX2lvY3R4X3QgKmlvID0gKGR3Y19pb2N0eF90ICopaW9fY3R4OworCWJ1c19zaXplX3QgaW9yID0gKGJ1c19zaXplX3QpcmVnOworCisJYnVzX3NwYWNlX3dyaXRlXzgoaW8tPmlvdCwgaW8tPmlvaCwgaW9yLAorCQkJICAoYnVzX3NwYWNlX3JlYWRfOChpby0+aW90LCBpby0+aW9oLCBpb3IpICYKKwkJCSAgIH5jbGVhcl9tYXNrKSB8IHNldF9tYXNrKTsKK30KKyNlbmRpZgorCisKKy8qIExvY2tpbmcgKi8KKworZHdjX3NwaW5sb2NrX3QgKkRXQ19TUElOTE9DS19BTExPQyh2b2lkKQoreworCXN0cnVjdCBtdHggKnNsID0gRFdDX0FMTE9DKHNpemVvZigqc2wpKTsKKworCWlmICghc2wpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzcGlubG9jayIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltdHhfaW5pdChzbCwgImR3M3NwbiIsIE5VTEwsIE1UWF9TUElOKTsKKwlyZXR1cm4gKGR3Y19zcGlubG9ja190ICopc2w7Cit9CisKK3ZvaWQgRFdDX1NQSU5MT0NLX0ZSRUUoZHdjX3NwaW5sb2NrX3QgKmxvY2spCit7CisJc3RydWN0IG10eCAqc2wgPSAoc3RydWN0IG10eCAqKWxvY2s7CisKKwltdHhfZGVzdHJveShzbCk7CisJRFdDX0ZSRUUoc2wpOworfQorCit2b2lkIERXQ19TUElOTE9DSyhkd2Nfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwltdHhfbG9ja19zcGluKChzdHJ1Y3QgbXR4ICopbG9jayk7CS8vID8/PworfQorCit2b2lkIERXQ19TUElOVU5MT0NLKGR3Y19zcGlubG9ja190ICpsb2NrKQoreworCW10eF91bmxvY2tfc3Bpbigoc3RydWN0IG10eCAqKWxvY2spOwkvLyA/Pz8KK30KKwordm9pZCBEV0NfU1BJTkxPQ0tfSVJRU0FWRShkd2Nfc3BpbmxvY2tfdCAqbG9jaywgZHdjX2lycWZsYWdzX3QgKmZsYWdzKQoreworCW10eF9sb2NrX3NwaW4oKHN0cnVjdCBtdHggKilsb2NrKTsKK30KKwordm9pZCBEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKGR3Y19zcGlubG9ja190ICpsb2NrLCBkd2NfaXJxZmxhZ3NfdCBmbGFncykKK3sKKwltdHhfdW5sb2NrX3NwaW4oKHN0cnVjdCBtdHggKilsb2NrKTsKK30KKworZHdjX211dGV4X3QgKkRXQ19NVVRFWF9BTExPQyh2b2lkKQoreworCXN0cnVjdCBtdHggKm07CisJZHdjX211dGV4X3QgKm11dGV4ID0gKGR3Y19tdXRleF90ICopRFdDX0FMTE9DKHNpemVvZihzdHJ1Y3QgbXR4KSk7CisKKwlpZiAoIW11dGV4KSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbXV0ZXgiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbSA9IChzdHJ1Y3QgbXR4ICopbXV0ZXg7CisJbXR4X2luaXQobSwgImR3M210eCIsIE5VTEwsIE1UWF9ERUYpOworCXJldHVybiBtdXRleDsKK30KKworI2lmIChkZWZpbmVkKERXQ19MSU5VWCkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfTVVURVhFUykpCisjZWxzZQordm9pZCBEV0NfTVVURVhfRlJFRShkd2NfbXV0ZXhfdCAqbXV0ZXgpCit7CisJbXR4X2Rlc3Ryb3koKHN0cnVjdCBtdHggKiltdXRleCk7CisJRFdDX0ZSRUUobXV0ZXgpOworfQorI2VuZGlmCisKK3ZvaWQgRFdDX01VVEVYX0xPQ0soZHdjX211dGV4X3QgKm11dGV4KQoreworCXN0cnVjdCBtdHggKm0gPSAoc3RydWN0IG10eCAqKW11dGV4OworCisJbXR4X2xvY2sobSk7Cit9CisKK2ludCBEV0NfTVVURVhfVFJZTE9DSyhkd2NfbXV0ZXhfdCAqbXV0ZXgpCit7CisJc3RydWN0IG10eCAqbSA9IChzdHJ1Y3QgbXR4ICopbXV0ZXg7CisKKwlyZXR1cm4gbXR4X3RyeWxvY2sobSk7Cit9CisKK3ZvaWQgRFdDX01VVEVYX1VOTE9DSyhkd2NfbXV0ZXhfdCAqbXV0ZXgpCit7CisJc3RydWN0IG10eCAqbSA9IChzdHJ1Y3QgbXR4ICopbXV0ZXg7CisKKwltdHhfdW5sb2NrKG0pOworfQorCisKKy8qIFRpbWluZyAqLworCit2b2lkIERXQ19VREVMQVkodWludDMyX3QgdXNlY3MpCit7CisJREVMQVkodXNlY3MpOworfQorCit2b2lkIERXQ19NREVMQVkodWludDMyX3QgbXNlY3MpCit7CisJZG8geworCQlERUxBWSgxMDAwKTsKKwl9IHdoaWxlICgtLW1zZWNzKTsKK30KKwordm9pZCBEV0NfTVNMRUVQKHVpbnQzMl90IG1zZWNzKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJdHYudHZfc2VjID0gbXNlY3MgLyAxMDAwOworCXR2LnR2X3VzZWMgPSAobXNlY3MgLSB0di50dl9zZWMgKiAxMDAwKSAqIDEwMDA7CisJcGF1c2UoImR3M3NscCIsIHR2dG9oeigmdHYpKTsKK30KKwordWludDMyX3QgRFdDX1RJTUUodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCW1pY3JvdXB0aW1lKCZ0dik7CS8vIG9yIGdldG1pY3JvdXB0aW1lPyAobGVzcyBwcmVjaXNlLCBidXQgZmFzdGVyKQorCXJldHVybiB0di50dl9zZWMgKiAxMDAwICsgdHYudHZfdXNlYyAvIDEwMDA7Cit9CisKKworLyogVGltZXJzICovCisKK3N0cnVjdCBkd2NfdGltZXIgeworCXN0cnVjdCBjYWxsb3V0IHQ7CisJY2hhciAqbmFtZTsKKwlkd2Nfc3BpbmxvY2tfdCAqbG9jazsKKwlkd2NfdGltZXJfY2FsbGJhY2tfdCBjYjsKKwl2b2lkICpkYXRhOworfTsKKworZHdjX3RpbWVyX3QgKkRXQ19USU1FUl9BTExPQyhjaGFyICpuYW1lLCBkd2NfdGltZXJfY2FsbGJhY2tfdCBjYiwgdm9pZCAqZGF0YSkKK3sKKwlkd2NfdGltZXJfdCAqdCA9IERXQ19BTExPQyhzaXplb2YoKnQpKTsKKworCWlmICghdCkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRpbWVyIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWNhbGxvdXRfaW5pdCgmdC0+dCwgMSk7CisKKwl0LT5uYW1lID0gRFdDX1NUUkRVUChuYW1lKTsKKwlpZiAoIXQtPm5hbWUpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aW1lci0+bmFtZSIpOworCQlnb3RvIG5vX25hbWU7CisJfQorCisJdC0+bG9jayA9IERXQ19TUElOTE9DS19BTExPQygpOworCWlmICghdC0+bG9jaykgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGxvY2siKTsKKwkJZ290byBub19sb2NrOworCX0KKworCXQtPmNiID0gY2I7CisJdC0+ZGF0YSA9IGRhdGE7CisKKwlyZXR1cm4gdDsKKworIG5vX2xvY2s6CisJRFdDX0ZSRUUodC0+bmFtZSk7Cisgbm9fbmFtZToKKwlEV0NfRlJFRSh0KTsKKworCXJldHVybiBOVUxMOworfQorCit2b2lkIERXQ19USU1FUl9GUkVFKGR3Y190aW1lcl90ICp0aW1lcikKK3sKKwljYWxsb3V0X3N0b3AoJnRpbWVyLT50KTsKKwlEV0NfU1BJTkxPQ0tfRlJFRSh0aW1lci0+bG9jayk7CisJRFdDX0ZSRUUodGltZXItPm5hbWUpOworCURXQ19GUkVFKHRpbWVyKTsKK30KKwordm9pZCBEV0NfVElNRVJfU0NIRURVTEUoZHdjX3RpbWVyX3QgKnRpbWVyLCB1aW50MzJfdCB0aW1lKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJdHYudHZfc2VjID0gdGltZSAvIDEwMDA7CisJdHYudHZfdXNlYyA9ICh0aW1lIC0gdHYudHZfc2VjICogMTAwMCkgKiAxMDAwOworCWNhbGxvdXRfcmVzZXQoJnRpbWVyLT50LCB0dnRvaHooJnR2KSwgdGltZXItPmNiLCB0aW1lci0+ZGF0YSk7Cit9CisKK3ZvaWQgRFdDX1RJTUVSX0NBTkNFTChkd2NfdGltZXJfdCAqdGltZXIpCit7CisJY2FsbG91dF9zdG9wKCZ0aW1lci0+dCk7Cit9CisKKworLyogV2FpdCBRdWV1ZXMgKi8KKworc3RydWN0IGR3Y193YWl0cSB7CisJc3RydWN0IG10eCBsb2NrOworCWludCBhYm9ydDsKK307CisKK2R3Y193YWl0cV90ICpEV0NfV0FJVFFfQUxMT0Modm9pZCkKK3sKKwlkd2Nfd2FpdHFfdCAqd3EgPSBEV0NfQUxMT0Moc2l6ZW9mKCp3cSkpOworCisJaWYgKCF3cSkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdhaXRxdWV1ZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltdHhfaW5pdCgmd3EtPmxvY2ssICJkdzN3dHEiLCBOVUxMLCBNVFhfREVGKTsKKwl3cS0+YWJvcnQgPSAwOworCisJcmV0dXJuIHdxOworfQorCit2b2lkIERXQ19XQUlUUV9GUkVFKGR3Y193YWl0cV90ICp3cSkKK3sKKwltdHhfZGVzdHJveSgmd3EtPmxvY2spOworCURXQ19GUkVFKHdxKTsKK30KKworaW50MzJfdCBEV0NfV0FJVFFfV0FJVChkd2Nfd2FpdHFfdCAqd3EsIGR3Y193YWl0cV9jb25kaXRpb25fdCBjb25kLCB2b2lkICpkYXRhKQoreworLy8JaW50cm1hc2tfdCBpcGw7CisJaW50IHJlc3VsdCA9IDA7CisKKwltdHhfbG9jaygmd3EtPmxvY2spOworLy8JaXBsID0gc3BsYmlvKCk7CisKKwkvKiBTa2lwIHRoZSBzbGVlcCBpZiBhbHJlYWR5IGFib3J0ZWQgb3IgdHJpZ2dlcmVkICovCisJaWYgKCF3cS0+YWJvcnQgJiYgIWNvbmQoZGF0YSkpIHsKKy8vCQlzcGx4KGlwbCk7CisJCXJlc3VsdCA9IG1zbGVlcCh3cSwgJndxLT5sb2NrLCBQQ0FUQ0gsICJkdzN3YXQiLCAwKTsgLy8gaW5maW5pdGUgdGltZW91dAorLy8JCWlwbCA9IHNwbGJpbygpOworCX0KKworCWlmIChyZXN1bHQgPT0gRVJFU1RBUlQpIHsJLy8gc2lnbmFsZWQgLSByZXN0YXJ0CisJCXJlc3VsdCA9IC1EV0NfRV9SRVNUQVJUOworCisJfSBlbHNlIGlmIChyZXN1bHQgPT0gRUlOVFIpIHsJLy8gc2lnbmFsZWQgLSBpbnRlcnJ1cHQKKwkJcmVzdWx0ID0gLURXQ19FX0FCT1JUOworCisJfSBlbHNlIGlmICh3cS0+YWJvcnQpIHsKKwkJcmVzdWx0ID0gLURXQ19FX0FCT1JUOworCisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gMDsKKwl9CisKKwl3cS0+YWJvcnQgPSAwOworLy8Jc3BseChpcGwpOworCW10eF91bmxvY2soJndxLT5sb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQzMl90IERXQ19XQUlUUV9XQUlUX1RJTUVPVVQoZHdjX3dhaXRxX3QgKndxLCBkd2Nfd2FpdHFfY29uZGl0aW9uX3QgY29uZCwKKwkJCSAgICAgICB2b2lkICpkYXRhLCBpbnQzMl90IG1zZWNzKQoreworCXN0cnVjdCB0aW1ldmFsIHR2LCB0djEsIHR2MjsKKy8vCWludHJtYXNrX3QgaXBsOworCWludCByZXN1bHQgPSAwOworCisJdHYudHZfc2VjID0gbXNlY3MgLyAxMDAwOworCXR2LnR2X3VzZWMgPSAobXNlY3MgLSB0di50dl9zZWMgKiAxMDAwKSAqIDEwMDA7CisKKwltdHhfbG9jaygmd3EtPmxvY2spOworLy8JaXBsID0gc3BsYmlvKCk7CisKKwkvKiBTa2lwIHRoZSBzbGVlcCBpZiBhbHJlYWR5IGFib3J0ZWQgb3IgdHJpZ2dlcmVkICovCisJaWYgKCF3cS0+YWJvcnQgJiYgIWNvbmQoZGF0YSkpIHsKKy8vCQlzcGx4KGlwbCk7CisJCWdldG1pY3JvdXB0aW1lKCZ0djEpOworCQlyZXN1bHQgPSBtc2xlZXAod3EsICZ3cS0+bG9jaywgUENBVENILCAiZHczd3RvIiwgdHZ0b2h6KCZ0dikpOworCQlnZXRtaWNyb3VwdGltZSgmdHYyKTsKKy8vCQlpcGwgPSBzcGxiaW8oKTsKKwl9CisKKwlpZiAocmVzdWx0ID09IDApIHsJCQkvLyBhd29rZW4KKwkJaWYgKHdxLT5hYm9ydCkgeworCQkJcmVzdWx0ID0gLURXQ19FX0FCT1JUOworCQl9IGVsc2UgeworCQkJdHYyLnR2X3VzZWMgLT0gdHYxLnR2X3VzZWM7CisJCQlpZiAodHYyLnR2X3VzZWMgPCAwKSB7CisJCQkJdHYyLnR2X3VzZWMgKz0gMTAwMDAwMDsKKwkJCQl0djIudHZfc2VjLS07CisJCQl9CisKKwkJCXR2Mi50dl9zZWMgLT0gdHYxLnR2X3NlYzsKKwkJCXJlc3VsdCA9IHR2Mi50dl9zZWMgKiAxMDAwICsgdHYyLnR2X3VzZWMgLyAxMDAwOworCQkJcmVzdWx0ID0gbXNlY3MgLSByZXN1bHQ7CisJCQlpZiAocmVzdWx0IDw9IDApCisJCQkJcmVzdWx0ID0gMTsKKwkJfQorCX0gZWxzZSBpZiAocmVzdWx0ID09IEVSRVNUQVJUKSB7CS8vIHNpZ25hbGVkIC0gcmVzdGFydAorCQlyZXN1bHQgPSAtRFdDX0VfUkVTVEFSVDsKKworCX0gZWxzZSBpZiAocmVzdWx0ID09IEVJTlRSKSB7CQkvLyBzaWduYWxlZCAtIGludGVycnVwdAorCQlyZXN1bHQgPSAtRFdDX0VfQUJPUlQ7CisKKwl9IGVsc2UgewkJCQkvLyB0aW1lZCBvdXQKKwkJcmVzdWx0ID0gLURXQ19FX1RJTUVPVVQ7CisJfQorCisJd3EtPmFib3J0ID0gMDsKKy8vCXNwbHgoaXBsKTsKKwltdHhfdW5sb2NrKCZ3cS0+bG9jayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEV0NfV0FJVFFfVFJJR0dFUihkd2Nfd2FpdHFfdCAqd3EpCit7CisJd2FrZXVwKHdxKTsKK30KKwordm9pZCBEV0NfV0FJVFFfQUJPUlQoZHdjX3dhaXRxX3QgKndxKQoreworLy8JaW50cm1hc2tfdCBpcGw7CisKKwltdHhfbG9jaygmd3EtPmxvY2spOworLy8JaXBsID0gc3BsYmlvKCk7CisJd3EtPmFib3J0ID0gMTsKKwl3YWtldXAod3EpOworLy8Jc3BseChpcGwpOworCW10eF91bmxvY2soJndxLT5sb2NrKTsKK30KKworCisvKiBUaHJlYWRpbmcgKi8KKworc3RydWN0IGR3Y190aHJlYWQgeworCXN0cnVjdCBwcm9jICpwcm9jOworCWludCBhYm9ydDsKK307CisKK2R3Y190aHJlYWRfdCAqRFdDX1RIUkVBRF9SVU4oZHdjX3RocmVhZF9mdW5jdGlvbl90IGZ1bmMsIGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldHZhbDsKKwlkd2NfdGhyZWFkX3QgKnRocmVhZCA9IERXQ19BTExPQyhzaXplb2YoKnRocmVhZCkpOworCisJaWYgKCF0aHJlYWQpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdGhyZWFkLT5hYm9ydCA9IDA7CisJcmV0dmFsID0ga3RocmVhZF9jcmVhdGUoKHZvaWQgKCopKHZvaWQgKikpZnVuYywgZGF0YSwgJnRocmVhZC0+cHJvYywKKwkJCQlSRlBST0MgfCBSRk5PV0FJVCwgMCwgIiVzIiwgbmFtZSk7CisJaWYgKHJldHZhbCkgeworCQlEV0NfRlJFRSh0aHJlYWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gdGhyZWFkOworfQorCitpbnQgRFdDX1RIUkVBRF9TVE9QKGR3Y190aHJlYWRfdCAqdGhyZWFkKQoreworCWludCByZXR2YWw7CisKKwl0aHJlYWQtPmFib3J0ID0gMTsKKwlyZXR2YWwgPSB0c2xlZXAoJnRocmVhZC0+YWJvcnQsIDAsICJkdzNzdHAiLCA2MCAqIGh6KTsKKworCWlmIChyZXR2YWwgPT0gMCkgeworCQkvKiBEV0NfVEhSRUFEX0VYSVQoKSB3aWxsIGZyZWUgdGhlIHRocmVhZCBzdHJ1Y3QgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogTk9URTogV2UgbGVhayB0aGUgdGhyZWFkIHN0cnVjdCBpZiB0aHJlYWQgZG9lc24ndCBkaWUgKi8KKworCWlmIChyZXR2YWwgPT0gRVdPVUxEQkxPQ0spIHsKKwkJcmV0dXJuIC1EV0NfRV9USU1FT1VUOworCX0KKworCXJldHVybiAtRFdDX0VfVU5LTk9XTjsKK30KKworZHdjX2Jvb2xfdCBEV0NfVEhSRUFEX1NIT1VMRF9TVE9QKGR3Y190aHJlYWRfdCAqdGhyZWFkKQoreworCXJldHVybiB0aHJlYWQtPmFib3J0OworfQorCit2b2lkIERXQ19USFJFQURfRVhJVChkd2NfdGhyZWFkX3QgKnRocmVhZCkKK3sKKwl3YWtldXAoJnRocmVhZC0+YWJvcnQpOworCURXQ19GUkVFKHRocmVhZCk7CisJa3RocmVhZF9leGl0KDApOworfQorCisKKy8qIHRhc2tsZXRzCisgLSBSdW5zIGluIGludGVycnVwdCBjb250ZXh0IChjYW5ub3Qgc2xlZXApCisgLSBFYWNoIHRhc2tsZXQgcnVucyBvbiBhIHNpbmdsZSBDUFUgWyBIb3cgY2FuIHdlIGVuc3VyZSB0aGlzIG9uIEZyZWVCU0Q/IERvZXMgaXQgbWF0dGVyPyBdCisgLSBEaWZmZXJlbnQgdGFza2xldHMgY2FuIGJlIHJ1bm5pbmcgc2ltdWx0YW5lb3VzbHkgb24gZGlmZmVyZW50IENQVXMgWyBzaG91bGRuJ3QgbWF0dGVyIF0KKyAqLworc3RydWN0IGR3Y190YXNrbGV0IHsKKwlzdHJ1Y3QgdGFzayB0OworCWR3Y190YXNrbGV0X2NhbGxiYWNrX3QgY2I7CisJdm9pZCAqZGF0YTsKK307CisKK3N0YXRpYyB2b2lkIHRhc2tsZXRfY2FsbGJhY2sodm9pZCAqZGF0YSwgaW50IHBlbmRpbmcpCS8vIHdoYXQgdG8gZG8gd2l0aCBwZW5kaW5nID8/PworeworCWR3Y190YXNrbGV0X3QgKnRhc2sgPSAoZHdjX3Rhc2tsZXRfdCAqKWRhdGE7CisKKwl0YXNrLT5jYih0YXNrLT5kYXRhKTsKK30KKworZHdjX3Rhc2tsZXRfdCAqRFdDX1RBU0tfQUxMT0MoY2hhciAqbmFtZSwgZHdjX3Rhc2tsZXRfY2FsbGJhY2tfdCBjYiwgdm9pZCAqZGF0YSkKK3sKKwlkd2NfdGFza2xldF90ICp0YXNrID0gRFdDX0FMTE9DKHNpemVvZigqdGFzaykpOworCisJaWYgKHRhc2spIHsKKwkJdGFzay0+Y2IgPSBjYjsKKwkJdGFzay0+ZGF0YSA9IGRhdGE7CisJCVRBU0tfSU5JVCgmdGFzay0+dCwgMCwgdGFza2xldF9jYWxsYmFjaywgdGFzayk7CisJfSBlbHNlIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0YXNrbGV0Iik7CisJfQorCisJcmV0dXJuIHRhc2s7Cit9CisKK3ZvaWQgRFdDX1RBU0tfRlJFRShkd2NfdGFza2xldF90ICp0YXNrKQoreworCXRhc2txdWV1ZV9kcmFpbih0YXNrcXVldWVfZmFzdCwgJnRhc2stPnQpOwkvLyA/Pz8KKwlEV0NfRlJFRSh0YXNrKTsKK30KKwordm9pZCBEV0NfVEFTS19TQ0hFRFVMRShkd2NfdGFza2xldF90ICp0YXNrKQoreworCS8qIFVzZXMgcHJlZGVmaW5lZCBzeXN0ZW0gcXVldWUgKi8KKwl0YXNrcXVldWVfZW5xdWV1ZV9mYXN0KHRhc2txdWV1ZV9mYXN0LCAmdGFzay0+dCk7Cit9CisKKworLyogd29ya3F1ZXVlcworIC0gUnVucyBpbiBwcm9jZXNzIGNvbnRleHQgKGNhbiBzbGVlcCkKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd29ya19jb250YWluZXIgeworCWR3Y193b3JrX2NhbGxiYWNrX3QgY2I7CisJdm9pZCAqZGF0YTsKKwlkd2Nfd29ya3FfdCAqd3E7CisJY2hhciAqbmFtZTsKKwlpbnQgaHo7CisKKyNpZmRlZiBERUJVRworCURXQ19DSVJDTEVRX0VOVFJZKHdvcmtfY29udGFpbmVyKSBlbnRyeTsKKyNlbmRpZgorCXN0cnVjdCB0YXNrIHRhc2s7Cit9IHdvcmtfY29udGFpbmVyX3Q7CisKKyNpZmRlZiBERUJVRworRFdDX0NJUkNMRVFfSEVBRCh3b3JrX2NvbnRhaW5lcl9xdWV1ZSwgd29ya19jb250YWluZXIpOworI2VuZGlmCisKK3N0cnVjdCBkd2Nfd29ya3EgeworCXN0cnVjdCB0YXNrcXVldWUgKnRhc2txOworCWR3Y19zcGlubG9ja190ICpsb2NrOworCWR3Y193YWl0cV90ICp3YWl0cTsKKwlpbnQgcGVuZGluZzsKKworI2lmZGVmIERFQlVHCisJc3RydWN0IHdvcmtfY29udGFpbmVyX3F1ZXVlIGVudHJpZXM7CisjZW5kaWYKK307CisKK3N0YXRpYyB2b2lkIGRvX3dvcmsodm9pZCAqZGF0YSwgaW50IHBlbmRpbmcpCS8vIHdoYXQgdG8gZG8gd2l0aCBwZW5kaW5nID8/PworeworCXdvcmtfY29udGFpbmVyX3QgKmNvbnRhaW5lciA9ICh3b3JrX2NvbnRhaW5lcl90ICopZGF0YTsKKwlkd2Nfd29ya3FfdCAqd3EgPSBjb250YWluZXItPndxOworCWR3Y19pcnFmbGFnc190IGZsYWdzOworCisJaWYgKGNvbnRhaW5lci0+aHopIHsKKwkJcGF1c2UoImR3M3dyayIsIGNvbnRhaW5lci0+aHopOworCX0KKworCWNvbnRhaW5lci0+Y2IoY29udGFpbmVyLT5kYXRhKTsKKwlEV0NfREVCVUcoIldvcmsgZG9uZTogJXMsIGNvbnRhaW5lcj0lcCIsIGNvbnRhaW5lci0+bmFtZSwgY29udGFpbmVyKTsKKworCURXQ19TUElOTE9DS19JUlFTQVZFKHdxLT5sb2NrLCAmZmxhZ3MpOworCisjaWZkZWYgREVCVUcKKwlEV0NfQ0lSQ0xFUV9SRU1PVkUoJndxLT5lbnRyaWVzLCBjb250YWluZXIsIGVudHJ5KTsKKyNlbmRpZgorCWlmIChjb250YWluZXItPm5hbWUpCisJCURXQ19GUkVFKGNvbnRhaW5lci0+bmFtZSk7CisJRFdDX0ZSRUUoY29udGFpbmVyKTsKKwl3cS0+cGVuZGluZy0tOworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUod3EtPmxvY2ssIGZsYWdzKTsKKwlEV0NfV0FJVFFfVFJJR0dFUih3cS0+d2FpdHEpOworfQorCitzdGF0aWMgaW50IHdvcmtfZG9uZSh2b2lkICpkYXRhKQoreworCWR3Y193b3JrcV90ICp3b3JrcSA9IChkd2Nfd29ya3FfdCAqKWRhdGE7CisKKwlyZXR1cm4gd29ya3EtPnBlbmRpbmcgPT0gMDsKK30KKworaW50IERXQ19XT1JLUV9XQUlUX1dPUktfRE9ORShkd2Nfd29ya3FfdCAqd29ya3EsIGludCB0aW1lb3V0KQoreworCXJldHVybiBEV0NfV0FJVFFfV0FJVF9USU1FT1VUKHdvcmtxLT53YWl0cSwgd29ya19kb25lLCB3b3JrcSwgdGltZW91dCk7Cit9CisKK2R3Y193b3JrcV90ICpEV0NfV09SS1FfQUxMT0MoY2hhciAqbmFtZSkKK3sKKwlkd2Nfd29ya3FfdCAqd3EgPSBEV0NfQUxMT0Moc2l6ZW9mKCp3cSkpOworCisJaWYgKCF3cSkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdvcmtxdWV1ZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3cS0+dGFza3EgPSB0YXNrcXVldWVfY3JlYXRlKG5hbWUsIE1fTk9XQUlULCB0YXNrcXVldWVfdGhyZWFkX2VucXVldWUsICZ3cS0+dGFza3EpOworCWlmICghd3EtPnRhc2txKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGFza3F1ZXVlIik7CisJCWdvdG8gbm9fdGFza3E7CisJfQorCisJd3EtPnBlbmRpbmcgPSAwOworCisJd3EtPmxvY2sgPSBEV0NfU1BJTkxPQ0tfQUxMT0MoKTsKKwlpZiAoIXdxLT5sb2NrKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc3BpbmxvY2siKTsKKwkJZ290byBub19sb2NrOworCX0KKworCXdxLT53YWl0cSA9IERXQ19XQUlUUV9BTExPQygpOworCWlmICghd3EtPndhaXRxKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igd2FpdHF1ZXVlIik7CisJCWdvdG8gbm9fd2FpdHE7CisJfQorCisJdGFza3F1ZXVlX3N0YXJ0X3RocmVhZHMoJndxLT50YXNrcSwgMSwgUFdBSVQsICIlcyB0YXNrcSIsICJkdzN0c2siKTsKKworI2lmZGVmIERFQlVHCisJRFdDX0NJUkNMRVFfSU5JVCgmd3EtPmVudHJpZXMpOworI2VuZGlmCisJcmV0dXJuIHdxOworCisgbm9fd2FpdHE6CisJRFdDX1NQSU5MT0NLX0ZSRUUod3EtPmxvY2spOworIG5vX2xvY2s6CisJdGFza3F1ZXVlX2ZyZWUod3EtPnRhc2txKTsKKyBub190YXNrcToKKwlEV0NfRlJFRSh3cSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBEV0NfV09SS1FfRlJFRShkd2Nfd29ya3FfdCAqd3EpCit7CisjaWZkZWYgREVCVUcKKwlkd2NfaXJxZmxhZ3NfdCBmbGFnczsKKworCURXQ19TUElOTE9DS19JUlFTQVZFKHdxLT5sb2NrLCAmZmxhZ3MpOworCisJaWYgKHdxLT5wZW5kaW5nICE9IDApIHsKKwkJc3RydWN0IHdvcmtfY29udGFpbmVyICpjb250YWluZXI7CisKKwkJRFdDX0VSUk9SKCJEZXN0cm95aW5nIHdvcmsgcXVldWUgd2l0aCBwZW5kaW5nIHdvcmsiKTsKKworCQlEV0NfQ0lSQ0xFUV9GT1JFQUNIKGNvbnRhaW5lciwgJndxLT5lbnRyaWVzLCBlbnRyeSkgeworCQkJRFdDX0VSUk9SKCJXb3JrICVzIHN0aWxsIHBlbmRpbmciLCBjb250YWluZXItPm5hbWUpOworCQl9CisJfQorCisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRSh3cS0+bG9jaywgZmxhZ3MpOworI2VuZGlmCisJRFdDX1dBSVRRX0ZSRUUod3EtPndhaXRxKTsKKwlEV0NfU1BJTkxPQ0tfRlJFRSh3cS0+bG9jayk7CisJdGFza3F1ZXVlX2ZyZWUod3EtPnRhc2txKTsKKwlEV0NfRlJFRSh3cSk7Cit9CisKK3ZvaWQgRFdDX1dPUktRX1NDSEVEVUxFKGR3Y193b3JrcV90ICp3cSwgZHdjX3dvcmtfY2FsbGJhY2tfdCBjYiwgdm9pZCAqZGF0YSwKKwkJCWNoYXIgKmZvcm1hdCwgLi4uKQoreworCWR3Y19pcnFmbGFnc190IGZsYWdzOworCXdvcmtfY29udGFpbmVyX3QgKmNvbnRhaW5lcjsKKwlzdGF0aWMgY2hhciBuYW1lWzEyOF07CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlEV0NfVlNOUFJJTlRGKG5hbWUsIDEyOCwgZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlEV0NfU1BJTkxPQ0tfSVJRU0FWRSh3cS0+bG9jaywgJmZsYWdzKTsKKwl3cS0+cGVuZGluZysrOworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUod3EtPmxvY2ssIGZsYWdzKTsKKwlEV0NfV0FJVFFfVFJJR0dFUih3cS0+d2FpdHEpOworCisJY29udGFpbmVyID0gRFdDX0FMTE9DX0FUT01JQyhzaXplb2YoKmNvbnRhaW5lcikpOworCWlmICghY29udGFpbmVyKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udGFpbmVyIik7CisJCXJldHVybjsKKwl9CisKKwljb250YWluZXItPm5hbWUgPSBEV0NfU1RSRFVQKG5hbWUpOworCWlmICghY29udGFpbmVyLT5uYW1lKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udGFpbmVyLT5uYW1lIik7CisJCURXQ19GUkVFKGNvbnRhaW5lcik7CisJCXJldHVybjsKKwl9CisKKwljb250YWluZXItPmNiID0gY2I7CisJY29udGFpbmVyLT5kYXRhID0gZGF0YTsKKwljb250YWluZXItPndxID0gd3E7CisJY29udGFpbmVyLT5oeiA9IDA7CisKKwlEV0NfREVCVUcoIlF1ZXVlaW5nIHdvcms6ICVzLCBjb250YWluZXI9JXAiLCBjb250YWluZXItPm5hbWUsIGNvbnRhaW5lcik7CisKKwlUQVNLX0lOSVQoJmNvbnRhaW5lci0+dGFzaywgMCwgZG9fd29yaywgY29udGFpbmVyKTsKKworI2lmZGVmIERFQlVHCisJRFdDX0NJUkNMRVFfSU5TRVJUX1RBSUwoJndxLT5lbnRyaWVzLCBjb250YWluZXIsIGVudHJ5KTsKKyNlbmRpZgorCXRhc2txdWV1ZV9lbnF1ZXVlX2Zhc3Qod3EtPnRhc2txLCAmY29udGFpbmVyLT50YXNrKTsKK30KKwordm9pZCBEV0NfV09SS1FfU0NIRURVTEVfREVMQVlFRChkd2Nfd29ya3FfdCAqd3EsIGR3Y193b3JrX2NhbGxiYWNrX3QgY2IsCisJCQkJdm9pZCAqZGF0YSwgdWludDMyX3QgdGltZSwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisJd29ya19jb250YWluZXJfdCAqY29udGFpbmVyOworCXN0YXRpYyBjaGFyIG5hbWVbMTI4XTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19WU05QUklOVEYobmFtZSwgMTI4LCBmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCURXQ19TUElOTE9DS19JUlFTQVZFKHdxLT5sb2NrLCAmZmxhZ3MpOworCXdxLT5wZW5kaW5nKys7CisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRSh3cS0+bG9jaywgZmxhZ3MpOworCURXQ19XQUlUUV9UUklHR0VSKHdxLT53YWl0cSk7CisKKwljb250YWluZXIgPSBEV0NfQUxMT0NfQVRPTUlDKHNpemVvZigqY29udGFpbmVyKSk7CisJaWYgKCFjb250YWluZXIpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb250YWluZXIiKTsKKwkJcmV0dXJuOworCX0KKworCWNvbnRhaW5lci0+bmFtZSA9IERXQ19TVFJEVVAobmFtZSk7CisJaWYgKCFjb250YWluZXItPm5hbWUpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb250YWluZXItPm5hbWUiKTsKKwkJRFdDX0ZSRUUoY29udGFpbmVyKTsKKwkJcmV0dXJuOworCX0KKworCWNvbnRhaW5lci0+Y2IgPSBjYjsKKwljb250YWluZXItPmRhdGEgPSBkYXRhOworCWNvbnRhaW5lci0+d3EgPSB3cTsKKworCXR2LnR2X3NlYyA9IHRpbWUgLyAxMDAwOworCXR2LnR2X3VzZWMgPSAodGltZSAtIHR2LnR2X3NlYyAqIDEwMDApICogMTAwMDsKKwljb250YWluZXItPmh6ID0gdHZ0b2h6KCZ0dik7CisKKwlEV0NfREVCVUcoIlF1ZXVlaW5nIHdvcms6ICVzLCBjb250YWluZXI9JXAiLCBjb250YWluZXItPm5hbWUsIGNvbnRhaW5lcik7CisKKwlUQVNLX0lOSVQoJmNvbnRhaW5lci0+dGFzaywgMCwgZG9fd29yaywgY29udGFpbmVyKTsKKworI2lmZGVmIERFQlVHCisJRFdDX0NJUkNMRVFfSU5TRVJUX1RBSUwoJndxLT5lbnRyaWVzLCBjb250YWluZXIsIGVudHJ5KTsKKyNlbmRpZgorCXRhc2txdWV1ZV9lbnF1ZXVlX2Zhc3Qod3EtPnRhc2txLCAmY29udGFpbmVyLT50YXNrKTsKK30KKworaW50IERXQ19XT1JLUV9QRU5ESU5HKGR3Y193b3JrcV90ICp3cSkKK3sKKwlyZXR1cm4gd3EtPnBlbmRpbmc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19jb21tb25fbGludXguYyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2NvbW1vbl9saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYmE3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19jb21tb25fbGludXguYwpAQCAtMCwwICsxLDE0MjEgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisjaWZkZWYgRFdDX0NDTElCCisjIGluY2x1ZGUgImR3Y19jYy5oIgorI2VuZGlmCisKKyNpZmRlZiBEV0NfQ1JZUFRPTElCCisjIGluY2x1ZGUgImR3Y19tb2Rwb3cuaCIKKyMgaW5jbHVkZSAiZHdjX2RoLmgiCisjIGluY2x1ZGUgImR3Y19jcnlwdG8uaCIKKyNlbmRpZgorCisjaWZkZWYgRFdDX05PVElGWUxJQgorIyBpbmNsdWRlICJkd2Nfbm90aWZpZXIuaCIKKyNlbmRpZgorCisvKiBPUy1MZXZlbCBJbXBsZW1lbnRhdGlvbnMgKi8KKworLyogVGhpcyBpcyB0aGUgTGludXgga2VybmVsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEV0MgcGxhdGZvcm0gbGlicmFyeS4gKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQorIyBpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjZWxzZQorIyBpbmNsdWRlIDxsaW51eC91c2JfZ2FkZ2V0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlICJkd2Nfb3MuaCIKKyNpbmNsdWRlICJkd2NfbGlzdC5oIgorCisKKy8qIE1JU0MgKi8KKwordm9pZCAqRFdDX01FTVNFVCh2b2lkICpkZXN0LCB1aW50OF90IGJ5dGUsIHVpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIG1lbXNldChkZXN0LCBieXRlLCBzaXplKTsKK30KKwordm9pZCAqRFdDX01FTUNQWSh2b2lkICpkZXN0LCB2b2lkIGNvbnN0ICpzcmMsIHVpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIG1lbWNweShkZXN0LCBzcmMsIHNpemUpOworfQorCit2b2lkICpEV0NfTUVNTU9WRSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHVpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIG1lbW1vdmUoZGVzdCwgc3JjLCBzaXplKTsKK30KKworaW50IERXQ19NRU1DTVAodm9pZCAqbTEsIHZvaWQgKm0yLCB1aW50MzJfdCBzaXplKQoreworCXJldHVybiBtZW1jbXAobTEsIG0yLCBzaXplKTsKK30KKworaW50IERXQ19TVFJOQ01QKHZvaWQgKnMxLCB2b2lkICpzMiwgdWludDMyX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gc3RybmNtcChzMSwgczIsIHNpemUpOworfQorCitpbnQgRFdDX1NUUkNNUCh2b2lkICpzMSwgdm9pZCAqczIpCit7CisJcmV0dXJuIHN0cmNtcChzMSwgczIpOworfQorCitpbnQgRFdDX1NUUkxFTihjaGFyIGNvbnN0ICpzdHIpCit7CisJcmV0dXJuIHN0cmxlbihzdHIpOworfQorCitjaGFyICpEV0NfU1RSQ1BZKGNoYXIgKnRvLCBjaGFyIGNvbnN0ICpmcm9tKQoreworCXJldHVybiBzdHJjcHkodG8sIGZyb20pOworfQorCitjaGFyICpEV0NfU1RSRFVQKGNoYXIgY29uc3QgKnN0cikKK3sKKwlpbnQgbGVuID0gRFdDX1NUUkxFTihzdHIpICsgMTsKKwljaGFyICpuZXcgPSBEV0NfQUxMT0NfQVRPTUlDKGxlbik7CisKKwlpZiAoIW5ldykgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlEV0NfTUVNQ1BZKG5ldywgc3RyLCBsZW4pOworCXJldHVybiBuZXc7Cit9CisKK2ludCBEV0NfQVRPSShjb25zdCBjaGFyICpzdHIsIGludDMyX3QgKnZhbHVlKQoreworCWNoYXIgKmVuZCA9IE5VTEw7CisKKwkqdmFsdWUgPSBzaW1wbGVfc3RydG9sKHN0ciwgJmVuZCwgMCk7CisJaWYgKCplbmQgPT0gJ1wwJykgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBEV0NfQVRPVUkoY29uc3QgY2hhciAqc3RyLCB1aW50MzJfdCAqdmFsdWUpCit7CisJY2hhciAqZW5kID0gTlVMTDsKKworCSp2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKHN0ciwgJmVuZCwgMCk7CisJaWYgKCplbmQgPT0gJ1wwJykgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKworI2lmZGVmIERXQ19VVEZMSUIKKy8qIEZyb20gdXNic3RyaW5nLmMgKi8KKworaW50IERXQ19VVEY4X1RPX1VURjE2TEUodWludDhfdCBjb25zdCAqcywgdWludDE2X3QgKmNwLCB1bnNpZ25lZCBsZW4pCit7CisJaW50CWNvdW50ID0gMDsKKwl1OAljOworCXUxNgl1Y2hhcjsKKworCS8qIHRoaXMgaW5zaXN0cyBvbiBjb3JyZWN0IGVuY29kaW5ncywgdGhvdWdoIG5vdCBtaW5pbWFsIG9uZXMuCisJICogQlVUIGl0IGN1cnJlbnRseSByZWplY3RzIGxlZ2l0IDQtYnl0ZSBVVEYtOCBjb2RlIHBvaW50cywKKwkgKiB3aGljaCBuZWVkIHN1cnJvZ2F0ZSBwYWlycy4gIChVbmljb2RlIDMuMSBjYW4gdXNlIHRoZW0uKQorCSAqLworCXdoaWxlIChsZW4gIT0gMCAmJiAoYyA9ICh1OCkgKnMrKykgIT0gMCkgeworCQlpZiAodW5saWtlbHkoYyAmIDB4ODApKSB7CisJCQkvLyAyLWJ5dGUgc2VxdWVuY2U6CisJCQkvLyAwMDAwMHl5eXl5eHh4eHh4ID0gMTEweXl5eXkgMTB4eHh4eHgKKwkJCWlmICgoYyAmIDB4ZTApID09IDB4YzApIHsKKwkJCQl1Y2hhciA9IChjICYgMHgxZikgPDwgNjsKKworCQkJCWMgPSAodTgpICpzKys7CisJCQkJaWYgKChjICYgMHhjMCkgIT0gMHhjMCkKKwkJCQkJZ290byBmYWlsOworCQkJCWMgJj0gMHgzZjsKKwkJCQl1Y2hhciB8PSBjOworCisJCQkvLyAzLWJ5dGUgc2VxdWVuY2UgKG1vc3QgQ0pLViBjaGFyYWN0ZXJzKToKKwkJCS8vIHp6enp5eXl5eXl4eHh4eHggPSAxMTEwenp6eiAxMHl5eXl5eSAxMHh4eHh4eAorCQkJfSBlbHNlIGlmICgoYyAmIDB4ZjApID09IDB4ZTApIHsKKwkJCQl1Y2hhciA9IChjICYgMHgwZikgPDwgMTI7CisKKwkJCQljID0gKHU4KSAqcysrOworCQkJCWlmICgoYyAmIDB4YzApICE9IDB4YzApCisJCQkJCWdvdG8gZmFpbDsKKwkJCQljICY9IDB4M2Y7CisJCQkJdWNoYXIgfD0gYyA8PCA2OworCisJCQkJYyA9ICh1OCkgKnMrKzsKKwkJCQlpZiAoKGMgJiAweGMwKSAhPSAweGMwKQorCQkJCQlnb3RvIGZhaWw7CisJCQkJYyAmPSAweDNmOworCQkJCXVjaGFyIHw9IGM7CisKKwkJCQkvKiBubyBib2d1cyBzdXJyb2dhdGVzICovCisJCQkJaWYgKDB4ZDgwMCA8PSB1Y2hhciAmJiB1Y2hhciA8PSAweGRmZmYpCisJCQkJCWdvdG8gZmFpbDsKKworCQkJLy8gNC1ieXRlIHNlcXVlbmNlIChzdXJyb2dhdGUgcGFpcnMsIGN1cnJlbnRseSByYXJlKToKKwkJCS8vIDExMTAxMTEwd3d3d3p6enp5eSArIDExMDExMXl5eXl4eHh4eHgKKwkJCS8vICAgICA9IDExMTEwdXV1IDEwdXV6enp6IDEweXl5eXl5IDEweHh4eHh4CisJCQkvLyAodXV1dXUgPSB3d3d3ICsgMSkKKwkJCS8vIEZJWE1FIGFjY2VwdCB0aGUgc3Vycm9nYXRlIGNvZGUgcG9pbnRzIChvbmx5KQorCQkJfSBlbHNlCisJCQkJZ290byBmYWlsOworCQl9IGVsc2UKKwkJCXVjaGFyID0gYzsKKwkJcHV0X3VuYWxpZ25lZCAoY3B1X3RvX2xlMTYgKHVjaGFyKSwgY3ArKyk7CisJCWNvdW50Kys7CisJCWxlbi0tOworCX0KKwlyZXR1cm4gY291bnQ7CitmYWlsOgorCXJldHVybiAtMTsKK30KKyNlbmRpZgkvKiBEV0NfVVRGTElCICovCisKKworLyogZHdjX2RlYnVnLmggKi8KKworZHdjX2Jvb2xfdCBEV0NfSU5fSVJRKHZvaWQpCit7CisJcmV0dXJuIGluX2lycSgpOworfQorCitkd2NfYm9vbF90IERXQ19JTl9CSCh2b2lkKQoreworCXJldHVybiBpbl9zb2Z0aXJxKCk7Cit9CisKK3ZvaWQgRFdDX1ZQUklOVEYoY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisJdnByaW50ayhmb3JtYXQsIGFyZ3MpOworfQorCitpbnQgRFdDX1ZTTlBSSU5URihjaGFyICpzdHIsIGludCBzaXplLCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKwlyZXR1cm4gdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCBhcmdzKTsKK30KKwordm9pZCBEV0NfUFJJTlRGKGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJRFdDX1ZQUklOVEYoZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKK2ludCBEV0NfU1BSSU5URihjaGFyICpidWZmZXIsIGNoYXIgKmZvcm1hdCwgLi4uKQoreworCWludCByZXR2YWw7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlyZXR2YWwgPSB2c3ByaW50ZihidWZmZXIsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBEV0NfU05QUklOVEYoY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJaW50IHJldHZhbDsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCXJldHZhbCA9IHZzbnByaW50ZihidWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgX19EV0NfV0FSTihjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19QUklOVEYoS0VSTl9XQVJOSU5HKTsKKwlEV0NfVlBSSU5URihmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKK30KKwordm9pZCBfX0RXQ19FUlJPUihjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19QUklOVEYoS0VSTl9FUlIpOworCURXQ19WUFJJTlRGKGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIERXQ19FWENFUFRJT04oY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlEV0NfUFJJTlRGKEtFUk5fRVJSKTsKKwlEV0NfVlBSSU5URihmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlCVUdfT04oMSk7Cit9CisKKyNpZmRlZiBERUJVRwordm9pZCBfX0RXQ19ERUJVRyhjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19QUklOVEYoS0VSTl9ERUJVRyk7CisJRFdDX1ZQUklOVEYoZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisjZW5kaWYKKworCisvKiBkd2NfbWVtLmggKi8KKworI2lmIDAKK2R3Y19wb29sX3QgKkRXQ19ETUFfUE9PTF9DUkVBVEUodWludDMyX3Qgc2l6ZSwKKwkJCQl1aW50MzJfdCBhbGlnbiwKKwkJCQl1aW50MzJfdCBhbGxvYykKK3sKKwlzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wgPSBkbWFfcG9vbF9jcmVhdGUoIlBvb2wiLCBOVUxMLAorCQkJCQkJc2l6ZSwgYWxpZ24sIGFsbG9jKTsKKwlyZXR1cm4gKGR3Y19wb29sX3QgKilwb29sOworfQorCit2b2lkIERXQ19ETUFfUE9PTF9ERVNUUk9ZKGR3Y19wb29sX3QgKnBvb2wpCit7CisJZG1hX3Bvb2xfZGVzdHJveSgoc3RydWN0IGRtYV9wb29sICopcG9vbCk7Cit9CisKK3ZvaWQgKkRXQ19ETUFfUE9PTF9BTExPQyhkd2NfcG9vbF90ICpwb29sLCB1aW50NjRfdCAqZG1hX2FkZHIpCit7CisJcmV0dXJuIGRtYV9wb29sX2FsbG9jKChzdHJ1Y3QgZG1hX3Bvb2wgKilwb29sLCBHRlBfS0VSTkVMLCBkbWFfYWRkcik7Cit9CisKK3ZvaWQgKkRXQ19ETUFfUE9PTF9aQUxMT0MoZHdjX3Bvb2xfdCAqcG9vbCwgdWludDY0X3QgKmRtYV9hZGRyKQoreworCXZvaWQgKnZhZGRyID0gRFdDX0RNQV9QT09MX0FMTE9DKHBvb2wsIGRtYV9hZGRyKTsKKwltZW1zZXQoLi4pOworfQorCit2b2lkIERXQ19ETUFfUE9PTF9GUkVFKGR3Y19wb29sX3QgKnBvb2wsIHZvaWQgKnZhZGRyLCB2b2lkICpkYWRkcikKK3sKKwlkbWFfcG9vbF9mcmVlKHBvb2wsIHZhZGRyLCBkYWRkcik7Cit9CisjZW5kaWYKKwordm9pZCAqX19EV0NfRE1BX0FMTE9DKHZvaWQgKmRtYV9jdHgsIHVpbnQzMl90IHNpemUsIGR3Y19kbWFfdCAqZG1hX2FkZHIpCit7CisjaWZkZWYgeHhDT1NJTSAvKiBPbmx5IHdvcmtzIGZvciAzMi1iaXQgY29zaW0gKi8KKwl2b2lkICpidWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoZG1hX2N0eCwgKHNpemVfdClzaXplLCBkbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisjZWxzZQorCXZvaWQgKmJ1ZiA9IGRtYV9hbGxvY19jb2hlcmVudChkbWFfY3R4LCAoc2l6ZV90KXNpemUsIGRtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKyNlbmRpZgorCWlmICghYnVmKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChidWYsIDAsIChzaXplX3Qpc2l6ZSk7CisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCAqX19EV0NfRE1BX0FMTE9DX0FUT01JQyh2b2lkICpkbWFfY3R4LCB1aW50MzJfdCBzaXplLCBkd2NfZG1hX3QgKmRtYV9hZGRyKQoreworCXZvaWQgKmJ1ZiA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCAoc2l6ZV90KXNpemUsIGRtYV9hZGRyLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1ZikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGJ1ZiwgMCwgKHNpemVfdClzaXplKTsKKwlyZXR1cm4gYnVmOworfQorCit2b2lkIF9fRFdDX0RNQV9GUkVFKHZvaWQgKmRtYV9jdHgsIHVpbnQzMl90IHNpemUsIHZvaWQgKnZpcnRfYWRkciwgZHdjX2RtYV90IGRtYV9hZGRyKQoreworCWRtYV9mcmVlX2NvaGVyZW50KGRtYV9jdHgsIHNpemUsIHZpcnRfYWRkciwgZG1hX2FkZHIpOworfQorCit2b2lkICpfX0RXQ19BTExPQyh2b2lkICptZW1fY3R4LCB1aW50MzJfdCBzaXplKQoreworCXJldHVybiBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworfQorCit2b2lkICpfX0RXQ19BTExPQ19BVE9NSUModm9pZCAqbWVtX2N0eCwgdWludDMyX3Qgc2l6ZSkKK3sKKwlyZXR1cm4ga3phbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKK30KKwordm9pZCBfX0RXQ19GUkVFKHZvaWQgKm1lbV9jdHgsIHZvaWQgKmFkZHIpCit7CisJa2ZyZWUoYWRkcik7Cit9CisKKworI2lmZGVmIERXQ19DUllQVE9MSUIKKy8qIGR3Y19jcnlwdG8uaCAqLworCit2b2lkIERXQ19SQU5ET01fQllURVModWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpCit7CisJZ2V0X3JhbmRvbV9ieXRlcyhidWZmZXIsIGxlbmd0aCk7Cit9CisKK2ludCBEV0NfQUVTX0NCQyh1aW50OF90ICptZXNzYWdlLCB1aW50MzJfdCBtZXNzYWdlbGVuLCB1aW50OF90ICprZXksIHVpbnQzMl90IGtleWxlbiwgdWludDhfdCBpdlsxNl0sIHVpbnQ4X3QgKm91dCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtOworCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ2Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnczsKKworCXRmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImNiYyhhZXMpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKHRmbSA9PSBOVUxMKSB7CisJCXByaW50aygiZmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciBhZXMgQ0JDXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOworCWNyeXB0b19ibGtjaXBoZXJfc2V0X2l2KHRmbSwgaXYsIDE2KTsKKworCXNnX2luaXRfb25lKCZzZ2QsIG91dCwgbWVzc2FnZWxlbik7CisJc2dfaW5pdF9vbmUoJnNncywgbWVzc2FnZSwgbWVzc2FnZWxlbik7CisKKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmZsYWdzID0gMDsKKworCWlmIChjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoJmRlc2MsICZzZ2QsICZzZ3MsIG1lc3NhZ2VsZW4pKSB7CisJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcih0Zm0pOworCQlEV0NfRVJST1IoIkFFUyBDQkMgZW5jcnlwdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNyeXB0b19mcmVlX2Jsa2NpcGhlcih0Zm0pOworCXJldHVybiAwOworfQorCitpbnQgRFdDX1NIQTI1Nih1aW50OF90ICptZXNzYWdlLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QgKm91dCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbTsKKwlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCisJdGZtID0gY3J5cHRvX2FsbG9jX2hhc2goInNoYTI1NiIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCWlmIChJU19FUlIodGZtKSkgeworCQlEV0NfRVJST1IoIkZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3Igc2hhMjU2OiAlbGRcbiIsIFBUUl9FUlIodGZtKSk7CisJCXJldHVybiAwOworCX0KKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmZsYWdzID0gMDsKKworCXNnX2luaXRfb25lKCZzZywgbWVzc2FnZSwgbGVuKTsKKwljcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsICZzZywgbGVuLCBvdXQpOworCWNyeXB0b19mcmVlX2hhc2godGZtKTsKKworCXJldHVybiAxOworfQorCitpbnQgRFdDX0hNQUNfU0hBMjU2KHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IG1lc3NhZ2VsZW4sCisJCSAgICB1aW50OF90ICprZXksIHVpbnQzMl90IGtleWxlbiwgdWludDhfdCAqb3V0KQoreworCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtOworCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaCgiaG1hYyhzaGEyNTYpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCURXQ19FUlJPUigiRmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciBobWFjKHNoYTI1Nik6ICVsZFxuIiwgUFRSX0VSUih0Zm0pKTsKKwkJcmV0dXJuIDA7CisJfQorCWRlc2MudGZtID0gdGZtOworCWRlc2MuZmxhZ3MgPSAwOworCisJc2dfaW5pdF9vbmUoJnNnLCBtZXNzYWdlLCBtZXNzYWdlbGVuKTsKKwljcnlwdG9faGFzaF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7CisJY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCAmc2csIG1lc3NhZ2VsZW4sIG91dCk7CisJY3J5cHRvX2ZyZWVfaGFzaCh0Zm0pOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYJLyogRFdDX0NSWVBUT0xJQiAqLworCisKKy8qIEJ5dGUgT3JkZXJpbmcgQ29udmVyc2lvbnMgKi8KKwordWludDMyX3QgRFdDX0NQVV9UT19MRTMyKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDMyX3QgRFdDX0NQVV9UT19CRTMyKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDMyX3QgRFdDX0xFMzJfVE9fQ1BVKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDMyX3QgRFdDX0JFMzJfVE9fQ1BVKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0NQVV9UT19MRTE2KHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0NQVV9UT19CRTE2KHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0xFMTZfVE9fQ1BVKHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0JFMTZfVE9fQ1BVKHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKworCisvKiBSZWdpc3RlcnMgKi8KKwordWludDMyX3QgRFdDX1JFQURfUkVHMzIodWludDMyX3Qgdm9sYXRpbGUgKnJlZykKK3sKKwlyZXR1cm4gcmVhZGwocmVnKTsKK30KKworI2lmIDAKK3VpbnQ2NF90IERXQ19SRUFEX1JFRzY0KHVpbnQ2NF90IHZvbGF0aWxlICpyZWcpCit7Cit9CisjZW5kaWYKKwordm9pZCBEV0NfV1JJVEVfUkVHMzIodWludDMyX3Qgdm9sYXRpbGUgKnJlZywgdWludDMyX3QgdmFsdWUpCit7CisJd3JpdGVsKHZhbHVlLCByZWcpOworfQorCisjaWYgMAordm9pZCBEV0NfV1JJVEVfUkVHNjQodWludDY0X3Qgdm9sYXRpbGUgKnJlZywgdWludDY0X3QgdmFsdWUpCit7Cit9CisjZW5kaWYKKwordm9pZCBEV0NfTU9ESUZZX1JFRzMyKHVpbnQzMl90IHZvbGF0aWxlICpyZWcsIHVpbnQzMl90IGNsZWFyX21hc2ssIHVpbnQzMl90IHNldF9tYXNrKQoreworCXdyaXRlbCgocmVhZGwocmVnKSAmIH5jbGVhcl9tYXNrKSB8IHNldF9tYXNrLCByZWcpOworfQorCisjaWYgMAordm9pZCBEV0NfTU9ESUZZX1JFRzY0KHVpbnQ2NF90IHZvbGF0aWxlICpyZWcsIHVpbnQ2NF90IGNsZWFyX21hc2ssIHVpbnQ2NF90IHNldF9tYXNrKQoreworfQorI2VuZGlmCisKKworLyogTG9ja2luZyAqLworCitkd2Nfc3BpbmxvY2tfdCAqRFdDX1NQSU5MT0NLX0FMTE9DKHZvaWQpCit7CisJc3BpbmxvY2tfdCAqc2wgPSAoc3BpbmxvY2tfdCAqKTE7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKSB8fCBkZWZpbmVkKENPTkZJR19TTVApCisJc2wgPSBEV0NfQUxMT0Moc2l6ZW9mKCpzbCkpOworCWlmICghc2wpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzcGlubG9ja1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNwaW5fbG9ja19pbml0KHNsKTsKKyNlbmRpZgorCXJldHVybiAoZHdjX3NwaW5sb2NrX3QgKilzbDsKK30KKwordm9pZCBEV0NfU1BJTkxPQ0tfRlJFRShkd2Nfc3BpbmxvY2tfdCAqbG9jaykKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKSB8fCBkZWZpbmVkKENPTkZJR19TTVApCisJRFdDX0ZSRUUobG9jayk7CisjZW5kaWYKK30KKwordm9pZCBEV0NfU1BJTkxPQ0soZHdjX3NwaW5sb2NrX3QgKmxvY2spCit7CisjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgfHwgZGVmaW5lZChDT05GSUdfU01QKQorCXNwaW5fbG9jaygoc3BpbmxvY2tfdCAqKWxvY2spOworI2VuZGlmCit9CisKK3ZvaWQgRFdDX1NQSU5VTkxPQ0soZHdjX3NwaW5sb2NrX3QgKmxvY2spCit7CisjaWYgZGVmaW5lZChDT05GSUdfUFJFRU1QVCkgfHwgZGVmaW5lZChDT05GSUdfU01QKQorCXNwaW5fdW5sb2NrKChzcGlubG9ja190ICopbG9jayk7CisjZW5kaWYKK30KKwordm9pZCBEV0NfU1BJTkxPQ0tfSVJRU0FWRShkd2Nfc3BpbmxvY2tfdCAqbG9jaywgZHdjX2lycWZsYWdzX3QgKmZsYWdzKQoreworCWR3Y19pcnFmbGFnc190IGY7CisKKyNpZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKSB8fCBkZWZpbmVkKENPTkZJR19TTVApCisJc3Bpbl9sb2NrX2lycXNhdmUoKHNwaW5sb2NrX3QgKilsb2NrLCBmKTsKKyNlbHNlCisJbG9jYWxfaXJxX3NhdmUoZik7CisjZW5kaWYKKwkqZmxhZ3MgPSBmOworfQorCit2b2lkIERXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUoZHdjX3NwaW5sb2NrX3QgKmxvY2ssIGR3Y19pcnFmbGFnc190IGZsYWdzKQoreworI2lmIGRlZmluZWQoQ09ORklHX1BSRUVNUFQpIHx8IGRlZmluZWQoQ09ORklHX1NNUCkKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKChzcGlubG9ja190ICopbG9jaywgZmxhZ3MpOworI2Vsc2UKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZW5kaWYKK30KKworZHdjX211dGV4X3QgKkRXQ19NVVRFWF9BTExPQyh2b2lkKQoreworCXN0cnVjdCBtdXRleCAqbTsKKwlkd2NfbXV0ZXhfdCAqbXV0ZXggPSAoZHdjX211dGV4X3QgKilEV0NfQUxMT0Moc2l6ZW9mKHN0cnVjdCBtdXRleCkpOworCisJaWYgKCFtdXRleCkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG11dGV4XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbSA9IChzdHJ1Y3QgbXV0ZXggKiltdXRleDsKKwltdXRleF9pbml0KG0pOworCXJldHVybiBtdXRleDsKK30KKworI2lmIChkZWZpbmVkKERXQ19MSU5VWCkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfTVVURVhFUykpCisjZWxzZQordm9pZCBEV0NfTVVURVhfRlJFRShkd2NfbXV0ZXhfdCAqbXV0ZXgpCit7CisJbXV0ZXhfZGVzdHJveSgoc3RydWN0IG11dGV4ICopbXV0ZXgpOworCURXQ19GUkVFKG11dGV4KTsKK30KKyNlbmRpZgorCit2b2lkIERXQ19NVVRFWF9MT0NLKGR3Y19tdXRleF90ICptdXRleCkKK3sKKwlzdHJ1Y3QgbXV0ZXggKm0gPSAoc3RydWN0IG11dGV4ICopbXV0ZXg7CisJbXV0ZXhfbG9jayhtKTsKK30KKworaW50IERXQ19NVVRFWF9UUllMT0NLKGR3Y19tdXRleF90ICptdXRleCkKK3sKKwlzdHJ1Y3QgbXV0ZXggKm0gPSAoc3RydWN0IG11dGV4ICopbXV0ZXg7CisJcmV0dXJuIG11dGV4X3RyeWxvY2sobSk7Cit9CisKK3ZvaWQgRFdDX01VVEVYX1VOTE9DSyhkd2NfbXV0ZXhfdCAqbXV0ZXgpCit7CisJc3RydWN0IG11dGV4ICptID0gKHN0cnVjdCBtdXRleCAqKW11dGV4OworCW11dGV4X3VubG9jayhtKTsKK30KKworCisvKiBUaW1pbmcgKi8KKwordm9pZCBEV0NfVURFTEFZKHVpbnQzMl90IHVzZWNzKQoreworCXVkZWxheSh1c2Vjcyk7Cit9CisKK3ZvaWQgRFdDX01ERUxBWSh1aW50MzJfdCBtc2VjcykKK3sKKwltZGVsYXkobXNlY3MpOworfQorCit2b2lkIERXQ19NU0xFRVAodWludDMyX3QgbXNlY3MpCit7CisJbXNsZWVwKG1zZWNzKTsKK30KKwordWludDMyX3QgRFdDX1RJTUUodm9pZCkKK3sKKwlyZXR1cm4gamlmZmllc190b19tc2VjcyhqaWZmaWVzKTsKK30KKworCisvKiBUaW1lcnMgKi8KKworc3RydWN0IGR3Y190aW1lciB7CisJc3RydWN0IHRpbWVyX2xpc3QgKnQ7CisJY2hhciAqbmFtZTsKKwlkd2NfdGltZXJfY2FsbGJhY2tfdCBjYjsKKwl2b2lkICpkYXRhOworCXVpbnQ4X3Qgc2NoZWR1bGVkOworCWR3Y19zcGlubG9ja190ICpsb2NrOworfTsKKworc3RhdGljIHZvaWQgdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWR3Y190aW1lcl90ICp0aW1lciA9IChkd2NfdGltZXJfdCAqKWRhdGE7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisKKwlEV0NfU1BJTkxPQ0tfSVJRU0FWRSh0aW1lci0+bG9jaywgJmZsYWdzKTsKKwl0aW1lci0+c2NoZWR1bGVkID0gMDsKKwlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKHRpbWVyLT5sb2NrLCBmbGFncyk7CisJRFdDX0RFQlVHKCJUaW1lciAlcyBjYWxsYmFjayIsIHRpbWVyLT5uYW1lKTsKKwl0aW1lci0+Y2IodGltZXItPmRhdGEpOworfQorCitkd2NfdGltZXJfdCAqRFdDX1RJTUVSX0FMTE9DKGNoYXIgKm5hbWUsIGR3Y190aW1lcl9jYWxsYmFja190IGNiLCB2b2lkICpkYXRhKQoreworCWR3Y190aW1lcl90ICp0ID0gRFdDX0FMTE9DKHNpemVvZigqdCkpOworCisJaWYgKCF0KSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGltZXIiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdC0+dCA9IERXQ19BTExPQyhzaXplb2YoKnQtPnQpKTsKKwlpZiAoIXQtPnQpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aW1lci0+dCIpOworCQlnb3RvIG5vX3RpbWVyOworCX0KKworCXQtPm5hbWUgPSBEV0NfU1RSRFVQKG5hbWUpOworCWlmICghdC0+bmFtZSkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRpbWVyLT5uYW1lIik7CisJCWdvdG8gbm9fbmFtZTsKKwl9CisKKwl0LT5sb2NrID0gRFdDX1NQSU5MT0NLX0FMTE9DKCk7CisJaWYgKCF0LT5sb2NrKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbG9jayIpOworCQlnb3RvIG5vX2xvY2s7CisJfQorCisJdC0+c2NoZWR1bGVkID0gMDsKKwl0LT50LT5iYXNlID0gJmJvb3RfdHZlY19iYXNlczsKKwl0LT50LT5leHBpcmVzID0gamlmZmllczsKKwlzZXR1cF90aW1lcih0LT50LCB0aW1lcl9jYWxsYmFjaywgKHVuc2lnbmVkIGxvbmcpdCk7CisKKwl0LT5jYiA9IGNiOworCXQtPmRhdGEgPSBkYXRhOworCisJcmV0dXJuIHQ7CisKKyBub19sb2NrOgorCURXQ19GUkVFKHQtPm5hbWUpOworIG5vX25hbWU6CisJRFdDX0ZSRUUodC0+dCk7Cisgbm9fdGltZXI6CisJRFdDX0ZSRUUodCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgRFdDX1RJTUVSX0ZSRUUoZHdjX3RpbWVyX3QgKnRpbWVyKQoreworCWR3Y19pcnFmbGFnc190IGZsYWdzOworCisJRFdDX1NQSU5MT0NLX0lSUVNBVkUodGltZXItPmxvY2ssICZmbGFncyk7CisKKwlpZiAodGltZXItPnNjaGVkdWxlZCkgeworCQlkZWxfdGltZXIodGltZXItPnQpOworCQl0aW1lci0+c2NoZWR1bGVkID0gMDsKKwl9CisKKwlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKHRpbWVyLT5sb2NrLCBmbGFncyk7CisJRFdDX1NQSU5MT0NLX0ZSRUUodGltZXItPmxvY2spOworCURXQ19GUkVFKHRpbWVyLT50KTsKKwlEV0NfRlJFRSh0aW1lci0+bmFtZSk7CisJRFdDX0ZSRUUodGltZXIpOworfQorCit2b2lkIERXQ19USU1FUl9TQ0hFRFVMRShkd2NfdGltZXJfdCAqdGltZXIsIHVpbnQzMl90IHRpbWUpCit7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisKKwlEV0NfU1BJTkxPQ0tfSVJRU0FWRSh0aW1lci0+bG9jaywgJmZsYWdzKTsKKworCWlmICghdGltZXItPnNjaGVkdWxlZCkgeworCQl0aW1lci0+c2NoZWR1bGVkID0gMTsKKwkJRFdDX0RFQlVHKCJTY2hlZHVsaW5nIHRpbWVyICVzIHRvIGV4cGlyZSBpbiArJWQgbXNlYyIsIHRpbWVyLT5uYW1lLCB0aW1lKTsKKwkJdGltZXItPnQtPmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lKTsKKwkJYWRkX3RpbWVyKHRpbWVyLT50KTsKKwl9IGVsc2UgeworCQlEV0NfREVCVUcoIk1vZGlmeWluZyB0aW1lciAlcyB0byBleHBpcmUgaW4gKyVkIG1zZWMiLCB0aW1lci0+bmFtZSwgdGltZSk7CisJCW1vZF90aW1lcih0aW1lci0+dCwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZSkpOworCX0KKworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUodGltZXItPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBEV0NfVElNRVJfQ0FOQ0VMKGR3Y190aW1lcl90ICp0aW1lcikKK3sKKwlkZWxfdGltZXIodGltZXItPnQpOworfQorCisKKy8qIFdhaXQgUXVldWVzICovCisKK3N0cnVjdCBkd2Nfd2FpdHEgeworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOworCWludCBhYm9ydDsKK307CisKK2R3Y193YWl0cV90ICpEV0NfV0FJVFFfQUxMT0Modm9pZCkKK3sKKwlkd2Nfd2FpdHFfdCAqd3EgPSBEV0NfQUxMT0Moc2l6ZW9mKCp3cSkpOworCisJaWYgKCF3cSkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHdhaXRxdWV1ZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndxLT5xdWV1ZSk7CisJd3EtPmFib3J0ID0gMDsKKwlyZXR1cm4gd3E7Cit9CisKK3ZvaWQgRFdDX1dBSVRRX0ZSRUUoZHdjX3dhaXRxX3QgKndxKQoreworCURXQ19GUkVFKHdxKTsKK30KKworaW50MzJfdCBEV0NfV0FJVFFfV0FJVChkd2Nfd2FpdHFfdCAqd3EsIGR3Y193YWl0cV9jb25kaXRpb25fdCBjb25kLCB2b2lkICpkYXRhKQoreworCWludCByZXN1bHQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUod3EtPnF1ZXVlLAorCQkJCQkgICAgICBjb25kKGRhdGEpIHx8IHdxLT5hYm9ydCk7CisJaWYgKHJlc3VsdCA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJd3EtPmFib3J0ID0gMDsKKwkJcmV0dXJuIC1EV0NfRV9SRVNUQVJUOworCX0KKworCWlmICh3cS0+YWJvcnQgPT0gMSkgeworCQl3cS0+YWJvcnQgPSAwOworCQlyZXR1cm4gLURXQ19FX0FCT1JUOworCX0KKworCXdxLT5hYm9ydCA9IDA7CisKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1EV0NfRV9VTktOT1dOOworfQorCitpbnQzMl90IERXQ19XQUlUUV9XQUlUX1RJTUVPVVQoZHdjX3dhaXRxX3QgKndxLCBkd2Nfd2FpdHFfY29uZGl0aW9uX3QgY29uZCwKKwkJCSAgICAgICB2b2lkICpkYXRhLCBpbnQzMl90IG1zZWNzKQoreworCWludDMyX3QgdG1zZWNzOworCWludCByZXN1bHQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh3cS0+cXVldWUsCisJCQkJCQkgICAgICBjb25kKGRhdGEpIHx8IHdxLT5hYm9ydCwKKwkJCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMobXNlY3MpKTsKKwlpZiAocmVzdWx0ID09IC1FUkVTVEFSVFNZUykgeworCQl3cS0+YWJvcnQgPSAwOworCQlyZXR1cm4gLURXQ19FX1JFU1RBUlQ7CisJfQorCisJaWYgKHdxLT5hYm9ydCA9PSAxKSB7CisJCXdxLT5hYm9ydCA9IDA7CisJCXJldHVybiAtRFdDX0VfQUJPUlQ7CisJfQorCisJd3EtPmFib3J0ID0gMDsKKworCWlmIChyZXN1bHQgPiAwKSB7CisJCXRtc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MocmVzdWx0KTsKKwkJaWYgKCF0bXNlY3MpIHsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcmV0dXJuIHRtc2VjczsKKwl9CisKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJcmV0dXJuIC1EV0NfRV9USU1FT1VUOworCX0KKworCXJldHVybiAtRFdDX0VfVU5LTk9XTjsKK30KKwordm9pZCBEV0NfV0FJVFFfVFJJR0dFUihkd2Nfd2FpdHFfdCAqd3EpCit7CisJd3EtPmFib3J0ID0gMDsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJndxLT5xdWV1ZSk7Cit9CisKK3ZvaWQgRFdDX1dBSVRRX0FCT1JUKGR3Y193YWl0cV90ICp3cSkKK3sKKwl3cS0+YWJvcnQgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmd3EtPnF1ZXVlKTsKK30KKworCisvKiBUaHJlYWRpbmcgKi8KKworZHdjX3RocmVhZF90ICpEV0NfVEhSRUFEX1JVTihkd2NfdGhyZWFkX2Z1bmN0aW9uX3QgZnVuYywgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRocmVhZCA9IGt0aHJlYWRfcnVuKGZ1bmMsIGRhdGEsIG5hbWUpOworCisJaWYgKHRocmVhZCA9PSBFUlJfUFRSKC1FTk9NRU0pKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAoZHdjX3RocmVhZF90ICopdGhyZWFkOworfQorCitpbnQgRFdDX1RIUkVBRF9TVE9QKGR3Y190aHJlYWRfdCAqdGhyZWFkKQoreworCXJldHVybiBrdGhyZWFkX3N0b3AoKHN0cnVjdCB0YXNrX3N0cnVjdCAqKXRocmVhZCk7Cit9CisKK2R3Y19ib29sX3QgRFdDX1RIUkVBRF9TSE9VTERfU1RPUCh2b2lkKQoreworCXJldHVybiBrdGhyZWFkX3Nob3VsZF9zdG9wKCk7Cit9CisKKworLyogdGFza2xldHMKKyAtIHJ1biBpbiBpbnRlcnJ1cHQgY29udGV4dCAoY2Fubm90IHNsZWVwKQorIC0gZWFjaCB0YXNrbGV0IHJ1bnMgb24gYSBzaW5nbGUgQ1BVCisgLSBkaWZmZXJlbnQgdGFza2xldHMgY2FuIGJlIHJ1bm5pbmcgc2ltdWx0YW5lb3VzbHkgb24gZGlmZmVyZW50IENQVXMKKyAqLworc3RydWN0IGR3Y190YXNrbGV0IHsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdDsKKwlkd2NfdGFza2xldF9jYWxsYmFja190IGNiOworCXZvaWQgKmRhdGE7Cit9OworCitzdGF0aWMgdm9pZCB0YXNrbGV0X2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlkd2NfdGFza2xldF90ICp0ID0gKGR3Y190YXNrbGV0X3QgKilkYXRhOworCXQtPmNiKHQtPmRhdGEpOworfQorCitkd2NfdGFza2xldF90ICpEV0NfVEFTS19BTExPQyhjaGFyICpuYW1lLCBkd2NfdGFza2xldF9jYWxsYmFja190IGNiLCB2b2lkICpkYXRhKQoreworCWR3Y190YXNrbGV0X3QgKnQgPSBEV0NfQUxMT0Moc2l6ZW9mKCp0KSk7CisKKwlpZiAodCkgeworCQl0LT5jYiA9IGNiOworCQl0LT5kYXRhID0gZGF0YTsKKwkJdGFza2xldF9pbml0KCZ0LT50LCB0YXNrbGV0X2NhbGxiYWNrLCAodW5zaWduZWQgbG9uZyl0KTsKKwl9IGVsc2UgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRhc2tsZXRcbiIpOworCX0KKworCXJldHVybiB0OworfQorCit2b2lkIERXQ19UQVNLX0ZSRUUoZHdjX3Rhc2tsZXRfdCAqdGFzaykKK3sKKwlEV0NfRlJFRSh0YXNrKTsKK30KKwordm9pZCBEV0NfVEFTS19TQ0hFRFVMRShkd2NfdGFza2xldF90ICp0YXNrKQoreworCXRhc2tsZXRfc2NoZWR1bGUoJnRhc2stPnQpOworfQorCisKKy8qIHdvcmtxdWV1ZXMKKyAtIHJ1biBpbiBwcm9jZXNzIGNvbnRleHQgKGNhbiBzbGVlcCkKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgd29ya19jb250YWluZXIgeworCWR3Y193b3JrX2NhbGxiYWNrX3QgY2I7CisJdm9pZCAqZGF0YTsKKwlkd2Nfd29ya3FfdCAqd3E7CisJY2hhciAqbmFtZTsKKworI2lmZGVmIERFQlVHCisJRFdDX0NJUkNMRVFfRU5UUlkod29ya19jb250YWluZXIpIGVudHJ5OworI2VuZGlmCisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOworfSB3b3JrX2NvbnRhaW5lcl90OworCisjaWZkZWYgREVCVUcKK0RXQ19DSVJDTEVRX0hFQUQod29ya19jb250YWluZXJfcXVldWUsIHdvcmtfY29udGFpbmVyKTsKKyNlbmRpZgorCitzdHJ1Y3QgZHdjX3dvcmtxIHsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CisJZHdjX3NwaW5sb2NrX3QgKmxvY2s7CisJZHdjX3dhaXRxX3QgKndhaXRxOworCWludCBwZW5kaW5nOworCisjaWZkZWYgREVCVUcKKwlzdHJ1Y3Qgd29ya19jb250YWluZXJfcXVldWUgZW50cmllczsKKyNlbmRpZgorfTsKKworc3RhdGljIHZvaWQgZG9fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHcgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayk7CisJd29ya19jb250YWluZXJfdCAqY29udGFpbmVyID0gY29udGFpbmVyX29mKGR3LCBzdHJ1Y3Qgd29ya19jb250YWluZXIsIHdvcmspOworCWR3Y193b3JrcV90ICp3cSA9IGNvbnRhaW5lci0+d3E7CisKKwljb250YWluZXItPmNiKGNvbnRhaW5lci0+ZGF0YSk7CisKKyNpZmRlZiBERUJVRworCURXQ19DSVJDTEVRX1JFTU9WRSgmd3EtPmVudHJpZXMsIGNvbnRhaW5lciwgZW50cnkpOworI2VuZGlmCisJRFdDX0RFQlVHKCJXb3JrIGRvbmU6ICVzLCBjb250YWluZXI9JXAiLCBjb250YWluZXItPm5hbWUsIGNvbnRhaW5lcik7CisJaWYgKGNvbnRhaW5lci0+bmFtZSkgeworCQlEV0NfRlJFRShjb250YWluZXItPm5hbWUpOworCX0KKwlEV0NfRlJFRShjb250YWluZXIpOworCisJRFdDX1NQSU5MT0NLX0lSUVNBVkUod3EtPmxvY2ssICZmbGFncyk7CisJd3EtPnBlbmRpbmctLTsKKwlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKHdxLT5sb2NrLCBmbGFncyk7CisJRFdDX1dBSVRRX1RSSUdHRVIod3EtPndhaXRxKTsKK30KKworc3RhdGljIGludCB3b3JrX2RvbmUodm9pZCAqZGF0YSkKK3sKKwlkd2Nfd29ya3FfdCAqd29ya3EgPSAoZHdjX3dvcmtxX3QgKilkYXRhOworCXJldHVybiB3b3JrcS0+cGVuZGluZyA9PSAwOworfQorCitpbnQgRFdDX1dPUktRX1dBSVRfV09SS19ET05FKGR3Y193b3JrcV90ICp3b3JrcSwgaW50IHRpbWVvdXQpCit7CisJcmV0dXJuIERXQ19XQUlUUV9XQUlUX1RJTUVPVVQod29ya3EtPndhaXRxLCB3b3JrX2RvbmUsIHdvcmtxLCB0aW1lb3V0KTsKK30KKworZHdjX3dvcmtxX3QgKkRXQ19XT1JLUV9BTExPQyhjaGFyICpuYW1lKQoreworCWR3Y193b3JrcV90ICp3cSA9IERXQ19BTExPQyhzaXplb2YoKndxKSk7CisKKwlpZiAoIXdxKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCXdxLT53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKG5hbWUpOworCWlmICghd3EtPndxKSB7CisJCWdvdG8gbm9fd3E7CisJfQorCisJd3EtPnBlbmRpbmcgPSAwOworCisJd3EtPmxvY2sgPSBEV0NfU1BJTkxPQ0tfQUxMT0MoKTsKKwlpZiAoIXdxLT5sb2NrKSB7CisJCWdvdG8gbm9fbG9jazsKKwl9CisKKwl3cS0+d2FpdHEgPSBEV0NfV0FJVFFfQUxMT0MoKTsKKwlpZiAoIXdxLT53YWl0cSkgeworCQlnb3RvIG5vX3dhaXRxOworCX0KKworI2lmZGVmIERFQlVHCisJRFdDX0NJUkNMRVFfSU5JVCgmd3EtPmVudHJpZXMpOworI2VuZGlmCisJcmV0dXJuIHdxOworCisgbm9fd2FpdHE6CisJRFdDX1NQSU5MT0NLX0ZSRUUod3EtPmxvY2spOworIG5vX2xvY2s6CisJZGVzdHJveV93b3JrcXVldWUod3EtPndxKTsKKyBub193cToKKwlEV0NfRlJFRSh3cSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBEV0NfV09SS1FfRlJFRShkd2Nfd29ya3FfdCAqd3EpCit7CisjaWZkZWYgREVCVUcKKwlpZiAod3EtPnBlbmRpbmcgIT0gMCkgeworCQlzdHJ1Y3Qgd29ya19jb250YWluZXIgKndjOworCQlEV0NfRVJST1IoIkRlc3Ryb3lpbmcgd29yayBxdWV1ZSB3aXRoIHBlbmRpbmcgd29yayIpOworCQlEV0NfQ0lSQ0xFUV9GT1JFQUNIKHdjLCAmd3EtPmVudHJpZXMsIGVudHJ5KSB7CisJCQlEV0NfRVJST1IoIldvcmsgJXMgc3RpbGwgcGVuZGluZyIsIHdjLT5uYW1lKTsKKwkJfQorCX0KKyNlbmRpZgorCWRlc3Ryb3lfd29ya3F1ZXVlKHdxLT53cSk7CisJRFdDX1NQSU5MT0NLX0ZSRUUod3EtPmxvY2spOworCURXQ19XQUlUUV9GUkVFKHdxLT53YWl0cSk7CisJRFdDX0ZSRUUod3EpOworfQorCit2b2lkIERXQ19XT1JLUV9TQ0hFRFVMRShkd2Nfd29ya3FfdCAqd3EsIGR3Y193b3JrX2NhbGxiYWNrX3QgY2IsIHZvaWQgKmRhdGEsCisJCQljaGFyICpmb3JtYXQsIC4uLikKK3sKKwlkd2NfaXJxZmxhZ3NfdCBmbGFnczsKKwl3b3JrX2NvbnRhaW5lcl90ICpjb250YWluZXI7CisJc3RhdGljIGNoYXIgbmFtZVsxMjhdOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJRFdDX1ZTTlBSSU5URihuYW1lLCAxMjgsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJRFdDX1NQSU5MT0NLX0lSUVNBVkUod3EtPmxvY2ssICZmbGFncyk7CisJd3EtPnBlbmRpbmcrKzsKKwlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKHdxLT5sb2NrLCBmbGFncyk7CisJRFdDX1dBSVRRX1RSSUdHRVIod3EtPndhaXRxKTsKKworCWNvbnRhaW5lciA9IERXQ19BTExPQ19BVE9NSUMoc2l6ZW9mKCpjb250YWluZXIpKTsKKwlpZiAoIWNvbnRhaW5lcikgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRhaW5lclxuIik7CisJCXJldHVybjsKKwl9CisKKwljb250YWluZXItPm5hbWUgPSBEV0NfU1RSRFVQKG5hbWUpOworCWlmICghY29udGFpbmVyLT5uYW1lKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY29udGFpbmVyLT5uYW1lXG4iKTsKKwkJRFdDX0ZSRUUoY29udGFpbmVyKTsKKwkJcmV0dXJuOworCX0KKworCWNvbnRhaW5lci0+Y2IgPSBjYjsKKwljb250YWluZXItPmRhdGEgPSBkYXRhOworCWNvbnRhaW5lci0+d3EgPSB3cTsKKwlEV0NfREVCVUcoIlF1ZXVlaW5nIHdvcms6ICVzLCBjb250YWluZXI9JXAiLCBjb250YWluZXItPm5hbWUsIGNvbnRhaW5lcik7CisJSU5JVF9XT1JLKCZjb250YWluZXItPndvcmsud29yaywgZG9fd29yayk7CisKKyNpZmRlZiBERUJVRworCURXQ19DSVJDTEVRX0lOU0VSVF9UQUlMKCZ3cS0+ZW50cmllcywgY29udGFpbmVyLCBlbnRyeSk7CisjZW5kaWYKKwlxdWV1ZV93b3JrKHdxLT53cSwgJmNvbnRhaW5lci0+d29yay53b3JrKTsKK30KKwordm9pZCBEV0NfV09SS1FfU0NIRURVTEVfREVMQVlFRChkd2Nfd29ya3FfdCAqd3EsIGR3Y193b3JrX2NhbGxiYWNrX3QgY2IsCisJCQkJdm9pZCAqZGF0YSwgdWludDMyX3QgdGltZSwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisJd29ya19jb250YWluZXJfdCAqY29udGFpbmVyOworCXN0YXRpYyBjaGFyIG5hbWVbMTI4XTsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19WU05QUklOVEYobmFtZSwgMTI4LCBmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCURXQ19TUElOTE9DS19JUlFTQVZFKHdxLT5sb2NrLCAmZmxhZ3MpOworCXdxLT5wZW5kaW5nKys7CisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRSh3cS0+bG9jaywgZmxhZ3MpOworCURXQ19XQUlUUV9UUklHR0VSKHdxLT53YWl0cSk7CisKKwljb250YWluZXIgPSBEV0NfQUxMT0NfQVRPTUlDKHNpemVvZigqY29udGFpbmVyKSk7CisJaWYgKCFjb250YWluZXIpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb250YWluZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJY29udGFpbmVyLT5uYW1lID0gRFdDX1NUUkRVUChuYW1lKTsKKwlpZiAoIWNvbnRhaW5lci0+bmFtZSkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRhaW5lci0+bmFtZVxuIik7CisJCURXQ19GUkVFKGNvbnRhaW5lcik7CisJCXJldHVybjsKKwl9CisKKwljb250YWluZXItPmNiID0gY2I7CisJY29udGFpbmVyLT5kYXRhID0gZGF0YTsKKwljb250YWluZXItPndxID0gd3E7CisJRFdDX0RFQlVHKCJRdWV1ZWluZyB3b3JrOiAlcywgY29udGFpbmVyPSVwIiwgY29udGFpbmVyLT5uYW1lLCBjb250YWluZXIpOworCUlOSVRfREVMQVlFRF9XT1JLKCZjb250YWluZXItPndvcmssIGRvX3dvcmspOworCisjaWZkZWYgREVCVUcKKwlEV0NfQ0lSQ0xFUV9JTlNFUlRfVEFJTCgmd3EtPmVudHJpZXMsIGNvbnRhaW5lciwgZW50cnkpOworI2VuZGlmCisJcXVldWVfZGVsYXllZF93b3JrKHdxLT53cSwgJmNvbnRhaW5lci0+d29yaywgbXNlY3NfdG9famlmZmllcyh0aW1lKSk7Cit9CisKK2ludCBEV0NfV09SS1FfUEVORElORyhkd2Nfd29ya3FfdCAqd3EpCit7CisJcmV0dXJuIHdxLT5wZW5kaW5nOworfQorCisKKyNpZmRlZiBEV0NfTElCTU9EVUxFCisKKyNpZmRlZiBEV0NfQ0NMSUIKKy8qIENDICovCitFWFBPUlRfU1lNQk9MKGR3Y19jY19pZl9hbGxvYyk7CitFWFBPUlRfU1lNQk9MKGR3Y19jY19pZl9mcmVlKTsKK0VYUE9SVF9TWU1CT0woZHdjX2NjX2NsZWFyKTsKK0VYUE9SVF9TWU1CT0woZHdjX2NjX2FkZCk7CitFWFBPUlRfU1lNQk9MKGR3Y19jY19yZW1vdmUpOworRVhQT1JUX1NZTUJPTChkd2NfY2NfY2hhbmdlKTsKK0VYUE9SVF9TWU1CT0woZHdjX2NjX2RhdGFfZm9yX3NhdmUpOworRVhQT1JUX1NZTUJPTChkd2NfY2NfcmVzdG9yZV9mcm9tX2RhdGEpOworRVhQT1JUX1NZTUJPTChkd2NfY2NfbWF0Y2hfY2hpZCk7CitFWFBPUlRfU1lNQk9MKGR3Y19jY19tYXRjaF9jZGlkKTsKK0VYUE9SVF9TWU1CT0woZHdjX2NjX2NrKTsKK0VYUE9SVF9TWU1CT0woZHdjX2NjX2NoaWQpOworRVhQT1JUX1NZTUJPTChkd2NfY2NfY2RpZCk7CitFWFBPUlRfU1lNQk9MKGR3Y19jY19uYW1lKTsKKyNlbmRpZgkvKiBEV0NfQ0NMSUIgKi8KKworI2lmZGVmIERXQ19DUllQVE9MSUIKKyMgaWZuZGVmIENPTkZJR19NQUNIX0lQTUFURQorLyogTW9kcG93ICovCitFWFBPUlRfU1lNQk9MKGR3Y19tb2Rwb3cpOworCisvKiBESCAqLworRVhQT1JUX1NZTUJPTChkd2NfZGhfbW9kcG93KTsKK0VYUE9SVF9TWU1CT0woZHdjX2RoX2Rlcml2ZV9rZXlzKTsKK0VYUE9SVF9TWU1CT0woZHdjX2RoX3BrKTsKKyMgZW5kaWYJLyogQ09ORklHX01BQ0hfSVBNQVRFICovCisKKy8qIENyeXB0byAqLworRVhQT1JUX1NZTUJPTChkd2Nfd3VzYl9hZXNfZW5jcnlwdCk7CitFWFBPUlRfU1lNQk9MKGR3Y193dXNiX2NtZik7CitFWFBPUlRfU1lNQk9MKGR3Y193dXNiX3ByZik7CitFWFBPUlRfU1lNQk9MKGR3Y193dXNiX2ZpbGxfY2NtX25vbmNlKTsKK0VYUE9SVF9TWU1CT0woZHdjX3d1c2JfZ2VuX25vbmNlKTsKK0VYUE9SVF9TWU1CT0woZHdjX3d1c2JfZ2VuX2tleSk7CitFWFBPUlRfU1lNQk9MKGR3Y193dXNiX2dlbl9taWMpOworI2VuZGlmCS8qIERXQ19DUllQVE9MSUIgKi8KKworLyogTm90aWZpY2F0aW9uICovCisjaWZkZWYgRFdDX05PVElGWUxJQgorRVhQT1JUX1NZTUJPTChkd2NfYWxsb2Nfbm90aWZpY2F0aW9uX21hbmFnZXIpOworRVhQT1JUX1NZTUJPTChkd2NfZnJlZV9ub3RpZmljYXRpb25fbWFuYWdlcik7CitFWFBPUlRfU1lNQk9MKGR3Y19yZWdpc3Rlcl9ub3RpZmllcik7CitFWFBPUlRfU1lNQk9MKGR3Y191bnJlZ2lzdGVyX25vdGlmaWVyKTsKK0VYUE9SVF9TWU1CT0woZHdjX2FkZF9vYnNlcnZlcik7CitFWFBPUlRfU1lNQk9MKGR3Y19yZW1vdmVfb2JzZXJ2ZXIpOworRVhQT1JUX1NZTUJPTChkd2Nfbm90aWZ5KTsKKyNlbmRpZgorCisvKiBNZW1vcnkgRGVidWdnaW5nIFJvdXRpbmVzICovCisjaWZkZWYgRFdDX0RFQlVHX01FTU9SWQorRVhQT1JUX1NZTUJPTChkd2NfYWxsb2NfZGVidWcpOworRVhQT1JUX1NZTUJPTChkd2NfYWxsb2NfYXRvbWljX2RlYnVnKTsKK0VYUE9SVF9TWU1CT0woZHdjX2ZyZWVfZGVidWcpOworRVhQT1JUX1NZTUJPTChkd2NfZG1hX2FsbG9jX2RlYnVnKTsKK0VYUE9SVF9TWU1CT0woZHdjX2RtYV9mcmVlX2RlYnVnKTsKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKERXQ19NRU1TRVQpOworRVhQT1JUX1NZTUJPTChEV0NfTUVNQ1BZKTsKK0VYUE9SVF9TWU1CT0woRFdDX01FTU1PVkUpOworRVhQT1JUX1NZTUJPTChEV0NfTUVNQ01QKTsKK0VYUE9SVF9TWU1CT0woRFdDX1NUUk5DTVApOworRVhQT1JUX1NZTUJPTChEV0NfU1RSQ01QKTsKK0VYUE9SVF9TWU1CT0woRFdDX1NUUkxFTik7CitFWFBPUlRfU1lNQk9MKERXQ19TVFJDUFkpOworRVhQT1JUX1NZTUJPTChEV0NfU1RSRFVQKTsKK0VYUE9SVF9TWU1CT0woRFdDX0FUT0kpOworRVhQT1JUX1NZTUJPTChEV0NfQVRPVUkpOworCisjaWZkZWYgRFdDX1VURkxJQgorRVhQT1JUX1NZTUJPTChEV0NfVVRGOF9UT19VVEYxNkxFKTsKKyNlbmRpZgkvKiBEV0NfVVRGTElCICovCisKK0VYUE9SVF9TWU1CT0woRFdDX0lOX0lSUSk7CitFWFBPUlRfU1lNQk9MKERXQ19JTl9CSCk7CitFWFBPUlRfU1lNQk9MKERXQ19WUFJJTlRGKTsKK0VYUE9SVF9TWU1CT0woRFdDX1ZTTlBSSU5URik7CitFWFBPUlRfU1lNQk9MKERXQ19QUklOVEYpOworRVhQT1JUX1NZTUJPTChEV0NfU1BSSU5URik7CitFWFBPUlRfU1lNQk9MKERXQ19TTlBSSU5URik7CitFWFBPUlRfU1lNQk9MKF9fRFdDX1dBUk4pOworRVhQT1JUX1NZTUJPTChfX0RXQ19FUlJPUik7CitFWFBPUlRfU1lNQk9MKERXQ19FWENFUFRJT04pOworCisjaWZkZWYgREVCVUcKK0VYUE9SVF9TWU1CT0woX19EV0NfREVCVUcpOworI2VuZGlmCisKK0VYUE9SVF9TWU1CT0woX19EV0NfRE1BX0FMTE9DKTsKK0VYUE9SVF9TWU1CT0woX19EV0NfRE1BX0FMTE9DX0FUT01JQyk7CitFWFBPUlRfU1lNQk9MKF9fRFdDX0RNQV9GUkVFKTsKK0VYUE9SVF9TWU1CT0woX19EV0NfQUxMT0MpOworRVhQT1JUX1NZTUJPTChfX0RXQ19BTExPQ19BVE9NSUMpOworRVhQT1JUX1NZTUJPTChfX0RXQ19GUkVFKTsKKworI2lmZGVmIERXQ19DUllQVE9MSUIKK0VYUE9SVF9TWU1CT0woRFdDX1JBTkRPTV9CWVRFUyk7CitFWFBPUlRfU1lNQk9MKERXQ19BRVNfQ0JDKTsKK0VYUE9SVF9TWU1CT0woRFdDX1NIQTI1Nik7CitFWFBPUlRfU1lNQk9MKERXQ19ITUFDX1NIQTI1Nik7CisjZW5kaWYKKworRVhQT1JUX1NZTUJPTChEV0NfQ1BVX1RPX0xFMzIpOworRVhQT1JUX1NZTUJPTChEV0NfQ1BVX1RPX0JFMzIpOworRVhQT1JUX1NZTUJPTChEV0NfTEUzMl9UT19DUFUpOworRVhQT1JUX1NZTUJPTChEV0NfQkUzMl9UT19DUFUpOworRVhQT1JUX1NZTUJPTChEV0NfQ1BVX1RPX0xFMTYpOworRVhQT1JUX1NZTUJPTChEV0NfQ1BVX1RPX0JFMTYpOworRVhQT1JUX1NZTUJPTChEV0NfTEUxNl9UT19DUFUpOworRVhQT1JUX1NZTUJPTChEV0NfQkUxNl9UT19DUFUpOworRVhQT1JUX1NZTUJPTChEV0NfUkVBRF9SRUczMik7CitFWFBPUlRfU1lNQk9MKERXQ19XUklURV9SRUczMik7CitFWFBPUlRfU1lNQk9MKERXQ19NT0RJRllfUkVHMzIpOworCisjaWYgMAorRVhQT1JUX1NZTUJPTChEV0NfUkVBRF9SRUc2NCk7CitFWFBPUlRfU1lNQk9MKERXQ19XUklURV9SRUc2NCk7CitFWFBPUlRfU1lNQk9MKERXQ19NT0RJRllfUkVHNjQpOworI2VuZGlmCisKK0VYUE9SVF9TWU1CT0woRFdDX1NQSU5MT0NLX0FMTE9DKTsKK0VYUE9SVF9TWU1CT0woRFdDX1NQSU5MT0NLX0ZSRUUpOworRVhQT1JUX1NZTUJPTChEV0NfU1BJTkxPQ0spOworRVhQT1JUX1NZTUJPTChEV0NfU1BJTlVOTE9DSyk7CitFWFBPUlRfU1lNQk9MKERXQ19TUElOTE9DS19JUlFTQVZFKTsKK0VYUE9SVF9TWU1CT0woRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRSk7CitFWFBPUlRfU1lNQk9MKERXQ19NVVRFWF9BTExPQyk7CisKKyNpZiAoIWRlZmluZWQoRFdDX0xJTlVYKSB8fCAhZGVmaW5lZChDT05GSUdfREVCVUdfTVVURVhFUykpCitFWFBPUlRfU1lNQk9MKERXQ19NVVRFWF9GUkVFKTsKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MKERXQ19NVVRFWF9MT0NLKTsKK0VYUE9SVF9TWU1CT0woRFdDX01VVEVYX1RSWUxPQ0spOworRVhQT1JUX1NZTUJPTChEV0NfTVVURVhfVU5MT0NLKTsKK0VYUE9SVF9TWU1CT0woRFdDX1VERUxBWSk7CitFWFBPUlRfU1lNQk9MKERXQ19NREVMQVkpOworRVhQT1JUX1NZTUJPTChEV0NfTVNMRUVQKTsKK0VYUE9SVF9TWU1CT0woRFdDX1RJTUUpOworRVhQT1JUX1NZTUJPTChEV0NfVElNRVJfQUxMT0MpOworRVhQT1JUX1NZTUJPTChEV0NfVElNRVJfRlJFRSk7CitFWFBPUlRfU1lNQk9MKERXQ19USU1FUl9TQ0hFRFVMRSk7CitFWFBPUlRfU1lNQk9MKERXQ19USU1FUl9DQU5DRUwpOworRVhQT1JUX1NZTUJPTChEV0NfV0FJVFFfQUxMT0MpOworRVhQT1JUX1NZTUJPTChEV0NfV0FJVFFfRlJFRSk7CitFWFBPUlRfU1lNQk9MKERXQ19XQUlUUV9XQUlUKTsKK0VYUE9SVF9TWU1CT0woRFdDX1dBSVRRX1dBSVRfVElNRU9VVCk7CitFWFBPUlRfU1lNQk9MKERXQ19XQUlUUV9UUklHR0VSKTsKK0VYUE9SVF9TWU1CT0woRFdDX1dBSVRRX0FCT1JUKTsKK0VYUE9SVF9TWU1CT0woRFdDX1RIUkVBRF9SVU4pOworRVhQT1JUX1NZTUJPTChEV0NfVEhSRUFEX1NUT1ApOworRVhQT1JUX1NZTUJPTChEV0NfVEhSRUFEX1NIT1VMRF9TVE9QKTsKK0VYUE9SVF9TWU1CT0woRFdDX1RBU0tfQUxMT0MpOworRVhQT1JUX1NZTUJPTChEV0NfVEFTS19GUkVFKTsKK0VYUE9SVF9TWU1CT0woRFdDX1RBU0tfU0NIRURVTEUpOworRVhQT1JUX1NZTUJPTChEV0NfV09SS1FfV0FJVF9XT1JLX0RPTkUpOworRVhQT1JUX1NZTUJPTChEV0NfV09SS1FfQUxMT0MpOworRVhQT1JUX1NZTUJPTChEV0NfV09SS1FfRlJFRSk7CitFWFBPUlRfU1lNQk9MKERXQ19XT1JLUV9TQ0hFRFVMRSk7CitFWFBPUlRfU1lNQk9MKERXQ19XT1JLUV9TQ0hFRFVMRV9ERUxBWUVEKTsKK0VYUE9SVF9TWU1CT0woRFdDX1dPUktRX1BFTkRJTkcpOworCitzdGF0aWMgaW50IGR3Y19jb21tb25fcG9ydF9pbml0X21vZHVsZSh2b2lkKQoreworCWludCByZXN1bHQgPSAwOworCisJcHJpbnRrKEtFUk5fREVCVUcgIk1vZHVsZSBkd2NfY29tbW9uX3BvcnQgaW5pdFxuIiApOworCisjaWZkZWYgRFdDX0RFQlVHX01FTU9SWQorCXJlc3VsdCA9IGR3Y19tZW1vcnlfZGVidWdfc3RhcnQoTlVMTCk7CisJaWYgKHJlc3VsdCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJkd2NfbWVtb3J5X2RlYnVnX3N0YXJ0KCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCisJCSAgICAgICByZXN1bHQpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKyNlbmRpZgorCisjaWZkZWYgRFdDX05PVElGWUxJQgorCXJlc3VsdCA9IGR3Y19hbGxvY19ub3RpZmljYXRpb25fbWFuYWdlcihOVUxMLCBOVUxMKTsKKwlpZiAocmVzdWx0KSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImR3Y19hbGxvY19ub3RpZmljYXRpb25fbWFuYWdlcigpIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLAorCQkgICAgICAgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisjZW5kaWYKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBkd2NfY29tbW9uX3BvcnRfZXhpdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9ERUJVRyAiTW9kdWxlIGR3Y19jb21tb25fcG9ydCBleGl0XG4iICk7CisKKyNpZmRlZiBEV0NfTk9USUZZTElCCisJZHdjX2ZyZWVfbm90aWZpY2F0aW9uX21hbmFnZXIoKTsKKyNlbmRpZgorCisjaWZkZWYgRFdDX0RFQlVHX01FTU9SWQorCWR3Y19tZW1vcnlfZGVidWdfc3RvcCgpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KGR3Y19jb21tb25fcG9ydF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChkd2NfY29tbW9uX3BvcnRfZXhpdF9tb2R1bGUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkRXQyBDb21tb24gTGlicmFyeSAtIFBvcnRhYmxlIHZlcnNpb24iKTsKK01PRFVMRV9BVVRIT1IoIlN5bm9wc3lzIEluYy4iKTsKK01PRFVMRV9MSUNFTlNFICgiR1BMIik7CisKKyNlbmRpZgkvKiBEV0NfTElCTU9EVUxFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19jb21tb25fbmJzZC5jIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfY29tbW9uX25ic2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWIwN2UxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfY29tbW9uX25ic2QuYwpAQCAtMCwwICsxLDEyNzUgQEAKKyNpbmNsdWRlICJkd2Nfb3MuaCIKKyNpbmNsdWRlICJkd2NfbGlzdC5oIgorCisjaWZkZWYgRFdDX0NDTElCCisjIGluY2x1ZGUgImR3Y19jYy5oIgorI2VuZGlmCisKKyNpZmRlZiBEV0NfQ1JZUFRPTElCCisjIGluY2x1ZGUgImR3Y19tb2Rwb3cuaCIKKyMgaW5jbHVkZSAiZHdjX2RoLmgiCisjIGluY2x1ZGUgImR3Y19jcnlwdG8uaCIKKyNlbmRpZgorCisjaWZkZWYgRFdDX05PVElGWUxJQgorIyBpbmNsdWRlICJkd2Nfbm90aWZpZXIuaCIKKyNlbmRpZgorCisvKiBPUy1MZXZlbCBJbXBsZW1lbnRhdGlvbnMgKi8KKworLyogVGhpcyBpcyB0aGUgTmV0QlNEIDQuMC4xIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRFdDIHBsYXRmb3JtIGxpYnJhcnkuICovCisKKworLyogTUlTQyAqLworCit2b2lkICpEV0NfTUVNU0VUKHZvaWQgKmRlc3QsIHVpbnQ4X3QgYnl0ZSwgdWludDMyX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gbWVtc2V0KGRlc3QsIGJ5dGUsIHNpemUpOworfQorCit2b2lkICpEV0NfTUVNQ1BZKHZvaWQgKmRlc3QsIHZvaWQgY29uc3QgKnNyYywgdWludDMyX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gbWVtY3B5KGRlc3QsIHNyYywgc2l6ZSk7Cit9CisKK3ZvaWQgKkRXQ19NRU1NT1ZFKHZvaWQgKmRlc3QsIHZvaWQgKnNyYywgdWludDMyX3Qgc2l6ZSkKK3sKKwliY29weShzcmMsIGRlc3QsIHNpemUpOworCXJldHVybiBkZXN0OworfQorCitpbnQgRFdDX01FTUNNUCh2b2lkICptMSwgdm9pZCAqbTIsIHVpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIG1lbWNtcChtMSwgbTIsIHNpemUpOworfQorCitpbnQgRFdDX1NUUk5DTVAodm9pZCAqczEsIHZvaWQgKnMyLCB1aW50MzJfdCBzaXplKQoreworCXJldHVybiBzdHJuY21wKHMxLCBzMiwgc2l6ZSk7Cit9CisKK2ludCBEV0NfU1RSQ01QKHZvaWQgKnMxLCB2b2lkICpzMikKK3sKKwlyZXR1cm4gc3RyY21wKHMxLCBzMik7Cit9CisKK2ludCBEV0NfU1RSTEVOKGNoYXIgY29uc3QgKnN0cikKK3sKKwlyZXR1cm4gc3RybGVuKHN0cik7Cit9CisKK2NoYXIgKkRXQ19TVFJDUFkoY2hhciAqdG8sIGNoYXIgY29uc3QgKmZyb20pCit7CisJcmV0dXJuIHN0cmNweSh0bywgZnJvbSk7Cit9CisKK2NoYXIgKkRXQ19TVFJEVVAoY2hhciBjb25zdCAqc3RyKQoreworCWludCBsZW4gPSBEV0NfU1RSTEVOKHN0cikgKyAxOworCWNoYXIgKm5ldyA9IERXQ19BTExPQ19BVE9NSUMobGVuKTsKKworCWlmICghbmV3KSB7CisJCXJldHVybiBOVUxMOworCX0KKworCURXQ19NRU1DUFkobmV3LCBzdHIsIGxlbik7CisJcmV0dXJuIG5ldzsKK30KKworaW50IERXQ19BVE9JKGNoYXIgKnN0ciwgaW50MzJfdCAqdmFsdWUpCit7CisJY2hhciAqZW5kID0gTlVMTDsKKworCS8qIE5ldEJTRCBkb2Vzbid0IGhhdmUgJ3N0cnRvbCcgaW4gdGhlIGtlcm5lbCwgYnV0ICdzdHJ0b3VsJworCSAqIHNob3VsZCBiZSBlcXVpdmFsZW50IG9uIDIncyBjb21wbGVtZW50IG1hY2hpbmVzCisJICovCisJKnZhbHVlID0gc3RydG91bChzdHIsICZlbmQsIDApOworCWlmICgqZW5kID09ICdcMCcpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC0xOworfQorCitpbnQgRFdDX0FUT1VJKGNoYXIgKnN0ciwgdWludDMyX3QgKnZhbHVlKQoreworCWNoYXIgKmVuZCA9IE5VTEw7CisKKwkqdmFsdWUgPSBzdHJ0b3VsKHN0ciwgJmVuZCwgMCk7CisJaWYgKCplbmQgPT0gJ1wwJykgeworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKworI2lmZGVmIERXQ19VVEZMSUIKKy8qIEZyb20gdXNic3RyaW5nLmMgKi8KKworaW50IERXQ19VVEY4X1RPX1VURjE2TEUodWludDhfdCBjb25zdCAqcywgdWludDE2X3QgKmNwLCB1bnNpZ25lZCBsZW4pCit7CisJaW50CWNvdW50ID0gMDsKKwl1OAljOworCXUxNgl1Y2hhcjsKKworCS8qIHRoaXMgaW5zaXN0cyBvbiBjb3JyZWN0IGVuY29kaW5ncywgdGhvdWdoIG5vdCBtaW5pbWFsIG9uZXMuCisJICogQlVUIGl0IGN1cnJlbnRseSByZWplY3RzIGxlZ2l0IDQtYnl0ZSBVVEYtOCBjb2RlIHBvaW50cywKKwkgKiB3aGljaCBuZWVkIHN1cnJvZ2F0ZSBwYWlycy4gIChVbmljb2RlIDMuMSBjYW4gdXNlIHRoZW0uKQorCSAqLworCXdoaWxlIChsZW4gIT0gMCAmJiAoYyA9ICh1OCkgKnMrKykgIT0gMCkgeworCQlpZiAodW5saWtlbHkoYyAmIDB4ODApKSB7CisJCQkvLyAyLWJ5dGUgc2VxdWVuY2U6CisJCQkvLyAwMDAwMHl5eXl5eHh4eHh4ID0gMTEweXl5eXkgMTB4eHh4eHgKKwkJCWlmICgoYyAmIDB4ZTApID09IDB4YzApIHsKKwkJCQl1Y2hhciA9IChjICYgMHgxZikgPDwgNjsKKworCQkJCWMgPSAodTgpICpzKys7CisJCQkJaWYgKChjICYgMHhjMCkgIT0gMHhjMCkKKwkJCQkJZ290byBmYWlsOworCQkJCWMgJj0gMHgzZjsKKwkJCQl1Y2hhciB8PSBjOworCisJCQkvLyAzLWJ5dGUgc2VxdWVuY2UgKG1vc3QgQ0pLViBjaGFyYWN0ZXJzKToKKwkJCS8vIHp6enp5eXl5eXl4eHh4eHggPSAxMTEwenp6eiAxMHl5eXl5eSAxMHh4eHh4eAorCQkJfSBlbHNlIGlmICgoYyAmIDB4ZjApID09IDB4ZTApIHsKKwkJCQl1Y2hhciA9IChjICYgMHgwZikgPDwgMTI7CisKKwkJCQljID0gKHU4KSAqcysrOworCQkJCWlmICgoYyAmIDB4YzApICE9IDB4YzApCisJCQkJCWdvdG8gZmFpbDsKKwkJCQljICY9IDB4M2Y7CisJCQkJdWNoYXIgfD0gYyA8PCA2OworCisJCQkJYyA9ICh1OCkgKnMrKzsKKwkJCQlpZiAoKGMgJiAweGMwKSAhPSAweGMwKQorCQkJCQlnb3RvIGZhaWw7CisJCQkJYyAmPSAweDNmOworCQkJCXVjaGFyIHw9IGM7CisKKwkJCQkvKiBubyBib2d1cyBzdXJyb2dhdGVzICovCisJCQkJaWYgKDB4ZDgwMCA8PSB1Y2hhciAmJiB1Y2hhciA8PSAweGRmZmYpCisJCQkJCWdvdG8gZmFpbDsKKworCQkJLy8gNC1ieXRlIHNlcXVlbmNlIChzdXJyb2dhdGUgcGFpcnMsIGN1cnJlbnRseSByYXJlKToKKwkJCS8vIDExMTAxMTEwd3d3d3p6enp5eSArIDExMDExMXl5eXl4eHh4eHgKKwkJCS8vICAgICA9IDExMTEwdXV1IDEwdXV6enp6IDEweXl5eXl5IDEweHh4eHh4CisJCQkvLyAodXV1dXUgPSB3d3d3ICsgMSkKKwkJCS8vIEZJWE1FIGFjY2VwdCB0aGUgc3Vycm9nYXRlIGNvZGUgcG9pbnRzIChvbmx5KQorCQkJfSBlbHNlCisJCQkJZ290byBmYWlsOworCQl9IGVsc2UKKwkJCXVjaGFyID0gYzsKKwkJcHV0X3VuYWxpZ25lZCAoY3B1X3RvX2xlMTYgKHVjaGFyKSwgY3ArKyk7CisJCWNvdW50Kys7CisJCWxlbi0tOworCX0KKwlyZXR1cm4gY291bnQ7CitmYWlsOgorCXJldHVybiAtMTsKK30KKworI2VuZGlmCS8qIERXQ19VVEZMSUIgKi8KKworCisvKiBkd2NfZGVidWcuaCAqLworCitkd2NfYm9vbF90IERXQ19JTl9JUlEodm9pZCkKK3sKKy8vCXJldHVybiBpbl9pcnEoKTsKKwlyZXR1cm4gMDsKK30KKworZHdjX2Jvb2xfdCBEV0NfSU5fQkgodm9pZCkKK3sKKy8vCXJldHVybiBpbl9zb2Z0aXJxKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgRFdDX1ZQUklOVEYoY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisJdnByaW50Zihmb3JtYXQsIGFyZ3MpOworfQorCitpbnQgRFdDX1ZTTlBSSU5URihjaGFyICpzdHIsIGludCBzaXplLCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKwlyZXR1cm4gdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm9ybWF0LCBhcmdzKTsKK30KKwordm9pZCBEV0NfUFJJTlRGKGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJRFdDX1ZQUklOVEYoZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKK2ludCBEV0NfU1BSSU5URihjaGFyICpidWZmZXIsIGNoYXIgKmZvcm1hdCwgLi4uKQoreworCWludCByZXR2YWw7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwlyZXR2YWwgPSB2c3ByaW50ZihidWZmZXIsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBEV0NfU05QUklOVEYoY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJaW50IHJldHZhbDsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCXJldHZhbCA9IHZzbnByaW50ZihidWZmZXIsIHNpemUsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByZXR2YWw7Cit9CisKK3ZvaWQgX19EV0NfV0FSTihjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19WUFJJTlRGKGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIF9fRFdDX0VSUk9SKGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJRFdDX1ZQUklOVEYoZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisKK3ZvaWQgRFdDX0VYQ0VQVElPTihjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19WUFJJTlRGKGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworLy8JQlVHX09OKDEpOwk/Pz8KK30KKworI2lmZGVmIERFQlVHCit2b2lkIF9fRFdDX0RFQlVHKGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJRFdDX1ZQUklOVEYoZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7Cit9CisjZW5kaWYKKworCisvKiBkd2NfbWVtLmggKi8KKworI2lmIDAKK2R3Y19wb29sX3QgKkRXQ19ETUFfUE9PTF9DUkVBVEUodWludDMyX3Qgc2l6ZSwKKwkJCQl1aW50MzJfdCBhbGlnbiwKKwkJCQl1aW50MzJfdCBhbGxvYykKK3sKKwlzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wgPSBkbWFfcG9vbF9jcmVhdGUoIlBvb2wiLCBOVUxMLAorCQkJCQkJc2l6ZSwgYWxpZ24sIGFsbG9jKTsKKwlyZXR1cm4gKGR3Y19wb29sX3QgKilwb29sOworfQorCit2b2lkIERXQ19ETUFfUE9PTF9ERVNUUk9ZKGR3Y19wb29sX3QgKnBvb2wpCit7CisJZG1hX3Bvb2xfZGVzdHJveSgoc3RydWN0IGRtYV9wb29sICopcG9vbCk7Cit9CisKK3ZvaWQgKkRXQ19ETUFfUE9PTF9BTExPQyhkd2NfcG9vbF90ICpwb29sLCB1aW50NjRfdCAqZG1hX2FkZHIpCit7CisvLwlyZXR1cm4gZG1hX3Bvb2xfYWxsb2MoKHN0cnVjdCBkbWFfcG9vbCAqKXBvb2wsIEdGUF9LRVJORUwsIGRtYV9hZGRyKTsKKwlyZXR1cm4gZG1hX3Bvb2xfYWxsb2MoKHN0cnVjdCBkbWFfcG9vbCAqKXBvb2wsIE1fV0FJVE9LLCBkbWFfYWRkcik7Cit9CisKK3ZvaWQgKkRXQ19ETUFfUE9PTF9aQUxMT0MoZHdjX3Bvb2xfdCAqcG9vbCwgdWludDY0X3QgKmRtYV9hZGRyKQoreworCXZvaWQgKnZhZGRyID0gRFdDX0RNQV9QT09MX0FMTE9DKHBvb2wsIGRtYV9hZGRyKTsKKwltZW1zZXQoLi4pOworfQorCit2b2lkIERXQ19ETUFfUE9PTF9GUkVFKGR3Y19wb29sX3QgKnBvb2wsIHZvaWQgKnZhZGRyLCB2b2lkICpkYWRkcikKK3sKKwlkbWFfcG9vbF9mcmVlKHBvb2wsIHZhZGRyLCBkYWRkcik7Cit9CisjZW5kaWYKKwordm9pZCAqX19EV0NfRE1BX0FMTE9DKHZvaWQgKmRtYV9jdHgsIHVpbnQzMl90IHNpemUsIGR3Y19kbWFfdCAqZG1hX2FkZHIpCit7CisJZHdjX2RtYWN0eF90ICpkbWEgPSAoZHdjX2RtYWN0eF90ICopZG1hX2N0eDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGJ1c19kbWFtZW1fYWxsb2MoZG1hLT5kbWFfdGFnLCBzaXplLCAxLCBzaXplLCBkbWEtPnNlZ3MsCisJCQkJIHNpemVvZihkbWEtPnNlZ3MpIC8gc2l6ZW9mKGRtYS0+c2Vnc1swXSksCisJCQkJICZkbWEtPm5zZWdzLCBCVVNfRE1BX05PV0FJVCk7CisJaWYgKGVycm9yKSB7CisJCXByaW50ZigiJXM6IGJ1c19kbWFtZW1fYWxsb2MoJWp1KSBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgICh1aW50bWF4X3Qpc2l6ZSwgZXJyb3IpOworCQlnb3RvIGZhaWxfMDsKKwl9CisKKwllcnJvciA9IGJ1c19kbWFtZW1fbWFwKGRtYS0+ZG1hX3RhZywgZG1hLT5zZWdzLCBkbWEtPm5zZWdzLCBzaXplLAorCQkJICAgICAgIChjYWRkcl90ICopJmRtYS0+ZG1hX3ZhZGRyLAorCQkJICAgICAgIEJVU19ETUFfTk9XQUlUIHwgQlVTX0RNQV9DT0hFUkVOVCk7CisJaWYgKGVycm9yKSB7CisJCXByaW50ZigiJXM6IGJ1c19kbWFtZW1fbWFwIGZhaWxlZDogJWRcbiIsIF9fZnVuY19fLCBlcnJvcik7CisJCWdvdG8gZmFpbF8xOworCX0KKworCWVycm9yID0gYnVzX2RtYW1hcF9jcmVhdGUoZG1hLT5kbWFfdGFnLCBzaXplLCAxLCBzaXplLCAwLAorCQkJCSAgQlVTX0RNQV9OT1dBSVQsICZkbWEtPmRtYV9tYXApOworCWlmIChlcnJvcikgeworCQlwcmludGYoIiVzOiBidXNfZG1hbWFwX2NyZWF0ZSBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOworCQlnb3RvIGZhaWxfMjsKKwl9CisKKwllcnJvciA9IGJ1c19kbWFtYXBfbG9hZChkbWEtPmRtYV90YWcsIGRtYS0+ZG1hX21hcCwgZG1hLT5kbWFfdmFkZHIsCisJCQkJc2l6ZSwgTlVMTCwgQlVTX0RNQV9OT1dBSVQpOworCWlmIChlcnJvcikgeworCQlwcmludGYoIiVzOiBidXNfZG1hbWFwX2xvYWQgZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKKwkJZ290byBmYWlsXzM7CisJfQorCisJZG1hLT5kbWFfcGFkZHIgPSAoYnVzX2FkZHJfdClkbWEtPnNlZ3NbMF0uZHNfYWRkcjsKKwkqZG1hX2FkZHIgPSBkbWEtPmRtYV9wYWRkcjsKKwlyZXR1cm4gZG1hLT5kbWFfdmFkZHI7CisKK2ZhaWxfMzoKKwlidXNfZG1hbWFwX2Rlc3Ryb3koZG1hLT5kbWFfdGFnLCBkbWEtPmRtYV9tYXApOworZmFpbF8yOgorCWJ1c19kbWFtZW1fdW5tYXAoZG1hLT5kbWFfdGFnLCBkbWEtPmRtYV92YWRkciwgc2l6ZSk7CitmYWlsXzE6CisJYnVzX2RtYW1lbV9mcmVlKGRtYS0+ZG1hX3RhZywgZG1hLT5zZWdzLCBkbWEtPm5zZWdzKTsKK2ZhaWxfMDoKKwlkbWEtPmRtYV9tYXAgPSBOVUxMOworCWRtYS0+ZG1hX3ZhZGRyID0gTlVMTDsKKwlkbWEtPm5zZWdzID0gMDsKKworCXJldHVybiBOVUxMOworfQorCit2b2lkIF9fRFdDX0RNQV9GUkVFKHZvaWQgKmRtYV9jdHgsIHVpbnQzMl90IHNpemUsIHZvaWQgKnZpcnRfYWRkciwgZHdjX2RtYV90IGRtYV9hZGRyKQoreworCWR3Y19kbWFjdHhfdCAqZG1hID0gKGR3Y19kbWFjdHhfdCAqKWRtYV9jdHg7CisKKwlpZiAoZG1hLT5kbWFfbWFwICE9IE5VTEwpIHsKKwkJYnVzX2RtYW1hcF9zeW5jKGRtYS0+ZG1hX3RhZywgZG1hLT5kbWFfbWFwLCAwLCBzaXplLAorCQkJCUJVU19ETUFTWU5DX1BPU1RSRUFEIHwgQlVTX0RNQVNZTkNfUE9TVFdSSVRFKTsKKwkJYnVzX2RtYW1hcF91bmxvYWQoZG1hLT5kbWFfdGFnLCBkbWEtPmRtYV9tYXApOworCQlidXNfZG1hbWFwX2Rlc3Ryb3koZG1hLT5kbWFfdGFnLCBkbWEtPmRtYV9tYXApOworCQlidXNfZG1hbWVtX3VubWFwKGRtYS0+ZG1hX3RhZywgZG1hLT5kbWFfdmFkZHIsIHNpemUpOworCQlidXNfZG1hbWVtX2ZyZWUoZG1hLT5kbWFfdGFnLCBkbWEtPnNlZ3MsIGRtYS0+bnNlZ3MpOworCQlkbWEtPmRtYV9wYWRkciA9IDA7CisJCWRtYS0+ZG1hX21hcCA9IE5VTEw7CisJCWRtYS0+ZG1hX3ZhZGRyID0gTlVMTDsKKwkJZG1hLT5uc2VncyA9IDA7CisJfQorfQorCit2b2lkICpfX0RXQ19BTExPQyh2b2lkICptZW1fY3R4LCB1aW50MzJfdCBzaXplKQoreworCXJldHVybiBtYWxsb2Moc2l6ZSwgTV9ERVZCVUYsIE1fV0FJVE9LIHwgTV9aRVJPKTsKK30KKwordm9pZCAqX19EV0NfQUxMT0NfQVRPTUlDKHZvaWQgKm1lbV9jdHgsIHVpbnQzMl90IHNpemUpCit7CisJcmV0dXJuIG1hbGxvYyhzaXplLCBNX0RFVkJVRiwgTV9OT1dBSVQgfCBNX1pFUk8pOworfQorCit2b2lkIF9fRFdDX0ZSRUUodm9pZCAqbWVtX2N0eCwgdm9pZCAqYWRkcikKK3sKKwlmcmVlKGFkZHIsIE1fREVWQlVGKTsKK30KKworCisjaWZkZWYgRFdDX0NSWVBUT0xJQgorLyogZHdjX2NyeXB0by5oICovCisKK3ZvaWQgRFdDX1JBTkRPTV9CWVRFUyh1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCkKK3sKKwlnZXRfcmFuZG9tX2J5dGVzKGJ1ZmZlciwgbGVuZ3RoKTsKK30KKworaW50IERXQ19BRVNfQ0JDKHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IG1lc3NhZ2VsZW4sIHVpbnQ4X3QgKmtleSwgdWludDMyX3Qga2V5bGVuLCB1aW50OF90IGl2WzE2XSwgdWludDhfdCAqb3V0KQoreworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm07CisJc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnZDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dzOworCisJdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiY2JjKGFlcykiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAodGZtID09IE5VTEwpIHsKKwkJcHJpbnRrKCJmYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yIGFlcyBDQkNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7CisJY3J5cHRvX2Jsa2NpcGhlcl9zZXRfaXYodGZtLCBpdiwgMTYpOworCisJc2dfaW5pdF9vbmUoJnNnZCwgb3V0LCBtZXNzYWdlbGVuKTsKKwlzZ19pbml0X29uZSgmc2dzLCBtZXNzYWdlLCBtZXNzYWdlbGVuKTsKKworCWRlc2MudGZtID0gdGZtOworCWRlc2MuZmxhZ3MgPSAwOworCisJaWYgKGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnZCwgJnNncywgbWVzc2FnZWxlbikpIHsKKwkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHRmbSk7CisJCURXQ19FUlJPUigiQUVTIENCQyBlbmNyeXB0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHRmbSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBEV0NfU0hBMjU2KHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IGxlbiwgdWludDhfdCAqb3V0KQoreworCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtOworCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaCgic2hhMjU2IiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCURXQ19FUlJPUigiRmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciBzaGEyNTY6ICVsZCIsIFBUUl9FUlIodGZtKSk7CisJCXJldHVybiAwOworCX0KKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmZsYWdzID0gMDsKKworCXNnX2luaXRfb25lKCZzZywgbWVzc2FnZSwgbGVuKTsKKwljcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsICZzZywgbGVuLCBvdXQpOworCWNyeXB0b19mcmVlX2hhc2godGZtKTsKKworCXJldHVybiAxOworfQorCitpbnQgRFdDX0hNQUNfU0hBMjU2KHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IG1lc3NhZ2VsZW4sCisJCSAgICB1aW50OF90ICprZXksIHVpbnQzMl90IGtleWxlbiwgdWludDhfdCAqb3V0KQoreworCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtOworCXN0cnVjdCBoYXNoX2Rlc2MgZGVzYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7CisKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfaGFzaCgiaG1hYyhzaGEyNTYpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUih0Zm0pKSB7CisJCURXQ19FUlJPUigiRmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciBobWFjKHNoYTI1Nik6ICVsZCIsIFBUUl9FUlIodGZtKSk7CisJCXJldHVybiAwOworCX0KKwlkZXNjLnRmbSA9IHRmbTsKKwlkZXNjLmZsYWdzID0gMDsKKworCXNnX2luaXRfb25lKCZzZywgbWVzc2FnZSwgbWVzc2FnZWxlbik7CisJY3J5cHRvX2hhc2hfc2V0a2V5KHRmbSwga2V5LCBrZXlsZW4pOworCWNyeXB0b19oYXNoX2RpZ2VzdCgmZGVzYywgJnNnLCBtZXNzYWdlbGVuLCBvdXQpOworCWNyeXB0b19mcmVlX2hhc2godGZtKTsKKworCXJldHVybiAxOworfQorCisjZW5kaWYJLyogRFdDX0NSWVBUT0xJQiAqLworCisKKy8qIEJ5dGUgT3JkZXJpbmcgQ29udmVyc2lvbnMgKi8KKwordWludDMyX3QgRFdDX0NQVV9UT19MRTMyKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDMyX3QgRFdDX0NQVV9UT19CRTMyKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDMyX3QgRFdDX0xFMzJfVE9fQ1BVKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDMyX3QgRFdDX0JFMzJfVE9fQ1BVKHVpbnQzMl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCisJcmV0dXJuICh1X3BbM10gfCAodV9wWzJdIDw8IDgpIHwgKHVfcFsxXSA8PCAxNikgfCAodV9wWzBdIDw8IDI0KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0NQVV9UT19MRTE2KHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0NQVV9UT19CRTE2KHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0xFMTZfVE9fQ1BVKHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fTElUVExFX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKwordWludDE2X3QgRFdDX0JFMTZfVE9fQ1BVKHVpbnQxNl90ICpwKQoreworI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAqcDsKKyNlbHNlCisJdWludDhfdCAqdV9wID0gKHVpbnQ4X3QgKilwOworCXJldHVybiAodV9wWzFdIHwgKHVfcFswXSA8PCA4KSk7CisjZW5kaWYKK30KKworCisvKiBSZWdpc3RlcnMgKi8KKwordWludDMyX3QgRFdDX1JFQURfUkVHMzIodm9pZCAqaW9fY3R4LCB1aW50MzJfdCB2b2xhdGlsZSAqcmVnKQoreworCWR3Y19pb2N0eF90ICppbyA9IChkd2NfaW9jdHhfdCAqKWlvX2N0eDsKKwlidXNfc2l6ZV90IGlvciA9IChidXNfc2l6ZV90KXJlZzsKKworCXJldHVybiBidXNfc3BhY2VfcmVhZF80KGlvLT5pb3QsIGlvLT5pb2gsIGlvcik7Cit9CisKKyNpZiAwCit1aW50NjRfdCBEV0NfUkVBRF9SRUc2NCh2b2lkICppb19jdHgsIHVpbnQ2NF90IHZvbGF0aWxlICpyZWcpCit7CisJZHdjX2lvY3R4X3QgKmlvID0gKGR3Y19pb2N0eF90ICopaW9fY3R4OworCWJ1c19zaXplX3QgaW9yID0gKGJ1c19zaXplX3QpcmVnOworCisJcmV0dXJuIGJ1c19zcGFjZV9yZWFkXzgoaW8tPmlvdCwgaW8tPmlvaCwgaW9yKTsKK30KKyNlbmRpZgorCit2b2lkIERXQ19XUklURV9SRUczMih2b2lkICppb19jdHgsIHVpbnQzMl90IHZvbGF0aWxlICpyZWcsIHVpbnQzMl90IHZhbHVlKQoreworCWR3Y19pb2N0eF90ICppbyA9IChkd2NfaW9jdHhfdCAqKWlvX2N0eDsKKwlidXNfc2l6ZV90IGlvciA9IChidXNfc2l6ZV90KXJlZzsKKworCWJ1c19zcGFjZV93cml0ZV80KGlvLT5pb3QsIGlvLT5pb2gsIGlvciwgdmFsdWUpOworfQorCisjaWYgMAordm9pZCBEV0NfV1JJVEVfUkVHNjQodm9pZCAqaW9fY3R4LCB1aW50NjRfdCB2b2xhdGlsZSAqcmVnLCB1aW50NjRfdCB2YWx1ZSkKK3sKKwlkd2NfaW9jdHhfdCAqaW8gPSAoZHdjX2lvY3R4X3QgKilpb19jdHg7CisJYnVzX3NpemVfdCBpb3IgPSAoYnVzX3NpemVfdClyZWc7CisKKwlidXNfc3BhY2Vfd3JpdGVfOChpby0+aW90LCBpby0+aW9oLCBpb3IsIHZhbHVlKTsKK30KKyNlbmRpZgorCit2b2lkIERXQ19NT0RJRllfUkVHMzIodm9pZCAqaW9fY3R4LCB1aW50MzJfdCB2b2xhdGlsZSAqcmVnLCB1aW50MzJfdCBjbGVhcl9tYXNrLAorCQkgICAgICB1aW50MzJfdCBzZXRfbWFzaykKK3sKKwlkd2NfaW9jdHhfdCAqaW8gPSAoZHdjX2lvY3R4X3QgKilpb19jdHg7CisJYnVzX3NpemVfdCBpb3IgPSAoYnVzX3NpemVfdClyZWc7CisKKwlidXNfc3BhY2Vfd3JpdGVfNChpby0+aW90LCBpby0+aW9oLCBpb3IsCisJCQkgIChidXNfc3BhY2VfcmVhZF80KGlvLT5pb3QsIGlvLT5pb2gsIGlvcikgJgorCQkJICAgfmNsZWFyX21hc2spIHwgc2V0X21hc2spOworfQorCisjaWYgMAordm9pZCBEV0NfTU9ESUZZX1JFRzY0KHZvaWQgKmlvX2N0eCwgdWludDY0X3Qgdm9sYXRpbGUgKnJlZywgdWludDY0X3QgY2xlYXJfbWFzaywKKwkJICAgICAgdWludDY0X3Qgc2V0X21hc2spCit7CisJZHdjX2lvY3R4X3QgKmlvID0gKGR3Y19pb2N0eF90ICopaW9fY3R4OworCWJ1c19zaXplX3QgaW9yID0gKGJ1c19zaXplX3QpcmVnOworCisJYnVzX3NwYWNlX3dyaXRlXzgoaW8tPmlvdCwgaW8tPmlvaCwgaW9yLAorCQkJICAoYnVzX3NwYWNlX3JlYWRfOChpby0+aW90LCBpby0+aW9oLCBpb3IpICYKKwkJCSAgIH5jbGVhcl9tYXNrKSB8IHNldF9tYXNrKTsKK30KKyNlbmRpZgorCisKKy8qIExvY2tpbmcgKi8KKworZHdjX3NwaW5sb2NrX3QgKkRXQ19TUElOTE9DS19BTExPQyh2b2lkKQoreworCXN0cnVjdCBzaW1wbGVsb2NrICpzbCA9IERXQ19BTExPQyhzaXplb2YoKnNsKSk7CisKKwlpZiAoIXNsKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc3BpbmxvY2siKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2ltcGxlX2xvY2tfaW5pdChzbCk7CisJcmV0dXJuIChkd2Nfc3BpbmxvY2tfdCAqKXNsOworfQorCit2b2lkIERXQ19TUElOTE9DS19GUkVFKGR3Y19zcGlubG9ja190ICpsb2NrKQoreworCXN0cnVjdCBzaW1wbGVsb2NrICpzbCA9IChzdHJ1Y3Qgc2ltcGxlbG9jayAqKWxvY2s7CisKKwlEV0NfRlJFRShzbCk7Cit9CisKK3ZvaWQgRFdDX1NQSU5MT0NLKGR3Y19zcGlubG9ja190ICpsb2NrKQoreworCXNpbXBsZV9sb2NrKChzdHJ1Y3Qgc2ltcGxlbG9jayAqKWxvY2spOworfQorCit2b2lkIERXQ19TUElOVU5MT0NLKGR3Y19zcGlubG9ja190ICpsb2NrKQoreworCXNpbXBsZV91bmxvY2soKHN0cnVjdCBzaW1wbGVsb2NrICopbG9jayk7Cit9CisKK3ZvaWQgRFdDX1NQSU5MT0NLX0lSUVNBVkUoZHdjX3NwaW5sb2NrX3QgKmxvY2ssIGR3Y19pcnFmbGFnc190ICpmbGFncykKK3sKKwlzaW1wbGVfbG9jaygoc3RydWN0IHNpbXBsZWxvY2sgKilsb2NrKTsKKwkqZmxhZ3MgPSBzcGxiaW8oKTsKK30KKwordm9pZCBEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKGR3Y19zcGlubG9ja190ICpsb2NrLCBkd2NfaXJxZmxhZ3NfdCBmbGFncykKK3sKKwlzcGx4KGZsYWdzKTsKKwlzaW1wbGVfdW5sb2NrKChzdHJ1Y3Qgc2ltcGxlbG9jayAqKWxvY2spOworfQorCitkd2NfbXV0ZXhfdCAqRFdDX01VVEVYX0FMTE9DKHZvaWQpCit7CisJZHdjX211dGV4X3QgKm11dGV4ID0gRFdDX0FMTE9DKHNpemVvZihzdHJ1Y3QgbG9jaykpOworCisJaWYgKCFtdXRleCkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG11dGV4Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWxvY2tpbml0KChzdHJ1Y3QgbG9jayAqKW11dGV4LCAwLCAiZHczbXR4IiwgMCwgMCk7CisJcmV0dXJuIG11dGV4OworfQorCisjaWYgKGRlZmluZWQoRFdDX0xJTlVYKSAmJiBkZWZpbmVkKENPTkZJR19ERUJVR19NVVRFWEVTKSkKKyNlbHNlCit2b2lkIERXQ19NVVRFWF9GUkVFKGR3Y19tdXRleF90ICptdXRleCkKK3sKKwlEV0NfRlJFRShtdXRleCk7Cit9CisjZW5kaWYKKwordm9pZCBEV0NfTVVURVhfTE9DSyhkd2NfbXV0ZXhfdCAqbXV0ZXgpCit7CisJbG9ja21ncigoc3RydWN0IGxvY2sgKiltdXRleCwgTEtfRVhDTFVTSVZFLCBOVUxMKTsKK30KKworaW50IERXQ19NVVRFWF9UUllMT0NLKGR3Y19tdXRleF90ICptdXRleCkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gbG9ja21ncigoc3RydWN0IGxvY2sgKiltdXRleCwgTEtfRVhDTFVTSVZFIHwgTEtfTk9XQUlULCBOVUxMKTsKKwlyZXR1cm4gc3RhdHVzID09IDA7Cit9CisKK3ZvaWQgRFdDX01VVEVYX1VOTE9DSyhkd2NfbXV0ZXhfdCAqbXV0ZXgpCit7CisJbG9ja21ncigoc3RydWN0IGxvY2sgKiltdXRleCwgTEtfUkVMRUFTRSwgTlVMTCk7Cit9CisKKworLyogVGltaW5nICovCisKK3ZvaWQgRFdDX1VERUxBWSh1aW50MzJfdCB1c2VjcykKK3sKKwlERUxBWSh1c2Vjcyk7Cit9CisKK3ZvaWQgRFdDX01ERUxBWSh1aW50MzJfdCBtc2VjcykKK3sKKwlkbyB7CisJCURFTEFZKDEwMDApOworCX0gd2hpbGUgKC0tbXNlY3MpOworfQorCit2b2lkIERXQ19NU0xFRVAodWludDMyX3QgbXNlY3MpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwl0di50dl9zZWMgPSBtc2VjcyAvIDEwMDA7CisJdHYudHZfdXNlYyA9IChtc2VjcyAtIHR2LnR2X3NlYyAqIDEwMDApICogMTAwMDsKKwl0c2xlZXAoJnR2LCAwLCAiZHczc2xwIiwgdHZ0b2h6KCZ0dikpOworfQorCit1aW50MzJfdCBEV0NfVElNRSh2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJbWljcm91cHRpbWUoJnR2KTsJLy8gb3IgZ2V0bWljcm91cHRpbWU/IChsZXNzIHByZWNpc2UsIGJ1dCBmYXN0ZXIpCisJcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAgKyB0di50dl91c2VjIC8gMTAwMDsKK30KKworCisvKiBUaW1lcnMgKi8KKworc3RydWN0IGR3Y190aW1lciB7CisJc3RydWN0IGNhbGxvdXQgdDsKKwljaGFyICpuYW1lOworCWR3Y19zcGlubG9ja190ICpsb2NrOworCWR3Y190aW1lcl9jYWxsYmFja190IGNiOworCXZvaWQgKmRhdGE7Cit9OworCitkd2NfdGltZXJfdCAqRFdDX1RJTUVSX0FMTE9DKGNoYXIgKm5hbWUsIGR3Y190aW1lcl9jYWxsYmFja190IGNiLCB2b2lkICpkYXRhKQoreworCWR3Y190aW1lcl90ICp0ID0gRFdDX0FMTE9DKHNpemVvZigqdCkpOworCisJaWYgKCF0KSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGltZXIiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2FsbG91dF9pbml0KCZ0LT50KTsKKworCXQtPm5hbWUgPSBEV0NfU1RSRFVQKG5hbWUpOworCWlmICghdC0+bmFtZSkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRpbWVyLT5uYW1lIik7CisJCWdvdG8gbm9fbmFtZTsKKwl9CisKKwl0LT5sb2NrID0gRFdDX1NQSU5MT0NLX0FMTE9DKCk7CisJaWYgKCF0LT5sb2NrKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGltZXItPmxvY2siKTsKKwkJZ290byBub19sb2NrOworCX0KKworCXQtPmNiID0gY2I7CisJdC0+ZGF0YSA9IGRhdGE7CisKKwlyZXR1cm4gdDsKKworIG5vX2xvY2s6CisJRFdDX0ZSRUUodC0+bmFtZSk7Cisgbm9fbmFtZToKKwlEV0NfRlJFRSh0KTsKKworCXJldHVybiBOVUxMOworfQorCit2b2lkIERXQ19USU1FUl9GUkVFKGR3Y190aW1lcl90ICp0aW1lcikKK3sKKwljYWxsb3V0X3N0b3AoJnRpbWVyLT50KTsKKwlEV0NfU1BJTkxPQ0tfRlJFRSh0aW1lci0+bG9jayk7CisJRFdDX0ZSRUUodGltZXItPm5hbWUpOworCURXQ19GUkVFKHRpbWVyKTsKK30KKwordm9pZCBEV0NfVElNRVJfU0NIRURVTEUoZHdjX3RpbWVyX3QgKnRpbWVyLCB1aW50MzJfdCB0aW1lKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJdHYudHZfc2VjID0gdGltZSAvIDEwMDA7CisJdHYudHZfdXNlYyA9ICh0aW1lIC0gdHYudHZfc2VjICogMTAwMCkgKiAxMDAwOworCWNhbGxvdXRfcmVzZXQoJnRpbWVyLT50LCB0dnRvaHooJnR2KSwgdGltZXItPmNiLCB0aW1lci0+ZGF0YSk7Cit9CisKK3ZvaWQgRFdDX1RJTUVSX0NBTkNFTChkd2NfdGltZXJfdCAqdGltZXIpCit7CisJY2FsbG91dF9zdG9wKCZ0aW1lci0+dCk7Cit9CisKKworLyogV2FpdCBRdWV1ZXMgKi8KKworc3RydWN0IGR3Y193YWl0cSB7CisJc3RydWN0IHNpbXBsZWxvY2sgbG9jazsKKwlpbnQgYWJvcnQ7Cit9OworCitkd2Nfd2FpdHFfdCAqRFdDX1dBSVRRX0FMTE9DKHZvaWQpCit7CisJZHdjX3dhaXRxX3QgKndxID0gRFdDX0FMTE9DKHNpemVvZigqd3EpKTsKKworCWlmICghd3EpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB3YWl0cXVldWUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2ltcGxlX2xvY2tfaW5pdCgmd3EtPmxvY2spOworCXdxLT5hYm9ydCA9IDA7CisKKwlyZXR1cm4gd3E7Cit9CisKK3ZvaWQgRFdDX1dBSVRRX0ZSRUUoZHdjX3dhaXRxX3QgKndxKQoreworCURXQ19GUkVFKHdxKTsKK30KKworaW50MzJfdCBEV0NfV0FJVFFfV0FJVChkd2Nfd2FpdHFfdCAqd3EsIGR3Y193YWl0cV9jb25kaXRpb25fdCBjb25kLCB2b2lkICpkYXRhKQoreworCWludCBpcGw7CisJaW50IHJlc3VsdCA9IDA7CisKKwlzaW1wbGVfbG9jaygmd3EtPmxvY2spOworCWlwbCA9IHNwbGJpbygpOworCisJLyogU2tpcCB0aGUgc2xlZXAgaWYgYWxyZWFkeSBhYm9ydGVkIG9yIHRyaWdnZXJlZCAqLworCWlmICghd3EtPmFib3J0ICYmICFjb25kKGRhdGEpKSB7CisJCXNwbHgoaXBsKTsKKwkJcmVzdWx0ID0gbHRzbGVlcCh3cSwgUENBVENILCAiZHczd2F0IiwgMCwgJndxLT5sb2NrKTsgLy8gaW5maW5pdGUgdGltZW91dAorCQlpcGwgPSBzcGxiaW8oKTsKKwl9CisKKwlpZiAocmVzdWx0ID09IDApIHsJCQkvLyBhd29rZW4KKwkJaWYgKHdxLT5hYm9ydCkgeworCQkJd3EtPmFib3J0ID0gMDsKKwkJCXJlc3VsdCA9IC1EV0NfRV9BQk9SVDsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IDA7CisJCX0KKworCQlzcGx4KGlwbCk7CisJCXNpbXBsZV91bmxvY2soJndxLT5sb2NrKTsKKwl9IGVsc2UgeworCQl3cS0+YWJvcnQgPSAwOworCQlzcGx4KGlwbCk7CisJCXNpbXBsZV91bmxvY2soJndxLT5sb2NrKTsKKworCQlpZiAocmVzdWx0ID09IEVSRVNUQVJUKSB7CS8vIHNpZ25hbGVkIC0gcmVzdGFydAorCQkJcmVzdWx0ID0gLURXQ19FX1JFU1RBUlQ7CisJCX0gZWxzZSB7CQkJLy8gc2lnbmFsZWQgLSBtdXN0IGJlIEVJTlRSCisJCQlyZXN1bHQgPSAtRFdDX0VfQUJPUlQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQzMl90IERXQ19XQUlUUV9XQUlUX1RJTUVPVVQoZHdjX3dhaXRxX3QgKndxLCBkd2Nfd2FpdHFfY29uZGl0aW9uX3QgY29uZCwKKwkJCSAgICAgICB2b2lkICpkYXRhLCBpbnQzMl90IG1zZWNzKQoreworCXN0cnVjdCB0aW1ldmFsIHR2LCB0djEsIHR2MjsKKwlpbnQgaXBsOworCWludCByZXN1bHQgPSAwOworCisJdHYudHZfc2VjID0gbXNlY3MgLyAxMDAwOworCXR2LnR2X3VzZWMgPSAobXNlY3MgLSB0di50dl9zZWMgKiAxMDAwKSAqIDEwMDA7CisKKwlzaW1wbGVfbG9jaygmd3EtPmxvY2spOworCWlwbCA9IHNwbGJpbygpOworCisJLyogU2tpcCB0aGUgc2xlZXAgaWYgYWxyZWFkeSBhYm9ydGVkIG9yIHRyaWdnZXJlZCAqLworCWlmICghd3EtPmFib3J0ICYmICFjb25kKGRhdGEpKSB7CisJCXNwbHgoaXBsKTsKKwkJZ2V0bWljcm91cHRpbWUoJnR2MSk7CisJCXJlc3VsdCA9IGx0c2xlZXAod3EsIFBDQVRDSCwgImR3M3d0byIsIHR2dG9oeigmdHYpLCAmd3EtPmxvY2spOworCQlnZXRtaWNyb3VwdGltZSgmdHYyKTsKKwkJaXBsID0gc3BsYmlvKCk7CisJfQorCisJaWYgKHJlc3VsdCA9PSAwKSB7CQkJLy8gYXdva2VuCisJCWlmICh3cS0+YWJvcnQpIHsKKwkJCXdxLT5hYm9ydCA9IDA7CisJCQlzcGx4KGlwbCk7CisJCQlzaW1wbGVfdW5sb2NrKCZ3cS0+bG9jayk7CisJCQlyZXN1bHQgPSAtRFdDX0VfQUJPUlQ7CisJCX0gZWxzZSB7CisJCQlzcGx4KGlwbCk7CisJCQlzaW1wbGVfdW5sb2NrKCZ3cS0+bG9jayk7CisKKwkJCXR2Mi50dl91c2VjIC09IHR2MS50dl91c2VjOworCQkJaWYgKHR2Mi50dl91c2VjIDwgMCkgeworCQkJCXR2Mi50dl91c2VjICs9IDEwMDAwMDA7CisJCQkJdHYyLnR2X3NlYy0tOworCQkJfQorCisJCQl0djIudHZfc2VjIC09IHR2MS50dl9zZWM7CisJCQlyZXN1bHQgPSB0djIudHZfc2VjICogMTAwMCArIHR2Mi50dl91c2VjIC8gMTAwMDsKKwkJCXJlc3VsdCA9IG1zZWNzIC0gcmVzdWx0OworCQkJaWYgKHJlc3VsdCA8PSAwKQorCQkJCXJlc3VsdCA9IDE7CisJCX0KKwl9IGVsc2UgeworCQl3cS0+YWJvcnQgPSAwOworCQlzcGx4KGlwbCk7CisJCXNpbXBsZV91bmxvY2soJndxLT5sb2NrKTsKKworCQlpZiAocmVzdWx0ID09IEVSRVNUQVJUKSB7CS8vIHNpZ25hbGVkIC0gcmVzdGFydAorCQkJcmVzdWx0ID0gLURXQ19FX1JFU1RBUlQ7CisKKwkJfSBlbHNlIGlmIChyZXN1bHQgPT0gRUlOVFIpIHsJCS8vIHNpZ25hbGVkIC0gaW50ZXJydXB0CisJCQlyZXN1bHQgPSAtRFdDX0VfQUJPUlQ7CisKKwkJfSBlbHNlIHsJCQkJLy8gdGltZWQgb3V0CisJCQlyZXN1bHQgPSAtRFdDX0VfVElNRU9VVDsKKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRFdDX1dBSVRRX1RSSUdHRVIoZHdjX3dhaXRxX3QgKndxKQoreworCXdha2V1cCh3cSk7Cit9CisKK3ZvaWQgRFdDX1dBSVRRX0FCT1JUKGR3Y193YWl0cV90ICp3cSkKK3sKKwlpbnQgaXBsOworCisJc2ltcGxlX2xvY2soJndxLT5sb2NrKTsKKwlpcGwgPSBzcGxiaW8oKTsKKwl3cS0+YWJvcnQgPSAxOworCXdha2V1cCh3cSk7CisJc3BseChpcGwpOworCXNpbXBsZV91bmxvY2soJndxLT5sb2NrKTsKK30KKworCisvKiBUaHJlYWRpbmcgKi8KKworc3RydWN0IGR3Y190aHJlYWQgeworCXN0cnVjdCBwcm9jICpwcm9jOworCWludCBhYm9ydDsKK307CisKK2R3Y190aHJlYWRfdCAqRFdDX1RIUkVBRF9SVU4oZHdjX3RocmVhZF9mdW5jdGlvbl90IGZ1bmMsIGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldHZhbDsKKwlkd2NfdGhyZWFkX3QgKnRocmVhZCA9IERXQ19BTExPQyhzaXplb2YoKnRocmVhZCkpOworCisJaWYgKCF0aHJlYWQpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdGhyZWFkLT5hYm9ydCA9IDA7CisJcmV0dmFsID0ga3RocmVhZF9jcmVhdGUxKCh2b2lkICgqKSh2b2lkICopKWZ1bmMsIGRhdGEsICZ0aHJlYWQtPnByb2MsCisJCQkJICIlcyIsIG5hbWUpOworCWlmIChyZXR2YWwpIHsKKwkJRFdDX0ZSRUUodGhyZWFkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHRocmVhZDsKK30KKworaW50IERXQ19USFJFQURfU1RPUChkd2NfdGhyZWFkX3QgKnRocmVhZCkKK3sKKwlpbnQgcmV0dmFsOworCisJdGhyZWFkLT5hYm9ydCA9IDE7CisJcmV0dmFsID0gdHNsZWVwKCZ0aHJlYWQtPmFib3J0LCAwLCAiZHczc3RwIiwgNjAgKiBoeik7CisKKwlpZiAocmV0dmFsID09IDApIHsKKwkJLyogRFdDX1RIUkVBRF9FWElUKCkgd2lsbCBmcmVlIHRoZSB0aHJlYWQgc3RydWN0ICovCisJCXJldHVybiAwOworCX0KKworCS8qIE5PVEU6IFdlIGxlYWsgdGhlIHRocmVhZCBzdHJ1Y3QgaWYgdGhyZWFkIGRvZXNuJ3QgZGllICovCisKKwlpZiAocmV0dmFsID09IEVXT1VMREJMT0NLKSB7CisJCXJldHVybiAtRFdDX0VfVElNRU9VVDsKKwl9CisKKwlyZXR1cm4gLURXQ19FX1VOS05PV047Cit9CisKK2R3Y19ib29sX3QgRFdDX1RIUkVBRF9TSE9VTERfU1RPUChkd2NfdGhyZWFkX3QgKnRocmVhZCkKK3sKKwlyZXR1cm4gdGhyZWFkLT5hYm9ydDsKK30KKwordm9pZCBEV0NfVEhSRUFEX0VYSVQoZHdjX3RocmVhZF90ICp0aHJlYWQpCit7CisJd2FrZXVwKCZ0aHJlYWQtPmFib3J0KTsKKwlEV0NfRlJFRSh0aHJlYWQpOworCWt0aHJlYWRfZXhpdCgwKTsKK30KKworLyogdGFza2xldHMKKyAtIFJ1bnMgaW4gaW50ZXJydXB0IGNvbnRleHQgKGNhbm5vdCBzbGVlcCkKKyAtIEVhY2ggdGFza2xldCBydW5zIG9uIGEgc2luZ2xlIENQVQorIC0gRGlmZmVyZW50IHRhc2tsZXRzIGNhbiBiZSBydW5uaW5nIHNpbXVsdGFuZW91c2x5IG9uIGRpZmZlcmVudCBDUFVzCisgWyBPbiBOZXRCU0QgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBtZWNoYW5pc20sIGRyaXZlcnMgZG9uJ3QgaGF2ZSBib3R0b20tCisgICBoYWx2ZXMuIFNvIHdlIGp1c3QgY2FsbCB0aGUgY2FsbGJhY2sgZGlyZWN0bHkgZnJvbSBEV0NfVEFTS19TQ0hFRFVMRSgpIF0KKyAqLworc3RydWN0IGR3Y190YXNrbGV0IHsKKwlkd2NfdGFza2xldF9jYWxsYmFja190IGNiOworCXZvaWQgKmRhdGE7Cit9OworCitzdGF0aWMgdm9pZCB0YXNrbGV0X2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJZHdjX3Rhc2tsZXRfdCAqdGFzayA9IChkd2NfdGFza2xldF90ICopZGF0YTsKKworCXRhc2stPmNiKHRhc2stPmRhdGEpOworfQorCitkd2NfdGFza2xldF90ICpEV0NfVEFTS19BTExPQyhjaGFyICpuYW1lLCBkd2NfdGFza2xldF9jYWxsYmFja190IGNiLCB2b2lkICpkYXRhKQoreworCWR3Y190YXNrbGV0X3QgKnRhc2sgPSBEV0NfQUxMT0Moc2l6ZW9mKCp0YXNrKSk7CisKKwlpZiAodGFzaykgeworCQl0YXNrLT5jYiA9IGNiOworCQl0YXNrLT5kYXRhID0gZGF0YTsKKwl9IGVsc2UgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRhc2tsZXQiKTsKKwl9CisKKwlyZXR1cm4gdGFzazsKK30KKwordm9pZCBEV0NfVEFTS19GUkVFKGR3Y190YXNrbGV0X3QgKnRhc2spCit7CisJRFdDX0ZSRUUodGFzayk7Cit9CisKK3ZvaWQgRFdDX1RBU0tfU0NIRURVTEUoZHdjX3Rhc2tsZXRfdCAqdGFzaykKK3sKKwl0YXNrbGV0X2NhbGxiYWNrKHRhc2spOworfQorCisKKy8qIHdvcmtxdWV1ZXMKKyAtIFJ1bnMgaW4gcHJvY2VzcyBjb250ZXh0IChjYW4gc2xlZXApCisgKi8KK3R5cGVkZWYgc3RydWN0IHdvcmtfY29udGFpbmVyIHsKKwlkd2Nfd29ya19jYWxsYmFja190IGNiOworCXZvaWQgKmRhdGE7CisJZHdjX3dvcmtxX3QgKndxOworCWNoYXIgKm5hbWU7CisJaW50IGh6OworCXN0cnVjdCB3b3JrIHRhc2s7Cit9IHdvcmtfY29udGFpbmVyX3Q7CisKK3N0cnVjdCBkd2Nfd29ya3EgeworCXN0cnVjdCB3b3JrcXVldWUgKnRhc2txOworCWR3Y19zcGlubG9ja190ICpsb2NrOworCWR3Y193YWl0cV90ICp3YWl0cTsKKwlpbnQgcGVuZGluZzsKKwlzdHJ1Y3Qgd29ya19jb250YWluZXIgKmNvbnRhaW5lcjsKK307CisKK3N0YXRpYyB2b2lkIGRvX3dvcmsoc3RydWN0IHdvcmsgKnRhc2ssIHZvaWQgKmRhdGEpCit7CisJZHdjX3dvcmtxX3QgKndxID0gKGR3Y193b3JrcV90ICopZGF0YTsKKwl3b3JrX2NvbnRhaW5lcl90ICpjb250YWluZXIgPSB3cS0+Y29udGFpbmVyOworCWR3Y19pcnFmbGFnc190IGZsYWdzOworCisJaWYgKGNvbnRhaW5lci0+aHopIHsKKwkJdHNsZWVwKGNvbnRhaW5lciwgMCwgImR3M3dyayIsIGNvbnRhaW5lci0+aHopOworCX0KKworCWNvbnRhaW5lci0+Y2IoY29udGFpbmVyLT5kYXRhKTsKKwlEV0NfREVCVUcoIldvcmsgZG9uZTogJXMsIGNvbnRhaW5lcj0lcCIsIGNvbnRhaW5lci0+bmFtZSwgY29udGFpbmVyKTsKKworCURXQ19TUElOTE9DS19JUlFTQVZFKHdxLT5sb2NrLCAmZmxhZ3MpOworCWlmIChjb250YWluZXItPm5hbWUpCisJCURXQ19GUkVFKGNvbnRhaW5lci0+bmFtZSk7CisJRFdDX0ZSRUUoY29udGFpbmVyKTsKKwl3cS0+cGVuZGluZy0tOworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUod3EtPmxvY2ssIGZsYWdzKTsKKwlEV0NfV0FJVFFfVFJJR0dFUih3cS0+d2FpdHEpOworfQorCitzdGF0aWMgaW50IHdvcmtfZG9uZSh2b2lkICpkYXRhKQoreworCWR3Y193b3JrcV90ICp3b3JrcSA9IChkd2Nfd29ya3FfdCAqKWRhdGE7CisKKwlyZXR1cm4gd29ya3EtPnBlbmRpbmcgPT0gMDsKK30KKworaW50IERXQ19XT1JLUV9XQUlUX1dPUktfRE9ORShkd2Nfd29ya3FfdCAqd29ya3EsIGludCB0aW1lb3V0KQoreworCXJldHVybiBEV0NfV0FJVFFfV0FJVF9USU1FT1VUKHdvcmtxLT53YWl0cSwgd29ya19kb25lLCB3b3JrcSwgdGltZW91dCk7Cit9CisKK2R3Y193b3JrcV90ICpEV0NfV09SS1FfQUxMT0MoY2hhciAqbmFtZSkKK3sKKwlpbnQgcmVzdWx0OworCWR3Y193b3JrcV90ICp3cSA9IERXQ19BTExPQyhzaXplb2YoKndxKSk7CisKKwlpZiAoIXdxKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igd29ya3F1ZXVlIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJlc3VsdCA9IHdvcmtxdWV1ZV9jcmVhdGUoJndxLT50YXNrcSwgbmFtZSwgZG9fd29yaywgd3EsIDAgLypQV0FJVCovLAorCQkJCSAgSVBMX0JJTywgMCk7CisJaWYgKHJlc3VsdCkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBjcmVhdGUgd29ya3F1ZXVlIik7CisJCWdvdG8gbm9fdGFza3E7CisJfQorCisJd3EtPnBlbmRpbmcgPSAwOworCisJd3EtPmxvY2sgPSBEV0NfU1BJTkxPQ0tfQUxMT0MoKTsKKwlpZiAoIXdxLT5sb2NrKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc3BpbmxvY2siKTsKKwkJZ290byBub19sb2NrOworCX0KKworCXdxLT53YWl0cSA9IERXQ19XQUlUUV9BTExPQygpOworCWlmICghd3EtPndhaXRxKSB7CisJCURXQ19FUlJPUigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igd2FpdHF1ZXVlIik7CisJCWdvdG8gbm9fd2FpdHE7CisJfQorCisJcmV0dXJuIHdxOworCisgbm9fd2FpdHE6CisJRFdDX1NQSU5MT0NLX0ZSRUUod3EtPmxvY2spOworIG5vX2xvY2s6CisJd29ya3F1ZXVlX2Rlc3Ryb3kod3EtPnRhc2txKTsKKyBub190YXNrcToKKwlEV0NfRlJFRSh3cSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBEV0NfV09SS1FfRlJFRShkd2Nfd29ya3FfdCAqd3EpCit7CisjaWZkZWYgREVCVUcKKwlkd2NfaXJxZmxhZ3NfdCBmbGFnczsKKworCURXQ19TUElOTE9DS19JUlFTQVZFKHdxLT5sb2NrLCAmZmxhZ3MpOworCisJaWYgKHdxLT5wZW5kaW5nICE9IDApIHsKKwkJc3RydWN0IHdvcmtfY29udGFpbmVyICpjb250YWluZXIgPSB3cS0+Y29udGFpbmVyOworCisJCURXQ19FUlJPUigiRGVzdHJveWluZyB3b3JrIHF1ZXVlIHdpdGggcGVuZGluZyB3b3JrIik7CisKKwkJaWYgKGNvbnRhaW5lciAmJiBjb250YWluZXItPm5hbWUpIHsKKwkJCURXQ19FUlJPUigiV29yayAlcyBzdGlsbCBwZW5kaW5nIiwgY29udGFpbmVyLT5uYW1lKTsKKwkJfQorCX0KKworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUod3EtPmxvY2ssIGZsYWdzKTsKKyNlbmRpZgorCURXQ19XQUlUUV9GUkVFKHdxLT53YWl0cSk7CisJRFdDX1NQSU5MT0NLX0ZSRUUod3EtPmxvY2spOworCXdvcmtxdWV1ZV9kZXN0cm95KHdxLT50YXNrcSk7CisJRFdDX0ZSRUUod3EpOworfQorCit2b2lkIERXQ19XT1JLUV9TQ0hFRFVMRShkd2Nfd29ya3FfdCAqd3EsIGR3Y193b3JrX2NhbGxiYWNrX3QgY2IsIHZvaWQgKmRhdGEsCisJCQljaGFyICpmb3JtYXQsIC4uLikKK3sKKwlkd2NfaXJxZmxhZ3NfdCBmbGFnczsKKwl3b3JrX2NvbnRhaW5lcl90ICpjb250YWluZXI7CisJc3RhdGljIGNoYXIgbmFtZVsxMjhdOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJRFdDX1ZTTlBSSU5URihuYW1lLCAxMjgsIGZvcm1hdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJRFdDX1NQSU5MT0NLX0lSUVNBVkUod3EtPmxvY2ssICZmbGFncyk7CisJd3EtPnBlbmRpbmcrKzsKKwlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKHdxLT5sb2NrLCBmbGFncyk7CisJRFdDX1dBSVRRX1RSSUdHRVIod3EtPndhaXRxKTsKKworCWNvbnRhaW5lciA9IERXQ19BTExPQ19BVE9NSUMoc2l6ZW9mKCpjb250YWluZXIpKTsKKwlpZiAoIWNvbnRhaW5lcikgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRhaW5lciIpOworCQlyZXR1cm47CisJfQorCisJY29udGFpbmVyLT5uYW1lID0gRFdDX1NUUkRVUChuYW1lKTsKKwlpZiAoIWNvbnRhaW5lci0+bmFtZSkgeworCQlEV0NfRVJST1IoIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRhaW5lci0+bmFtZSIpOworCQlEV0NfRlJFRShjb250YWluZXIpOworCQlyZXR1cm47CisJfQorCisJY29udGFpbmVyLT5jYiA9IGNiOworCWNvbnRhaW5lci0+ZGF0YSA9IGRhdGE7CisJY29udGFpbmVyLT53cSA9IHdxOworCWNvbnRhaW5lci0+aHogPSAwOworCXdxLT5jb250YWluZXIgPSBjb250YWluZXI7CisKKwlEV0NfREVCVUcoIlF1ZXVlaW5nIHdvcms6ICVzLCBjb250YWluZXI9JXAiLCBjb250YWluZXItPm5hbWUsIGNvbnRhaW5lcik7CisJd29ya3F1ZXVlX2VucXVldWUod3EtPnRhc2txLCAmY29udGFpbmVyLT50YXNrKTsKK30KKwordm9pZCBEV0NfV09SS1FfU0NIRURVTEVfREVMQVlFRChkd2Nfd29ya3FfdCAqd3EsIGR3Y193b3JrX2NhbGxiYWNrX3QgY2IsCisJCQkJdm9pZCAqZGF0YSwgdWludDMyX3QgdGltZSwgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisJd29ya19jb250YWluZXJfdCAqY29udGFpbmVyOworCXN0YXRpYyBjaGFyIG5hbWVbMTI4XTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCURXQ19WU05QUklOVEYobmFtZSwgMTI4LCBmb3JtYXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCURXQ19TUElOTE9DS19JUlFTQVZFKHdxLT5sb2NrLCAmZmxhZ3MpOworCXdxLT5wZW5kaW5nKys7CisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRSh3cS0+bG9jaywgZmxhZ3MpOworCURXQ19XQUlUUV9UUklHR0VSKHdxLT53YWl0cSk7CisKKwljb250YWluZXIgPSBEV0NfQUxMT0NfQVRPTUlDKHNpemVvZigqY29udGFpbmVyKSk7CisJaWYgKCFjb250YWluZXIpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb250YWluZXIiKTsKKwkJcmV0dXJuOworCX0KKworCWNvbnRhaW5lci0+bmFtZSA9IERXQ19TVFJEVVAobmFtZSk7CisJaWYgKCFjb250YWluZXItPm5hbWUpIHsKKwkJRFdDX0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBjb250YWluZXItPm5hbWUiKTsKKwkJRFdDX0ZSRUUoY29udGFpbmVyKTsKKwkJcmV0dXJuOworCX0KKworCWNvbnRhaW5lci0+Y2IgPSBjYjsKKwljb250YWluZXItPmRhdGEgPSBkYXRhOworCWNvbnRhaW5lci0+d3EgPSB3cTsKKwl0di50dl9zZWMgPSB0aW1lIC8gMTAwMDsKKwl0di50dl91c2VjID0gKHRpbWUgLSB0di50dl9zZWMgKiAxMDAwKSAqIDEwMDA7CisJY29udGFpbmVyLT5oeiA9IHR2dG9oeigmdHYpOworCXdxLT5jb250YWluZXIgPSBjb250YWluZXI7CisKKwlEV0NfREVCVUcoIlF1ZXVlaW5nIHdvcms6ICVzLCBjb250YWluZXI9JXAiLCBjb250YWluZXItPm5hbWUsIGNvbnRhaW5lcik7CisJd29ya3F1ZXVlX2VucXVldWUod3EtPnRhc2txLCAmY29udGFpbmVyLT50YXNrKTsKK30KKworaW50IERXQ19XT1JLUV9QRU5ESU5HKGR3Y193b3JrcV90ICp3cSkKK3sKKwlyZXR1cm4gd3EtPnBlbmRpbmc7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19jcnlwdG8uYyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2NyeXB0by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMDM1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19jcnlwdG8uYwpAQCAtMCwwICsxLDMwOCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL2R3Y19jb21tb25fcG9ydF8yL2R3Y19jcnlwdG8uYyAkCisgKiAkUmV2aXNpb246ICM1ICQKKyAqICREYXRlOiAyMDEwLzA5LzI4ICQKKyAqICRDaGFuZ2U6IDE1OTYxODIgJAorICoKKyAqIFN5bm9wc3lzIFBvcnRhYmlsaXR5IExpYnJhcnkgU29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24KKyAqIChoZXJlaW5hZnRlciwgIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZgorICogU3lub3BzeXMsIEluYy4gdW5sZXNzIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcKKyAqIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogdW5kZXIgYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IKKyAqIExpY2Vuc2VkIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlCisgKiBwZXJtaXR0ZWQgdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeQorICogZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zCisgKiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLAorICogZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IgYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZAorICogaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbSBTeW5vcHN5cy4gSWYgeW91CisgKiBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIGJlbG93LCB0aGVuCisgKiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqIEBmaWxlCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIFdVU0IgY3J5cHRvZ3JhcGhpYyByb3V0aW5lcy4KKyAqLworCisjaWZkZWYgRFdDX0NSWVBUT0xJQgorCisjaW5jbHVkZSAiZHdjX2NyeXB0by5oIgorI2luY2x1ZGUgInVzYi5oIgorCisjaWZkZWYgREVCVUcKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX2J5dGVzKGNoYXIgKm5hbWUsIHVpbnQ4X3QgKmJ5dGVzLCBpbnQgbGVuKQoreworCWludCBpOworCURXQ19QUklOVEYoIiVzOiAiLCBuYW1lKTsKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykgeworCQlEV0NfUFJJTlRGKCIlMDJ4ICIsIGJ5dGVzW2ldKTsKKwl9CisJRFdDX1BSSU5URigiXG4iKTsKK30KKyNlbHNlCisjZGVmaW5lIGR1bXBfYnl0ZXMoeC4uLikKKyNlbmRpZgorCisvKiBEaXNwbGF5IGEgYmxvY2sgKi8KK3ZvaWQgc2hvd19ibG9jayhjb25zdCB1OCAqYmxrLCBjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnN1ZmZpeCwgaW50IGEpCit7CisjaWZkZWYgRFdDX0RFQlVHX0NSWVBUTworCWludCBpLCBibGtzaXplID0gMTY7CisKKwlEV0NfREVCVUcoIiVzIiwgcHJlZml4KTsKKworCWlmIChzdWZmaXggPT0gTlVMTCkgeworCQlzdWZmaXggPSAiXG4iOworCQlibGtzaXplID0gYTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxrc2l6ZTsgaSsrKQorCQlEV0NfUFJJTlQoIiUwMnglcyIsICpibGsrKywgKChpICYgMykgPT0gMykgPyAiICAiIDogIiAiKTsKKwlEV0NfUFJJTlQoc3VmZml4KTsKKyNlbmRpZgorfQorCisvKioKKyAqIEVuY3J5cHRzIGFuIGFycmF5IG9mIGJ5dGVzIHVzaW5nIHRoZSBBRVMgZW5jcnlwdGlvbiBlbmdpbmUuCisgKiBJZiA8Y29kZT5kc3Q8L2NvZGU+ID09IDxjb2RlPnNyYzwvY29kZT4sIHRoZW4gdGhlIGJ5dGVzIHdpbGwgYmUgZW5jcnlwdGVkCisgKiBpbi1wbGFjZS4KKyAqCisgKiBAcmV0dXJuICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZXJyb3IuCisgKi8KK2ludCBkd2Nfd3VzYl9hZXNfZW5jcnlwdCh1OCAqc3JjLCB1OCAqa2V5LCB1OCAqZHN0KQoreworCXU4IGJsb2NrX3RbMTZdOworCURXQ19NRU1TRVQoYmxvY2tfdCwgMCwgMTYpOworCisJcmV0dXJuIERXQ19BRVNfQ0JDKHNyYywgMTYsIGtleSwgMTYsIGJsb2NrX3QsIGRzdCk7Cit9CisKKy8qKgorICogVGhlIENDTS1NQUMtRlVOQ1RJT04gZGVzY3JpYmVkIGluIHNlY3Rpb24gNi41IG9mIHRoZSBXVVNCIHNwZWMuCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZGF0YSBzdHJpbmcgYW5kIHJldHVybnMgdGhlIGVuY3J5cHRlZCBDQkMKKyAqIENvdW50ZXItbW9kZSBNSUMuCisgKgorICogQHBhcmFtIGtleSAgICAgVGhlIDEyOC1iaXQgc3ltbWV0cmljIGtleS4KKyAqIEBwYXJhbSBub25jZSAgIFRoZSBDQ00gbm9uY2UuCisgKiBAcGFyYW0gbGFiZWwgICBUaGUgdW5pcXVlIDE0LWJ5dGUgQVNDSUkgdGV4dCBsYWJlbC4KKyAqIEBwYXJhbSBieXRlcyAgIFRoZSBieXRlIGFycmF5IHRvIGJlIGVuY3J5cHRlZC4KKyAqIEBwYXJhbSBsZW4gICAgIExlbmd0aCBvZiB0aGUgYnl0ZSBhcnJheS4KKyAqIEBwYXJhbSByZXN1bHQgIEJ5dGUgYXJyYXkgdG8gcmVjZWl2ZSB0aGUgOC1ieXRlIGVuY3J5cHRlZCBNSUMuCisgKi8KK3ZvaWQgZHdjX3d1c2JfY21mKHU4ICprZXksIHU4ICpub25jZSwKKwkJICBjaGFyICpsYWJlbCwgdTggKmJ5dGVzLCBpbnQgbGVuLCB1OCAqcmVzdWx0KQoreworCXU4IGJsb2NrX21bMTZdOworCXU4IGJsb2NrX3hbMTZdOworCXU4IGJsb2NrX3RbOF07CisJaW50IGlkeCwgYmxrTnVtOworCXUxNiBsYSA9ICh1MTYpKGxlbiArIDE0KTsKKworCS8qIFNldCB0aGUgQUVTLTEyOCBrZXkgKi8KKwkvL2R3Y19hZXNfc2V0a2V5KHRmbSwga2V5LCAxNik7CisKKwkvKiBGaWxsIGJsb2NrIEIwIGZyb20gZmxhZ3MgPSAweDU5LCBOLCBhbmQgbChtKSA9IDAgKi8KKwlibG9ja19tWzBdID0gMHg1OTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDEzOyBpZHgrKykKKwkJYmxvY2tfbVtpZHggKyAxXSA9IG5vbmNlW2lkeF07CisJYmxvY2tfbVsxNF0gPSAwOworCWJsb2NrX21bMTVdID0gMDsKKworCS8qIFByb2R1Y2UgdGhlIENCQyBJViAqLworCWR3Y193dXNiX2Flc19lbmNyeXB0KGJsb2NrX20sIGtleSwgYmxvY2tfeCk7CisJc2hvd19ibG9jayhibG9ja19tLCAiQ0JDIElWIGluOiAiLCAiXG4iLCAwKTsKKwlzaG93X2Jsb2NrKGJsb2NrX3gsICJDQkMgSVYgb3V0OiIsICJcbiIsIDApOworCisJLyogRmlsbCBibG9jayBCMSBmcm9tIGwoYSkgPSBCbGVuICsgMTQsIGFuZCBBICovCisJYmxvY2tfeFswXSBePSAodTgpKGxhID4+IDgpOworCWJsb2NrX3hbMV0gXj0gKHU4KWxhOworCWZvciAoaWR4ID0gMDsgaWR4IDwgMTQ7IGlkeCsrKQorCQlibG9ja194W2lkeCArIDJdIF49IGxhYmVsW2lkeF07CisJc2hvd19ibG9jayhibG9ja194LCAiQWZ0ZXIgeG9yOiAiLCAiYjFcbiIsIDE2KTsKKworCWR3Y193dXNiX2Flc19lbmNyeXB0KGJsb2NrX3gsIGtleSwgYmxvY2tfeCk7CisJc2hvd19ibG9jayhibG9ja194LCAiQWZ0ZXIgQUVTOiAiLCAiYjFcbiIsIDE2KTsKKworCWlkeCA9IDA7CisJYmxrTnVtID0gMDsKKworCS8qIEZpbGwgcmVtYWluaW5nIGJsb2NrcyB3aXRoIEIgKi8KKwl3aGlsZSAobGVuLS0gPiAwKSB7CisJCWJsb2NrX3hbaWR4XSBePSAqYnl0ZXMrKzsKKwkJaWYgKCsraWR4ID49IDE2KSB7CisJCQlpZHggPSAwOworCQkJc2hvd19ibG9jayhibG9ja194LCAiQWZ0ZXIgeG9yOiAiLCAiXG4iLCBibGtOdW0pOworCQkJZHdjX3d1c2JfYWVzX2VuY3J5cHQoYmxvY2tfeCwga2V5LCBibG9ja194KTsKKwkJCXNob3dfYmxvY2soYmxvY2tfeCwgIkFmdGVyIEFFUzogIiwgIlxuIiwgYmxrTnVtKTsKKwkJCWJsa051bSsrOworCQl9CisJfQorCisJLyogSGFuZGxlIHBhcnRpYWwgbGFzdCBibG9jayAqLworCWlmIChpZHggPiAwKSB7CisJCXNob3dfYmxvY2soYmxvY2tfeCwgIkFmdGVyIHhvcjogIiwgIlxuIiwgYmxrTnVtKTsKKwkJZHdjX3d1c2JfYWVzX2VuY3J5cHQoYmxvY2tfeCwga2V5LCBibG9ja194KTsKKwkJc2hvd19ibG9jayhibG9ja194LCAiQWZ0ZXIgQUVTOiAiLCAiXG4iLCBibGtOdW0pOworCX0KKworCS8qIFNhdmUgdGhlIE1JQyB0YWcgKi8KKwlEV0NfTUVNQ1BZKGJsb2NrX3QsIGJsb2NrX3gsIDgpOworCXNob3dfYmxvY2soYmxvY2tfdCwgIk1JQyB0YWcgIDogIiwgTlVMTCwgOCk7CisKKwkvKiBGaWxsIGJsb2NrIEEwIGZyb20gZmxhZ3MgPSAweDAxLCBOLCBhbmQgY291bnRlciA9IDAgKi8KKwlibG9ja19tWzBdID0gMHgwMTsKKwlibG9ja19tWzE0XSA9IDA7CisJYmxvY2tfbVsxNV0gPSAwOworCisJLyogRW5jcnlwdCB0aGUgY291bnRlciAqLworCWR3Y193dXNiX2Flc19lbmNyeXB0KGJsb2NrX20sIGtleSwgYmxvY2tfeCk7CisJc2hvd19ibG9jayhibG9ja194LCAiQ1RSW01JQ10gOiAiLCBOVUxMLCA4KTsKKworCS8qIFhPUiB3aXRoIE1JQyB0YWcgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDg7IGlkeCsrKSB7CisJCWJsb2NrX3RbaWR4XSBePSBibG9ja194W2lkeF07CisJfQorCisJLyogUmV0dXJuIHJlc3VsdCB0byBjYWxsZXIgKi8KKwlEV0NfTUVNQ1BZKHJlc3VsdCwgYmxvY2tfdCwgOCk7CisJc2hvd19ibG9jayhyZXN1bHQsICJDQ00tTUlDICA6ICIsIE5VTEwsIDgpOworCit9CisKKy8qKgorICogVGhlIFBSRiBmdW5jdGlvbiBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjUgb2YgdGhlIFdVU0Igc3BlYy4gVGhpcyBmdW5jdGlvbgorICogY29uY2F0ZW5hdGVzIE1JQyB2YWx1ZXMgcmV0dXJuZWQgZnJvbSBkd2NfY21mKCkgdG8gY3JlYXRlIGEgdmFsdWUgb2YKKyAqIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoLgorICoKKyAqIEBwYXJhbSBwcmZfbGVuICBMZW5ndGggb2YgdGhlIFBSRiBmdW5jdGlvbiBpbiBiaXRzICg2NCwgMTI4LCBvciAyNTYpLgorICogQHBhcmFtIGtleSwgbm9uY2UsIGxhYmVsLCBieXRlcywgbGVuICBTYW1lIGFzIGZvciBkd2NfY21mKCkuCisgKiBAcGFyYW0gcmVzdWx0ICAgQnl0ZSBhcnJheSB0byByZWNlaXZlIHRoZSByZXN1bHQuCisgKi8KK3ZvaWQgZHdjX3d1c2JfcHJmKGludCBwcmZfbGVuLCB1OCAqa2V5LAorCQkgIHU4ICpub25jZSwgY2hhciAqbGFiZWwsIHU4ICpieXRlcywgaW50IGxlbiwgdTggKnJlc3VsdCkKK3sKKwlpbnQgaTsKKworCW5vbmNlWzBdID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcHJmX2xlbiA+PiA2OyBpKyssIG5vbmNlWzBdKyspIHsKKwkJZHdjX3d1c2JfY21mKGtleSwgbm9uY2UsIGxhYmVsLCBieXRlcywgbGVuLCByZXN1bHQpOworCQlyZXN1bHQgKz0gODsKKwl9Cit9CisKKy8qKgorICogRmlsbHMgaW4gQ0NNIE5vbmNlIHBlciB0aGUgV1VTQiBzcGVjLgorICoKKyAqIEBwYXJhbVtpbl0gaGFkZHIgSG9zdCBhZGRyZXNzLgorICogQHBhcmFtW2luXSBkYWRkciBEZXZpY2UgYWRkcmVzcy4KKyAqIEBwYXJhbVtpbl0gdGtpZCBTZXNzaW9uIEtleShQVEspIGlkZW50aWZpZXIuCisgKiBAcGFyYW1bb3V0XSBub25jZSBQb2ludGVyIHRvIHdoZXJlIHRoZSBDQ00gTm9uY2Ugb3V0cHV0IGlzIHRvIGJlIHdyaXR0ZW4uCisgKi8KK3ZvaWQgZHdjX3d1c2JfZmlsbF9jY21fbm9uY2UodWludDE2X3QgaGFkZHIsIHVpbnQxNl90IGRhZGRyLCB1aW50OF90ICp0a2lkLAorCQkJICAgICB1aW50OF90ICpub25jZSkKK3sKKworCURXQ19ERUJVRygiJXMgJXggJXhcbiIsIF9fZnVuY19fLCBkYWRkciwgaGFkZHIpOworCisJRFdDX01FTVNFVCgmbm9uY2VbMF0sIDAsIDE2KTsKKworCURXQ19NRU1DUFkoJm5vbmNlWzZdLCB0a2lkLCAzKTsKKwlub25jZVs5XSA9IGRhZGRyICYgMHhGRjsKKwlub25jZVsxMF0gPSAoZGFkZHIgPj4gOCkgJiAweEZGOworCW5vbmNlWzExXSA9IGhhZGRyICYgMHhGRjsKKwlub25jZVsxMl0gPSAoaGFkZHIgPj4gOCkgJiAweEZGOworCisJZHVtcF9ieXRlcygiQ0NNIG5vbmNlIiwgbm9uY2UsIDE2KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgYSAxNi1ieXRlIGNyeXB0b2dyYXBoaWMtZ3JhZGUgcmFuZG9tIG51bWJlciBmb3IgdGhlIEhvc3QvRGV2aWNlCisgKiBOb25jZS4KKyAqLwordm9pZCBkd2Nfd3VzYl9nZW5fbm9uY2UodWludDE2X3QgYWRkciwgdWludDhfdCAqbm9uY2UpCit7CisJdWludDhfdCBpbm9uY2VbMTZdOworCXVpbnQzMl90IHRlbXBbNF07CisKKwkvKiBGaWxsIGluIHRoZSBOb25jZSAqLworCURXQ19NRU1TRVQoJmlub25jZVswXSwgMCwgc2l6ZW9mKGlub25jZSkpOworCWlub25jZVs5XSA9IGFkZHIgJiAweEZGOworCWlub25jZVsxMF0gPSAoYWRkciA+PiA4KSAmIDB4RkY7CisJaW5vbmNlWzExXSA9IGlub25jZVs5XTsKKwlpbm9uY2VbMTJdID0gaW5vbmNlWzEwXTsKKworCS8qIENvbGxlY3QgInJhbmRvbW5lc3Mgc2FtcGxlcyIgKi8KKwlEV0NfUkFORE9NX0JZVEVTKCh1aW50OF90ICopdGVtcCwgMTYpOworCisJZHdjX3d1c2JfcHJmXzEyOCgodWludDhfdCAqKXRlbXAsIG5vbmNlLAorCQkJICJSYW5kb20gTnVtYmVycyIsICh1aW50OF90ICopdGVtcCwgc2l6ZW9mKHRlbXApLAorCQkJIG5vbmNlKTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIFNlc3Npb24gS2V5IChQVEspIGFuZCBLZXkgQ29uZmlybWF0aW9uIEtleSAoS0NLKSBwZXIgdGhlCisgKiBXVVNCIHNwZWMuCisgKgorICogQHBhcmFtW2luXSBjY21fbm9uY2UgUG9pbnRlciB0byBDQ00gTm9uY2UuCisgKiBAcGFyYW1baW5dIG1rIE1hc3RlciBLZXkgdG8gZGVyaXZlIHRoZSBzZXNzaW9uIGZyb20KKyAqIEBwYXJhbVtpbl0gaG5vbmNlIFBvaW50ZXIgdG8gSG9zdCBOb25jZS4KKyAqIEBwYXJhbVtpbl0gZG5vbmNlIFBvaW50ZXIgdG8gRGV2aWNlIE5vbmNlLgorICogQHBhcmFtW291dF0ga2NrIFBvaW50ZXIgdG8gd2hlcmUgdGhlIEtDSyBvdXRwdXQgaXMgdG8gYmUgd3JpdHRlbi4KKyAqIEBwYXJhbVtvdXRdIHB0ayBQb2ludGVyIHRvIHdoZXJlIHRoZSBQVEsgb3V0cHV0IGlzIHRvIGJlIHdyaXR0ZW4uCisgKi8KK3ZvaWQgZHdjX3d1c2JfZ2VuX2tleSh1aW50OF90ICpjY21fbm9uY2UsIHVpbnQ4X3QgKm1rLCB1aW50OF90ICpobm9uY2UsCisJCSAgICAgIHVpbnQ4X3QgKmRub25jZSwgdWludDhfdCAqa2NrLCB1aW50OF90ICpwdGspCit7CisJdWludDhfdCBpZGF0YVszMl07CisJdWludDhfdCBvZGF0YVszMl07CisKKwlkdW1wX2J5dGVzKCJjayIsIG1rLCAxNik7CisJZHVtcF9ieXRlcygiaG5vbmNlIiwgaG5vbmNlLCAxNik7CisJZHVtcF9ieXRlcygiZG5vbmNlIiwgZG5vbmNlLCAxNik7CisKKwkvKiBUaGUgZGF0YSBpcyB0aGUgSE5vbmNlIGFuZCBETm9uY2UgY29uY2F0ZW5hdGVkICovCisJRFdDX01FTUNQWSgmaWRhdGFbMF0sIGhub25jZSwgMTYpOworCURXQ19NRU1DUFkoJmlkYXRhWzE2XSwgZG5vbmNlLCAxNik7CisKKwlkd2Nfd3VzYl9wcmZfMjU2KG1rLCBjY21fbm9uY2UsICJQYWlyLXdpc2Uga2V5cyIsIGlkYXRhLCAzMiwgb2RhdGEpOworCisJLyogTG93IDE2IGJ5dGVzIG9mIHRoZSByZXN1bHQgaXMgdGhlIEtDSywgaGlnaCAxNiBpcyB0aGUgUFRLICovCisJRFdDX01FTUNQWShrY2ssICZvZGF0YVswXSwgMTYpOworCURXQ19NRU1DUFkocHRrLCAmb2RhdGFbMTZdLCAxNik7CisKKwlkdW1wX2J5dGVzKCJrY2siLCBrY2ssIDE2KTsKKwlkdW1wX2J5dGVzKCJwdGsiLCBwdGssIDE2KTsKK30KKworLyoqCisgKiBHZW5lcmF0ZXMgdGhlIE1lc3NhZ2UgSW50ZWdyaXR5IENvZGUgb3ZlciB0aGUgSGFuZHNoYWtlIGRhdGEgcGVyIHRoZQorICogV1VTQiBzcGVjLgorICoKKyAqIEBwYXJhbSBjY21fbm9uY2UgUG9pbnRlciB0byBDQ00gTm9uY2UuCisgKiBAcGFyYW0ga2NrICAgUG9pbnRlciB0byBLZXkgQ29uZmlybWF0aW9uIEtleS4KKyAqIEBwYXJhbSBkYXRhICBQb2ludGVyIHRvIEhhbmRzaGFrZSBkYXRhIHRvIGJlIGNoZWNrZWQuCisgKiBAcGFyYW0gbWljICAgUG9pbnRlciB0byB3aGVyZSB0aGUgTUlDIG91dHB1dCBpcyB0byBiZSB3cml0dGVuLgorICovCit2b2lkIGR3Y193dXNiX2dlbl9taWModWludDhfdCAqY2NtX25vbmNlLCB1aW50OF90ICprY2ssCisJCSAgICAgIHVpbnQ4X3QgKmRhdGEsIHVpbnQ4X3QgKm1pYykKK3sKKworCWR3Y193dXNiX3ByZl82NChrY2ssIGNjbV9ub25jZSwgIm91dC1vZi1iYW5kTUlDIiwKKwkJCWRhdGEsIFdVU0JfSEFORFNIQUtFX0xFTl9GT1JfTUlDLCBtaWMpOworfQorCisjZW5kaWYJLyogRFdDX0NSWVBUT0xJQiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfY3J5cHRvLmggYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmZjZGRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfY3J5cHRvLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9kd2NfY29tbW9uX3BvcnRfMi9kd2NfY3J5cHRvLmggJAorICogJFJldmlzaW9uOiAjMyAkCisgKiAkRGF0ZTogMjAxMC8wOS8yOCAkCisgKiAkQ2hhbmdlOiAxNTk2MTgyICQKKyAqCisgKiBTeW5vcHN5cyBQb3J0YWJpbGl0eSBMaWJyYXJ5IFNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uCisgKiAoaGVyZWluYWZ0ZXIsICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YKKyAqIFN5bm9wc3lzLCBJbmMuIHVubGVzcyBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nCisgKiBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgKgorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHVuZGVyIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yCisgKiBMaWNlbnNlZCBQcm9kdWN0IHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZQorICogcGVybWl0dGVkIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucworICogb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcyBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwKKyAqIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQKKyAqIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20gU3lub3BzeXMuIElmIHlvdQorICogZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBiZWxvdywgdGhlbgorICogeW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIKKyAqIEJBU0lTIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgX0RXQ19DUllQVE9fSF8KKyNkZWZpbmUgX0RXQ19DUllQVE9fSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiogQGZpbGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciB0aGUgV1VTQiBDcnlwdG9ncmFwaGljIHJvdXRpbmVzIGFzCisgKiBkZWZpbmVkIGluIHRoZSBXVVNCIHNwZWMuICBUaGV5IGFyZSBvbmx5IHRvIGJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgRFdDIFVXQgorICogbW9kdWxlcy4KKyAqLworCisjaW5jbHVkZSAiZHdjX29zLmgiCisKK2ludCBkd2Nfd3VzYl9hZXNfZW5jcnlwdCh1OCAqc3JjLCB1OCAqa2V5LCB1OCAqZHN0KTsKKwordm9pZCBkd2Nfd3VzYl9jbWYodTggKmtleSwgdTggKm5vbmNlLAorCQkgIGNoYXIgKmxhYmVsLCB1OCAqYnl0ZXMsIGludCBsZW4sIHU4ICpyZXN1bHQpOwordm9pZCBkd2Nfd3VzYl9wcmYoaW50IHByZl9sZW4sIHU4ICprZXksCisJCSAgdTggKm5vbmNlLCBjaGFyICpsYWJlbCwgdTggKmJ5dGVzLCBpbnQgbGVuLCB1OCAqcmVzdWx0KTsKKworLyoqCisgKiBUaGUgUFJGLTY0IGZ1bmN0aW9uIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDYuNSBvZiB0aGUgV1VTQiBzcGVjLgorICoKKyAqIEBwYXJhbSBrZXksIG5vbmNlLCBsYWJlbCwgYnl0ZXMsIGxlbiwgcmVzdWx0ICBTYW1lIGFzIGZvciBkd2NfcHJmKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkd2Nfd3VzYl9wcmZfNjQodTggKmtleSwgdTggKm5vbmNlLAorCQkJCSAgIGNoYXIgKmxhYmVsLCB1OCAqYnl0ZXMsIGludCBsZW4sIHU4ICpyZXN1bHQpCit7CisJZHdjX3d1c2JfcHJmKDY0LCBrZXksIG5vbmNlLCBsYWJlbCwgYnl0ZXMsIGxlbiwgcmVzdWx0KTsKK30KKworLyoqCisgKiBUaGUgUFJGLTEyOCBmdW5jdGlvbiBkZXNjcmliZWQgaW4gc2VjdGlvbiA2LjUgb2YgdGhlIFdVU0Igc3BlYy4KKyAqCisgKiBAcGFyYW0ga2V5LCBub25jZSwgbGFiZWwsIGJ5dGVzLCBsZW4sIHJlc3VsdCAgU2FtZSBhcyBmb3IgZHdjX3ByZigpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZHdjX3d1c2JfcHJmXzEyOCh1OCAqa2V5LCB1OCAqbm9uY2UsCisJCQkJICAgIGNoYXIgKmxhYmVsLCB1OCAqYnl0ZXMsIGludCBsZW4sIHU4ICpyZXN1bHQpCit7CisJZHdjX3d1c2JfcHJmKDEyOCwga2V5LCBub25jZSwgbGFiZWwsIGJ5dGVzLCBsZW4sIHJlc3VsdCk7Cit9CisKKy8qKgorICogVGhlIFBSRi0yNTYgZnVuY3Rpb24gZGVzY3JpYmVkIGluIHNlY3Rpb24gNi41IG9mIHRoZSBXVVNCIHNwZWMuCisgKgorICogQHBhcmFtIGtleSwgbm9uY2UsIGxhYmVsLCBieXRlcywgbGVuLCByZXN1bHQgIFNhbWUgYXMgZm9yIGR3Y19wcmYoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGR3Y193dXNiX3ByZl8yNTYodTggKmtleSwgdTggKm5vbmNlLAorCQkJCSAgICBjaGFyICpsYWJlbCwgdTggKmJ5dGVzLCBpbnQgbGVuLCB1OCAqcmVzdWx0KQoreworCWR3Y193dXNiX3ByZigyNTYsIGtleSwgbm9uY2UsIGxhYmVsLCBieXRlcywgbGVuLCByZXN1bHQpOworfQorCisKK3ZvaWQgZHdjX3d1c2JfZmlsbF9jY21fbm9uY2UodWludDE2X3QgaGFkZHIsIHVpbnQxNl90IGRhZGRyLCB1aW50OF90ICp0a2lkLAorCQkJICAgICAgIHVpbnQ4X3QgKm5vbmNlKTsKK3ZvaWQgZHdjX3d1c2JfZ2VuX25vbmNlKHVpbnQxNl90IGFkZHIsCisJCQkgIHVpbnQ4X3QgKm5vbmNlKTsKKwordm9pZCBkd2Nfd3VzYl9nZW5fa2V5KHVpbnQ4X3QgKmNjbV9ub25jZSwgdWludDhfdCAqbWssCisJCQl1aW50OF90ICpobm9uY2UsIHVpbnQ4X3QgKmRub25jZSwKKwkJCXVpbnQ4X3QgKmtjaywgdWludDhfdCAqcHRrKTsKKworCit2b2lkIGR3Y193dXNiX2dlbl9taWModWludDhfdCAqY2NtX25vbmNlLCB1aW50OF90CisJCQkqa2NrLCB1aW50OF90ICpkYXRhLCB1aW50OF90ICptaWMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0RXQ19DUllQVE9fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX2RoLmMgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19kaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5N2Y3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19kaC5jCkBAIC0wLDAgKzEsMjkxIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAkRmlsZTogLy9kd2gvdXNiX2lpcC9kZXYvc29mdHdhcmUvZHdjX2NvbW1vbl9wb3J0XzIvZHdjX2RoLmMgJAorICogJFJldmlzaW9uOiAjMyAkCisgKiAkRGF0ZTogMjAxMC8wOS8yOCAkCisgKiAkQ2hhbmdlOiAxNTk2MTgyICQKKyAqCisgKiBTeW5vcHN5cyBQb3J0YWJpbGl0eSBMaWJyYXJ5IFNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uCisgKiAoaGVyZWluYWZ0ZXIsICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YKKyAqIFN5bm9wc3lzLCBJbmMuIHVubGVzcyBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nCisgKiBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgKgorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHVuZGVyIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yCisgKiBMaWNlbnNlZCBQcm9kdWN0IHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZQorICogcGVybWl0dGVkIHRvIHVzZSBhbmQgcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucworICogb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcyBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwKKyAqIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQKKyAqIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20gU3lub3BzeXMuIElmIHlvdQorICogZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBiZWxvdywgdGhlbgorICogeW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIKKyAqIEJBU0lTIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisgKiBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWZkZWYgRFdDX0NSWVBUT0xJQgorCisjaWZuZGVmIENPTkZJR19NQUNIX0lQTUFURQorCisjaW5jbHVkZSAiZHdjX2RoLmgiCisjaW5jbHVkZSAiZHdjX21vZHBvdy5oIgorCisjaWZkZWYgREVCVUcKKy8qIFRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCBhIGJ1ZmZlciBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgQXNzb2NpYXRpb24KKyAqIE1vZGVsIHNwZWNpZmljYXRpb24uICovCitzdGF0aWMgdm9pZCBkaF9kdW1wKGNoYXIgKnN0ciwgdm9pZCAqX251bSwgaW50IGxlbikKK3sKKwl1aW50OF90ICpudW0gPSBfbnVtOworCWludCBpOworCURXQ19QUklOVEYoIiVzXG4iLCBzdHIpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKyspIHsKKwkJRFdDX1BSSU5URigiJTAyeCIsIG51bVtpXSk7CisJCWlmICgoKGkgKyAxKSAlIDIpID09IDApIERXQ19QUklOVEYoIiAiKTsKKwkJaWYgKCgoaSArIDEpICUgMjYpID09IDApIERXQ19QUklOVEYoIlxuIik7CisJfQorCisJRFdDX1BSSU5URigiXG4iKTsKK30KKyNlbHNlCisjZGVmaW5lIGRoX2R1bXAoX3guLi4pIGRvIHs7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisvKiBDb25zdGFudCBnIHZhbHVlICovCitzdGF0aWMgX191MzIgZGhfZ1tdID0geworCTB4MDIwMDAwMDAsCit9OworCisvKiBDb25zdGFudCBwIHZhbHVlICovCitzdGF0aWMgX191MzIgZGhfcFtdID0geworCTB4RkZGRkZGRkYsIDB4RkZGRkZGRkYsIDB4QTJEQTBGQzksIDB4MzRDMjY4MjEsIDB4OEI2MkM2QzQsIDB4RDExQ0RDODAsIDB4MDg0RTAyMjksIDB4NzRDQzY3OEEsCisJMHhBNkJFMEIwMiwgMHgyMjlCMTMzQiwgMHg3OTA4NEE1MSwgMHhERDA0MzQ4RSwgMHhCMzE5OTVFRiwgMHgxQjQzM0FDRCwgMHg2RDBBMkIzMCwgMHgzNzE0NUZGMiwKKwkweDZEMzVFMTRGLCAweDQ1QzI1MTZELCAweDc2QjU4NUU0LCAweEM2N0U1RTYyLCAweEU5NDI0Q0Y0LCAweDZCRUQzN0E2LCAweEI2NUNGRjBCLCAweEVEQjcwNkY0LAorCTB4RkI2QjM4RUUsIDB4QTU5Rjg5NUEsIDB4MTEyNDlGQUUsIDB4RTYxRjRCN0MsIDB4NTE2NjI4NDksIDB4M0Q1QkU0RUMsIDB4Qjg3QzAwQzIsIDB4MDVCRjYzQTEsCisJMHgzNjQ4REE5OCwgMHg5QUQzNTUxQywgMHhBODNGMTY2OSwgMHg1RkNGMjRGRCwgMHgyMzVENjU4MywgMHg5NkFEQTNEQywgMHg1NkYzNjIxQywgMHhCQjUyODUyMCwKKwkweDA3MjlENTlFLCAweDZEOTY5NjcwLCAweDRFMzUwQzY3LCAweDA0OThCQzRBLCAweDA4NkM3NEYxLCAweDdDMjExOENBLCAweDQ2NUU5MDMyLCAweDNCQ0UzNjJFLAorCTB4MkM3NzlFRTMsIDB4MDM4NjBFMTgsIDB4QTI4MzI3OUIsIDB4OEZBMjA3RUMsIDB4RjA1REM1QjUsIDB4Qzk1MjRDNkYsIDB4RjZDQjJCREUsIDB4MTgxNzU4OTUsCisJMHg3QzQ5OTUzOSwgMHhFNTZBOTVFQSwgMHgxODI2RDIxNSwgMHgxMDA1RkE5OCwgMHg1QThFNzIxNSwgMHgyREM0QUE4QSwgMHgwRDE3MzNBRCwgMHgzMzdBNTAwNCwKKwkweEFCMjE1NUE4LCAweDY0QkExQ0RGLCAweDA0ODVGQkVDLCAweDBBRUZEQjU4LCAweDU3NzFFQThBLCAweDdEMEMwNjVELCAweDg1MEY5N0IzLCAweEM3RTRFMUE2LAorCTB4OENBRUY1QUIsIDB4RDczMzA5REIsIDB4RTA5NDhDMUUsIDB4OUQ2MTI1NEEsIDB4MjZEMkUzQ0UsIDB4NkJFRUQyMUEsIDB4MDZGQTJGRjEsIDB4NjQwODhBRDksCisJMHg3MzAyNzZEOCwgMHg2NDZBQzgzRSwgMHgxODJCMUY1MiwgMHgwQzIwN0IxNywgMHg1NzE3RTFCQiwgMHg2QzVENjE3QSwgMHhDMDg4MDk3NywgMHhFMjQ2RDlCQSwKKwkweEEwNEZFMjA4LCAweDMxQUJFNTc0LCAweEZDNUJEQjQzLCAweDhFMTBGREUwLCAweDIwRDE4MjRCLCAweENBRDIzQUE5LCAweEZGRkZGRkZGLCAweEZGRkZGRkZGLAorfTsKKworc3RhdGljIHZvaWQgZGhfc3dhcF9ieXRlcyh2b2lkICpfaW4sIHZvaWQgKl9vdXQsIHVpbnQzMl90IGxlbikKK3sKKwl1aW50OF90ICppbiA9IF9pbjsKKwl1aW50OF90ICpvdXQgPSBfb3V0OworCWludCBpOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJCW91dFtpXSA9IGluW2xlbi0xLWldOworCX0KK30KKworLyogQ29tcHV0ZXMgdGhlIG1vZHVsYXIgZXhwb25lbnRpYXRpb24gKG51bV5leHAgJSBtb2QpLiAgbnVtLCBleHAsIGFuZCBtb2QgYXJlCisgKiBiaWcgZW5kaWFuIG51bWJlcnMgb2Ygc2l6ZSBsZW4sIGluIGJ5dGVzLiAgRWFjaCBsZW4gdmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlCisgKiBvZiA0LiAqLworaW50IGR3Y19kaF9tb2Rwb3codm9pZCAqbWVtX2N0eCwgdm9pZCAqbnVtLCB1aW50MzJfdCBudW1fbGVuLAorCQkgIHZvaWQgKmV4cCwgdWludDMyX3QgZXhwX2xlbiwKKwkJICB2b2lkICptb2QsIHVpbnQzMl90IG1vZF9sZW4sCisJCSAgdm9pZCAqb3V0KQoreworCS8qIG1vZHBvdygpIHRha2VzIGxpdHRsZSBlbmRpYW4gbnVtYmVycy4gIEFNIHVzZXMgYmlnLWVuZGlhbi4gIFRoaXMKKwkgKiBmdW5jdGlvbiBzd2FwcyBieXRlcyBvZiBudW1iZXJzIGJlZm9yZSBwYXNzaW5nIG9udG8gbW9kcG93LiAqLworCisJaW50IHJldHZhbCA9IDA7CisJdWludDMyX3QgKnJlc3VsdDsKKworCXVpbnQzMl90ICpiaWdudW1fbnVtID0gZHdjX2FsbG9jKG1lbV9jdHgsIG51bV9sZW4gKyA0KTsKKwl1aW50MzJfdCAqYmlnbnVtX2V4cCA9IGR3Y19hbGxvYyhtZW1fY3R4LCBleHBfbGVuICsgNCk7CisJdWludDMyX3QgKmJpZ251bV9tb2QgPSBkd2NfYWxsb2MobWVtX2N0eCwgbW9kX2xlbiArIDQpOworCisJZGhfc3dhcF9ieXRlcyhudW0sICZiaWdudW1fbnVtWzFdLCBudW1fbGVuKTsKKwliaWdudW1fbnVtWzBdID0gbnVtX2xlbiAvIDQ7CisKKwlkaF9zd2FwX2J5dGVzKGV4cCwgJmJpZ251bV9leHBbMV0sIGV4cF9sZW4pOworCWJpZ251bV9leHBbMF0gPSBleHBfbGVuIC8gNDsKKworCWRoX3N3YXBfYnl0ZXMobW9kLCAmYmlnbnVtX21vZFsxXSwgbW9kX2xlbik7CisJYmlnbnVtX21vZFswXSA9IG1vZF9sZW4gLyA0OworCisJcmVzdWx0ID0gZHdjX21vZHBvdyhtZW1fY3R4LCBiaWdudW1fbnVtLCBiaWdudW1fZXhwLCBiaWdudW1fbW9kKTsKKwlpZiAoIXJlc3VsdCkgeworCQlyZXR2YWwgPSAtMTsKKwkJZ290byBkaF9tb2Rwb3dfbm9tZW07CisJfQorCisJZGhfc3dhcF9ieXRlcygmcmVzdWx0WzFdLCBvdXQsIHJlc3VsdFswXSAqIDQpOworCWR3Y19mcmVlKG1lbV9jdHgsIHJlc3VsdCk7CisKKyBkaF9tb2Rwb3dfbm9tZW06CisJZHdjX2ZyZWUobWVtX2N0eCwgYmlnbnVtX251bSk7CisJZHdjX2ZyZWUobWVtX2N0eCwgYmlnbnVtX2V4cCk7CisJZHdjX2ZyZWUobWVtX2N0eCwgYmlnbnVtX21vZCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworCitpbnQgZHdjX2RoX3BrKHZvaWQgKm1lbV9jdHgsIHVpbnQ4X3QgbmQsIHVpbnQ4X3QgKmV4cCwgdWludDhfdCAqcGssIHVpbnQ4X3QgKmhhc2gpCit7CisJaW50IHJldHZhbDsKKwl1aW50OF90IG0zWzM4NV07CisKKyNpZm5kZWYgREhfVEVTVF9WRUNUT1JTCisJRFdDX1JBTkRPTV9CWVRFUyhleHAsIDMyKTsKKyNlbmRpZgorCisJLyogQ29tcHV0ZSB0aGUgcGtkICovCisJaWYgKChyZXR2YWwgPSBkd2NfZGhfbW9kcG93KG1lbV9jdHgsIGRoX2csIDQsCisJCQkJICAgIGV4cCwgMzIsCisJCQkJICAgIGRoX3AsIDM4NCwgcGspKSkgeworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCW0zWzM4NF0gPSBuZDsKKwlEV0NfTUVNQ1BZKCZtM1swXSwgcGssIDM4NCk7CisJRFdDX1NIQTI1NihtMywgMzg1LCBoYXNoKTsKKworIAlkaF9kdW1wKCJQSyIsIHBrLCAzODQpOworIAlkaF9kdW1wKCJTSEEtMjU2KE0zKSIsIGhhc2gsIDMyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGR3Y19kaF9kZXJpdmVfa2V5cyh2b2lkICptZW1fY3R4LCB1aW50OF90IG5kLCB1aW50OF90ICpwa2gsIHVpbnQ4X3QgKnBrZCwKKwkJICAgICAgIHVpbnQ4X3QgKmV4cCwgaW50IGlzX2hvc3QsCisJCSAgICAgICBjaGFyICpkZCwgdWludDhfdCAqY2ssIHVpbnQ4X3QgKmtkaykKK3sKKwlpbnQgcmV0dmFsOworCXVpbnQ4X3QgbXZbNzg0XTsKKwl1aW50OF90IHNoYV9yZXN1bHRbMzJdOworCXVpbnQ4X3QgZGhrZXlbMzg0XTsKKwl1aW50OF90IHNoYXJlZF9zZWNyZXRbMzg0XTsKKwljaGFyICptZXNzYWdlOworCXVpbnQzMl90IHZkOworCisJdWludDhfdCAqcGs7CisKKwlpZiAoaXNfaG9zdCkgeworCQlwayA9IHBrZDsKKwl9CisJZWxzZSB7CisJCXBrID0gcGtoOworCX0KKworCWlmICgocmV0dmFsID0gZHdjX2RoX21vZHBvdyhtZW1fY3R4LCBwaywgMzg0LAorCQkJCSAgICBleHAsIDMyLAorCQkJCSAgICBkaF9wLCAzODQsIHNoYXJlZF9zZWNyZXQpKSkgeworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlkaF9kdW1wKCJTaGFyZWQgU2VjcmV0Iiwgc2hhcmVkX3NlY3JldCwgMzg0KTsKKworCURXQ19TSEEyNTYoc2hhcmVkX3NlY3JldCwgMzg0LCBkaGtleSk7CisJZGhfZHVtcCgiREhLRVkiLCBkaGtleSwgMzg0KTsKKworCURXQ19NRU1DUFkoJm12WzBdLCBwa2QsIDM4NCk7CisJRFdDX01FTUNQWSgmbXZbMzg0XSwgcGtoLCAzODQpOworCURXQ19NRU1DUFkoJm12Wzc2OF0sICJkaXNwbGF5ZWQgZGlnZXN0IiwgMTYpOworCWRoX2R1bXAoIk1WIiwgbXYsIDc4NCk7CisKKwlEV0NfU0hBMjU2KG12LCA3ODQsIHNoYV9yZXN1bHQpOworCWRoX2R1bXAoIlNIQS0yNTYoTVYpIiwgc2hhX3Jlc3VsdCwgMzIpOworCWRoX2R1bXAoIkZpcnN0IDMyLWJpdHMgb2YgU0hBLTI1NihNVikiLCBzaGFfcmVzdWx0LCA0KTsKKworCWRoX3N3YXBfYnl0ZXMoc2hhX3Jlc3VsdCwgJnZkLCA0KTsKKyNpZmRlZiBERUJVRworCURXQ19QUklOVEYoIlZkIChkZWNpbWFsKSA9ICVkXG4iLCB2ZCk7CisjZW5kaWYKKworCXN3aXRjaCAobmQpIHsKKwljYXNlIDI6CisJCXZkID0gdmQgJSAxMDA7CisJCURXQ19TUFJJTlRGKGRkLCAiJTAyZCIsIHZkKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl2ZCA9IHZkICUgMTAwMDsKKwkJRFdDX1NQUklOVEYoZGQsICIlMDNkIiwgdmQpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXZkID0gdmQgJSAxMDAwMDsKKwkJRFdDX1NQUklOVEYoZGQsICIlMDRkIiwgdmQpOworCQlicmVhazsKKwl9CisjaWZkZWYgREVCVUcKKwlEV0NfUFJJTlRGKCJEaXNwbGF5IERpZ2l0czogJXNcbiIsIGRkKTsKKyNlbmRpZgorCisJbWVzc2FnZSA9ICJjb25uZWN0aW9uIGtleSI7CisJRFdDX0hNQUNfU0hBMjU2KG1lc3NhZ2UsIERXQ19TVFJMRU4obWVzc2FnZSksIGRoa2V5LCAzMiwgc2hhX3Jlc3VsdCk7CisgCWRoX2R1bXAoIkhNQUMoU0hBLTI1NiwgREhLZXksIGNvbm5lY3Rpb24ga2V5KSIsIHNoYV9yZXN1bHQsIDMyKTsKKwlEV0NfTUVNQ1BZKGNrLCBzaGFfcmVzdWx0LCAxNik7CisKKwltZXNzYWdlID0gImtleSBkZXJpdmF0aW9uIGtleSI7CisJRFdDX0hNQUNfU0hBMjU2KG1lc3NhZ2UsIERXQ19TVFJMRU4obWVzc2FnZSksIGRoa2V5LCAzMiwgc2hhX3Jlc3VsdCk7CisgCWRoX2R1bXAoIkhNQUMoU0hBLTI1NiwgREhLZXksIGtleSBkZXJpdmF0aW9uIGtleSkiLCBzaGFfcmVzdWx0LCAzMik7CisJRFdDX01FTUNQWShrZGssIHNoYV9yZXN1bHQsIDMyKTsKKworCXJldHVybiAwOworfQorCisKKyNpZmRlZiBESF9URVNUX1ZFQ1RPUlMKKworc3RhdGljIF9fdTggZGhfYVtdID0geworCTB4NDQsIDB4MDAsIDB4NTEsIDB4ZDYsCisJMHhmMCwgMHhiNSwgMHg1ZSwgMHhhOSwKKwkweDY3LCAweGFiLCAweDMxLCAweGM2LAorCTB4OGEsIDB4OGIsIDB4NWUsIDB4MzcsCisJMHhkOSwgMHgxMCwgMHhkYSwgMHhlMCwKKwkweGUyLCAweGQ0LCAweDU5LCAweGE0LAorCTB4ODYsIDB4NDUsIDB4OWMsIDB4YWEsCisJMHhkZiwgMHgzNiwgMHg3NSwgMHgxNiwKK307CisKK3N0YXRpYyBfX3U4IGRoX2JbXSA9IHsKKwkweDVkLCAweGFlLCAweGM3LCAweDg2LAorCTB4NzksIDB4ODAsIDB4YTMsIDB4MjQsCisJMHg4YywgMHhlMywgMHg1NywgMHg4ZiwKKwkweGM3LCAweDVmLCAweDFiLCAweDBmLAorCTB4MmQsIDB4ZjgsIDB4OWQsIDB4MzAsCisJMHg2ZiwgMHhhNCwgMHg1MiwgMHhjZCwKKwkweGUwLCAweDdhLCAweDA0LCAweDhhLAorCTB4ZGUsIDB4ZDksIDB4MjYsIDB4NTYsCit9OworCit2b2lkIGR3Y19ydW5fZGhfdGVzdF92ZWN0b3JzKHZvaWQgKm1lbV9jdHgpCit7CisJdWludDhfdCBwa2RbMzg0XTsKKwl1aW50OF90IHBraFszODRdOworCXVpbnQ4X3QgaGFzaGRbMzJdOworCXVpbnQ4X3QgaGFzaGhbMzJdOworCXVpbnQ4X3QgY2tbMTZdOworCXVpbnQ4X3Qga2RrWzMyXTsKKwljaGFyIGRkWzVdOworCisJRFdDX1BSSU5URigiXG5cblxuREhfVEVTVF9WRUNUT1JTXG5cbiIpOworCisJLyogY29tcHV0ZSB0aGUgUEtkIGFuZCBTSEEtMjU2KFBLZCB8fCBOZCkgKi8KKwlEV0NfUFJJTlRGKCJDb21wdXRpbmcgUEtkXG4iKTsKKwlkd2NfZGhfcGsobWVtX2N0eCwgMiwgZGhfYSwgcGtkLCBoYXNoZCk7CisKKwkvKiBjb21wdXRlIHRoZSBQS2QgYW5kIFNIQS0yNTYoUEtoIHx8IE5kKSAqLworCURXQ19QUklOVEYoIkNvbXB1dGluZyBQS2hcbiIpOworCWR3Y19kaF9wayhtZW1fY3R4LCAyLCBkaF9iLCBwa2gsIGhhc2hoKTsKKworCS8qIGNvbXB1dGUgdGhlIGRoa2V5ICovCisJZHdjX2RoX2Rlcml2ZV9rZXlzKG1lbV9jdHgsIDIsIHBraCwgcGtkLCBkaF9hLCAwLCBkZCwgY2ssIGtkayk7Cit9CisjZW5kaWYgLyogREhfVEVTVF9WRUNUT1JTICovCisKKyNlbmRpZiAvKiAhQ09ORklHX01BQ0hfSVBNQVRFICovCisKKyNlbmRpZiAvKiBEV0NfQ1JZUFRPTElCICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19kaC5oIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfZGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWMxY2MwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfZGguaApAQCAtMCwwICsxLDEwNiBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL2R3Y19jb21tb25fcG9ydF8yL2R3Y19kaC5oICQKKyAqICRSZXZpc2lvbjogIzQgJAorICogJERhdGU6IDIwMTAvMDkvMjggJAorICogJENoYW5nZTogMTU5NjE4MiAkCisgKgorICogU3lub3BzeXMgUG9ydGFiaWxpdHkgTGlicmFyeSBTb2Z0d2FyZSBhbmQgZG9jdW1lbnRhdGlvbgorICogKGhlcmVpbmFmdGVyLCAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mCisgKiBTeW5vcHN5cywgSW5jLiB1bmxlc3Mgb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZworICogYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB1bmRlciBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvcgorICogTGljZW5zZWQgUHJvZHVjdCB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUKKyAqIHBlcm1pdHRlZCB0byB1c2UgYW5kIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5CisgKiBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMKKyAqIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMgbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsCisgKiBkaXNjbG9zZSwgY29weSBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSBvciBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkCisgKiBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tIFN5bm9wc3lzLiBJZiB5b3UKKyAqIGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIgYmVsb3csIHRoZW4KKyAqIHlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiCisgKiBCQVNJUyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTAorICogU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorICogVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBfRFdDX0RIX0hfCisjZGVmaW5lIF9EV0NfREhfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAiZHdjX29zLmgiCisKKy8qKiBAZmlsZQorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjb21tb24gZnVuY3Rpb25zIG9uIGRldmljZSBhbmQgaG9zdCBmb3IgcGVyZm9ybWluZworICogbnVtZXJpYyBhc3NvY2lhdGlvbiBhcyBkZWZpbmVkIGluIHRoZSBXVVNCIHNwZWMuICBUaGV5IGFyZSBvbmx5IHRvIGJlCisgKiB1c2VkIGludGVybmFsbHkgYnkgdGhlIERXQyBVV0IgbW9kdWxlcy4gKi8KKworZXh0ZXJuIGludCBkd2NfZGhfc2hhMjU2KHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IGxlbiwgdWludDhfdCAqb3V0KTsKK2V4dGVybiBpbnQgZHdjX2RoX2htYWNfc2hhMjU2KHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IG1lc3NhZ2VsZW4sCisJCQkgICAgICB1aW50OF90ICprZXksIHVpbnQzMl90IGtleWxlbiwKKwkJCSAgICAgIHVpbnQ4X3QgKm91dCk7CitleHRlcm4gaW50IGR3Y19kaF9tb2Rwb3codm9pZCAqbWVtX2N0eCwgdm9pZCAqbnVtLCB1aW50MzJfdCBudW1fbGVuLAorCQkJIHZvaWQgKmV4cCwgdWludDMyX3QgZXhwX2xlbiwKKwkJCSB2b2lkICptb2QsIHVpbnQzMl90IG1vZF9sZW4sCisJCQkgdm9pZCAqb3V0KTsKKworLyoqIENvbXB1dGVzIFBLRCBvciBQS0gsIGFuZCBTSEEtMjU2KFBLZCB8fCBOZCkKKyAqCisgKiBQSyA9IGdeZXhwIG1vZCBwLgorICoKKyAqIElucHV0OgorICogTmQgPSBOdW1iZXIgb2YgZGlnaXRzIG9uIHRoZSBkZXZpY2UuCisgKgorICogT3V0cHV0OgorICogZXhwID0gQSAzMi1ieXRlIGJ1ZmZlciB0byBiZSBmaWxsZWQgd2l0aCBhIHJhbmRvbWx5IGdlbmVyYXRlZCBudW1iZXIuCisgKiAgICAgICB1c2VkIGFzIGVpdGhlciBBIG9yIEIuCisgKiBwayA9IEEgMzg0LWJ5dGUgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBQS0ggb3IgUEtELgorICogaGFzaCA9IEEgMzItYnl0ZSBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggU0hBLTI1NihQSyB8fCBORCkuCisgKi8KK2V4dGVybiBpbnQgZHdjX2RoX3BrKHZvaWQgKm1lbV9jdHgsIHVpbnQ4X3QgbmQsIHVpbnQ4X3QgKmV4cCwgdWludDhfdCAqcGtkLCB1aW50OF90ICpoYXNoKTsKKworLyoqIENvbXB1dGVzIHRoZSBESEtFWSwgYW5kIFZELgorICoKKyAqIElmIGNhbGxlZCBmcm9tIGhvc3QsIHRoZW4gaXQgd2lsbCBjb21wdXQgREhLRVk9UEtEXmV4cCAlIHAuCisgKiBJZiBjYWxsZWQgZnJvbSBkZXZpY2UsIHRoZW4gaXQgd2lsbCBjb21wdXQgREhLRVk9UEtIXmV4cCAlIHAuCisgKgorICogSW5wdXQ6CisgKiBwa2QgPSBUaGUgUEtEIHZhbHVlLgorICogcGtoID0gVGhlIFBLSCB2YWx1ZS4KKyAqIGV4cCA9IFRoZSBBIHZhbHVlIChpZiBkZXZpY2UpIG9yIEIgdmFsdWUgKGlmIGhvc3QpIGdlbmVyYXRlZCBpbiBkd2Nfd3VkZXZfZGhfcGsuCisgKiBpc19ob3N0ID0gU2V0IHRvIG5vbiB6ZXJvIGlmIGEgV1VTQiBob3N0IGlzIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBPdXRwdXQ6CisKKyAqIGRkID0gQSBwb2ludGVyIHRvIGFuIGJ1ZmZlciB0byBiZSBzZXQgdG8gdGhlIGRpc3BsYXllZCBkaWdpdHMgc3RyaW5nIHRvIGJlIHNob3duCisgKiAgICAgIHRvIHRoZSB1c2VyLiAgVGhpcyBidWZmZXIgc2hvdWxkIGJlIGF0IDUgYnl0ZXMgbG9uZyB0byBob2xkIDQgZGlnaXRzIHBsdXMgYQorICogICAgICBudWxsIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gIFRoaXMgYnVmZmVyIGNhbiBiZSB1c2VkIGRpcmVjdGx5IGZvciBkaXNwbGF5LgorICogY2sgPSBBIDE2LWJ5dGUgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIHRoZSBDSy4KKyAqIGtkayA9IEEgMzItYnl0ZSBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggdGhlIEtESy4KKyAqLworZXh0ZXJuIGludCBkd2NfZGhfZGVyaXZlX2tleXModm9pZCAqbWVtX2N0eCwgdWludDhfdCBuZCwgdWludDhfdCAqcGtoLCB1aW50OF90ICpwa2QsCisJCQkgICAgICB1aW50OF90ICpleHAsIGludCBpc19ob3N0LAorCQkJICAgICAgY2hhciAqZGQsIHVpbnQ4X3QgKmNrLCB1aW50OF90ICprZGspOworCisjaWZkZWYgREhfVEVTVF9WRUNUT1JTCitleHRlcm4gdm9pZCBkd2NfcnVuX2RoX3Rlc3RfdmVjdG9ycyh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0RXQ19ESF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfbGlzdC5oIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Y2MzMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19saXN0LmgKQEAgLTAsMCArMSw1OTQgQEAKKy8qCSRPcGVuQlNEOiBxdWV1ZS5oLHYgMS4yNiAyMDA0LzA1LzA0IDE2OjU5OjMyIGdyYW5nZSBFeHAgJAkqLworLyoJJE5ldEJTRDogcXVldWUuaCx2IDEuMTEgMTk5Ni8wNS8xNiAwNToxNzoxNCBteWNyb2Z0IEV4cCAkCSovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpcXVldWUuaAk4LjUgKEJlcmtlbGV5KSA4LzIwLzk0CisgKi8KKworI2lmbmRlZiBfRFdDX0xJU1RfSF8KKyNkZWZpbmUgX0RXQ19MSVNUX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEBmaWxlCisgKgorICogVGhpcyBmaWxlIGRlZmluZXMgbGlua2VkIGxpc3Qgb3BlcmF0aW9ucy4gIEl0IGlzIGRlcml2ZWQgZnJvbSBCU0Qgd2l0aAorICogb25seSB0aGUgTUFDUk8gbmFtZXMgYmVpbmcgcHJlZml4ZWQgd2l0aCBEV0NfLiAgVGhpcyBpcyBiZWNhdXNlIGEgZmV3IG9mCisgKiB0aGVzZSBuYW1lcyBjb25mbGljdCB3aXRoIHRob3NlIG9uIExpbnV4LiAgRm9yIGRvY3VtZW50YXRpb24gb24gdXNlLCBzZWUgdGhlCisgKiBpbmxpbmUgY29tbWVudHMgaW4gdGhlIHNvdXJjZSBjb2RlLiAgVGhlIG9yaWdpbmFsIGxpY2Vuc2UgZm9yIHRoaXMgc291cmNlCisgKiBjb2RlIGFwcGxpZXMgYW5kIGlzIHByZXNlcnZlZCBpbiB0aGUgZHdjX2xpc3QuaCBzb3VyY2UgZmlsZS4KKyAqLworCisvKgorICogVGhpcyBmaWxlIGRlZmluZXMgZml2ZSB0eXBlcyBvZiBkYXRhIHN0cnVjdHVyZXM6IHNpbmdseS1saW5rZWQgbGlzdHMsCisgKiBsaXN0cywgc2ltcGxlIHF1ZXVlcywgdGFpbCBxdWV1ZXMsIGFuZCBjaXJjdWxhciBxdWV1ZXMuCisgKgorICoKKyAqIEEgc2luZ2x5LWxpbmtlZCBsaXN0IGlzIGhlYWRlZCBieSBhIHNpbmdsZSBmb3J3YXJkIHBvaW50ZXIuIFRoZSBlbGVtZW50cworICogYXJlIHNpbmdseSBsaW5rZWQgZm9yIG1pbmltdW0gc3BhY2UgYW5kIHBvaW50ZXIgbWFuaXB1bGF0aW9uIG92ZXJoZWFkIGF0CisgKiB0aGUgZXhwZW5zZSBvZiBPKG4pIHJlbW92YWwgZm9yIGFyYml0cmFyeSBlbGVtZW50cy4gTmV3IGVsZW1lbnRzIGNhbiBiZQorICogYWRkZWQgdG8gdGhlIGxpc3QgYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCBvciBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAqIEVsZW1lbnRzIGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbGlzdCBzaG91bGQgdXNlIHRoZSBleHBsaWNpdAorICogbWFjcm8gZm9yIHRoaXMgcHVycG9zZSBmb3Igb3B0aW11bSBlZmZpY2llbmN5LiBBIHNpbmdseS1saW5rZWQgbGlzdCBtYXkKKyAqIG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4gIFNpbmdseS1saW5rZWQgbGlzdHMgYXJlIGlkZWFsCisgKiBmb3IgYXBwbGljYXRpb25zIHdpdGggbGFyZ2UgZGF0YXNldHMgYW5kIGZldyBvciBubyByZW1vdmFscyBvciBmb3IKKyAqIGltcGxlbWVudGluZyBhIExJRk8gcXVldWUuCisgKgorICogQSBsaXN0IGlzIGhlYWRlZCBieSBhIHNpbmdsZSBmb3J3YXJkIHBvaW50ZXIgKG9yIGFuIGFycmF5IG9mIGZvcndhcmQKKyAqIHBvaW50ZXJzIGZvciBhIGhhc2ggdGFibGUgaGVhZGVyKS4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkgbGlua2VkCisgKiBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUKKyAqIG9yIGFmdGVyIGFuIGV4aXN0aW5nIGVsZW1lbnQgb3IgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuIEEgbGlzdAorICogbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqCisgKiBBIHNpbXBsZSBxdWV1ZSBpcyBoZWFkZWQgYnkgYSBwYWlyIG9mIHBvaW50ZXJzLCBvbmUgdGhlIGhlYWQgb2YgdGhlCisgKiBsaXN0IGFuZCB0aGUgb3RoZXIgdG8gdGhlIHRhaWwgb2YgdGhlIGxpc3QuIFRoZSBlbGVtZW50cyBhcmUgc2luZ2x5CisgKiBsaW5rZWQgdG8gc2F2ZSBzcGFjZSwgc28gZWxlbWVudHMgY2FuIG9ubHkgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICogaGVhZCBvZiB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IgYWZ0ZXIKKyAqIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mIHRoZQorICogbGlzdC4gQSBzaW1wbGUgcXVldWUgbWF5IG9ubHkgYmUgdHJhdmVyc2VkIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbi4KKyAqCisgKiBBIHRhaWwgcXVldWUgaXMgaGVhZGVkIGJ5IGEgcGFpciBvZiBwb2ludGVycywgb25lIHRvIHRoZSBoZWFkIG9mIHRoZQorICogbGlzdCBhbmQgdGhlIG90aGVyIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0LiBUaGUgZWxlbWVudHMgYXJlIGRvdWJseQorICogbGlua2VkIHNvIHRoYXQgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBhIG5lZWQgdG8KKyAqIHRyYXZlcnNlIHRoZSBsaXN0LiBOZXcgZWxlbWVudHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBsaXN0IGJlZm9yZSBvcgorICogYWZ0ZXIgYW4gZXhpc3RpbmcgZWxlbWVudCwgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIG9yIGF0IHRoZSBlbmQgb2YKKyAqIHRoZSBsaXN0LiBBIHRhaWwgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLgorICoKKyAqIEEgY2lyY2xlIHF1ZXVlIGlzIGhlYWRlZCBieSBhIHBhaXIgb2YgcG9pbnRlcnMsIG9uZSB0byB0aGUgaGVhZCBvZiB0aGUKKyAqIGxpc3QgYW5kIHRoZSBvdGhlciB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdC4gVGhlIGVsZW1lbnRzIGFyZSBkb3VibHkKKyAqIGxpbmtlZCBzbyB0aGF0IGFuIGFyYml0cmFyeSBlbGVtZW50IGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYSBuZWVkIHRvCisgKiB0cmF2ZXJzZSB0aGUgbGlzdC4gTmV3IGVsZW1lbnRzIGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCBiZWZvcmUgb3IgYWZ0ZXIKKyAqIGFuIGV4aXN0aW5nIGVsZW1lbnQsIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBvciBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICogQSBjaXJjbGUgcXVldWUgbWF5IGJlIHRyYXZlcnNlZCBpbiBlaXRoZXIgZGlyZWN0aW9uLCBidXQgaGFzIGEgbW9yZQorICogY29tcGxleCBlbmQgb2YgbGlzdCBkZXRlY3Rpb24uCisgKgorICogRm9yIGRldGFpbHMgb24gdGhlIHVzZSBvZiB0aGVzZSBtYWNyb3MsIHNlZSB0aGUgcXVldWUoMykgbWFudWFsIHBhZ2UuCisgKi8KKworLyoKKyAqIERvdWJsZS1saW5rZWQgTGlzdC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBkd2NfbGlzdF9saW5rIHsKKwlzdHJ1Y3QgZHdjX2xpc3RfbGluayAqbmV4dDsKKwlzdHJ1Y3QgZHdjX2xpc3RfbGluayAqcHJldjsKK30gZHdjX2xpc3RfbGlua190OworCisjZGVmaW5lIERXQ19MSVNUX0lOSVQobGluaykgZG8gewlcCisJKGxpbmspLT5uZXh0ID0gKGxpbmspOwkJXAorCShsaW5rKS0+cHJldiA9IChsaW5rKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX0xJU1RfRklSU1QobGluaykJKChsaW5rKS0+bmV4dCkKKyNkZWZpbmUgRFdDX0xJU1RfTEFTVChsaW5rKQkoKGxpbmspLT5wcmV2KQorI2RlZmluZSBEV0NfTElTVF9FTkQobGluaykJKGxpbmspCisjZGVmaW5lIERXQ19MSVNUX05FWFQobGluaykJKChsaW5rKS0+bmV4dCkKKyNkZWZpbmUgRFdDX0xJU1RfUFJFVihsaW5rKQkoKGxpbmspLT5wcmV2KQorI2RlZmluZSBEV0NfTElTVF9FTVBUWShsaW5rKQlcCisJKERXQ19MSVNUX0ZJUlNUKGxpbmspID09IERXQ19MSVNUX0VORChsaW5rKSkKKyNkZWZpbmUgRFdDX0xJU1RfRU5UUlkobGluaywgdHlwZSwgZmllbGQpCQkJXAorCSh0eXBlICopKCh1aW50OF90ICopKGxpbmspIC0gKHNpemVfdCkoJigodHlwZSAqKTApLT5maWVsZCkpCisKKyNpZiAwCisjZGVmaW5lIERXQ19MSVNUX0lOU0VSVF9IRUFEKGxpc3QsIGxpbmspIGRvIHsJCQlcCisJKGxpbmspLT5uZXh0ID0gKGxpc3QpLT5uZXh0OwkJCQlcCisJKGxpbmspLT5wcmV2ID0gKGxpc3QpOwkJCQkJXAorCShsaXN0KS0+bmV4dC0+cHJldiA9IChsaW5rKTsJCQkJXAorCShsaXN0KS0+bmV4dCA9IChsaW5rKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX0xJU1RfSU5TRVJUX1RBSUwobGlzdCwgbGluaykgZG8gewkJCVwKKwkobGluayktPm5leHQgPSAobGlzdCk7CQkJCQlcCisJKGxpbmspLT5wcmV2ID0gKGxpc3QpLT5wcmV2OwkJCQlcCisJKGxpc3QpLT5wcmV2LT5uZXh0ID0gKGxpbmspOwkJCQlcCisJKGxpc3QpLT5wcmV2ID0gKGxpbmspOwkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERXQ19MSVNUX0lOU0VSVF9IRUFEKGxpc3QsIGxpbmspIGRvIHsJCQlcCisJZHdjX2xpc3RfbGlua190ICpfX25leHRfXyA9IChsaXN0KS0+bmV4dDsJCVwKKwlfX25leHRfXy0+cHJldiA9IChsaW5rKTsJCQkJXAorCShsaW5rKS0+bmV4dCA9IF9fbmV4dF9fOwkJCQlcCisJKGxpbmspLT5wcmV2ID0gKGxpc3QpOwkJCQkJXAorCShsaXN0KS0+bmV4dCA9IChsaW5rKTsJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX0xJU1RfSU5TRVJUX1RBSUwobGlzdCwgbGluaykgZG8gewkJCVwKKwlkd2NfbGlzdF9saW5rX3QgKl9fcHJldl9fID0gKGxpc3QpLT5wcmV2OwkJXAorCShsaXN0KS0+cHJldiA9IChsaW5rKTsJCQkJCVwKKwkobGluayktPm5leHQgPSAobGlzdCk7CQkJCQlcCisJKGxpbmspLT5wcmV2ID0gX19wcmV2X187CQkJCVwKKwlfX3ByZXZfXy0+bmV4dCA9IChsaW5rKTsJCQkJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgMAorc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQpCit7CisgICAgICAgIG5leHQtPnByZXYgPSBuZXc7CisgICAgICAgIG5ldy0+bmV4dCA9IG5leHQ7CisgICAgICAgIG5ldy0+cHJldiA9IHByZXY7CisgICAgICAgIHByZXYtPm5leHQgPSBuZXc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisgICAgICAgIF9fbGlzdF9hZGQobmV3LCBoZWFkLCBoZWFkLT5uZXh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkX3RhaWwoc3RydWN0IGxpc3RfaGVhZCAqbmV3LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworICAgICAgICBfX2xpc3RfYWRkKG5ldywgaGVhZC0+cHJldiwgaGVhZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2xpc3RfZGVsKHN0cnVjdCBsaXN0X2hlYWQgKiBwcmV2LCBzdHJ1Y3QgbGlzdF9oZWFkICogbmV4dCkKK3sKKyAgICAgICAgbmV4dC0+cHJldiA9IHByZXY7CisgICAgICAgIHByZXYtPm5leHQgPSBuZXh0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisgICAgICAgIF9fbGlzdF9kZWwoZW50cnktPnByZXYsIGVudHJ5LT5uZXh0KTsKKyAgICAgICAgZW50cnktPm5leHQgPSBMSVNUX1BPSVNPTjE7CisgICAgICAgIGVudHJ5LT5wcmV2ID0gTElTVF9QT0lTT04yOworfQorI2VuZGlmCisKKyNkZWZpbmUgRFdDX0xJU1RfUkVNT1ZFKGxpbmspIGRvIHsJCQkJXAorCShsaW5rKS0+bmV4dC0+cHJldiA9IChsaW5rKS0+cHJldjsJCQlcCisJKGxpbmspLT5wcmV2LT5uZXh0ID0gKGxpbmspLT5uZXh0OwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX0xJU1RfUkVNT1ZFX0lOSVQobGluaykgZG8gewkJCQlcCisJRFdDX0xJU1RfUkVNT1ZFKGxpbmspOwkJCQkJXAorCURXQ19MSVNUX0lOSVQobGluayk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERXQ19MSVNUX01PVkVfSEVBRChsaXN0LCBsaW5rKSBkbyB7CQkJXAorCURXQ19MSVNUX1JFTU9WRShsaW5rKTsJCQkJCVwKKwlEV0NfTElTVF9JTlNFUlRfSEVBRChsaXN0LCBsaW5rKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERXQ19MSVNUX01PVkVfVEFJTChsaXN0LCBsaW5rKSBkbyB7CQkJXAorCURXQ19MSVNUX1JFTU9WRShsaW5rKTsJCQkJCVwKKwlEV0NfTElTVF9JTlNFUlRfVEFJTChsaXN0LCBsaW5rKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERXQ19MSVNUX0ZPUkVBQ0godmFyLCBsaXN0KQkJCQlcCisJZm9yKCh2YXIpID0gRFdDX0xJU1RfRklSU1QobGlzdCk7CQkJXAorCSAgICAodmFyKSAhPSBEV0NfTElTVF9FTkQobGlzdCk7CQkJXAorCSAgICAodmFyKSA9IERXQ19MSVNUX05FWFQodmFyKSkKKworI2RlZmluZSBEV0NfTElTVF9GT1JFQUNIX1NBRkUodmFyLCB2YXIyLCBsaXN0KQkJCVwKKwlmb3IoKHZhcikgPSBEV0NfTElTVF9GSVJTVChsaXN0KSwgKHZhcjIpID0gRFdDX0xJU1RfTkVYVCh2YXIpOwlcCisJICAgICh2YXIpICE9IERXQ19MSVNUX0VORChsaXN0KTsJCQlcCisJICAgICh2YXIpID0gKHZhcjIpLCAodmFyMikgPSBEV0NfTElTVF9ORVhUKHZhcjIpKQorCisjZGVmaW5lIERXQ19MSVNUX0ZPUkVBQ0hfUkVWRVJTRSh2YXIsIGxpc3QpCQkJXAorCWZvcigodmFyKSA9IERXQ19MSVNUX0xBU1QobGlzdCk7CQkJXAorCSAgICAodmFyKSAhPSBEV0NfTElTVF9FTkQobGlzdCk7CQkJXAorCSAgICAodmFyKSA9IERXQ19MSVNUX1BSRVYodmFyKSkKKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBkZWZpbml0aW9ucy4KKyAqLworI2RlZmluZSBEV0NfU0xJU1RfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzbGhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCit9CisKKyNkZWZpbmUgRFdDX1NMSVNUX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJXAorCXsgTlVMTCB9CisKKyNkZWZpbmUgRFdDX1NMSVNUX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc2xlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKworLyoKKyAqIFNpbmdseS1saW5rZWQgTGlzdCBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZSBEV0NfU0xJU1RfRklSU1QoaGVhZCkJKChoZWFkKS0+c2xoX2ZpcnN0KQorI2RlZmluZSBEV0NfU0xJU1RfRU5EKGhlYWQpCQlOVUxMCisjZGVmaW5lIERXQ19TTElTVF9FTVBUWShoZWFkKQkoU0xJU1RfRklSU1QoaGVhZCkgPT0gU0xJU1RfRU5EKGhlYWQpKQorI2RlZmluZSBEV0NfU0xJU1RfTkVYVChlbG0sIGZpZWxkKQkoKGVsbSktPmZpZWxkLnNsZV9uZXh0KQorCisjZGVmaW5lIERXQ19TTElTVF9GT1JFQUNIKHZhciwgaGVhZCwgZmllbGQpCQkJCVwKKwlmb3IoKHZhcikgPSBTTElTVF9GSVJTVChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgIT0gU0xJU1RfRU5EKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSA9IFNMSVNUX05FWFQodmFyLCBmaWVsZCkpCisKKyNkZWZpbmUgRFdDX1NMSVNUX0ZPUkVBQ0hfUFJFVlBUUih2YXIsIHZhcnAsIGhlYWQsIGZpZWxkKQkJXAorCWZvcigodmFycCkgPSAmU0xJU1RfRklSU1QoKGhlYWQpKTsJCQkJXAorCSAgICAoKHZhcikgPSAqKHZhcnApKSAhPSBTTElTVF9FTkQoaGVhZCk7CQkJXAorCSAgICAodmFycCkgPSAmU0xJU1RfTkVYVCgodmFyKSwgZmllbGQpKQorCisvKgorICogU2luZ2x5LWxpbmtlZCBMaXN0IGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBEV0NfU0xJU1RfSU5JVChoZWFkKSB7CQkJCQkJXAorCVNMSVNUX0ZJUlNUKGhlYWQpID0gU0xJU1RfRU5EKGhlYWQpOwkJCQlcCit9CisKKyNkZWZpbmUgRFdDX1NMSVNUX0lOU0VSVF9BRlRFUihzbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0OwkJXAorCShzbGlzdGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX1NMSVNUX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLnNsZV9uZXh0ID0gKGhlYWQpLT5zbGhfZmlyc3Q7CQkJXAorCShoZWFkKS0+c2xoX2ZpcnN0ID0gKGVsbSk7CQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERXQ19TTElTVF9SRU1PVkVfTkVYVChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zbGVfbmV4dCA9IChlbG0pLT5maWVsZC5zbGVfbmV4dC0+ZmllbGQuc2xlX25leHQ7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX1NMSVNUX1JFTU9WRV9IRUFEKGhlYWQsIGZpZWxkKSBkbyB7CQkJCVwKKwkoaGVhZCktPnNsaF9maXJzdCA9IChoZWFkKS0+c2xoX2ZpcnN0LT5maWVsZC5zbGVfbmV4dDsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX1NMSVNUX1JFTU9WRShoZWFkLCBlbG0sIHR5cGUsIGZpZWxkKSBkbyB7CQkJXAorCWlmICgoaGVhZCktPnNsaF9maXJzdCA9PSAoZWxtKSkgewkJCQlcCisJCVNMSVNUX1JFTU9WRV9IRUFEKChoZWFkKSwgZmllbGQpOwkJCVwKKwl9CQkJCQkJCQlcCisJZWxzZSB7CQkJCQkJCQlcCisJCXN0cnVjdCB0eXBlICpjdXJlbG0gPSAoaGVhZCktPnNsaF9maXJzdDsJCVwKKwkJd2hpbGUoIGN1cmVsbS0+ZmllbGQuc2xlX25leHQgIT0gKGVsbSkgKQkJXAorCQkJY3VyZWxtID0gY3VyZWxtLT5maWVsZC5zbGVfbmV4dDsJCVwKKwkJY3VyZWxtLT5maWVsZC5zbGVfbmV4dCA9CQkJCVwKKwkJICAgIGN1cmVsbS0+ZmllbGQuc2xlX25leHQtPmZpZWxkLnNsZV9uZXh0OwkJXAorCX0JCQkJCQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBTaW1wbGUgcXVldWUgZGVmaW5pdGlvbnMuCisgKi8KKyNkZWZpbmUgRFdDX1NJTVBMRVFfSEVBRChuYW1lLCB0eXBlKQkJCQkJXAorc3RydWN0IG5hbWUgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpzcWhfZmlyc3Q7CS8qIGZpcnN0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKipzcWhfbGFzdDsJLyogYWRkciBvZiBsYXN0IG5leHQgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lIERXQ19TSU1QTEVRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS5zcWhfZmlyc3QgfQorCisjZGVmaW5lIERXQ19TSU1QTEVRX0VOVFJZKHR5cGUpCQkJCQkJXAorc3RydWN0IHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqc3FlX25leHQ7CS8qIG5leHQgZWxlbWVudCAqLwkJCVwKK30KKworLyoKKyAqIFNpbXBsZSBxdWV1ZSBhY2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZSBEV0NfU0lNUExFUV9GSVJTVChoZWFkKQkgICAgKChoZWFkKS0+c3FoX2ZpcnN0KQorI2RlZmluZSBEV0NfU0lNUExFUV9FTkQoaGVhZCkJICAgIE5VTEwKKyNkZWZpbmUgRFdDX1NJTVBMRVFfRU1QVFkoaGVhZCkJICAgIChTSU1QTEVRX0ZJUlNUKGhlYWQpID09IFNJTVBMRVFfRU5EKGhlYWQpKQorI2RlZmluZSBEV0NfU0lNUExFUV9ORVhUKGVsbSwgZmllbGQpICAgICgoZWxtKS0+ZmllbGQuc3FlX25leHQpCisKKyNkZWZpbmUgRFdDX1NJTVBMRVFfRk9SRUFDSCh2YXIsIGhlYWQsIGZpZWxkKQkJCQlcCisJZm9yKCh2YXIpID0gU0lNUExFUV9GSVJTVChoZWFkKTsJCQkJXAorCSAgICAodmFyKSAhPSBTSU1QTEVRX0VORChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgPSBTSU1QTEVRX05FWFQodmFyLCBmaWVsZCkpCisKKy8qCisgKiBTaW1wbGUgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lIERXQ19TSU1QTEVRX0lOSVQoaGVhZCkgZG8gewkJCQkJXAorCShoZWFkKS0+c3FoX2ZpcnN0ID0gTlVMTDsJCQkJCVwKKwkoaGVhZCktPnNxaF9sYXN0ID0gJihoZWFkKS0+c3FoX2ZpcnN0OwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERXQ19TSU1QTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoZWxtKS0+ZmllbGQuc3FlX25leHQgPSAoaGVhZCktPnNxaF9maXJzdCkgPT0gTlVMTCkJXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zcWVfbmV4dDsJCVwKKwkoaGVhZCktPnNxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfU0lNUExFUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5zcWVfbmV4dCA9IE5VTEw7CQkJCQlcCisJKihoZWFkKS0+c3FoX2xhc3QgPSAoZWxtKTsJCQkJCVwKKwkoaGVhZCktPnNxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zcWVfbmV4dDsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERXQ19TSU1QTEVRX0lOU0VSVF9BRlRFUihoZWFkLCBsaXN0ZWxtLCBlbG0sIGZpZWxkKSBkbyB7CVwKKwlpZiAoKChlbG0pLT5maWVsZC5zcWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQuc3FlX25leHQpID09IE5VTEwpXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihlbG0pLT5maWVsZC5zcWVfbmV4dDsJCVwKKwkobGlzdGVsbSktPmZpZWxkLnNxZV9uZXh0ID0gKGVsbSk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX1NJTVBMRVFfUkVNT1ZFX0hFQUQoaGVhZCwgZmllbGQpIGRvIHsJCQlcCisJaWYgKCgoaGVhZCktPnNxaF9maXJzdCA9IChoZWFkKS0+c3FoX2ZpcnN0LT5maWVsZC5zcWVfbmV4dCkgPT0gTlVMTCkgXAorCQkoaGVhZCktPnNxaF9sYXN0ID0gJihoZWFkKS0+c3FoX2ZpcnN0OwkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBUYWlsIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIERXQ19UQUlMUV9IRUFEKG5hbWUsIHR5cGUpCQkJCQlcCitzdHJ1Y3QgbmFtZSB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnRxaF9maXJzdDsJLyogZmlyc3QgZWxlbWVudCAqLwkJCVwKKwlzdHJ1Y3QgdHlwZSAqKnRxaF9sYXN0OwkvKiBhZGRyIG9mIGxhc3QgbmV4dCBlbGVtZW50ICovCQlcCit9CisKKyNkZWZpbmUgRFdDX1RBSUxRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJXAorCXsgTlVMTCwgJihoZWFkKS50cWhfZmlyc3QgfQorCisjZGVmaW5lIERXQ19UQUlMUV9FTlRSWSh0eXBlKQkJCQkJCVwKK3N0cnVjdCB7CQkJCQkJCQlcCisJc3RydWN0IHR5cGUgKnRxZV9uZXh0OwkvKiBuZXh0IGVsZW1lbnQgKi8JCQlcCisJc3RydWN0IHR5cGUgKip0cWVfcHJldjsJLyogYWRkcmVzcyBvZiBwcmV2aW91cyBuZXh0IGVsZW1lbnQgKi8JXAorfQorCisvKgorICogdGFpbCBxdWV1ZSBhY2Nlc3MgbWV0aG9kcworICovCisjZGVmaW5lIERXQ19UQUlMUV9GSVJTVChoZWFkKQkJKChoZWFkKS0+dHFoX2ZpcnN0KQorI2RlZmluZSBEV0NfVEFJTFFfRU5EKGhlYWQpCQlOVUxMCisjZGVmaW5lIERXQ19UQUlMUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQudHFlX25leHQpCisjZGVmaW5lIERXQ19UQUlMUV9MQVNUKGhlYWQsIGhlYWRuYW1lKQkJCQkJXAorCSgqKCgoc3RydWN0IGhlYWRuYW1lICopKChoZWFkKS0+dHFoX2xhc3QpKS0+dHFoX2xhc3QpKQorLyogWFhYICovCisjZGVmaW5lIERXQ19UQUlMUV9QUkVWKGVsbSwgaGVhZG5hbWUsIGZpZWxkKQkJCQlcCisJKCooKChzdHJ1Y3QgaGVhZG5hbWUgKikoKGVsbSktPmZpZWxkLnRxZV9wcmV2KSktPnRxaF9sYXN0KSkKKyNkZWZpbmUgRFdDX1RBSUxRX0VNUFRZKGhlYWQpCQkJCQkJXAorCShUQUlMUV9GSVJTVChoZWFkKSA9PSBUQUlMUV9FTkQoaGVhZCkpCisKKyNkZWZpbmUgRFdDX1RBSUxRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvcigodmFyKSA9IFRBSUxRX0ZJUlNUKGhlYWQpOwkJCQkJXAorCSAgICAodmFyKSAhPSBUQUlMUV9FTkQoaGVhZCk7CQkJCQlcCisJICAgICh2YXIpID0gVEFJTFFfTkVYVCh2YXIsIGZpZWxkKSkKKworI2RlZmluZSBEV0NfVEFJTFFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgaGVhZG5hbWUsIGZpZWxkKQkJXAorCWZvcigodmFyKSA9IFRBSUxRX0xBU1QoaGVhZCwgaGVhZG5hbWUpOwkJCQlcCisJICAgICh2YXIpICE9IFRBSUxRX0VORChoZWFkKTsJCQkJCVwKKwkgICAgKHZhcikgPSBUQUlMUV9QUkVWKHZhciwgaGVhZG5hbWUsIGZpZWxkKSkKKworLyoKKyAqIFRhaWwgcXVldWUgZnVuY3Rpb25zLgorICovCisjZGVmaW5lIERXQ19UQUlMUV9JTklUKGhlYWQpIGRvIHsJCQkJCVwKKwkoaGVhZCktPnRxaF9maXJzdCA9IE5VTEw7CQkJCQlcCisJKGhlYWQpLT50cWhfbGFzdCA9ICYoaGVhZCktPnRxaF9maXJzdDsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfVEFJTFFfSU5TRVJUX0hFQUQoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0pLT5maWVsZC50cWVfbmV4dCA9IChoZWFkKS0+dHFoX2ZpcnN0KSAhPSBOVUxMKQlcCisJCShoZWFkKS0+dHFoX2ZpcnN0LT5maWVsZC50cWVfcHJldiA9CQkJXAorCQkgICAgJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQlcCisJKGhlYWQpLT50cWhfZmlyc3QgPSAoZWxtKTsJCQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGhlYWQpLT50cWhfZmlyc3Q7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfVEFJTFFfSU5TRVJUX1RBSUwoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX25leHQgPSBOVUxMOwkJCQkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChoZWFkKS0+dHFoX2xhc3Q7CQkJXAorCSooaGVhZCktPnRxaF9sYXN0ID0gKGVsbSk7CQkJCQlcCisJKGhlYWQpLT50cWhfbGFzdCA9ICYoZWxtKS0+ZmllbGQudHFlX25leHQ7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfVEFJTFFfSU5TRVJUX0FGVEVSKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJCVwKKwlpZiAoKChlbG0pLT5maWVsZC50cWVfbmV4dCA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpXAorCQkoZWxtKS0+ZmllbGQudHFlX25leHQtPmZpZWxkLnRxZV9wcmV2ID0JCQlcCisJCSAgICAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPnRxaF9sYXN0ID0gJihlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKKwkobGlzdGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGVsbSk7CQkJCVwKKwkoZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGxpc3RlbG0pLT5maWVsZC50cWVfbmV4dDsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX1RBSUxRX0lOU0VSVF9CRUZPUkUobGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewkJXAorCShlbG0pLT5maWVsZC50cWVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXY7CQlcCisJKGVsbSktPmZpZWxkLnRxZV9uZXh0ID0gKGxpc3RlbG0pOwkJCQlcCisJKihsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAoZWxtKTsJCQkJXAorCShsaXN0ZWxtKS0+ZmllbGQudHFlX3ByZXYgPSAmKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfVEFJTFFfUkVNT1ZFKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQkJXAorCWlmICgoKGVsbSktPmZpZWxkLnRxZV9uZXh0KSAhPSBOVUxMKQkJCQlcCisJCShlbG0pLT5maWVsZC50cWVfbmV4dC0+ZmllbGQudHFlX3ByZXYgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC50cWVfcHJldjsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGhlYWQpLT50cWhfbGFzdCA9IChlbG0pLT5maWVsZC50cWVfcHJldjsJCVwKKwkqKGVsbSktPmZpZWxkLnRxZV9wcmV2ID0gKGVsbSktPmZpZWxkLnRxZV9uZXh0OwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX1RBSUxRX1JFUExBQ0UoaGVhZCwgZWxtLCBlbG0yLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKChlbG0yKS0+ZmllbGQudHFlX25leHQgPSAoZWxtKS0+ZmllbGQudHFlX25leHQpICE9IE5VTEwpCVwKKwkJKGVsbTIpLT5maWVsZC50cWVfbmV4dC0+ZmllbGQudHFlX3ByZXYgPQkJXAorCQkgICAgJihlbG0yKS0+ZmllbGQudHFlX25leHQ7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+dHFoX2xhc3QgPSAmKGVsbTIpLT5maWVsZC50cWVfbmV4dDsJCVwKKwkoZWxtMiktPmZpZWxkLnRxZV9wcmV2ID0gKGVsbSktPmZpZWxkLnRxZV9wcmV2OwkJCVwKKwkqKGVsbTIpLT5maWVsZC50cWVfcHJldiA9IChlbG0yKTsJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGRlZmluaXRpb25zLgorICovCisjZGVmaW5lIERXQ19DSVJDTEVRX0hFQUQobmFtZSwgdHlwZSkJCQkJCVwKK3N0cnVjdCBuYW1lIHsJCQkJCQkJCVwKKwlzdHJ1Y3QgdHlwZSAqY3FoX2ZpcnN0OwkJLyogZmlyc3QgZWxlbWVudCAqLwkJXAorCXN0cnVjdCB0eXBlICpjcWhfbGFzdDsJCS8qIGxhc3QgZWxlbWVudCAqLwkJXAorfQorCisjZGVmaW5lIERXQ19DSVJDTEVRX0hFQURfSU5JVElBTElaRVIoaGVhZCkJCQkJXAorCXsgRFdDX0NJUkNMRVFfRU5EKCZoZWFkKSwgRFdDX0NJUkNMRVFfRU5EKCZoZWFkKSB9CisKKyNkZWZpbmUgRFdDX0NJUkNMRVFfRU5UUlkodHlwZSkJCQkJCQlcCitzdHJ1Y3QgewkJCQkJCQkJXAorCXN0cnVjdCB0eXBlICpjcWVfbmV4dDsJCS8qIG5leHQgZWxlbWVudCAqLwkJXAorCXN0cnVjdCB0eXBlICpjcWVfcHJldjsJCS8qIHByZXZpb3VzIGVsZW1lbnQgKi8JCVwKK30KKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGFjY2VzcyBtZXRob2RzCisgKi8KKyNkZWZpbmUgRFdDX0NJUkNMRVFfRklSU1QoaGVhZCkJCSgoaGVhZCktPmNxaF9maXJzdCkKKyNkZWZpbmUgRFdDX0NJUkNMRVFfTEFTVChoZWFkKQkJKChoZWFkKS0+Y3FoX2xhc3QpCisjZGVmaW5lIERXQ19DSVJDTEVRX0VORChoZWFkKQkJKCh2b2lkICopKGhlYWQpKQorI2RlZmluZSBEV0NfQ0lSQ0xFUV9ORVhUKGVsbSwgZmllbGQpCSgoZWxtKS0+ZmllbGQuY3FlX25leHQpCisjZGVmaW5lIERXQ19DSVJDTEVRX1BSRVYoZWxtLCBmaWVsZCkJKChlbG0pLT5maWVsZC5jcWVfcHJldikKKyNkZWZpbmUgRFdDX0NJUkNMRVFfRU1QVFkoaGVhZCkJCQkJCQlcCisJKERXQ19DSVJDTEVRX0ZJUlNUKGhlYWQpID09IERXQ19DSVJDTEVRX0VORChoZWFkKSkKKworI2RlZmluZSBEV0NfQ0lSQ0xFUV9FTVBUWV9FTlRSWShlbG0sIGZpZWxkKSAoKChlbG0pLT5maWVsZC5jcWVfbmV4dCA9PSBOVUxMKSAmJiAoKGVsbSktPmZpZWxkLmNxZV9wcmV2ID09IE5VTEwpKQorCisjZGVmaW5lIERXQ19DSVJDTEVRX0ZPUkVBQ0godmFyLCBoZWFkLCBmaWVsZCkJCQkJXAorCWZvcigodmFyKSA9IERXQ19DSVJDTEVRX0ZJUlNUKGhlYWQpOwkJCQlcCisJICAgICh2YXIpICE9IERXQ19DSVJDTEVRX0VORChoZWFkKTsJCQkJXAorCSAgICAodmFyKSA9IERXQ19DSVJDTEVRX05FWFQodmFyLCBmaWVsZCkpCisKKyNkZWZpbmUgRFdDX0NJUkNMRVFfRk9SRUFDSF9TQUZFKHZhciwgdmFyMiwgaGVhZCwgZmllbGQpCQkJXAorCWZvcigodmFyKSA9IERXQ19DSVJDTEVRX0ZJUlNUKGhlYWQpLCB2YXIyID0gRFdDX0NJUkNMRVFfTkVYVCh2YXIsIGZpZWxkKTsgXAorCSAgICAodmFyKSAhPSBEV0NfQ0lSQ0xFUV9FTkQoaGVhZCk7CQkJCQlcCisJICAgICh2YXIpID0gdmFyMiwgdmFyMiA9IERXQ19DSVJDTEVRX05FWFQodmFyLCBmaWVsZCkpCisKKyNkZWZpbmUgRFdDX0NJUkNMRVFfRk9SRUFDSF9SRVZFUlNFKHZhciwgaGVhZCwgZmllbGQpCQkJXAorCWZvcigodmFyKSA9IERXQ19DSVJDTEVRX0xBU1QoaGVhZCk7CQkJCVwKKwkgICAgKHZhcikgIT0gRFdDX0NJUkNMRVFfRU5EKGhlYWQpOwkJCQlcCisJICAgICh2YXIpID0gRFdDX0NJUkNMRVFfUFJFVih2YXIsIGZpZWxkKSkKKworLyoKKyAqIENpcmN1bGFyIHF1ZXVlIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBEV0NfQ0lSQ0xFUV9JTklUKGhlYWQpIGRvIHsJCQkJCVwKKwkoaGVhZCktPmNxaF9maXJzdCA9IERXQ19DSVJDTEVRX0VORChoZWFkKTsJCQlcCisJKGhlYWQpLT5jcWhfbGFzdCA9IERXQ19DSVJDTEVRX0VORChoZWFkKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERXQ19DSVJDTEVRX0lOSVRfRU5UUlkoZWxtLCBmaWVsZCkgZG8gewkJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gTlVMTDsJCQkJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSBOVUxMOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfQ0lSQ0xFUV9JTlNFUlRfQUZURVIoaGVhZCwgbGlzdGVsbSwgZWxtLCBmaWVsZCkgZG8gewlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dDsJCVwKKwkoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPSAobGlzdGVsbSk7CQkJCVwKKwlpZiAoKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dCA9PSBEV0NfQ0lSQ0xFUV9FTkQoaGVhZCkpCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QgPSAoZWxtKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGxpc3RlbG0pLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJXAorCShsaXN0ZWxtKS0+ZmllbGQuY3FlX25leHQgPSAoZWxtKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfQ0lSQ0xFUV9JTlNFUlRfQkVGT1JFKGhlYWQsIGxpc3RlbG0sIGVsbSwgZmllbGQpIGRvIHsJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9IChsaXN0ZWxtKTsJCQkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IChsaXN0ZWxtKS0+ZmllbGQuY3FlX3ByZXY7CQlcCisJaWYgKChsaXN0ZWxtKS0+ZmllbGQuY3FlX3ByZXYgPT0gRFdDX0NJUkNMRVFfRU5EKGhlYWQpKQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkobGlzdGVsbSktPmZpZWxkLmNxZV9wcmV2LT5maWVsZC5jcWVfbmV4dCA9IChlbG0pOwlcCisJKGxpc3RlbG0pLT5maWVsZC5jcWVfcHJldiA9IChlbG0pOwkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERXQ19DSVJDTEVRX0lOU0VSVF9IRUFEKGhlYWQsIGVsbSwgZmllbGQpIGRvIHsJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9uZXh0ID0gKGhlYWQpLT5jcWhfZmlyc3Q7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfcHJldiA9IERXQ19DSVJDTEVRX0VORChoZWFkKTsJCQlcCisJaWYgKChoZWFkKS0+Y3FoX2xhc3QgPT0gRFdDX0NJUkNMRVFfRU5EKGhlYWQpKQkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQkoaGVhZCktPmNxaF9maXJzdC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKTsJCVwKKwkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfQ0lSQ0xFUV9JTlNFUlRfVEFJTChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCShlbG0pLT5maWVsZC5jcWVfbmV4dCA9IERXQ19DSVJDTEVRX0VORChoZWFkKTsJCQlcCisJKGVsbSktPmZpZWxkLmNxZV9wcmV2ID0gKGhlYWQpLT5jcWhfbGFzdDsJCQlcCisJaWYgKChoZWFkKS0+Y3FoX2ZpcnN0ID09IERXQ19DSVJDTEVRX0VORChoZWFkKSkJCQlcCisJCShoZWFkKS0+Y3FoX2ZpcnN0ID0gKGVsbSk7CQkJCVwKKwllbHNlCQkJCQkJCQlcCisJCShoZWFkKS0+Y3FoX2xhc3QtPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSk7CQlcCisJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfQ0lSQ0xFUV9SRU1PVkUoaGVhZCwgZWxtLCBmaWVsZCkgZG8gewkJCVwKKwlpZiAoKGVsbSktPmZpZWxkLmNxZV9uZXh0ID09IERXQ19DSVJDTEVRX0VORChoZWFkKSkJCVwKKwkJKGhlYWQpLT5jcWhfbGFzdCA9IChlbG0pLT5maWVsZC5jcWVfcHJldjsJCVwKKwllbHNlCQkJCQkJCQlcCisJCShlbG0pLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5jcWVfcHJldjsJCQkJXAorCWlmICgoZWxtKS0+ZmllbGQuY3FlX3ByZXYgPT0gRFdDX0NJUkNMRVFfRU5EKGhlYWQpKQkJXAorCQkoaGVhZCktPmNxaF9maXJzdCA9IChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCVwKKwllbHNlCQkJCQkJCQlcCisJCShlbG0pLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPQkJCVwKKwkJICAgIChlbG0pLT5maWVsZC5jcWVfbmV4dDsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV0NfQ0lSQ0xFUV9SRU1PVkVfSU5JVChoZWFkLCBlbG0sIGZpZWxkKSBkbyB7CQkJXAorCURXQ19DSVJDTEVRX1JFTU9WRShoZWFkLCBlbG0sIGZpZWxkKTsJCQkJXAorCURXQ19DSVJDTEVRX0lOSVRfRU5UUlkoZWxtLCBmaWVsZCk7CQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRFdDX0NJUkNMRVFfUkVQTEFDRShoZWFkLCBlbG0sIGVsbTIsIGZpZWxkKSBkbyB7CQlcCisJaWYgKCgoZWxtMiktPmZpZWxkLmNxZV9uZXh0ID0gKGVsbSktPmZpZWxkLmNxZV9uZXh0KSA9PQkJXAorCSAgICBEV0NfQ0lSQ0xFUV9FTkQoaGVhZCkpCQkJCQlcCisJCShoZWFkKS5jcWhfbGFzdCA9IChlbG0yKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGVsbTIpLT5maWVsZC5jcWVfbmV4dC0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtMik7CVwKKwlpZiAoKChlbG0yKS0+ZmllbGQuY3FlX3ByZXYgPSAoZWxtKS0+ZmllbGQuY3FlX3ByZXYpID09CQlcCisJICAgIERXQ19DSVJDTEVRX0VORChoZWFkKSkJCQkJCVwKKwkJKGhlYWQpLmNxaF9maXJzdCA9IChlbG0yKTsJCQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKGVsbTIpLT5maWVsZC5jcWVfcHJldi0+ZmllbGQuY3FlX25leHQgPSAoZWxtMik7CVwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfRFdDX0xJU1RfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX21lbS5jIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfbWVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2NDVmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX21lbS5jCkBAIC0wLDAgKzEsMjQ1IEBACisvKiBNZW1vcnkgRGVidWdnaW5nICovCisjaWZkZWYgRFdDX0RFQlVHX01FTU9SWQorCisjaW5jbHVkZSAiZHdjX29zLmgiCisjaW5jbHVkZSAiZHdjX2xpc3QuaCIKKworc3RydWN0IGFsbG9jYXRpb24geworCXZvaWQgKmFkZHI7CisJdm9pZCAqY3R4OworCWNoYXIgKmZ1bmM7CisJaW50IGxpbmU7CisJdWludDMyX3Qgc2l6ZTsKKwlpbnQgZG1hOworCURXQ19DSVJDTEVRX0VOVFJZKGFsbG9jYXRpb24pIGVudHJ5OworfTsKKworRFdDX0NJUkNMRVFfSEVBRChhbGxvY2F0aW9uX3F1ZXVlLCBhbGxvY2F0aW9uKTsKKworc3RydWN0IGFsbG9jYXRpb25fbWFuYWdlciB7CisJdm9pZCAqbWVtX2N0eDsKKwlzdHJ1Y3QgYWxsb2NhdGlvbl9xdWV1ZSBhbGxvY2F0aW9uczsKKworCS8qIHN0YXRpc3RpY3MgKi8KKwlpbnQgbnVtOworCWludCBudW1fZnJlZWQ7CisJaW50IG51bV9hY3RpdmU7CisJdWludDMyX3QgdG90YWw7CisJdWludDMyX3QgY3VyOworCXVpbnQzMl90IG1heDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWxsb2NhdGlvbl9tYW5hZ2VyICptYW5hZ2VyID0gTlVMTDsKKworc3RhdGljIGludCBhZGRfYWxsb2NhdGlvbih2b2lkICpjdHgsIHVpbnQzMl90IHNpemUsIGNoYXIgY29uc3QgKmZ1bmMsIGludCBsaW5lLCB2b2lkICphZGRyLAorCQkJICBpbnQgZG1hKQoreworCXN0cnVjdCBhbGxvY2F0aW9uICphOworCisJRFdDX0FTU0VSVChtYW5hZ2VyICE9IE5VTEwsICJtYW5hZ2VyIG5vdCBhbGxvY2F0ZWQiKTsKKworCWEgPSBfX0RXQ19BTExPQ19BVE9NSUMobWFuYWdlci0+bWVtX2N0eCwgc2l6ZW9mKCphKSk7CisJaWYgKCFhKSB7CisJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCX0KKworCWEtPmZ1bmMgPSBfX0RXQ19BTExPQ19BVE9NSUMobWFuYWdlci0+bWVtX2N0eCwgRFdDX1NUUkxFTihmdW5jKSArIDEpOworCWlmICghYS0+ZnVuYykgeworCQlfX0RXQ19GUkVFKG1hbmFnZXItPm1lbV9jdHgsIGEpOworCQlyZXR1cm4gLURXQ19FX05PX01FTU9SWTsKKwl9CisKKwlEV0NfTUVNQ1BZKGEtPmZ1bmMsIGZ1bmMsIERXQ19TVFJMRU4oZnVuYykgKyAxKTsKKwlhLT5hZGRyID0gYWRkcjsKKwlhLT5jdHggPSBjdHg7CisJYS0+bGluZSA9IGxpbmU7CisJYS0+c2l6ZSA9IHNpemU7CisJYS0+ZG1hID0gZG1hOworCURXQ19DSVJDTEVRX0lOU0VSVF9UQUlMKCZtYW5hZ2VyLT5hbGxvY2F0aW9ucywgYSwgZW50cnkpOworCisJLyogVXBkYXRlIHN0YXRzICovCisJbWFuYWdlci0+bnVtKys7CisJbWFuYWdlci0+bnVtX2FjdGl2ZSsrOworCW1hbmFnZXItPnRvdGFsICs9IHNpemU7CisJbWFuYWdlci0+Y3VyICs9IHNpemU7CisKKwlpZiAobWFuYWdlci0+bWF4IDwgbWFuYWdlci0+Y3VyKSB7CisJCW1hbmFnZXItPm1heCA9IG1hbmFnZXItPmN1cjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhbGxvY2F0aW9uICpmaW5kX2FsbG9jYXRpb24odm9pZCAqY3R4LCB2b2lkICphZGRyKQoreworCXN0cnVjdCBhbGxvY2F0aW9uICphOworCisJRFdDX0NJUkNMRVFfRk9SRUFDSChhLCAmbWFuYWdlci0+YWxsb2NhdGlvbnMsIGVudHJ5KSB7CisJCWlmIChhLT5jdHggPT0gY3R4ICYmIGEtPmFkZHIgPT0gYWRkcikgeworCQkJcmV0dXJuIGE7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9hbGxvY2F0aW9uKHZvaWQgKmN0eCwgdm9pZCAqYWRkciwgY2hhciBjb25zdCAqZnVuYywgaW50IGxpbmUpCit7CisJc3RydWN0IGFsbG9jYXRpb24gKmEgPSBmaW5kX2FsbG9jYXRpb24oY3R4LCBhZGRyKTsKKworCWlmICghYSkgeworCQlEV0NfQVNTRVJUKDAsCisJCQkgICAiRnJlZSBvZiBhZGRyZXNzICVwIHRoYXQgd2FzIG5ldmVyIGFsbG9jYXRlZCBvciBhbHJlYWR5IGZyZWVkICVzOiVkIiwKKwkJCSAgIGFkZHIsIGZ1bmMsIGxpbmUpOworCQlyZXR1cm47CisJfQorCisJRFdDX0NJUkNMRVFfUkVNT1ZFKCZtYW5hZ2VyLT5hbGxvY2F0aW9ucywgYSwgZW50cnkpOworCisJbWFuYWdlci0+bnVtX2FjdGl2ZS0tOworCW1hbmFnZXItPm51bV9mcmVlZCsrOworCW1hbmFnZXItPmN1ciAtPSBhLT5zaXplOworCV9fRFdDX0ZSRUUobWFuYWdlci0+bWVtX2N0eCwgYS0+ZnVuYyk7CisJX19EV0NfRlJFRShtYW5hZ2VyLT5tZW1fY3R4LCBhKTsKK30KKworaW50IGR3Y19tZW1vcnlfZGVidWdfc3RhcnQodm9pZCAqbWVtX2N0eCkKK3sKKwlEV0NfQVNTRVJUKG1hbmFnZXIgPT0gTlVMTCwgIk1lbW9yeSBkZWJ1Z2dpbmcgaGFzIGFscmVhZHkgc3RhcnRlZFxuIik7CisKKwlpZiAobWFuYWdlcikgeworCQlyZXR1cm4gLURXQ19FX0JVU1k7CisJfQorCisJbWFuYWdlciA9IF9fRFdDX0FMTE9DKG1lbV9jdHgsIHNpemVvZigqbWFuYWdlcikpOworCWlmICghbWFuYWdlcikgeworCQlyZXR1cm4gLURXQ19FX05PX01FTU9SWTsKKwl9CisKKwlEV0NfQ0lSQ0xFUV9JTklUKCZtYW5hZ2VyLT5hbGxvY2F0aW9ucyk7CisJbWFuYWdlci0+bWVtX2N0eCA9IG1lbV9jdHg7CisJbWFuYWdlci0+bnVtID0gMDsKKwltYW5hZ2VyLT5udW1fZnJlZWQgPSAwOworCW1hbmFnZXItPm51bV9hY3RpdmUgPSAwOworCW1hbmFnZXItPnRvdGFsID0gMDsKKwltYW5hZ2VyLT5jdXIgPSAwOworCW1hbmFnZXItPm1heCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkd2NfbWVtb3J5X2RlYnVnX3N0b3Aodm9pZCkKK3sKKwlzdHJ1Y3QgYWxsb2NhdGlvbiAqYTsKKworCWR3Y19tZW1vcnlfZGVidWdfcmVwb3J0KCk7CisKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIKGEsICZtYW5hZ2VyLT5hbGxvY2F0aW9ucywgZW50cnkpIHsKKwkJRFdDX0VSUk9SKCJNZW1vcnkgbGVha2VkIGZyb20gJXM6JWRcbiIsIGEtPmZ1bmMsIGEtPmxpbmUpOworCQlmcmVlX2FsbG9jYXRpb24oYS0+Y3R4LCBhLT5hZGRyLCBOVUxMLCAtMSk7CisJfQorCisJX19EV0NfRlJFRShtYW5hZ2VyLT5tZW1fY3R4LCBtYW5hZ2VyKTsKK30KKwordm9pZCBkd2NfbWVtb3J5X2RlYnVnX3JlcG9ydCh2b2lkKQoreworCXN0cnVjdCBhbGxvY2F0aW9uICphOworCisJRFdDX1BSSU5URigiXG5cblxuLS0tLS0tLS0tLS0tLS0tLS0gTWVtb3J5IERlYnVnZ2luZyBSZXBvcnQgLS0tLS0tLS0tLS0tLS0tLS1cblxuIik7CisJRFdDX1BSSU5URigiTnVtIEFsbG9jYXRpb25zID0gJWRcbiIsIG1hbmFnZXItPm51bSk7CisJRFdDX1BSSU5URigiRnJlZWQgPSAlZFxuIiwgbWFuYWdlci0+bnVtX2ZyZWVkKTsKKwlEV0NfUFJJTlRGKCJBY3RpdmUgPSAlZFxuIiwgbWFuYWdlci0+bnVtX2FjdGl2ZSk7CisJRFdDX1BSSU5URigiQ3VycmVudCBNZW1vcnkgVXNlZCA9ICVkXG4iLCBtYW5hZ2VyLT5jdXIpOworCURXQ19QUklOVEYoIlRvdGFsIE1lbW9yeSBVc2VkID0gJWRcbiIsIG1hbmFnZXItPnRvdGFsKTsKKwlEV0NfUFJJTlRGKCJNYXhpbXVtIE1lbW9yeSBVc2VkIGF0IE9uY2UgPSAlZFxuIiwgbWFuYWdlci0+bWF4KTsKKwlEV0NfUFJJTlRGKCJVbmZyZWVkIGFsbG9jYXRpb25zOlxuIik7CisKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIKGEsICZtYW5hZ2VyLT5hbGxvY2F0aW9ucywgZW50cnkpIHsKKwkJRFdDX1BSSU5URigiICAgIGFkZHI9JXAsIHNpemU9JWQgZnJvbSAlczolZCwgRE1BPSVkXG4iLAorCQkJICAgYS0+YWRkciwgYS0+c2l6ZSwgYS0+ZnVuYywgYS0+bGluZSwgYS0+ZG1hKTsKKwl9Cit9CisKKy8qIFRoZSByZXBsYWNlbWVudCBmdW5jdGlvbnMgKi8KK3ZvaWQgKmR3Y19hbGxvY19kZWJ1Zyh2b2lkICptZW1fY3R4LCB1aW50MzJfdCBzaXplLCBjaGFyIGNvbnN0ICpmdW5jLCBpbnQgbGluZSkKK3sKKwl2b2lkICphZGRyID0gX19EV0NfQUxMT0MobWVtX2N0eCwgc2l6ZSk7CisKKwlpZiAoIWFkZHIpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGFkZF9hbGxvY2F0aW9uKG1lbV9jdHgsIHNpemUsIGZ1bmMsIGxpbmUsIGFkZHIsIDApKSB7CisJCV9fRFdDX0ZSRUUobWVtX2N0eCwgYWRkcik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBhZGRyOworfQorCit2b2lkICpkd2NfYWxsb2NfYXRvbWljX2RlYnVnKHZvaWQgKm1lbV9jdHgsIHVpbnQzMl90IHNpemUsIGNoYXIgY29uc3QgKmZ1bmMsCisJCQkgICAgIGludCBsaW5lKQoreworCXZvaWQgKmFkZHIgPSBfX0RXQ19BTExPQ19BVE9NSUMobWVtX2N0eCwgc2l6ZSk7CisKKwlpZiAoIWFkZHIpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGFkZF9hbGxvY2F0aW9uKG1lbV9jdHgsIHNpemUsIGZ1bmMsIGxpbmUsIGFkZHIsIDApKSB7CisJCV9fRFdDX0ZSRUUobWVtX2N0eCwgYWRkcik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBhZGRyOworfQorCit2b2lkIGR3Y19mcmVlX2RlYnVnKHZvaWQgKm1lbV9jdHgsIHZvaWQgKmFkZHIsIGNoYXIgY29uc3QgKmZ1bmMsIGludCBsaW5lKQoreworCWZyZWVfYWxsb2NhdGlvbihtZW1fY3R4LCBhZGRyLCBmdW5jLCBsaW5lKTsKKwlfX0RXQ19GUkVFKG1lbV9jdHgsIGFkZHIpOworfQorCit2b2lkICpkd2NfZG1hX2FsbG9jX2RlYnVnKHZvaWQgKmRtYV9jdHgsIHVpbnQzMl90IHNpemUsIGR3Y19kbWFfdCAqZG1hX2FkZHIsCisJCQkgIGNoYXIgY29uc3QgKmZ1bmMsIGludCBsaW5lKQoreworCXZvaWQgKmFkZHIgPSBfX0RXQ19ETUFfQUxMT0MoZG1hX2N0eCwgc2l6ZSwgZG1hX2FkZHIpOworCisJaWYgKCFhZGRyKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChhZGRfYWxsb2NhdGlvbihkbWFfY3R4LCBzaXplLCBmdW5jLCBsaW5lLCBhZGRyLCAxKSkgeworCQlfX0RXQ19ETUFfRlJFRShkbWFfY3R4LCBzaXplLCBhZGRyLCAqZG1hX2FkZHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYWRkcjsKK30KKwordm9pZCAqZHdjX2RtYV9hbGxvY19hdG9taWNfZGVidWcodm9pZCAqZG1hX2N0eCwgdWludDMyX3Qgc2l6ZSwKKwkJCQkgZHdjX2RtYV90ICpkbWFfYWRkciwgY2hhciBjb25zdCAqZnVuYywgaW50IGxpbmUpCit7CisJdm9pZCAqYWRkciA9IF9fRFdDX0RNQV9BTExPQ19BVE9NSUMoZG1hX2N0eCwgc2l6ZSwgZG1hX2FkZHIpOworCisJaWYgKCFhZGRyKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChhZGRfYWxsb2NhdGlvbihkbWFfY3R4LCBzaXplLCBmdW5jLCBsaW5lLCBhZGRyLCAxKSkgeworCQlfX0RXQ19ETUFfRlJFRShkbWFfY3R4LCBzaXplLCBhZGRyLCAqZG1hX2FkZHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYWRkcjsKK30KKwordm9pZCBkd2NfZG1hX2ZyZWVfZGVidWcodm9pZCAqZG1hX2N0eCwgdWludDMyX3Qgc2l6ZSwgdm9pZCAqdmlydF9hZGRyLAorCQkJZHdjX2RtYV90IGRtYV9hZGRyLCBjaGFyIGNvbnN0ICpmdW5jLCBpbnQgbGluZSkKK3sKKwlmcmVlX2FsbG9jYXRpb24oZG1hX2N0eCwgdmlydF9hZGRyLCBmdW5jLCBsaW5lKTsKKwlfX0RXQ19ETUFfRlJFRShkbWFfY3R4LCBzaXplLCB2aXJ0X2FkZHIsIGRtYV9hZGRyKTsKK30KKworI2VuZGlmIC8qIERXQ19ERUJVR19NRU1PUlkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX21vZHBvdy5jIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfbW9kcG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxMGY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX21vZHBvdy5jCkBAIC0wLDAgKzEsNjMzIEBACisvKiBCaWdudW0gcm91dGluZXMgYWRhcHRlZCBmcm9tIFBVVFRZIHNvdXJjZXMuICBQdVRUWSBjb3B5cmlnaHQgbm90aWNlIGZvbGxvd3MuCisgKgorICogUHVUVFkgaXMgY29weXJpZ2h0IDE5OTctMjAwNyBTaW1vbiBUYXRoYW0uCisgKgorICogUG9ydGlvbnMgY29weXJpZ2h0IFJvYmVydCBkZSBCYXRoLCBKb3JpcyB2YW4gUmFudHdpamssIERlbGlhbgorICogRGVsY2hldiwgQW5kcmVhcyBTY2h1bHR6LCBKZXJvZW4gTWFzc2FyLCBXZXogRnVybG9uZywgTmljb2xhcyBCYXJyeSwKKyAqIEp1c3RpbiBCcmFkZm9yZCwgQmVuIEhhcnJpcywgTWFsY29sbSBTbWl0aCwgQWhtYWQgS2hhbGlmYSwgTWFya3VzCisgKiBLdWhuLCBhbmQgQ09SRSBTREkgUy5BLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcworICogKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwKKyAqIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsCisgKiBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAorICogYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKKyAqIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YKKyAqIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICogV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisjaWZkZWYgRFdDX0NSWVBUT0xJQgorCisjaWZuZGVmIENPTkZJR19NQUNIX0lQTUFURQorCisjaW5jbHVkZSAiZHdjX21vZHBvdy5oIgorCisjZGVmaW5lIEJJR05VTV9JTlRfTUFTSyAgMHhGRkZGRkZGRlVMCisjZGVmaW5lIEJJR05VTV9UT1BfQklUICAgMHg4MDAwMDAwMFVMCisjZGVmaW5lIEJJR05VTV9JTlRfQklUUyAgMzIKKworCitzdGF0aWMgdm9pZCAqc25tYWxsb2Modm9pZCAqbWVtX2N0eCwgc2l6ZV90IG4sIHNpemVfdCBzaXplKQoreworICAgIHZvaWQgKnA7CisgICAgc2l6ZSAqPSBuOworICAgIGlmIChzaXplID09IDApIHNpemUgPSAxOworICAgIHAgPSBkd2NfYWxsb2MobWVtX2N0eCwgc2l6ZSk7CisgICAgcmV0dXJuIHA7Cit9CisKKyNkZWZpbmUgc25ld24oY3R4LCBuLCB0eXBlKSAoKHR5cGUgKilzbm1hbGxvYygoY3R4KSwgKG4pLCBzaXplb2YodHlwZSkpKQorI2RlZmluZSBzZnJlZSBkd2NfZnJlZQorCisvKgorICogVXNhZ2Ugbm90ZXM6CisgKiAgKiBEbyBub3QgY2FsbCB0aGUgRElWTU9EX1dPUkQgbWFjcm8gd2l0aCBleHByZXNzaW9ucyBzdWNoIGFzIGFycmF5CisgKiAgICBzdWJzY3JpcHRzLCBhcyBzb21lIGltcGxlbWVudGF0aW9ucyBvYmplY3QgdG8gdGhpcyAoc2VlIGJlbG93KS4KKyAqICAqIE5vdGUgdGhhdCBub25lIG9mIHRoZSBkaXZpc2lvbiBtZXRob2RzIGJlbG93IHdpbGwgY29wZSBpZiB0aGUKKyAqICAgIHF1b3RpZW50IHdvbid0IGZpdCBpbnRvIEJJR05VTV9JTlRfQklUUy4gQ2FsbGVycyBzaG91bGQgYmUgY2FyZWZ1bAorICogICAgdG8gYXZvaWQgdGhpcyBjYXNlLgorICogICAgSWYgdGhpcyBjb25kaXRpb24gb2NjdXJzLCBpbiB0aGUgY2FzZSBvZiB0aGUgeDg2IERJViBpbnN0cnVjdGlvbiwKKyAqICAgIGFuIG92ZXJmbG93IGV4Y2VwdGlvbiB3aWxsIG9jY3VyLCB3aGljaCAoYWNjb3JkaW5nIHRvIGEgY29ycmVzcG9uZGVudCkKKyAqICAgIHdpbGwgbWFuaWZlc3Qgb24gV2luZG93cyBhcyBzb21ldGhpbmcgbGlrZQorICogICAgICAweEMwMDAwMDk1OiBJbnRlZ2VyIG92ZXJmbG93CisgKiAgICBUaGUgQyB2YXJpYW50IHdvbid0IGdpdmUgdGhlIHJpZ2h0IGFuc3dlciwgZWl0aGVyLgorICovCisKKyNkZWZpbmUgTVVMX1dPUkQodzEsIHcyKSAoKEJpZ251bURibEludCl3MSAqIHcyKQorCisjaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBkZWZpbmVkIF9faTM4Nl9fCisjZGVmaW5lIERJVk1PRF9XT1JEKHEsIHIsIGhpLCBsbywgdykgXAorICAgIF9fYXNtX18oImRpdiAlMiIgOiBcCisJICAgICI9ZCIgKHIpLCAiPWEiIChxKSA6IFwKKwkgICAgInIiICh3KSwgImQiIChoaSksICJhIiAobG8pKQorI2Vsc2UKKyNkZWZpbmUgRElWTU9EX1dPUkQocSwgciwgaGksIGxvLCB3KSBkbyB7IFwKKyAgICBCaWdudW1EYmxJbnQgbiA9ICgoKEJpZ251bURibEludCloaSkgPDwgQklHTlVNX0lOVF9CSVRTKSB8IGxvOyBcCisgICAgcSA9IG4gLyB3OyBcCisgICAgciA9IG4gJSB3OyBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgQklHTlVNX0lOVF9CWVRFUyAoQklHTlVNX0lOVF9CSVRTIC8gOCkKKworI2RlZmluZSBCSUdOVU1fSU5URVJOQUwKKworc3RhdGljIEJpZ251bSBuZXdibih2b2lkICptZW1fY3R4LCBpbnQgbGVuZ3RoKQoreworICAgIEJpZ251bSBiID0gc25ld24obWVtX2N0eCwgbGVuZ3RoICsgMSwgQmlnbnVtSW50KTsKKyAgICAvL2lmICghYikKKyAgICAvL2Fib3J0KCk7CQkgICAgICAgLyogRklYTUUgKi8KKyAgICBEV0NfTUVNU0VUKGIsIDAsIChsZW5ndGggKyAxKSAqIHNpemVvZigqYikpOworICAgIGJbMF0gPSBsZW5ndGg7CisgICAgcmV0dXJuIGI7Cit9CisKK3ZvaWQgZnJlZWJuKHZvaWQgKm1lbV9jdHgsIEJpZ251bSBiKQoreworICAgIC8qCisgICAgICogQnVybiB0aGUgZXZpZGVuY2UsIGp1c3QgaW4gY2FzZS4KKyAgICAgKi8KKyAgICBEV0NfTUVNU0VUKGIsIDAsIHNpemVvZihiWzBdKSAqIChiWzBdICsgMSkpOworICAgIHNmcmVlKG1lbV9jdHgsIGIpOworfQorCisvKgorICogQ29tcHV0ZSBjID0gYSAqIGIuCisgKiBJbnB1dCBpcyBpbiB0aGUgZmlyc3QgbGVuIHdvcmRzIG9mIGEgYW5kIGIuCisgKiBSZXN1bHQgaXMgcmV0dXJuZWQgaW4gdGhlIGZpcnN0IDIqbGVuIHdvcmRzIG9mIGMuCisgKi8KK3N0YXRpYyB2b2lkIGludGVybmFsX211bChCaWdudW1JbnQgKmEsIEJpZ251bUludCAqYiwKKwkJCSBCaWdudW1JbnQgKmMsIGludCBsZW4pCit7CisgICAgaW50IGksIGo7CisgICAgQmlnbnVtRGJsSW50IHQ7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMiAqIGxlbjsgaisrKQorCWNbal0gPSAwOworCisgICAgZm9yIChpID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwl0ID0gMDsKKwlmb3IgKGogPSBsZW4gLSAxOyBqID49IDA7IGotLSkgeworCSAgICB0ICs9IE1VTF9XT1JEKGFbaV0sIChCaWdudW1EYmxJbnQpIGJbal0pOworCSAgICB0ICs9IChCaWdudW1EYmxJbnQpIGNbaSArIGogKyAxXTsKKwkgICAgY1tpICsgaiArIDFdID0gKEJpZ251bUludCkgdDsKKwkgICAgdCA9IHQgPj4gQklHTlVNX0lOVF9CSVRTOworCX0KKwljW2ldID0gKEJpZ251bUludCkgdDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGludGVybmFsX2FkZF9zaGlmdGVkKEJpZ251bUludCAqbnVtYmVyLAorCQkJCSB1bnNpZ25lZCBuLCBpbnQgc2hpZnQpCit7CisgICAgaW50IHdvcmQgPSAxICsgKHNoaWZ0IC8gQklHTlVNX0lOVF9CSVRTKTsKKyAgICBpbnQgYnNoaWZ0ID0gc2hpZnQgJSBCSUdOVU1fSU5UX0JJVFM7CisgICAgQmlnbnVtRGJsSW50IGFkZGVuZDsKKworICAgIGFkZGVuZCA9IChCaWdudW1EYmxJbnQpbiA8PCBic2hpZnQ7CisKKyAgICB3aGlsZSAoYWRkZW5kKSB7CisJYWRkZW5kICs9IG51bWJlclt3b3JkXTsKKwludW1iZXJbd29yZF0gPSAoQmlnbnVtSW50KSBhZGRlbmQgJiBCSUdOVU1fSU5UX01BU0s7CisJYWRkZW5kID4+PSBCSUdOVU1fSU5UX0JJVFM7CisJd29yZCsrOworICAgIH0KK30KKworLyoKKyAqIENvbXB1dGUgYSA9IGEgJSBtLgorICogSW5wdXQgaW4gZmlyc3QgYWxlbiB3b3JkcyBvZiBhIGFuZCBmaXJzdCBtbGVuIHdvcmRzIG9mIG0uCisgKiBPdXRwdXQgaW4gZmlyc3QgYWxlbiB3b3JkcyBvZiBhCisgKiAob2Ygd2hpY2ggZmlyc3QgYWxlbi1tbGVuIHdvcmRzIHdpbGwgYmUgemVybykuCisgKiBUaGUgTVNXIG9mIG0gTVVTVCBoYXZlIGl0cyBoaWdoIGJpdCBzZXQuCisgKiBRdW90aWVudCBpcyBhY2N1bXVsYXRlZCBpbiB0aGUgYHF1b3RpZW50JyBhcnJheSwgd2hpY2ggaXMgYSBCaWdudW0KKyAqIHJhdGhlciB0aGFuIHRoZSBpbnRlcm5hbCBiaWdlbmRpYW4gZm9ybWF0LiBRdW90aWVudCBwYXJ0cyBhcmUgc2hpZnRlZAorICogbGVmdCBieSBgcXNoaWZ0JyBiZWZvcmUgYWRkaW5nIGludG8gcXVvdC4KKyAqLworc3RhdGljIHZvaWQgaW50ZXJuYWxfbW9kKEJpZ251bUludCAqYSwgaW50IGFsZW4sCisJCQkgQmlnbnVtSW50ICptLCBpbnQgbWxlbiwKKwkJCSBCaWdudW1JbnQgKnF1b3QsIGludCBxc2hpZnQpCit7CisgICAgQmlnbnVtSW50IG0wLCBtMTsKKyAgICB1bnNpZ25lZCBpbnQgaDsKKyAgICBpbnQgaSwgazsKKworICAgIG0wID0gbVswXTsKKyAgICBpZiAobWxlbiA+IDEpCisJbTEgPSBtWzFdOworICAgIGVsc2UKKwltMSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGFsZW4gLSBtbGVuOyBpKyspIHsKKwlCaWdudW1EYmxJbnQgdDsKKwl1bnNpZ25lZCBpbnQgcSwgciwgYywgYWkxOworCisJaWYgKGkgPT0gMCkgeworCSAgICBoID0gMDsKKwl9IGVsc2UgeworCSAgICBoID0gYVtpIC0gMV07CisJICAgIGFbaSAtIDFdID0gMDsKKwl9CisKKwlpZiAoaSA9PSBhbGVuIC0gMSkKKwkgICAgYWkxID0gMDsKKwllbHNlCisJICAgIGFpMSA9IGFbaSArIDFdOworCisJLyogRmluZCBxID0gaDphW2ldIC8gbTAgKi8KKwlpZiAoaCA+PSBtMCkgeworCSAgICAvKgorCSAgICAgKiBTcGVjaWFsIGNhc2UuCisJICAgICAqIAorCSAgICAgKiBUbyBpbGx1c3RyYXRlIGl0LCBzdXBwb3NlIGEgQmlnbnVtSW50IGlzIDggYml0cywgYW5kCisJICAgICAqIHdlIGFyZSBkaXZpZGluZyAoc2F5KSBBMToyMzo0NTo2NyBieSBBMTpCMjpDMy4gVGhlbgorCSAgICAgKiBvdXIgaW5pdGlhbCBkaXZpc2lvbiB3aWxsIGJlIDB4QTEyMyAvIDB4QTEsIHdoaWNoCisJICAgICAqIHdpbGwgZ2l2ZSBhIHF1b3RpZW50IG9mIDB4MTAwIGFuZCBhIGRpdmlkZSBvdmVyZmxvdy4KKwkgICAgICogSG93ZXZlciwgdGhlIGludmFyaWFudHMgaW4gdGhpcyBkaXZpc2lvbiBhbGdvcml0aG0KKwkgICAgICogYXJlIG5vdCB2aW9sYXRlZCwgc2luY2UgdGhlIGZ1bGwgbnVtYmVyIEExOjIzOi4uLiBpcworCSAgICAgKiBfbGVzc18gdGhhbiB0aGUgcXVvdGllbnQgcHJlZml4IEExOkIyOi4uLiBhbmQgc28gdGhlCisJICAgICAqIGZvbGxvd2luZyBjb3JyZWN0aW9uIGxvb3Agd291bGQgaGF2ZSBzb3J0ZWQgaXQgb3V0LgorCSAgICAgKiAKKwkgICAgICogSW4gdGhpcyBzaXR1YXRpb24gd2Ugc2V0IHEgdG8gYmUgdGhlIGxhcmdlc3QKKwkgICAgICogcXVvdGllbnQgd2UgX2Nhbl8gc3RvbWFjaCAoMHhGRiwgb2YgY291cnNlKS4KKwkgICAgICovCisJICAgIHEgPSBCSUdOVU1fSU5UX01BU0s7CisJfSBlbHNlIHsKKwkgICAgLyogTWFjcm8gZG9lc24ndCB3YW50IGFuIGFycmF5IHN1YnNjcmlwdCBleHByZXNzaW9uIHBhc3NlZAorCSAgICAgKiBpbnRvIGl0IChzZWUgZGVmaW5pdGlvbiksIHNvIHVzZSBhIHRlbXBvcmFyeS4gKi8KKwkgICAgQmlnbnVtSW50IHRtcGxvID0gYVtpXTsKKwkgICAgRElWTU9EX1dPUkQocSwgciwgaCwgdG1wbG8sIG0wKTsKKworCSAgICAvKiBSZWZpbmUgb3VyIGVzdGltYXRlIG9mIHEgYnkgbG9va2luZyBhdAorCSAgICAgaDphW2ldOmFbaSsxXSAvIG0wOm0xICovCisJICAgIHQgPSBNVUxfV09SRChtMSwgcSk7CisJICAgIGlmICh0ID4gKChCaWdudW1EYmxJbnQpIHIgPDwgQklHTlVNX0lOVF9CSVRTKSArIGFpMSkgeworCQlxLS07CisJCXQgLT0gbTE7CisJCXIgPSAociArIG0wKSAmIEJJR05VTV9JTlRfTUFTSzsgICAgIC8qIG92ZXJmbG93PyAqLworCQlpZiAociA+PSAoQmlnbnVtRGJsSW50KSBtMCAmJgorCQkgICAgdCA+ICgoQmlnbnVtRGJsSW50KSByIDw8IEJJR05VTV9JTlRfQklUUykgKyBhaTEpIHEtLTsKKwkgICAgfQorCX0KKworCS8qIFN1YnRyYWN0IHEgKiBtIGZyb20gYVtpLi4uXSAqLworCWMgPSAwOworCWZvciAoayA9IG1sZW4gLSAxOyBrID49IDA7IGstLSkgeworCSAgICB0ID0gTVVMX1dPUkQocSwgbVtrXSk7CisJICAgIHQgKz0gYzsKKwkgICAgYyA9ICh1bnNpZ25lZCkodCA+PiBCSUdOVU1fSU5UX0JJVFMpOworCSAgICBpZiAoKEJpZ251bUludCkgdCA+IGFbaSArIGtdKQorCQljKys7CisJICAgIGFbaSArIGtdIC09IChCaWdudW1JbnQpIHQ7CisJfQorCisJLyogQWRkIGJhY2sgbSBpbiBjYXNlIG9mIGJvcnJvdyAqLworCWlmIChjICE9IGgpIHsKKwkgICAgdCA9IDA7CisJICAgIGZvciAoayA9IG1sZW4gLSAxOyBrID49IDA7IGstLSkgeworCQl0ICs9IG1ba107CisJCXQgKz0gYVtpICsga107CisJCWFbaSArIGtdID0gKEJpZ251bUludCkgdDsKKwkJdCA9IHQgPj4gQklHTlVNX0lOVF9CSVRTOworCSAgICB9CisJICAgIHEtLTsKKwl9CisJaWYgKHF1b3QpCisJICAgIGludGVybmFsX2FkZF9zaGlmdGVkKHF1b3QsIHEsIHFzaGlmdCArIEJJR05VTV9JTlRfQklUUyAqIChhbGVuIC0gbWxlbiAtIGkpKTsKKyAgICB9Cit9CisKKy8qCisgKiBDb21wdXRlIHAgJSBtb2QuCisgKiBUaGUgbW9zdCBzaWduaWZpY2FudCB3b3JkIG9mIG1vZCBNVVNUIGJlIG5vbi16ZXJvLgorICogV2UgYXNzdW1lIHRoYXQgdGhlIHJlc3VsdCBhcnJheSBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBtb2QgYXJyYXkuCisgKiBXZSBvcHRpb25hbGx5IHdyaXRlIG91dCBhIHF1b3RpZW50IGlmIGBxdW90aWVudCcgaXMgbm9uLU5VTEwuCisgKiBXZSBjYW4gYXZvaWQgd3JpdGluZyBvdXQgdGhlIHJlc3VsdCBpZiBgcmVzdWx0JyBpcyBOVUxMLgorICovCit2b2lkIGJpZ2Rpdm1vZCh2b2lkICptZW1fY3R4LCBCaWdudW0gcCwgQmlnbnVtIG1vZCwgQmlnbnVtIHJlc3VsdCwgQmlnbnVtIHF1b3RpZW50KQoreworICAgIEJpZ251bUludCAqbiwgKm07CisgICAgaW50IG1zaGlmdDsKKyAgICBpbnQgcGxlbiwgbWxlbiwgaSwgajsKKworICAgIC8qIEFsbG9jYXRlIG0gb2Ygc2l6ZSBtbGVuLCBjb3B5IG1vZCB0byBtICovCisgICAgLyogV2UgdXNlIGJpZyBlbmRpYW4gaW50ZXJuYWxseSAqLworICAgIG1sZW4gPSBtb2RbMF07CisgICAgbSA9IHNuZXduKG1lbV9jdHgsIG1sZW4sIEJpZ251bUludCk7CisgICAgLy9pZiAoIW0pCisgICAgLy9hYm9ydCgpOwkJICAgICAgIC8qIEZJWE1FICovCisgICAgZm9yIChqID0gMDsgaiA8IG1sZW47IGorKykKKwltW2pdID0gbW9kW21vZFswXSAtIGpdOworCisgICAgLyogU2hpZnQgbSBsZWZ0IHRvIG1ha2UgbXNiIGJpdCBzZXQgKi8KKyAgICBmb3IgKG1zaGlmdCA9IDA7IG1zaGlmdCA8IEJJR05VTV9JTlRfQklUUy0xOyBtc2hpZnQrKykKKwlpZiAoKG1bMF0gPDwgbXNoaWZ0KSAmIEJJR05VTV9UT1BfQklUKQorCSAgICBicmVhazsKKyAgICBpZiAobXNoaWZ0KSB7CisJZm9yIChpID0gMDsgaSA8IG1sZW4gLSAxOyBpKyspCisJICAgIG1baV0gPSAobVtpXSA8PCBtc2hpZnQpIHwgKG1baSArIDFdID4+IChCSUdOVU1fSU5UX0JJVFMgLSBtc2hpZnQpKTsKKwltW21sZW4gLSAxXSA9IG1bbWxlbiAtIDFdIDw8IG1zaGlmdDsKKyAgICB9CisKKyAgICBwbGVuID0gcFswXTsKKyAgICAvKiBFbnN1cmUgcGxlbiA+IG1sZW4gKi8KKyAgICBpZiAocGxlbiA8PSBtbGVuKQorCXBsZW4gPSBtbGVuICsgMTsKKworICAgIC8qIEFsbG9jYXRlIG4gb2Ygc2l6ZSBwbGVuLCBjb3B5IHAgdG8gbiAqLworICAgIG4gPSBzbmV3bihtZW1fY3R4LCBwbGVuLCBCaWdudW1JbnQpOworICAgIC8vaWYgKCFuKQorICAgIC8vYWJvcnQoKTsJCSAgICAgICAvKiBGSVhNRSAqLworICAgIGZvciAoaiA9IDA7IGogPCBwbGVuOyBqKyspCisJbltqXSA9IDA7CisgICAgZm9yIChqID0gMTsgaiA8PSAoaW50KXBbMF07IGorKykKKwluW3BsZW4gLSBqXSA9IHBbal07CisKKyAgICAvKiBNYWluIGNvbXB1dGF0aW9uICovCisgICAgaW50ZXJuYWxfbW9kKG4sIHBsZW4sIG0sIG1sZW4sIHF1b3RpZW50LCBtc2hpZnQpOworCisgICAgLyogRml4dXAgcmVzdWx0IGluIGNhc2UgdGhlIG1vZHVsdXMgd2FzIHNoaWZ0ZWQgKi8KKyAgICBpZiAobXNoaWZ0KSB7CisJZm9yIChpID0gcGxlbiAtIG1sZW4gLSAxOyBpIDwgcGxlbiAtIDE7IGkrKykKKwkgICAgbltpXSA9IChuW2ldIDw8IG1zaGlmdCkgfCAobltpICsgMV0gPj4gKEJJR05VTV9JTlRfQklUUyAtIG1zaGlmdCkpOworCW5bcGxlbiAtIDFdID0gbltwbGVuIC0gMV0gPDwgbXNoaWZ0OworCWludGVybmFsX21vZChuLCBwbGVuLCBtLCBtbGVuLCBxdW90aWVudCwgMCk7CisJZm9yIChpID0gcGxlbiAtIDE7IGkgPj0gcGxlbiAtIG1sZW47IGktLSkKKwkgICAgbltpXSA9IChuW2ldID4+IG1zaGlmdCkgfCAobltpIC0gMV0gPDwgKEJJR05VTV9JTlRfQklUUyAtIG1zaGlmdCkpOworICAgIH0KKworICAgIC8qIENvcHkgcmVzdWx0IHRvIGJ1ZmZlciAqLworICAgIGlmIChyZXN1bHQpIHsKKwlmb3IgKGkgPSAxOyBpIDw9IChpbnQpcmVzdWx0WzBdOyBpKyspIHsKKwkgICAgaW50IGogPSBwbGVuIC0gaTsKKwkgICAgcmVzdWx0W2ldID0gaiA+PSAwID8gbltqXSA6IDA7CisJfQorICAgIH0KKworICAgIC8qIEZyZWUgdGVtcG9yYXJ5IGFycmF5cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBtbGVuOyBpKyspCisJbVtpXSA9IDA7CisgICAgc2ZyZWUobWVtX2N0eCwgbSk7CisgICAgZm9yIChpID0gMDsgaSA8IHBsZW47IGkrKykKKwluW2ldID0gMDsKKyAgICBzZnJlZShtZW1fY3R4LCBuKTsKK30KKworLyoKKyAqIFNpbXBsZSByZW1haW5kZXIuCisgKi8KK0JpZ251bSBiaWdtb2Qodm9pZCAqbWVtX2N0eCwgQmlnbnVtIGEsIEJpZ251bSBiKQoreworICAgIEJpZ251bSByID0gbmV3Ym4obWVtX2N0eCwgYlswXSk7CisgICAgYmlnZGl2bW9kKG1lbV9jdHgsIGEsIGIsIHIsIE5VTEwpOworICAgIHJldHVybiByOworfQorCisvKgorICogQ29tcHV0ZSAoYmFzZSBeIGV4cCkgJSBtb2QuCisgKi8KK0JpZ251bSBkd2NfbW9kcG93KHZvaWQgKm1lbV9jdHgsIEJpZ251bSBiYXNlX2luLCBCaWdudW0gZXhwLCBCaWdudW0gbW9kKQoreworICAgIEJpZ251bUludCAqYSwgKmIsICpuLCAqbTsKKyAgICBpbnQgbXNoaWZ0OworICAgIGludCBtbGVuLCBpLCBqOworICAgIEJpZ251bSBiYXNlLCByZXN1bHQ7CisKKyAgICAvKgorICAgICAqIFRoZSBtb3N0IHNpZ25pZmljYW50IHdvcmQgb2YgbW9kIG5lZWRzIHRvIGJlIG5vbi16ZXJvLiBJdAorICAgICAqIHNob3VsZCBhbHJlYWR5IGJlLCBidXQgbGV0J3MgbWFrZSBzdXJlLgorICAgICAqLworICAgIC8vYXNzZXJ0KG1vZFttb2RbMF1dICE9IDApOworCisgICAgLyoKKyAgICAgKiBNYWtlIHN1cmUgdGhlIGJhc2UgaXMgc21hbGxlciB0aGFuIHRoZSBtb2R1bHVzLCBieSByZWR1Y2luZworICAgICAqIGl0IG1vZHVsbyB0aGUgbW9kdWx1cyBpZiBub3QuCisgICAgICovCisgICAgYmFzZSA9IGJpZ21vZChtZW1fY3R4LCBiYXNlX2luLCBtb2QpOworCisgICAgLyogQWxsb2NhdGUgbSBvZiBzaXplIG1sZW4sIGNvcHkgbW9kIHRvIG0gKi8KKyAgICAvKiBXZSB1c2UgYmlnIGVuZGlhbiBpbnRlcm5hbGx5ICovCisgICAgbWxlbiA9IG1vZFswXTsKKyAgICBtID0gc25ld24obWVtX2N0eCwgbWxlbiwgQmlnbnVtSW50KTsKKyAgICAvL2lmICghbSkKKyAgICAvL2Fib3J0KCk7CQkgICAgICAgLyogRklYTUUgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgbWxlbjsgaisrKQorCW1bal0gPSBtb2RbbW9kWzBdIC0gal07CisKKyAgICAvKiBTaGlmdCBtIGxlZnQgdG8gbWFrZSBtc2IgYml0IHNldCAqLworICAgIGZvciAobXNoaWZ0ID0gMDsgbXNoaWZ0IDwgQklHTlVNX0lOVF9CSVRTIC0gMTsgbXNoaWZ0KyspCisJaWYgKChtWzBdIDw8IG1zaGlmdCkgJiBCSUdOVU1fVE9QX0JJVCkKKwkgICAgYnJlYWs7CisgICAgaWYgKG1zaGlmdCkgeworCWZvciAoaSA9IDA7IGkgPCBtbGVuIC0gMTsgaSsrKQorCSAgICBtW2ldID0KKwkJKG1baV0gPDwgbXNoaWZ0KSB8IChtW2kgKyAxXSA+PgorCQkJCSAgICAoQklHTlVNX0lOVF9CSVRTIC0gbXNoaWZ0KSk7CisJbVttbGVuIC0gMV0gPSBtW21sZW4gLSAxXSA8PCBtc2hpZnQ7CisgICAgfQorCisgICAgLyogQWxsb2NhdGUgbiBvZiBzaXplIG1sZW4sIGNvcHkgYmFzZSB0byBuICovCisgICAgbiA9IHNuZXduKG1lbV9jdHgsIG1sZW4sIEJpZ251bUludCk7CisgICAgLy9pZiAoIW4pCisgICAgLy9hYm9ydCgpOwkJICAgICAgIC8qIEZJWE1FICovCisgICAgaSA9IG1sZW4gLSBiYXNlWzBdOworICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJbltqXSA9IDA7CisgICAgZm9yIChqID0gMDsgaiA8IGJhc2VbMF07IGorKykKKwluW2kgKyBqXSA9IGJhc2VbYmFzZVswXSAtIGpdOworCisgICAgLyogQWxsb2NhdGUgYSBhbmQgYiBvZiBzaXplIDIqbWxlbi4gU2V0IGEgPSAxICovCisgICAgYSA9IHNuZXduKG1lbV9jdHgsIDIgKiBtbGVuLCBCaWdudW1JbnQpOworICAgIC8vaWYgKCFhKQorICAgIC8vYWJvcnQoKTsJCSAgICAgICAvKiBGSVhNRSAqLworICAgIGIgPSBzbmV3bihtZW1fY3R4LCAyICogbWxlbiwgQmlnbnVtSW50KTsKKyAgICAvL2lmICghYikKKyAgICAvL2Fib3J0KCk7CQkgICAgICAgLyogRklYTUUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIG1sZW47IGkrKykKKwlhW2ldID0gMDsKKyAgICBhWzIgKiBtbGVuIC0gMV0gPSAxOworCisgICAgLyogU2tpcCBsZWFkaW5nIHplcm8gYml0cyBvZiBleHAuICovCisgICAgaSA9IDA7CisgICAgaiA9IEJJR05VTV9JTlRfQklUUyAtIDE7CisgICAgd2hpbGUgKGkgPCBleHBbMF0gJiYgKGV4cFtleHBbMF0gLSBpXSAmICgxIDw8IGopKSA9PSAwKSB7CisJai0tOworCWlmIChqIDwgMCkgeworCSAgICBpKys7CisJICAgIGogPSBCSUdOVU1fSU5UX0JJVFMgLSAxOworCX0KKyAgICB9CisKKyAgICAvKiBNYWluIGNvbXB1dGF0aW9uICovCisgICAgd2hpbGUgKGkgPCBleHBbMF0pIHsKKwl3aGlsZSAoaiA+PSAwKSB7CisJICAgIGludGVybmFsX211bChhICsgbWxlbiwgYSArIG1sZW4sIGIsIG1sZW4pOworCSAgICBpbnRlcm5hbF9tb2QoYiwgbWxlbiAqIDIsIG0sIG1sZW4sIE5VTEwsIDApOworCSAgICBpZiAoKGV4cFtleHBbMF0gLSBpXSAmICgxIDw8IGopKSAhPSAwKSB7CisJCWludGVybmFsX211bChiICsgbWxlbiwgbiwgYSwgbWxlbik7CisJCWludGVybmFsX21vZChhLCBtbGVuICogMiwgbSwgbWxlbiwgTlVMTCwgMCk7CisJICAgIH0gZWxzZSB7CisJCUJpZ251bUludCAqdDsKKwkJdCA9IGE7CisJCWEgPSBiOworCQliID0gdDsKKwkgICAgfQorCSAgICBqLS07CisJfQorCWkrKzsKKwlqID0gQklHTlVNX0lOVF9CSVRTIC0gMTsKKyAgICB9CisKKyAgICAvKiBGaXh1cCByZXN1bHQgaW4gY2FzZSB0aGUgbW9kdWx1cyB3YXMgc2hpZnRlZCAqLworICAgIGlmIChtc2hpZnQpIHsKKwlmb3IgKGkgPSBtbGVuIC0gMTsgaSA8IDIgKiBtbGVuIC0gMTsgaSsrKQorCSAgICBhW2ldID0KKwkJKGFbaV0gPDwgbXNoaWZ0KSB8IChhW2kgKyAxXSA+PgorCQkJCSAgICAoQklHTlVNX0lOVF9CSVRTIC0gbXNoaWZ0KSk7CisJYVsyICogbWxlbiAtIDFdID0gYVsyICogbWxlbiAtIDFdIDw8IG1zaGlmdDsKKwlpbnRlcm5hbF9tb2QoYSwgbWxlbiAqIDIsIG0sIG1sZW4sIE5VTEwsIDApOworCWZvciAoaSA9IDIgKiBtbGVuIC0gMTsgaSA+PSBtbGVuOyBpLS0pCisJICAgIGFbaV0gPQorCQkoYVtpXSA+PiBtc2hpZnQpIHwgKGFbaSAtIDFdIDw8CisJCQkJICAgIChCSUdOVU1fSU5UX0JJVFMgLSBtc2hpZnQpKTsKKyAgICB9CisKKyAgICAvKiBDb3B5IHJlc3VsdCB0byBidWZmZXIgKi8KKyAgICByZXN1bHQgPSBuZXdibihtZW1fY3R4LCBtb2RbMF0pOworICAgIGZvciAoaSA9IDA7IGkgPCBtbGVuOyBpKyspCisJcmVzdWx0W3Jlc3VsdFswXSAtIGldID0gYVtpICsgbWxlbl07CisgICAgd2hpbGUgKHJlc3VsdFswXSA+IDEgJiYgcmVzdWx0W3Jlc3VsdFswXV0gPT0gMCkKKwlyZXN1bHRbMF0tLTsKKworICAgIC8qIEZyZWUgdGVtcG9yYXJ5IGFycmF5cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyICogbWxlbjsgaSsrKQorCWFbaV0gPSAwOworICAgIHNmcmVlKG1lbV9jdHgsIGEpOworICAgIGZvciAoaSA9IDA7IGkgPCAyICogbWxlbjsgaSsrKQorCWJbaV0gPSAwOworICAgIHNmcmVlKG1lbV9jdHgsIGIpOworICAgIGZvciAoaSA9IDA7IGkgPCBtbGVuOyBpKyspCisJbVtpXSA9IDA7CisgICAgc2ZyZWUobWVtX2N0eCwgbSk7CisgICAgZm9yIChpID0gMDsgaSA8IG1sZW47IGkrKykKKwluW2ldID0gMDsKKyAgICBzZnJlZShtZW1fY3R4LCBuKTsKKworICAgIGZyZWVibihtZW1fY3R4LCBiYXNlKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworI2lmZGVmIFVOSVRURVNUCisKK3N0YXRpYyBfX3UzMiBkaF9wW10gPSB7CisJOTYsCisJMHhGRkZGRkZGRiwKKwkweEZGRkZGRkZGLAorCTB4QTkzQUQyQ0EsCisJMHg0QjgyRDEyMCwKKwkweEUwRkQxMDhFLAorCTB4NDNEQjVCRkMsCisJMHg3NEU1QUIzMSwKKwkweDA4RTI0RkEwLAorCTB4QkFEOTQ2RTIsCisJMHg3NzA5ODhDMCwKKwkweDdBNjE1RDZDLAorCTB4QkJFMTE3NTcsCisJMHgxNzdCMjAwQywKKwkweDUyMUYyQjE4LAorCTB4M0VDODZBNjQsCisJMHhEODc2MDI3MywKKwkweEQ5OEEwODY0LAorCTB4RjEyRkZBMDYsCisJMHgxQUQyRUU2QiwKKwkweENFRTNEMjI2LAorCTB4NEEyNTYxOUQsCisJMHgxRThDOTRFMCwKKwkweERCMDkzM0Q3LAorCTB4QUJGNUFFOEMsCisJMHhBNkUxRTRDNywKKwkweEIzOTcwRjg1LAorCTB4NUQwNjBDN0QsCisJMHg4QUVBNzE1NywKKwkweDU4REJFRjBBLAorCTB4RUNGQjg1MDQsCisJMHhERjFDQkE2NCwKKwkweEE4NTUyMUFCLAorCTB4MDQ1MDdBMzMsCisJMHhBRDMzMTcwRCwKKwkweDhBQUFDNDJELAorCTB4MTU3MjhFNUEsCisJMHg5OEZBMDUxMCwKKwkweDE1RDIyNjE4LAorCTB4RUE5NTZBRTUsCisJMHgzOTk1NDk3QywKKwkweDk1NTgxNzE4LAorCTB4REUyQkNCRjYsCisJMHg2RjRDNTJDOSwKKwkweEI1QzU1REYwLAorCTB4RUMwN0EyOEYsCisJMHg5QjI3ODNBMiwKKwkweDE4MEU4NjAzLAorCTB4RTM5RTc3MkMsCisJMHgyRTM2Q0UzQiwKKwkweDMyOTA1RTQ2LAorCTB4Q0ExODIxN0MsCisJMHhGMTc0NkMwOCwKKwkweDRBQkM5ODA0LAorCTB4NjcwQzM1NEUsCisJMHg3MDk2OTY2RCwKKwkweDlFRDUyOTA3LAorCTB4MjA4NTUyQkIsCisJMHgxQzYyRjM1NiwKKwkweERDQTNBRDk2LAorCTB4ODM2NTVEMjMsCisJMHhGRDI0Q0Y1RiwKKwkweDY5MTYzRkE4LAorCTB4MUM1NUQzOUEsCisJMHg5OERBNDgzNiwKKwkweEExNjNCRjA1LAorCTB4QzIwMDdDQjgsCisJMHhFQ0U0NUIzRCwKKwkweDQ5Mjg2NjUxLAorCTB4N0M0QjFGRTYsCisJMHhBRTlGMjQxMSwKKwkweDVBODk5RkE1LAorCTB4RUUzODZCRkIsCisJMHhGNDA2QjdFRCwKKwkweDBCRkY1Q0I2LAorCTB4QTYzN0VENkIsCisJMHhGNDRDNDJFOSwKKwkweDYyNUU3RUM2LAorCTB4RTQ4NUI1NzYsCisJMHg2RDUxQzI0NSwKKwkweDRGRTEzNTZELAorCTB4RjI1RjE0MzcsCisJMHgzMDJCMEE2RCwKKwkweENEM0E0MzFCLAorCTB4RUY5NTE5QjMsCisJMHg4RTM0MDRERCwKKwkweDUxNEEwODc5LAorCTB4M0IxMzlCMjIsCisJMHgwMjBCQkVBNiwKKwkweDhBNjdDQzc0LAorCTB4MjkwMjRFMDgsCisJMHg4MERDMUNEMSwKKwkweEM0QzY2MjhCLAorCTB4MjE2OEMyMzQsCisJMHhDOTBGREFBMiwKKwkweEZGRkZGRkZGLAorCTB4RkZGRkZGRkYsCit9OworCitzdGF0aWMgX191MzIgZGhfYVtdID0geworCTgsCisJMHhkZjM2NzUxNiwKKwkweDg2NDU5Y2FhLAorCTB4ZTJkNDU5YTQsCisJMHhkOTEwZGFlMCwKKwkweDhhOGI1ZTM3LAorCTB4NjdhYjMxYzYsCisJMHhmMGI1NWVhOSwKKwkweDQ0MDA1MWQ2LAorfTsKKworc3RhdGljIF9fdTMyIGRoX2JbXSA9IHsKKwk4LAorCTB4ZGVkOTI2NTYsCisJMHhlMDdhMDQ4YSwKKwkweDZmYTQ1MmNkLAorCTB4MmRmODlkMzAsCisJMHhjNzVmMWIwZiwKKwkweDhjZTM1NzhmLCAKKwkweDc5ODBhMzI0LAorCTB4NWRhZWM3ODYsCit9OworCitzdGF0aWMgX191MzIgZGhfZ1tdID0geworCTEsCisJMiwKK307CisKK2ludCBtYWluKHZvaWQpCit7CisJaW50IGk7CisJX191MzIgKms7CisJayA9IGR3Y19tb2Rwb3coTlVMTCwgZGhfZywgZGhfYSwgZGhfcCk7CisKKwlwcmludGYoIlxuXG4iKTsKKwlmb3IgKGk9MDsgaTxrWzBdOyBpKyspIHsKKwkJX191MzIgd29yZDMyID0ga1trWzBdIC0gaV07CisJCV9fdTE2IGwgPSB3b3JkMzIgJiAweGZmZmY7CisJCV9fdTE2IG0gPSAod29yZDMyICYgMHhmZmZmMDAwMCkgPj4gMTY7CisJCXByaW50ZigiJTA0eCAlMDR4ICIsIG0sIGwpOworCQlpZiAoISgoaSArIDEpJTEzKSkgcHJpbnRmKCJcbiIpOworCX0KKwlwcmludGYoIlxuXG4iKTsKKworCWlmICgoa1swXSA9PSAweDYwKSAmJiAoa1sxXSA9PSAweDI4ZTQ5MGU1KSAmJiAoa1sweDYwXSA9PSAweDVhMGQzZDRlKSkgeworCQlwcmludGYoIlBBU1NcblxuIik7CisJfQorCWVsc2UgeworCQlwcmludGYoIkZBSUxcblxuIik7CisJfQorCit9CisKKyNlbmRpZiAvKiBVTklUVEVTVCAqLworCisjZW5kaWYgLyogQ09ORklHX01BQ0hfSVBNQVRFICovCisKKyNlbmRpZiAvKkRXQ19DUllQVE9MSUIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX21vZHBvdy5oIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2NfbW9kcG93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmMDBjMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX21vZHBvdy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBkd2NfbW9kcG93LmgKKyAqIFNlZSBkd2NfbW9kcG93LmMgZm9yIGxpY2Vuc2UgYW5kIGNoYW5nZXMKKyAqLworI2lmbmRlZiBfRFdDX01PRFBPV19ICisjZGVmaW5lIF9EV0NfTU9EUE9XX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAiZHdjX29zLmgiCisKKy8qKiBAZmlsZQorICoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBtb2R1bGUgZXhwb25lbnRpYXRpb24gZnVuY3Rpb24gd2hpY2ggaXMgb25seSB1c2VkCisgKiBpbnRlcm5hbGx5IGJ5IHRoZSBEV0MgVVdCIG1vZHVsZXMgZm9yIGNhbGN1bGF0aW9uIG9mIFBLcyBkdXJpbmcgbnVtZXJpYworICogYXNzb2NpYXRpb24uICBUaGUgcm91dGluZSBpcyB0YWtlbiBmcm9tIHRoZSBQVVRUWSwgYW4gb3BlbiBzb3VyY2UgdGVybWluYWwKKyAqIGVtdWxhdG9yLiAgVGhlIFBVVFRZIExpY2Vuc2UgaXMgcHJlc2VydmVkIGluIHRoZSBkd2NfbW9kcG93LmMgZmlsZS4KKyAqCisgKi8KKwordHlwZWRlZiB1aW50MzJfdCBCaWdudW1JbnQ7Cit0eXBlZGVmIHVpbnQ2NF90IEJpZ251bURibEludDsKK3R5cGVkZWYgQmlnbnVtSW50ICpCaWdudW07CisKKy8qIENvbXB1dGUgbW9kdWxhciBleHBvbmVudGlhaW9uICovCitleHRlcm4gQmlnbnVtIGR3Y19tb2Rwb3codm9pZCAqbWVtX2N0eCwgQmlnbnVtIGJhc2VfaW4sIEJpZ251bSBleHAsIEJpZ251bSBtb2QpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0xJTlVYX0JJR05VTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19ub3RpZmllci5jIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfbm90aWZpZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2RhZGNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfbm90aWZpZXIuYwpAQCAtMCwwICsxLDMxOSBAQAorI2lmZGVmIERXQ19OT1RJRllMSUIKKworI2luY2x1ZGUgImR3Y19ub3RpZmllci5oIgorI2luY2x1ZGUgImR3Y19saXN0LmgiCisKK3R5cGVkZWYgc3RydWN0IGR3Y19vYnNlcnZlciB7CisJdm9pZCAqb2JzZXJ2ZXI7CisJZHdjX25vdGlmaWVyX2NhbGxiYWNrX3QgY2FsbGJhY2s7CisJdm9pZCAqZGF0YTsKKwljaGFyICpub3RpZmljYXRpb247CisJRFdDX0NJUkNMRVFfRU5UUlkoZHdjX29ic2VydmVyKSBsaXN0X2VudHJ5OworfSBvYnNlcnZlcl90OworCitEV0NfQ0lSQ0xFUV9IRUFEKG9ic2VydmVyX3F1ZXVlLCBkd2Nfb2JzZXJ2ZXIpOworCit0eXBlZGVmIHN0cnVjdCBkd2Nfbm90aWZpZXIgeworCXZvaWQgKm1lbV9jdHg7CisJdm9pZCAqb2JqZWN0OworCXN0cnVjdCBvYnNlcnZlcl9xdWV1ZSBvYnNlcnZlcnM7CisJRFdDX0NJUkNMRVFfRU5UUlkoZHdjX25vdGlmaWVyKSBsaXN0X2VudHJ5OworfSBub3RpZmllcl90OworCitEV0NfQ0lSQ0xFUV9IRUFEKG5vdGlmaWVyX3F1ZXVlLCBkd2Nfbm90aWZpZXIpOworCit0eXBlZGVmIHN0cnVjdCBtYW5hZ2VyIHsKKwl2b2lkICptZW1fY3R4OworCXZvaWQgKndrcV9jdHg7CisJZHdjX3dvcmtxX3QgKndxOworLy8JZHdjX211dGV4X3QgKm11dGV4OworCXN0cnVjdCBub3RpZmllcl9xdWV1ZSBub3RpZmllcnM7Cit9IG1hbmFnZXJfdDsKKworc3RhdGljIG1hbmFnZXJfdCAqbWFuYWdlciA9IE5VTEw7CisKK3N0YXRpYyBpbnQgY3JlYXRlX21hbmFnZXIodm9pZCAqbWVtX2N0eCwgdm9pZCAqd2txX2N0eCkKK3sKKwltYW5hZ2VyID0gZHdjX2FsbG9jKG1lbV9jdHgsIHNpemVvZihtYW5hZ2VyX3QpKTsKKwlpZiAoIW1hbmFnZXIpIHsKKwkJcmV0dXJuIC1EV0NfRV9OT19NRU1PUlk7CisJfQorCisJRFdDX0NJUkNMRVFfSU5JVCgmbWFuYWdlci0+bm90aWZpZXJzKTsKKworCW1hbmFnZXItPndxID0gZHdjX3dvcmtxX2FsbG9jKHdrcV9jdHgsICJEV0MgTm90aWZpY2F0aW9uIFdvcmtRIik7CisJaWYgKCFtYW5hZ2VyLT53cSkgeworCQlyZXR1cm4gLURXQ19FX05PX01FTU9SWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9tYW5hZ2VyKHZvaWQpCit7CisJZHdjX3dvcmtxX2ZyZWUobWFuYWdlci0+d3EpOworCisJLyogQWxsIG5vdGlmaWVycyBtdXN0IGhhdmUgdW5yZWdpc3RlcmVkIHRoZW1zZWx2ZXMgYmVmb3JlIHRoaXMgbW9kdWxlCisJICogY2FuIGJlIHJlbW92ZWQuICBIaXR0aW5nIHRoaXMgYXNzZXJ0aW9uIGluZGljYXRlcyBhIHByb2dyYW1tZXIKKwkgKiBlcnJvci4gKi8KKwlEV0NfQVNTRVJUKERXQ19DSVJDTEVRX0VNUFRZKCZtYW5hZ2VyLT5ub3RpZmllcnMpLAorCQkgICAiTm90aWZpY2F0aW9uIG1hbmFnZXIgYmVpbmcgZnJlZWQgYmVmb3JlIGFsbCBub3RpZmllcnMgaGF2ZSBiZWVuIHJlbW92ZWQiKTsKKwlkd2NfZnJlZShtYW5hZ2VyLT5tZW1fY3R4LCBtYW5hZ2VyKTsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBkdW1wX21hbmFnZXIodm9pZCkKK3sKKwlub3RpZmllcl90ICpuOworCW9ic2VydmVyX3QgKm87CisKKwlEV0NfQVNTRVJUKG1hbmFnZXIsICJOb3RpZmljYXRpb24gbWFuYWdlciBub3QgZm91bmQiKTsKKworCURXQ19ERUJVRygiTGlzdCBvZiBhbGwgbm90aWZpZXJzIGFuZCBvYnNlcnZlcnM6XG4iKTsKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIKG4sICZtYW5hZ2VyLT5ub3RpZmllcnMsIGxpc3RfZW50cnkpIHsKKwkJRFdDX0RFQlVHKCJOb3RpZmllciAlcCBoYXMgb2JzZXJ2ZXJzOlxuIiwgbi0+b2JqZWN0KTsKKwkJRFdDX0NJUkNMRVFfRk9SRUFDSChvLCAmbi0+b2JzZXJ2ZXJzLCBsaXN0X2VudHJ5KSB7CisJCQlEV0NfREVCVUcoIiAgICAlcCB3YXRjaGluZyAlc1xuIiwgby0+b2JzZXJ2ZXIsIG8tPm5vdGlmaWNhdGlvbik7CisJCX0KKwl9Cit9CisjZWxzZQorI2RlZmluZSBkdW1wX21hbmFnZXIoLi4uKQorI2VuZGlmCisKK3N0YXRpYyBvYnNlcnZlcl90ICphbGxvY19vYnNlcnZlcih2b2lkICptZW1fY3R4LCB2b2lkICpvYnNlcnZlciwgY2hhciAqbm90aWZpY2F0aW9uLAorCQkJCSAgZHdjX25vdGlmaWVyX2NhbGxiYWNrX3QgY2FsbGJhY2ssIHZvaWQgKmRhdGEpCit7CisJb2JzZXJ2ZXJfdCAqbmV3X29ic2VydmVyID0gZHdjX2FsbG9jKG1lbV9jdHgsIHNpemVvZihvYnNlcnZlcl90KSk7CisKKwlpZiAoIW5ld19vYnNlcnZlcikgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlEV0NfQ0lSQ0xFUV9JTklUX0VOVFJZKG5ld19vYnNlcnZlciwgbGlzdF9lbnRyeSk7CisJbmV3X29ic2VydmVyLT5vYnNlcnZlciA9IG9ic2VydmVyOworCW5ld19vYnNlcnZlci0+bm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOworCW5ld19vYnNlcnZlci0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKwluZXdfb2JzZXJ2ZXItPmRhdGEgPSBkYXRhOworCXJldHVybiBuZXdfb2JzZXJ2ZXI7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfb2JzZXJ2ZXIodm9pZCAqbWVtX2N0eCwgb2JzZXJ2ZXJfdCAqb2JzZXJ2ZXIpCit7CisJZHdjX2ZyZWUobWVtX2N0eCwgb2JzZXJ2ZXIpOworfQorCitzdGF0aWMgbm90aWZpZXJfdCAqYWxsb2Nfbm90aWZpZXIodm9pZCAqbWVtX2N0eCwgdm9pZCAqb2JqZWN0KQoreworCW5vdGlmaWVyX3QgKm5vdGlmaWVyOworCisJaWYgKCFvYmplY3QpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbm90aWZpZXIgPSBkd2NfYWxsb2MobWVtX2N0eCwgc2l6ZW9mKG5vdGlmaWVyX3QpKTsKKwlpZiAoIW5vdGlmaWVyKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCURXQ19DSVJDTEVRX0lOSVQoJm5vdGlmaWVyLT5vYnNlcnZlcnMpOworCURXQ19DSVJDTEVRX0lOSVRfRU5UUlkobm90aWZpZXIsIGxpc3RfZW50cnkpOworCisJbm90aWZpZXItPm1lbV9jdHggPSBtZW1fY3R4OworCW5vdGlmaWVyLT5vYmplY3QgPSBvYmplY3Q7CisJcmV0dXJuIG5vdGlmaWVyOworfQorCitzdGF0aWMgdm9pZCBmcmVlX25vdGlmaWVyKG5vdGlmaWVyX3QgKm5vdGlmaWVyKQoreworCW9ic2VydmVyX3QgKm9ic2VydmVyOworCisJRFdDX0NJUkNMRVFfRk9SRUFDSChvYnNlcnZlciwgJm5vdGlmaWVyLT5vYnNlcnZlcnMsIGxpc3RfZW50cnkpIHsKKwkJZnJlZV9vYnNlcnZlcihub3RpZmllci0+bWVtX2N0eCwgb2JzZXJ2ZXIpOworCX0KKworCWR3Y19mcmVlKG5vdGlmaWVyLT5tZW1fY3R4LCBub3RpZmllcik7Cit9CisKK3N0YXRpYyBub3RpZmllcl90ICpmaW5kX25vdGlmaWVyKHZvaWQgKm9iamVjdCkKK3sKKwlub3RpZmllcl90ICpub3RpZmllcjsKKworCURXQ19BU1NFUlQobWFuYWdlciwgIk5vdGlmaWNhdGlvbiBtYW5hZ2VyIG5vdCBmb3VuZCIpOworCisJaWYgKCFvYmplY3QpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJRFdDX0NJUkNMRVFfRk9SRUFDSChub3RpZmllciwgJm1hbmFnZXItPm5vdGlmaWVycywgbGlzdF9lbnRyeSkgeworCQlpZiAobm90aWZpZXItPm9iamVjdCA9PSBvYmplY3QpIHsKKwkJCXJldHVybiBub3RpZmllcjsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgZHdjX2FsbG9jX25vdGlmaWNhdGlvbl9tYW5hZ2VyKHZvaWQgKm1lbV9jdHgsIHZvaWQgKndrcV9jdHgpCit7CisJcmV0dXJuIGNyZWF0ZV9tYW5hZ2VyKG1lbV9jdHgsIHdrcV9jdHgpOworfQorCit2b2lkIGR3Y19mcmVlX25vdGlmaWNhdGlvbl9tYW5hZ2VyKHZvaWQpCit7CisJZnJlZV9tYW5hZ2VyKCk7Cit9CisKK2R3Y19ub3RpZmllcl90ICpkd2NfcmVnaXN0ZXJfbm90aWZpZXIodm9pZCAqbWVtX2N0eCwgdm9pZCAqb2JqZWN0KQoreworCW5vdGlmaWVyX3QgKm5vdGlmaWVyOworCisJRFdDX0FTU0VSVChtYW5hZ2VyLCAiTm90aWZpY2F0aW9uIG1hbmFnZXIgbm90IGZvdW5kIik7CisKKwlub3RpZmllciA9IGZpbmRfbm90aWZpZXIob2JqZWN0KTsKKwlpZiAobm90aWZpZXIpIHsKKwkJRFdDX0VSUk9SKCJOb3RpZmllciAlcCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIsIG9iamVjdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCW5vdGlmaWVyID0gYWxsb2Nfbm90aWZpZXIobWVtX2N0eCwgb2JqZWN0KTsKKwlpZiAoIW5vdGlmaWVyKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCURXQ19DSVJDTEVRX0lOU0VSVF9UQUlMKCZtYW5hZ2VyLT5ub3RpZmllcnMsIG5vdGlmaWVyLCBsaXN0X2VudHJ5KTsKKworCURXQ19JTkZPKCJOb3RpZmllciAlcCByZWdpc3RlcmVkIiwgb2JqZWN0KTsKKwlkdW1wX21hbmFnZXIoKTsKKworCXJldHVybiBub3RpZmllcjsKK30KKwordm9pZCBkd2NfdW5yZWdpc3Rlcl9ub3RpZmllcihkd2Nfbm90aWZpZXJfdCAqbm90aWZpZXIpCit7CisJRFdDX0FTU0VSVChtYW5hZ2VyLCAiTm90aWZpY2F0aW9uIG1hbmFnZXIgbm90IGZvdW5kIik7CisKKwlpZiAoIURXQ19DSVJDTEVRX0VNUFRZKCZub3RpZmllci0+b2JzZXJ2ZXJzKSkgeworCQlvYnNlcnZlcl90ICpvOworCisJCURXQ19FUlJPUigiTm90aWZpZXIgJXAgaGFzIGFjdGl2ZSBvYnNlcnZlcnMgd2hlbiByZW1vdmluZ1xuIiwgbm90aWZpZXItPm9iamVjdCk7CisJCURXQ19DSVJDTEVRX0ZPUkVBQ0gobywgJm5vdGlmaWVyLT5vYnNlcnZlcnMsIGxpc3RfZW50cnkpIHsKKwkJCURXQ19ERUJVRygiICAgICVwIHdhdGNoaW5nICVzXG4iLCBvLT5vYnNlcnZlciwgby0+bm90aWZpY2F0aW9uKTsKKwkJfQorCisJCURXQ19BU1NFUlQoRFdDX0NJUkNMRVFfRU1QVFkoJm5vdGlmaWVyLT5vYnNlcnZlcnMpLAorCQkJICAgIk5vdGlmaWVyICVwIGhhcyBhY3RpdmUgb2JzZXJ2ZXJzIHdoZW4gcmVtb3ZpbmciLCBub3RpZmllcik7CisJfQorCisJRFdDX0NJUkNMRVFfUkVNT1ZFX0lOSVQoJm1hbmFnZXItPm5vdGlmaWVycywgbm90aWZpZXIsIGxpc3RfZW50cnkpOworCWZyZWVfbm90aWZpZXIobm90aWZpZXIpOworCisJRFdDX0lORk8oIk5vdGlmaWVyIHVucmVnaXN0ZXJlZCIpOworCWR1bXBfbWFuYWdlcigpOworfQorCisvKiBBZGQgYW4gb2JzZXJ2ZXIgdG8gb2JzZXJ2ZSB0aGUgbm90aWZpZXIgZm9yIGEgcGFydGljdWxhciBzdGF0ZSwgZXZlbnQsIG9yIG5vdGlmaWNhdGlvbi4gKi8KK2ludCBkd2NfYWRkX29ic2VydmVyKHZvaWQgKm9ic2VydmVyLCB2b2lkICpvYmplY3QsIGNoYXIgKm5vdGlmaWNhdGlvbiwKKwkJICAgICBkd2Nfbm90aWZpZXJfY2FsbGJhY2tfdCBjYWxsYmFjaywgdm9pZCAqZGF0YSkKK3sKKwlub3RpZmllcl90ICpub3RpZmllciA9IGZpbmRfbm90aWZpZXIob2JqZWN0KTsKKwlvYnNlcnZlcl90ICpuZXdfb2JzZXJ2ZXI7CisKKwlpZiAoIW5vdGlmaWVyKSB7CisJCURXQ19FUlJPUigiTm90aWZpZXIgJXAgaXMgbm90IGZvdW5kIHdoZW4gYWRkaW5nIG9ic2VydmVyXG4iLCBvYmplY3QpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJbmV3X29ic2VydmVyID0gYWxsb2Nfb2JzZXJ2ZXIobm90aWZpZXItPm1lbV9jdHgsIG9ic2VydmVyLCBub3RpZmljYXRpb24sIGNhbGxiYWNrLCBkYXRhKTsKKwlpZiAoIW5ld19vYnNlcnZlcikgeworCQlyZXR1cm4gLURXQ19FX05PX01FTU9SWTsKKwl9CisKKwlEV0NfQ0lSQ0xFUV9JTlNFUlRfVEFJTCgmbm90aWZpZXItPm9ic2VydmVycywgbmV3X29ic2VydmVyLCBsaXN0X2VudHJ5KTsKKworCURXQ19JTkZPKCJBZGRlZCBvYnNlcnZlciAlcCB0byBub3RpZmllciAlcCBvYnNlcnZpbmcgbm90aWZpY2F0aW9uICVzLCBjYWxsYmFjaz0lcCwgZGF0YT0lcCIsCisJCSBvYnNlcnZlciwgb2JqZWN0LCBub3RpZmljYXRpb24sIGNhbGxiYWNrLCBkYXRhKTsKKworCWR1bXBfbWFuYWdlcigpOworCXJldHVybiAwOworfQorCitpbnQgZHdjX3JlbW92ZV9vYnNlcnZlcih2b2lkICpvYnNlcnZlcikKK3sKKwlub3RpZmllcl90ICpuOworCisJRFdDX0FTU0VSVChtYW5hZ2VyLCAiTm90aWZpY2F0aW9uIG1hbmFnZXIgbm90IGZvdW5kIik7CisKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIKG4sICZtYW5hZ2VyLT5ub3RpZmllcnMsIGxpc3RfZW50cnkpIHsKKwkJb2JzZXJ2ZXJfdCAqbzsKKwkJb2JzZXJ2ZXJfdCAqbzI7CisKKwkJRFdDX0NJUkNMRVFfRk9SRUFDSF9TQUZFKG8sIG8yLCAmbi0+b2JzZXJ2ZXJzLCBsaXN0X2VudHJ5KSB7CisJCQlpZiAoby0+b2JzZXJ2ZXIgPT0gb2JzZXJ2ZXIpIHsKKwkJCQlEV0NfQ0lSQ0xFUV9SRU1PVkVfSU5JVCgmbi0+b2JzZXJ2ZXJzLCBvLCBsaXN0X2VudHJ5KTsKKwkJCQlEV0NfSU5GTygiUmVtb3Zpbmcgb2JzZXJ2ZXIgJXAgZnJvbSBub3RpZmllciAlcCB3YXRjaGluZyBub3RpZmljYXRpb24gJXM6IiwKKwkJCQkJIG8tPm9ic2VydmVyLCBuLT5vYmplY3QsIG8tPm5vdGlmaWNhdGlvbik7CisJCQkJZnJlZV9vYnNlcnZlcihuLT5tZW1fY3R4LCBvKTsKKwkJCX0KKwkJfQorCX0KKworCWR1bXBfbWFuYWdlcigpOworCXJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBjYWxsYmFja19kYXRhIHsKKwl2b2lkICptZW1fY3R4OworCWR3Y19ub3RpZmllcl9jYWxsYmFja190IGNiOworCXZvaWQgKm9ic2VydmVyOworCXZvaWQgKmRhdGE7CisJdm9pZCAqb2JqZWN0OworCWNoYXIgKm5vdGlmaWNhdGlvbjsKKwl2b2lkICpub3RpZmljYXRpb25fZGF0YTsKK30gY2JfZGF0YV90OworCitzdGF0aWMgdm9pZCBjYl90YXNrKHZvaWQgKmRhdGEpCit7CisJY2JfZGF0YV90ICpjYiA9IChjYl9kYXRhX3QgKilkYXRhOworCisJY2ItPmNiKGNiLT5vYmplY3QsIGNiLT5ub3RpZmljYXRpb24sIGNiLT5vYnNlcnZlciwgY2ItPm5vdGlmaWNhdGlvbl9kYXRhLCBjYi0+ZGF0YSk7CisJZHdjX2ZyZWUoY2ItPm1lbV9jdHgsIGNiKTsKK30KKwordm9pZCBkd2Nfbm90aWZ5KGR3Y19ub3RpZmllcl90ICpub3RpZmllciwgY2hhciAqbm90aWZpY2F0aW9uLCB2b2lkICpub3RpZmljYXRpb25fZGF0YSkKK3sKKwlvYnNlcnZlcl90ICpvOworCisJRFdDX0FTU0VSVChtYW5hZ2VyLCAiTm90aWZpY2F0aW9uIG1hbmFnZXIgbm90IGZvdW5kIik7CisKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIKG8sICZub3RpZmllci0+b2JzZXJ2ZXJzLCBsaXN0X2VudHJ5KSB7CisJCWludCBsZW4gPSBEV0NfU1RSTEVOKG5vdGlmaWNhdGlvbik7CisKKwkJaWYgKERXQ19TVFJMRU4oby0+bm90aWZpY2F0aW9uKSAhPSBsZW4pIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKERXQ19TVFJOQ01QKG8tPm5vdGlmaWNhdGlvbiwgbm90aWZpY2F0aW9uLCBsZW4pID09IDApIHsKKwkJCWNiX2RhdGFfdCAqY2JfZGF0YSA9IGR3Y19hbGxvYyhub3RpZmllci0+bWVtX2N0eCwgc2l6ZW9mKGNiX2RhdGFfdCkpOworCisJCQlpZiAoIWNiX2RhdGEpIHsKKwkJCQlEV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBjYWxsYmFjayBkYXRhXG4iKTsKKwkJCQlyZXR1cm47CisJCQl9CisKKwkJCWNiX2RhdGEtPm1lbV9jdHggPSBub3RpZmllci0+bWVtX2N0eDsKKwkJCWNiX2RhdGEtPmNiID0gby0+Y2FsbGJhY2s7CisJCQljYl9kYXRhLT5vYnNlcnZlciA9IG8tPm9ic2VydmVyOworCQkJY2JfZGF0YS0+ZGF0YSA9IG8tPmRhdGE7CisJCQljYl9kYXRhLT5vYmplY3QgPSBub3RpZmllci0+b2JqZWN0OworCQkJY2JfZGF0YS0+bm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOworCQkJY2JfZGF0YS0+bm90aWZpY2F0aW9uX2RhdGEgPSBub3RpZmljYXRpb25fZGF0YTsKKwkJCURXQ19ERUJVRygiT2JzZXJ2ZXIgZm91bmQgJXAgZm9yIG5vdGlmaWNhdGlvbiAlc1xuIiwgby0+b2JzZXJ2ZXIsIG5vdGlmaWNhdGlvbik7CisJCQlEV0NfV09SS1FfU0NIRURVTEUobWFuYWdlci0+d3EsIGNiX3Rhc2ssIGNiX2RhdGEsCisJCQkJCSAgICJOb3RpZnkgY2FsbGJhY2sgZnJvbSAlcCBmb3IgTm90aWZpY2F0aW9uICVzLCB0byBvYnNlcnZlciAlcCIsCisJCQkJCSAgIGNiX2RhdGEtPm9iamVjdCwgbm90aWZpY2F0aW9uLCBjYl9kYXRhLT5vYnNlcnZlcik7CisJCX0KKwl9Cit9CisKKyNlbmRpZgkvKiBEV0NfTk9USUZZTElCICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19ub3RpZmllci5oIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfbm90aWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YThjZGZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfbm90aWZpZXIuaApAQCAtMCwwICsxLDEyMiBAQAorCisjaWZuZGVmIF9fRFdDX05PVElGSUVSX0hfXworI2RlZmluZSBfX0RXQ19OT1RJRklFUl9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAiZHdjX29zLmgiCisKKy8qKiBAZmlsZQorICoKKyAqIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBPYnNlcnZlciBwYXR0ZXJuLiAgQW55ICJtb2R1bGUiIGNhbgorICogcmVnaXN0ZXIgYXMgYW4gb2JzZXJ2ZXIgb3Igbm90aWZpZXIuICBUaGUgbm90aW9uIG9mICJtb2R1bGUiIGlzIGFic3RyYWN0IGFuZAorICogY2FuIG1lYW4gYW55dGhpbmcgdXNlZCB0byBpZGVudGlmeSBlaXRoZXIgYW4gb2JzZXJ2ZXIgb3Igbm90aWZpZXIuICBVc3VhbGx5CisgKiBpdCB3aWxsIGJlIGEgcG9pbnRlciB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIHNvbWUgc3RhdGUsIGllIGFuCisgKiBvYmplY3QuCisgKgorICogQmVmb3JlIGFueSBub3RpZmllcnMgY2FuIGJlIGFkZGVkLCB0aGUgZ2xvYmFsIG5vdGlmaWNhdGlvbiBtYW5hZ2VyIG11c3QgYmUKKyAqIGJyb3VnaHQgdXAgd2l0aCBkd2NfYWxsb2Nfbm90aWZpY2F0aW9uX21hbmFnZXIoKS4KKyAqIGR3Y19mcmVlX25vdGlmaWNhdGlvbl9tYW5hZ2VyKCkgd2lsbCBicmluZyBpdCBkb3duIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMuCisgKiBUaGVzZSB3b3VsZCB0eXBpY2FsbHkgYmUgY2FsbGVkIHVwb24gbW9kdWxlIGxvYWQgYW5kIHVubG9hZC4gIFRoZQorICogbm90aWZpY2F0aW9uIG1hbmFnZXIgaXMgYSBzaW5nbGUgZ2xvYmFsIGluc3RhbmNlIHRoYXQgaGFuZGxlcyBhbGwgcmVnaXN0ZXJlZAorICogb2JzZXJ2YWJsZSBtb2R1bGVzIGFuZCBvYnNlcnZlcnMgc28gdGhpcyBzaG91bGQgYmUgZG9uZSBvbmx5IG9uY2UuCisgKgorICogQSBtb2R1bGUgY2FuIGJlIG9ic2VydmFibGUgYnkgdXNpbmcgTm90aWZpY2F0aW9ucyB0byBwdWJsaWNpemUgc29tZSBnZW5lcmFsCisgKiBpbmZvcm1hdGlvbiBhYm91dCBpdCdzIHN0YXRlIG9yIG9wZXJhdGlvbi4gIEl0IGRvZXMgbm90IGNhcmUgd2hvIGxpc3RlbnMsIG9yCisgKiBldmVuIGlmIGFueW9uZSBsaXN0ZW5zLCBvciB3aGF0IHRoZXkgZG8gd2l0aCB0aGUgaW5mb3JtYXRpb24uICBUaGUgb2JzZXJ2YWJsZQorICogbW9kdWxlcyBkbyBub3QgbmVlZCB0byBrbm93IGFueSBpbmZvcm1hdGlvbiBhYm91dCBpdCdzIG9ic2VydmVycyBvciB0aGVpcgorICogaW50ZXJmYWNlLCBvciB0aGVpciBzdGF0ZSBvciBkYXRhLgorICoKKyAqIEFueSBtb2R1bGUgY2FuIHJlZ2lzdGVyIHRvIGVtaXQgTm90aWZpY2F0aW9ucy4gIEl0IHNob3VsZCBwdWJsaXNoIGEgbGlzdCBvZgorICogbm90aWZpY2F0aW9ucyB0aGF0IGl0IGNhbiBlbWl0IGFuZCB0aGVpciBiZWhhdmlvciwgc3VjaCBhcyB3aGVuIHRoZXkgd2lsbCBnZXQKKyAqIHRyaWdnZXJlZCwgYW5kIHdoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBwcm92aWRlZCB0byB0aGUgb2JzZXJ2ZXIuICBUaGVuIGl0CisgKiBzaG91bGQgcmVnaXN0ZXIgaXRzZWxmIGFzIGFuIG9ic2VydmFibGUgbW9kdWxlLiBTZWUgZHdjX3JlZ2lzdGVyX25vdGlmaWVyKCkuCisgKgorICogQW55IG1vZHVsZSBjYW4gb2JzZXJ2ZSBhbnkgb2JzZXJ2YWJsZSwgcmVnaXN0ZXJlZCBtb2R1bGUsIHByb3ZpZGVkIGl0IGhhcyBhCisgKiBoYW5kbGUgdG8gdGhlIG90aGVyIG1vZHVsZSBhbmQga25vd3Mgd2hhdCBub3RpZmljYXRpb25zIHRvIG9ic2VydmUuICBTZWUKKyAqIGR3Y19hZGRfb2JzZXJ2ZXIoKS4KKyAqCisgKiBBIGZ1bmN0aW9uIG9mIHR5cGUgZHdjX25vdGlmaWVyX2NhbGxiYWNrX3QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbm90aWZpY2F0aW9uCisgKiBpcyB0cmlnZ2VyZWQgd2l0aCBvbmUgb3IgbW9yZSBvYnNlcnZlcnMgb2JzZXJ2aW5nIGl0LiAgVGhpcyBmdW5jdGlvbiBpcworICogY2FsbGVkIGluIGl0J3Mgb3duIHByb2Nlc3Mgc28gaXQgbWF5IHNsZWVwIG9yIGJsb2NrIGlmIG5lZWRlZC4gIEl0IGlzCisgKiBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBzb21ldGltZSBhZnRlciB0aGUgbm90aWZpY2F0aW9uIGhhcyBvY2N1cnJlZCBhbmQgd2lsbAorICogYmUgY2FsbGVkIG9uY2UgcGVyIGVhY2ggdGltZSB0aGUgbm90aWZpY2F0aW9uIGlzIHRyaWdnZXJlZC4gIEl0IHdpbGwgTk9UIGJlCisgKiBjYWxsZWQgaW4gdGhlIHNhbWUgcHJvY2VzcyBjb250ZXh0IHVzZWQgdG8gdHJpZ2dlciB0aGUgbm90aWZpY2F0aW9uLgorICoKKyAqIEBzZWN0aW9uIExpbWl0aWF0aW9ucworICoKKyAqIEtlZXAgaW4gbWluZCB0aGF0IE5vdGlmaWNhdGlvbnMgdGhhdCBjYW4gYmUgdHJpZ2dlcmVkIGluIHJhcGlkIHN1Y2Vzc2lvbiBtYXkKKyAqIHNjaGVkdWxlIHRvbyBtYW55IHByb2Nlc3NlcyB0b28gaGFuZGxlLiAgQmUgYXdhcmUgb2YgdGhpcyBsaW1pdGF0aW9uIHdoZW4KKyAqIGRlc2lnbmluZyB0byB1c2Ugbm90aWZpY2F0aW9ucywgYW5kIG9ubHkgYWRkIG5vdGlmaWNhdGlvbnMgZm9yIGFwcHJvcHJpYXRlCisgKiBvYnNlcnZhYmxlIGluZm9ybWF0aW9uLgorICoKKyAqIEFsc28gTm90aWZpY2F0aW9uIGNhbGxiYWNrcyBhcmUgbm90IHN5bmNocm9ub3VzLiAgSWYgeW91IG5lZWQgdG8gc3luY2hyb25pemUKKyAqIHRoZSBiZWhhdmlvciBiZXR3ZWVuIG1vZHVsZS9vYnNlcnZlciB5b3UgbXVzdCB1c2Ugb3RoZXIgbWVhbnMuICBBbmQgcGVyaGFwcworICogdGhhdCB3aWxsIG1lYW4gTm90aWZpY2F0aW9ucyBhcmUgbm90IHRoZSBwcm9wZXIgc29sdXRpb24uCisgKi8KKworc3RydWN0IGR3Y19ub3RpZmllcjsKK3R5cGVkZWYgc3RydWN0IGR3Y19ub3RpZmllciBkd2Nfbm90aWZpZXJfdDsKKworLyoqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBtdXN0IGJlIG9mIHRoaXMgdHlwZS4KKyAqCisgKiBAcGFyYW0gb2JqZWN0IFRoaXMgaXMgdGhlIG9iamVjdCB0aGF0IGlzIGJlaW5nIG9ic2VydmVkLgorICogQHBhcmFtIG5vdGlmaWNhdGlvbiBUaGlzIGlzIHRoZSBub3RpZmljYXRpb24gdGhhdCB3YXMgdHJpZ2dlcmVkLgorICogQHBhcmFtIG9ic2VydmVyIFRoaXMgaXMgdGhlIG9ic2VydmVyCisgKiBAcGFyYW0gbm90aWZpY2F0aW9uX2RhdGEgVGhpcyBpcyBub3RpZmljYXRpb24tc3BlY2lmaWMgZGF0YSB0aGF0IHRoZSBub3RpZmllcgorICogaGFzIGluY2x1ZGVkIGluIHRoaXMgbm90aWZpY2F0aW9uLiAgVGhlIHZhbHVlIG9mIHRoaXMgc2hvdWxkIGJlIHB1Ymxpc2hlZCBpbgorICogdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIG9ic2VydmFibGUgbW9kdWxlIHdpdGggdGhlIG5vdGlmaWNhdGlvbnMuCisgKiBAcGFyYW0gdXNlcl9kYXRhIFRoaXMgaXMgYW55IGN1c3RvbSBkYXRhIHRoYXQgdGhlIG9ic2VydmVyIHByb3ZpZGVkIHdoZW4KKyAqIGFkZGluZyBpdHNlbGYgYXMgYW4gb2JzZXJ2ZXIgdG8gdGhlIG5vdGlmaWNhdGlvbi4gKi8KK3R5cGVkZWYgdm9pZCAoKmR3Y19ub3RpZmllcl9jYWxsYmFja190KSh2b2lkICpvYmplY3QsIGNoYXIgKm5vdGlmaWNhdGlvbiwgdm9pZCAqb2JzZXJ2ZXIsCisJCQkJCXZvaWQgKm5vdGlmaWNhdGlvbl9kYXRhLCB2b2lkICp1c2VyX2RhdGEpOworCisvKiogQnJpbmdzIHVwIHRoZSBub3RpZmljYXRpb24gbWFuYWdlci4gKi8KK2V4dGVybiBpbnQgZHdjX2FsbG9jX25vdGlmaWNhdGlvbl9tYW5hZ2VyKHZvaWQgKm1lbV9jdHgsIHZvaWQgKndrcV9jdHgpOworLyoqIEJyaW5ncyBkb3duIHRoZSBub3RpZmljYXRpb24gbWFuYWdlci4gKi8KK2V4dGVybiB2b2lkIGR3Y19mcmVlX25vdGlmaWNhdGlvbl9tYW5hZ2VyKHZvaWQpOworCisvKiogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgYW4gb2JzZXJ2YWJsZSBtb2R1bGUuICBBIGR3Y19ub3RpZmllcl90IG9iamVjdCBpcworICogcmV0dXJuZWQgdG8gdGhlIG9ic2VydmFibGUgbW9kdWxlLiAgVGhpcyBpcyBhbiBvcGFxdWUgb2JqZWN0IHRoYXQgaXMgdXNlZCBieQorICogdGhlIG9ic2VydmFibGUgbW9kdWxlIHRvIHRyaWdnZXIgbm90aWZpY2F0aW9ucy4gIFRoaXMgb2JqZWN0IHNob3VsZCBvbmx5IGJlCisgKiBhY2Nlc3NpYmxlIHRvIGZ1bmN0aW9ucyB0aGF0IGFyZSBhdXRob3JpemVkIHRvIHRyaWdnZXIgbm90aWZpY2F0aW9ucyBmb3IgdGhpcworICogbW9kdWxlLiAgT2JzZXJ2ZXJzIGRvIG5vdCBuZWVkIHRoaXMgb2JqZWN0LiAqLworZXh0ZXJuIGR3Y19ub3RpZmllcl90ICpkd2NfcmVnaXN0ZXJfbm90aWZpZXIodm9pZCAqbWVtX2N0eCwgdm9pZCAqb2JqZWN0KTsKKworLyoqIFRoaXMgZnVuY3Rpb24gdW5yZWdpc3RlcnMgYW4gb2JzZXJ2YWJsZSBtb2R1bGUuICBBbGwgb2JzZXJ2ZXJzIGhhdmUgdG8gYmUKKyAqIHJlbW92ZWQgcHJpb3IgdG8gdW5yZWdpc3RyYXRpb24uICovCitleHRlcm4gdm9pZCBkd2NfdW5yZWdpc3Rlcl9ub3RpZmllcihkd2Nfbm90aWZpZXJfdCAqbm90aWZpZXIpOworCisvKiogQWRkIGEgbW9kdWxlIGFzIGFuIG9ic2VydmVyIHRvIHRoZSBvYnNlcnZhYmxlIG1vZHVsZS4gIFRoZSBvYnNlcnZhYmxlIG1vZHVsZQorICogbmVlZHMgdG8gaGF2ZSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgbm90aWZpY2F0aW9uIG1hbmFnZXIuCisgKgorICogQHBhcmFtIG9ic2VydmVyIFRoZSBvYnNlcnZlciBtb2R1bGUKKyAqIEBwYXJhbSBvYmplY3QgVGhlIG1vZHVsZSB0byBvYnNlcnZlCisgKiBAcGFyYW0gbm90aWZpY2F0aW9uIFRoZSBub3RpZmljYXRpb24gdG8gb2JzZXJ2ZQorICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsCisgKiBAcGFyYW0gdXNlcl9kYXRhIEFueSBhZGRpdGlvbmFsIHVzZXIgZGF0YSB0byBwYXNzIGludG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCitleHRlcm4gaW50IGR3Y19hZGRfb2JzZXJ2ZXIodm9pZCAqb2JzZXJ2ZXIsIHZvaWQgKm9iamVjdCwgY2hhciAqbm90aWZpY2F0aW9uLAorCQkJICAgIGR3Y19ub3RpZmllcl9jYWxsYmFja190IGNhbGxiYWNrLCB2b2lkICp1c2VyX2RhdGEpOworCisvKiogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIG9ic2VydmVyIGZyb20gYWxsIG5vdGlmaWNhdGlvbnMgdGhhdCBpdCBpcyBjdXJyZW50bHkKKyAqIG9ic2VydmluZy4gKi8KK2V4dGVybiBpbnQgZHdjX3JlbW92ZV9vYnNlcnZlcih2b2lkICpvYnNlcnZlcik7CisKKy8qKiBUaGlzIGZ1bmN0aW9uIHRyaWdnZXJzIGEgTm90aWZpY2F0aW9uLiAgSXQgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUKKyAqIG9ic2VydmFibGUgbW9kdWxlLCBvciBhbnkgbW9kdWxlIG9yIGxpYnJhcnkgd2hpY2ggdGhlIG9ic2VydmFibGUgbW9kdWxlCisgKiBhbGxvd3MgdG8gdHJpZ2dlciBub3RpZmljYXRpb24gb24gaXQncyBiZWhhbGYuICBTdWNoIGFzIHRoZSBkd2NfY2NfdC4KKyAqCisgKiBkd2Nfbm90aWZ5IGlzIGEgbm9uLWJsb2NraW5nIGZ1bmN0aW9uLiAgQ2FsbGJhY2tzIGFyZSBzY2hlZHVsZWQgY2FsbGVkIGluCisgKiB0aGVpciBvd24gcHJvY2VzcyBjb250ZXh0IGZvciBlYWNoIHRyaWdnZXIuICBDYWxsYmFja3MgY2FuIGJlIGJsb2NraW5nLgorICogZHdjX25vdGlmeSBjYW4gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQgaWYgbmVlZGVkLgorICoKKyAqLwordm9pZCBkd2Nfbm90aWZ5KGR3Y19ub3RpZmllcl90ICpub3RpZmllciwgY2hhciAqbm90aWZpY2F0aW9uLCB2b2lkICpub3RpZmljYXRpb25fZGF0YSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0RXQ19OT1RJRklFUl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX29zLmggYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOWQ1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vcy5oCkBAIC0wLDAgKzEsMTIzNyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL2R3Y19jb21tb25fcG9ydF8yL2R3Y19vcy5oICQKKyAqICRSZXZpc2lvbjogIzE0ICQKKyAqICREYXRlOiAyMDEwLzExLzA0ICQKKyAqICRDaGFuZ2U6IDE2MjE2OTUgJAorICoKKyAqIFN5bm9wc3lzIFBvcnRhYmlsaXR5IExpYnJhcnkgU29mdHdhcmUgYW5kIGRvY3VtZW50YXRpb24KKyAqIChoZXJlaW5hZnRlciwgIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZgorICogU3lub3BzeXMsIEluYy4gdW5sZXNzIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcKKyAqIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdAorICogdW5kZXIgYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IKKyAqIExpY2Vuc2VkIFByb2R1Y3Qgd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlCisgKiBwZXJtaXR0ZWQgdG8gdXNlIGFuZCByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeQorICogZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zCisgKiBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLAorICogZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IgYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZAorICogaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbSBTeW5vcHN5cy4gSWYgeW91CisgKiBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyIGJlbG93LCB0aGVuCisgKiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIgorICogQkFTSVMgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyAqIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgX0RXQ19PU19IXworI2RlZmluZSBfRFdDX09TX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqIEBmaWxlCisgKgorICogRFdDIHBvcnRhYmlsaXR5IGxpYnJhcnksIGxvdyBsZXZlbCBvcy13cmFwcGVyIGZ1bmN0aW9ucworICoKKyAqLworCisvKiBUaGVzZSBiYXNpYyB0eXBlcyBuZWVkIHRvIGJlIGRlZmluZWQgYnkgc29tZSBPUyBoZWFkZXIgZmlsZSBvciBjdXN0b20gaGVhZGVyCisgKiBmaWxlIGZvciB5b3VyIHNwZWNpZmljIHRhcmdldCBhcmNoaXRlY3R1cmUuCisgKgorICogdWludDhfdCwgaW50OF90LCB1aW50MTZfdCwgaW50MTZfdCwgdWludDMyX3QsIGludDMyX3QsIHVpbnQ2NF90LCBpbnQ2NF90CisgKgorICogQW55IGN1c3RvbSBvciBhbHRlcm5hdGUgaGVhZGVyIGZpbGUgbXVzdCBiZSBhZGRlZCBhbmQgZW5hYmxlZCBoZXJlLgorICovCisKKyNpZmRlZiBEV0NfTElOVVgKKyMgaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyMgaWZkZWYgQ09ORklHX0RFQlVHX01VVEVYRVMKKyMgIGluY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjIGluY2x1ZGUgPHN0ZGFyZy5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERXQ19GUkVFQlNEKSB8fCBkZWZpbmVkKERXQ19ORVRCU0QpCisjIGluY2x1ZGUgPG9zX2RlcC5oPgorI2VuZGlmCisKKworLyoqIEBuYW1lIFByaW1pdGl2ZSBUeXBlcyBhbmQgVmFsdWVzICovCisKKy8qKiBXZSBkZWZpbmUgYSBib29sZWFuIHR5cGUgZm9yIGNvbnNpc3RlbmN5LiAgQ2FuIGJlIGVpdGhlciBZRVMgb3IgTk8gKi8KK3R5cGVkZWYgdWludDhfdCBkd2NfYm9vbF90OworI2RlZmluZSBZRVMgIDEKKyNkZWZpbmUgTk8gICAwCisKKyNpZmRlZiBEV0NfTElOVVgKKworLyoqIEBuYW1lIEVycm9yIENvZGVzICovCisjZGVmaW5lIERXQ19FX0lOVkFMSUQJCUVJTlZBTAorI2RlZmluZSBEV0NfRV9OT19NRU1PUlkJCUVOT01FTQorI2RlZmluZSBEV0NfRV9OT19ERVZJQ0UJCUVOT0RFVgorI2RlZmluZSBEV0NfRV9OT1RfU1VQUE9SVEVECUVPUE5PVFNVUFAKKyNkZWZpbmUgRFdDX0VfVElNRU9VVAkJRVRJTUVET1VUCisjZGVmaW5lIERXQ19FX0JVU1kJCUVCVVNZCisjZGVmaW5lIERXQ19FX0FHQUlOCQlFQUdBSU4KKyNkZWZpbmUgRFdDX0VfUkVTVEFSVAkJRVJFU1RBUlQKKyNkZWZpbmUgRFdDX0VfQUJPUlQJCUVDT05OQUJPUlRFRAorI2RlZmluZSBEV0NfRV9TSFVURE9XTgkJRVNIVVRET1dOCisjZGVmaW5lIERXQ19FX05PX0RBVEEJCUVOT0RBVEEKKyNkZWZpbmUgRFdDX0VfRElTQ09OTkVDVAlFQ09OTlJFU0VUCisjZGVmaW5lIERXQ19FX1VOS05PV04JCUVJTlZBTAorI2RlZmluZSBEV0NfRV9OT19TVFJFQU1fUkVTCUVOT1NSCisjZGVmaW5lIERXQ19FX0NPTU1VTklDQVRJT04JRUNPTU0KKyNkZWZpbmUgRFdDX0VfT1ZFUkZMT1cJCUVPVkVSRkxPVworI2RlZmluZSBEV0NfRV9QUk9UT0NPTAkJRVBST1RPCisjZGVmaW5lIERXQ19FX0lOX1BST0dSRVNTCUVJTlBST0dSRVNTCisjZGVmaW5lIERXQ19FX1BJUEUJCUVQSVBFCisjZGVmaW5lIERXQ19FX0lPCQlFSU8KKyNkZWZpbmUgRFdDX0VfTk9fU1BBQ0UJCUVOT1NQQworCisjZWxzZQorCisvKiogQG5hbWUgRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUgRFdDX0VfSU5WQUxJRAkJMTAwMQorI2RlZmluZSBEV0NfRV9OT19NRU1PUlkJCTEwMDIKKyNkZWZpbmUgRFdDX0VfTk9fREVWSUNFCQkxMDAzCisjZGVmaW5lIERXQ19FX05PVF9TVVBQT1JURUQJMTAwNAorI2RlZmluZSBEV0NfRV9USU1FT1VUCQkxMDA1CisjZGVmaW5lIERXQ19FX0JVU1kJCTEwMDYKKyNkZWZpbmUgRFdDX0VfQUdBSU4JCTEwMDcKKyNkZWZpbmUgRFdDX0VfUkVTVEFSVAkJMTAwOAorI2RlZmluZSBEV0NfRV9BQk9SVAkJMTAwOQorI2RlZmluZSBEV0NfRV9TSFVURE9XTgkJMTAxMAorI2RlZmluZSBEV0NfRV9OT19EQVRBCQkxMDExCisjZGVmaW5lIERXQ19FX0RJU0NPTk5FQ1QJMjAwMAorI2RlZmluZSBEV0NfRV9VTktOT1dOCQkzMDAwCisjZGVmaW5lIERXQ19FX05PX1NUUkVBTV9SRVMJNDAwMQorI2RlZmluZSBEV0NfRV9DT01NVU5JQ0FUSU9OCTQwMDIKKyNkZWZpbmUgRFdDX0VfT1ZFUkZMT1cJCTQwMDMKKyNkZWZpbmUgRFdDX0VfUFJPVE9DT0wJCTQwMDQKKyNkZWZpbmUgRFdDX0VfSU5fUFJPR1JFU1MJNDAwNQorI2RlZmluZSBEV0NfRV9QSVBFCQk0MDA2CisjZGVmaW5lIERXQ19FX0lPCQk0MDA3CisjZGVmaW5lIERXQ19FX05PX1NQQUNFCQk0MDA4CisKKyNlbmRpZgorCisKKy8qKiBAbmFtZSBUcmFjaW5nL0xvZ2dpbmcgRnVuY3Rpb25zCisgKgorICogVGhlc2UgZnVuY3Rpb24gcHJvdmlkZSB0aGUgY2FwYWJpbGl0eSB0byBhZGQgdHJhY2luZywgZGVidWdnaW5nLCBhbmQgZXJyb3IKKyAqIG1lc3NhZ2VzLCBhcyB3ZWxsIGV4Y2VwdGlvbnMgYXMgYXNzZXJ0aW9ucy4gIFRoZSBXVURFViB1c2VzIHRoZXNlCisgKiBleHRlbnNpdmVseS4gIFRoZXNlIGNvdWxkIGJlIGxvZ2dlZCB0byB0aGUgbWFpbiBjb25zb2xlLCB0aGUgc2VyaWFsIHBvcnQsIGFuCisgKiBpbnRlcm5hbCBidWZmZXIsIGV0Yy4gIFRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBhbHNvIGJlIG5vLW9wIGlmIHRoZXkgYXJlIHRvbworICogZXhwZW5zaXZlIG9uIHlvdXIgc3lzdGVtLiAgQnkgZGVmYXVsdCB1bmRlZmluaW5nIHRoZSBERUJVRyBtYWNybyBhbHJlYWR5CisgKiBuby1vcHMgc29tZSBvZiB0aGVzZSBmdW5jdGlvbnMuICovCisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGluIGludGVycnVwdCBjb250ZXh0LiAqLworZXh0ZXJuIGR3Y19ib29sX3QgRFdDX0lOX0lSUSh2b2lkKTsKKyNkZWZpbmUgZHdjX2luX2lycSBEV0NfSU5fSVJRCisKKy8qKiBSZXR1cm5zICJJUlEiIGlmIERXQ19JTl9JUlEgaXMgdHJ1ZS4gKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqZHdjX2lycSh2b2lkKSB7CisJcmV0dXJuIERXQ19JTl9JUlEoKSA/ICJJUlEiIDogIiI7Cit9CisKKy8qKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGluIGJvdHRvbS1oYWxmIGNvbnRleHQuICovCitleHRlcm4gZHdjX2Jvb2xfdCBEV0NfSU5fQkgodm9pZCk7CisjZGVmaW5lIGR3Y19pbl9iaCBEV0NfSU5fQkgKKworLyoqIFJldHVybnMgIkJIIiBpZiBEV0NfSU5fQkggaXMgdHJ1ZS4gKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqZHdjX2JoKHZvaWQpIHsKKwlyZXR1cm4gRFdDX0lOX0JIKCkgPyAiQkgiIDogIiI7Cit9CisKKy8qKgorICogQSB2cHJpbnRmKCkgY2xvbmUuICBKdXN0IGNhbGwgdnByaW50ZiBpZiB5b3UndmUgZ290IGl0LgorICovCitleHRlcm4gdm9pZCBEV0NfVlBSSU5URihjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7CisjZGVmaW5lIGR3Y192cHJpbnRmIERXQ19WUFJJTlRGCisKKy8qKgorICogQSB2c25wcmludGYoKSBjbG9uZS4gIEp1c3QgY2FsbCB2cHJpbnRmIGlmIHlvdSd2ZSBnb3QgaXQuCisgKi8KK2V4dGVybiBpbnQgRFdDX1ZTTlBSSU5URihjaGFyICpzdHIsIGludCBzaXplLCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncyk7CisjZGVmaW5lIGR3Y192c25wcmludGYgRFdDX1ZTTlBSSU5URgorCisvKioKKyAqIHByaW50ZigpIGNsb25lLiAgSnVzdCBjYWxsIHByaW50ZiBpZiB5b3UndmUgZ28gaXQuCisgKi8KK2V4dGVybiB2b2lkIERXQ19QUklOVEYoY2hhciAqZm9ybWF0LCAuLi4pCisvKiBUaGlzIHByb3ZpZGVzIGNvbXBpbGVyIGxldmVsIHN0YXRpYyBjaGVja2luZyBvZiB0aGUgcGFyYW1ldGVycyBpZiB5b3UncmUKKyAqIHVzaW5nIEdDQy4gKi8KKyNpZmRlZiBfX0dOVUNfXworCV9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOworI2Vsc2UKKwk7CisjZW5kaWYKKyNkZWZpbmUgZHdjX3ByaW50ZiBEV0NfUFJJTlRGCisKKy8qKgorICogc3ByaW50ZigpIGNsb25lLiAgSnVzdCBjYWxsIHNwcmludGYgaWYgeW91J3ZlIGdvdCBpdC4KKyAqLworZXh0ZXJuIGludCBEV0NfU1BSSU5URihjaGFyICpzdHJpbmcsIGNoYXIgKmZvcm1hdCwgLi4uKQorI2lmZGVmIF9fR05VQ19fCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CisjZWxzZQorCTsKKyNlbmRpZgorI2RlZmluZSBkd2Nfc3ByaW50ZiBEV0NfU1BSSU5URgorCisvKioKKyAqIHNucHJpbnRmKCkgY2xvbmUuICBKdXN0IGNhbGwgc25wcmludGYgaWYgeW91J3ZlIGdvdCBpdC4KKyAqLworZXh0ZXJuIGludCBEV0NfU05QUklOVEYoY2hhciAqc3RyaW5nLCBpbnQgc2l6ZSwgY2hhciAqZm9ybWF0LCAuLi4pCisjaWZkZWYgX19HTlVDX18KKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKKyNlbHNlCisJOworI2VuZGlmCisjZGVmaW5lIGR3Y19zbnByaW50ZiBEV0NfU05QUklOVEYKKworLyoqCisgKiBQcmludHMgYSBXQVJOSU5HIG1lc3NhZ2UuICBPbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuCisgKiB3YXJuaW5ncyBhbmQgcmVndWxhciBsb2cgbWVzc2FnZXMsIGp1c3QgcHJpbnQgaXQuICBJbmRpY2F0ZXMgdGhhdCBzb21ldGhpbmcKKyAqIG1heSBiZSB3cm9uZyB3aXRoIHRoZSBkcml2ZXIuICBXb3JrcyBsaWtlIHByaW50ZigpLgorICoKKyAqIFVzZSB0aGUgRFdDX1dBUk4gbWFjcm8gdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgorICovCitleHRlcm4gdm9pZCBfX0RXQ19XQVJOKGNoYXIgKmZvcm1hdCwgLi4uKQorI2lmZGVmIF9fR05VQ19fCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CisjZWxzZQorCTsKKyNlbmRpZgorCisvKioKKyAqIFByaW50cyBhbiBlcnJvciBtZXNzYWdlLiAgT24gc3lzdGVtcyB0aGF0IGRvbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBlcnJvcnMKKyAqIGFuZCByZWd1bGFyIGxvZyBtZXNzYWdlcywganVzdCBwcmludCBpdC4gIEluZGljYXRlcyB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nCisgKiB3aXRoIHRoZSBkcml2ZXIuICBXb3JrcyBsaWtlIHByaW50ZigpLgorICoKKyAqIFVzZSB0aGUgRFdDX0VSUk9SIG1hY3JvIHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAqLworZXh0ZXJuIHZvaWQgX19EV0NfRVJST1IoY2hhciAqZm9ybWF0LCAuLi4pCisjaWZkZWYgX19HTlVDX18KKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKKyNlbHNlCisJOworI2VuZGlmCisKKy8qKgorICogUHJpbnRzIGFuIGV4Y2VwdGlvbiBlcnJvciBtZXNzYWdlIGFuZCB0YWtlcyBzb21lIHVzZXItZGVmaW5lZCBhY3Rpb24gc3VjaCBhcworICogcHJpbnQgb3V0IGEgYmFja3RyYWNlIG9yIHRyaWdnZXIgYSBicmVha3BvaW50LiAgSW5kaWNhdGVzIHRoYXQgc29tZXRoaW5nIHdlbnQKKyAqIGFibm9ybWFsbHkgd3Jvbmcgd2l0aCB0aGUgZHJpdmVyIHN1Y2ggYXMgcHJvZ3JhbW1lciBlcnJvciwgb3Igb3RoZXIKKyAqIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbi4gIEl0IHNob3VsZCBub3QgYmUgaWdub3JlZCBzbyBldmVuIG9uIHN5c3RlbXMgd2l0aG91dAorICogcHJpbnRpbmcgY2FwYWJpbGl0eSwgc29tZSBhY3Rpb24gc2hvdWxkIGJlIHRha2VuIHRvIG5vdGlmeSB0aGUgZGV2ZWxvcGVyIG9mCisgKiBpdC4gIFdvcmtzIGxpa2UgcHJpbnRmKCkuCisgKi8KK2V4dGVybiB2b2lkIERXQ19FWENFUFRJT04oY2hhciAqZm9ybWF0LCAuLi4pCisjaWZkZWYgX19HTlVDX18KKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKKyNlbHNlCisJOworI2VuZGlmCisjZGVmaW5lIGR3Y19leGNlcHRpb24gRFdDX0VYQ0VQVElPTgorCisjaWZkZWYgREVCVUcKKy8qKgorICogUHJpbnRzIG91dCBhIGRlYnVnIG1lc3NhZ2UuICBVc2VkIGZvciBsb2dnaW5nL3RyYWNlIG1lc3NhZ2VzLgorICoKKyAqIFVzZSB0aGUgRFdDX0RFQlVHIG1hY3JvIHRvIGNhbGwgdGhpcyBmdW5jdGlvbgorICovCitleHRlcm4gdm9pZCBfX0RXQ19ERUJVRyhjaGFyICpmb3JtYXQsIC4uLikKKyNpZmRlZiBfX0dOVUNfXworCV9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOworI2Vsc2UKKwk7CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIF9fRFdDX0RFQlVHKC4uLikKKyNlbmRpZgorCisvKioKKyAqIFByaW50cyBvdXQgYSBEZWJ1ZyBtZXNzYWdlLgorICovCisjZGVmaW5lIERXQ19ERUJVRyhfZm9ybWF0LCBfYXJncy4uLikgX19EV0NfREVCVUcoIkRFQlVHOiVzOiVzOiAiIF9mb3JtYXQgIlxuIiwgXAorCQkJCQkJIF9fZnVuY19fLCBkd2NfaXJxKCksICMjIF9hcmdzKQorI2RlZmluZSBkd2NfZGVidWcgRFdDX0RFQlVHCisvKioKKyAqIFByaW50cyBvdXQgYW4gaW5mb3JtYXRpdmUgbWVzc2FnZS4KKyAqLworI2RlZmluZSBEV0NfSU5GTyhfZm9ybWF0LCBfYXJncy4uLikgRFdDX1BSSU5URigiSU5GTzolczogIiBfZm9ybWF0ICJcbiIsIFwKKwkJCQkJICAgICAgIGR3Y19pcnEoKSwgIyMgX2FyZ3MpCisjZGVmaW5lIGR3Y19pbmZvIERXQ19JTkZPCisvKioKKyAqIFByaW50cyBvdXQgYSB3YXJuaW5nIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgRFdDX1dBUk4oX2Zvcm1hdCwgX2FyZ3MuLi4pIF9fRFdDX1dBUk4oIldBUk46JXM6JXM6JWQ6ICIgX2Zvcm1hdCAiXG4iLCBcCisJCQkJCWR3Y19pcnEoKSwgX19mdW5jX18sIF9fTElORV9fLCAjIyBfYXJncykKKyNkZWZpbmUgZHdjX3dhcm4gRFdDX1dBUk4KKy8qKgorICogUHJpbnRzIG91dCBhbiBlcnJvciBtZXNzYWdlLgorICovCisjZGVmaW5lIERXQ19FUlJPUihfZm9ybWF0LCBfYXJncy4uLikgX19EV0NfRVJST1IoIkVSUk9SOiVzOiVzOiVkOiAiIF9mb3JtYXQgIlxuIiwgXAorCQkJCQlkd2NfaXJxKCksIF9fZnVuY19fLCBfX0xJTkVfXywgIyMgX2FyZ3MpCisjZGVmaW5lIGR3Y19lcnJvciBEV0NfRVJST1IKKworI2RlZmluZSBEV0NfUFJPVE9fRVJST1IoX2Zvcm1hdCwgX2FyZ3MuLi4pIF9fRFdDX1dBUk4oIkVSUk9SOiVzOiVzOiVkOiAiIF9mb3JtYXQgIlxuIiwgXAorCQkJCQkJZHdjX2lycSgpLCBfX2Z1bmNfXywgX19MSU5FX18sICMjIF9hcmdzKQorI2RlZmluZSBkd2NfcHJvdG9fZXJyb3IgRFdDX1BST1RPX0VSUk9SCisKKyNpZmRlZiBERUJVRworLyoqIFByaW50cyBvdXQgYSBleGNlcHRpb24gZXJyb3IgbWVzc2FnZSBpZiB0aGUgX2V4cHIgZXhwcmVzc2lvbiBmYWlscy4gIERpc2FibGVkCisgKiBpZiBERUJVRyBpcyBub3QgZW5hYmxlZC4gKi8KKyNkZWZpbmUgRFdDX0FTU0VSVChfZXhwciwgX2Zvcm1hdCwgX2FyZ3MuLi4pIGRvIHsgXAorCWlmICghKF9leHByKSkgeyBEV0NfRVhDRVBUSU9OKCIlczolczolZDogIiBfZm9ybWF0ICJcbiIsIGR3Y19pcnEoKSwgXAorCQkJCSAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgIyMgX2FyZ3MpOyB9IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgRFdDX0FTU0VSVChfeC4uLikKKyNlbmRpZgorI2RlZmluZSBkd2NfYXNzZXJ0IERXQ19BU1NFUlQKKworCisvKiogQG5hbWUgQnl0ZSBPcmRlcmluZworICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGZvciBjb252ZXJzaW9ucyBiZXR3ZWVuIHByb2Nlc3NvcidzIGJ5dGUgb3JkZXJpbmcKKyAqIGFuZCBzcGVjaWZpYyBvcmRlcmluZyB5b3Ugd2FudC4KKyAqLworCisvKiogQ29udmVydHMgMzIgYml0IGRhdGEgaW4gQ1BVIGJ5dGUgb3JkZXJpbmcgdG8gbGl0dGxlIGVuZGlhbi4gKi8KK2V4dGVybiB1aW50MzJfdCBEV0NfQ1BVX1RPX0xFMzIodWludDMyX3QgKnApOworI2RlZmluZSBkd2NfY3B1X3RvX2xlMzIgRFdDX0NQVV9UT19MRTMyCisKKy8qKiBDb252ZXJ0cyAzMiBiaXQgZGF0YSBpbiBDUFUgYnl0ZSBvcmRlcmludCB0byBiaWcgZW5kaWFuLiAqLworZXh0ZXJuIHVpbnQzMl90IERXQ19DUFVfVE9fQkUzMih1aW50MzJfdCAqcCk7CisjZGVmaW5lIGR3Y19jcHVfdG9fYmUzMiBEV0NfQ1BVX1RPX0JFMzIKKworLyoqIENvbnZlcnRzIDMyIGJpdCBsaXR0bGUgZW5kaWFuIGRhdGEgdG8gQ1BVIGJ5dGUgb3JkZXJpbmcuICovCitleHRlcm4gdWludDMyX3QgRFdDX0xFMzJfVE9fQ1BVKHVpbnQzMl90ICpwKTsKKyNkZWZpbmUgZHdjX2xlMzJfdG9fY3B1IERXQ19MRTMyX1RPX0NQVQorCisvKiogQ29udmVydHMgMzIgYml0IGJpZyBlbmRpYW4gZGF0YSB0byBDUFUgYnl0ZSBvcmRlcmluZy4gKi8KK2V4dGVybiB1aW50MzJfdCBEV0NfQkUzMl9UT19DUFUodWludDMyX3QgKnApOworI2RlZmluZSBkd2NfYmUzMl90b19jcHUgRFdDX0JFMzJfVE9fQ1BVCisKKy8qKiBDb252ZXJ0cyAxNiBiaXQgZGF0YSBpbiBDUFUgYnl0ZSBvcmRlcmluZyB0byBsaXR0bGUgZW5kaWFuLiAqLworZXh0ZXJuIHVpbnQxNl90IERXQ19DUFVfVE9fTEUxNih1aW50MTZfdCAqcCk7CisjZGVmaW5lIGR3Y19jcHVfdG9fbGUxNiBEV0NfQ1BVX1RPX0xFMTYKKworLyoqIENvbnZlcnRzIDE2IGJpdCBkYXRhIGluIENQVSBieXRlIG9yZGVyaW50IHRvIGJpZyBlbmRpYW4uICovCitleHRlcm4gdWludDE2X3QgRFdDX0NQVV9UT19CRTE2KHVpbnQxNl90ICpwKTsKKyNkZWZpbmUgZHdjX2NwdV90b19iZTE2IERXQ19DUFVfVE9fQkUxNgorCisvKiogQ29udmVydHMgMTYgYml0IGxpdHRsZSBlbmRpYW4gZGF0YSB0byBDUFUgYnl0ZSBvcmRlcmluZy4gKi8KK2V4dGVybiB1aW50MTZfdCBEV0NfTEUxNl9UT19DUFUodWludDE2X3QgKnApOworI2RlZmluZSBkd2NfbGUxNl90b19jcHUgRFdDX0xFMTZfVE9fQ1BVCisKKy8qKiBDb252ZXJ0cyAxNiBiaXQgYmkgZW5kaWFuIGRhdGEgdG8gQ1BVIGJ5dGUgb3JkZXJpbmcuICovCitleHRlcm4gdWludDE2X3QgRFdDX0JFMTZfVE9fQ1BVKHVpbnQxNl90ICpwKTsKKyNkZWZpbmUgZHdjX2JlMTZfdG9fY3B1IERXQ19CRTE2X1RPX0NQVQorCisKKy8qKiBAbmFtZSBSZWdpc3RlciBSZWFkL1dyaXRlCisgKgorICogVGhlIGZvbGxvd2luZyBzaXggZnVuY3Rpb25zIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byByZWFkL3dyaXRlIHJlZ2lzdGVycyBvZgorICogMzItYml0IGFuZCA2NC1iaXQgc2l6ZXMuICBBbGwgbW9kdWxlcyB1c2UgdGhpcyB0byByZWFkL3dyaXRlIHJlZ2lzdGVyIHZhbHVlcy4KKyAqIFRoZSByZWcgdmFsdWUgaXMgYSBwb2ludGVyIHRvIHRoZSByZWdpc3RlciBjYWxjdWxhdGVkIGZyb20gdGhlIHZvaWQgKmJhc2UKKyAqIHZhcmlhYmxlIHBhc3NlZCBpbnRvIHRoZSBkcml2ZXIgd2hlbiBpdCBpcyBzdGFydGVkLiAgKi8KKworI2lmZGVmIERXQ19MSU5VWAorLyogTGludXggZG9lc24ndCBuZWVkIGFueSBleHRyYSBwYXJhbWV0ZXJzIGZvciByZWdpc3RlciByZWFkL3dyaXRlLCBzbyB3ZQorICoganVzdCB0aHJvdyBhd2F5IHRoZSBJTyBjb250ZXh0IHBhcmFtZXRlci4KKyAqLworLyoqIFJlYWRzIHRoZSBjb250ZW50IG9mIGEgMzItYml0IHJlZ2lzdGVyLiAqLworZXh0ZXJuIHVpbnQzMl90IERXQ19SRUFEX1JFRzMyKHVpbnQzMl90IHZvbGF0aWxlICpyZWcpOworI2RlZmluZSBkd2NfcmVhZF9yZWczMihfY3R4XyxfcmVnXykgRFdDX1JFQURfUkVHMzIoX3JlZ18pCisKKy8qKiBSZWFkcyB0aGUgY29udGVudCBvZiBhIDY0LWJpdCByZWdpc3Rlci4gKi8KK2V4dGVybiB1aW50NjRfdCBEV0NfUkVBRF9SRUc2NCh1aW50NjRfdCB2b2xhdGlsZSAqcmVnKTsKKyNkZWZpbmUgZHdjX3JlYWRfcmVnNjQoX2N0eF8sX3JlZ18pIERXQ19SRUFEX1JFRzY0KF9yZWdfKQorCisvKiogV3JpdGVzIHRvIGEgMzItYml0IHJlZ2lzdGVyLiAqLworZXh0ZXJuIHZvaWQgRFdDX1dSSVRFX1JFRzMyKHVpbnQzMl90IHZvbGF0aWxlICpyZWcsIHVpbnQzMl90IHZhbHVlKTsKKyNkZWZpbmUgZHdjX3dyaXRlX3JlZzMyKF9jdHhfLF9yZWdfLF92YWxfKSBEV0NfV1JJVEVfUkVHMzIoX3JlZ18sIF92YWxfKQorCisvKiogV3JpdGVzIHRvIGEgNjQtYml0IHJlZ2lzdGVyLiAqLworZXh0ZXJuIHZvaWQgRFdDX1dSSVRFX1JFRzY0KHVpbnQ2NF90IHZvbGF0aWxlICpyZWcsIHVpbnQ2NF90IHZhbHVlKTsKKyNkZWZpbmUgZHdjX3dyaXRlX3JlZzY0KF9jdHhfLF9yZWdfLF92YWxfKSBEV0NfV1JJVEVfUkVHNjQoX3JlZ18sIF92YWxfKQorCisvKioKKyAqIE1vZGlmeSBiaXQgdmFsdWVzIGluIGEgcmVnaXN0ZXIuICBVc2luZyB0aGUKKyAqIGFsZ29yaXRobTogKHJlZ19jb250ZW50cyAmIH5jbGVhcl9tYXNrKSB8IHNldF9tYXNrLgorICovCitleHRlcm4gdm9pZCBEV0NfTU9ESUZZX1JFRzMyKHVpbnQzMl90IHZvbGF0aWxlICpyZWcsIHVpbnQzMl90IGNsZWFyX21hc2ssIHVpbnQzMl90IHNldF9tYXNrKTsKKyNkZWZpbmUgZHdjX21vZGlmeV9yZWczMihfY3R4XyxfcmVnXyxfY21za18sX3Ntc2tfKSBEV0NfTU9ESUZZX1JFRzMyKF9yZWdfLF9jbXNrXyxfc21za18pCitleHRlcm4gdm9pZCBEV0NfTU9ESUZZX1JFRzY0KHVpbnQ2NF90IHZvbGF0aWxlICpyZWcsIHVpbnQ2NF90IGNsZWFyX21hc2ssIHVpbnQ2NF90IHNldF9tYXNrKTsKKyNkZWZpbmUgZHdjX21vZGlmeV9yZWc2NChfY3R4XyxfcmVnXyxfY21za18sX3Ntc2tfKSBEV0NfTU9ESUZZX1JFRzY0KF9yZWdfLF9jbXNrXyxfc21za18pCisKKyNlbmRpZgkvKiBEV0NfTElOVVggKi8KKworI2lmIGRlZmluZWQoRFdDX0ZSRUVCU0QpIHx8IGRlZmluZWQoRFdDX05FVEJTRCkKK3R5cGVkZWYgc3RydWN0IGR3Y19pb2N0eCB7CisJc3RydWN0IGRldmljZSAqZGV2OworCWJ1c19zcGFjZV90YWdfdCBpb3Q7CisJYnVzX3NwYWNlX2hhbmRsZV90IGlvaDsKK30gZHdjX2lvY3R4X3Q7CisKKy8qKiBCU0QgbmVlZHMgdHdvIGV4dHJhIHBhcmFtZXRlcnMgZm9yIHJlZ2lzdGVyIHJlYWQvd3JpdGUsIHNvIHdlIHBhc3MKKyAqIHRoZW0gaW4gdXNpbmcgdGhlIElPIGNvbnRleHQgcGFyYW1ldGVyLgorICovCisvKiogUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSAzMi1iaXQgcmVnaXN0ZXIuICovCitleHRlcm4gdWludDMyX3QgRFdDX1JFQURfUkVHMzIodm9pZCAqaW9fY3R4LCB1aW50MzJfdCB2b2xhdGlsZSAqcmVnKTsKKyNkZWZpbmUgZHdjX3JlYWRfcmVnMzIgRFdDX1JFQURfUkVHMzIKKworLyoqIFJlYWRzIHRoZSBjb250ZW50IG9mIGEgNjQtYml0IHJlZ2lzdGVyLiAqLworZXh0ZXJuIHVpbnQ2NF90IERXQ19SRUFEX1JFRzY0KHZvaWQgKmlvX2N0eCwgdWludDY0X3Qgdm9sYXRpbGUgKnJlZyk7CisjZGVmaW5lIGR3Y19yZWFkX3JlZzY0IERXQ19SRUFEX1JFRzY0CisKKy8qKiBXcml0ZXMgdG8gYSAzMi1iaXQgcmVnaXN0ZXIuICovCitleHRlcm4gdm9pZCBEV0NfV1JJVEVfUkVHMzIodm9pZCAqaW9fY3R4LCB1aW50MzJfdCB2b2xhdGlsZSAqcmVnLCB1aW50MzJfdCB2YWx1ZSk7CisjZGVmaW5lIGR3Y193cml0ZV9yZWczMiBEV0NfV1JJVEVfUkVHMzIKKworLyoqIFdyaXRlcyB0byBhIDY0LWJpdCByZWdpc3Rlci4gKi8KK2V4dGVybiB2b2lkIERXQ19XUklURV9SRUc2NCh2b2lkICppb19jdHgsIHVpbnQ2NF90IHZvbGF0aWxlICpyZWcsIHVpbnQ2NF90IHZhbHVlKTsKKyNkZWZpbmUgZHdjX3dyaXRlX3JlZzY0IERXQ19XUklURV9SRUc2NAorCisvKioKKyAqIE1vZGlmeSBiaXQgdmFsdWVzIGluIGEgcmVnaXN0ZXIuICBVc2luZyB0aGUKKyAqIGFsZ29yaXRobTogKHJlZ19jb250ZW50cyAmIH5jbGVhcl9tYXNrKSB8IHNldF9tYXNrLgorICovCitleHRlcm4gdm9pZCBEV0NfTU9ESUZZX1JFRzMyKHZvaWQgKmlvX2N0eCwgdWludDMyX3Qgdm9sYXRpbGUgKnJlZywgdWludDMyX3QgY2xlYXJfbWFzaywgdWludDMyX3Qgc2V0X21hc2spOworI2RlZmluZSBkd2NfbW9kaWZ5X3JlZzMyIERXQ19NT0RJRllfUkVHMzIKK2V4dGVybiB2b2lkIERXQ19NT0RJRllfUkVHNjQodm9pZCAqaW9fY3R4LCB1aW50NjRfdCB2b2xhdGlsZSAqcmVnLCB1aW50NjRfdCBjbGVhcl9tYXNrLCB1aW50NjRfdCBzZXRfbWFzayk7CisjZGVmaW5lIGR3Y19tb2RpZnlfcmVnNjQgRFdDX01PRElGWV9SRUc2NAorCisjZW5kaWYJLyogRFdDX0ZSRUVCU0QgfHwgRFdDX05FVEJTRCAqLworCisvKiogQGNvbmQgKi8KKworLyoqIEBuYW1lIFNvbWUgY29udmVuaWVuY2UgTUFDUk9TIHVzZWQgaW50ZXJuYWxseS4gIERlZmluZSBEV0NfREVCVUdfUkVHUyB0byBsb2cgdGhlCisgKiByZWdpc3RlciB3cml0ZXMuICovCisKKyNpZmRlZiBEV0NfTElOVVgKKworIyBpZmRlZiBEV0NfREVCVUdfUkVHUworCisjZGVmaW5lIGR3Y19kZWZpbmVfcmVhZF93cml0ZV9yZWdfbihfcmVnLF9jb250YWluZXJfdHlwZSkgXAorc3RhdGljIGlubGluZSB1aW50MzJfdCBkd2NfcmVhZF8jI19yZWcjI19uKF9jb250YWluZXJfdHlwZSAqY29udGFpbmVyLCBpbnQgbnVtKSB7IFwKKwlyZXR1cm4gRFdDX1JFQURfUkVHMzIoJmNvbnRhaW5lci0+cmVncy0+X3JlZ1tudW1dKTsgXAorfSBcCitzdGF0aWMgaW5saW5lIHZvaWQgZHdjX3dyaXRlXyMjX3JlZyMjX24oX2NvbnRhaW5lcl90eXBlICpjb250YWluZXIsIGludCBudW0sIHVpbnQzMl90IGRhdGEpIHsgXAorCURXQ19ERUJVRygiV1JJVElORyAlOHNbJWRdOiAlcDogJTA4eCIsICNfcmVnLCBudW0sIFwKKwkJICAmKCgodWludDMyX3QqKWNvbnRhaW5lci0+cmVncy0+X3JlZylbbnVtXSksIGRhdGEpOyBcCisJRFdDX1dSSVRFX1JFRzMyKCYoKCh1aW50MzJfdCopY29udGFpbmVyLT5yZWdzLT5fcmVnKVtudW1dKSwgZGF0YSk7IFwKK30KKworI2RlZmluZSBkd2NfZGVmaW5lX3JlYWRfd3JpdGVfcmVnKF9yZWcsX2NvbnRhaW5lcl90eXBlKSBcCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGR3Y19yZWFkXyMjX3JlZyhfY29udGFpbmVyX3R5cGUgKmNvbnRhaW5lcikgeyBcCisJcmV0dXJuIERXQ19SRUFEX1JFRzMyKCZjb250YWluZXItPnJlZ3MtPl9yZWcpOyBcCit9IFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkd2Nfd3JpdGVfIyNfcmVnKF9jb250YWluZXJfdHlwZSAqY29udGFpbmVyLCB1aW50MzJfdCBkYXRhKSB7IFwKKwlEV0NfREVCVUcoIldSSVRJTkcgJTExczogJXA6ICUwOHgiLCAjX3JlZywgJmNvbnRhaW5lci0+cmVncy0+X3JlZywgZGF0YSk7IFwKKwlEV0NfV1JJVEVfUkVHMzIoJmNvbnRhaW5lci0+cmVncy0+X3JlZywgZGF0YSk7IFwKK30KKworIyBlbHNlCS8qIERXQ19ERUJVR19SRUdTICovCisKKyNkZWZpbmUgZHdjX2RlZmluZV9yZWFkX3dyaXRlX3JlZ19uKF9yZWcsX2NvbnRhaW5lcl90eXBlKSBcCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGR3Y19yZWFkXyMjX3JlZyMjX24oX2NvbnRhaW5lcl90eXBlICpjb250YWluZXIsIGludCBudW0pIHsgXAorCXJldHVybiBEV0NfUkVBRF9SRUczMigmY29udGFpbmVyLT5yZWdzLT5fcmVnW251bV0pOyBcCit9IFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkd2Nfd3JpdGVfIyNfcmVnIyNfbihfY29udGFpbmVyX3R5cGUgKmNvbnRhaW5lciwgaW50IG51bSwgdWludDMyX3QgZGF0YSkgeyBcCisJRFdDX1dSSVRFX1JFRzMyKCYoKCh1aW50MzJfdCopY29udGFpbmVyLT5yZWdzLT5fcmVnKVtudW1dKSwgZGF0YSk7IFwKK30KKworI2RlZmluZSBkd2NfZGVmaW5lX3JlYWRfd3JpdGVfcmVnKF9yZWcsX2NvbnRhaW5lcl90eXBlKSBcCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGR3Y19yZWFkXyMjX3JlZyhfY29udGFpbmVyX3R5cGUgKmNvbnRhaW5lcikgeyBcCisJcmV0dXJuIERXQ19SRUFEX1JFRzMyKCZjb250YWluZXItPnJlZ3MtPl9yZWcpOyBcCit9IFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkd2Nfd3JpdGVfIyNfcmVnKF9jb250YWluZXJfdHlwZSAqY29udGFpbmVyLCB1aW50MzJfdCBkYXRhKSB7IFwKKwlEV0NfV1JJVEVfUkVHMzIoJmNvbnRhaW5lci0+cmVncy0+X3JlZywgZGF0YSk7IFwKK30KKworIyBlbmRpZgkvKiBEV0NfREVCVUdfUkVHUyAqLworCisjZW5kaWYJLyogRFdDX0xJTlVYICovCisKKyNpZiBkZWZpbmVkKERXQ19GUkVFQlNEKSB8fCBkZWZpbmVkKERXQ19ORVRCU0QpCisKKyMgaWZkZWYgRFdDX0RFQlVHX1JFR1MKKworI2RlZmluZSBkd2NfZGVmaW5lX3JlYWRfd3JpdGVfcmVnX24oX3JlZyxfY29udGFpbmVyX3R5cGUpIFwKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZHdjX3JlYWRfIyNfcmVnIyNfbih2b2lkICppb19jdHgsIF9jb250YWluZXJfdHlwZSAqY29udGFpbmVyLCBpbnQgbnVtKSB7IFwKKwlyZXR1cm4gRFdDX1JFQURfUkVHMzIoaW9fY3R4LCAmY29udGFpbmVyLT5yZWdzLT5fcmVnW251bV0pOyBcCit9IFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkd2Nfd3JpdGVfIyNfcmVnIyNfbih2b2lkICppb19jdHgsIF9jb250YWluZXJfdHlwZSAqY29udGFpbmVyLCBpbnQgbnVtLCB1aW50MzJfdCBkYXRhKSB7IFwKKwlEV0NfREVCVUcoIldSSVRJTkcgJThzWyVkXTogJXA6ICUwOHgiLCAjX3JlZywgbnVtLCBcCisJCSAgJigoKHVpbnQzMl90Kiljb250YWluZXItPnJlZ3MtPl9yZWcpW251bV0pLCBkYXRhKTsgXAorCURXQ19XUklURV9SRUczMihpb19jdHgsICYoKCh1aW50MzJfdCopY29udGFpbmVyLT5yZWdzLT5fcmVnKVtudW1dKSwgZGF0YSk7IFwKK30KKworI2RlZmluZSBkd2NfZGVmaW5lX3JlYWRfd3JpdGVfcmVnKF9yZWcsX2NvbnRhaW5lcl90eXBlKSBcCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGR3Y19yZWFkXyMjX3JlZyh2b2lkICppb19jdHgsIF9jb250YWluZXJfdHlwZSAqY29udGFpbmVyKSB7IFwKKwlyZXR1cm4gRFdDX1JFQURfUkVHMzIoaW9fY3R4LCAmY29udGFpbmVyLT5yZWdzLT5fcmVnKTsgXAorfSBcCitzdGF0aWMgaW5saW5lIHZvaWQgZHdjX3dyaXRlXyMjX3JlZyh2b2lkICppb19jdHgsIF9jb250YWluZXJfdHlwZSAqY29udGFpbmVyLCB1aW50MzJfdCBkYXRhKSB7IFwKKwlEV0NfREVCVUcoIldSSVRJTkcgJTExczogJXA6ICUwOHgiLCAjX3JlZywgJmNvbnRhaW5lci0+cmVncy0+X3JlZywgZGF0YSk7IFwKKwlEV0NfV1JJVEVfUkVHMzIoaW9fY3R4LCAmY29udGFpbmVyLT5yZWdzLT5fcmVnLCBkYXRhKTsgXAorfQorCisjIGVsc2UJLyogRFdDX0RFQlVHX1JFR1MgKi8KKworI2RlZmluZSBkd2NfZGVmaW5lX3JlYWRfd3JpdGVfcmVnX24oX3JlZyxfY29udGFpbmVyX3R5cGUpIFwKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZHdjX3JlYWRfIyNfcmVnIyNfbih2b2lkICppb19jdHgsIF9jb250YWluZXJfdHlwZSAqY29udGFpbmVyLCBpbnQgbnVtKSB7IFwKKwlyZXR1cm4gRFdDX1JFQURfUkVHMzIoaW9fY3R4LCAmY29udGFpbmVyLT5yZWdzLT5fcmVnW251bV0pOyBcCit9IFwKK3N0YXRpYyBpbmxpbmUgdm9pZCBkd2Nfd3JpdGVfIyNfcmVnIyNfbih2b2lkICppb19jdHgsIF9jb250YWluZXJfdHlwZSAqY29udGFpbmVyLCBpbnQgbnVtLCB1aW50MzJfdCBkYXRhKSB7IFwKKwlEV0NfV1JJVEVfUkVHMzIoaW9fY3R4LCAmKCgodWludDMyX3QqKWNvbnRhaW5lci0+cmVncy0+X3JlZylbbnVtXSksIGRhdGEpOyBcCit9CisKKyNkZWZpbmUgZHdjX2RlZmluZV9yZWFkX3dyaXRlX3JlZyhfcmVnLF9jb250YWluZXJfdHlwZSkgXAorc3RhdGljIGlubGluZSB1aW50MzJfdCBkd2NfcmVhZF8jI19yZWcodm9pZCAqaW9fY3R4LCBfY29udGFpbmVyX3R5cGUgKmNvbnRhaW5lcikgeyBcCisJcmV0dXJuIERXQ19SRUFEX1JFRzMyKGlvX2N0eCwgJmNvbnRhaW5lci0+cmVncy0+X3JlZyk7IFwKK30gXAorc3RhdGljIGlubGluZSB2b2lkIGR3Y193cml0ZV8jI19yZWcodm9pZCAqaW9fY3R4LCBfY29udGFpbmVyX3R5cGUgKmNvbnRhaW5lciwgdWludDMyX3QgZGF0YSkgeyBcCisJRFdDX1dSSVRFX1JFRzMyKGlvX2N0eCwgJmNvbnRhaW5lci0+cmVncy0+X3JlZywgZGF0YSk7IFwKK30KKworIyBlbmRpZgkvKiBEV0NfREVCVUdfUkVHUyAqLworCisjZW5kaWYJLyogRFdDX0ZSRUVCU0QgfHwgRFdDX05FVEJTRCAqLworCisvKiogQGVuZGNvbmQgKi8KKworCisjaWZkZWYgRFdDX0NSWVBUT0xJQgorLyoqIEBuYW1lIENyeXB0byBGdW5jdGlvbnMKKyAqCisgKiBUaGVzZSBhcmUgdGhlIGxvdy1sZXZlbCBjcnlwdG9ncmFwaGljIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBkcml2ZXIuICovCisKKy8qKiBQZXJmb3JtIEFFUyBDQkMgKi8KK2V4dGVybiBpbnQgRFdDX0FFU19DQkModWludDhfdCAqbWVzc2FnZSwgdWludDMyX3QgbWVzc2FnZWxlbiwgdWludDhfdCAqa2V5LCB1aW50MzJfdCBrZXlsZW4sIHVpbnQ4X3QgaXZbMTZdLCB1aW50OF90ICpvdXQpOworI2RlZmluZSBkd2NfYWVzX2NiYyBEV0NfQUVTX0NCQworCisvKiogRmlsbCB0aGUgcHJvdmlkZWQgYnVmZmVyIHdpdGggcmFuZG9tIGJ5dGVzLiAgVGhlc2Ugc2hvdWxkIGJlIGNyeXB0b2dyYXBoaWMgZ3JhZGUgcmFuZG9tIG51bWJlcnMuICovCitleHRlcm4gdm9pZCBEV0NfUkFORE9NX0JZVEVTKHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3QgbGVuZ3RoKTsKKyNkZWZpbmUgZHdjX3JhbmRvbV9ieXRlcyBEV0NfUkFORE9NX0JZVEVTCisKKy8qKiBQZXJmb3JtIHRoZSBTSEEtMjU2IGhhc2ggZnVuY3Rpb24gKi8KK2V4dGVybiBpbnQgRFdDX1NIQTI1Nih1aW50OF90ICptZXNzYWdlLCB1aW50MzJfdCBsZW4sIHVpbnQ4X3QgKm91dCk7CisjZGVmaW5lIGR3Y19zaGEyNTYgRFdDX1NIQTI1NgorCisvKiogQ2FsY3VsYXRlZCB0aGUgSE1BQy1TSEEyNTYgKi8KK2V4dGVybiBpbnQgRFdDX0hNQUNfU0hBMjU2KHVpbnQ4X3QgKm1lc3NhZ2UsIHVpbnQzMl90IG1lc3NhZ2VsZW4sIHVpbnQ4X3QgKmtleSwgdWludDMyX3Qga2V5bGVuLCB1aW50OF90ICpvdXQpOworI2RlZmluZSBkd2NfaG1hY19zaGEyNTYgRFdDX0hNQUNfU0hBMjU2CisKKyNlbmRpZgkvKiBEV0NfQ1JZUFRPTElCICovCisKKworLyoqIEBuYW1lIE1lbW9yeSBBbGxvY2F0aW9uCisgKgorICogVGhlc2UgZnVuY3Rpb24gcHJvdmlkZSBhY2Nlc3MgdG8gbWVtb3J5IGFsbG9jYXRpb24uICBUaGVyZSBhcmUgb25seSAyIERNQQorICogZnVuY3Rpb25zIGFuZCAzIFJlZ3VsYXIgbWVtb3J5IGZ1bmN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgaW1wbGVtZW50ZWQuICBOb25lCisgKiBvZiB0aGUgbWVtb3J5IGRlYnVnZ2luZyByb3V0aW5lcyBuZWVkIHRvIGJlIGltcGxlbWVudGVkLiAgVGhlIGFsbG9jYXRpb24KKyAqIHJvdXRpbmVzIGFsbCBaRVJPIHRoZSBjb250ZW50cyBvZiB0aGUgbWVtb3J5LgorICoKKyAqIERlZmluaW5nIERXQ19ERUJVR19NRU1PUlkgdHVybnMgb24gbWVtb3J5IGRlYnVnZ2luZyBhbmQgc3RhdGlzdGljIGdhdGhlcmluZy4KKyAqIFRoaXMgY2hlY2tzIGZvciBtZW1vcnkgbGVha3MsIGtlZXBpbmcgdHJhY2sgb2YgYWxsb2MvZnJlZSBwYWlycy4gIEl0IGFsc28KKyAqIGtlZXBzIHRyYWNrIG9mIGhvdyBtdWNoIG1lbW9yeSB0aGUgZHJpdmVyIGlzIHVzaW5nIGF0IGFueSBnaXZlbiB0aW1lLiAqLworCisjZGVmaW5lIERXQ19QQUdFX1NJWkUgNDA5NgorI2RlZmluZSBEV0NfUEFHRV9PRkZTRVQoYWRkcikgKCgodWludDMyX3QpYWRkcikgJiAweGZmZikKKyNkZWZpbmUgRFdDX1BBR0VfQUxJR05FRChhZGRyKSAoKCgodWludDMyX3QpYWRkcikgJiAweGZmZikgPT0gMCkKKworI2RlZmluZSBEV0NfSU5WQUxJRF9ETUFfQUREUiAweDAKKworI2lmZGVmIERXQ19MSU5VWAorLyoqIFR5cGUgZm9yIGEgRE1BIGFkZHJlc3MgKi8KK3R5cGVkZWYgZG1hX2FkZHJfdCBkd2NfZG1hX3Q7CisjZW5kaWYKKworI2lmIGRlZmluZWQoRFdDX0ZSRUVCU0QpIHx8IGRlZmluZWQoRFdDX05FVEJTRCkKK3R5cGVkZWYgYnVzX2FkZHJfdCBkd2NfZG1hX3Q7CisjZW5kaWYKKworI2lmZGVmIERXQ19GUkVFQlNECit0eXBlZGVmIHN0cnVjdCBkd2NfZG1hY3R4IHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJYnVzX2RtYV90YWdfdCBkbWFfdGFnOworCWJ1c19kbWFtYXBfdCBkbWFfbWFwOworCWJ1c19hZGRyX3QgZG1hX3BhZGRyOworCXZvaWQgKmRtYV92YWRkcjsKK30gZHdjX2RtYWN0eF90OworI2VuZGlmCisKKyNpZmRlZiBEV0NfTkVUQlNECit0eXBlZGVmIHN0cnVjdCBkd2NfZG1hY3R4IHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJYnVzX2RtYV90YWdfdCBkbWFfdGFnOworCWJ1c19kbWFtYXBfdCBkbWFfbWFwOworCWJ1c19kbWFfc2VnbWVudF90IHNlZ3NbMV07CisJaW50IG5zZWdzOworCWJ1c19hZGRyX3QgZG1hX3BhZGRyOworCXZvaWQgKmRtYV92YWRkcjsKK30gZHdjX2RtYWN0eF90OworI2VuZGlmCisKKy8qIEB0b2RvIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUgKi8KKyNpZiAwCisvKioKKyAqIENyZWF0ZXMgYSBETUEgcG9vbCBmcm9tIHdoaWNoIHlvdSBjYW4gYWxsb2NhdGUgRE1BIGJ1ZmZlcnMuICBCdWZmZXJzCisgKiBhbGxvY2F0ZWQgZnJvbSB0aGlzIHBvb2wgd2lsbCBiZSBndWFyYW50ZWVkIHRvIG1lZXQgdGhlIHNpemUsIGFsaWdubWVudCwgYW5kCisgKiBib3VuZGFyeSByZXF1aXJlbWVudHMgc3BlY2lmaWVkLgorICoKKyAqIEBwYXJhbVtpbl0gc2l6ZSBTcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMgdGhhdCB3aWxsIGJlIGFsbG9jYXRlZCBmcm9tCisgKiB0aGlzIHBvb2wuCisgKiBAcGFyYW1baW5dIGFsaWduIFNwZWNpZmllcyB0aGUgYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIHRoZSBidWZmZXJzCisgKiBhbGxvY2F0ZWQgZnJvbSB0aGlzIHBvb2wuICBNdXN0IGJlIGEgcG93ZXIgb2YgMi4KKyAqIEBwYXJhbVtpbl0gYm91bmRhcnkgU3BlY2lmaWVzIHRoZSBOLWJ5dGUgYm91bmRhcnkgdGhhdCBidWZmZXJzIGFsbG9jYXRlZCBmcm9tCisgKiB0aGlzIHBvb2wgbXVzdCBub3QgY3Jvc3MuCisgKgorICogQHJldHVybnMgQSBwb2ludGVyIHRvIGFuIGludGVybmFsIG9wYXF1ZSBzdHJ1Y3R1cmUgd2hpY2ggaXMgbm90IHRvIGJlCisgKiBhY2Nlc3NlZCBvdXRzaWRlIG9mIHRoZXNlIGxpYnJhcnkgZnVuY3Rpb25zLiAgVXNlIHRoaXMgaGFuZGxlIHRvIHNwZWNpZnkKKyAqIHdoaWNoIHBvb2xzIHRvIGFsbG9jYXRlL2ZyZWUgRE1BIGJ1ZmZlcnMgZnJvbSBhbmQgYWxzbyB0byBkZXN0cm95IHRoZSBwb29sLAorICogd2hlbiB5b3UgYXJlIGRvbmUgd2l0aCBpdC4KKyAqLworZXh0ZXJuIGR3Y19wb29sX3QgKkRXQ19ETUFfUE9PTF9DUkVBVEUodWludDMyX3Qgc2l6ZSwgdWludDMyX3QgYWxpZ24sIHVpbnQzMl90IGJvdW5kYXJ5KTsKKworLyoqCisgKiBEZXN0cm95IGEgRE1BIHBvb2wuICBBbGwgYnVmZmVycyBhbGxvY2F0ZWQgZnJvbSB0aGF0IHBvb2wgbXVzdCBiZSBmcmVlZCBmaXJzdC4KKyAqLworZXh0ZXJuIHZvaWQgRFdDX0RNQV9QT09MX0RFU1RST1koZHdjX3Bvb2xfdCAqcG9vbCk7CisKKy8qKgorICogQWxsb2NhdGUgYSBidWZmZXIgZnJvbSB0aGUgc3BlY2lmaWVkIERNQSBwb29sIGFuZCB6ZXJvcyBpdHMgY29udGVudHMuCisgKi8KK2V4dGVybiB2b2lkICpEV0NfRE1BX1BPT0xfQUxMT0MoZHdjX3Bvb2xfdCAqcG9vbCwgdWludDY0X3QgKmRtYV9hZGRyKTsKKworLyoqCisgKiBGcmVlIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVyIGZyb20gdGhlIERNQSBwb29sLgorICovCitleHRlcm4gdm9pZCBEV0NfRE1BX1BPT0xfRlJFRShkd2NfcG9vbF90ICpwb29sLCB2b2lkICp2YWRkciwgdm9pZCAqZGFkZHIpOworI2VuZGlmCisKKy8qKiBBbGxvY2F0ZXMgYSBETUEgY2FwYWJsZSBidWZmZXIgYW5kIHplcm9lcyBpdHMgY29udGVudHMuICovCitleHRlcm4gdm9pZCAqX19EV0NfRE1BX0FMTE9DKHZvaWQgKmRtYV9jdHgsIHVpbnQzMl90IHNpemUsIGR3Y19kbWFfdCAqZG1hX2FkZHIpOworCisvKiogQWxsb2NhdGVzIGEgRE1BIGNhcGFibGUgYnVmZmVyIGFuZCB6ZXJvZXMgaXRzIGNvbnRlbnRzIGluIGF0b21pYyBjb250ZXN0ICovCitleHRlcm4gdm9pZCAqX19EV0NfRE1BX0FMTE9DX0FUT01JQyh2b2lkICpkbWFfY3R4LCB1aW50MzJfdCBzaXplLCBkd2NfZG1hX3QgKmRtYV9hZGRyKTsKKworLyoqIEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVyLiAqLworZXh0ZXJuIHZvaWQgX19EV0NfRE1BX0ZSRUUodm9pZCAqZG1hX2N0eCwgdWludDMyX3Qgc2l6ZSwgdm9pZCAqdmlydF9hZGRyLCBkd2NfZG1hX3QgZG1hX2FkZHIpOworCisvKiogQWxsb2NhdGVzIGEgYmxvY2sgb2YgbWVtb3J5IGFuZCB6ZXJvZXMgaXRzIGNvbnRlbnRzLiAqLworZXh0ZXJuIHZvaWQgKl9fRFdDX0FMTE9DKHZvaWQgKm1lbV9jdHgsIHVpbnQzMl90IHNpemUpOworCisvKiogQWxsb2NhdGVzIGEgYmxvY2sgb2YgbWVtb3J5IGFuZCB6ZXJvZXMgaXRzIGNvbnRlbnRzLCBpbiBhbiBhdG9taWMgbWFubmVyCisgKiB3aGljaCBjYW4gYmUgdXNlZCBpbnNpZGUgaW50ZXJydXB0IGNvbnRleHQuICBUaGUgc2l6ZSBzaG91bGQgYmUgc3VmZmljaWVudGx5CisgKiBzbWFsbCwgYSBmZXcgS0IgYXQgbW9zdCwgc3VjaCB0aGF0IGZhaWx1cmVzIGFyZSBub3QgbGlrZWx5IHRvIG9jY3VyLiAgQ2FuIGp1c3QgY2FsbAorICogX19EV0NfQUxMT0MgaWYgaXQgaXMgYXRvbWljLiAqLworZXh0ZXJuIHZvaWQgKl9fRFdDX0FMTE9DX0FUT01JQyh2b2lkICptZW1fY3R4LCB1aW50MzJfdCBzaXplKTsKKworLyoqIEZyZWVzIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVyLiAqLworZXh0ZXJuIHZvaWQgX19EV0NfRlJFRSh2b2lkICptZW1fY3R4LCB2b2lkICphZGRyKTsKKworI2lmbmRlZiBEV0NfREVCVUdfTUVNT1JZCisKKyNkZWZpbmUgRFdDX0FMTE9DKF9zaXplXykgX19EV0NfQUxMT0MoTlVMTCwgX3NpemVfKQorI2RlZmluZSBEV0NfQUxMT0NfQVRPTUlDKF9zaXplXykgX19EV0NfQUxMT0NfQVRPTUlDKE5VTEwsIF9zaXplXykKKyNkZWZpbmUgRFdDX0ZSRUUoX2FkZHJfKSBfX0RXQ19GUkVFKE5VTEwsIF9hZGRyXykKKworIyBpZmRlZiBEV0NfTElOVVgKKyNkZWZpbmUgRFdDX0RNQV9BTExPQyhfc2l6ZV8sX2RtYV8pIF9fRFdDX0RNQV9BTExPQyhOVUxMLCBfc2l6ZV8sIF9kbWFfKQorI2RlZmluZSBEV0NfRE1BX0FMTE9DX0FUT01JQyhfc2l6ZV8sX2RtYV8pIF9fRFdDX0RNQV9BTExPQ19BVE9NSUMoTlVMTCwgX3NpemVfLF9kbWFfKQorI2RlZmluZSBEV0NfRE1BX0ZSRUUoX3NpemVfLF92aXJ0XyxfZG1hXykgX19EV0NfRE1BX0ZSRUUoTlVMTCwgX3NpemVfLCBfdmlydF8sIF9kbWFfKQorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoRFdDX0ZSRUVCU0QpIHx8IGRlZmluZWQoRFdDX05FVEJTRCkKKyNkZWZpbmUgRFdDX0RNQV9BTExPQyBfX0RXQ19ETUFfQUxMT0MKKyNkZWZpbmUgRFdDX0RNQV9GUkVFIF9fRFdDX0RNQV9GUkVFCisjIGVuZGlmCisKKyNlbHNlCS8qIERXQ19ERUJVR19NRU1PUlkgKi8KKworZXh0ZXJuIHZvaWQgKmR3Y19hbGxvY19kZWJ1Zyh2b2lkICptZW1fY3R4LCB1aW50MzJfdCBzaXplLCBjaGFyIGNvbnN0ICpmdW5jLCBpbnQgbGluZSk7CitleHRlcm4gdm9pZCAqZHdjX2FsbG9jX2F0b21pY19kZWJ1Zyh2b2lkICptZW1fY3R4LCB1aW50MzJfdCBzaXplLCBjaGFyIGNvbnN0ICpmdW5jLCBpbnQgbGluZSk7CitleHRlcm4gdm9pZCBkd2NfZnJlZV9kZWJ1Zyh2b2lkICptZW1fY3R4LCB2b2lkICphZGRyLCBjaGFyIGNvbnN0ICpmdW5jLCBpbnQgbGluZSk7CitleHRlcm4gdm9pZCAqZHdjX2RtYV9hbGxvY19kZWJ1Zyh2b2lkICpkbWFfY3R4LCB1aW50MzJfdCBzaXplLCBkd2NfZG1hX3QgKmRtYV9hZGRyLAorCQkJCSBjaGFyIGNvbnN0ICpmdW5jLCBpbnQgbGluZSk7CitleHRlcm4gdm9pZCAqZHdjX2RtYV9hbGxvY19hdG9taWNfZGVidWcodm9pZCAqZG1hX2N0eCwgdWludDMyX3Qgc2l6ZSwgZHdjX2RtYV90ICpkbWFfYWRkciwgCisJCQkJY2hhciBjb25zdCAqZnVuYywgaW50IGxpbmUpOworZXh0ZXJuIHZvaWQgZHdjX2RtYV9mcmVlX2RlYnVnKHZvaWQgKmRtYV9jdHgsIHVpbnQzMl90IHNpemUsIHZvaWQgKnZpcnRfYWRkciwKKwkJCSAgICAgICBkd2NfZG1hX3QgZG1hX2FkZHIsIGNoYXIgY29uc3QgKmZ1bmMsIGludCBsaW5lKTsKKworZXh0ZXJuIGludCBkd2NfbWVtb3J5X2RlYnVnX3N0YXJ0KHZvaWQgKm1lbV9jdHgpOworZXh0ZXJuIHZvaWQgZHdjX21lbW9yeV9kZWJ1Z19zdG9wKHZvaWQpOworZXh0ZXJuIHZvaWQgZHdjX21lbW9yeV9kZWJ1Z19yZXBvcnQodm9pZCk7CisKKyNkZWZpbmUgRFdDX0FMTE9DKF9zaXplXykgZHdjX2FsbG9jX2RlYnVnKE5VTEwsIF9zaXplXywgX19mdW5jX18sIF9fTElORV9fKQorI2RlZmluZSBEV0NfQUxMT0NfQVRPTUlDKF9zaXplXykgZHdjX2FsbG9jX2F0b21pY19kZWJ1ZyhOVUxMLCBfc2l6ZV8sIFwKKwkJCQkJCQlfX2Z1bmNfXywgX19MSU5FX18pCisjZGVmaW5lIERXQ19GUkVFKF9hZGRyXykgZHdjX2ZyZWVfZGVidWcoTlVMTCwgX2FkZHJfLCBfX2Z1bmNfXywgX19MSU5FX18pCisKKyMgaWZkZWYgRFdDX0xJTlVYCisjZGVmaW5lIERXQ19ETUFfQUxMT0MoX3NpemVfLF9kbWFfKSBkd2NfZG1hX2FsbG9jX2RlYnVnKE5VTEwsIF9zaXplXywgXAorCQkJCQkJX2RtYV8sIF9fZnVuY19fLCBfX0xJTkVfXykKKyNkZWZpbmUgRFdDX0RNQV9BTExPQ19BVE9NSUMoX3NpemVfLF9kbWFfKSBkd2NfZG1hX2FsbG9jX2F0b21pY19kZWJ1ZyhOVUxMLCBfc2l6ZV8sIFwKKwkJCQkJCV9kbWFfLCBfX2Z1bmNfXywgX19MSU5FX18pCisjZGVmaW5lIERXQ19ETUFfRlJFRShfc2l6ZV8sX3ZpcnRfLF9kbWFfKSBkd2NfZG1hX2ZyZWVfZGVidWcoTlVMTCwgX3NpemVfLCBcCisJCQkJCQlfdmlydF8sIF9kbWFfLCBfX2Z1bmNfXywgX19MSU5FX18pCisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChEV0NfRlJFRUJTRCkgfHwgZGVmaW5lZChEV0NfTkVUQlNEKQorI2RlZmluZSBEV0NfRE1BX0FMTE9DKF9jdHhfLF9zaXplXyxfZG1hXykgZHdjX2RtYV9hbGxvY19kZWJ1ZyhfY3R4XywgX3NpemVfLCBcCisJCQkJCQlfZG1hXywgX19mdW5jX18sIF9fTElORV9fKQorI2RlZmluZSBEV0NfRE1BX0ZSRUUoX2N0eF8sX3NpemVfLF92aXJ0XyxfZG1hXykgZHdjX2RtYV9mcmVlX2RlYnVnKF9jdHhfLCBfc2l6ZV8sIFwKKwkJCQkJCSBfdmlydF8sIF9kbWFfLCBfX2Z1bmNfXywgX19MSU5FX18pCisjIGVuZGlmCisKKyNlbmRpZiAvKiBEV0NfREVCVUdfTUVNT1JZICovCisKKyNkZWZpbmUgZHdjX2FsbG9jKF9jdHhfLF9zaXplXykgRFdDX0FMTE9DKF9zaXplXykKKyNkZWZpbmUgZHdjX2FsbG9jX2F0b21pYyhfY3R4Xyxfc2l6ZV8pIERXQ19BTExPQ19BVE9NSUMoX3NpemVfKQorI2RlZmluZSBkd2NfZnJlZShfY3R4XyxfYWRkcl8pIERXQ19GUkVFKF9hZGRyXykKKworI2lmZGVmIERXQ19MSU5VWAorLyogTGludXggZG9lc24ndCBuZWVkIGFueSBleHRyYSBwYXJhbWV0ZXJzIGZvciBETUEgYnVmZmVyIGFsbG9jYXRpb24sIHNvIHdlCisgKiBqdXN0IHRocm93IGF3YXkgdGhlIERNQSBjb250ZXh0IHBhcmFtZXRlci4KKyAqLworI2RlZmluZSBkd2NfZG1hX2FsbG9jKF9jdHhfLF9zaXplXyxfZG1hXykgRFdDX0RNQV9BTExPQyhfc2l6ZV8sIF9kbWFfKQorI2RlZmluZSBkd2NfZG1hX2FsbG9jX2F0b21pYyhfY3R4Xyxfc2l6ZV8sX2RtYV8pIERXQ19ETUFfQUxMT0NfQVRPTUlDKF9zaXplXywgX2RtYV8pCisjZGVmaW5lIGR3Y19kbWFfZnJlZShfY3R4Xyxfc2l6ZV8sX3ZpcnRfLF9kbWFfKSBEV0NfRE1BX0ZSRUUoX3NpemVfLCBfdmlydF8sIF9kbWFfKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERXQ19GUkVFQlNEKSB8fCBkZWZpbmVkKERXQ19ORVRCU0QpCisvKiogQlNEIG5lZWRzIHNldmVyYWwgZXh0cmEgcGFyYW1ldGVycyBmb3IgRE1BIGJ1ZmZlciBhbGxvY2F0aW9uLCBzbyB3ZSBwYXNzCisgKiB0aGVtIGluIHVzaW5nIHRoZSBETUEgY29udGV4dCBwYXJhbWV0ZXIuCisgKi8KKyNkZWZpbmUgZHdjX2RtYV9hbGxvYyBEV0NfRE1BX0FMTE9DCisjZGVmaW5lIGR3Y19kbWFfZnJlZSBEV0NfRE1BX0ZSRUUKKyNlbmRpZgorCisKKy8qKiBAbmFtZSBNZW1vcnkgYW5kIFN0cmluZyBQcm9jZXNzaW5nICovCisKKy8qKiBtZW1zZXQoKSBjbG9uZSAqLworZXh0ZXJuIHZvaWQgKkRXQ19NRU1TRVQodm9pZCAqZGVzdCwgdWludDhfdCBieXRlLCB1aW50MzJfdCBzaXplKTsKKyNkZWZpbmUgZHdjX21lbXNldCBEV0NfTUVNU0VUCisKKy8qKiBtZW1jcHkoKSBjbG9uZSAqLworZXh0ZXJuIHZvaWQgKkRXQ19NRU1DUFkodm9pZCAqZGVzdCwgdm9pZCBjb25zdCAqc3JjLCB1aW50MzJfdCBzaXplKTsKKyNkZWZpbmUgZHdjX21lbWNweSBEV0NfTUVNQ1BZCisKKy8qKiBtZW1tb3ZlKCkgY2xvbmUgKi8KK2V4dGVybiB2b2lkICpEV0NfTUVNTU9WRSh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHVpbnQzMl90IHNpemUpOworI2RlZmluZSBkd2NfbWVtbW92ZSBEV0NfTUVNTU9WRQorCisvKiogbWVtY21wKCkgY2xvbmUgKi8KK2V4dGVybiBpbnQgRFdDX01FTUNNUCh2b2lkICptMSwgdm9pZCAqbTIsIHVpbnQzMl90IHNpemUpOworI2RlZmluZSBkd2NfbWVtY21wIERXQ19NRU1DTVAKKworLyoqIHN0cmNtcCgpIGNsb25lICovCitleHRlcm4gaW50IERXQ19TVFJDTVAodm9pZCAqczEsIHZvaWQgKnMyKTsKKyNkZWZpbmUgZHdjX3N0cmNtcCBEV0NfU1RSQ01QCisKKy8qKiBzdHJuY21wKCkgY2xvbmUgKi8KK2V4dGVybiBpbnQgRFdDX1NUUk5DTVAodm9pZCAqczEsIHZvaWQgKnMyLCB1aW50MzJfdCBzaXplKTsKKyNkZWZpbmUgZHdjX3N0cm5jbXAgRFdDX1NUUk5DTVAKKworLyoqIHN0cmxlbigpIGNsb25lLCBmb3IgTlVMTCB0ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZ3MgKi8KK2V4dGVybiBpbnQgRFdDX1NUUkxFTihjaGFyIGNvbnN0ICpzdHIpOworI2RlZmluZSBkd2Nfc3RybGVuIERXQ19TVFJMRU4KKworLyoqIHN0cmNweSgpIGNsb25lLCBmb3IgTlVMTCB0ZXJtaW5hdGVkIEFTQ0lJIHN0cmluZ3MgKi8KK2V4dGVybiBjaGFyICpEV0NfU1RSQ1BZKGNoYXIgKnRvLCBjb25zdCBjaGFyICpmcm9tKTsKKyNkZWZpbmUgZHdjX3N0cmNweSBEV0NfU1RSQ1BZCisKKy8qKiBzdHJkdXAoKSBjbG9uZS4gIElmIHlvdSB3aXNoIHRvIHVzZSBtZW1vcnkgYWxsb2NhdGlvbiBkZWJ1Z2dpbmcsIHRoaXMKKyAqIGltcGxlbWVudGF0aW9uIG9mIHN0cmR1cCBzaG91bGQgdXNlIHRoZSBEV0NfKiBtZW1vcnkgcm91dGluZXMgaW5zdGVhZCBvZgorICogY2FsbGluZyBhIHByZWRlZmluZWQgc3RyZHVwLiAgT3RoZXJ3aXNlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZQorICogd2lsbCBub3QgYmUgc2VlbiBieSB0aGUgZGVidWdnaW5nIHJvdXRpbmVzLiAqLworZXh0ZXJuIGNoYXIgKkRXQ19TVFJEVVAoY2hhciBjb25zdCAqc3RyKTsKKyNkZWZpbmUgZHdjX3N0cmR1cChfY3R4Xyxfc3RyXykgRFdDX1NUUkRVUChfc3RyXykKKworLyoqIE5PVCBhbiBhdG9pKCkgY2xvbmUuICBSZWFkIHRoZSBkZXNjcmlwdGlvbiBjYXJlZnVsbHkuICBSZXR1cm5zIGFuIGludGVnZXIKKyAqIGNvbnZlcnRlZCBmcm9tIHRoZSBzdHJpbmcgc3RyIGluIGJhc2UgMTAgdW5sZXNzIHRoZSBzdHJpbmcgYmVnaW5zIHdpdGggYSAiMHgiCisgKiBpbiB3aGljaCBjYXNlIGl0IGlzIGJhc2UgMTYuICBTdHJpbmcgbXVzdCBiZSBhIE5VTEwgdGVybWluYXRlZCBzZXF1ZW5jZSBvZgorICogQVNDSUkgY2hhcmFjdGVycyBhbmQgbWF5IG9wdGlvbmFsbHkgYmVnaW4gd2l0aCB3aGl0ZXNwYWNlLCBhICsgb3IgLSwgYW5kIGEKKyAqICIweCIgcHJlZml4IGlmIGJhc2UgMTYuICBUaGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgbXVzdCBiZSB2YWxpZCBkaWdpdHMgZm9yCisgKiB0aGUgbnVtYmVyIGFuZCBlbmQgd2l0aCBhIE5VTEwgY2hhcmFjdGVyLiAgSWYgYW55IGludmFsaWQgY2hhcmFjdGVycyBhcmUKKyAqIGVuY291bnRlcmVkIG9yIGl0IHJldHVybnMgd2l0aCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgYW5kIHRoZSByZXN1bHRzIG9mIHRoZQorICogY29udmVyc2lvbiBhcmUgdW5kZWZpbmVkLiAgT24gc3VjZXNzIGl0IHJldHVybnMgMC4gIE92ZXJmbG93IGNvbmRpdGlvbnMgYXJlCisgKiB1bmRlZmluZWQuICBBbiBleGFtcGxlIGltcGxlbWVudGF0aW9uIHVzaW5nIGF0b2koKSBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoZQorICogTGludXggaW1wbGVtZW50YXRpb24uICovCitleHRlcm4gaW50IERXQ19BVE9JKGNvbnN0IGNoYXIgKnN0ciwgaW50MzJfdCAqdmFsdWUpOworI2RlZmluZSBkd2NfYXRvaSBEV0NfQVRPSQorCisvKiogU2FtZSBhcyBhYm92ZSBidXQgZm9yIHVuc2lnbmVkLiAqLworZXh0ZXJuIGludCBEV0NfQVRPVUkoY29uc3QgY2hhciAqc3RyLCB1aW50MzJfdCAqdmFsdWUpOworI2RlZmluZSBkd2NfYXRvdWkgRFdDX0FUT1VJCisKKyNpZmRlZiBEV0NfVVRGTElCCisvKiogVGhpcyByb3V0aW5lIHJldHVybnMgYSBVVEYxNkxFIHVuaWNvZGUgZW5jb2RlZCBzdHJpbmcgZnJvbSBhIFVURjggc3RyaW5nLiAqLworZXh0ZXJuIGludCBEV0NfVVRGOF9UT19VVEYxNkxFKHVpbnQ4X3QgY29uc3QgKnV0ZjhzdHJpbmcsIHVpbnQxNl90ICp1dGYxNnN0cmluZywgdW5zaWduZWQgbGVuKTsKKyNkZWZpbmUgZHdjX3V0ZjhfdG9fdXRmMTZsZSBEV0NfVVRGOF9UT19VVEYxNkxFCisjZW5kaWYKKworCisvKiogQG5hbWUgV2FpdCBxdWV1ZXMKKyAqCisgKiBXYWl0IHF1ZXVlcyBwcm92aWRlIGEgbWVhbnMgb2Ygc3luY2hyb25pemluZyBiZXR3ZWVuIHRocmVhZHMgb3IgcHJvY2Vzc2VzLiAgQQorICogcHJvY2VzcyBjYW4gYmxvY2sgb24gYSB3YWl0cSBpZiBzb21lIGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSwgd2FpdGluZyBmb3IgaXQgdG8KKyAqIGJlY29tZSB0cnVlLiAgV2hlbiB0aGUgd2FpdHEgaXMgdHJpZ2dlcmVkIGFsbCB3YWl0aW5nIHByb2Nlc3Mgd2lsbCBnZXQKKyAqIHVuYmxvY2tlZCBhbmQgdGhlIGNvbmRpdGlvbiB3aWxsIGJlIGNoZWNrIGFnYWluLiAgV2FpdHFzIHNob3VsZCBiZSB0cmlnZ2VyZWQKKyAqIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gY2FuIHBvdGVudGlhbGx5IGNoYW5nZS4qLworc3RydWN0IGR3Y193YWl0cTsKKworLyoqIFR5cGUgZm9yIGEgd2FpdHEgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y193YWl0cSBkd2Nfd2FpdHFfdDsKKworLyoqIFRoZSB0eXBlIG9mIHdhaXRxIGNvbmRpdGlvbiBjYWxsYmFjayBmdW5jdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUKKyAqIGNvbmRpdGlvbiBpcyBldmFsdWF0ZWQuICovCit0eXBlZGVmIGludCAoKmR3Y193YWl0cV9jb25kaXRpb25fdCkodm9pZCAqZGF0YSk7CisKKy8qKiBBbGxvY2F0ZSBhIHdhaXRxICovCitleHRlcm4gZHdjX3dhaXRxX3QgKkRXQ19XQUlUUV9BTExPQyh2b2lkKTsKKyNkZWZpbmUgZHdjX3dhaXRxX2FsbG9jKF9jdHhfKSBEV0NfV0FJVFFfQUxMT0MoKQorCisvKiogRnJlZSBhIHdhaXRxICovCitleHRlcm4gdm9pZCBEV0NfV0FJVFFfRlJFRShkd2Nfd2FpdHFfdCAqd3EpOworI2RlZmluZSBkd2Nfd2FpdHFfZnJlZSBEV0NfV0FJVFFfRlJFRQorCisvKiogQ2hlY2sgdGhlIGNvbmRpdGlvbiBhbmQgaWYgaXQgaXMgZmFsc2UsIGJsb2NrIG9uIHRoZSB3YWl0cS4gIFdoZW4gdW5ibG9ja2VkLCBjaGVjayB0aGUKKyAqIGNvbmRpdGlvbiBhZ2Fpbi4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHdoZW4gdGhlIGNvbmRpdGlvbiBiZWNvbWVzIHRydWUuICBUaGUgcmV0dXJuIHZhbHVlCisgKiBpcyAwIG9uIGNvbmRpdGlvbiB0cnVlLCBEV0NfV0FJVFFfQUJPUlRFRCBvbiBhYm9ydCBvciBraWxsZWQsIG9yIERXQ19XQUlUUV9VTktOT1dOIG9uIGVycm9yLiAqLworZXh0ZXJuIGludDMyX3QgRFdDX1dBSVRRX1dBSVQoZHdjX3dhaXRxX3QgKndxLCBkd2Nfd2FpdHFfY29uZGl0aW9uX3QgY29uZCwgdm9pZCAqZGF0YSk7CisjZGVmaW5lIGR3Y193YWl0cV93YWl0IERXQ19XQUlUUV9XQUlUCisKKy8qKiBDaGVjayB0aGUgY29uZGl0aW9uIGFuZCBpZiBpdCBpcyBmYWxzZSwgYmxvY2sgb24gdGhlIHdhaXRxLiAgV2hlbiB1bmJsb2NrZWQsCisgKiBjaGVjayB0aGUgY29uZGl0aW9uIGFnYWluLiAgVGhlIGZ1bmN0aW9uIHJldHVybnMgd2hlbiB0aGUgY29uZGl0aW9uIGJlY29tZQorICogdHJ1ZSBvciB0aGUgdGltZW91dCBoYXMgcGFzc2VkLiAgVGhlIHJldHVybiB2YWx1ZSBpcyAwIG9uIGNvbmRpdGlvbiB0cnVlIG9yCisgKiBEV0NfVElNRURfT1VUIG9uIHRpbWVvdXQsIG9yIERXQ19XQUlUUV9BQk9SVEVELCBvciBEV0NfV0FJVFFfVU5LTk9XTiBvbgorICogZXJyb3IuICovCitleHRlcm4gaW50MzJfdCBEV0NfV0FJVFFfV0FJVF9USU1FT1VUKGR3Y193YWl0cV90ICp3cSwgZHdjX3dhaXRxX2NvbmRpdGlvbl90IGNvbmQsCisJCQkJICAgICAgdm9pZCAqZGF0YSwgaW50MzJfdCBtc2Vjcyk7CisjZGVmaW5lIGR3Y193YWl0cV93YWl0X3RpbWVvdXQgRFdDX1dBSVRRX1dBSVRfVElNRU9VVAorCisvKiogVHJpZ2dlciBhIHdhaXRxLCB1bmJsb2NraW5nIGFsbCBwcm9jZXNzZXMuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBjb25kaXRpb24KKyAqIGhhcyBwb3RlbnRpYWxseSBjaGFuZ2VkLiAqLworZXh0ZXJuIHZvaWQgRFdDX1dBSVRRX1RSSUdHRVIoZHdjX3dhaXRxX3QgKndxKTsKKyNkZWZpbmUgZHdjX3dhaXRxX3RyaWdnZXIgRFdDX1dBSVRRX1RSSUdHRVIKKworLyoqIFVuYmxvY2sgYWxsIHByb2Nlc3NlcyB3YWl0aW5nIG9uIHRoZSB3YWl0cSB3aXRoIGFuIEFCT1JURUQgcmVzdWx0LiAqLworZXh0ZXJuIHZvaWQgRFdDX1dBSVRRX0FCT1JUKGR3Y193YWl0cV90ICp3cSk7CisjZGVmaW5lIGR3Y193YWl0cV9hYm9ydCBEV0NfV0FJVFFfQUJPUlQKKworCisvKiogQG5hbWUgVGhyZWFkcworICoKKyAqIEEgdGhyZWFkIG11c3QgYmUgZXhwbGljaXRseSBzdG9wcGVkLiAgSXQgbXVzdCBjaGVjayBEV0NfVEhSRUFEX1NIT1VMRF9TVE9QCisgKiB3aGVuZXZlciBpdCBpcyB3b2tlbiB1cCwgYW5kIHRoZW4gcmV0dXJuLiAgVGhlIERXQ19USFJFQURfU1RPUCBmdW5jdGlvbgorICogcmV0dXJucyB0aGUgdmFsdWUgZnJvbSB0aGUgdGhyZWFkLgorICovCisKK3N0cnVjdCBkd2NfdGhyZWFkOworCisvKiogVHlwZSBmb3IgYSB0aHJlYWQgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y190aHJlYWQgZHdjX3RocmVhZF90OworCisvKiogVGhlIHRocmVhZCBmdW5jdGlvbiAqLwordHlwZWRlZiBpbnQgKCpkd2NfdGhyZWFkX2Z1bmN0aW9uX3QpKHZvaWQgKmRhdGEpOworCisvKiogQ3JlYXRlIGEgdGhyZWFkIGFuZCBzdGFydCBpdCBydW5uaW5nIHRoZSB0aHJlYWRfZnVuY3Rpb24uICBSZXR1cm5zIGEgaGFuZGxlCisgKiB0byB0aGUgdGhyZWFkICovCitleHRlcm4gZHdjX3RocmVhZF90ICpEV0NfVEhSRUFEX1JVTihkd2NfdGhyZWFkX2Z1bmN0aW9uX3QgZnVuYywgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSk7CisjZGVmaW5lIGR3Y190aHJlYWRfcnVuKF9jdHhfLF9mdW5jXyxfbmFtZV8sX2RhdGFfKSBEV0NfVEhSRUFEX1JVTihfZnVuY18sIF9uYW1lXywgX2RhdGFfKQorCisvKiogU3RvcHMgYSB0aHJlYWQuICBSZXR1cm4gdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSB0aHJlYWQuICBPciB3aWxsIHJldHVybgorICogRFdDX0FCT1JUIGlmIHRoZSB0aHJlYWQgbmV2ZXIgc3RhcnRlZC4gKi8KK2V4dGVybiBpbnQgRFdDX1RIUkVBRF9TVE9QKGR3Y190aHJlYWRfdCAqdGhyZWFkKTsKKyNkZWZpbmUgZHdjX3RocmVhZF9zdG9wIERXQ19USFJFQURfU1RPUAorCisvKiogU2lnbmlmaWVzIHRvIHRoZSB0aHJlYWQgdGhhdCBpdCBtdXN0IHN0b3AuICovCisjaWZkZWYgRFdDX0xJTlVYCisvKiBMaW51eCBkb2Vzbid0IG5lZWQgYW55IHBhcmFtZXRlcnMgZm9yIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSAqLworZXh0ZXJuIGR3Y19ib29sX3QgRFdDX1RIUkVBRF9TSE9VTERfU1RPUCh2b2lkKTsKKyNkZWZpbmUgZHdjX3RocmVhZF9zaG91bGRfc3RvcChfdGhyZF8pIERXQ19USFJFQURfU0hPVUxEX1NUT1AoKQorCisvKiBObyB0aHJlYWRfZXhpdCBmdW5jdGlvbiBpbiBMaW51eCAqLworI2RlZmluZSBkd2NfdGhyZWFkX2V4aXQoX3RocmRfKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERXQ19GUkVFQlNEKSB8fCBkZWZpbmVkKERXQ19ORVRCU0QpCisvKiogQlNEIG5lZWRzIHRoZSB0aHJlYWQgcG9pbnRlciBmb3Iga3RocmVhZF9zdXNwZW5kX2NoZWNrKCkgKi8KK2V4dGVybiBkd2NfYm9vbF90IERXQ19USFJFQURfU0hPVUxEX1NUT1AoZHdjX3RocmVhZF90ICp0aHJlYWQpOworI2RlZmluZSBkd2NfdGhyZWFkX3Nob3VsZF9zdG9wIERXQ19USFJFQURfU0hPVUxEX1NUT1AKKworLyoqIFRoZSB0aHJlYWQgbXVzdCBjYWxsIHRoaXMgdG8gZXhpdC4gKi8KK2V4dGVybiB2b2lkIERXQ19USFJFQURfRVhJVChkd2NfdGhyZWFkX3QgKnRocmVhZCk7CisjZGVmaW5lIGR3Y190aHJlYWRfZXhpdCBEV0NfVEhSRUFEX0VYSVQKKyNlbmRpZgorCisKKy8qKiBAbmFtZSBXb3JrIHF1ZXVlcworICoKKyAqIFdvcmtxcyBhcmUgdXNlZCB0byBxdWV1ZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhdCBzb21lIGxhdGVyIHRpbWUsCisgKiBpbiBhbm90aGVyIHRocmVhZC4gKi8KK3N0cnVjdCBkd2Nfd29ya3E7CisKKy8qKiBUeXBlIGZvciBhIHdvcmtxICovCit0eXBlZGVmIHN0cnVjdCBkd2Nfd29ya3EgZHdjX3dvcmtxX3Q7CisKKy8qKiBUaGUgdHlwZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiAqLwordHlwZWRlZiB2b2lkICgqZHdjX3dvcmtfY2FsbGJhY2tfdCkodm9pZCAqZGF0YSk7CisKKy8qKiBBbGxvY2F0ZSBhIHdvcmtxICovCitleHRlcm4gZHdjX3dvcmtxX3QgKkRXQ19XT1JLUV9BTExPQyhjaGFyICpuYW1lKTsKKyNkZWZpbmUgZHdjX3dvcmtxX2FsbG9jKF9jdHhfLF9uYW1lXykgRFdDX1dPUktRX0FMTE9DKF9uYW1lXykKKworLyoqIEZyZWUgYSB3b3JrcS4gIEFsbCB3b3JrIG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSBiZWluZyBmcmVlZC4gKi8KK2V4dGVybiB2b2lkIERXQ19XT1JLUV9GUkVFKGR3Y193b3JrcV90ICp3b3JrcSk7CisjZGVmaW5lIGR3Y193b3JrcV9mcmVlIERXQ19XT1JLUV9GUkVFCisKKy8qKiBTY2hlZHVsZSBhIGNhbGxiYWNrIG9uIHRoZSB3b3JrcSwgcGFzc2luZyBpbiBkYXRhLiAgVGhlIGZ1bmN0aW9uIHdpbGwgYmUKKyAqIHNjaGVkdWxlZCBhdCBzb21lIGxhdGVyIHRpbWUuICovCitleHRlcm4gdm9pZCBEV0NfV09SS1FfU0NIRURVTEUoZHdjX3dvcmtxX3QgKndvcmtxLCBkd2Nfd29ya19jYWxsYmFja190IGNiLAorCQkJICAgICAgIHZvaWQgKmRhdGEsIGNoYXIgKmZvcm1hdCwgLi4uKQorI2lmZGVmIF9fR05VQ19fCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDQsIDUpKSk7CisjZWxzZQorCTsKKyNlbmRpZgorI2RlZmluZSBkd2Nfd29ya3Ffc2NoZWR1bGUgRFdDX1dPUktRX1NDSEVEVUxFCisKKy8qKiBTY2hlZHVsZSBhIGNhbGxiYWNrIG9uIHRoZSB3b3JrcSwgdGhhdCB3aWxsIGJlIGNhbGxlZCB1bnRpbCBhdCBsZWFzdAorICogZ2l2ZW4gbnVtYmVyIG1pbGlzZWNvbmRzIGhhdmUgcGFzc2VkLiAqLworZXh0ZXJuIHZvaWQgRFdDX1dPUktRX1NDSEVEVUxFX0RFTEFZRUQoZHdjX3dvcmtxX3QgKndvcmtxLCBkd2Nfd29ya19jYWxsYmFja190IGNiLAorCQkJCSAgICAgICB2b2lkICpkYXRhLCB1aW50MzJfdCB0aW1lLCBjaGFyICpmb3JtYXQsIC4uLikKKyNpZmRlZiBfX0dOVUNfXworCV9fYXR0cmlidXRlX18gKChmb3JtYXQocHJpbnRmLCA1LCA2KSkpOworI2Vsc2UKKwk7CisjZW5kaWYKKyNkZWZpbmUgZHdjX3dvcmtxX3NjaGVkdWxlX2RlbGF5ZWQgRFdDX1dPUktRX1NDSEVEVUxFX0RFTEFZRUQKKworLyoqIFRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzIGluIHRoZSB3b3JrcSAqLworZXh0ZXJuIGludCBEV0NfV09SS1FfUEVORElORyhkd2Nfd29ya3FfdCAqd29ya3EpOworI2RlZmluZSBkd2Nfd29ya3FfcGVuZGluZyBEV0NfV09SS1FfUEVORElORworCisvKiogQmxvY2tzIHVudGlsIGFsbCB0aGUgd29yayBpbiB0aGUgd29ya3EgaXMgY29tcGxldGUgb3IgdGltZWQgb3V0LiAgUmV0dXJucyA8CisgKiAwIG9uIHRpbWVvdXQuICovCitleHRlcm4gaW50IERXQ19XT1JLUV9XQUlUX1dPUktfRE9ORShkd2Nfd29ya3FfdCAqd29ya3EsIGludCB0aW1lb3V0KTsKKyNkZWZpbmUgZHdjX3dvcmtxX3dhaXRfd29ya19kb25lIERXQ19XT1JLUV9XQUlUX1dPUktfRE9ORQorCisKKy8qKiBAbmFtZSBUYXNrbGV0cworICoKKyAqLworc3RydWN0IGR3Y190YXNrbGV0OworCisvKiogVHlwZSBmb3IgYSB0YXNrbGV0ICovCit0eXBlZGVmIHN0cnVjdCBkd2NfdGFza2xldCBkd2NfdGFza2xldF90OworCisvKiogVGhlIHR5cGUgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCAqLwordHlwZWRlZiB2b2lkICgqZHdjX3Rhc2tsZXRfY2FsbGJhY2tfdCkodm9pZCAqZGF0YSk7CisKKy8qKiBBbGxvY2F0ZXMgYSB0YXNrbGV0ICovCitleHRlcm4gZHdjX3Rhc2tsZXRfdCAqRFdDX1RBU0tfQUxMT0MoY2hhciAqbmFtZSwgZHdjX3Rhc2tsZXRfY2FsbGJhY2tfdCBjYiwgdm9pZCAqZGF0YSk7CisjZGVmaW5lIGR3Y190YXNrX2FsbG9jKF9jdHhfLF9uYW1lXyxfY2JfLF9kYXRhXykgRFdDX1RBU0tfQUxMT0MoX25hbWVfLCBfY2JfLCBfZGF0YV8pCisKKy8qKiBGcmVlcyBhIHRhc2tsZXQgKi8KK2V4dGVybiB2b2lkIERXQ19UQVNLX0ZSRUUoZHdjX3Rhc2tsZXRfdCAqdGFzayk7CisjZGVmaW5lIGR3Y190YXNrX2ZyZWUgRFdDX1RBU0tfRlJFRQorCisvKiogU2NoZWR1bGVzIGEgdGFza2xldCB0byBydW4gKi8KK2V4dGVybiB2b2lkIERXQ19UQVNLX1NDSEVEVUxFKGR3Y190YXNrbGV0X3QgKnRhc2spOworI2RlZmluZSBkd2NfdGFza19zY2hlZHVsZSBEV0NfVEFTS19TQ0hFRFVMRQorCisKKy8qKiBAbmFtZSBUaW1lcgorICoKKyAqIENhbGxiYWNrcyBtdXN0IGJlIHNtYWxsIGFuZCBhdG9taWMuCisgKi8KK3N0cnVjdCBkd2NfdGltZXI7CisKKy8qKiBUeXBlIGZvciBhIHRpbWVyICovCit0eXBlZGVmIHN0cnVjdCBkd2NfdGltZXIgZHdjX3RpbWVyX3Q7CisKKy8qKiBUaGUgdHlwZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkICovCit0eXBlZGVmIHZvaWQgKCpkd2NfdGltZXJfY2FsbGJhY2tfdCkodm9pZCAqZGF0YSk7CisKKy8qKiBBbGxvY2F0ZXMgYSB0aW1lciAqLworZXh0ZXJuIGR3Y190aW1lcl90ICpEV0NfVElNRVJfQUxMT0MoY2hhciAqbmFtZSwgZHdjX3RpbWVyX2NhbGxiYWNrX3QgY2IsIHZvaWQgKmRhdGEpOworI2RlZmluZSBkd2NfdGltZXJfYWxsb2MoX2N0eF8sX25hbWVfLF9jYl8sX2RhdGFfKSBEV0NfVElNRVJfQUxMT0MoX25hbWVfLF9jYl8sX2RhdGFfKQorCisvKiogRnJlZXMgYSB0aW1lciAqLworZXh0ZXJuIHZvaWQgRFdDX1RJTUVSX0ZSRUUoZHdjX3RpbWVyX3QgKnRpbWVyKTsKKyNkZWZpbmUgZHdjX3RpbWVyX2ZyZWUgRFdDX1RJTUVSX0ZSRUUKKworLyoqIFNjaGVkdWxlcyB0aGUgdGltZXIgdG8gcnVuIGF0IHRpbWUgbXMgZnJvbSBub3cuICBBbmQgd2lsbCByZXBlYXQgYXQgZXZlcnkKKyAqIHJlcGVhdF9pbnRlcnZhbCBtc2VjIHRoZXJhZnRlcgorICoKKyAqIE1vZGlmaWVzIGEgdGltZXIgdGhhdCBpcyBzdGlsbCBhd2FpdGluZyBleGVjdXRpb24gdG8gYSBuZXcgZXhwaXJhdGlvbiB0aW1lLgorICogVGhlIG1vZF90aW1lIGlzIGFkZGVkIHRvIHRoZSBvbGQgdGltZS4gICovCitleHRlcm4gdm9pZCBEV0NfVElNRVJfU0NIRURVTEUoZHdjX3RpbWVyX3QgKnRpbWVyLCB1aW50MzJfdCB0aW1lKTsKKyNkZWZpbmUgZHdjX3RpbWVyX3NjaGVkdWxlIERXQ19USU1FUl9TQ0hFRFVMRQorCisvKiogRGlzYWJsZXMgdGhlIHRpbWVyIGZyb20gZXhlY3V0aW9uLiAqLworZXh0ZXJuIHZvaWQgRFdDX1RJTUVSX0NBTkNFTChkd2NfdGltZXJfdCAqdGltZXIpOworI2RlZmluZSBkd2NfdGltZXJfY2FuY2VsIERXQ19USU1FUl9DQU5DRUwKKworCisvKiogQG5hbWUgU3BpbmxvY2tzCisgKgorICogVGhlc2UgbG9ja3MgYXJlIHVzZWQgd2hlbiB0aGUgd29yayBiZXR3ZWVuIHRoZSBsb2NrL3VubG9jayBpcyBhdG9taWMgYW5kCisgKiBzaG9ydC4gIEludGVycnVwdHMgYXJlIGFsc28gZGlzYWJsZWQgZHVyaW5nIHRoZSBsb2NrL3VubG9jayBhbmQgdGh1cyB0aGV5IGFyZQorICogc3VpdGFibGUgdG8gbG9jayBiZXR3ZWVuIGludGVycnVwdC9ub24taW50ZXJydXB0IGNvbnRleHQuICBUaGV5IGFsc28gbG9jaworICogYmV0d2VlbiBwcm9jZXNzZXMgaWYgeW91IGhhdmUgbXVsdGlwbGUgQ1BVcyBvciBQcmVlbXB0aW9uLiAgSWYgeW91IGRvbid0IGhhdmUKKyAqIG11bHRpcGxlIENQVVMgb3IgUHJlZW1wdGlvbiwgdGhlbiB0aGUgeW91IGNhbiBzaW1wbHkgaW1wbGVtZW50IHRoZQorICogRFdDX1NQSU5MT0NLIGFuZCBEV0NfU1BJTlVOTE9DSyB0byBkaXNhYmxlIGFuZCBlbmFibGUgaW50ZXJydXB0cy4gIEJlY2F1c2UKKyAqIHRoZSB3b3JrIGJldHdlZW4gdGhlIGxvY2svdW5sb2NrIGlzIGF0b21pYywgdGhlIHByb2Nlc3MgY29udGV4dCB3aWxsIG5ldmVyCisgKiBjaGFuZ2UsIGFuZCBzbyB5b3UgbmV2ZXIgaGF2ZSB0byBsb2NrIGJldHdlZW4gcHJvY2Vzc2VzLiAgKi8KKworc3RydWN0IGR3Y19zcGlubG9jazsKKworLyoqIFR5cGUgZm9yIGEgc3BpbmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y19zcGlubG9jayBkd2Nfc3BpbmxvY2tfdDsKKworLyoqIFR5cGUgZm9yIHRoZSAnZmxhZ3MnIGFyZ3VtZW50IHRvIHNwaW5sb2NrIGZ1bnRpb25zICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZHdjX2lycWZsYWdzX3Q7CisKKy8qKiBSZXR1cm5zIGFuIGluaXRpYWxpemVkIGxvY2sgdmFyaWFibGUuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBhbGxvY2F0ZSBhbmQKKyAqIGluaXRpYWxpemUgdGhlIE9TLXNwZWNpZmljIGRhdGEgc3RydWN0dXJlIHVzZWQgZm9yIGxvY2tpbmcuICBUaGlzIGRhdGEKKyAqIHN0cnVjdHVyZSBpcyB0byBiZSB1c2VkIGZvciB0aGUgRFdDX0xPQ0sgYW5kIERXQ19VTkxPQ0sgZnVuY3Rpb25zIGFuZCBzaG91bGQKKyAqIGJlIGZyZWVkIGJ5IHRoZSBEV0NfRlJFRV9MT0NLIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuICovCitleHRlcm4gZHdjX3NwaW5sb2NrX3QgKkRXQ19TUElOTE9DS19BTExPQyh2b2lkKTsKKyNkZWZpbmUgZHdjX3NwaW5sb2NrX2FsbG9jKF9jdHhfKSBEV0NfU1BJTkxPQ0tfQUxMT0MoKQorCisvKiogRnJlZXMgYW4gaW5pdGlhbGl6ZWQgbG9jayB2YXJpYWJsZS4gKi8KK2V4dGVybiB2b2lkIERXQ19TUElOTE9DS19GUkVFKGR3Y19zcGlubG9ja190ICpsb2NrKTsKKyNkZWZpbmUgZHdjX3NwaW5sb2NrX2ZyZWUoX2N0eF8sX2xvY2tfKSBEV0NfU1BJTkxPQ0tfRlJFRShfbG9ja18pCisKKy8qKiBEaXNhYmxlcyBpbnRlcnJ1cHRzIGFuZCBibG9ja3MgdW50aWwgaXQgYWNxdWlyZXMgdGhlIGxvY2suCisgKgorICogQHBhcmFtIGxvY2sgUG9pbnRlciB0byB0aGUgc3BpbmxvY2suCisgKiBAcGFyYW0gZmxhZ3MgVW5zaWduZWQgbG9uZyBmb3IgaXJxIGZsYWdzIHN0b3JhZ2UuCisgKi8KK2V4dGVybiB2b2lkIERXQ19TUElOTE9DS19JUlFTQVZFKGR3Y19zcGlubG9ja190ICpsb2NrLCBkd2NfaXJxZmxhZ3NfdCAqZmxhZ3MpOworI2RlZmluZSBkd2Nfc3BpbmxvY2tfaXJxc2F2ZSBEV0NfU1BJTkxPQ0tfSVJRU0FWRQorCisvKiogUmUtZW5hYmxlcyB0aGUgaW50ZXJydXB0IGFuZCByZWxlYXNlcyB0aGUgbG9jay4KKyAqCisgKiBAcGFyYW0gbG9jayBQb2ludGVyIHRvIHRoZSBzcGlubG9jay4KKyAqIEBwYXJhbSBmbGFncyBVbnNpZ25lZCBsb25nIGZvciBpcnEgZmxhZ3Mgc3RvcmFnZS4gIE11c3QgYmUgdGhlIHNhbWUgYXMgd2FzCisgKiBwYXNzZWQgaW50byBEV0NfTE9DSy4KKyAqLworZXh0ZXJuIHZvaWQgRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShkd2Nfc3BpbmxvY2tfdCAqbG9jaywgZHdjX2lycWZsYWdzX3QgZmxhZ3MpOworI2RlZmluZSBkd2Nfc3BpbnVubG9ja19pcnFyZXN0b3JlIERXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUKKworLyoqIEJsb2NrcyB1bnRpbCBpdCBhY3F1aXJlcyB0aGUgbG9jay4KKyAqCisgKiBAcGFyYW0gbG9jayBQb2ludGVyIHRvIHRoZSBzcGlubG9jay4KKyAqLworZXh0ZXJuIHZvaWQgRFdDX1NQSU5MT0NLKGR3Y19zcGlubG9ja190ICpsb2NrKTsKKyNkZWZpbmUgZHdjX3NwaW5sb2NrIERXQ19TUElOTE9DSworCisvKiogUmVsZWFzZXMgdGhlIGxvY2suCisgKgorICogQHBhcmFtIGxvY2sgUG9pbnRlciB0byB0aGUgc3BpbmxvY2suCisgKi8KK2V4dGVybiB2b2lkIERXQ19TUElOVU5MT0NLKGR3Y19zcGlubG9ja190ICpsb2NrKTsKKyNkZWZpbmUgZHdjX3NwaW51bmxvY2sgRFdDX1NQSU5VTkxPQ0sKKworCisvKiogQG5hbWUgTXV0ZXhlcworICoKKyAqIFVubGlrZSBzcGlubG9ja3MgTXV0ZXhlcyBsb2NrIG9ubHkgYmV0d2VlbiBwcm9jZXNzZXMgYW5kIHRoZSB3b3JrIGJldHdlZW4gdGhlCisgKiBsb2NrL3VubG9jayBDQU4gYmxvY2ssIHRoZXJlZm9yZSBpdCBDQU5OT1QgYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKi8KKworc3RydWN0IGR3Y19tdXRleDsKKworLyoqIFR5cGUgZm9yIGEgbXV0ZXggKi8KK3R5cGVkZWYgc3RydWN0IGR3Y19tdXRleCBkd2NfbXV0ZXhfdDsKKworLyogRm9yIExpbnV4IE11dGV4IERlYnVnZ2luZyBtYWtlIGl0IGlubGluZSBiZWNhdXNlIHRoZSBkZWJ1Z2dpbmcgcm91dGluZXMgdXNlCisgKiB0aGUgc3ltYm9sIHRvIGRldGVybWluZSByZWN1cnNpdmUgbG9ja2luZy4gIFRoaXMgbWFrZXMgaXQgZmFsc2VseSB0aGluaworICogcmVjdXJzaXZlIGxvY2tpbmcgb2NjdXJzLiAqLworI2lmIGRlZmluZWQoRFdDX0xJTlVYKSAmJiBkZWZpbmVkKENPTkZJR19ERUJVR19NVVRFWEVTKQorI2RlZmluZSBEV0NfTVVURVhfQUxMT0NfTElOVVhfREVCVUcoX19tdXRleHApICh7IFwKKwlfX211dGV4cCA9IChkd2NfbXV0ZXhfdCAqKURXQ19BTExPQyhzaXplb2Yoc3RydWN0IG11dGV4KSk7IFwKKwltdXRleF9pbml0KChzdHJ1Y3QgbXV0ZXggKilfX211dGV4cCk7IFwKK30pCisjZW5kaWYKKworLyoqIEFsbG9jYXRlIGEgbXV0ZXggKi8KK2V4dGVybiBkd2NfbXV0ZXhfdCAqRFdDX01VVEVYX0FMTE9DKHZvaWQpOworI2RlZmluZSBkd2NfbXV0ZXhfYWxsb2MoX2N0eF8pIERXQ19NVVRFWF9BTExPQygpCisKKy8qIEZvciBtZW1vcnkgbGVhayBkZWJ1Z2dpbmcgd2hlbiB1c2luZyBMaW51eCBNdXRleCBEZWJ1Z2dpbmcgKi8KKyNpZiBkZWZpbmVkKERXQ19MSU5VWCkgJiYgZGVmaW5lZChDT05GSUdfREVCVUdfTVVURVhFUykKKyNkZWZpbmUgRFdDX01VVEVYX0ZSRUUoX19tdXRleHApIGRvIHsgXAorCW11dGV4X2Rlc3Ryb3koKHN0cnVjdCBtdXRleCAqKV9fbXV0ZXhwKTsgXAorCURXQ19GUkVFKF9fbXV0ZXhwKTsgXAorfSB3aGlsZSgwKQorI2Vsc2UKKy8qKiBGcmVlIGEgbXV0ZXggKi8KK2V4dGVybiB2b2lkIERXQ19NVVRFWF9GUkVFKGR3Y19tdXRleF90ICptdXRleCk7CisjZGVmaW5lIGR3Y19tdXRleF9mcmVlKF9jdHhfLF9tdXRleF8pIERXQ19NVVRFWF9GUkVFKF9tdXRleF8pCisjZW5kaWYKKworLyoqIExvY2sgYSBtdXRleCAqLworZXh0ZXJuIHZvaWQgRFdDX01VVEVYX0xPQ0soZHdjX211dGV4X3QgKm11dGV4KTsKKyNkZWZpbmUgZHdjX211dGV4X2xvY2sgRFdDX01VVEVYX0xPQ0sKKworLyoqIE5vbi1ibG9ja2luZyBsb2NrIHJldHVybnMgMSBvbiBzdWNjZXNzZnVsIGxvY2suICovCitleHRlcm4gaW50IERXQ19NVVRFWF9UUllMT0NLKGR3Y19tdXRleF90ICptdXRleCk7CisjZGVmaW5lIGR3Y19tdXRleF90cnlsb2NrIERXQ19NVVRFWF9UUllMT0NLCisKKy8qKiBVbmxvY2sgYSBtdXRleCAqLworZXh0ZXJuIHZvaWQgRFdDX01VVEVYX1VOTE9DSyhkd2NfbXV0ZXhfdCAqbXV0ZXgpOworI2RlZmluZSBkd2NfbXV0ZXhfdW5sb2NrIERXQ19NVVRFWF9VTkxPQ0sKKworCisvKiogQG5hbWUgVGltZSAqLworCisvKiogTWljcm9zZWNvbmQgZGVsYXkuCisgKgorICogQHBhcmFtIHVzZWNzICBNaWNyb3NlY29uZHMgdG8gZGVsYXkuCisgKi8KK2V4dGVybiB2b2lkIERXQ19VREVMQVkodWludDMyX3QgdXNlY3MpOworI2RlZmluZSBkd2NfdWRlbGF5IERXQ19VREVMQVkKKworLyoqIE1pbGxpc2Vjb25kIGRlbGF5LgorICoKKyAqIEBwYXJhbSBtc2VjcyAgTWlsbGlzZWNvbmRzIHRvIGRlbGF5LgorICovCitleHRlcm4gdm9pZCBEV0NfTURFTEFZKHVpbnQzMl90IG1zZWNzKTsKKyNkZWZpbmUgZHdjX21kZWxheSBEV0NfTURFTEFZCisKKy8qKiBOb24tYnVzeSB3YWl0aW5nLgorICogU2xlZXBzIGZvciBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4KKyAqCisgKiBAcGFyYW0gbXNlY3MgTWlsbGlzZWNvbmRzIHRvIHNsZWVwLgorICovCitleHRlcm4gdm9pZCBEV0NfTVNMRUVQKHVpbnQzMl90IG1zZWNzKTsKKyNkZWZpbmUgZHdjX21zbGVlcCBEV0NfTVNMRUVQCisKKy8qKgorICogUmV0dXJucyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QuCisgKi8KK2V4dGVybiB1aW50MzJfdCBEV0NfVElNRSh2b2lkKTsKKyNkZWZpbmUgZHdjX3RpbWUgRFdDX1RJTUUKKworCisKKworLyogQG1haW5wYWdlIERXQyBQb3J0YWJpbGl0eSBhbmQgQ29tbW9uIExpYnJhcnkKKyAqCisgKiBUaGlzIGlzIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgRFdDIFBvcnRhYmlsaXR5IGFuZCBDb21tb24gTGlicmFyeS4KKyAqCisgKiBAc2VjdGlvbiBpbnRybyBJbnRyb2R1Y3Rpb24KKyAqCisgKiBUaGUgRFdDIFBvcnRhYmlsaXR5IGxpYnJhcnkgY29uc2lzdHMgb2Ygd3JhcHBlciBjYWxscyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIHRvCisgKiBhbGwgbG93LWxldmVsIGZ1bmN0aW9ucyB3aGljaCBhcmUgdHlwaWNhbGx5IHByb3ZpZGVkIGJ5IHRoZSBPUy4gIFRoZSBXVURFVgorICogZHJpdmVyIHVzZXMgb25seSB0aGVzZSBmdW5jdGlvbnMuICBJbiBvcmRlciB0byBwb3J0IHRoZSBXVURFViBkcml2ZXIsIG9ubHkKKyAqIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBsaWJyYXJ5IG5lZWQgdG8gYmUgcmUtaW1wbGVtZW50ZWQsIHdpdGggdGhlIHNhbWUKKyAqIGJlaGF2aW9yIGFzIGRvY3VtZW50ZWQgaGVyZS4KKyAqCisgKiBUaGUgQ29tbW9uIGxpYnJhcnkgY29uc2lzdHMgb2YgaGlnaGVyIGxldmVsIGZ1bmN0aW9ucywgd2hpY2ggcmVseSBvbmx5IG9uCisgKiBjYWxsaW5nIHRoZSBmdW5jdGlvbnMgZnJvbSB0aGUgRFdDIFBvcnRhYmlsaXR5IGxpYnJhcnkuICBUaGVzZSBjb21tb24KKyAqIHJvdXRpbmVzIGFyZSBzaGFyZWQgYWNyb3NzIG1vZHVsZXMuICBTb21lIG9mIHRoZSBjb21tb24gbGlicmFyaWVzIG5lZWQgdG8gYmUKKyAqIHVzZWQgZGlyZWN0bHkgYnkgdGhlIGRyaXZlciBwcm9ncmFtbWVyIHdoZW4gcG9ydGluZyBXVURFVi4gIFN1Y2ggYXMgdGhlCisgKiBwYXJhbWV0ZXIgYW5kIG5vdGlmaWNhdGlvbiBsaWJyYXJpZXMuCisgKgorICogQHNlY3Rpb24gbG93IFBvcnRhYmlsaXR5IExpYnJhcnkgT1MgV3JhcHBlciBGdW5jdGlvbnMKKyAqCisgKiBBbnkgZnVuY3Rpb24gc3RhcnRpbmcgd2l0aCBEV0MgYW5kIGluIGFsbCBDQVBTIGlzIGEgbG93LWxldmVsIE9TLXdyYXBwZXIgdGhhdAorICogbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgd2hlbiBwb3J0aW5nLCBmb3IgZXhhbXBsZSBEV0NfTVVURVhfQUxMT0MoKS4gIEFsbCBvZgorICogdGhlc2UgZnVuY3Rpb25zIGFyZSBpbmNsdWRlZCBpbiB0aGUgZHdjX29zLmggZmlsZS4KKyAqCisgKiBUaGVyZSBhcmUgbWFueSBmdW5jdGlvbnMgaGVyZSBjb3ZlcmluZyBhIHdpZGUgYXJyYXkgb2YgT1Mgc2VydmljZXMuICBQbGVhc2UKKyAqIHNlZSBkd2Nfb3MuaCBmb3IgZGV0YWlscywgYW5kIGltcGxlbWVudGF0aW9uIG5vdGVzIGZvciBlYWNoIGZ1bmN0aW9uLgorICoKKyAqIEBzZWN0aW9uIGNvbW1vbiBDb21tb24gTGlicmFyeSBGdW5jdGlvbnMKKyAqCisgKiBBbnkgZnVuY3Rpb24gc3RhcnRpbmcgd2l0aCBkd2MgYW5kIGluIGFsbCBsb3dlcmNhc2UgaXMgYSBjb21tb24gbGlicmFyeQorICogcm91dGluZS4gIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGEgcG9ydGFibGUgaW1wbGVtZW50YXRpb24gYW5kIGRvIG5vdCBuZWVkIHRvCisgKiBiZSByZWltcGxlbWVudGVkIHdoZW4gcG9ydGluZy4gIFRoZSBjb21tb24gcm91dGluZXMgY2FuIGJlIHVzZWQgYnkgYW55CisgKiBkcml2ZXIsIGFuZCBzb21lIG11c3QgYmUgdXNlZCBieSB0aGUgZW5kIHVzZXIgdG8gY29udHJvbCB0aGUgZHJpdmVycy4gIEZvcgorICogZXhhbXBsZSwgeW91IG11c3QgdXNlIHRoZSBQYXJhbWV0ZXIgY29tbW9uIGxpYnJhcnkgaW4gb3JkZXIgdG8gc2V0IHRoZQorICogcGFyYW1ldGVycyBpbiB0aGUgV1VERVYgbW9kdWxlLgorICoKKyAqIFRoZSBjb21tb24gbGlicmFyaWVzIGNvbnNpc3Qgb2YgdGhlIGZvbGxvd2luZzoKKyAqCisgKiAtIENvbm5lY3Rpb24gQ29udGV4dHMgLSBVc2VkIGludGVybmFsbHkgYW5kIGNhbiBiZSB1c2VkIGJ5IGVuZC11c2VyLiAgU2VlIGR3Y19jYy5oCisgKiAtIFBhcmFtZXRlcnMgLSBVc2VkIGludGVybmFsbHkgYW5kIGNhbiBiZSB1c2VkIGJ5IGVuZC11c2VyLiAgU2VlIGR3Y19wYXJhbXMuaAorICogLSBOb3RpZmljYXRpb25zIC0gVXNlZCBpbnRlcm5hbGx5IGFuZCBjYW4gYmUgdXNlZCBieSBlbmQtdXNlci4gIFNlZSBkd2Nfbm90aWZpZXIuaAorICogLSBMaXN0cyAtIFVzZWQgaW50ZXJuYWxseSBhbmQgY2FuIGJlIHVzZWQgYnkgZW5kLXVzZXIuICBTZWUgZHdjX2xpc3QuaAorICogLSBNZW1vcnkgRGVidWdnaW5nIC0gVXNlZCBpbnRlcm5hbGx5IGFuZCBjYW4gYmUgdXNlZCBieSBlbmQtdXNlci4gIFNlZSBkd2Nfb3MuaAorICogLSBNb2Rwb3cgLSBVc2VkIGludGVybmFsbHkgb25seS4gIFNlZSBkd2NfbW9kcG93LmgKKyAqIC0gREggLSBVc2VkIGludGVybmFsbHkgb25seS4gIFNlZSBkd2NfZGguaAorICogLSBDcnlwdG8gLSBVc2VkIGludGVybmFsbHkgb25seS4gIFNlZSBkd2NfY3J5cHRvLmgKKyAqCisgKgorICogQHNlY3Rpb24gcHJlcmVxIFByZXJlcXVpc3RlcyBGb3IgZHdjX29zLmgKKyAqIEBzdWJzZWN0aW9uIHR5cGVzIERhdGEgVHlwZXMKKyAqCisgKiBUaGUgZHdjX29zLmggZmlsZSBhc3N1bWVzIHRoYXQgc2V2ZXJhbCBsb3ctbGV2ZWwgZGF0YSB0eXBlcyBhcmUgcHJlIGRlZmluZWQgZm9yIHRoZQorICogY29tcGlsYXRpb24gZW52aXJvbm1lbnQuICBUaGVzZSBkYXRhIHR5cGVzIGFyZToKKyAqCisgKiAtIHVpbnQ4X3QgLSB1bnNpZ25lZCA4LWJpdCBkYXRhIHR5cGUKKyAqIC0gaW50OF90IC0gc2lnbmVkIDgtYml0IGRhdGEgdHlwZQorICogLSB1aW50MTZfdCAtIHVuc2lnbmVkIDE2LWJpdCBkYXRhIHR5cGUKKyAqIC0gaW50MTZfdCAtIHNpZ25lZCAxNi1iaXQgZGF0YSB0eXBlCisgKiAtIHVpbnQzMl90IC0gdW5zaWduZWQgMzItYml0IGRhdGEgdHlwZQorICogLSBpbnQzMl90IC0gc2lnbmVkIDMyLWJpdCBkYXRhIHR5cGUKKyAqIC0gdWludDY0X3QgLSB1bnNpZ25lZCA2NC1iaXQgZGF0YSB0eXBlCisgKiAtIGludDY0X3QgLSBzaWduZWQgNjQtYml0IGRhdGEgdHlwZQorICoKKyAqIEVuc3VyZSB0aGF0IHRoZXNlIGFyZSBkZWZpbmVkIGJlZm9yZSB1c2luZyBkd2Nfb3MuaC4gIFRoZSBlYXNpZXN0IHdheSB0byBkbworICogdGhhdCBpcyB0byBtb2RpZnkgdGhlIHRvcCBvZiB0aGUgZmlsZSB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBoZWFkZXIuCisgKiBUaGlzIGlzIGFscmVhZHkgZG9uZSBmb3IgdGhlIExpbnV4IGVudmlyb25tZW50LiAgSWYgdGhlIERXQ19MSU5VWCBtYWNybyBpcworICogZGVmaW5lZCwgdGhlIGNvcnJlY3QgaGVhZGVyIHdpbGwgYmUgYWRkZWQuICBBIHN0YW5kYXJkIGhlYWRlciA8c3RkaW50Lmg+IGlzCisgKiBhbHNvIHVzZWQgZm9yIGVudmlyb25tZW50cyB3aGVyZSBzdGFuZGFyZCBDIGhlYWRlcnMgYXJlIGF2YWlsYWJsZS4KKyAqCisgKiBAc3Vic2VjdGlvbiBzdGRhcmcgVmFyaWFibGUgQXJndW1lbnRzCisgKgorICogVmFyaWFibGUgYXJndW1lbnRzIGFyZSBwcm92aWRlZCBieSBhIHN0YW5kYXJkIEMgaGVhZGVyIDxzdGRhcmcuaD4uICBpdCBpcworICogYXZhaWxhYmxlIGluIEJvdGggdGhlIExpbnV4IGFuZCBBTlNJIEMgZW52aW9ybm1lbnQuICBBbiBlcXVpdmFsZW50IG11c3QgYmUKKyAqIHByb3ZpZGVkIGluIHlvdXIgZW52aW9ybm1lbnQgaW4gb3JkZXIgdG8gdXNlIGR3Y19vcy5oIHdpdGggdGhlIGRlYnVnIGFuZAorICogdHJhY2luZyBtZXNzYWdlIGZ1bmN0aW9uYWxpdHkuCisgKgorICogQHN1YnNlY3Rpb24gdGhyZWFkIFRocmVhZGluZworICoKKyAqIFdVREVWIENvcmUgbXVzdCBiZSBydW4gb24gYW4gb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHByb3ZpZGVzIGZvciBtdWx0aXBsZQorICogdGhyZWFkcy9wcm9jZXNzZXMuICBUaHJlYWRpbmcgY2FuIGJlIGltcGxlbWVudGVkIGluIG1hbnkgd2F5cywgZXZlbiBpbgorICogZW1iZWRkZWQgc3lzdGVtcyB3aXRob3V0IGFuIG9wZXJhdGluZyBzeXN0ZW0uICBBdCB0aGUgYmFyZSBtaW5pbXVtLCB0aGUKKyAqIHN5c3RlbSBzaG91bGQgYmUgYWJsZSB0byBzdGFydCBhbnkgbnVtYmVyIG9mIHByb2Nlc3NlcyBhdCBhbnkgdGltZSB0byBoYW5kbGUKKyAqIHNwZWNpYWwgd29yay4gIEl0IG5lZWQgbm90IGJlIGEgcHJlLWVtcHRpdmUgc3lzdGVtLiAgUHJvY2VzcyBjb250ZXh0IGNhbgorICogY2hhbmdlIHVwb24gYSBjYWxsIHRvIGEgYmxvY2tpbmcgZnVuY3Rpb24uICBUaGUgaGFyZHdhcmUgaW50ZXJydXB0IGNvbnRleHQKKyAqIHRoYXQgY2FsbHMgdGhlIG1vZHVsZSdzIElTUigpIGZ1bmN0aW9uIG11c3QgYmUgZGlmZmVyZW50aWFibGUgZnJvbSBwcm9jZXNzCisgKiBjb250ZXh0LCBldmVuIGlmIHlvdXIgcHJvY2Vzc2VzIGFyZSBpbXBlbWVudGVkIHZpYSBhIGhhcmR3YXJlIGludGVycnVwdC4KKyAqIEZ1cnRoZXIgbG9ja2luZyBtZWNoYW5pc20gYmV0d2VlbiBwcm9jZXNzIG11c3QgZXhpc3QgKG9yIGJlIGltcGxlbWVudGVkKSwgYW5kCisgKiBwcm9jZXNzIGNvbnRleHQgbXVzdCBoYXZlIGEgd2F5IHRvIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgYSBwZXJpb2Qgb2YgdGltZSB0bworICogbG9jayB0aGVtIG91dC4gIElmIGFsbCBvZiB0aGlzIGV4aXN0cywgdGhlIGZ1bmN0aW9ucyBpbiBkd2Nfb3MuaCByZWxhdGVkIHRvCisgKiB0aHJlYWRpbmcgc2hvdWxkIGJlIGFibGUgdG8gYmUgaW1wbGVtZW50ZWQgd2l0aCB0aGUgZGVmaW5lZCBiZWhhdmlvci4KKyAqCisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9EV0NfT1NfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19hZHAuYyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19hZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc3NDcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2FkcC5jCkBAIC0wLDAgKzEsODU0IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfYWRwLmMgJAorICogJFJldmlzaW9uOiAjMTIgJAorICogJERhdGU6IDIwMTEvMTAvMjYgJAorICogJENoYW5nZTogMTg3MzAyOCAkCisgKgorICogU3lub3BzeXMgSFMgT1RHIExpbnV4IFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbiAoaGVyZWluYWZ0ZXIsCisgKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcworICogb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgKgorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKKyAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gdXNlIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgKiBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwgZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IKKyAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQorICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgKiBiZWxvdywgdGhlbiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIiBCQVNJUworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2luY2x1ZGUgImR3Y19vcy5oIgorI2luY2x1ZGUgImR3Y19vdGdfcmVncy5oIgorI2luY2x1ZGUgImR3Y19vdGdfY2lsLmgiCisjaW5jbHVkZSAiZHdjX290Z19hZHAuaCIKKworLyoqIEBmaWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtb3N0IG9mIHRoZSBBdHRhY2ggRGV0ZWN0IFByb3RvY29sIGltcGxlbWVudGF0aW9uIGZvcgorICogdGhlIGRyaXZlciB0byBzdXBwb3J0IE9URyBSZXYyLjAuCisgKgorICovCisKK3ZvaWQgZHdjX290Z19hZHBfd3JpdGVfcmVnKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsdWUpCit7CisJYWRwY3RsX2RhdGFfdCBhZHBjdGw7CisKKwlhZHBjdGwuZDMyID0gdmFsdWU7CisJYWRwY3RsLmIuYXIgPSAweDI7CisKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmFkcGN0bCwgYWRwY3RsLmQzMik7CisKKwl3aGlsZSAoYWRwY3RsLmIuYXIpIHsKKwkJYWRwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5hZHBjdGwpOworCX0KKworfQorCisvKioKKyAqIEZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIEFEUCByZWdpc3RlcnMKKyAqLwordWludDMyX3QgZHdjX290Z19hZHBfcmVhZF9yZWcoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWFkcGN0bF9kYXRhX3QgYWRwY3RsOworCisJYWRwY3RsLmQzMiA9IDA7CisJYWRwY3RsLmIuYXIgPSAweDE7CisKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmFkcGN0bCwgYWRwY3RsLmQzMik7CisKKwl3aGlsZSAoYWRwY3RsLmIuYXIpIHsKKwkJYWRwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5hZHBjdGwpOworCX0KKworCXJldHVybiBhZHBjdGwuZDMyOworfQorCisvKioKKyAqIEZ1bmN0aW9uIGlzIGNhbGxlZCB0byByZWFkIEFEUENUTCByZWdpc3RlciBhbmQgZmlsdGVyIFdyaXRlLWNsZWFyIGJpdHMKKyAqLwordWludDMyX3QgZHdjX290Z19hZHBfcmVhZF9yZWdfZmlsdGVyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlhZHBjdGxfZGF0YV90IGFkcGN0bDsKKworCWFkcGN0bC5kMzIgPSBkd2Nfb3RnX2FkcF9yZWFkX3JlZyhjb3JlX2lmKTsKKwlhZHBjdGwuYi5hZHBfdG1vdXRfaW50ID0gMDsKKwlhZHBjdGwuYi5hZHBfcHJiX2ludCA9IDA7CisJYWRwY3RsLmIuYWRwX3Rtb3V0X2ludCA9IDA7CisJCQorCXJldHVybiBhZHBjdGwuZDMyOworfQorCisvKioKKyAqIEZ1bmN0aW9uIGlzIGNhbGxlZCB0byB3cml0ZSBBRFAgcmVnaXN0ZXJzCisgKi8KK3ZvaWQgZHdjX290Z19hZHBfbW9kaWZ5X3JlZyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQzMl90IGNsciwKKwkJCSAgICB1aW50MzJfdCBzZXQpCit7CisJZHdjX290Z19hZHBfd3JpdGVfcmVnKGNvcmVfaWYsCisJCQkgICAgICAoZHdjX290Z19hZHBfcmVhZF9yZWcoY29yZV9pZikgJiAofmNscikpIHwgc2V0KTsKK30KKworc3RhdGljIHZvaWQgYWRwX3NlbnNlX3RpbWVvdXQodm9pZCAqcHRyKQoreworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gKGR3Y19vdGdfY29yZV9pZl90ICopIHB0cjsKKwljb3JlX2lmLT5hZHAuc2Vuc2VfdGltZXJfc3RhcnRlZCA9IDA7CisJRFdDX1BSSU5URigiQURQIFNFTlNFIFRJTUVPVVRcbiIpOworCWlmIChjb3JlX2lmLT5hZHBfZW5hYmxlKSB7CisJCWR3Y19vdGdfYWRwX3NlbnNlX3N0b3AoY29yZV9pZik7CisJCWR3Y19vdGdfYWRwX3Byb2JlX3N0YXJ0KGNvcmVfaWYpOworCX0KK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBBRFAgdmJ1cyB0aW1lciBleHBpcmVzLiBUaW1lb3V0IGlzIDEuMXMuCisgKi8KK3N0YXRpYyB2b2lkIGFkcF92YnVzb25fdGltZW91dCh2b2lkICpwdHIpCit7CisJZ3B3cmRuX2RhdGFfdCBncHdyZG47CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSAoZHdjX290Z19jb3JlX2lmX3QgKikgcHRyOworCWhwcnQwX2RhdGFfdCBocHJ0MCA9IHsuZDMyID0gMCB9OworCXBjZ2NjdGxfZGF0YV90IHBjZ2NjdGwgPSB7LmQzMiA9IDAgfTsKKwlEV0NfUFJJTlRGKCIlczogMS4xIHNlY29uZHMgZXhwaXJlIGFmdGVyIHR1cm5pbmcgb24gVkJVU1xuIixfX0ZVTkNUSU9OX18pOworCWlmIChjb3JlX2lmKSB7CisJCWNvcmVfaWYtPmFkcC52YnVzb25fdGltZXJfc3RhcnRlZCA9IDA7CisJCS8qIFR1cm4gb2ZmIHZidXMgKi8KKwkJaHBydDAuYi5wcnRwd3IgPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCBocHJ0MC5kMzIsIDApOworCQlncHdyZG4uZDMyID0gMDsKKworCQkvKiBQb3dlciBvZmYgdGhlIGNvcmUgKi8KKwkJaWYgKGNvcmVfaWYtPnBvd2VyX2Rvd24gPT0gMikgeworCQkJLyogRW5hYmxlIFdha2V1cCBMb2dpYyAqLworLy8gICAgICAgICAgICAgICAgICAgICAgZ3B3cmRuLmIud2t1cGFjdGl2ID0gMTsKKwkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAwOworCQkJZ3B3cmRuLmIucHdyZG5yc3RuID0gMTsKKwkJCWdwd3Jkbi5iLnB3cmRuY2xtcCA9IDE7CisJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIDAsCisJCQkJCSBncHdyZG4uZDMyKTsKKworCQkJLyogU3VzcGVuZCB0aGUgUGh5IENsb2NrICovCisJCQlwY2djY3RsLmIuc3RvcHBjbGsgPSAxOworCQkJRFdDX01PRElGWV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCAwLCBwY2djY3RsLmQzMik7CisKKwkJCS8qIFN3aXRjaCBvbiBWREQgKi8KKy8vICAgICAgICAgICAgICAgICAgICAgIGdwd3Jkbi5iLndrdXBhY3RpdiA9IDE7CisJCQlncHdyZG4uYi5wbXVhY3R2ID0gMTsKKwkJCWdwd3Jkbi5iLnB3cmRucnN0biA9IDE7CisJCQlncHdyZG4uYi5wd3JkbmNsbXAgPSAxOworCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLAorCQkJCQkgZ3B3cmRuLmQzMik7CisJCX0gZWxzZSB7CisJCQkvKiBFbmFibGUgUG93ZXIgRG93biBMb2dpYyAqLworCQkJZ3B3cmRuLmIucG11aW50c2VsID0gMTsKKwkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwkJfQorCisJCS8qIFBvd2VyIG9mZiB0aGUgY29yZSAqLworCQlpZiAoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKSB7CisJCQlncHdyZG4uZDMyID0gMDsKKwkJCWdwd3Jkbi5iLnB3cmRuc3d0Y2ggPSAxOworCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLAorCQkJCQkgZ3B3cmRuLmQzMiwgMCk7CisJCX0KKworCQkvKiBVbm1hc2sgU1JQIGRldGVjdGVkIGludGVycnVwdCBmcm9tIFBvd2VyIERvd24gTG9naWMgKi8KKwkJZ3B3cmRuLmQzMiA9IDA7CisJCWdwd3Jkbi5iLnNycF9kZXRfbXNrID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKworCQlkd2Nfb3RnX2FkcF9wcm9iZV9zdGFydChjb3JlX2lmKTsKKwkJZHdjX290Z19kdW1wX2dsb2JhbF9yZWdpc3RlcnMoY29yZV9pZik7CisJCWR3Y19vdGdfZHVtcF9ob3N0X3JlZ2lzdGVycyhjb3JlX2lmKTsKKwl9CisKK30KKworLyoqCisgKiBTdGFydCB0aGUgQURQIEluaXRpYWwgUHJvYmUgdGltZXIgdG8gZGV0ZWN0IGlmIFBvcnQgQ29ubmVjdGVkIGludGVycnVwdCBpcyAKKyAqIG5vdCBhc3NlcnRlZCB3aXRoaW4gMS4xIHNlY29uZHMuCisgKgorICogQHBhcmFtIGNvcmVfaWYgdGhlIHBvaW50ZXIgdG8gY29yZV9pZiBzdHJ1Y3VyZS4KKyAqLwordm9pZCBkd2Nfb3RnX2FkcF92YnVzb25fdGltZXJfc3RhcnQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWNvcmVfaWYtPmFkcC52YnVzb25fdGltZXJfc3RhcnRlZCA9IDE7CisJaWYgKGNvcmVfaWYtPmFkcC52YnVzb25fdGltZXIpCisJeworCQlEV0NfUFJJTlRGKCJTQ0hFRFVMSU5HIFZCVVNPTiBUSU1FUlxuIik7CisJCS8qIDEuMSBzZWNzICsgNjBtcyBuZWNlc3NhcnkgZm9yIGNpbF9oY2Rfc3RhcnQqLworCQlEV0NfVElNRVJfU0NIRURVTEUoY29yZV9pZi0+YWRwLnZidXNvbl90aW1lciwgMTE2MCk7CisJfSBlbHNlIHsKKwkJRFdDX1dBUk4oIlZCVVNPTl9USU1FUiA9ICVwXG4iLGNvcmVfaWYtPmFkcC52YnVzb25fdGltZXIpOworCX0KK30KKworI2lmIDAKKy8qKgorICogTWFza3MgYWxsIERXQyBPVEcgY29yZSBpbnRlcnJ1cHRzCisgKgorICovCitzdGF0aWMgdm9pZCBtYXNrX2FsbF9pbnRlcnJ1cHRzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpbnQgaTsKKwlnYWhiY2ZnX2RhdGFfdCBhaGJjZmcgPSB7LmQzMiA9IDAgfTsKKworCS8qIE1hc2sgSG9zdCBJbnRlcnJ1cHRzICovCisKKwkvKiBDbGVhciBhbmQgZGlzYWJsZSBIQ0lOVHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY29yZV9pZi0+Y29yZV9wYXJhbXMtPmhvc3RfY2hhbm5lbHM7IGkrKykgeworCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbaV0tPmhjaW50bXNrLCAwKTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5oY19yZWdzW2ldLT5oY2ludCwgMHhGRkZGRkZGRik7CisKKwl9CisKKwkvKiBDbGVhciBhbmQgZGlzYWJsZSBIQUlOVCAqLworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGFpbnRtc2ssIDB4MDAwMCk7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oYWludCwgMHhGRkZGRkZGRik7CisKKwkvKiBNYXNrIERldmljZSBJbnRlcnJ1cHRzICovCisJaWYgKCFjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQkvKiBDbGVhciBhbmQgZGlzYWJsZSBJTiBFbmRwb2ludCBpbnRlcnJ1cHRzICovCisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRpZXBtc2ssIDApOworCQlmb3IgKGkgPSAwOyBpIDw9IGNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsgaSsrKSB7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+CisJCQkJCWRpZXBpbnQsIDB4RkZGRkZGRkYpOworCQl9CisKKwkJLyogQ2xlYXIgYW5kIGRpc2FibGUgT1VUIEVuZHBvaW50IGludGVycnVwdHMgKi8KKwkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZG9lcG1zaywgMCk7CisJCWZvciAoaSA9IDA7IGkgPD0gY29yZV9pZi0+ZGV2X2lmLT5udW1fb3V0X2VwczsgaSsrKSB7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+b3V0X2VwX3JlZ3NbaV0tPgorCQkJCQlkb2VwaW50LCAweEZGRkZGRkZGKTsKKwkJfQorCisJCS8qIENsZWFyIGFuZCBkaXNhYmxlIERBSU5UICovCisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRhaW50LAorCQkJCTB4RkZGRkZGRkYpOworCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kYWludG1zaywgMCk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsgKytpKSB7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT4KKwkJCQkJZGllcGVhY2hpbnRtc2tbaV0sIDApOworCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbaV0tPgorCQkJCQlkaWVwaW50LCAweEZGRkZGRkZGKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5kZXZfaWYtPm51bV9vdXRfZXBzOyArK2kpIHsKKwkJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPgorCQkJCQlkb2VwZWFjaGludG1za1tpXSwgMCk7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+b3V0X2VwX3JlZ3NbaV0tPgorCQkJCQlkb2VwaW50LCAweEZGRkZGRkZGKTsKKwkJfQorCisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRlYWNoaW50bXNrLAorCQkJCTApOworCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kZWFjaGludCwKKwkJCQkweEZGRkZGRkZGKTsKKworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWFoYmNmZy5iLmdsYmxpbnRybXNrID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nYWhiY2ZnLCBhaGJjZmcuZDMyLCAwKTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMuICovCisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLCAwKTsKKworCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIDB4RkZGRkZGRkYpOworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgT1RHIEludGVycnVwdHMgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdvdGdpbnQsIDB4RkZGRkZGRkYpOworfQorCisvKioKKyAqIFVubWFzayBQb3J0IENvbm5lY3Rpb24gRGV0ZWN0ZWQgaW50ZXJydXB0CisgKgorICovCitzdGF0aWMgdm9pZCB1bm1hc2tfY29ubl9kZXRfaW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZ2ludG1za19kYXRhX3QgZ2ludG1zayA9IHsuZDMyID0gMCwuYi5wb3J0aW50ciA9IDEgfTsKKworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaywgZ2ludG1zay5kMzIpOworfQorI2VuZGlmCisKKy8qKgorICogU3RhcnRzIHRoZSBBRFAgUHJvYmluZworICoKKyAqIEBwYXJhbSBjb3JlX2lmIHRoZSBwb2ludGVyIHRvIGNvcmVfaWYgc3RydWN0dXJlLgorICovCit1aW50MzJfdCBkd2Nfb3RnX2FkcF9wcm9iZV9zdGFydChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisKKwlhZHBjdGxfZGF0YV90IGFkcGN0bCA9IHsuZDMyID0gMH07CisJZ3B3cmRuX2RhdGFfdCBncHdyZG47CisjaWYgMAorCWFkcGN0bF9kYXRhX3QgYWRwY3RsX2ludCA9IHsuZDMyID0gMCwgLmIuYWRwX3ByYl9pbnQgPSAxLAorCQkJCQkJCQkuYi5hZHBfc25zX2ludCA9IDEsIGIuYWRwX3Rtb3V0X2ludH07CisjZW5kaWYKKwlkd2Nfb3RnX2Rpc2FibGVfZ2xvYmFsX2ludGVycnVwdHMoY29yZV9pZik7CisJRFdDX1BSSU5URigiQURQIFByb2JlIFN0YXJ0XG4iKTsKKwljb3JlX2lmLT5hZHAucHJvYmVfZW5hYmxlZCA9IDE7CisKKwlhZHBjdGwuYi5hZHByZXMgPSAxOworCWR3Y19vdGdfYWRwX3dyaXRlX3JlZyhjb3JlX2lmLCBhZHBjdGwuZDMyKTsKKworCXdoaWxlIChhZHBjdGwuYi5hZHByZXMpIHsKKwkJYWRwY3RsLmQzMiA9IGR3Y19vdGdfYWRwX3JlYWRfcmVnKGNvcmVfaWYpOworCX0KKworCWFkcGN0bC5kMzIgPSAwOworCWdwd3Jkbi5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuKTsKKworCS8qIEluIEhvc3QgbW9kZSB1bm1hc2sgU1JQIGRldGVjdGVkIGludGVycnVwdCAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnN0c19jaG5naW50X21zayA9IDE7CisJaWYgKCFncHdyZG4uYi5pZHN0cykgeworCQlncHdyZG4uYi5zcnBfZGV0X21zayA9IDE7CisJfQorCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisKKwlhZHBjdGwuYi5hZHBfdG1vdXRfaW50X21zayA9IDE7CisJYWRwY3RsLmIuYWRwX3ByYl9pbnRfbXNrID0gMTsKKwlhZHBjdGwuYi5wcmJfZHNjaGcgPSAxOworCWFkcGN0bC5iLnByYl9kZWx0YSA9IDE7CisJYWRwY3RsLmIucHJiX3BlciA9IDE7CisJYWRwY3RsLmIuYWRwZW4gPSAxOworCWFkcGN0bC5iLmVuYXByYiA9IDE7CisKKwlkd2Nfb3RnX2FkcF93cml0ZV9yZWcoY29yZV9pZiwgYWRwY3RsLmQzMik7CisJRFdDX1BSSU5URigiQURQIFByb2JlIEZpbmlzaFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU3RhcnRzIHRoZSBBRFAgU2Vuc2UgdGltZXIgdG8gZGV0ZWN0IGlmIEFEUCBTZW5zZSBpbnRlcnJ1cHQgaXMgbm90IGFzc2VydGVkIAorICogd2l0aGluIDMgc2Vjb25kcy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiB0aGUgcG9pbnRlciB0byBjb3JlX2lmIHN0cnVjdXJlLgorICovCit2b2lkIGR3Y19vdGdfYWRwX3NlbnNlX3RpbWVyX3N0YXJ0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwljb3JlX2lmLT5hZHAuc2Vuc2VfdGltZXJfc3RhcnRlZCA9IDE7CisJRFdDX1RJTUVSX1NDSEVEVUxFKGNvcmVfaWYtPmFkcC5zZW5zZV90aW1lciwgMzAwMCAvKiAzIHNlY3MgKi8gKTsKK30KKworLyoqCisgKiBTdGFydHMgdGhlIEFEUCBTZW5zZQorICoKKyAqIEBwYXJhbSBjb3JlX2lmIHRoZSBwb2ludGVyIHRvIGNvcmVfaWYgc3RydWN1cmUuCisgKi8KK3VpbnQzMl90IGR3Y19vdGdfYWRwX3NlbnNlX3N0YXJ0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlhZHBjdGxfZGF0YV90IGFkcGN0bDsKKworCURXQ19QUklOVEYoIkFEUCBTZW5zZSBTdGFydFxuIik7CisKKwkvKiBVbm1hc2sgQURQIHNlbnNlIGludGVycnVwdCBhbmQgbWFzayBhbGwgb3RoZXIgZnJvbSB0aGUgY29yZSAqLworCWFkcGN0bC5kMzIgPSBkd2Nfb3RnX2FkcF9yZWFkX3JlZ19maWx0ZXIoY29yZV9pZik7CisJYWRwY3RsLmIuYWRwX3Nuc19pbnRfbXNrID0gMTsKKwlkd2Nfb3RnX2FkcF93cml0ZV9yZWcoY29yZV9pZiwgYWRwY3RsLmQzMik7CisJZHdjX290Z19kaXNhYmxlX2dsb2JhbF9pbnRlcnJ1cHRzKGNvcmVfaWYpOyAvLyB2YWhyYW1hIAorCisJLyogU2V0IEFEUCByZXNldCBiaXQqLworCWFkcGN0bC5kMzIgPSBkd2Nfb3RnX2FkcF9yZWFkX3JlZ19maWx0ZXIoY29yZV9pZik7CisJYWRwY3RsLmIuYWRwcmVzID0gMTsKKwlkd2Nfb3RnX2FkcF93cml0ZV9yZWcoY29yZV9pZiwgYWRwY3RsLmQzMik7CisKKwl3aGlsZSAoYWRwY3RsLmIuYWRwcmVzKSB7CisJCWFkcGN0bC5kMzIgPSBkd2Nfb3RnX2FkcF9yZWFkX3JlZyhjb3JlX2lmKTsKKwl9CisKKwlhZHBjdGwuYi5hZHByZXMgPSAwOworCWFkcGN0bC5iLmFkcGVuID0gMTsKKwlhZHBjdGwuYi5lbmFzbnMgPSAxOworCWR3Y19vdGdfYWRwX3dyaXRlX3JlZyhjb3JlX2lmLCBhZHBjdGwuZDMyKTsKKworCWR3Y19vdGdfYWRwX3NlbnNlX3RpbWVyX3N0YXJ0KGNvcmVfaWYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogU3RvcHMgdGhlIEFEUCBQcm9iaW5nCisgKgorICogQHBhcmFtIGNvcmVfaWYgdGhlIHBvaW50ZXIgdG8gY29yZV9pZiBzdHJ1Y3VyZS4KKyAqLwordWludDMyX3QgZHdjX290Z19hZHBfcHJvYmVfc3RvcChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisKKwlhZHBjdGxfZGF0YV90IGFkcGN0bDsKKwlEV0NfUFJJTlRGKCJTdG9wIEFEUCBwcm9iZVxuIik7CisJY29yZV9pZi0+YWRwLnByb2JlX2VuYWJsZWQgPSAwOworCWNvcmVfaWYtPmFkcC5wcm9iZV9jb3VudGVyID0gMDsKKwlhZHBjdGwuZDMyID0gZHdjX290Z19hZHBfcmVhZF9yZWcoY29yZV9pZik7CisKKwlhZHBjdGwuYi5hZHBlbiA9IDA7CisJYWRwY3RsLmIuYWRwX3ByYl9pbnQgPSAxOworCWFkcGN0bC5iLmFkcF90bW91dF9pbnQgPSAxOworCWFkcGN0bC5iLmFkcF9zbnNfaW50ID0gMTsKKwlkd2Nfb3RnX2FkcF93cml0ZV9yZWcoY29yZV9pZiwgYWRwY3RsLmQzMik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBTdG9wcyB0aGUgQURQIFNlbnNpbmcKKyAqCisgKiBAcGFyYW0gY29yZV9pZiB0aGUgcG9pbnRlciB0byBjb3JlX2lmIHN0cnVjdXJlLgorICovCit1aW50MzJfdCBkd2Nfb3RnX2FkcF9zZW5zZV9zdG9wKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlhZHBjdGxfZGF0YV90IGFkcGN0bDsKKworCWNvcmVfaWYtPmFkcC5zZW5zZV9lbmFibGVkID0gMDsKKworCWFkcGN0bC5kMzIgPSBkd2Nfb3RnX2FkcF9yZWFkX3JlZ19maWx0ZXIoY29yZV9pZik7CisJYWRwY3RsLmIuZW5hc25zID0gMDsKKwlhZHBjdGwuYi5hZHBfc25zX2ludCA9IDE7CisJZHdjX290Z19hZHBfd3JpdGVfcmVnKGNvcmVfaWYsIGFkcGN0bC5kMzIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogQ2FsbGVkIHRvIHR1cm4gb24gdGhlIFZCVVMgYWZ0ZXIgaW5pdGlhbCBBRFAgcHJvYmUgaW4gaG9zdCBtb2RlLgorICogSWYgcG9ydCBwb3dlciB3YXMgYWxyZWFkeSBlbmFibGVkIGluIGNpbF9oY2Rfc3RhcnQgZnVuY3Rpb24gdGhlbgorICogb25seSBzY2hlZHVsZSBhIHRpbWVyLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIHRoZSBwb2ludGVyIHRvIGNvcmVfaWYgc3RydWN0dXJlLgorICovCit2b2lkIGR3Y19vdGdfYWRwX3R1cm5vbl92YnVzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlocHJ0MF9kYXRhX3QgaHBydDAgPSB7LmQzMiA9IDAgfTsKKwlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJRFdDX1BSSU5URigiVHVybiBvbiBWQlVTIGZvciAxLjFzLCBwb3J0IHBvd2VyIGlzICVkXG4iLCBocHJ0MC5iLnBydHB3cik7CisKKwlpZiAoaHBydDAuYi5wcnRwd3IgPT0gMCkgeworCQlocHJ0MC5iLnBydHB3ciA9IDE7CisJCS8vRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCBocHJ0MC5kMzIpOworCX0KKwkKKwlkd2Nfb3RnX2FkcF92YnVzb25fdGltZXJfc3RhcnQoY29yZV9pZik7Cit9CisKKy8qKgorICogQ2FsbGVkIHJpZ2h0IGFmdGVyIGRyaXZlciBpcyBsb2FkZWQKKyAqIHRvIHBlcmZvcm0gaW5pdGlhbCBhY3Rpb25zIGZvciBBRFAKKyAqCisgKiBAcGFyYW0gY29yZV9pZiB0aGUgcG9pbnRlciB0byBjb3JlX2lmIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBpc19ob3N0IC0gZmxhZyBmb3IgY3VycmVudCBtb2RlIG9mIG9wZXJhdGlvbiBlaXRoZXIgZnJvbSBHSU5UU1RTIG9yIEdQV1JETgorICovCit2b2lkIGR3Y19vdGdfYWRwX3N0YXJ0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDhfdCBpc19ob3N0KQoreworCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuOworCisJRFdDX1BSSU5URigiQURQIEluaXRpYWwgU3RhcnRcbiIpOworCWNvcmVfaWYtPmFkcC5hZHBfc3RhcnRlZCA9IDE7CisKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIDB4RkZGRkZGRkYpOworCWR3Y19vdGdfZGlzYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhjb3JlX2lmKTsKKwlpZiAoaXNfaG9zdCkgeworCQlEV0NfUFJJTlRGKCJIT1NUIE1PREVcbiIpOworCQkvKiBFbmFibGUgUG93ZXIgRG93biBMb2dpYyBJbnRlcnJ1cHQqLworCQlncHdyZG4uZDMyID0gMDsKKwkJZ3B3cmRuLmIucG11aW50c2VsID0gMTsKKwkJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJCS8qIEluaXRpYWxpemUgZmlyc3QgQURQIHByb2JlIHRvIG9idGFpbiBSYW1wIFRpbWUgdmFsdWUgKi8KKwkJY29yZV9pZi0+YWRwLmluaXRpYWxfcHJvYmUgPSAxOworCQlkd2Nfb3RnX2FkcF9wcm9iZV9zdGFydChjb3JlX2lmKTsKKwl9IGVsc2UgeworCQlnb3RnY3RsX2RhdGFfdCBnb3RnY3RsOworCQlnb3RnY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsKTsKKwkJRFdDX1BSSU5URigiREVWSUNFIE1PREVcbiIpOworCQlpZiAoZ290Z2N0bC5iLmJzZXN2bGQgPT0gMCkgeworCQkJLyogRW5hYmxlIFBvd2VyIERvd24gTG9naWMgSW50ZXJydXB0Ki8KKwkJCWdwd3Jkbi5kMzIgPSAwOworCQkJRFdDX1BSSU5URigiVkJVUyBpcyBub3QgdmFsaWQgLSBzdGFydCBBRFAgcHJvYmVcbiIpOworCQkJZ3B3cmRuLmIucG11aW50c2VsID0gMTsKKwkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwkJCWNvcmVfaWYtPmFkcC5pbml0aWFsX3Byb2JlID0gMTsKKwkJCWR3Y19vdGdfYWRwX3Byb2JlX3N0YXJ0KGNvcmVfaWYpOworCQl9IGVsc2UgeworCQkJRFdDX1BSSU5URigiVkJVUyBpcyB2YWxpZCAtIGluaXRpYWxpemUgY29yZSBhcyBhIERldmljZVxuIik7CisJCQljb3JlX2lmLT5vcF9zdGF0ZSA9IEJfUEVSSVBIRVJBTDsKKwkJCWR3Y19vdGdfY29yZV9pbml0KGNvcmVfaWYpOworCQkJZHdjX290Z19lbmFibGVfZ2xvYmFsX2ludGVycnVwdHMoY29yZV9pZik7CisJCQljaWxfcGNkX3N0YXJ0KGNvcmVfaWYpOworCQkJZHdjX290Z19kdW1wX2dsb2JhbF9yZWdpc3RlcnMoY29yZV9pZik7CisJCQlkd2Nfb3RnX2R1bXBfZGV2X3JlZ2lzdGVycyhjb3JlX2lmKTsKKwkJfQorCX0KK30KKwordm9pZCBkd2Nfb3RnX2FkcF9pbml0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwljb3JlX2lmLT5hZHAuYWRwX3N0YXJ0ZWQgPSAwOworCWNvcmVfaWYtPmFkcC5pbml0aWFsX3Byb2JlID0gMDsKKwljb3JlX2lmLT5hZHAucHJvYmVfdGltZXJfdmFsdWVzWzBdID0gLTE7CisJY29yZV9pZi0+YWRwLnByb2JlX3RpbWVyX3ZhbHVlc1sxXSA9IC0xOworCWNvcmVfaWYtPmFkcC5wcm9iZV9lbmFibGVkID0gMDsKKwljb3JlX2lmLT5hZHAuc2Vuc2VfZW5hYmxlZCA9IDA7CisJY29yZV9pZi0+YWRwLnNlbnNlX3RpbWVyX3N0YXJ0ZWQgPSAwOworCWNvcmVfaWYtPmFkcC52YnVzb25fdGltZXJfc3RhcnRlZCA9IDA7CisJY29yZV9pZi0+YWRwLnByb2JlX2NvdW50ZXIgPSAwOworCWNvcmVfaWYtPmFkcC5ncHdyZG4gPSAwOworCWNvcmVfaWYtPmFkcC5hdHRhY2hlZCA9IERXQ19PVEdfQURQX1VOS09XTjsKKwkvKiBJbml0aWFsaXplIHRpbWVycyAqLworCWNvcmVfaWYtPmFkcC5zZW5zZV90aW1lciA9CisJICAgIERXQ19USU1FUl9BTExPQygiQURQIFNFTlNFIFRJTUVSIiwgYWRwX3NlbnNlX3RpbWVvdXQsIGNvcmVfaWYpOworCWNvcmVfaWYtPmFkcC52YnVzb25fdGltZXIgPQorCSAgICBEV0NfVElNRVJfQUxMT0MoIkFEUCBWQlVTIE9OIFRJTUVSIiwgYWRwX3ZidXNvbl90aW1lb3V0LCBjb3JlX2lmKTsKKwlpZiAoIWNvcmVfaWYtPmFkcC5zZW5zZV90aW1lciB8fCAhY29yZV9pZi0+YWRwLnZidXNvbl90aW1lcikKKwl7CisJCURXQ19FUlJPUigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgQURQIHRpbWVyc1xuIik7CisJfQorfQorCit2b2lkIGR3Y19vdGdfYWRwX3JlbW92ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZ3B3cmRuX2RhdGFfdCBncHdyZG4gPSB7IC5kMzIgPSAwIH07CisJZ3B3cmRuLmIucG11aW50c2VsID0gMTsKKwlncHdyZG4uYi5wbXVhY3R2ID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCisJaWYgKGNvcmVfaWYtPmFkcC5wcm9iZV9lbmFibGVkKQkJCisJCWR3Y19vdGdfYWRwX3Byb2JlX3N0b3AoY29yZV9pZik7CisJaWYgKGNvcmVfaWYtPmFkcC5zZW5zZV9lbmFibGVkKQkJCisJCWR3Y19vdGdfYWRwX3NlbnNlX3N0b3AoY29yZV9pZik7CisJaWYgKGNvcmVfaWYtPmFkcC5zZW5zZV90aW1lcl9zdGFydGVkKQkJCisJCURXQ19USU1FUl9DQU5DRUwoY29yZV9pZi0+YWRwLnNlbnNlX3RpbWVyKTsKKwlpZiAoY29yZV9pZi0+YWRwLnZidXNvbl90aW1lcl9zdGFydGVkKQkJCisJCURXQ19USU1FUl9DQU5DRUwoY29yZV9pZi0+YWRwLnZidXNvbl90aW1lcik7CisJRFdDX1RJTUVSX0ZSRUUoY29yZV9pZi0+YWRwLnNlbnNlX3RpbWVyKTsKKwlEV0NfVElNRVJfRlJFRShjb3JlX2lmLT5hZHAudmJ1c29uX3RpbWVyKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLyBBRFAgSW50ZXJydXB0IEhhbmRsZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgUmFtcCBUaW1lciB2YWx1ZXMKKyAqLworc3RhdGljIHVpbnQzMl90IHNldF90aW1lcl92YWx1ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQzMl90IHZhbCkKK3sKKwlpZiAoY29yZV9pZi0+YWRwLnByb2JlX3RpbWVyX3ZhbHVlc1swXSA9PSAtMSkgeworCQljb3JlX2lmLT5hZHAucHJvYmVfdGltZXJfdmFsdWVzWzBdID0gdmFsOworCQljb3JlX2lmLT5hZHAucHJvYmVfdGltZXJfdmFsdWVzWzFdID0gLTE7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWNvcmVfaWYtPmFkcC5wcm9iZV90aW1lcl92YWx1ZXNbMV0gPQorCQkgICAgY29yZV9pZi0+YWRwLnByb2JlX3RpbWVyX3ZhbHVlc1swXTsKKwkJY29yZV9pZi0+YWRwLnByb2JlX3RpbWVyX3ZhbHVlc1swXSA9IHZhbDsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gY29tcGFyZXMgUmFtcCBUaW1lciB2YWx1ZXMKKyAqLworc3RhdGljIHVpbnQzMl90IGNvbXBhcmVfdGltZXJfdmFsdWVzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwl1aW50MzJfdCBkaWZmOworCWlmIChjb3JlX2lmLT5hZHAucHJvYmVfdGltZXJfdmFsdWVzWzBdPj1jb3JlX2lmLT5hZHAucHJvYmVfdGltZXJfdmFsdWVzWzFdKQorCQkJZGlmZiA9IGNvcmVfaWYtPmFkcC5wcm9iZV90aW1lcl92YWx1ZXNbMF0tY29yZV9pZi0+YWRwLnByb2JlX3RpbWVyX3ZhbHVlc1sxXTsKKwllbHNlCisJCQlkaWZmID0gY29yZV9pZi0+YWRwLnByb2JlX3RpbWVyX3ZhbHVlc1sxXS1jb3JlX2lmLT5hZHAucHJvYmVfdGltZXJfdmFsdWVzWzBdOyAgIAkKKwlpZihkaWZmIDwgMikgeworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEFEUCBQcm9iZSBJbnRlcnJ1cHRzCisgKi8KK3N0YXRpYyBpbnQzMl90IGR3Y19vdGdfYWRwX2hhbmRsZV9wcmJfaW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCQkgdWludDMyX3QgdmFsKQoreworCWFkcGN0bF9kYXRhX3QgYWRwY3RsID0gey5kMzIgPSAwIH07CisJZ3B3cmRuX2RhdGFfdCBncHdyZG4sIHRlbXA7CisJYWRwY3RsLmQzMiA9IHZhbDsKKworCXRlbXAuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3Jkbik7CisJY29yZV9pZi0+YWRwLnByb2JlX2NvdW50ZXIrKzsKKwljb3JlX2lmLT5hZHAuZ3B3cmRuID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3Jkbik7CisJaWYgKGFkcGN0bC5iLnJ0aW0gPT0gMCAmJiAhdGVtcC5iLmlkc3RzKXsKKwkJRFdDX1BSSU5URigiUlRJTSB2YWx1ZSBpcyAwXG4iKTsJCisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKHNldF90aW1lcl92YWx1ZShjb3JlX2lmLCBhZHBjdGwuYi5ydGltKSAmJgorCSAgICBjb3JlX2lmLT5hZHAuaW5pdGlhbF9wcm9iZSkgeworCQljb3JlX2lmLT5hZHAuaW5pdGlhbF9wcm9iZSA9IDA7CisJCWR3Y19vdGdfYWRwX3Byb2JlX3N0b3AoY29yZV9pZik7CisJCWdwd3Jkbi5kMzIgPSAwOworCQlncHdyZG4uYi5wbXVhY3R2ID0gMTsKKwkJZ3B3cmRuLmIucG11aW50c2VsID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzLCAweEZGRkZGRkZGKTsKKworCQkvKiBjaGVjayB3aGljaCB2YWx1ZSBpcyBmb3IgZGV2aWNlIG1vZGUgYW5kIHdoaWNoIGZvciBIb3N0IG1vZGUgKi8KKwkJaWYgKCF0ZW1wLmIuaWRzdHMpIHsJLyogY29uc2lkZXJlZCBob3N0IG1vZGUgdmFsdWUgaXMgMCAqLworCQkJLyoKKwkJCSAqIFR1cm4gb24gVkJVUyBhZnRlciBpbml0aWFsIEFEUCBwcm9iZS4KKwkJCSAqLworCQkJY29yZV9pZi0+b3Bfc3RhdGUgPSBBX0hPU1Q7CisJCQlkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhjb3JlX2lmKTsKKwkJCURXQ19TUElOVU5MT0NLKGNvcmVfaWYtPmxvY2spOworCQkJY2lsX2hjZF9zdGFydChjb3JlX2lmKTsKKwkJCWR3Y19vdGdfYWRwX3R1cm5vbl92YnVzKGNvcmVfaWYpOworCQkJRFdDX1NQSU5MT0NLKGNvcmVfaWYtPmxvY2spOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEluaXRpYXRlIFNSUCBhZnRlciBpbml0aWFsIEFEUCBwcm9iZS4KKwkJCSAqLworCQkJZHdjX290Z19lbmFibGVfZ2xvYmFsX2ludGVycnVwdHMoY29yZV9pZik7CisJCQlkd2Nfb3RnX2luaXRpYXRlX3NycChjb3JlX2lmKTsKKwkJfQorCX0gZWxzZSBpZiAoY29yZV9pZi0+YWRwLnByb2JlX2NvdW50ZXIgPiAyKXsKKwkJZ3B3cmRuLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4pOworCQlpZiAoY29tcGFyZV90aW1lcl92YWx1ZXMoY29yZV9pZikpIHsKKwkJCURXQ19QUklOVEYoIkRpZmZlcmVuY2UgaW4gdGltZXIgdmFsdWVzICEhISBcbiIpOworLy8gICAgICAgICAgICAgICAgICAgICAgY29yZV9pZi0+YWRwLmF0dGFjaGVkID0gRFdDX09UR19BRFBfQVRUQUNIRUQ7CisJCQlkd2Nfb3RnX2FkcF9wcm9iZV9zdG9wKGNvcmVfaWYpOworCisJCQkvKiBQb3dlciBvbiB0aGUgY29yZSAqLworCQkJaWYgKGNvcmVfaWYtPnBvd2VyX2Rvd24gPT0gMikgeworCQkJCWdwd3Jkbi5iLnB3cmRuc3d0Y2ggPSAxOworCQkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPgorCQkJCQkJIGdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJCQl9CisKKwkJCS8qIGNoZWNrIHdoaWNoIHZhbHVlIGlzIGZvciBkZXZpY2UgbW9kZSBhbmQgd2hpY2ggZm9yIEhvc3QgbW9kZSAqLworCQkJaWYgKCF0ZW1wLmIuaWRzdHMpIHsJLyogY29uc2lkZXJlZCBob3N0IG1vZGUgdmFsdWUgaXMgMCAqLworCQkJCS8qIERpc2FibGUgSW50ZXJydXB0IGZyb20gUG93ZXIgRG93biBMb2dpYyAqLworCQkJCWdwd3Jkbi5kMzIgPSAwOworCQkJCWdwd3Jkbi5iLnBtdWludHNlbCA9IDE7CisJCQkJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkgZ3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKworCQkJCS8qCisJCQkJICogSW5pdGlhbGl6ZSB0aGUgQ29yZSBmb3IgSG9zdCBtb2RlLgorCQkJCSAqLworCQkJCWNvcmVfaWYtPm9wX3N0YXRlID0gQV9IT1NUOworCQkJCWR3Y19vdGdfY29yZV9pbml0KGNvcmVfaWYpOworCQkJCWR3Y19vdGdfZW5hYmxlX2dsb2JhbF9pbnRlcnJ1cHRzKGNvcmVfaWYpOworCQkJCWNpbF9oY2Rfc3RhcnQoY29yZV9pZik7CisJCQl9IGVsc2UgeworCQkJCWdvdGdjdGxfZGF0YV90IGdvdGdjdGw7CisJCQkJLyogTWFzayBTUlAgZGV0ZWN0ZWQgaW50ZXJydXB0IGZyb20gUG93ZXIgRG93biBMb2dpYyAqLworCQkJCWdwd3Jkbi5kMzIgPSAwOworCQkJCWdwd3Jkbi5iLnNycF9kZXRfbXNrID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCisJCQkJLyogRGlzYWJsZSBQb3dlciBEb3duIExvZ2ljICovCisJCQkJZ3B3cmRuLmQzMiA9IDA7CisJCQkJZ3B3cmRuLmIucG11aW50c2VsID0gMTsKKwkJCQlncHdyZG4uYi5wbXVhY3R2ID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCisJCQkJLyoKKwkJCQkgKiBJbml0aWFsaXplIHRoZSBDb3JlIGZvciBEZXZpY2UgbW9kZS4KKwkJCQkgKi8KKwkJCQljb3JlX2lmLT5vcF9zdGF0ZSA9IEJfUEVSSVBIRVJBTDsKKwkJCQlkd2Nfb3RnX2NvcmVfaW5pdChjb3JlX2lmKTsKKwkJCQlkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhjb3JlX2lmKTsKKwkJCQljaWxfcGNkX3N0YXJ0KGNvcmVfaWYpOworCisJCQkJZ290Z2N0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z290Z2N0bCk7CisJCQkJaWYgKCFnb3RnY3RsLmIuYnNlc3ZsZCkgeworCQkJCQlkd2Nfb3RnX2luaXRpYXRlX3NycChjb3JlX2lmKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGNvcmVfaWYtPnBvd2VyX2Rvd24gPT0gMikgeworCQkJaWYgKGdwd3Jkbi5iLmJzZXNzdmxkKSB7CisJCQkJLyogTWFzayBTUlAgZGV0ZWN0ZWQgaW50ZXJydXB0IGZyb20gUG93ZXIgRG93biBMb2dpYyAqLworCQkJCWdwd3Jkbi5kMzIgPSAwOworCQkJCWdwd3Jkbi5iLnNycF9kZXRfbXNrID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCQkJCQorCQkJCS8qIERpc2FibGUgUG93ZXIgRG93biBMb2dpYyAqLworCQkJCWdwd3Jkbi5kMzIgPSAwOworCQkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisKKwkJCQkvKgorCQkJCSAqIEluaXRpYWxpemUgdGhlIENvcmUgZm9yIERldmljZSBtb2RlLgorCQkJCSAqLworCQkJCWNvcmVfaWYtPm9wX3N0YXRlID0gQl9QRVJJUEhFUkFMOworCQkJCWR3Y19vdGdfY29yZV9pbml0KGNvcmVfaWYpOworCQkJCWR3Y19vdGdfZW5hYmxlX2dsb2JhbF9pbnRlcnJ1cHRzKGNvcmVfaWYpOworCQkJCWNpbF9wY2Rfc3RhcnQoY29yZV9pZik7CisJCQl9CisJCX0KKwl9CitleGl0OgorCS8qIENsZWFyIGludGVycnVwdCAqLworCWFkcGN0bC5kMzIgPSBkd2Nfb3RnX2FkcF9yZWFkX3JlZyhjb3JlX2lmKTsKKwlhZHBjdGwuYi5hZHBfcHJiX2ludCA9IDE7CisJZHdjX290Z19hZHBfd3JpdGVfcmVnKGNvcmVfaWYsIGFkcGN0bC5kMzIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBoYWRsZXMgQURQIFNlbnNlIEludGVycnVwdAorICovCitzdGF0aWMgaW50MzJfdCBkd2Nfb3RnX2FkcF9oYW5kbGVfc25zX2ludHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWFkcGN0bF9kYXRhX3QgYWRwY3RsOworCS8qIFN0b3AgQURQIFNlbnNlIHRpbWVyICovCisJRFdDX1RJTUVSX0NBTkNFTChjb3JlX2lmLT5hZHAuc2Vuc2VfdGltZXIpOworCisJLyogUmVzdGFydCBBRFAgU2Vuc2UgdGltZXIgKi8KKwlkd2Nfb3RnX2FkcF9zZW5zZV90aW1lcl9zdGFydChjb3JlX2lmKTsKKwkKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwlhZHBjdGwuZDMyID0gZHdjX290Z19hZHBfcmVhZF9yZWcoY29yZV9pZik7CisJYWRwY3RsLmIuYWRwX3Nuc19pbnQgPSAxOworCWR3Y19vdGdfYWRwX3dyaXRlX3JlZyhjb3JlX2lmLCBhZHBjdGwuZDMyKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBBRFAgUHJvYmUgSW50ZXJydXB0cworICovCitzdGF0aWMgaW50MzJfdCBkd2Nfb3RnX2FkcF9oYW5kbGVfcHJiX3Rtb3V0X2ludHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkJIHVpbnQzMl90IHZhbCkKK3sKKwlhZHBjdGxfZGF0YV90IGFkcGN0bCA9IHsuZDMyID0gMCB9OworCWFkcGN0bC5kMzIgPSB2YWw7CisJc2V0X3RpbWVyX3ZhbHVlKGNvcmVfaWYsIGFkcGN0bC5iLnJ0aW0pOworCQorCS8qIENsZWFyIGludGVycnVwdCAqLworCWFkcGN0bC5kMzIgPSBkd2Nfb3RnX2FkcF9yZWFkX3JlZyhjb3JlX2lmKTsKKwlhZHBjdGwuYi5hZHBfdG1vdXRfaW50ID0gMTsKKwlkd2Nfb3RnX2FkcF93cml0ZV9yZWcoY29yZV9pZiwgYWRwY3RsLmQzMik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBBRFAgSW50ZXJydXB0IGhhbmRsZXIuCisgKgorICovCitpbnQzMl90IGR3Y19vdGdfYWRwX2hhbmRsZV9pbnRyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlhZHBjdGxfZGF0YV90IGFkcGN0bCA9IHsuZDMyID0gMH07CisKKwlhZHBjdGwuZDMyID0gZHdjX290Z19hZHBfcmVhZF9yZWcoY29yZV9pZik7CisJRFdDX1BSSU5URigiQURQQ1RMID0gJTA4eFxuIixhZHBjdGwuZDMyKTsKKworCWlmIChhZHBjdGwuYi5hZHBfc25zX2ludCAmIGFkcGN0bC5iLmFkcF9zbnNfaW50X21zaykgeworCQlEV0NfUFJJTlRGKCJBRFAgU2Vuc2UgaW50ZXJydXB0XG4iKTsKKwkJcmV0dmFsIHw9IGR3Y19vdGdfYWRwX2hhbmRsZV9zbnNfaW50cihjb3JlX2lmKTsKKwl9CisJaWYgKGFkcGN0bC5iLmFkcF90bW91dF9pbnQgJiBhZHBjdGwuYi5hZHBfdG1vdXRfaW50X21zaykgeworCQlEV0NfUFJJTlRGKCJBRFAgdGltZW91dCBpbnRlcnJ1cHRcbiIpOworCQlyZXR2YWwgfD0gZHdjX290Z19hZHBfaGFuZGxlX3ByYl90bW91dF9pbnRyKGNvcmVfaWYsIGFkcGN0bC5kMzIpOworCX0KKwlpZiAoYWRwY3RsLmIuYWRwX3ByYl9pbnQgJiBhZHBjdGwuYi5hZHBfcHJiX2ludF9tc2spIHsKKwkJRFdDX1BSSU5URigiQURQIFByb2JlIGludGVycnVwdFxuIik7CisJCWFkcGN0bC5iLmFkcF9wcmJfaW50ID0gMTsJCisJCXJldHZhbCB8PSBkd2Nfb3RnX2FkcF9oYW5kbGVfcHJiX2ludHIoY29yZV9pZiwgYWRwY3RsLmQzMik7CisJfQorCisvLwlkd2Nfb3RnX2FkcF9tb2RpZnlfcmVnKGNvcmVfaWYsIGFkcGN0bC5kMzIsIDApOworCS8vZHdjX290Z19hZHBfd3JpdGVfcmVnKGNvcmVfaWYsIGFkcGN0bC5kMzIpOworCURXQ19QUklOVEYoIlJFVFVSTiBGUk9NIEFEUCBJU1JcbiIpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKi8KK2ludDMyX3QgZHdjX290Z19hZHBfaGFuZGxlX3NycF9pbnRyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKworI2lmbmRlZiBEV0NfSE9TVF9PTkxZCisJaHBydDBfZGF0YV90IGhwcnQwOworCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuOworCURXQ19ERUJVR1BMKERCR19BTlksICIrKyBQb3dlciBEb3duIExvZ2ljIFNlc3Npb24gUmVxdWVzdCBJbnRlcnJ1cHQrK1xuIik7CisKKwlncHdyZG4uZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3Jkbik7CisJLyogY2hlY2sgd2hpY2ggdmFsdWUgaXMgZm9yIGRldmljZSBtb2RlIGFuZCB3aGljaCBmb3IgSG9zdCBtb2RlICovCisJaWYgKCFncHdyZG4uYi5pZHN0cykgewkvKiBjb25zaWRlcmVkIGhvc3QgbW9kZSB2YWx1ZSBpcyAwICovCisJCURXQ19QUklOVEYoIlNSUDogSG9zdCBtb2RlXG4iKTsKKworCQlpZiAoY29yZV9pZi0+YWRwX2VuYWJsZSkgeworCQkJZHdjX290Z19hZHBfcHJvYmVfc3RvcChjb3JlX2lmKTsKKworCQkJLyogUG93ZXIgb24gdGhlIGNvcmUgKi8KKwkJCWlmIChjb3JlX2lmLT5wb3dlcl9kb3duID09IDIpIHsKKwkJCQlncHdyZG4uYi5wd3JkbnN3dGNoID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBncHdyZG4sIDAsIGdwd3Jkbi5kMzIpOworCQkJfQorCisJCQljb3JlX2lmLT5vcF9zdGF0ZSA9IEFfSE9TVDsKKwkJCWR3Y19vdGdfY29yZV9pbml0KGNvcmVfaWYpOworCQkJZHdjX290Z19lbmFibGVfZ2xvYmFsX2ludGVycnVwdHMoY29yZV9pZik7CisJCQljaWxfaGNkX3N0YXJ0KGNvcmVfaWYpOworCQl9CisKKwkJLyogVHVybiBvbiB0aGUgcG9ydCBwb3dlciBiaXQuICovCisJCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwkJaHBydDAuYi5wcnRwd3IgPSAxOworCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisKKwkJLyogU3RhcnQgdGhlIENvbm5lY3Rpb24gdGltZXIuIFNvIGEgbWVzc2FnZSBjYW4gYmUgZGlzcGxheWVkCisJCSAqIGlmIGNvbm5lY3QgZG9lcyBub3Qgb2NjdXIgd2l0aGluIDEwIHNlY29uZHMuICovCisJCWNpbF9oY2Rfc2Vzc2lvbl9zdGFydChjb3JlX2lmKTsKKwl9IGVsc2UgeworCQlEV0NfUFJJTlRGKCJTUlA6IERldmljZSBtb2RlICVzXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpZiAoY29yZV9pZi0+YWRwX2VuYWJsZSkgeworCQkJZHdjX290Z19hZHBfcHJvYmVfc3RvcChjb3JlX2lmKTsKKworCQkJLyogUG93ZXIgb24gdGhlIGNvcmUgKi8KKwkJCWlmIChjb3JlX2lmLT5wb3dlcl9kb3duID09IDIpIHsKKwkJCQlncHdyZG4uYi5wd3JkbnN3dGNoID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBncHdyZG4sIDAsIGdwd3Jkbi5kMzIpOworCQkJfQorCisJCQlncHdyZG4uZDMyID0gMDsKKwkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAwOworCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLAorCQkJCQkgZ3B3cmRuLmQzMik7CisKKwkJCWNvcmVfaWYtPm9wX3N0YXRlID0gQl9QRVJJUEhFUkFMOworCQkJZHdjX290Z19jb3JlX2luaXQoY29yZV9pZik7CisJCQlkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhjb3JlX2lmKTsKKwkJCWNpbF9wY2Rfc3RhcnQoY29yZV9pZik7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19hZHAuaCBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19hZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGMzZjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2FkcC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAkRmlsZTogLy9kd2gvdXNiX2lpcC9kZXYvc29mdHdhcmUvb3RnL2xpbnV4L2RyaXZlcnMvZHdjX290Z19hZHAuaCAkCisgKiAkUmV2aXNpb246ICM3ICQKKyAqICREYXRlOiAyMDExLzEwLzI0ICQKKyAqICRDaGFuZ2U6IDE4NzExNTkgJAorICoKKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgX19EV0NfT1RHX0FEUF9IX18KKyNkZWZpbmUgX19EV0NfT1RHX0FEUF9IX18KKworLyoqCisgKiBAZmlsZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQXR0YWNoIERldGVjdCBQcm90b2NvbCBpbnRlcmZhY2VzIGFuZCBkZWZpbmVzCisgKiAoZnVuY3Rpb25zKSBhbmQgc3RydWN0dXJlcyBmb3IgTGludXguCisgKgorICovCisKKyNkZWZpbmUgRFdDX09UR19BRFBfVU5BVFRBQ0hFRAkwCisjZGVmaW5lIERXQ19PVEdfQURQX0FUVEFDSEVECTEKKyNkZWZpbmUgRFdDX09UR19BRFBfVU5LT1dOCTIKKwordHlwZWRlZiBzdHJ1Y3QgZHdjX290Z19hZHAgeworCXVpbnQzMl90IGFkcF9zdGFydGVkOwkKKwl1aW50MzJfdCBpbml0aWFsX3Byb2JlOworCWludDMyX3QgcHJvYmVfdGltZXJfdmFsdWVzWzJdOworCXVpbnQzMl90IHByb2JlX2VuYWJsZWQ7CisJdWludDMyX3Qgc2Vuc2VfZW5hYmxlZDsKKwlkd2NfdGltZXJfdCAqc2Vuc2VfdGltZXI7CisJdWludDMyX3Qgc2Vuc2VfdGltZXJfc3RhcnRlZDsKKwlkd2NfdGltZXJfdCAqdmJ1c29uX3RpbWVyOworCXVpbnQzMl90IHZidXNvbl90aW1lcl9zdGFydGVkOworCXVpbnQzMl90IGF0dGFjaGVkOworCXVpbnQzMl90IHByb2JlX2NvdW50ZXI7CisJdWludDMyX3QgZ3B3cmRuOworfSBkd2Nfb3RnX2FkcF90OworCisvKioKKyAqIEF0dGFjaCBEZXRlY3QgUHJvdG9jb2wgZnVuY3Rpb25zCisgKi8KKworZXh0ZXJuIHZvaWQgZHdjX290Z19hZHBfd3JpdGVfcmVnKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsdWUpOworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfYWRwX3JlYWRfcmVnKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CitleHRlcm4gdWludDMyX3QgZHdjX290Z19hZHBfcHJvYmVfc3RhcnQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2FkcF9zZW5zZV9zdGFydChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfYWRwX3Byb2JlX3N0b3AoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2FkcF9zZW5zZV9zdG9wKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2FkcF9zdGFydChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQ4X3QgaXNfaG9zdCk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2FkcF9pbml0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2FkcF9yZW1vdmUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfYWRwX2hhbmRsZV9pbnRyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2FkcF9oYW5kbGVfc3JwX2ludHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKworI2VuZGlmIC8vX19EV0NfT1RHX0FEUF9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19hdHRyLmMgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjBjMjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfYXR0ci5jCkBAIC0wLDAgKzEsMTQzMyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9vdGcvbGludXgvZHJpdmVycy9kd2Nfb3RnX2F0dHIuYyAkCisgKiAkUmV2aXNpb246ICM0NCAkCisgKiAkRGF0ZTogMjAxMC8xMS8yOSAkCisgKiAkQ2hhbmdlOiAxNjM2MDMzICQKKyAqCisgKiBTeW5vcHN5cyBIUyBPVEcgTGludXggU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIChoZXJlaW5hZnRlciwKKyAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdCB1bmRlcgorICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAorICogd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKKyAqIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLCBkaXNjbG9zZSwgY29weSBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSBvcgorICogYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tCisgKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKKyAqIGJlbG93LCB0aGVuIHlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiogQGZpbGUKKyAqCisgKiBUaGUgZGlhZ25vc3RpYyBpbnRlcmZhY2Ugd2lsbCBwcm92aWRlIGFjY2VzcyB0byB0aGUgY29udHJvbGxlciBmb3IKKyAqIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSBhbmQgdGVzdGluZy4gIFRoZSBMaW51eCBkcml2ZXIgYXR0cmlidXRlcworICogZmVhdHVyZSB3aWxsIGJlIHVzZWQgdG8gcHJvdmlkZSB0aGUgTGludXggRGlhZ25vc3RpYworICogSW50ZXJmYWNlLiBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NlZCB0aHJvdWdoIHN5c2ZzLgorICovCisKKy8qKiBAcGFnZSAiTGludXggTW9kdWxlIEF0dHJpYnV0ZXMiCisgKgorICogVGhlIExpbnV4IG1vZHVsZSBhdHRyaWJ1dGVzIGZlYXR1cmUgaXMgdXNlZCB0byBwcm92aWRlIHRoZSBMaW51eAorICogRGlhZ25vc3RpYyBJbnRlcmZhY2UuICBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NlZCB0aHJvdWdoIHN5c2ZzLgorICogVGhlIGRpYWdub3N0aWMgaW50ZXJmYWNlIHdpbGwgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGNvbnRyb2xsZXIgZm9yCisgKiBicmluZ2luZyB1cCB0aGUgaGFyZHdhcmUgYW5kIHRlc3RpbmcuCisKKyBUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBhdHRyaWJ1dGVzLgorIDx0YWJsZT4KKyA8dHI+CisgPHRkPjxiPiBOYW1lPC9iPjwvdGQ+CisgPHRkPjxiPiBEZXNjcmlwdGlvbjwvYj48L3RkPgorIDx0ZD48Yj4gQWNjZXNzPC9iPjwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IG1vZGUgPC90ZD4KKyA8dGQ+IFJldHVybnMgdGhlIGN1cnJlbnQgbW9kZTogMCBmb3IgZGV2aWNlIG1vZGUsIDEgZm9yIGhvc3QgbW9kZTwvdGQ+CisgPHRkPiBSZWFkPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gaG5wY2FwYWJsZSA8L3RkPgorIDx0ZD4gR2V0cyBvciBzZXRzIHRoZSAiSE5QLWNhcGFibGUiIGJpdCBpbiB0aGUgQ29yZSBVU0IgQ29uZmlndXJhdG9uIFJlZ2lzdGVyLgorIFJlYWQgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZS48L3RkPgorIDx0ZD4gUmVhZC9Xcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IHNycGNhcGFibGUgPC90ZD4KKyA8dGQ+IEdldHMgb3Igc2V0cyB0aGUgIlNSUC1jYXBhYmxlIiBiaXQgaW4gdGhlIENvcmUgVVNCIENvbmZpZ3VyYXRvbiBSZWdpc3Rlci4KKyBSZWFkIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUuPC90ZD4KKyA8dGQ+IFJlYWQvV3JpdGU8L3RkPgorIDwvdHI+CisKKyA8dHI+CisgPHRkPiBoc2ljX2Nvbm5lY3QgPC90ZD4KKyA8dGQ+IEdldHMgb3Igc2V0cyB0aGUgIkhTSUMtQ29ubmVjdCIgYml0IGluIHRoZSBHTFBNQ0ZHIFJlZ2lzdGVyLgorIFJlYWQgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZS48L3RkPgorIDx0ZD4gUmVhZC9Xcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IGludl9zZWxfaHNpYyA8L3RkPgorIDx0ZD4gR2V0cyBvciBzZXRzIHRoZSAiSW52ZXJ0IFNlbGVjdCBIU0lDIiBiaXQgaW4gdGhlIEdMUE1GRyBSZWdpc3Rlci4KKyBSZWFkIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUuPC90ZD4KKyA8dGQ+IFJlYWQvV3JpdGU8L3RkPgorIDwvdHI+CisKKyA8dHI+CisgPHRkPiBobnAgPC90ZD4KKyA8dGQ+IEluaXRpYXRlcyB0aGUgSG9zdCBOZWdvdGlhdGlvbiBQcm90b2NvbC4gIFJlYWQgcmV0dXJucyB0aGUgc3RhdHVzLjwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gc3JwIDwvdGQ+CisgPHRkPiBJbml0aWF0ZXMgdGhlIFNlc3Npb24gUmVxdWVzdCBQcm90b2NvbC4gIFJlYWQgcmV0dXJucyB0aGUgc3RhdHVzLjwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gYnVzcG93ZXIgPC90ZD4KKyA8dGQ+IEdldHMgb3Igc2V0cyB0aGUgUG93ZXIgU3RhdGUgb2YgdGhlIGJ1cyAoMCAtIE9mZiBvciAxIC0gT24pPC90ZD4KKyA8dGQ+IFJlYWQvV3JpdGU8L3RkPgorIDwvdHI+CisKKyA8dHI+CisgPHRkPiBidXNzdXNwZW5kIDwvdGQ+CisgPHRkPiBTdXNwZW5kcyB0aGUgVVNCIGJ1cy48L3RkPgorIDx0ZD4gUmVhZC9Xcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IGJ1c2Nvbm5lY3RlZCA8L3RkPgorIDx0ZD4gR2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0dXMgb2YgdGhlIGJ1czwvdGQ+CisgPHRkPiBSZWFkPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gZ290Z2N0bCA8L3RkPgorIDx0ZD4gR2V0cyBvciBzZXRzIHRoZSBDb3JlIENvbnRyb2wgU3RhdHVzIFJlZ2lzdGVyLjwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gZ3VzYmNmZyA8L3RkPgorIDx0ZD4gR2V0cyBvciBzZXRzIHRoZSBDb3JlIFVTQiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyPC90ZD4KKyA8dGQ+IFJlYWQvV3JpdGU8L3RkPgorIDwvdHI+CisKKyA8dHI+CisgPHRkPiBncnhmc2l6IDwvdGQ+CisgPHRkPiBHZXRzIG9yIHNldHMgdGhlIFJlY2VpdmUgRklGTyBTaXplIFJlZ2lzdGVyPC90ZD4KKyA8dGQ+IFJlYWQvV3JpdGU8L3RkPgorIDwvdHI+CisKKyA8dHI+CisgPHRkPiBnbnB0eGZzaXogPC90ZD4KKyA8dGQ+IEdldHMgb3Igc2V0cyB0aGUgbm9uLXBlcmlvZGljIFRyYW5zbWl0IFNpemUgUmVnaXN0ZXI8L3RkPgorIDx0ZD4gUmVhZC9Xcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IGdwdm5kY3RsIDwvdGQ+CisgPHRkPiBHZXRzIG9yIHNldHMgdGhlIFBIWSBWZW5kb3IgQ29udHJvbCBSZWdpc3RlcjwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gZ2dwaW8gPC90ZD4KKyA8dGQ+IEdldHMgdGhlIHZhbHVlIGluIHRoZSBsb3dlciAxNi1iaXRzIG9mIHRoZSBHZW5lcmFsIFB1cnBvc2UgSU8gUmVnaXN0ZXIKKyBvciBzZXRzIHRoZSB1cHBlciAxNiBiaXRzLjwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gZ3VpZCA8L3RkPgorIDx0ZD4gR2V0cyBvciBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgVXNlciBJRCBSZWdpc3RlcjwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gZ3NucHNpZCA8L3RkPgorIDx0ZD4gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIFN5bm9wc3lzIElEIFJlZ2VzdGVyPC90ZD4KKyA8dGQ+IFJlYWQ8L3RkPgorIDwvdHI+CisKKyA8dHI+CisgPHRkPiBkZXZzcGVlZCA8L3RkPgorIDx0ZD4gR2V0cyBvciBzZXRzIHRoZSBkZXZpY2Ugc3BlZWQgc2V0dGluZyBpbiB0aGUgRENGRyByZWdpc3RlcjwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gZW51bXNwZWVkIDwvdGQ+CisgPHRkPiBHZXRzIHRoZSBkZXZpY2UgZW51bWVyYXRpb24gU3BlZWQuPC90ZD4KKyA8dGQ+IFJlYWQ8L3RkPgorIDwvdHI+CisKKyA8dHI+CisgPHRkPiBocHR4ZnNpeiA8L3RkPgorIDx0ZD4gR2V0cyB0aGUgdmFsdWUgb2YgdGhlIEhvc3QgUGVyaW9kaWMgVHJhbnNtaXQgRklGTzwvdGQ+CisgPHRkPiBSZWFkPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gaHBydDAgPC90ZD4KKyA8dGQ+IEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgaW4gdGhlIEhvc3QgUG9ydCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXI8L3RkPgorIDx0ZD4gUmVhZC9Xcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IHJlZ29mZnNldCA8L3RkPgorIDx0ZD4gU2V0cyB0aGUgcmVnaXN0ZXIgb2Zmc2V0IGZvciB0aGUgbmV4dCBSZWdpc3RlciBBY2Nlc3M8L3RkPgorIDx0ZD4gUmVhZC9Xcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IHJlZ3ZhbHVlIDwvdGQ+CisgPHRkPiBHZXRzIG9yIHNldHMgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciBhdCB0aGUgb2Zmc2V0IGluIHRoZSByZWdvZmZzZXQgYXR0cmlidXRlLjwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gcmVtb3RlX3dha2V1cCA8L3RkPgorIDx0ZD4gT24gcmVhZCwgc2hvd3MgdGhlIHN0YXR1cyBvZiBSZW1vdGUgV2FrZXVwLiBPbiB3cml0ZSwgaW5pdGlhdGVzIGEgcmVtb3RlCisgd2FrZXVwIG9mIHRoZSBob3N0LiBXaGVuIGJpdCAwIGlzIDEgYW5kIFJlbW90ZSBXYWtldXAgaXMgZW5hYmxlZCwgdGhlIFJlbW90ZQorIFdha2V1cCBzaWduYWxsaW5nIGJpdCBpbiB0aGUgRGV2aWNlIENvbnRyb2wgUmVnaXN0ZXIgaXMgc2V0IGZvciAxCisgbWlsbGktc2Vjb25kLjwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gcmVtX3dha2V1cF9wd3JkbiA8L3RkPgorIDx0ZD4gT24gcmVhZCwgc2hvd3MgdGhlIHN0YXR1cyBjb3JlIC0gaGliZXJuYXRlZCBvciBub3QuIE9uIHdyaXRlLCBpbml0aWF0ZXMKKyBhIHJlbW90ZSB3YWtldXAgb2YgdGhlIGRldmljZSBmcm9tIEhpYmVybmF0aW9uLiA8L3RkPgorIDx0ZD4gUmVhZC9Xcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IG1vZGVfY2hfdGltX2VuIDwvdGQ+CisgPHRkPiBUaGlzIGJpdCBpcyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBob3N0IGNvcmUgdG8gd2FpdCBmb3IgMjAwIFBIWQorIGNsb2NrIGN5Y2xlcyBhdCB0aGUgZW5kIG9mIFJlc3VtZSB0byBjaGFuZ2UgdGhlIG9wbW9kZSBzaWduYWwgdG8gdGhlIFBIWSB0byAwMAorIGFmdGVyIFN1c3BlbmQgb3IgTFBNLiA8L3RkPgorIDx0ZD4gUmVhZC9Xcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IGZyX2ludGVydmFsIDwvdGQ+CisgPHRkPiBPbiByZWFkLCBzaG93cyB0aGUgdmFsdWUgb2YgSEZJUiBGcmFtZSBJbnRlcnZhbC4gT24gd3JpdGUsIGR5bmFtaWNhbGx5CisgcmVsb2FkIEhGSVIgcmVnaXN0ZXIgZHVyaW5nIHJ1bnRpbWUuIFRoZSBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgYSB2YWx1ZSB0byB0aGlzCisgcmVnaXN0ZXIgb25seSBhZnRlciB0aGUgUG9ydCBFbmFibGUgYml0IG9mIHRoZSBIb3N0IFBvcnQgQ29udHJvbCBhbmQgU3RhdHVzCisgcmVnaXN0ZXIgKEhQUlQuUHJ0RW5hUG9ydCkgaGFzIGJlZW4gc2V0IDwvdGQ+CisgPHRkPiBSZWFkL1dyaXRlPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gZGlzY29ubmVjdF91cyA8L3RkPgorIDx0ZD4gT24gcmVhZCwgc2hvd3MgdGhlIHN0YXR1cyBvZiBkaXNjb25uZWN0X2RldmljZV91cy4gT24gd3JpdGUsIHNldHMgZGlzY29ubmVjdF91cworIHdoaWNoIGNhdXNlcyBzb2Z0IGRpc2Nvbm5lY3QgZm9yIDEwMHVzLiBBcHBsaWNhYmxlIG9ubHkgZm9yIGRldmljZSBtb2RlIG9mIG9wZXJhdGlvbi48L3RkPgorIDx0ZD4gUmVhZC9Xcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IHJlZ2R1bXAgPC90ZD4KKyA8dGQ+IER1bXBzIHRoZSBjb250ZW50cyBvZiBjb3JlIHJlZ2lzdGVycy48L3RkPgorIDx0ZD4gUmVhZDwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IHNwcmFtZHVtcCA8L3RkPgorIDx0ZD4gRHVtcHMgdGhlIGNvbnRlbnRzIG9mIGNvcmUgcmVnaXN0ZXJzLjwvdGQ+CisgPHRkPiBSZWFkPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gaGNkZHVtcCA8L3RkPgorIDx0ZD4gRHVtcHMgdGhlIGN1cnJlbnQgSENEIHN0YXRlLjwvdGQ+CisgPHRkPiBSZWFkPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gaGNkX2ZycmVtIDwvdGQ+CisgPHRkPiBTaG93cyB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgRnJhbWUgUmVtYWluaW5nCisgZmllbGQgaW4gdGhlIEhvc3QgRnJhbWUgTnVtYmVyL0ZyYW1lIFJlbWFpbmluZyByZWdpc3RlciB3aGVuIGFuIFNPRiBpbnRlcnJ1cHQKKyBvY2N1cnMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhdmVyYWdlIGludGVycnVwdCBsYXRlbmN5LiBBbHNvCisgc2hvd3MgdGhlIGF2ZXJhZ2UgRnJhbWUgUmVtYWluaW5nIHZhbHVlIGZvciBzdGFydF90cmFuc2ZlciBhbmQgdGhlICJhIiBhbmQKKyAiYiIgc2FtcGxlIHBvaW50cy4gVGhlICJhIiBhbmQgImIiIHNhbXBsZSBwb2ludHMgbWF5IGJlIHVzZWQgZHVyaW5nIGRlYnVnZ2luZworIGJ0byBkZXRlcm1pbmUgaG93IGxvbmcgaXQgdGFrZXMgdG8gZXhlY3V0ZSBhIHNlY3Rpb24gb2YgdGhlIEhDRCBjb2RlLjwvdGQ+CisgPHRkPiBSZWFkPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gcmRfcmVnX3Rlc3QgPC90ZD4KKyA8dGQ+IERpc3BsYXlzIHRoZSB0aW1lIHJlcXVpcmVkIHRvIHJlYWQgdGhlIEdOUFRYRlNJWiByZWdpc3RlciBtYW55IHRpbWVzCisgKHRoZSBvdXRwdXQgc2hvd3MgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcmVnaXN0ZXIgaXMgcmVhZCkuCisgPHRkPiBSZWFkPC90ZD4KKyA8L3RyPgorCisgPHRyPgorIDx0ZD4gd3JfcmVnX3Rlc3QgPC90ZD4KKyA8dGQ+IERpc3BsYXlzIHRoZSB0aW1lIHJlcXVpcmVkIHRvIHdyaXRlIHRoZSBHTlBUWEZTSVogcmVnaXN0ZXIgbWFueSB0aW1lcworICh0aGUgb3V0cHV0IHNob3dzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJlZ2lzdGVyIGlzIHdyaXR0ZW4pLgorIDx0ZD4gUmVhZDwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IGxwbV9yZXNwb25zZSA8L3RkPgorIDx0ZD4gR2V0cyBvciBzZXRzIGxwbV9yZXNwb25zZSBtb2RlLiBBcHBsaWNhYmxlIG9ubHkgaW4gZGV2aWNlIG1vZGUuCisgPHRkPiBXcml0ZTwvdGQ+CisgPC90cj4KKworIDx0cj4KKyA8dGQ+IHNsZWVwX3N0YXR1cyA8L3RkPgorIDx0ZD4gU2hvd3Mgc2xlZXAgc3RhdHVzIG9mIGRldmljZS4KKyA8dGQ+IFJlYWQ8L3RkPgorIDwvdHI+CisKKyA8L3RhYmxlPgorCisgRXhhbXBsZSB1c2FnZToKKyBUbyBnZXQgdGhlIGN1cnJlbnQgbW9kZToKKyBjYXQgL3N5cy9kZXZpY2VzL2xtMC9tb2RlCisKKyBUbyBwb3dlciBkb3duIHRoZSBVU0I6CisgZWNobyAwID4gL3N5cy9kZXZpY2VzL2xtMC9idXNwb3dlcgorICovCisKKyNpbmNsdWRlICJkd2Nfb3RnX29zX2RlcC5oIgorI2luY2x1ZGUgImR3Y19vcy5oIgorI2luY2x1ZGUgImR3Y19vdGdfZHJpdmVyLmgiCisjaW5jbHVkZSAiZHdjX290Z19hdHRyLmgiCisjaW5jbHVkZSAiZHdjX290Z19jb3JlX2lmLmgiCisjaW5jbHVkZSAiZHdjX290Z19wY2RfaWYuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2hjZF9pZi5oIgorCisvKgorICogTUFDUk9zIGZvciBkZWZpbmluZyBzeXNmcyBhdHRyaWJ1dGUKKyAqLworI2lmZGVmIExNX0lOVEVSRkFDRQorCisjZGVmaW5lIERXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfU0hPVyhfb3RnX2F0dHJfbmFtZV8sX3N0cmluZ18pIFwKK3N0YXRpYyBzc2l6ZV90IF9vdGdfYXR0cl9uYW1lXyMjX3Nob3cgKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOyBcCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CQlcCisJdWludDMyX3QgdmFsOyBcCisJdmFsID0gZHdjX290Z19nZXRfIyNfb3RnX2F0dHJfbmFtZV8gKG90Z19kZXYtPmNvcmVfaWYpOyBcCisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVzID0gMHgleFxuIiwgX3N0cmluZ18sIHZhbCk7IFwKK30KKyNkZWZpbmUgRFdDX09UR19ERVZJQ0VfQVRUUl9CSVRGSUVMRF9TVE9SRShfb3RnX2F0dHJfbmFtZV8sX3N0cmluZ18pIFwKK3N0YXRpYyBzc2l6ZV90IF9vdGdfYXR0cl9uYW1lXyMjX3N0b3JlIChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7IFwKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsgXAorCXVpbnQzMl90IHNldCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOyBcCisJZHdjX290Z19zZXRfIyNfb3RnX2F0dHJfbmFtZV8ob3RnX2Rldi0+Y29yZV9pZiwgc2V0KTtcCisJcmV0dXJuIGNvdW50OyBcCit9CisKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKworI2RlZmluZSBEV0NfT1RHX0RFVklDRV9BVFRSX0JJVEZJRUxEX1NIT1coX290Z19hdHRyX25hbWVfLF9zdHJpbmdfKSBcCitzdGF0aWMgc3NpemVfdCBfb3RnX2F0dHJfbmFtZV8jI19zaG93IChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCit7IFwKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOwlcCisJdWludDMyX3QgdmFsOyBcCisJdmFsID0gZHdjX290Z19nZXRfIyNfb3RnX2F0dHJfbmFtZV8gKG90Z19kZXYtPmNvcmVfaWYpOyBcCisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVzID0gMHgleFxuIiwgX3N0cmluZ18sIHZhbCk7IFwKK30KKyNkZWZpbmUgRFdDX09UR19ERVZJQ0VfQVRUUl9CSVRGSUVMRF9TVE9SRShfb3RnX2F0dHJfbmFtZV8sX3N0cmluZ18pIFwKK3N0YXRpYyBzc2l6ZV90IF9vdGdfYXR0cl9uYW1lXyMjX3N0b3JlIChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsgIFwKKwl1aW50MzJfdCBzZXQgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDE2KTsgXAorCWR3Y19vdGdfc2V0XyMjX290Z19hdHRyX25hbWVfKG90Z19kZXYtPmNvcmVfaWYsIHNldCk7XAorCXJldHVybiBjb3VudDsgXAorfQorI2Vsc2UKKworI2RlZmluZSBEV0NfT1RHX0RFVklDRV9BVFRSX0JJVEZJRUxEX1NIT1coX290Z19hdHRyX25hbWVfLF9zdHJpbmdfKSBcCitzdGF0aWMgc3NpemVfdCBfb3RnX2F0dHJfbmFtZV8jI19zaG93IChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCit7IFwKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsJCVwKKwl1aW50MzJfdCB2YWw7IFwKKwl2YWwgPSBkd2Nfb3RnX2dldF8jI19vdGdfYXR0cl9uYW1lXyAob3RnX2Rldi0+Y29yZV9pZik7IFwKKwlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJXMgPSAweCV4XG4iLCBfc3RyaW5nXywgdmFsKTsgXAorfQorI2RlZmluZSBEV0NfT1RHX0RFVklDRV9BVFRSX0JJVEZJRUxEX1NUT1JFKF9vdGdfYXR0cl9uYW1lXyxfc3RyaW5nXykgXAorc3RhdGljIHNzaXplX3QgX290Z19hdHRyX25hbWVfIyNfc3RvcmUgKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsgXAorCXVpbnQzMl90IHNldCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOyBcCisJZHdjX290Z19zZXRfIyNfb3RnX2F0dHJfbmFtZV8ob3RnX2Rldi0+Y29yZV9pZiwgc2V0KTtcCisJcmV0dXJuIGNvdW50OyBcCit9CisKKworI2VuZGlmCisKKy8qCisgKiBNQUNST3MgZm9yIGRlZmluaW5nIHN5c2ZzIGF0dHJpYnV0ZSBmb3IgMzItYml0IHJlZ2lzdGVycworICovCisjaWZkZWYgTE1fSU5URVJGQUNFCisjZGVmaW5lIERXQ19PVEdfREVWSUNFX0FUVFJfUkVHX1NIT1coX290Z19hdHRyX25hbWVfLF9zdHJpbmdfKSBcCitzdGF0aWMgc3NpemVfdCBfb3RnX2F0dHJfbmFtZV8jI19zaG93IChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsgXAorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOyBcCisJdWludDMyX3QgdmFsOyBcCisJdmFsID0gZHdjX290Z19nZXRfIyNfb3RnX2F0dHJfbmFtZV8gKG90Z19kZXYtPmNvcmVfaWYpOyBcCisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVzID0gMHglMDh4XG4iLCBfc3RyaW5nXywgdmFsKTsgXAorfQorI2RlZmluZSBEV0NfT1RHX0RFVklDRV9BVFRSX1JFR19TVE9SRShfb3RnX2F0dHJfbmFtZV8sX3N0cmluZ18pIFwKK3N0YXRpYyBzc2l6ZV90IF9vdGdfYXR0cl9uYW1lXyMjX3N0b3JlIChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7IFwKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsgXAorCXVpbnQzMl90IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOyBcCisJZHdjX290Z19zZXRfIyNfb3RnX2F0dHJfbmFtZV8gKG90Z19kZXYtPmNvcmVfaWYsIHZhbCk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30KKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKyNkZWZpbmUgRFdDX09UR19ERVZJQ0VfQVRUUl9SRUdfU0hPVyhfb3RnX2F0dHJfbmFtZV8sX3N0cmluZ18pIFwKK3N0YXRpYyBzc2l6ZV90IF9vdGdfYXR0cl9uYW1lXyMjX3Nob3cgKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIFwKK3sgXAorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7ICBcCisJdWludDMyX3QgdmFsOyBcCisJdmFsID0gZHdjX290Z19nZXRfIyNfb3RnX2F0dHJfbmFtZV8gKG90Z19kZXYtPmNvcmVfaWYpOyBcCisJcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVzID0gMHglMDh4XG4iLCBfc3RyaW5nXywgdmFsKTsgXAorfQorI2RlZmluZSBEV0NfT1RHX0RFVklDRV9BVFRSX1JFR19TVE9SRShfb3RnX2F0dHJfbmFtZV8sX3N0cmluZ18pIFwKK3N0YXRpYyBzc2l6ZV90IF9vdGdfYXR0cl9uYW1lXyMjX3N0b3JlIChzdHJ1Y3QgZGV2aWNlICpfZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsgIFwKKwl1aW50MzJfdCB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDE2KTsgXAorCWR3Y19vdGdfc2V0XyMjX290Z19hdHRyX25hbWVfIChvdGdfZGV2LT5jb3JlX2lmLCB2YWwpOyBcCisJcmV0dXJuIGNvdW50OyBcCit9CisjZWxzZQorI2RlZmluZSBEV0NfT1RHX0RFVklDRV9BVFRSX1JFR19TSE9XKF9vdGdfYXR0cl9uYW1lXyxfc3RyaW5nXykgXAorc3RhdGljIHNzaXplX3QgX290Z19hdHRyX25hbWVfIyNfc2hvdyAoc3RydWN0IGRldmljZSAqX2Rldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikgXAoreyBcCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7IFwKKwl1aW50MzJfdCB2YWw7IFwKKwl2YWwgPSBkd2Nfb3RnX2dldF8jI19vdGdfYXR0cl9uYW1lXyAob3RnX2Rldi0+Y29yZV9pZik7IFwKKwlyZXR1cm4gc3ByaW50ZiAoYnVmLCAiJXMgPSAweCUwOHhcbiIsIF9zdHJpbmdfLCB2YWwpOyBcCit9CisjZGVmaW5lIERXQ19PVEdfREVWSUNFX0FUVFJfUkVHX1NUT1JFKF9vdGdfYXR0cl9uYW1lXyxfc3RyaW5nXykgXAorc3RhdGljIHNzaXplX3QgX290Z19hdHRyX25hbWVfIyNfc3RvcmUgKHN0cnVjdCBkZXZpY2UgKl9kZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCit7IFwKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsgXAorCXVpbnQzMl90IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOyBcCisJZHdjX290Z19zZXRfIyNfb3RnX2F0dHJfbmFtZV8gKG90Z19kZXYtPmNvcmVfaWYsIHZhbCk7IFwKKwlyZXR1cm4gY291bnQ7IFwKK30KKyNlbmRpZgorCisjZGVmaW5lIERXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfUlcoX290Z19hdHRyX25hbWVfLF9zdHJpbmdfKSBcCitEV0NfT1RHX0RFVklDRV9BVFRSX0JJVEZJRUxEX1NIT1coX290Z19hdHRyX25hbWVfLF9zdHJpbmdfKSBcCitEV0NfT1RHX0RFVklDRV9BVFRSX0JJVEZJRUxEX1NUT1JFKF9vdGdfYXR0cl9uYW1lXyxfc3RyaW5nXykgXAorREVWSUNFX0FUVFIoX290Z19hdHRyX25hbWVfLDA2NDQsX290Z19hdHRyX25hbWVfIyNfc2hvdyxfb3RnX2F0dHJfbmFtZV8jI19zdG9yZSk7CisKKyNkZWZpbmUgRFdDX09UR19ERVZJQ0VfQVRUUl9CSVRGSUVMRF9STyhfb3RnX2F0dHJfbmFtZV8sX3N0cmluZ18pIFwKK0RXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfU0hPVyhfb3RnX2F0dHJfbmFtZV8sX3N0cmluZ18pIFwKK0RFVklDRV9BVFRSKF9vdGdfYXR0cl9uYW1lXywwNDQ0LF9vdGdfYXR0cl9uYW1lXyMjX3Nob3csTlVMTCk7CisKKyNkZWZpbmUgRFdDX09UR19ERVZJQ0VfQVRUUl9SRUczMl9SVyhfb3RnX2F0dHJfbmFtZV8sX2FkZHJfLF9zdHJpbmdfKSBcCitEV0NfT1RHX0RFVklDRV9BVFRSX1JFR19TSE9XKF9vdGdfYXR0cl9uYW1lXyxfc3RyaW5nXykgXAorRFdDX09UR19ERVZJQ0VfQVRUUl9SRUdfU1RPUkUoX290Z19hdHRyX25hbWVfLF9zdHJpbmdfKSBcCitERVZJQ0VfQVRUUihfb3RnX2F0dHJfbmFtZV8sMDY0NCxfb3RnX2F0dHJfbmFtZV8jI19zaG93LF9vdGdfYXR0cl9uYW1lXyMjX3N0b3JlKTsKKworI2RlZmluZSBEV0NfT1RHX0RFVklDRV9BVFRSX1JFRzMyX1JPKF9vdGdfYXR0cl9uYW1lXyxfYWRkcl8sX3N0cmluZ18pIFwKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHX1NIT1coX290Z19hdHRyX25hbWVfLF9zdHJpbmdfKSBcCitERVZJQ0VfQVRUUihfb3RnX2F0dHJfbmFtZV8sMDQ0NCxfb3RnX2F0dHJfbmFtZV8jI19zaG93LE5VTEwpOworCisvKiogQG5hbWUgRnVuY3Rpb25zIGZvciBTaG93L1N0b3JlIG9mIEF0dHJpYnV0ZXMgKi8KKy8qKkB7Ki8KKworLyoqCisgKiBTaG93IHRoZSByZWdpc3RlciBvZmZzZXQgb2YgdGhlIFJlZ2lzdGVyIEFjY2Vzcy4KKyAqLworc3RhdGljIHNzaXplX3QgcmVnb2Zmc2V0X3Nob3coc3RydWN0IGRldmljZSAqX2RldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKworCXJldHVybiBzbnByaW50ZihidWYsIHNpemVvZigiMHhGRkZGRkZGRlxuIikgKyAxLCAiMHglMDh4XG4iLAorCQkJb3RnX2Rldi0+b3NfZGVwLnJlZ19vZmZzZXQpOworfQorCisvKioKKyAqIFNldCB0aGUgcmVnaXN0ZXIgb2Zmc2V0IGZvciB0aGUgbmV4dCBSZWdpc3RlciBBY2Nlc3MgCVJlYWQvV3JpdGUKKyAqLworc3RhdGljIHNzaXplX3QgcmVnb2Zmc2V0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKworCXVpbnQzMl90IG9mZnNldCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOworI2lmZGVmIExNX0lOVEVSRkFDRQorCWlmIChvZmZzZXQgPCBTWl8yNTZLKSB7CisjZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWlmIChvZmZzZXQgPCAweDAwMDQwMDAwKSB7CisjZWxzZQorCWlmIChvZmZzZXQgPCAweDAwMDQwMDAwKSB7CisjZW5kaWYKKwkJb3RnX2Rldi0+b3NfZGVwLnJlZ19vZmZzZXQgPSBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJZGV2X2VycihfZGV2LCAiaW52YWxpZCBvZmZzZXRcbiIpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworREVWSUNFX0FUVFIocmVnb2Zmc2V0LCBTX0lSVUdPIHwgU19JV1VTUiwgcmVnb2Zmc2V0X3Nob3csIHJlZ29mZnNldF9zdG9yZSk7CisKKy8qKgorICogU2hvdyB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyIGF0IHRoZSBvZmZzZXQgaW4gdGhlIHJlZ19vZmZzZXQKKyAqIGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIHNzaXplX3QgcmVndmFsdWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X3BsYXRkYXRhKF9kZXYpOworI2VuZGlmCisKKwl1aW50MzJfdCB2YWw7CisJdm9sYXRpbGUgdWludDMyX3QgKmFkZHI7CisKKwlpZiAob3RnX2Rldi0+b3NfZGVwLnJlZ19vZmZzZXQgIT0gMHhGRkZGRkZGRiAmJiAwICE9IG90Z19kZXYtPm9zX2RlcC5iYXNlKSB7CisJCS8qIENhbGN1bGF0ZSB0aGUgYWRkcmVzcyAqLworCQlhZGRyID0gKHVpbnQzMl90ICopIChvdGdfZGV2LT5vc19kZXAucmVnX29mZnNldCArCisJCQkJICAgICAodWludDhfdCAqKSBvdGdfZGV2LT5vc19kZXAuYmFzZSk7CisJCXZhbCA9IERXQ19SRUFEX1JFRzMyKGFkZHIpOworCQlyZXR1cm4gc25wcmludGYoYnVmLAorCQkJCXNpemVvZigiUmVnQDB4RkZGRkZGRkYgPSAweEZGRkZGRkZGXG4iKSArIDEsCisJCQkJIlJlZ0AweCUwNnggPSAweCUwOHhcbiIsIG90Z19kZXYtPm9zX2RlcC5yZWdfb2Zmc2V0LAorCQkJCXZhbCk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihfZGV2LCAiSW52YWxpZCBvZmZzZXQgKDB4JTB4KVxuIiwgb3RnX2Rldi0+b3NfZGVwLnJlZ19vZmZzZXQpOworCQlyZXR1cm4gc3ByaW50ZihidWYsICJpbnZhbGlkIG9mZnNldFxuIik7CisJfQorfQorCisvKioKKyAqIFN0b3JlIHRoZSB2YWx1ZSBpbiB0aGUgcmVnaXN0ZXIgYXQgdGhlIG9mZnNldCBpbiB0aGUgcmVnX29mZnNldAorICogYXR0cmlidXRlLgorICoKKyAqLworc3RhdGljIHNzaXplX3QgcmVndmFsdWVfc3RvcmUoc3RydWN0IGRldmljZSAqX2RldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKworCXZvbGF0aWxlIHVpbnQzMl90ICphZGRyOworCXVpbnQzMl90IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOworCS8vZGV2X2RiZyhfZGV2LCAiT2Zmc2V0PTB4JTA4eCBWYWw9MHglMDh4XG4iLCBvdGdfZGV2LT5yZWdfb2Zmc2V0LCB2YWwpOworCWlmIChvdGdfZGV2LT5vc19kZXAucmVnX29mZnNldCAhPSAweEZGRkZGRkZGICYmIDAgIT0gb3RnX2Rldi0+b3NfZGVwLmJhc2UpIHsKKwkJLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzICovCisJCWFkZHIgPSAodWludDMyX3QgKikgKG90Z19kZXYtPm9zX2RlcC5yZWdfb2Zmc2V0ICsKKwkJCQkgICAgICh1aW50OF90ICopIG90Z19kZXYtPm9zX2RlcC5iYXNlKTsKKwkJRFdDX1dSSVRFX1JFRzMyKGFkZHIsIHZhbCk7CisJfSBlbHNlIHsKKwkJZGV2X2VycihfZGV2LCAiSW52YWxpZCBSZWdpc3RlciBPZmZzZXQgKDB4JTA4eClcbiIsCisJCQlvdGdfZGV2LT5vc19kZXAucmVnX29mZnNldCk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworREVWSUNFX0FUVFIocmVndmFsdWUsIFNfSVJVR08gfCBTX0lXVVNSLCByZWd2YWx1ZV9zaG93LCByZWd2YWx1ZV9zdG9yZSk7CisKKy8qCisgKiBBdHRyaWJ1dGVzCisgKi8KK0RXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfUk8obW9kZSwgIk1vZGUiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfUlcoaG5wY2FwYWJsZSwgIkhOUENhcGFibGUiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfUlcoc3JwY2FwYWJsZSwgIlNSUENhcGFibGUiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfUlcoaHNpY19jb25uZWN0LCAiSFNJQyBDb25uZWN0Iik7CitEV0NfT1RHX0RFVklDRV9BVFRSX0JJVEZJRUxEX1JXKGludl9zZWxfaHNpYywgIkludmVydCBTZWxlY3QgSFNJQyIpOworCisvL0RXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfUlcoYnVzcG93ZXIsJihvdGdfZGV2LT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsKSwoMTw8OCksOCwiTW9kZSIpOworLy9EV0NfT1RHX0RFVklDRV9BVFRSX0JJVEZJRUxEX1JXKGJ1c3N1c3BlbmQsJihvdGdfZGV2LT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsKSwoMTw8OCksOCwiTW9kZSIpOworRFdDX09UR19ERVZJQ0VfQVRUUl9CSVRGSUVMRF9STyhidXNjb25uZWN0ZWQsICJCdXMgQ29ubmVjdGVkIik7CisKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUlcoZ290Z2N0bCwgMCwgIkdPVEdDVEwiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUlcoZ3VzYmNmZywKKwkJCSAgICAgJihvdGdfZGV2LT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndXNiY2ZnKSwKKwkJCSAgICAgIkdVU0JDRkciKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUlcoZ3J4ZnNpeiwKKwkJCSAgICAgJihvdGdfZGV2LT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnhmc2l6KSwKKwkJCSAgICAgIkdSWEZTSVoiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUlcoZ25wdHhmc2l6LAorCQkJICAgICAmKG90Z19kZXYtPmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeiksCisJCQkgICAgICJHTlBUWEZTSVoiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUlcoZ3B2bmRjdGwsCisJCQkgICAgICYob3RnX2Rldi0+Y29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B2bmRjdGwpLAorCQkJICAgICAiR1BWTkRDVEwiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUlcoZ2dwaW8sCisJCQkgICAgICYob3RnX2Rldi0+Y29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2dwaW8pLAorCQkJICAgICAiR0dQSU8iKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUlcoZ3VpZCwgJihvdGdfZGV2LT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndWlkKSwKKwkJCSAgICAgIkdVSUQiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUk8oZ3NucHNpZCwKKwkJCSAgICAgJihvdGdfZGV2LT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nc25wc2lkKSwKKwkJCSAgICAgIkdTTlBTSUQiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfUlcoZGV2c3BlZWQsICJEZXZpY2UgU3BlZWQiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfQklURklFTERfUk8oZW51bXNwZWVkLCAiRGV2aWNlIEVudW1lcmF0aW9uIFNwZWVkIik7CisKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUk8oaHB0eGZzaXosCisJCQkgICAgICYob3RnX2Rldi0+Y29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+aHB0eGZzaXopLAorCQkJICAgICAiSFBUWEZTSVoiKTsKK0RXQ19PVEdfREVWSUNFX0FUVFJfUkVHMzJfUlcoaHBydDAsIG90Z19kZXYtPmNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCAiSFBSVDAiKTsKKworLyoqCisgKiBAdG9kbyBBZGQgY29kZSB0byBpbml0aWF0ZSB0aGUgSE5QLgorICovCisvKioKKyAqIFNob3cgdGhlIEhOUCBzdGF0dXMgYml0CisgKi8KK3N0YXRpYyBzc2l6ZV90IGhucF9zaG93KHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X3BsYXRkYXRhKF9kZXYpOworI2VuZGlmCisJcmV0dXJuIHNwcmludGYoYnVmLCAiSHN0TmVnU2NzID0gMHgleFxuIiwKKwkJICAgICAgIGR3Y19vdGdfZ2V0X2hucHN0YXR1cyhvdGdfZGV2LT5jb3JlX2lmKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBITlAgUmVxdWVzdCBiaXQKKyAqLworc3RhdGljIHNzaXplX3QgaG5wX3N0b3JlKHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKwl1aW50MzJfdCBpbiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOworCWR3Y19vdGdfc2V0X2hucHJlcShvdGdfZGV2LT5jb3JlX2lmLCBpbik7CisJcmV0dXJuIGNvdW50OworfQorCitERVZJQ0VfQVRUUihobnAsIDA2NDQsIGhucF9zaG93LCBobnBfc3RvcmUpOworCisvKioKKyAqIEB0b2RvIEFkZCBjb2RlIHRvIGluaXRpYXRlIHRoZSBTUlAuCisgKi8KKy8qKgorICogU2hvdyB0aGUgU1JQIHN0YXR1cyBiaXQKKyAqLworc3RhdGljIHNzaXplX3Qgc3JwX3Nob3coc3RydWN0IGRldmljZSAqX2RldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisjaWZuZGVmIERXQ19IT1NUX09OTFkKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlNlc1JlcVNjcyA9IDB4JXhcbiIsCisJCSAgICAgICBkd2Nfb3RnX2dldF9zcnBzdGF0dXMob3RnX2Rldi0+Y29yZV9pZikpOworI2Vsc2UKKwlyZXR1cm4gc3ByaW50ZihidWYsICJIb3N0IE9ubHkgTW9kZSFcbiIpOworI2VuZGlmCit9CisKKy8qKgorICogU2V0IHRoZSBTUlAgUmVxdWVzdCBiaXQKKyAqLworc3RhdGljIHNzaXplX3Qgc3JwX3N0b3JlKHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisjaWZuZGVmIERXQ19IT1NUX09OTFkKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCWR3Y19vdGdfcGNkX2luaXRpYXRlX3NycChvdGdfZGV2LT5wY2QpOworI2VuZGlmCisJcmV0dXJuIGNvdW50OworfQorCitERVZJQ0VfQVRUUihzcnAsIDA2NDQsIHNycF9zaG93LCBzcnBfc3RvcmUpOworCisvKioKKyAqIEB0b2RvIE5lZWQgdG8gZG8gbW9yZSBmb3IgcG93ZXIgb24vb2ZmPworICovCisvKioKKyAqIFNob3cgdGhlIEJ1cyBQb3dlciBzdGF0dXMKKyAqLworc3RhdGljIHNzaXplX3QgYnVzcG93ZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X3BsYXRkYXRhKF9kZXYpOworI2VuZGlmCisJcmV0dXJuIHNwcmludGYoYnVmLCAiQnVzIFBvd2VyID0gMHgleFxuIiwKKwkJICAgICAgIGR3Y19vdGdfZ2V0X3BydHBvd2VyKG90Z19kZXYtPmNvcmVfaWYpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIEJ1cyBQb3dlciBzdGF0dXMKKyAqLworc3RhdGljIHNzaXplX3QgYnVzcG93ZXJfc3RvcmUoc3RydWN0IGRldmljZSAqX2RldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKwl1aW50MzJfdCBvbiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOworCWR3Y19vdGdfc2V0X3BydHBvd2VyKG90Z19kZXYtPmNvcmVfaWYsIG9uKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK0RFVklDRV9BVFRSKGJ1c3Bvd2VyLCAwNjQ0LCBidXNwb3dlcl9zaG93LCBidXNwb3dlcl9zdG9yZSk7CisKKy8qKgorICogQHRvZG8gTmVlZCB0byBkbyBtb3JlIGZvciBzdXNwZW5kPworICovCisvKioKKyAqIFNob3cgdGhlIEJ1cyBTdXNwZW5kIHN0YXR1cworICovCitzdGF0aWMgc3NpemVfdCBidXNzdXNwZW5kX3Nob3coc3RydWN0IGRldmljZSAqX2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X3BsYXRkYXRhKF9kZXYpOworI2VuZGlmCisKKwlyZXR1cm4gc3ByaW50ZihidWYsICJCdXMgU3VzcGVuZCA9IDB4JXhcbiIsCisJCSAgICAgICBkd2Nfb3RnX2dldF9wcnRzdXNwZW5kKG90Z19kZXYtPmNvcmVfaWYpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIEJ1cyBTdXNwZW5kIHN0YXR1cworICovCitzdGF0aWMgc3NpemVfdCBidXNzdXNwZW5kX3N0b3JlKHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKworCXVpbnQzMl90IGluID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxNik7CisJZHdjX290Z19zZXRfcHJ0c3VzcGVuZChvdGdfZGV2LT5jb3JlX2lmLCBpbik7CisJcmV0dXJuIGNvdW50OworfQorCitERVZJQ0VfQVRUUihidXNzdXNwZW5kLCAwNjQ0LCBidXNzdXNwZW5kX3Nob3csIGJ1c3N1c3BlbmRfc3RvcmUpOworCisvKioKKyAqIFNob3cgdGhlIE1vZGUgQ2hhbmdlIFJlYWR5IFRpbWVyIHN0YXR1cworICovCitzdGF0aWMgc3NpemVfdCBtb2RlX2NoX3RpbV9lbl9zaG93KHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiTW9kZSBDaGFuZ2UgUmVhZHkgVGltZXIgRW5hYmxlID0gMHgleFxuIiwKKwkJICAgICAgIGR3Y19vdGdfZ2V0X21vZGVfY2hfdGltKG90Z19kZXYtPmNvcmVfaWYpKTsKK30KKworLyoqCisgKiBTZXQgdGhlIE1vZGUgQ2hhbmdlIFJlYWR5IFRpbWVyIHN0YXR1cworICovCitzdGF0aWMgc3NpemVfdCBtb2RlX2NoX3RpbV9lbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKworCXVpbnQzMl90IGluID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxNik7CisJZHdjX290Z19zZXRfbW9kZV9jaF90aW0ob3RnX2Rldi0+Y29yZV9pZiwgaW4pOworCXJldHVybiBjb3VudDsKK30KKworREVWSUNFX0FUVFIobW9kZV9jaF90aW1fZW4sIDA2NDQsIG1vZGVfY2hfdGltX2VuX3Nob3csIG1vZGVfY2hfdGltX2VuX3N0b3JlKTsKKworLyoqCisgKiBTaG93IHRoZSB2YWx1ZSBvZiBIRklSIEZyYW1lIEludGVydmFsIGJpdGZpZWxkCisgKi8KK3N0YXRpYyBzc2l6ZV90IGZyX2ludGVydmFsX3Nob3coc3RydWN0IGRldmljZSAqX2RldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X3BsYXRkYXRhKF9kZXYpOworI2VuZGlmCisKKwlyZXR1cm4gc3ByaW50ZihidWYsICJGcmFtZSBJbnRlcnZhbCA9IDB4JXhcbiIsCisJCSAgICAgICBkd2Nfb3RnX2dldF9mcl9pbnRlcnZhbChvdGdfZGV2LT5jb3JlX2lmKSk7Cit9CisKKy8qKgorICogU2V0IHRoZSBIRklSIEZyYW1lIEludGVydmFsIHZhbHVlCisgKi8KK3N0YXRpYyBzc2l6ZV90IGZyX2ludGVydmFsX3N0b3JlKHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJdWludDMyX3QgaW4gPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlkd2Nfb3RnX3NldF9mcl9pbnRlcnZhbChvdGdfZGV2LT5jb3JlX2lmLCBpbik7CisJcmV0dXJuIGNvdW50OworfQorCitERVZJQ0VfQVRUUihmcl9pbnRlcnZhbCwgMDY0NCwgZnJfaW50ZXJ2YWxfc2hvdywgZnJfaW50ZXJ2YWxfc3RvcmUpOworCisvKioKKyAqIFNob3cgdGhlIHN0YXR1cyBvZiBSZW1vdGUgV2FrZXVwLgorICovCitzdGF0aWMgc3NpemVfdCByZW1vdGVfd2FrZXVwX3Nob3coc3RydWN0IGRldmljZSAqX2RldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisjaWZuZGVmIERXQ19IT1NUX09OTFkKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJcmV0dXJuIHNwcmludGYoYnVmLAorCQkgICAgICAgIlJlbW90ZSBXYWtldXAgU2lnID0gJWQgRW5hYmxlZCA9ICVkIExQTSBSZW1vdGUgV2FrZXVwID0gJWRcbiIsCisJCSAgICAgICBkd2Nfb3RnX2dldF9yZW1vdGV3YWtlc2lnKG90Z19kZXYtPmNvcmVfaWYpLAorCQkgICAgICAgZHdjX290Z19wY2RfZ2V0X3Jtd2t1cF9lbmFibGUob3RnX2Rldi0+cGNkKSwKKwkJICAgICAgIGR3Y19vdGdfZ2V0X2xwbV9yZW1vdGV3YWtlZW5hYmxlZChvdGdfZGV2LT5jb3JlX2lmKSk7CisjZWxzZQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkhvc3QgT25seSBNb2RlIVxuIik7CisjZW5kaWYgLyogRFdDX0hPU1RfT05MWSAqLworfQorCisvKioKKyAqIEluaXRpYXRlIGEgcmVtb3RlIHdha2V1cCBvZiB0aGUgaG9zdC4gIFRoZSBEZXZpY2UgY29udHJvbCByZWdpc3RlcgorICogUmVtb3RlIFdha2V1cCBTaWduYWwgYml0IGlzIHdyaXR0ZW4gaWYgdGhlIFBDRCBSZW1vdGUgd2FrZXVwIGVuYWJsZQorICogZmxhZyBpcyBzZXQuCisgKgorICovCitzdGF0aWMgc3NpemVfdCByZW1vdGVfd2FrZXVwX3N0b3JlKHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisjaWZuZGVmIERXQ19IT1NUX09OTFkKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJdWludDMyX3QgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxNik7CisKKwlpZiAodmFsICYgMSkgeworCQlkd2Nfb3RnX3BjZF9yZW1vdGVfd2FrZXVwKG90Z19kZXYtPnBjZCwgMSk7CisJfSBlbHNlIHsKKwkJZHdjX290Z19wY2RfcmVtb3RlX3dha2V1cChvdGdfZGV2LT5wY2QsIDApOworCX0KKyNlbmRpZiAvKiBEV0NfSE9TVF9PTkxZICovCisJcmV0dXJuIGNvdW50OworfQorCitERVZJQ0VfQVRUUihyZW1vdGVfd2FrZXVwLCBTX0lSVUdPIHwgU19JV1VTUiwgcmVtb3RlX3dha2V1cF9zaG93LAorCSAgICByZW1vdGVfd2FrZXVwX3N0b3JlKTsKKworLyoqCisgKiBTaG93IHRoZSB3aGV0aGVyIGNvcmUgaXMgaGliZXJuYXRlZCBvciBub3QuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHJlbV93YWtldXBfcHdyZG5fc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKyNpZm5kZWYgRFdDX0hPU1RfT05MWQorI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X3BsYXRkYXRhKF9kZXYpOworI2VuZGlmCisJaWYgKGR3Y19vdGdfZ2V0X2NvcmVfc3RhdGUob3RnX2Rldi0+Y29yZV9pZikpIHsKKwkJRFdDX1BSSU5URigiQ29yZSBpcyBpbiBoaWJlcm5hdGlvblxuIik7CisJfSBlbHNlIHsKKwkJRFdDX1BSSU5URigiQ29yZSBpcyBub3QgaW4gaGliZXJuYXRpb25cbiIpOworCX0KKyNlbmRpZiAvKiBEV0NfSE9TVF9PTkxZICovCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBpbnQgZHdjX290Z19kZXZpY2VfaGliZXJuYXRpb25fcmVzdG9yZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCSAgICAgIGludCByZW1fd2FrZXVwLCBpbnQgcmVzZXQpOworCisvKioKKyAqIEluaXRpYXRlIGEgcmVtb3RlIHdha2V1cCBvZiB0aGUgZGV2aWNlIHRvIGV4aXQgZnJvbSBoaWJlcm5hdGlvbi4KKyAqLworc3RhdGljIHNzaXplX3QgcmVtX3dha2V1cF9wd3Jkbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworI2lmbmRlZiBEV0NfSE9TVF9PTkxZCisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKwlkd2Nfb3RnX2RldmljZV9oaWJlcm5hdGlvbl9yZXN0b3JlKG90Z19kZXYtPmNvcmVfaWYsIDEsIDApOworI2VuZGlmCisJcmV0dXJuIGNvdW50OworfQorCitERVZJQ0VfQVRUUihyZW1fd2FrZXVwX3B3cmRuLCBTX0lSVUdPIHwgU19JV1VTUiwgcmVtX3dha2V1cF9wd3Jkbl9zaG93LAorCSAgICByZW1fd2FrZXVwX3B3cmRuX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgZGlzY29ubmVjdF91cyhzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisKKyNpZm5kZWYgRFdDX0hPU1RfT05MWQorI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X3BsYXRkYXRhKF9kZXYpOworI2VuZGlmCisJdWludDMyX3QgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxNik7CisJRFdDX1BSSU5URigiVGhlIFBhc3NlZCB2YWx1ZSBpcyAlMDR4XG4iLCB2YWwpOworCisJZHdjX290Z19wY2RfZGlzY29ubmVjdF91cyhvdGdfZGV2LT5wY2QsIDUwKTsKKworI2VuZGlmIC8qIERXQ19IT1NUX09OTFkgKi8KKwlyZXR1cm4gY291bnQ7Cit9CisKK0RFVklDRV9BVFRSKGRpc2Nvbm5lY3RfdXMsIFNfSVdVU1IsIDAsIGRpc2Nvbm5lY3RfdXMpOworCisvKioKKyAqIER1bXAgZ2xvYmFsIHJlZ2lzdGVycyBhbmQgZWl0aGVyIGhvc3Qgb3IgZGV2aWNlIHJlZ2lzdGVycyAoZGVwZW5kaW5nIG9uIHRoZQorICogY3VycmVudCBtb2RlIG9mIHRoZSBjb3JlKS4KKyAqLworc3RhdGljIHNzaXplX3QgcmVnZHVtcF9zaG93KHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJZHdjX290Z19kdW1wX2dsb2JhbF9yZWdpc3RlcnMob3RnX2Rldi0+Y29yZV9pZik7CisJaWYgKGR3Y19vdGdfaXNfaG9zdF9tb2RlKG90Z19kZXYtPmNvcmVfaWYpKSB7CisJCWR3Y19vdGdfZHVtcF9ob3N0X3JlZ2lzdGVycyhvdGdfZGV2LT5jb3JlX2lmKTsKKwl9IGVsc2UgeworCQlkd2Nfb3RnX2R1bXBfZGV2X3JlZ2lzdGVycyhvdGdfZGV2LT5jb3JlX2lmKTsKKworCX0KKwlyZXR1cm4gc3ByaW50ZihidWYsICJSZWdpc3RlciBEdW1wXG4iKTsKK30KKworREVWSUNFX0FUVFIocmVnZHVtcCwgU19JUlVHTyB8IFNfSVdVU1IsIHJlZ2R1bXBfc2hvdywgMCk7CisKKy8qKgorICogRHVtcCBnbG9iYWwgcmVnaXN0ZXJzIGFuZCBlaXRoZXIgaG9zdCBvciBkZXZpY2UgcmVnaXN0ZXJzIChkZXBlbmRpbmcgb24gdGhlCisgKiBjdXJyZW50IG1vZGUgb2YgdGhlIGNvcmUpLgorICovCitzdGF0aWMgc3NpemVfdCBzcHJhbWR1bXBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJZHdjX290Z19kdW1wX3NwcmFtKG90Z19kZXYtPmNvcmVfaWYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiU1BSQU0gRHVtcFxuIik7Cit9CisKK0RFVklDRV9BVFRSKHNwcmFtZHVtcCwgU19JUlVHTyB8IFNfSVdVU1IsIHNwcmFtZHVtcF9zaG93LCAwKTsKKworLyoqCisgKiBEdW1wIHRoZSBjdXJyZW50IGhjZCBzdGF0ZS4KKyAqLworc3RhdGljIHNzaXplX3QgaGNkZHVtcF9zaG93KHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKyNpZm5kZWYgRFdDX0RFVklDRV9PTkxZCisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKworCWR3Y19vdGdfaGNkX2R1bXBfc3RhdGUob3RnX2Rldi0+aGNkKTsKKyNlbmRpZiAvKiBEV0NfREVWSUNFX09OTFkgKi8KKwlyZXR1cm4gc3ByaW50ZihidWYsICJIQ0QgRHVtcFxuIik7Cit9CisKK0RFVklDRV9BVFRSKGhjZGR1bXAsIFNfSVJVR08gfCBTX0lXVVNSLCBoY2RkdW1wX3Nob3csIDApOworCisvKioKKyAqIER1bXAgdGhlIGF2ZXJhZ2UgZnJhbWUgcmVtYWluaW5nIGF0IFNPRi4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogZGV0ZXJtaW5lIGF2ZXJhZ2UgaW50ZXJydXB0IGxhdGVuY3kuIEZyYW1lIHJlbWFpbmluZyBpcyBhbHNvIHNob3duIGZvcgorICogc3RhcnQgdHJhbnNmZXIgYW5kIHR3byBhZGRpdGlvbmFsIHNhbXBsZSBwb2ludHMuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGhjZF9mcnJlbV9zaG93KHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworI2lmbmRlZiBEV0NfREVWSUNFX09OTFkKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJZHdjX290Z19oY2RfZHVtcF9mcnJlbShvdGdfZGV2LT5oY2QpOworI2VuZGlmIC8qIERXQ19ERVZJQ0VfT05MWSAqLworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkhDRCBEdW1wIEZyYW1lIFJlbWFpbmluZ1xuIik7Cit9CisKK0RFVklDRV9BVFRSKGhjZF9mcnJlbSwgU19JUlVHTyB8IFNfSVdVU1IsIGhjZF9mcnJlbV9zaG93LCAwKTsKKworLyoqCisgKiBEaXNwbGF5cyB0aGUgdGltZSByZXF1aXJlZCB0byByZWFkIHRoZSBHTlBUWEZTSVogcmVnaXN0ZXIgbWFueSB0aW1lcyAodGhlCisgKiBvdXRwdXQgc2hvd3MgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgcmVnaXN0ZXIgaXMgcmVhZCkuCisgKi8KKyNkZWZpbmUgUldfUkVHX0NPVU5UIDEwMDAwMDAwCisjZGVmaW5lIE1TRUNfUEVSX0pJRkZJRSAxMDAwL0haCitzdGF0aWMgc3NpemVfdCByZF9yZWdfdGVzdF9zaG93KHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJaW50IGk7CisJaW50IHRpbWU7CisJaW50IHN0YXJ0X2ppZmZpZXM7CisKKwlwcmludGsoIkhaICVkLCBNU0VDX1BFUl9KSUZGSUUgJWQsIGxvb3BzX3Blcl9qaWZmeSAlbHVcbiIsCisJICAgICAgIEhaLCBNU0VDX1BFUl9KSUZGSUUsIGxvb3BzX3Blcl9qaWZmeSk7CisJc3RhcnRfamlmZmllcyA9IGppZmZpZXM7CisJZm9yIChpID0gMDsgaSA8IFJXX1JFR19DT1VOVDsgaSsrKSB7CisJCWR3Y19vdGdfZ2V0X2ducHR4ZnNpeihvdGdfZGV2LT5jb3JlX2lmKTsKKwl9CisJdGltZSA9IGppZmZpZXMgLSBzdGFydF9qaWZmaWVzOworCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJICAgICAgICJUaW1lIHRvIHJlYWQgR05QVFhGU0laIHJlZyAlZCB0aW1lczogJWQgbXNlY3MgKCVkIGppZmZpZXMpXG4iLAorCQkgICAgICAgUldfUkVHX0NPVU5ULCB0aW1lICogTVNFQ19QRVJfSklGRklFLCB0aW1lKTsKK30KKworREVWSUNFX0FUVFIocmRfcmVnX3Rlc3QsIFNfSVJVR08gfCBTX0lXVVNSLCByZF9yZWdfdGVzdF9zaG93LCAwKTsKKworLyoqCisgKiBEaXNwbGF5cyB0aGUgdGltZSByZXF1aXJlZCB0byB3cml0ZSB0aGUgR05QVFhGU0laIHJlZ2lzdGVyIG1hbnkgdGltZXMgKHRoZQorICogb3V0cHV0IHNob3dzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHJlZ2lzdGVyIGlzIHdyaXR0ZW4pLgorICovCitzdGF0aWMgc3NpemVfdCB3cl9yZWdfdGVzdF9zaG93KHN0cnVjdCBkZXZpY2UgKl9kZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpsbV9kZXYgPSBjb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGxtX2RldmljZSwgZGV2KTsKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEobG1fZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gZGV2X2dldF9wbGF0ZGF0YShfZGV2KTsKKyNlbmRpZgorCisKKwl1aW50MzJfdCByZWdfdmFsOworCWludCBpOworCWludCB0aW1lOworCWludCBzdGFydF9qaWZmaWVzOworCisJcHJpbnRrKCJIWiAlZCwgTVNFQ19QRVJfSklGRklFICVkLCBsb29wc19wZXJfamlmZnkgJWx1XG4iLAorCSAgICAgICBIWiwgTVNFQ19QRVJfSklGRklFLCBsb29wc19wZXJfamlmZnkpOworCXJlZ192YWwgPSBkd2Nfb3RnX2dldF9nbnB0eGZzaXoob3RnX2Rldi0+Y29yZV9pZik7CisJc3RhcnRfamlmZmllcyA9IGppZmZpZXM7CisJZm9yIChpID0gMDsgaSA8IFJXX1JFR19DT1VOVDsgaSsrKSB7CisJCWR3Y19vdGdfc2V0X2ducHR4ZnNpeihvdGdfZGV2LT5jb3JlX2lmLCByZWdfdmFsKTsKKwl9CisJdGltZSA9IGppZmZpZXMgLSBzdGFydF9qaWZmaWVzOworCXJldHVybiBzcHJpbnRmKGJ1ZiwKKwkJICAgICAgICJUaW1lIHRvIHdyaXRlIEdOUFRYRlNJWiByZWcgJWQgdGltZXM6ICVkIG1zZWNzICglZCBqaWZmaWVzKVxuIiwKKwkJICAgICAgIFJXX1JFR19DT1VOVCwgdGltZSAqIE1TRUNfUEVSX0pJRkZJRSwgdGltZSk7Cit9CisKK0RFVklDRV9BVFRSKHdyX3JlZ190ZXN0LCBTX0lSVUdPIHwgU19JV1VTUiwgd3JfcmVnX3Rlc3Rfc2hvdywgMCk7CisKKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCisKKy8qKgorKiBTaG93IHRoZSBscG1fcmVzcG9uc2UgYXR0cmlidXRlLgorKi8KK3N0YXRpYyBzc2l6ZV90IGxwbXJlc3Bfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKworCisJaWYgKCFkd2Nfb3RnX2dldF9wYXJhbV9scG1fZW5hYmxlKG90Z19kZXYtPmNvcmVfaWYpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIqKiBMUE0gaXMgRElTQUJMRUQgKipcbiIpOworCisJaWYgKCFkd2Nfb3RnX2lzX2RldmljZV9tb2RlKG90Z19kZXYtPmNvcmVfaWYpKSB7CisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIioqIEN1cnJlbnQgbW9kZSBpcyBub3QgZGV2aWNlIG1vZGVcbiIpOworCX0KKwlyZXR1cm4gc3ByaW50ZihidWYsICJscG1fcmVzcG9uc2UgPSAlZFxuIiwKKwkJICAgICAgIGR3Y19vdGdfZ2V0X2xwbXJlc3BvbnNlKG90Z19kZXYtPmNvcmVfaWYpKTsKK30KKworLyoqCisqIFN0b3JlIHRoZSBscG1fcmVzcG9uc2UgYXR0cmlidXRlLgorKi8KK3N0YXRpYyBzc2l6ZV90IGxwbXJlc3Bfc3RvcmUoc3RydWN0IGRldmljZSAqX2RldiwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X3BsYXRkYXRhKF9kZXYpOworI2VuZGlmCisKKworCXVpbnQzMl90IHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTYpOworCisJaWYgKCFkd2Nfb3RnX2dldF9wYXJhbV9scG1fZW5hYmxlKG90Z19kZXYtPmNvcmVfaWYpKSB7CisJCXJldHVybiAwOworCX0KKworCWlmICghZHdjX290Z19pc19kZXZpY2VfbW9kZShvdGdfZGV2LT5jb3JlX2lmKSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlkd2Nfb3RnX3NldF9scG1yZXNwb25zZShvdGdfZGV2LT5jb3JlX2lmLCB2YWwpOworCXJldHVybiBjb3VudDsKK30KKworREVWSUNFX0FUVFIobHBtX3Jlc3BvbnNlLCBTX0lSVUdPIHwgU19JV1VTUiwgbHBtcmVzcF9zaG93LCBscG1yZXNwX3N0b3JlKTsKKworLyoqCisqIFNob3cgdGhlIHNsZWVwX3N0YXR1cyBhdHRyaWJ1dGUuCisqLworc3RhdGljIHNzaXplX3Qgc2xlZXBzdGF0dXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpfZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1fZGV2ID0gY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBsbV9kZXZpY2UsIGRldik7CisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKGxtX2Rldik7CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbHNlCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGRldl9nZXRfcGxhdGRhdGEoX2Rldik7CisjZW5kaWYKKworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiU2xlZXAgU3RhdHVzID0gJWRcbiIsCisJCSAgICAgICBkd2Nfb3RnX2dldF9scG1fcG9ydHNsZWVwc3RhdHVzKG90Z19kZXYtPmNvcmVfaWYpKTsKK30KKworLyoqCisgKiBTdG9yZSB0aGUgc2xlZXBfc3RhdHVzIGF0dHJpYnVyZS4KKyAqLworc3RhdGljIHNzaXplX3Qgc2xlZXBzdGF0dXNfc3RvcmUoc3RydWN0IGRldmljZSAqX2RldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKmxtX2RldiA9IGNvbnRhaW5lcl9vZihfZGV2LCBzdHJ1Y3QgbG1fZGV2aWNlLCBkZXYpOworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShsbV9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXZfZ2V0X3BsYXRkYXRhKF9kZXYpOworI2VuZGlmCisKKworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gb3RnX2Rldi0+Y29yZV9pZjsKKworCWlmIChkd2Nfb3RnX2dldF9scG1fcG9ydHNsZWVwc3RhdHVzKG90Z19kZXYtPmNvcmVfaWYpKSB7CisJCWlmIChkd2Nfb3RnX2lzX2hvc3RfbW9kZShjb3JlX2lmKSkgeworCisJCQlEV0NfUFJJTlRGKCJIb3N0IGluaXRpYXRlZCByZXN1bWVcbiIpOworCQkJZHdjX290Z19zZXRfcHJ0cmVzdW1lKG90Z19kZXYtPmNvcmVfaWYsIDEpOworCQl9CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitERVZJQ0VfQVRUUihzbGVlcF9zdGF0dXMsIFNfSVJVR08gfCBTX0lXVVNSLCBzbGVlcHN0YXR1c19zaG93LAorCSAgICBzbGVlcHN0YXR1c19zdG9yZSk7CisKKyNlbmRpZiAvKiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNX0VOQUJMRSAqLworCisvKipAfSovCisKKy8qKgorICogQ3JlYXRlIHRoZSBkZXZpY2UgZmlsZXMKKyAqLwordm9pZCBkd2Nfb3RnX2F0dHJfY3JlYXRlKAorI2lmZGVmIExNX0lOVEVSRkFDRQorCQkJCXN0cnVjdCBsbV9kZXZpY2UgKmRldgorI2VsaWYgIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwkJCQlzdHJ1Y3QgcGNpX2RldiAqZGV2CisjZWxzZQorLy8JCQkJc3RydWN0IGRldmljZSAqZGV2CisJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2CisjZW5kaWYKKworICAgICkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9yZWdvZmZzZXQpOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3JlZ3ZhbHVlKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9tb2RlKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9obnBjYXBhYmxlKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9zcnBjYXBhYmxlKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9oc2ljX2Nvbm5lY3QpOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2ludl9zZWxfaHNpYyk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaG5wKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9zcnApOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2J1c3Bvd2VyKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9idXNzdXNwZW5kKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9tb2RlX2NoX3RpbV9lbik7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZnJfaW50ZXJ2YWwpOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2J1c2Nvbm5lY3RlZCk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZ290Z2N0bCk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZ3VzYmNmZyk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZ3J4ZnNpeik7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZ25wdHhmc2l6KTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9ncHZuZGN0bCk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZ2dwaW8pOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2d1aWQpOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2dzbnBzaWQpOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2RldnNwZWVkKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9lbnVtc3BlZWQpOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2hwdHhmc2l6KTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9ocHJ0MCk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfcmVtb3RlX3dha2V1cCk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfcmVtX3dha2V1cF9wd3Jkbik7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZGlzY29ubmVjdF91cyk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfcmVnZHVtcCk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfc3ByYW1kdW1wKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9oY2RkdW1wKTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9oY2RfZnJyZW0pOworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3JkX3JlZ190ZXN0KTsKKwllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl93cl9yZWdfdGVzdCk7CisjaWZkZWYgQ09ORklHX1VTQl9EV0NfT1RHX0xQTQorCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2xwbV9yZXNwb25zZSk7CisJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfc2xlZXBfc3RhdHVzKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJlbW92ZSB0aGUgZGV2aWNlIGZpbGVzCisgKi8KK3ZvaWQgZHdjX290Z19hdHRyX3JlbW92ZSgKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwkJCQlzdHJ1Y3QgbG1fZGV2aWNlICpkZXYKKyNlbGlmICBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJCQkJc3RydWN0IHBjaV9kZXYgKmRldgorI2Vsc2UKKwkJCQkvL3N0cnVjdCBkZXZpY2UgKmRldgorCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldgorI2VuZGlmCisKKyAgICApCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3JlZ29mZnNldCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3JlZ3ZhbHVlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfbW9kZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2hucGNhcGFibGUpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9zcnBjYXBhYmxlKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaHNpY19jb25uZWN0KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaW52X3NlbF9oc2ljKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaG5wKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfc3JwKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfYnVzcG93ZXIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9idXNzdXNwZW5kKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfbW9kZV9jaF90aW1fZW4pOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9mcl9pbnRlcnZhbCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2J1c2Nvbm5lY3RlZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2dvdGdjdGwpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9ndXNiY2ZnKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZ3J4ZnNpeik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2ducHR4ZnNpeik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2dwdm5kY3RsKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZ2dwaW8pOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9ndWlkKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZ3NucHNpZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX2RldnNwZWVkKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZW51bXNwZWVkKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaHB0eGZzaXopOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9ocHJ0MCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3JlbW90ZV93YWtldXApOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9yZW1fd2FrZXVwX3B3cmRuKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfZGlzY29ubmVjdF91cyk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZkZXYtPmRldiwgJmRldl9hdHRyX3JlZ2R1bXApOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9zcHJhbWR1bXApOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9oY2RkdW1wKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfaGNkX2ZycmVtKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmRldi0+ZGV2LCAmZGV2X2F0dHJfcmRfcmVnX3Rlc3QpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl93cl9yZWdfdGVzdCk7CisjaWZkZWYgQ09ORklHX1VTQl9EV0NfT1RHX0xQTQorCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9scG1fcmVzcG9uc2UpOworCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsICZkZXZfYXR0cl9zbGVlcF9zdGF0dXMpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfYXR0ci5oIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2F0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDc5ZTZjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2F0dHIuaApAQCAtMCwwICsxLDg5IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfYXR0ci5oICQKKyAqICRSZXZpc2lvbjogIzEzICQKKyAqICREYXRlOiAyMDEwLzA2LzIxICQKKyAqICRDaGFuZ2U6IDE1MzIwMjEgJAorICoKKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICogCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdCB1bmRlcgorICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAorICogd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKKyAqIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLCBkaXNjbG9zZSwgY29weSBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSBvcgorICogYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tCisgKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKKyAqIGJlbG93LCB0aGVuIHlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBTb2Z0d2FyZS4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIiBCQVNJUworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmICFkZWZpbmVkKF9fRFdDX09UR19BVFRSX0hfXykKKyNkZWZpbmUgX19EV0NfT1RHX0FUVFJfSF9fCisKKy8qKiBAZmlsZQorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbnRlcmZhY2UgdG8gdGhlIExpbnV4IGRldmljZSBhdHRyaWJ1dGVzLgorICovCitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfcmVnb2Zmc2V0OworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX3JlZ3ZhbHVlOworCitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfbW9kZTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9obnBjYXBhYmxlOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX3NycGNhcGFibGU7CitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfaG5wOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX3NycDsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9idXNwb3dlcjsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9idXNzdXNwZW5kOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX21vZGVfY2hfdGltX2VuOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2ZyX2ludGVydmFsOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2J1c2Nvbm5lY3RlZDsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9nb3RnY3RsOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2d1c2JjZmc7CitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZ3J4ZnNpejsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9nbnB0eGZzaXo7CitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZ3B2bmRjdGw7CitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZ2dwaW87CitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZ3VpZDsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9nc25wc2lkOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2RldnNwZWVkOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2VudW1zcGVlZDsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ocHR4ZnNpejsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9ocHJ0MDsKKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfbHBtX3Jlc3BvbnNlOworZXh0ZXJuIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldmlfYXR0cl9zbGVlcF9zdGF0dXM7CisjZW5kaWYKKwordm9pZCBkd2Nfb3RnX2F0dHJfY3JlYXRlKAorI2lmZGVmIExNX0lOVEVSRkFDRQorCQkJCXN0cnVjdCBsbV9kZXZpY2UgKmRldgorI2VsaWYgIFBDSV9JTlRFUkZBQ0UKKwkJCQlzdHJ1Y3QgcGNpX2RldiAqZGV2CisjZWxzZQkJCQkKKwkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYKKyNlbmRpZgorICAgICk7CisKK3ZvaWQgZHdjX290Z19hdHRyX3JlbW92ZSgKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwkJCQlzdHJ1Y3QgbG1fZGV2aWNlICpkZXYKKyNlbGlmICBQQ0lfSU5URVJGQUNFCisJCQkJc3RydWN0IHBjaV9kZXYgKmRldgorI2Vsc2UJCQkJCisJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2CisjZW5kaWYKKyAgICApOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY2ZpLmMgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY2ZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2ZmUxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19jZmkuYwpAQCAtMCwwICsxLDE4NzYgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTeW5vcHN5cyBIUyBPVEcgTGludXggU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIChoZXJlaW5hZnRlciwKKyAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqIAorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKKyAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gdXNlIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgKiBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwgZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IKKyAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQorICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgKiBiZWxvdywgdGhlbiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKiBAZmlsZSAKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIG1vc3Qgb2YgdGhlIENGSShDb3JlIEZlYXR1cmUgSW50ZXJmYWNlKSAKKyAqIGltcGxlbWVudGF0aW9uIGZvciB0aGUgT1RHLiAKKyAqLworCisjaWZkZWYgRFdDX1VURV9DRkkKKworI2luY2x1ZGUgImR3Y19vdGdfcGNkLmgiCisjaW5jbHVkZSAiZHdjX290Z19jZmkuaCIKKworLyoqIFRoaXMgZGVmaW5pdGlvbiBzaG91bGQgYWN0dWFsbHkgbWlncmF0ZSB0byB0aGUgUG9ydGFiaWxpdHkgTGlicmFyeSAqLworI2RlZmluZSBEV0NfQ09OU1RBTlRfQ1BVX1RPX0xFMTYoeCkgKHgpCisKK2V4dGVybiBkd2Nfb3RnX3BjZF9lcF90ICpnZXRfZXBfYnlfYWRkcihkd2Nfb3RnX3BjZF90ICogcGNkLCB1MTYgd0luZGV4KTsKKworc3RhdGljIGludCBjZmlfY29yZV9mZWF0dXJlc19idWYodWludDhfdCAqIGJ1ZiwgdWludDE2X3QgYnVmbGVuKTsKK3N0YXRpYyBpbnQgY2ZpX2dldF9mZWF0dXJlX3ZhbHVlKHVpbnQ4X3QgKiBidWYsIHVpbnQxNl90IGJ1ZmxlbiwKKwkJCQkgc3RydWN0IGR3Y19vdGdfcGNkICpwY2QsCisJCQkJIHN0cnVjdCBjZmlfdXNiX2N0cmxyZXF1ZXN0ICpjdHJsX3JlcSk7CitzdGF0aWMgaW50IGNmaV9zZXRfZmVhdHVyZV92YWx1ZShzdHJ1Y3QgZHdjX290Z19wY2QgKnBjZCk7CitzdGF0aWMgaW50IGNmaV9lcF9nZXRfc2dfdmFsKHVpbnQ4X3QgKiBidWYsIHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkLAorCQkJICAgICBzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgY2ZpX2VwX2dldF9jb25jYXRfdmFsKHVpbnQ4X3QgKiBidWYsIHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkLAorCQkJCSBzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgY2ZpX2VwX2dldF9hbGlnbl92YWwodWludDhfdCAqIGJ1Ziwgc3RydWN0IGR3Y19vdGdfcGNkICpwY2QsCisJCQkJc3RydWN0IGNmaV91c2JfY3RybHJlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IGNmaV9wcmVwcm9jX3Jlc2V0KHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkLAorCQkJICAgICBzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCAqcmVxKTsKK3N0YXRpYyB2b2lkIGNmaV9mcmVlX2VwX2JzX2R5bl9kYXRhKGNmaV9lcF90ICogY2ZpZXApOworCitzdGF0aWMgdWludDE2X3QgZ2V0X2RmaWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK3N0YXRpYyBpbnQzMl90IGdldF9yeGZpZm9fc2l6ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQxNl90IHdWYWx1ZSk7CitzdGF0aWMgaW50MzJfdCBnZXRfdHhmaWZvX3NpemUoc3RydWN0IGR3Y19vdGdfcGNkICpwY2QsIHVpbnQxNl90IHdWYWx1ZSk7CisKK3N0YXRpYyB1aW50OF90IHJlc2l6ZV9maWZvcyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworCisvKiogVGhpcyBpcyB0aGUgaGVhZGVyIG9mIHRoZSBhbGwgZmVhdHVyZXMgZGVzY3JpcHRvciAqLworc3RhdGljIGNmaV9hbGxfZmVhdHVyZXNfaGVhZGVyX3QgYWxsX3Byb3BzX2Rlc2NfaGVhZGVyID0geworCS53VmVyc2lvbiA9IERXQ19DT05TVEFOVF9DUFVfVE9fTEUxNigweDEwMCksCisJLndDb3JlSUQgPSBEV0NfQ09OU1RBTlRfQ1BVX1RPX0xFMTYoQ0ZJX0NPUkVfSURfT1RHKSwKKwkud051bUZlYXR1cmVzID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KDkpLAorfTsKKworLyoqIFRoaXMgaXMgYW4gYXJyYXkgb2Ygc3RhdGljYWxseSBhbGxvY2F0ZWQgZmVhdHVyZSBkZXNjcmlwdG9ycyAqLworc3RhdGljIGNmaV9mZWF0dXJlX2Rlc2NfaGVhZGVyX3QgcHJvcF9kZXNjc1tdID0geworCisJLyogRlRfSURfRE1BX01PREUgKi8KKwl7CisJIC53RmVhdHVyZUlEID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KEZUX0lEX0RNQV9NT0RFKSwKKwkgLmJtQXR0cmlidXRlcyA9IENGSV9GRUFUVVJFX0FUVFJfUlcsCisJIC53RGF0YUxlbmd0aCA9IERXQ19DT05TVEFOVF9DUFVfVE9fTEUxNigxKSwKKwkgfSwKKworCS8qIEZUX0lEX0RNQV9CVUZGRVJfU0VUVVAgKi8KKwl7CisJIC53RmVhdHVyZUlEID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KEZUX0lEX0RNQV9CVUZGRVJfU0VUVVApLAorCSAuYm1BdHRyaWJ1dGVzID0gQ0ZJX0ZFQVRVUkVfQVRUUl9SVywKKwkgLndEYXRhTGVuZ3RoID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KDYpLAorCSB9LAorCisJLyogRlRfSURfRE1BX0JVRkZfQUxJR04gKi8KKwl7CisJIC53RmVhdHVyZUlEID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KEZUX0lEX0RNQV9CVUZGX0FMSUdOKSwKKwkgLmJtQXR0cmlidXRlcyA9IENGSV9GRUFUVVJFX0FUVFJfUlcsCisJIC53RGF0YUxlbmd0aCA9IERXQ19DT05TVEFOVF9DUFVfVE9fTEUxNigyKSwKKwkgfSwKKworCS8qIEZUX0lEX0RNQV9DT05DQVRfU0VUVVAgKi8KKwl7CisJIC53RmVhdHVyZUlEID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KEZUX0lEX0RNQV9DT05DQVRfU0VUVVApLAorCSAuYm1BdHRyaWJ1dGVzID0gQ0ZJX0ZFQVRVUkVfQVRUUl9SVywKKwkgLy8ud0RhdGFMZW5ndGggID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KDYpLAorCSB9LAorCisJLyogRlRfSURfRE1BX0NJUkNVTEFSICovCisJeworCSAud0ZlYXR1cmVJRCA9IERXQ19DT05TVEFOVF9DUFVfVE9fTEUxNihGVF9JRF9ETUFfQ0lSQ1VMQVIpLAorCSAuYm1BdHRyaWJ1dGVzID0gQ0ZJX0ZFQVRVUkVfQVRUUl9SVywKKwkgLndEYXRhTGVuZ3RoID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KDYpLAorCSB9LAorCisJLyogRlRfSURfVEhSRVNIT0xEX1NFVFVQICovCisJeworCSAud0ZlYXR1cmVJRCA9IERXQ19DT05TVEFOVF9DUFVfVE9fTEUxNihGVF9JRF9USFJFU0hPTERfU0VUVVApLAorCSAuYm1BdHRyaWJ1dGVzID0gQ0ZJX0ZFQVRVUkVfQVRUUl9SVywKKwkgLndEYXRhTGVuZ3RoID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KDYpLAorCSB9LAorCisJLyogRlRfSURfREZJRk9fREVQVEggKi8KKwl7CisJIC53RmVhdHVyZUlEID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KEZUX0lEX0RGSUZPX0RFUFRIKSwKKwkgLmJtQXR0cmlidXRlcyA9IENGSV9GRUFUVVJFX0FUVFJfUk8sCisJIC53RGF0YUxlbmd0aCA9IERXQ19DT05TVEFOVF9DUFVfVE9fTEUxNigyKSwKKwkgfSwKKworCS8qIEZUX0lEX1RYX0ZJRk9fREVQVEggKi8KKwl7CisJIC53RmVhdHVyZUlEID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KEZUX0lEX1RYX0ZJRk9fREVQVEgpLAorCSAuYm1BdHRyaWJ1dGVzID0gQ0ZJX0ZFQVRVUkVfQVRUUl9SVywKKwkgLndEYXRhTGVuZ3RoID0gRFdDX0NPTlNUQU5UX0NQVV9UT19MRTE2KDIpLAorCSB9LAorCisJLyogRlRfSURfUlhfRklGT19ERVBUSCAqLworCXsKKwkgLndGZWF0dXJlSUQgPSBEV0NfQ09OU1RBTlRfQ1BVX1RPX0xFMTYoRlRfSURfUlhfRklGT19ERVBUSCksCisJIC5ibUF0dHJpYnV0ZXMgPSBDRklfRkVBVFVSRV9BVFRSX1JXLAorCSAud0RhdGFMZW5ndGggPSBEV0NfQ09OU1RBTlRfQ1BVX1RPX0xFMTYoMiksCisJIH0KK307CisKKy8qKiBUaGUgdGFibGUgb2YgZmVhdHVyZSBuYW1lcyAqLworY2ZpX3N0cmluZ190IHByb3BfbmFtZV90YWJsZVtdID0geworCXtGVF9JRF9ETUFfTU9ERSwgImRtYV9tb2RlIn0sCisJe0ZUX0lEX0RNQV9CVUZGRVJfU0VUVVAsICJidWZmZXJfc2V0dXAifSwKKwl7RlRfSURfRE1BX0JVRkZfQUxJR04sICJidWZmZXJfYWxpZ24ifSwKKwl7RlRfSURfRE1BX0NPTkNBVF9TRVRVUCwgImNvbmNhdF9zZXR1cCJ9LAorCXtGVF9JRF9ETUFfQ0lSQ1VMQVIsICJidWZmZXJfY2lyY3VsYXIifSwKKwl7RlRfSURfVEhSRVNIT0xEX1NFVFVQLCAidGhyZXNob2xkX3NldHVwIn0sCisJe0ZUX0lEX0RGSUZPX0RFUFRILCAiZGZpZm9fZGVwdGgifSwKKwl7RlRfSURfVFhfRklGT19ERVBUSCwgInR4Zmlmb19kZXB0aCJ9LAorCXtGVF9JRF9SWF9GSUZPX0RFUFRILCAicnhmaWZvX2RlcHRoIn0sCisJe30KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiAKKyAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUgYnkgaXRzIElEIAorICogb3IgTlVMTCBpZiBubyBmZWF0dXRlIElEIG1hdGNoZXMuCisgKiAKKyAqLworY29uc3QgdWludDhfdCAqZ2V0X3Byb3BfbmFtZSh1aW50MTZfdCBwcm9wX2lkLCBpbnQgKmxlbikKK3sKKwljZmlfc3RyaW5nX3QgKnBzdHI7CisJKmxlbiA9IDA7CisKKwlmb3IgKHBzdHIgPSBwcm9wX25hbWVfdGFibGU7IHBzdHIgJiYgcHN0ci0+czsgcHN0cisrKSB7CisJCWlmIChwc3RyLT5pZCA9PSBwcm9wX2lkKSB7CisJCQkqbGVuID0gRFdDX1NUUkxFTihwc3RyLT5zKTsKKwkJCXJldHVybiBwc3RyLT5zOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbGwgQ0ZJIHNwZWNpZmljIGNvbnRyb2wgcmVxdWVzdHMuCisgKiAKKyAqIFJldHVybiBhIG5lZ2F0aXZlIHZhbHVlIHRvIHN0YWxsIHRoZSBEQ0UuCisgKi8KK2ludCBjZmlfc2V0dXAoc3RydWN0IGR3Y19vdGdfcGNkICpwY2QsIHN0cnVjdCBjZmlfdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQoreworCWludCByZXR2YWwgPSAwOworCWR3Y19vdGdfcGNkX2VwX3QgKmVwID0gTlVMTDsKKwljZmlvYmplY3RfdCAqY2ZpID0gcGNkLT5jZmk7CisJc3RydWN0IGR3Y19vdGdfY29yZV9pZiAqY29yZWlmID0gR0VUX0NPUkVfSUYocGNkKTsKKwl1aW50MTZfdCB3TGVuID0gRFdDX0xFMTZfVE9fQ1BVKCZjdHJsLT53TGVuZ3RoKTsKKwl1aW50MTZfdCB3VmFsdWUgPSBEV0NfTEUxNl9UT19DUFUoJmN0cmwtPndWYWx1ZSk7CisJdWludDE2X3Qgd0luZGV4ID0gRFdDX0xFMTZfVE9fQ1BVKCZjdHJsLT53SW5kZXgpOworCXVpbnQzMl90IHJlZ2FkZHIgPSAwOworCXVpbnQzMl90IHJlZ3ZhbCA9IDA7CisKKwkvKiBTYXZlIHRoaXMgQ29udHJvbCBSZXF1ZXN0IGluIHRoZSBDRkkgb2JqZWN0LiAKKwkgKiBUaGUgZGF0YSBmaWVsZCB3aWxsIGJlIGFzc2lnbmVkIGluIHRoZSBkYXRhIHN0YWdlIGNvbXBsZXRpb24gQ0IgZnVuY3Rpb24uCisJICovCisJY2ZpLT5jdHJsX3JlcSA9ICpjdHJsOworCWNmaS0+Y3RybF9yZXEuZGF0YSA9IE5VTEw7CisKKwljZmktPm5lZWRfZ2FkZ2V0X2F0dCA9IDA7CisJY2ZpLT5uZWVkX3N0YXR1c19pbl9jb21wbGV0ZSA9IDA7CisKKwlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7CisJY2FzZSBWRU5fQ09SRV9HRVRfRkVBVFVSRVM6CisJCXJldHZhbCA9IGNmaV9jb3JlX2ZlYXR1cmVzX2J1ZihjZmktPmJ1Zl9pbi5idWYsIENGSV9JTl9CVUZfTEVOKTsKKwkJaWYgKHJldHZhbCA+PSAwKSB7CisJCQkvL2R1bXBfbXNnKGNmaS0+YnVmX2luLmJ1ZiwgcmV0dmFsKTsKKwkJCWVwID0gJnBjZC0+ZXAwOworCisJCQlyZXR2YWwgPSBtaW4oKHVpbnQxNl90KSByZXR2YWwsIHdMZW4pOworCQkJLyogVHJhbnNmZXIgdGhpcyBidWZmZXIgdG8gdGhlIGhvc3QgdGhyb3VnaCB0aGUgRVAwLUlOIEVQICovCisJCQllcC0+ZHdjX2VwLmRtYV9hZGRyID0gY2ZpLT5idWZfaW4uYWRkcjsKKwkJCWVwLT5kd2NfZXAuc3RhcnRfeGZlcl9idWZmID0gY2ZpLT5idWZfaW4uYnVmOworCQkJZXAtPmR3Y19lcC54ZmVyX2J1ZmYgPSBjZmktPmJ1Zl9pbi5idWY7CisJCQllcC0+ZHdjX2VwLnhmZXJfbGVuID0gcmV0dmFsOworCQkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ID0gMDsKKwkJCWVwLT5kd2NfZXAuc2VudF96bHAgPSAwOworCQkJZXAtPmR3Y19lcC50b3RhbF9sZW4gPSBlcC0+ZHdjX2VwLnhmZXJfbGVuOworCisJCQlwY2QtPmVwMF9wZW5kaW5nID0gMTsKKwkJCWR3Y19vdGdfZXAwX3N0YXJ0X3RyYW5zZmVyKGNvcmVpZiwgJmVwLT5kd2NfZXApOworCQl9CisJCXJldHZhbCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBWRU5fQ09SRV9HRVRfRkVBVFVSRToKKwkJQ0ZJX0lORk8oIlZFTl9DT1JFX0dFVF9GRUFUVVJFXG4iKTsKKwkJcmV0dmFsID0gY2ZpX2dldF9mZWF0dXJlX3ZhbHVlKGNmaS0+YnVmX2luLmJ1ZiwgQ0ZJX0lOX0JVRl9MRU4sCisJCQkJCSAgICAgICBwY2QsIGN0cmwpOworCQlpZiAocmV0dmFsID49IDApIHsKKwkJCWVwID0gJnBjZC0+ZXAwOworCisJCQlyZXR2YWwgPSBtaW4oKHVpbnQxNl90KSByZXR2YWwsIHdMZW4pOworCQkJLyogVHJhbnNmZXIgdGhpcyBidWZmZXIgdG8gdGhlIGhvc3QgdGhyb3VnaCB0aGUgRVAwLUlOIEVQICovCisJCQllcC0+ZHdjX2VwLmRtYV9hZGRyID0gY2ZpLT5idWZfaW4uYWRkcjsKKwkJCWVwLT5kd2NfZXAuc3RhcnRfeGZlcl9idWZmID0gY2ZpLT5idWZfaW4uYnVmOworCQkJZXAtPmR3Y19lcC54ZmVyX2J1ZmYgPSBjZmktPmJ1Zl9pbi5idWY7CisJCQllcC0+ZHdjX2VwLnhmZXJfbGVuID0gcmV0dmFsOworCQkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ID0gMDsKKwkJCWVwLT5kd2NfZXAuc2VudF96bHAgPSAwOworCQkJZXAtPmR3Y19lcC50b3RhbF9sZW4gPSBlcC0+ZHdjX2VwLnhmZXJfbGVuOworCisJCQlwY2QtPmVwMF9wZW5kaW5nID0gMTsKKwkJCWR3Y19vdGdfZXAwX3N0YXJ0X3RyYW5zZmVyKGNvcmVpZiwgJmVwLT5kd2NfZXApOworCQl9CisJCUNGSV9JTkZPKCJWRU5fQ09SRV9HRVRfRkVBVFVSRT0lZFxuIiwgcmV0dmFsKTsKKwkJZHVtcF9tc2coY2ZpLT5idWZfaW4uYnVmLCByZXR2YWwpOworCQlicmVhazsKKworCWNhc2UgVkVOX0NPUkVfU0VUX0ZFQVRVUkU6CisJCUNGSV9JTkZPKCJWRU5fQ09SRV9TRVRfRkVBVFVSRVxuIik7CisJCS8qIFNldCB1cCBhbiBYRkVSIHRvIGdldCB0aGUgZGF0YSBzdGFnZSBvZiB0aGUgY29udHJvbCByZXF1ZXN0LAorCQkgKiB3aGljaCBpcyB0aGUgbmV3IHZhbHVlIG9mIHRoZSBmZWF0dXJlIHRvIGJlIG1vZGlmaWVkLgorCQkgKi8KKwkJZXAgPSAmcGNkLT5lcDA7CisJCWVwLT5kd2NfZXAuaXNfaW4gPSAwOworCQllcC0+ZHdjX2VwLmRtYV9hZGRyID0gY2ZpLT5idWZfb3V0LmFkZHI7CisJCWVwLT5kd2NfZXAuc3RhcnRfeGZlcl9idWZmID0gY2ZpLT5idWZfb3V0LmJ1ZjsKKwkJZXAtPmR3Y19lcC54ZmVyX2J1ZmYgPSBjZmktPmJ1Zl9vdXQuYnVmOworCQllcC0+ZHdjX2VwLnhmZXJfbGVuID0gd0xlbjsKKwkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ID0gMDsKKwkJZXAtPmR3Y19lcC5zZW50X3pscCA9IDA7CisJCWVwLT5kd2NfZXAudG90YWxfbGVuID0gZXAtPmR3Y19lcC54ZmVyX2xlbjsKKworCQlwY2QtPmVwMF9wZW5kaW5nID0gMTsKKwkJLyogUmVhZCB0aGUgY29udHJvbCB3cml0ZSdzIGRhdGEgc3RhZ2UgKi8KKwkJZHdjX290Z19lcDBfc3RhcnRfdHJhbnNmZXIoY29yZWlmLCAmZXAtPmR3Y19lcCk7CisJCXJldHZhbCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBWRU5fQ09SRV9SRVNFVF9GRUFUVVJFUzoKKwkJQ0ZJX0lORk8oIlZFTl9DT1JFX1JFU0VUX0ZFQVRVUkVTXG4iKTsKKwkJY2ZpLT5uZWVkX2dhZGdldF9hdHQgPSAxOworCQljZmktPm5lZWRfc3RhdHVzX2luX2NvbXBsZXRlID0gMTsKKwkJcmV0dmFsID0gY2ZpX3ByZXByb2NfcmVzZXQocGNkLCBjdHJsKTsKKwkJQ0ZJX0lORk8oIlZFTl9DT1JFX1JFU0VUX0ZFQVRVUkVTID0gKCVkKVxuIiwgcmV0dmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFZFTl9DT1JFX0FDVElWQVRFX0ZFQVRVUkVTOgorCQlDRklfSU5GTygiVkVOX0NPUkVfQUNUSVZBVEVfRkVBVFVSRVNcbiIpOworCQlicmVhazsKKworCWNhc2UgVkVOX0NPUkVfUkVBRF9SRUdJU1RFUjoKKwkJQ0ZJX0lORk8oIlZFTl9DT1JFX1JFQURfUkVHSVNURVJcbiIpOworCQkvKiB3VmFsdWUgb3B0aW9uYWxseSBjb250YWlucyB0aGUgSEkgV09SRCBvZiB0aGUgcmVnaXN0ZXIgb2Zmc2V0IGFuZAorCQkgKiB3SW5kZXggY29udGFpbnMgdGhlIExPVyBXT1JEIG9mIHRoZSByZWdpc3RlciBvZmZzZXQgCisJCSAqLworCQlpZiAod1ZhbHVlID09IDApIHsKKwkJCS8qIEBUT0RPIC0gTUFTIC0gZml4IHRoZSBhY2Nlc3MgdG8gdGhlIGJhc2UgZmllbGQgKi8KKwkJCXJlZ2FkZHIgPSAwOworCQkJLy9yZWdhZGRyID0gKHVpbnQzMl90KSBwY2QtPm90Z19kZXYtPm9zX2RlcC5iYXNlOworCQkJLy9HRVRfQ09SRV9JRihwY2QpLT5jbworCQkJcmVnYWRkciB8PSB3SW5kZXg7CisJCX0gZWxzZSB7CisJCQlyZWdhZGRyID0gKHdWYWx1ZSA8PCAxNikgfCB3SW5kZXg7CisJCX0KKworCQkvKiBSZWFkIGEgMzItYml0IHZhbHVlIG9mIHRoZSBtZW1vcnkgYXQgdGhlIHJlZ2FkZHIgKi8KKwkJcmVndmFsID0gRFdDX1JFQURfUkVHMzIoKHVpbnQzMl90ICopIHJlZ2FkZHIpOworCisJCWVwID0gJnBjZC0+ZXAwOworCQlkd2NfbWVtY3B5KGNmaS0+YnVmX2luLmJ1ZiwgJnJlZ3ZhbCwgc2l6ZW9mKHVpbnQzMl90KSk7CisJCWVwLT5kd2NfZXAuaXNfaW4gPSAxOworCQllcC0+ZHdjX2VwLmRtYV9hZGRyID0gY2ZpLT5idWZfaW4uYWRkcjsKKwkJZXAtPmR3Y19lcC5zdGFydF94ZmVyX2J1ZmYgPSBjZmktPmJ1Zl9pbi5idWY7CisJCWVwLT5kd2NfZXAueGZlcl9idWZmID0gY2ZpLT5idWZfaW4uYnVmOworCQllcC0+ZHdjX2VwLnhmZXJfbGVuID0gd0xlbjsKKwkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ID0gMDsKKwkJZXAtPmR3Y19lcC5zZW50X3pscCA9IDA7CisJCWVwLT5kd2NfZXAudG90YWxfbGVuID0gZXAtPmR3Y19lcC54ZmVyX2xlbjsKKworCQlwY2QtPmVwMF9wZW5kaW5nID0gMTsKKwkJZHdjX290Z19lcDBfc3RhcnRfdHJhbnNmZXIoY29yZWlmLCAmZXAtPmR3Y19lcCk7CisJCWNmaS0+bmVlZF9nYWRnZXRfYXR0ID0gMDsKKwkJcmV0dmFsID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFZFTl9DT1JFX1dSSVRFX1JFR0lTVEVSOgorCQlDRklfSU5GTygiVkVOX0NPUkVfV1JJVEVfUkVHSVNURVJcbiIpOworCQkvKiBTZXQgdXAgYW4gWEZFUiB0byBnZXQgdGhlIGRhdGEgc3RhZ2Ugb2YgdGhlIGNvbnRyb2wgcmVxdWVzdCwKKwkJICogd2hpY2ggaXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgbW9kaWZpZWQuCisJCSAqLworCQllcCA9ICZwY2QtPmVwMDsKKwkJZXAtPmR3Y19lcC5pc19pbiA9IDA7CisJCWVwLT5kd2NfZXAuZG1hX2FkZHIgPSBjZmktPmJ1Zl9vdXQuYWRkcjsKKwkJZXAtPmR3Y19lcC5zdGFydF94ZmVyX2J1ZmYgPSBjZmktPmJ1Zl9vdXQuYnVmOworCQllcC0+ZHdjX2VwLnhmZXJfYnVmZiA9IGNmaS0+YnVmX291dC5idWY7CisJCWVwLT5kd2NfZXAueGZlcl9sZW4gPSB3TGVuOworCQllcC0+ZHdjX2VwLnhmZXJfY291bnQgPSAwOworCQllcC0+ZHdjX2VwLnNlbnRfemxwID0gMDsKKwkJZXAtPmR3Y19lcC50b3RhbF9sZW4gPSBlcC0+ZHdjX2VwLnhmZXJfbGVuOworCisJCXBjZC0+ZXAwX3BlbmRpbmcgPSAxOworCQkvKiBSZWFkIHRoZSBjb250cm9sIHdyaXRlJ3MgZGF0YSBzdGFnZSAqLworCQlkd2Nfb3RnX2VwMF9zdGFydF90cmFuc2Zlcihjb3JlaWYsICZlcC0+ZHdjX2VwKTsKKwkJcmV0dmFsID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR2YWwgPSAtRFdDX0VfTk9UX1NVUFBPUlRFRDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIHRoZSBjb3JlIGZlYXR1cmVzIGRlc2NyaXB0b3JzIGFuZCBjb3BpZXMgaXRzCisgKiByYXcgcmVwcmVzZW50YXRpb24gaW50byB0aGUgYnVmZmVyIDxidWY+LgorICogCisgKiBUaGUgYnVmZmVyIHN0cnVjdHVyZSBpcyBhcyBmb2xsb3dzOgorICoJYWxsX2ZlYXR1cmVzX2hlYWRlciAoOCBieXRlcykKKyAqCWZlYXR1cmVzXyMxICg4IGJ5dGVzICsgZmVhdHVyZSBuYW1lIHN0cmluZyBsZW5ndGgpCisgKglmZWF0dXJlc18jMiAoOCBieXRlcyArIGZlYXR1cmUgbmFtZSBzdHJpbmcgbGVuZ3RoKQorICoJLi4uLi4KKyAqCWZlYXR1cmVzXyNuIC0gd2hlcmUgbj10aGUgdG90YWwgY291bnQgb2YgZmVhdHVyZSBkZXNjcmlwdG9ycworICovCitzdGF0aWMgaW50IGNmaV9jb3JlX2ZlYXR1cmVzX2J1Zih1aW50OF90ICogYnVmLCB1aW50MTZfdCBidWZsZW4pCit7CisJY2ZpX2ZlYXR1cmVfZGVzY19oZWFkZXJfdCAqcHJvcF9oZHIgPSBwcm9wX2Rlc2NzOworCWNmaV9mZWF0dXJlX2Rlc2NfaGVhZGVyX3QgKnByb3A7CisJY2ZpX2FsbF9mZWF0dXJlc19oZWFkZXJfdCAqYWxsX3Byb3BzX2hkciA9ICZhbGxfcHJvcHNfZGVzY19oZWFkZXI7CisJY2ZpX2FsbF9mZWF0dXJlc19oZWFkZXJfdCAqdG1wOworCXVpbnQ4X3QgKnRtcGJ1ZiA9IGJ1ZjsKKwljb25zdCB1aW50OF90ICpwbmFtZSA9IE5VTEw7CisJaW50IGksIGosIG5hbWVsZW4gPSAwLCB0b3RsZW47CisKKwkvKiBQcmVwYXJlIGFuZCBjb3B5IHRoZSBjb3JlIGZlYXR1cmVzIGludG8gdGhlIGJ1ZmZlciAqLworCUNGSV9JTkZPKCIlczpcbiIsIF9fZnVuY19fKTsKKworCXRtcCA9IChjZmlfYWxsX2ZlYXR1cmVzX2hlYWRlcl90ICopIHRtcGJ1ZjsKKwkqdG1wID0gKmFsbF9wcm9wc19oZHI7CisJdG1wYnVmICs9IENGSV9BTExfRkVBVFVSRVNfSERSX0xFTjsKKworCWogPSBzaXplb2YocHJvcF9kZXNjcykgLyBzaXplb2YoY2ZpX2FsbF9mZWF0dXJlc19oZWFkZXJfdCk7CisJZm9yIChpID0gMDsgaSA8IGo7IGkrKywgcHJvcF9oZHIrKykgeworCQlwbmFtZSA9IGdldF9wcm9wX25hbWUocHJvcF9oZHItPndGZWF0dXJlSUQsICZuYW1lbGVuKTsKKwkJcHJvcCA9IChjZmlfZmVhdHVyZV9kZXNjX2hlYWRlcl90ICopIHRtcGJ1ZjsKKwkJKnByb3AgPSAqcHJvcF9oZHI7CisKKwkJcHJvcC0+Yk5hbWVMZW4gPSBuYW1lbGVuOworCQlwcm9wLT53TGVuZ3RoID0KKwkJICAgIERXQ19DT05TVEFOVF9DUFVfVE9fTEUxNihDRklfRkVBVFVSRV9ERVNDX0hEUl9MRU4gKworCQkJCQkgICAgIG5hbWVsZW4pOworCisJCXRtcGJ1ZiArPSBDRklfRkVBVFVSRV9ERVNDX0hEUl9MRU47CisJCWR3Y19tZW1jcHkodG1wYnVmLCBwbmFtZSwgbmFtZWxlbik7CisJCXRtcGJ1ZiArPSBuYW1lbGVuOworCX0KKworCXRvdGxlbiA9IHRtcGJ1ZiAtIGJ1ZjsKKworCWlmICh0b3RsZW4gPiAwKSB7CisJCXRtcCA9IChjZmlfYWxsX2ZlYXR1cmVzX2hlYWRlcl90ICopIGJ1ZjsKKwkJdG1wLT53VG90YWxMZW4gPSBEV0NfQ09OU1RBTlRfQ1BVX1RPX0xFMTYodG90bGVuKTsKKwl9CisKKwlyZXR1cm4gdG90bGVuOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYWxsIHRoZSBkeW5hbWljIG1lbW9yeSBpbiB0aGUgQ0ZJIG9iamVjdC4KKyAqLworc3RhdGljIHZvaWQgY2ZpX3JlbGVhc2UoY2Zpb2JqZWN0X3QgKiBjZmlvYmopCit7CisJY2ZpX2VwX3QgKmNmaWVwOworCWR3Y19saXN0X2xpbmtfdCAqdG1wOworCisJQ0ZJX0lORk8oIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY2Zpb2JqLT5idWZfaW4uYnVmKSB7CisJCURXQ19ETUFfRlJFRShDRklfSU5fQlVGX0xFTiwgY2Zpb2JqLT5idWZfaW4uYnVmLAorCQkJICAgICBjZmlvYmotPmJ1Zl9pbi5hZGRyKTsKKwkJY2Zpb2JqLT5idWZfaW4uYnVmID0gTlVMTDsKKwl9CisKKwlpZiAoY2Zpb2JqLT5idWZfb3V0LmJ1ZikgeworCQlEV0NfRE1BX0ZSRUUoQ0ZJX09VVF9CVUZfTEVOLCBjZmlvYmotPmJ1Zl9vdXQuYnVmLAorCQkJICAgICBjZmlvYmotPmJ1Zl9vdXQuYWRkcik7CisJCWNmaW9iai0+YnVmX291dC5idWYgPSBOVUxMOworCX0KKworCS8qIEZyZWUgdGhlIEJ1ZmZlciBTZXR1cCB2YWx1ZXMgZm9yIGVhY2ggRVAgKi8KKwkvL2xpc3RfZm9yX2VhY2hfZW50cnkoY2ZpZXAsICZjZmlvYmotPmFjdGl2ZV9lcHMsIGxoKSB7CisJRFdDX0xJU1RfRk9SRUFDSCh0bXAsICZjZmlvYmotPmFjdGl2ZV9lcHMpIHsKKwkJY2ZpZXAgPSBEV0NfTElTVF9FTlRSWSh0bXAsIHN0cnVjdCBjZmlfZXAsIGxoKTsKKwkJY2ZpX2ZyZWVfZXBfYnNfZHluX2RhdGEoY2ZpZXApOworCX0KK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgRVAgYnVmZmVyIHNldHVwIGRhdGEuCisgKi8KK3N0YXRpYyB2b2lkIGNmaV9mcmVlX2VwX2JzX2R5bl9kYXRhKGNmaV9lcF90ICogY2ZpZXApCit7CisJaWYgKGNmaWVwLT5ibV9zZykgeworCQlEV0NfRlJFRShjZmllcC0+Ym1fc2cpOworCQljZmllcC0+Ym1fc2cgPSBOVUxMOworCX0KKworCWlmIChjZmllcC0+Ym1fYWxpZ24pIHsKKwkJRFdDX0ZSRUUoY2ZpZXAtPmJtX2FsaWduKTsKKwkJY2ZpZXAtPmJtX2FsaWduID0gTlVMTDsKKwl9CisKKwlpZiAoY2ZpZXAtPmJtX2NvbmNhdCkgeworCQlpZiAoTlVMTCAhPSBjZmllcC0+Ym1fY29uY2F0LT53VHhCeXRlcykgeworCQkJRFdDX0ZSRUUoY2ZpZXAtPmJtX2NvbmNhdC0+d1R4Qnl0ZXMpOworCQkJY2ZpZXAtPmJtX2NvbmNhdC0+d1R4Qnl0ZXMgPSBOVUxMOworCQl9CisJCURXQ19GUkVFKGNmaWVwLT5ibV9jb25jYXQpOworCQljZmllcC0+Ym1fY29uY2F0ID0gTlVMTDsKKwl9Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIGZlYXR1cmVzCisgKiBmb3IgYSBzcGVjaWZpYyBlbmRwb2ludCBhbmQgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2Ugd2hlbgorICogdGhlIEVQIGlzIGVuYWJsZWQgZmlyc3QgdGltZS4KKyAqLworc3RhdGljIGludCBjZmlfZXBfaW5pdF9kZWZhdWx0cyhzdHJ1Y3QgZHdjX290Z19wY2QgKnBjZCwgY2ZpX2VwX3QgKiBjZmllcCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWNmaWVwLT5ibV9zZyA9IERXQ19BTExPQyhzaXplb2YoZGRtYV9zZ19idWZmZXJfc2V0dXBfdCkpOworCWlmIChOVUxMID09IGNmaWVwLT5ibV9zZykgeworCQlDRklfSU5GTygiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgU0cgZmVhdHVyZSB2YWx1ZVxuIik7CisJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCX0KKwlkd2NfbWVtc2V0KGNmaWVwLT5ibV9zZywgMCwgc2l6ZW9mKGRkbWFfc2dfYnVmZmVyX3NldHVwX3QpKTsKKworCS8qIEZvciB0aGUgQ29uY2F0ZW5hdGlvbiBmZWF0dXJlJ3MgZGVmYXVsdCB2YWx1ZSB3ZSBkbyBub3QgYWxsb2NhdGUKKwkgKiBtZW1vcnkgZm9yIHRoZSB3VHhCeXRlcyBmaWVsZCAtIGl0IHdpbGwgYmUgZG9uZSBpbiB0aGUgc2V0X2ZlYXR1cmVfdmFsdWUKKwkgKiByZXF1ZXN0IGhhbmRsZXIuCisJICovCisJY2ZpZXAtPmJtX2NvbmNhdCA9IERXQ19BTExPQyhzaXplb2YoZGRtYV9jb25jYXRfYnVmZmVyX3NldHVwX3QpKTsKKwlpZiAoTlVMTCA9PSBjZmllcC0+Ym1fY29uY2F0KSB7CisJCUNGSV9JTkZPCisJCSAgICAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIENPTkNBVEVOQVRJT04gZmVhdHVyZSB2YWx1ZVxuIik7CisJCURXQ19GUkVFKGNmaWVwLT5ibV9zZyk7CisJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCX0KKwlkd2NfbWVtc2V0KGNmaWVwLT5ibV9jb25jYXQsIDAsIHNpemVvZihkZG1hX2NvbmNhdF9idWZmZXJfc2V0dXBfdCkpOworCisJY2ZpZXAtPmJtX2FsaWduID0gRFdDX0FMTE9DKHNpemVvZihkZG1hX2FsaWduX2J1ZmZlcl9zZXR1cF90KSk7CisJaWYgKE5VTEwgPT0gY2ZpZXAtPmJtX2FsaWduKSB7CisJCUNGSV9JTkZPCisJCSAgICAoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEFsaWdubWVudCBmZWF0dXJlIHZhbHVlXG4iKTsKKwkJRFdDX0ZSRUUoY2ZpZXAtPmJtX3NnKTsKKwkJRFdDX0ZSRUUoY2ZpZXAtPmJtX2NvbmNhdCk7CisJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCX0KKwlkd2NfbWVtc2V0KGNmaWVwLT5ibV9hbGlnbiwgMCwgc2l6ZW9mKGRkbWFfYWxpZ25fYnVmZmVyX3NldHVwX3QpKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgbm90aWZpZXMgdGhlIENGSSBvbiB0aGUgYWN0aXZhdGlvbiBvZgorICogYW4gZW5kcG9pbnQgaW4gdGhlIFBDRC4gVGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgZG9uZSBpbiB0aGlzIGZ1bmN0aW9uOgorICoKKyAqCUNyZWF0ZSBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBjZmlfZXBfdCBvYmplY3QgKGEgQ0ZJIHdyYXBwZXIgdG8gdGhlIFBDRCdzIAorICoJCWFjdGl2ZSBlbmRwb2ludCkKKyAqCUNyZWF0ZSBNQVhfRE1BX0RFU0NTX1BFUl9FUCBjb3VudCBETUEgRGVzY3JpcHRvcnMgZm9yIHRoZSBFUAorICoJU2V0IHRoZSBCdWZmZXIgTW9kZSB0byBzdGFuZGFyZAorICoJSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBFUCBtb2RlcyAoU0csIENpcmN1bGFyLCBDb25jYXQsIEFsaWduKQorICoJQWRkIHRoZSBjZmlfZXBfdCBvYmplY3QgdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIGVuZHBvaW50cyBpbiB0aGUgQ0ZJIG9iamVjdAorICovCitzdGF0aWMgaW50IGNmaV9lcF9lbmFibGUoc3RydWN0IGNmaW9iamVjdCAqY2ZpLCBzdHJ1Y3QgZHdjX290Z19wY2QgKnBjZCwKKwkJCSBzdHJ1Y3QgZHdjX290Z19wY2RfZXAgKmVwKQoreworCWNmaV9lcF90ICpjZmllcDsKKwlpbnQgcmV0dmFsID0gLURXQ19FX05PVF9TVVBQT1JURUQ7CisKKwlDRklfSU5GTygiJXM6IGVwbmFtZT0lczsgZXBudW09MHglMDJ4XG4iLCBfX2Z1bmNfXywKKwkJICJFUF8iIC8qZXAtPmVwLm5hbWUgKi8gLCBlcC0+ZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7CisJLyogTUFTIC0gQ2hlY2sgd2hldGhlciB0aGlzIGVuZHBvaW50IGFscmVhZHkgaXMgaW4gdGhlIGxpc3QgKi8KKwljZmllcCA9IGdldF9jZmlfZXBfYnlfcGNkX2VwKGNmaSwgZXApOworCisJaWYgKE5VTEwgPT0gY2ZpZXApIHsKKwkJLyogQWxsb2NhdGUgYSBjZmlfZXBfdCBvYmplY3QgKi8KKwkJY2ZpZXAgPSBEV0NfQUxMT0Moc2l6ZW9mKGNmaV9lcF90KSk7CisJCWlmIChOVUxMID09IGNmaWVwKSB7CisJCQlDRklfSU5GTworCQkJICAgICgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgPGNmaWVwPiBpbiBmdW5jdGlvbiAlc1xuIiwKKwkJCSAgICAgX19mdW5jX18pOworCQkJcmV0dXJuIC1EV0NfRV9OT19NRU1PUlk7CisJCX0KKwkJZHdjX21lbXNldChjZmllcCwgMCwgc2l6ZW9mKGNmaV9lcF90KSk7CisKKwkJLyogU2F2ZSB0aGUgZHdjX290Z19wY2RfZXAgcG9pbnRlciBpbiB0aGUgY2ZpZXAgb2JqZWN0ICovCisJCWNmaWVwLT5lcCA9IGVwOworCisJCS8qIEFsbG9jYXRlIHRoZSBETUEgRGVzY3JpcHRvcnMgY2hhaW4gb2YgTUFYX0RNQV9ERVNDU19QRVJfRVAgY291bnQgKi8KKwkJZXAtPmR3Y19lcC5kZXNjcyA9CisJCSAgICBEV0NfRE1BX0FMTE9DKE1BWF9ETUFfREVTQ1NfUEVSX0VQICoKKwkJCQkgIHNpemVvZihkd2Nfb3RnX2RtYV9kZXNjX3QpLAorCQkJCSAgJmVwLT5kd2NfZXAuZGVzY3NfZG1hX2FkZHIpOworCisJCWlmIChOVUxMID09IGVwLT5kd2NfZXAuZGVzY3MpIHsKKwkJCURXQ19GUkVFKGNmaWVwKTsKKwkJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCQl9CisKKwkJRFdDX0xJU1RfSU5JVCgmY2ZpZXAtPmxoKTsKKworCQkvKiBTZXQgdGhlIGJ1ZmZlciBtb2RlIHRvIEJNX1NUQU5EQVJELiBJdCB3aWxsIGJlIG1vZGlmaWVkIAorCQkgKiB3aGVuIGJ1aWxkaW5nIGRlc2NyaXB0b3JzIGZvciBhIHNwZWNpZmljIGJ1ZmZlciBtb2RlICovCisJCWVwLT5kd2NfZXAuYnVmZl9tb2RlID0gQk1fU1RBTkRBUkQ7CisKKwkJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhpcyBFUCdzIEJ1ZmZlciBtb2RlcyAqLworCQlpZiAoKHJldHZhbCA9IGNmaV9lcF9pbml0X2RlZmF1bHRzKHBjZCwgY2ZpZXApKSA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCisJCS8qIEFkZCB0aGUgY2ZpX2VwX3Qgb2JqZWN0IHRvIHRoZSBDRkkgb2JqZWN0J3MgbGlzdCBvZiBhY3RpdmUgZW5kcG9pbnRzICovCisJCURXQ19MSVNUX0lOU0VSVF9UQUlMKCZjZmktPmFjdGl2ZV9lcHMsICZjZmllcC0+bGgpOworCQlyZXR2YWwgPSAwOworCX0gZWxzZSB7CQkvKiBUaGUgc291Z2h0IEVQIGFscmVhZHkgaXMgaW4gdGhlIGxpc3QgKi8KKwkJQ0ZJX0lORk8oIiVzOiBUaGUgc291Z2h0IEVQIGFscmVhZHkgaXMgaW4gdGhlIGxpc3RcbiIsCisJCQkgX19mdW5jX18pOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZGF0YSBzdGFnZSBvZiBhIDMtc3RhZ2UgQ29udHJvbCBXcml0ZSByZXF1ZXN0CisgKiBpcyBjb21wbGV0ZS4KKyAqIAorICovCitzdGF0aWMgaW50IGNmaV9jdHJsX3dyaXRlX2NvbXBsZXRlKHN0cnVjdCBjZmlvYmplY3QgKmNmaSwKKwkJCQkgICBzdHJ1Y3QgZHdjX290Z19wY2QgKnBjZCkKK3sKKwl1aW50MzJfdCBhZGRyLCByZWdfdmFsdWU7CisJdWludDE2X3Qgd0luZGV4LCB3VmFsdWU7CisJdWludDhfdCBiUmVxdWVzdDsKKwl1aW50OF90ICpidWYgPSBjZmktPmJ1Zl9vdXQuYnVmOworCS8vc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybF9yZXEgPSAmY2ZpLT5jdHJsX3JlcV9zYXZlZDsKKwlzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCAqY3RybF9yZXEgPSAmY2ZpLT5jdHJsX3JlcTsKKwlpbnQgcmV0dmFsID0gLURXQ19FX05PVF9TVVBQT1JURUQ7CisKKwlDRklfSU5GTygiJXNcbiIsIF9fZnVuY19fKTsKKworCWJSZXF1ZXN0ID0gY3RybF9yZXEtPmJSZXF1ZXN0OworCXdJbmRleCA9IERXQ19DT05TVEFOVF9DUFVfVE9fTEUxNihjdHJsX3JlcS0+d0luZGV4KTsKKwl3VmFsdWUgPSBEV0NfQ09OU1RBTlRfQ1BVX1RPX0xFMTYoY3RybF9yZXEtPndWYWx1ZSk7CisKKwkvKiAKKwkgKiBTYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBkYXRhIHN0YWdlIGluIHRoZSBjdHJsX3JlcSdzIDxkYXRhPiBmaWVsZC4KKwkgKiBUaGUgcmVxdWVzdCBzaG91bGQgYmUgYWxyZWFkeSBzYXZlZCBpbiB0aGUgY29tbWFuZCBzdGFnZSBieSBub3cuCisJICovCisJY3RybF9yZXEtPmRhdGEgPSBjZmktPmJ1Zl9vdXQuYnVmOworCWNmaS0+bmVlZF9zdGF0dXNfaW5fY29tcGxldGUgPSAwOworCWNmaS0+bmVlZF9nYWRnZXRfYXR0ID0gMDsKKworCXN3aXRjaCAoYlJlcXVlc3QpIHsKKwljYXNlIFZFTl9DT1JFX1dSSVRFX1JFR0lTVEVSOgorCQkvKiBUaGUgYnVmZmVyIGNvbnRhaW5zIHJhdyBkYXRhIG9mIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSByZWdpc3RlciAqLworCQlyZWdfdmFsdWUgPSAqKCh1aW50MzJfdCAqKSBidWYpOworCQlpZiAod1ZhbHVlID09IDApIHsKKwkJCWFkZHIgPSAwOworCQkJLy9hZGRyID0gKHVpbnQzMl90KSBwY2QtPm90Z19kZXYtPm9zX2RlcC5iYXNlOworCQkJYWRkciArPSB3SW5kZXg7CisJCX0gZWxzZSB7CisJCQlhZGRyID0gKHdWYWx1ZSA8PCAxNikgfCB3SW5kZXg7CisJCX0KKworCQkvL3dyaXRlbChyZWdfdmFsdWUsIGFkZHIpOworCisJCXJldHZhbCA9IDA7CisJCWNmaS0+bmVlZF9zdGF0dXNfaW5fY29tcGxldGUgPSAxOworCQlicmVhazsKKworCWNhc2UgVkVOX0NPUkVfU0VUX0ZFQVRVUkU6CisJCS8qIFRoZSBidWZmZXIgY29udGFpbnMgcmF3IGRhdGEgb2YgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgZmVhdHVyZSAqLworCQlyZXR2YWwgPSBjZmlfc2V0X2ZlYXR1cmVfdmFsdWUocGNkKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCisJCWNmaS0+bmVlZF9zdGF0dXNfaW5fY29tcGxldGUgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIERNQSBkZXNjcmlwdG9ycyBmb3IgdGhlIFNHIGJ1ZmZlciBtb2RlLgorICovCitzdGF0aWMgdm9pZCBjZmlfYnVpbGRfc2dfZGVzY3Moc3RydWN0IGNmaW9iamVjdCAqY2ZpLCBjZmlfZXBfdCAqIGNmaWVwLAorCQkJICAgICAgIGR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqIHJlcSkKK3sKKwlzdHJ1Y3QgZHdjX290Z19wY2RfZXAgKmVwID0gY2ZpZXAtPmVwOworCWRkbWFfc2dfYnVmZmVyX3NldHVwX3QgKnNndmFsID0gY2ZpZXAtPmJtX3NnOworCXN0cnVjdCBkd2Nfb3RnX2RtYV9kZXNjICpkZXNjID0gY2ZpZXAtPmVwLT5kd2NfZXAuZGVzY3M7CisJc3RydWN0IGR3Y19vdGdfZG1hX2Rlc2MgKmRlc2NfbGFzdCA9IGNmaWVwLT5lcC0+ZHdjX2VwLmRlc2NzOworCWRtYV9hZGRyX3QgYnVmZl9hZGRyID0gcmVxLT5kbWE7CisJaW50IGk7CisJdWludDMyX3QgdHhzaXplLCBvZmY7CisKKwl0eHNpemUgPSBzZ3ZhbC0+d1NpemU7CisJb2ZmID0gc2d2YWwtPmJPZmZzZXQ7CisKKy8vICAgICAgQ0ZJX0lORk8oIiVzOiAlcyBUWFNJWkU9MHglMDh4OyBPRkZTRVQ9MHglMDh4XG4iLCAKKy8vICAgICAgICAgICAgICBfX2Z1bmNfXywgY2ZpZXAtPmVwLT5lcC5uYW1lLCB0eHNpemUsIG9mZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2d2YWwtPmJDb3VudDsgaSsrKSB7CisJCWRlc2MtPnN0YXR1cy5iLmJzID0gQlNfSE9TVF9CVVNZOworCQlkZXNjLT5idWYgPSBidWZmX2FkZHI7CisJCWRlc2MtPnN0YXR1cy5iLmwgPSAwOworCQlkZXNjLT5zdGF0dXMuYi5pb2MgPSAwOworCQlkZXNjLT5zdGF0dXMuYi5zcCA9IDA7CisJCWRlc2MtPnN0YXR1cy5iLmJ5dGVzID0gdHhzaXplOworCQlkZXNjLT5zdGF0dXMuYi5icyA9IEJTX0hPU1RfUkVBRFk7CisKKwkJLyogU2V0IHRoZSBuZXh0IGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciAqLworCQlidWZmX2FkZHIgKz0gdHhzaXplICsgb2ZmOworCQlkZXNjX2xhc3QgPSBkZXNjOworCQlkZXNjKys7CisJfQorCisJLyogU2V0IHRoZSBsYXN0LCBpb2MgYW5kIHNwIGJpdHMgb24gdGhlIExhc3QgRE1BIERlc2NyaXB0b3IgKi8KKwlkZXNjX2xhc3QtPnN0YXR1cy5iLmwgPSAxOworCWRlc2NfbGFzdC0+c3RhdHVzLmIuaW9jID0gMTsKKwlkZXNjX2xhc3QtPnN0YXR1cy5iLnNwID0gZXAtPmR3Y19lcC5zZW50X3pscDsKKwkvKiBTYXZlIHRoZSBsYXN0IERNQSBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KKwljZmllcC0+ZG1hX2Rlc2NfbGFzdCA9IGRlc2NfbGFzdDsKKwljZmllcC0+ZGVzY19jb3VudCA9IHNndmFsLT5iQ291bnQ7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIERNQSBkZXNjcmlwdG9ycyBmb3IgdGhlIENvbmNhdGVuYXRpb24gYnVmZmVyIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGNmaV9idWlsZF9jb25jYXRfZGVzY3Moc3RydWN0IGNmaW9iamVjdCAqY2ZpLCBjZmlfZXBfdCAqIGNmaWVwLAorCQkJCSAgIGR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqIHJlcSkKK3sKKwlzdHJ1Y3QgZHdjX290Z19wY2RfZXAgKmVwID0gY2ZpZXAtPmVwOworCWRkbWFfY29uY2F0X2J1ZmZlcl9zZXR1cF90ICpjb25jYXR2YWwgPSBjZmllcC0+Ym1fY29uY2F0OworCXN0cnVjdCBkd2Nfb3RnX2RtYV9kZXNjICpkZXNjID0gY2ZpZXAtPmVwLT5kd2NfZXAuZGVzY3M7CisJc3RydWN0IGR3Y19vdGdfZG1hX2Rlc2MgKmRlc2NfbGFzdCA9IGNmaWVwLT5lcC0+ZHdjX2VwLmRlc2NzOworCWRtYV9hZGRyX3QgYnVmZl9hZGRyID0gcmVxLT5kbWE7CisJaW50IGk7CisJdWludDE2X3QgKnR4c2l6ZTsKKworCXR4c2l6ZSA9IGNvbmNhdHZhbC0+d1R4Qnl0ZXM7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29uY2F0dmFsLT5oZHIuYkRlc2NDb3VudDsgaSsrKSB7CisJCWRlc2MtPmJ1ZiA9IGJ1ZmZfYWRkcjsKKwkJZGVzYy0+c3RhdHVzLmIuYnMgPSBCU19IT1NUX0JVU1k7CisJCWRlc2MtPnN0YXR1cy5iLmwgPSAwOworCQlkZXNjLT5zdGF0dXMuYi5pb2MgPSAwOworCQlkZXNjLT5zdGF0dXMuYi5zcCA9IDA7CisJCWRlc2MtPnN0YXR1cy5iLmJ5dGVzID0gKnR4c2l6ZTsKKwkJZGVzYy0+c3RhdHVzLmIuYnMgPSBCU19IT1NUX1JFQURZOworCisJCXR4c2l6ZSsrOworCQkvKiBTZXQgdGhlIG5leHQgYWRkcmVzcyBvZiB0aGUgYnVmZmVyICovCisJCWJ1ZmZfYWRkciArPSBVR0VUVyhlcC0+ZGVzYy0+d01heFBhY2tldFNpemUpOworCQlkZXNjX2xhc3QgPSBkZXNjOworCQlkZXNjKys7CisJfQorCisJLyogU2V0IHRoZSBsYXN0LCBpb2MgYW5kIHNwIGJpdHMgb24gdGhlIExhc3QgRE1BIERlc2NyaXB0b3IgKi8KKwlkZXNjX2xhc3QtPnN0YXR1cy5iLmwgPSAxOworCWRlc2NfbGFzdC0+c3RhdHVzLmIuaW9jID0gMTsKKwlkZXNjX2xhc3QtPnN0YXR1cy5iLnNwID0gZXAtPmR3Y19lcC5zZW50X3pscDsKKwljZmllcC0+ZG1hX2Rlc2NfbGFzdCA9IGRlc2NfbGFzdDsKKwljZmllcC0+ZGVzY19jb3VudCA9IGNvbmNhdHZhbC0+aGRyLmJEZXNjQ291bnQ7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIERNQSBkZXNjcmlwdG9ycyBmb3IgdGhlIENpcmN1bGFyIGJ1ZmZlciBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIGNmaV9idWlsZF9jaXJjX2Rlc2NzKHN0cnVjdCBjZmlvYmplY3QgKmNmaSwgY2ZpX2VwX3QgKiBjZmllcCwKKwkJCQkgZHdjX290Z19wY2RfcmVxdWVzdF90ICogcmVxKQoreworCS8qIEB0b2RvOiBNQVMgLSBhZGQgaW1wbGVtZW50YXRpb24gd2hlbiB0aGlzIGZlYXR1cmUgbmVlZHMgdG8gYmUgdGVzdGVkICovCit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIERNQSBkZXNjcmlwdG9ycyBmb3IgdGhlIEFsaWdubWVudCBidWZmZXIgbW9kZQorICovCitzdGF0aWMgdm9pZCBjZmlfYnVpbGRfYWxpZ25fZGVzY3Moc3RydWN0IGNmaW9iamVjdCAqY2ZpLCBjZmlfZXBfdCAqIGNmaWVwLAorCQkJCSAgZHdjX290Z19wY2RfcmVxdWVzdF90ICogcmVxKQoreworCXN0cnVjdCBkd2Nfb3RnX3BjZF9lcCAqZXAgPSBjZmllcC0+ZXA7CisJZGRtYV9hbGlnbl9idWZmZXJfc2V0dXBfdCAqYWxpZ252YWwgPSBjZmllcC0+Ym1fYWxpZ247CisJc3RydWN0IGR3Y19vdGdfZG1hX2Rlc2MgKmRlc2MgPSBjZmllcC0+ZXAtPmR3Y19lcC5kZXNjczsKKwlkbWFfYWRkcl90IGJ1ZmZfYWRkciA9IHJlcS0+ZG1hOworCisJZGVzYy0+c3RhdHVzLmIuYnMgPSBCU19IT1NUX0JVU1k7CisJZGVzYy0+c3RhdHVzLmIubCA9IDE7CisJZGVzYy0+c3RhdHVzLmIuaW9jID0gMTsKKwlkZXNjLT5zdGF0dXMuYi5zcCA9IGVwLT5kd2NfZXAuc2VudF96bHA7CisJZGVzYy0+c3RhdHVzLmIuYnl0ZXMgPSByZXEtPmxlbmd0aDsKKwkvKiBBZGp1c3QgdGhlIGJ1ZmZlciBhbGlnbm1lbnQgKi8KKwlkZXNjLT5idWYgPSAoYnVmZl9hZGRyICsgYWxpZ252YWwtPmJBbGlnbik7CisJZGVzYy0+c3RhdHVzLmIuYnMgPSBCU19IT1NUX1JFQURZOworCWNmaWVwLT5kbWFfZGVzY19sYXN0ID0gZGVzYzsKKwljZmllcC0+ZGVzY19jb3VudCA9IDE7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBidWlsZHMgdGhlIERNQSBkZXNjcmlwdG9ycyBjaGFpbiBmb3IgZGlmZmVyZW50IG1vZGVzIG9mIHRoZQorICogYnVmZmVyIHNldHVwIG9mIGFuIGVuZHBvaW50LgorICovCitzdGF0aWMgdm9pZCBjZmlfYnVpbGRfZGVzY3JpcHRvcnMoc3RydWN0IGNmaW9iamVjdCAqY2ZpLAorCQkJCSAgc3RydWN0IGR3Y19vdGdfcGNkICpwY2QsCisJCQkJICBzdHJ1Y3QgZHdjX290Z19wY2RfZXAgKmVwLAorCQkJCSAgZHdjX290Z19wY2RfcmVxdWVzdF90ICogcmVxKQoreworCWNmaV9lcF90ICpjZmllcDsKKworCS8qIEdldCB0aGUgY2ZpZXAgYnkgdGhlIGR3Y19vdGdfcGNkX2VwICovCisJY2ZpZXAgPSBnZXRfY2ZpX2VwX2J5X3BjZF9lcChjZmksIGVwKTsKKwlpZiAoTlVMTCA9PSBjZmllcCkgeworCQlDRklfSU5GTygiJXM6IFVuYWJsZSB0byBmaW5kIGEgbWF0Y2hpbmcgYWN0aXZlIGVuZHBvaW50XG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWNmaWVwLT54ZmVyX2xlbiA9IHJlcS0+bGVuZ3RoOworCisJLyogSXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgRE1BIGRlc2NyaXB0b3JzICovCisJc3dpdGNoIChjZmllcC0+ZXAtPmR3Y19lcC5idWZmX21vZGUpIHsKKwljYXNlIEJNX1NHOgorCQljZmlfYnVpbGRfc2dfZGVzY3MoY2ZpLCBjZmllcCwgcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIEJNX0NPTkNBVDoKKwkJY2ZpX2J1aWxkX2NvbmNhdF9kZXNjcyhjZmksIGNmaWVwLCByZXEpOworCQlicmVhazsKKworCWNhc2UgQk1fQ0lSQ1VMQVI6CisJCWNmaV9idWlsZF9jaXJjX2Rlc2NzKGNmaSwgY2ZpZXAsIHJlcSk7CisJCWJyZWFrOworCisJY2FzZSBCTV9BTElHTjoKKwkJY2ZpX2J1aWxkX2FsaWduX2Rlc2NzKGNmaSwgY2ZpZXAsIHJlcSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIEFsbG9jYXRlIERNQSBidWZmZXIgZm9yIGRpZmZlcmVudCBCdWZmZXIgbW9kZXMuCisgKi8KK3N0YXRpYyB2b2lkICpjZmlfZXBfYWxsb2NfYnVmKHN0cnVjdCBjZmlvYmplY3QgKmNmaSwgc3RydWN0IGR3Y19vdGdfcGNkICpwY2QsCisJCQkgICAgICBzdHJ1Y3QgZHdjX290Z19wY2RfZXAgKmVwLCBkbWFfYWRkcl90ICogZG1hLAorCQkJICAgICAgdW5zaWduZWQgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIERXQ19ETUFfQUxMT0Moc2l6ZSwgZG1hKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBDRkkgb2JqZWN0LgorICovCitpbnQgaW5pdF9jZmkoY2Zpb2JqZWN0X3QgKiBjZmlvYmopCit7CisJQ0ZJX0lORk8oIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgSU4gWEZFUnMgKi8KKwljZmlvYmotPmJ1Zl9pbi5idWYgPQorCSAgICBEV0NfRE1BX0FMTE9DKENGSV9JTl9CVUZfTEVOLCAmY2Zpb2JqLT5idWZfaW4uYWRkcik7CisJaWYgKE5VTEwgPT0gY2Zpb2JqLT5idWZfaW4uYnVmKSB7CisJCUNGSV9JTkZPKCJVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIGZvciBJTnNcbiIpOworCQlyZXR1cm4gLURXQ19FX05PX01FTU9SWTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgT1VUIFhGRVJzICovCisJY2Zpb2JqLT5idWZfb3V0LmJ1ZiA9CisJICAgIERXQ19ETUFfQUxMT0MoQ0ZJX09VVF9CVUZfTEVOLCAmY2Zpb2JqLT5idWZfb3V0LmFkZHIpOworCWlmIChOVUxMID09IGNmaW9iai0+YnVmX291dC5idWYpIHsKKwkJQ0ZJX0lORk8oIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIE9VVFxuIik7CisJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXJzICovCisJY2Zpb2JqLT5vcHMucmVsZWFzZSA9IGNmaV9yZWxlYXNlOworCWNmaW9iai0+b3BzLmVwX2VuYWJsZSA9IGNmaV9lcF9lbmFibGU7CisJY2Zpb2JqLT5vcHMuY3RybF93cml0ZV9jb21wbGV0ZSA9IGNmaV9jdHJsX3dyaXRlX2NvbXBsZXRlOworCWNmaW9iai0+b3BzLmJ1aWxkX2Rlc2NyaXB0b3JzID0gY2ZpX2J1aWxkX2Rlc2NyaXB0b3JzOworCWNmaW9iai0+b3BzLmVwX2FsbG9jX2J1ZiA9IGNmaV9lcF9hbGxvY19idWY7CisKKwkvKiBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGFjdGl2ZSBlbmRwb2ludHMgaW4gdGhlIENGSSBvYmplY3QgKi8KKwlEV0NfTElTVF9JTklUKCZjZmlvYmotPmFjdGl2ZV9lcHMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgcmVxdWlyZWQgZmVhdHVyZSdzIGN1cnJlbnQgdmFsdWUgaW50byB0aGUgYnVmZmVyCisgKgorICogQHJldHZhbDogUmV0dXJucyBuZWdhdGl2ZSBhcyBlcnJvciwgb3IgdGhlIGRhdGEgbGVuZ3RoIG9mIHRoZSBmZWF0dXJlICAKKyAqLworc3RhdGljIGludCBjZmlfZ2V0X2ZlYXR1cmVfdmFsdWUodWludDhfdCAqIGJ1ZiwgdWludDE2X3QgYnVmbGVuLAorCQkJCSBzdHJ1Y3QgZHdjX290Z19wY2QgKnBjZCwKKwkJCQkgc3RydWN0IGNmaV91c2JfY3RybHJlcXVlc3QgKmN0cmxfcmVxKQoreworCWludCByZXR2YWwgPSAtRFdDX0VfTk9UX1NVUFBPUlRFRDsKKwlzdHJ1Y3QgZHdjX290Z19jb3JlX2lmICpjb3JlaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCXVpbnQxNl90IGRmaWZvLCByeGZpZm8sIHR4ZmlmbzsKKworCXN3aXRjaCAoY3RybF9yZXEtPndJbmRleCkgeworCQkvKiBXaGV0aGVyIHRoZSBERE1BIGlzIGVuYWJsZWQgb3Igbm90ICovCisJY2FzZSBGVF9JRF9ETUFfTU9ERToKKwkJKmJ1ZiA9IChjb3JlaWYtPmRtYV9lbmFibGUgJiYgY29yZWlmLT5kbWFfZGVzY19lbmFibGUpID8gMSA6IDA7CisJCXJldHZhbCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBGVF9JRF9ETUFfQlVGRkVSX1NFVFVQOgorCQlyZXR2YWwgPSBjZmlfZXBfZ2V0X3NnX3ZhbChidWYsIHBjZCwgY3RybF9yZXEpOworCQlicmVhazsKKworCWNhc2UgRlRfSURfRE1BX0JVRkZfQUxJR046CisJCXJldHZhbCA9IGNmaV9lcF9nZXRfYWxpZ25fdmFsKGJ1ZiwgcGNkLCBjdHJsX3JlcSk7CisJCWJyZWFrOworCisJY2FzZSBGVF9JRF9ETUFfQ09OQ0FUX1NFVFVQOgorCQlyZXR2YWwgPSBjZmlfZXBfZ2V0X2NvbmNhdF92YWwoYnVmLCBwY2QsIGN0cmxfcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIEZUX0lEX0RNQV9DSVJDVUxBUjoKKwkJQ0ZJX0lORk8oIkdldEZlYXR1cmUgdmFsdWUgKEZUX0lEX0RNQV9DSVJDVUxBUilcbiIpOworCQlicmVhazsKKworCWNhc2UgRlRfSURfVEhSRVNIT0xEX1NFVFVQOgorCQlDRklfSU5GTygiR2V0RmVhdHVyZSB2YWx1ZSAoRlRfSURfVEhSRVNIT0xEX1NFVFVQKVxuIik7CisJCWJyZWFrOworCisJY2FzZSBGVF9JRF9ERklGT19ERVBUSDoKKwkJZGZpZm8gPSBnZXRfZGZpZm9fc2l6ZShjb3JlaWYpOworCQkqKCh1aW50MTZfdCAqKSBidWYpID0gZGZpZm87CisJCXJldHZhbCA9IHNpemVvZih1aW50MTZfdCk7CisJCWJyZWFrOworCisJY2FzZSBGVF9JRF9UWF9GSUZPX0RFUFRIOgorCQlyZXR2YWwgPSBnZXRfdHhmaWZvX3NpemUocGNkLCBjdHJsX3JlcS0+d1ZhbHVlKTsKKwkJaWYgKHJldHZhbCA+PSAwKSB7CisJCQl0eGZpZm8gPSByZXR2YWw7CisJCQkqKCh1aW50MTZfdCAqKSBidWYpID0gdHhmaWZvOworCQkJcmV0dmFsID0gc2l6ZW9mKHVpbnQxNl90KTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRlRfSURfUlhfRklGT19ERVBUSDoKKwkJcmV0dmFsID0gZ2V0X3J4Zmlmb19zaXplKGNvcmVpZiwgY3RybF9yZXEtPndWYWx1ZSk7CisJCWlmIChyZXR2YWwgPj0gMCkgeworCQkJcnhmaWZvID0gcmV0dmFsOworCQkJKigodWludDE2X3QgKikgYnVmKSA9IHJ4ZmlmbzsKKwkJCXJldHZhbCA9IHNpemVvZih1aW50MTZfdCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgU0cgZm9yIHRoZSBzcGVjaWZpZWQgRVAgdG8gaXRzIGRlZmF1bHQgdmFsdWUKKyAqLworc3RhdGljIGludCBjZmlfcmVzZXRfc2dfdmFsKGNmaV9lcF90ICogY2ZpZXApCit7CisJZHdjX21lbXNldChjZmllcC0+Ym1fc2csIDAsIHNpemVvZihkZG1hX3NnX2J1ZmZlcl9zZXR1cF90KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIEFsaWdubWVudCBmb3IgdGhlIHNwZWNpZmllZCBFUCB0byBpdHMgZGVmYXVsdCB2YWx1ZQorICovCitzdGF0aWMgaW50IGNmaV9yZXNldF9hbGlnbl92YWwoY2ZpX2VwX3QgKiBjZmllcCkKK3sKKwlkd2NfbWVtc2V0KGNmaWVwLT5ibV9zZywgMCwgc2l6ZW9mKGRkbWFfc2dfYnVmZmVyX3NldHVwX3QpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgQ29uY2F0ZW5hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBFUCB0byBpdHMgZGVmYXVsdCB2YWx1ZQorICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gc2V0IHRoZSB2YWx1ZSBvZiB0aGUgd1R4Qnl0ZXMgZmllbGQgdG8gTlVMTCBhZnRlciAKKyAqIGZyZWVpbmcgdGhlIG1lbW9yeSBwcmV2aW91c2x5IGFsbG9jYXRlZCBmb3IgdGhpcyBmaWVsZC4KKyAqLworc3RhdGljIGludCBjZmlfcmVzZXRfY29uY2F0X3ZhbChjZmlfZXBfdCAqIGNmaWVwKQoreworCS8qIEZpcnN0IHdlIG5lZWQgdG8gZnJlZSB0aGUgd1R4Qnl0ZXMgZmllbGQgKi8KKwlpZiAoY2ZpZXAtPmJtX2NvbmNhdC0+d1R4Qnl0ZXMpIHsKKwkJRFdDX0ZSRUUoY2ZpZXAtPmJtX2NvbmNhdC0+d1R4Qnl0ZXMpOworCQljZmllcC0+Ym1fY29uY2F0LT53VHhCeXRlcyA9IE5VTEw7CisJfQorCisJZHdjX21lbXNldChjZmllcC0+Ym1fY29uY2F0LCAwLCBzaXplb2YoZGRtYV9jb25jYXRfYnVmZmVyX3NldHVwX3QpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyBhbGwgdGhlIGJ1ZmZlciBzZXR1cHMgb2YgdGhlIHNwZWNpZmllZCBlbmRwb2ludAorICovCitzdGF0aWMgaW50IGNmaV9lcF9yZXNldF9hbGxfc2V0dXBfdmFscyhjZmlfZXBfdCAqIGNmaWVwKQoreworCWNmaV9yZXNldF9zZ192YWwoY2ZpZXApOworCWNmaV9yZXNldF9hbGlnbl92YWwoY2ZpZXApOworCWNmaV9yZXNldF9jb25jYXRfdmFsKGNmaWVwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjZmlfaGFuZGxlX3Jlc2V0X2ZpZm9fdmFsKHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkLCB1aW50OF90IGVwX2FkZHIsCisJCQkJICAgICB1aW50OF90IHJ4X3JzdCwgdWludDhfdCB0eF9yc3QpCit7CisJaW50IHJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCXVpbnQxNl90IHR4X3NpelsxNV07CisJdWludDE2X3Qgcnhfc2l6ID0gMDsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcCA9IE5VTEw7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCWR3Y19vdGdfY29yZV9wYXJhbXNfdCAqcGFyYW1zID0gR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9wYXJhbXM7CisKKwlpZiAocnhfcnN0KSB7CisJCXJ4X3NpeiA9IHBhcmFtcy0+ZGV2X3J4X2ZpZm9fc2l6ZTsKKwkJcGFyYW1zLT5kZXZfcnhfZmlmb19zaXplID0gR0VUX0NPUkVfSUYocGNkKS0+aW5pdF9yeGZzaXo7CisJfQorCisJaWYgKHR4X3JzdCkgeworCQlpZiAoZXBfYWRkciA9PSAwKSB7CisJCQlpbnQgaTsKKworCQkJZm9yIChpID0gMDsgaSA8IGNvcmVfaWYtPmh3Y2ZnNC5iLm51bV9pbl9lcHM7IGkrKykgeworCQkJCXR4X3NpeltpXSA9CisJCQkJICAgIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfdHhfZmlmb19zaXplW2ldOworCQkJCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfdHhfZmlmb19zaXplW2ldID0KKwkJCQkgICAgY29yZV9pZi0+aW5pdF90eGZzaXpbaV07CisJCQl9CisJCX0gZWxzZSB7CisKKwkJCWVwID0gZ2V0X2VwX2J5X2FkZHIocGNkLCBlcF9hZGRyKTsKKworCQkJaWYgKE5VTEwgPT0gZXApIHsKKwkJCQlDRklfSU5GTworCQkJCSAgICAoIiVzOiBVbmFibGUgdG8gZ2V0IHRoZSBlbmRwb2ludCBhZGRyPTB4JTAyeFxuIiwKKwkJCQkgICAgIF9fZnVuY19fLCBlcF9hZGRyKTsKKwkJCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJCQl9CisKKwkJCXR4X3NpelswXSA9CisJCQkgICAgcGFyYW1zLT5kZXZfdHhfZmlmb19zaXplW2VwLT5kd2NfZXAudHhfZmlmb19udW0gLQorCQkJCQkJICAgICAxXTsKKwkJCXBhcmFtcy0+ZGV2X3R4X2ZpZm9fc2l6ZVtlcC0+ZHdjX2VwLnR4X2ZpZm9fbnVtIC0gMV0gPQorCQkJICAgIEdFVF9DT1JFX0lGKHBjZCktPmluaXRfdHhmc2l6W2VwLT4KKwkJCQkJCQkgIGR3Y19lcC50eF9maWZvX251bSAtCisJCQkJCQkJICAxXTsKKwkJfQorCX0KKworCWlmIChyZXNpemVfZmlmb3MoR0VUX0NPUkVfSUYocGNkKSkpIHsKKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgeworCQlDRklfSU5GTworCQkgICAgKCIlczogRXJyb3IgcmVzZXR0aW5nIHRoZSBmZWF0dXJlIFJlc2V0IEFsbChGSUZPIHNpemUpXG4iLAorCQkgICAgIF9fZnVuY19fKTsKKwkJaWYgKHJ4X3JzdCkgeworCQkJcGFyYW1zLT5kZXZfcnhfZmlmb19zaXplID0gcnhfc2l6OworCQl9CisKKwkJaWYgKHR4X3JzdCkgeworCQkJaWYgKGVwX2FkZHIgPT0gMCkgeworCQkJCWludCBpOworCQkJCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5od2NmZzQuYi5udW1faW5fZXBzOworCQkJCSAgICAgaSsrKSB7CisJCQkJCWNvcmVfaWYtPgorCQkJCQkgICAgY29yZV9wYXJhbXMtPmRldl90eF9maWZvX3NpemVbaV0gPQorCQkJCQkgICAgdHhfc2l6W2ldOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcGFyYW1zLT5kZXZfdHhfZmlmb19zaXplW2VwLT4KKwkJCQkJCQkgZHdjX2VwLnR4X2ZpZm9fbnVtIC0KKwkJCQkJCQkgMV0gPSB0eF9zaXpbMF07CisJCQl9CisJCX0KKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgY2ZpX2hhbmRsZV9yZXNldF9hbGwoc3RydWN0IGR3Y19vdGdfcGNkICpwY2QsIHVpbnQ4X3QgYWRkcikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwljZmlfZXBfdCAqY2ZpZXA7CisJY2Zpb2JqZWN0X3QgKmNmaSA9IHBjZC0+Y2ZpOworCWR3Y19saXN0X2xpbmtfdCAqdG1wOworCisJcmV0dmFsID0gY2ZpX2hhbmRsZV9yZXNldF9maWZvX3ZhbChwY2QsIGFkZHIsIDEsIDEpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyogSWYgdGhlIEVQIGFkZHJlc3MgaXMga25vd24gdGhlbiByZXNldCB0aGUgZmVhdHVyZXMgZm9yIG9ubHkgdGhhdCBFUCAqLworCWlmIChhZGRyKSB7CisJCWNmaWVwID0gZ2V0X2NmaV9lcF9ieV9hZGRyKHBjZC0+Y2ZpLCBhZGRyKTsKKwkJaWYgKE5VTEwgPT0gY2ZpZXApIHsKKwkJCUNGSV9JTkZPKCIlczogRXJyb3IgZ2V0dGluZyB0aGUgRVAgYWRkcmVzcyAweCUwMnhcbiIsCisJCQkJIF9fZnVuY19fLCBhZGRyKTsKKwkJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwkJfQorCQlyZXR2YWwgPSBjZmlfZXBfcmVzZXRfYWxsX3NldHVwX3ZhbHMoY2ZpZXApOworCQljZmllcC0+ZXAtPmR3Y19lcC5idWZmX21vZGUgPSBCTV9TVEFOREFSRDsKKwl9CisJLyogT3RoZXJ3aXNlICh3VmFsdWUgPT0gMCksIHJlc2V0IGFsbCBmZWF0dXJlcyBvZiBhbGwgRVAncyAqLworCWVsc2UgeworCQkvKiBUcmF2ZXJzZSBhbGwgdGhlIGFjdGl2ZSBFUCdzIGFuZCByZXNldCB0aGUgZmVhdHVyZShzKSB2YWx1ZShzKSAqLworCQkvL2xpc3RfZm9yX2VhY2hfZW50cnkoY2ZpZXAsICZjZmktPmFjdGl2ZV9lcHMsIGxoKSB7CisJCURXQ19MSVNUX0ZPUkVBQ0godG1wLCAmY2ZpLT5hY3RpdmVfZXBzKSB7CisJCQljZmllcCA9IERXQ19MSVNUX0VOVFJZKHRtcCwgc3RydWN0IGNmaV9lcCwgbGgpOworCQkJcmV0dmFsID0gY2ZpX2VwX3Jlc2V0X2FsbF9zZXR1cF92YWxzKGNmaWVwKTsKKwkJCWNmaWVwLT5lcC0+ZHdjX2VwLmJ1ZmZfbW9kZSA9IEJNX1NUQU5EQVJEOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlDRklfSU5GTworCQkJCSAgICAoIiVzOiBFcnJvciByZXNldHRpbmcgdGhlIGZlYXR1cmUgUmVzZXQgQWxsXG4iLAorCQkJCSAgICAgX19mdW5jX18pOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBjZmlfaGFuZGxlX3Jlc2V0X2RtYV9idWZmX3NldHVwKHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkLAorCQkJCQkgICB1aW50OF90IGFkZHIpCit7CisJaW50IHJldHZhbCA9IDA7CisJY2ZpX2VwX3QgKmNmaWVwOworCWNmaW9iamVjdF90ICpjZmkgPSBwY2QtPmNmaTsKKwlkd2NfbGlzdF9saW5rX3QgKnRtcDsKKworCS8qIElmIHRoZSBFUCBhZGRyZXNzIGlzIGtub3duIHRoZW4gcmVzZXQgdGhlIGZlYXR1cmVzIGZvciBvbmx5IHRoYXQgRVAgKi8KKwlpZiAoYWRkcikgeworCQljZmllcCA9IGdldF9jZmlfZXBfYnlfYWRkcihwY2QtPmNmaSwgYWRkcik7CisJCWlmIChOVUxMID09IGNmaWVwKSB7CisJCQlDRklfSU5GTygiJXM6IEVycm9yIGdldHRpbmcgdGhlIEVQIGFkZHJlc3MgMHglMDJ4XG4iLAorCQkJCSBfX2Z1bmNfXywgYWRkcik7CisJCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJCX0KKwkJcmV0dmFsID0gY2ZpX3Jlc2V0X3NnX3ZhbChjZmllcCk7CisJfQorCS8qIE90aGVyd2lzZSAod1ZhbHVlID09IDApLCByZXNldCBhbGwgZmVhdHVyZXMgb2YgYWxsIEVQJ3MgKi8KKwllbHNlIHsKKwkJLyogVHJhdmVyc2UgYWxsIHRoZSBhY3RpdmUgRVAncyBhbmQgcmVzZXQgdGhlIGZlYXR1cmUocykgdmFsdWUocykgKi8KKwkJLy9saXN0X2Zvcl9lYWNoX2VudHJ5KGNmaWVwLCAmY2ZpLT5hY3RpdmVfZXBzLCBsaCkgeworCQlEV0NfTElTVF9GT1JFQUNIKHRtcCwgJmNmaS0+YWN0aXZlX2VwcykgeworCQkJY2ZpZXAgPSBEV0NfTElTVF9FTlRSWSh0bXAsIHN0cnVjdCBjZmlfZXAsIGxoKTsKKwkJCXJldHZhbCA9IGNmaV9yZXNldF9zZ192YWwoY2ZpZXApOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlDRklfSU5GTworCQkJCSAgICAoIiVzOiBFcnJvciByZXNldHRpbmcgdGhlIGZlYXR1cmUgQnVmZmVyIFNldHVwXG4iLAorCQkJCSAgICAgX19mdW5jX18pOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBjZmlfaGFuZGxlX3Jlc2V0X2NvbmNhdF92YWwoc3RydWN0IGR3Y19vdGdfcGNkICpwY2QsIHVpbnQ4X3QgYWRkcikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwljZmlfZXBfdCAqY2ZpZXA7CisJY2Zpb2JqZWN0X3QgKmNmaSA9IHBjZC0+Y2ZpOworCWR3Y19saXN0X2xpbmtfdCAqdG1wOworCisJLyogSWYgdGhlIEVQIGFkZHJlc3MgaXMga25vd24gdGhlbiByZXNldCB0aGUgZmVhdHVyZXMgZm9yIG9ubHkgdGhhdCBFUCAqLworCWlmIChhZGRyKSB7CisJCWNmaWVwID0gZ2V0X2NmaV9lcF9ieV9hZGRyKHBjZC0+Y2ZpLCBhZGRyKTsKKwkJaWYgKE5VTEwgPT0gY2ZpZXApIHsKKwkJCUNGSV9JTkZPKCIlczogRXJyb3IgZ2V0dGluZyB0aGUgRVAgYWRkcmVzcyAweCUwMnhcbiIsCisJCQkJIF9fZnVuY19fLCBhZGRyKTsKKwkJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwkJfQorCQlyZXR2YWwgPSBjZmlfcmVzZXRfY29uY2F0X3ZhbChjZmllcCk7CisJfQorCS8qIE90aGVyd2lzZSAod1ZhbHVlID09IDApLCByZXNldCBhbGwgZmVhdHVyZXMgb2YgYWxsIEVQJ3MgKi8KKwllbHNlIHsKKwkJLyogVHJhdmVyc2UgYWxsIHRoZSBhY3RpdmUgRVAncyBhbmQgcmVzZXQgdGhlIGZlYXR1cmUocykgdmFsdWUocykgKi8KKwkJLy9saXN0X2Zvcl9lYWNoX2VudHJ5KGNmaWVwLCAmY2ZpLT5hY3RpdmVfZXBzLCBsaCkgeworCQlEV0NfTElTVF9GT1JFQUNIKHRtcCwgJmNmaS0+YWN0aXZlX2VwcykgeworCQkJY2ZpZXAgPSBEV0NfTElTVF9FTlRSWSh0bXAsIHN0cnVjdCBjZmlfZXAsIGxoKTsKKwkJCXJldHZhbCA9IGNmaV9yZXNldF9jb25jYXRfdmFsKGNmaWVwKTsKKwkJCWlmIChyZXR2YWwgPCAwKSB7CisJCQkJQ0ZJX0lORk8KKwkJCQkgICAgKCIlczogRXJyb3IgcmVzZXR0aW5nIHRoZSBmZWF0dXJlIENvbmNhdGVuYXRpb24gVmFsdWVcbiIsCisJCQkJICAgICBfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGNmaV9oYW5kbGVfcmVzZXRfYWxpZ25fdmFsKHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkLCB1aW50OF90IGFkZHIpCit7CisJaW50IHJldHZhbCA9IDA7CisJY2ZpX2VwX3QgKmNmaWVwOworCWNmaW9iamVjdF90ICpjZmkgPSBwY2QtPmNmaTsKKwlkd2NfbGlzdF9saW5rX3QgKnRtcDsKKworCS8qIElmIHRoZSBFUCBhZGRyZXNzIGlzIGtub3duIHRoZW4gcmVzZXQgdGhlIGZlYXR1cmVzIGZvciBvbmx5IHRoYXQgRVAgKi8KKwlpZiAoYWRkcikgeworCQljZmllcCA9IGdldF9jZmlfZXBfYnlfYWRkcihwY2QtPmNmaSwgYWRkcik7CisJCWlmIChOVUxMID09IGNmaWVwKSB7CisJCQlDRklfSU5GTygiJXM6IEVycm9yIGdldHRpbmcgdGhlIEVQIGFkZHJlc3MgMHglMDJ4XG4iLAorCQkJCSBfX2Z1bmNfXywgYWRkcik7CisJCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJCX0KKwkJcmV0dmFsID0gY2ZpX3Jlc2V0X2FsaWduX3ZhbChjZmllcCk7CisJfQorCS8qIE90aGVyd2lzZSAod1ZhbHVlID09IDApLCByZXNldCBhbGwgZmVhdHVyZXMgb2YgYWxsIEVQJ3MgKi8KKwllbHNlIHsKKwkJLyogVHJhdmVyc2UgYWxsIHRoZSBhY3RpdmUgRVAncyBhbmQgcmVzZXQgdGhlIGZlYXR1cmUocykgdmFsdWUocykgKi8KKwkJLy9saXN0X2Zvcl9lYWNoX2VudHJ5KGNmaWVwLCAmY2ZpLT5hY3RpdmVfZXBzLCBsaCkgeworCQlEV0NfTElTVF9GT1JFQUNIKHRtcCwgJmNmaS0+YWN0aXZlX2VwcykgeworCQkJY2ZpZXAgPSBEV0NfTElTVF9FTlRSWSh0bXAsIHN0cnVjdCBjZmlfZXAsIGxoKTsKKwkJCXJldHZhbCA9IGNmaV9yZXNldF9hbGlnbl92YWwoY2ZpZXApOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlDRklfSU5GTworCQkJCSAgICAoIiVzOiBFcnJvciByZXNldHRpbmcgdGhlIGZlYXR1cmUgQWxpaWdubWVudCBWYWx1ZVxuIiwKKwkJCQkgICAgIF9fZnVuY19fKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXR2YWw7CisKK30KKworc3RhdGljIGludCBjZmlfcHJlcHJvY19yZXNldChzdHJ1Y3QgZHdjX290Z19wY2QgKnBjZCwKKwkJCSAgICAgc3RydWN0IGNmaV91c2JfY3RybHJlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCXN3aXRjaCAocmVxLT53SW5kZXgpIHsKKwljYXNlIDA6CisJCS8qIFJlc2V0IGFsbCBmZWF0dXJlcyAqLworCQlyZXR2YWwgPSBjZmlfaGFuZGxlX3Jlc2V0X2FsbChwY2QsIHJlcS0+d1ZhbHVlICYgMHhmZik7CisJCWJyZWFrOworCisJY2FzZSBGVF9JRF9ETUFfQlVGRkVSX1NFVFVQOgorCQkvKiBSZXNldCB0aGUgU0cgYnVmZmVyIHNldHVwICovCisJCXJldHZhbCA9CisJCSAgICBjZmlfaGFuZGxlX3Jlc2V0X2RtYV9idWZmX3NldHVwKHBjZCwgcmVxLT53VmFsdWUgJiAweGZmKTsKKwkJYnJlYWs7CisKKwljYXNlIEZUX0lEX0RNQV9DT05DQVRfU0VUVVA6CisJCS8qIFJlc2V0IHRoZSBDb25jYXRlbmF0aW9uIGJ1ZmZlciBzZXR1cCAqLworCQlyZXR2YWwgPSBjZmlfaGFuZGxlX3Jlc2V0X2NvbmNhdF92YWwocGNkLCByZXEtPndWYWx1ZSAmIDB4ZmYpOworCQlicmVhazsKKworCWNhc2UgRlRfSURfRE1BX0JVRkZfQUxJR046CisJCS8qIFJlc2V0IHRoZSBBbGlnbm1lbnQgYnVmZmVyIHNldHVwICovCisJCXJldHZhbCA9IGNmaV9oYW5kbGVfcmVzZXRfYWxpZ25fdmFsKHBjZCwgcmVxLT53VmFsdWUgJiAweGZmKTsKKwkJYnJlYWs7CisKKwljYXNlIEZUX0lEX1RYX0ZJRk9fREVQVEg6CisJCXJldHZhbCA9CisJCSAgICBjZmlfaGFuZGxlX3Jlc2V0X2ZpZm9fdmFsKHBjZCwgcmVxLT53VmFsdWUgJiAweGZmLCAwLCAxKTsKKwkJcGNkLT5jZmktPm5lZWRfZ2FkZ2V0X2F0dCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBGVF9JRF9SWF9GSUZPX0RFUFRIOgorCQlyZXR2YWwgPSBjZmlfaGFuZGxlX3Jlc2V0X2ZpZm9fdmFsKHBjZCwgMCwgMSwgMCk7CisJCXBjZC0+Y2ZpLT5uZWVkX2dhZGdldF9hdHQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgYSBuZXcgdmFsdWUgZm9yIHRoZSBTRyBidWZmZXIgc2V0dXAuCisgKi8KK3N0YXRpYyBpbnQgY2ZpX2VwX3NldF9zZ192YWwodWludDhfdCAqIGJ1Ziwgc3RydWN0IGR3Y19vdGdfcGNkICpwY2QpCit7CisJdWludDhfdCBpbmFkZHIsIG91dGFkZHI7CisJY2ZpX2VwX3QgKmVwaW4sICplcG91dDsKKwlkZG1hX3NnX2J1ZmZlcl9zZXR1cF90ICpwc2d2YWw7CisJdWludDMyX3QgZGVzY2NvdW50LCBzaXplOworCisJQ0ZJX0lORk8oIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlwc2d2YWwgPSAoZGRtYV9zZ19idWZmZXJfc2V0dXBfdCAqKSBidWY7CisJZGVzY2NvdW50ID0gKHVpbnQzMl90KSBwc2d2YWwtPmJDb3VudDsKKwlzaXplID0gKHVpbnQzMl90KSBwc2d2YWwtPndTaXplOworCisJLyogQ2hlY2sgdGhlIERNQSBkZXNjcmlwdG9yIGNvdW50ICovCisJaWYgKChkZXNjY291bnQgPiBNQVhfRE1BX0RFU0NTX1BFUl9FUCkgfHwgKGRlc2Njb3VudCA9PSAwKSkgeworCQlDRklfSU5GTworCQkgICAgKCIlczogVGhlIGNvdW50IG9mIERNQSBEZXNjcmlwdG9ycyBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAlZFxuIiwKKwkJICAgICBfX2Z1bmNfXywgTUFYX0RNQV9ERVNDU19QRVJfRVApOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJLyogQ2hlY2sgdGhlIERNQSBkZXNjcmlwdG9yIGNvdW50ICovCisKKwlpZiAoc2l6ZSA9PSAwKSB7CisKKwkJQ0ZJX0lORk8oIiVzOiBUaGUgdHJhbnNmZXIgc2l6ZSBzaG91bGQgYmUgYXQgbGVhc3QgMSBieXRlXG4iLAorCQkJIF9fZnVuY19fKTsKKworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisKKwl9CisKKwlpbmFkZHIgPSBwc2d2YWwtPmJJbkVuZHBvaW50QWRkcmVzczsKKwlvdXRhZGRyID0gcHNndmFsLT5iT3V0RW5kcG9pbnRBZGRyZXNzOworCisJZXBpbiA9IGdldF9jZmlfZXBfYnlfYWRkcihwY2QtPmNmaSwgaW5hZGRyKTsKKwllcG91dCA9IGdldF9jZmlfZXBfYnlfYWRkcihwY2QtPmNmaSwgb3V0YWRkcik7CisKKwlpZiAoTlVMTCA9PSBlcGluIHx8IE5VTEwgPT0gZXBvdXQpIHsKKwkJQ0ZJX0lORk8KKwkJICAgICgiJXM6IFVuYWJsZSB0byBnZXQgdGhlIGVuZHBvaW50cyBpbmFkZHI9MHglMDJ4IG91dGFkZHI9MHglMDJ4XG4iLAorCQkgICAgIF9fZnVuY19fLCBpbmFkZHIsIG91dGFkZHIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJZXBpbi0+ZXAtPmR3Y19lcC5idWZmX21vZGUgPSBCTV9TRzsKKwlkd2NfbWVtY3B5KGVwaW4tPmJtX3NnLCBwc2d2YWwsIHNpemVvZihkZG1hX3NnX2J1ZmZlcl9zZXR1cF90KSk7CisKKwllcG91dC0+ZXAtPmR3Y19lcC5idWZmX21vZGUgPSBCTV9TRzsKKwlkd2NfbWVtY3B5KGVwb3V0LT5ibV9zZywgcHNndmFsLCBzaXplb2YoZGRtYV9zZ19idWZmZXJfc2V0dXBfdCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGEgbmV3IHZhbHVlIGZvciB0aGUgYnVmZmVyIEFsaWdubWVudCBzZXR1cC4KKyAqLworc3RhdGljIGludCBjZmlfZXBfc2V0X2FsaWdubWVudF92YWwodWludDhfdCAqIGJ1Ziwgc3RydWN0IGR3Y19vdGdfcGNkICpwY2QpCit7CisJY2ZpX2VwX3QgKmVwOworCXVpbnQ4X3QgYWRkcjsKKwlkZG1hX2FsaWduX2J1ZmZlcl9zZXR1cF90ICpwYWxpZ252YWw7CisKKwlwYWxpZ252YWwgPSAoZGRtYV9hbGlnbl9idWZmZXJfc2V0dXBfdCAqKSBidWY7CisJYWRkciA9IHBhbGlnbnZhbC0+YkVuZHBvaW50QWRkcmVzczsKKworCWVwID0gZ2V0X2NmaV9lcF9ieV9hZGRyKHBjZC0+Y2ZpLCBhZGRyKTsKKworCWlmIChOVUxMID09IGVwKSB7CisJCUNGSV9JTkZPKCIlczogVW5hYmxlIHRvIGdldCB0aGUgZW5kcG9pbnQgYWRkcj0weCUwMnhcbiIsCisJCQkgX19mdW5jX18sIGFkZHIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJZXAtPmVwLT5kd2NfZXAuYnVmZl9tb2RlID0gQk1fQUxJR047CisJZHdjX21lbWNweShlcC0+Ym1fYWxpZ24sIHBhbGlnbnZhbCwgc2l6ZW9mKGRkbWFfYWxpZ25fYnVmZmVyX3NldHVwX3QpKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyBhIG5ldyB2YWx1ZSBmb3IgdGhlIENvbmNhdGVuYXRpb24gYnVmZmVyIHNldHVwLgorICovCitzdGF0aWMgaW50IGNmaV9lcF9zZXRfY29uY2F0X3ZhbCh1aW50OF90ICogYnVmLCBzdHJ1Y3QgZHdjX290Z19wY2QgKnBjZCkKK3sKKwl1aW50OF90IGFkZHI7CisJY2ZpX2VwX3QgKmVwOworCXN0cnVjdCBfZGRtYV9jb25jYXRfYnVmZmVyX3NldHVwX2hkciAqcENvbmNhdFZhbEhkcjsKKwl1aW50MTZfdCAqcFZhbHM7CisJdWludDMyX3QgZGVzY2NvdW50OworCWludCBpOworCXVpbnQxNl90IG1wczsKKworCXBDb25jYXRWYWxIZHIgPSAoc3RydWN0IF9kZG1hX2NvbmNhdF9idWZmZXJfc2V0dXBfaGRyICopYnVmOworCWRlc2Njb3VudCA9ICh1aW50MzJfdCkgcENvbmNhdFZhbEhkci0+YkRlc2NDb3VudDsKKwlwVmFscyA9ICh1aW50MTZfdCAqKSAoYnVmICsgQlNfQ09OQ0FUX1ZBTF9IRFJfTEVOKTsKKworCS8qIENoZWNrIHRoZSBETUEgZGVzY3JpcHRvciBjb3VudCAqLworCWlmIChkZXNjY291bnQgPiBNQVhfRE1BX0RFU0NTX1BFUl9FUCkgeworCQlDRklfSU5GTygiJXM6IE1heGltdW0gRE1BIERlc2NyaXB0b3IgY291bnQgc2hvdWxkIGJlICVkXG4iLAorCQkJIF9fZnVuY19fLCBNQVhfRE1BX0RFU0NTX1BFUl9FUCk7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlhZGRyID0gcENvbmNhdFZhbEhkci0+YkVuZHBvaW50QWRkcmVzczsKKwllcCA9IGdldF9jZmlfZXBfYnlfYWRkcihwY2QtPmNmaSwgYWRkcik7CisJaWYgKE5VTEwgPT0gZXApIHsKKwkJQ0ZJX0lORk8oIiVzOiBVbmFibGUgdG8gZ2V0IHRoZSBlbmRwb2ludCBhZGRyPTB4JTAyeFxuIiwKKwkJCSBfX2Z1bmNfXywgYWRkcik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwltcHMgPSBVR0VUVyhlcC0+ZXAtPmRlc2MtPndNYXhQYWNrZXRTaXplKTsKKworI2lmIDAKKwlmb3IgKGkgPSAwOyBpIDwgZGVzY2NvdW50OyBpKyspIHsKKwkJQ0ZJX0lORk8oIiVzOiB3VHhTaXplWyVkXT0weCUwNHhcbiIsIF9fZnVuY19fLCBpLCBwVmFsc1tpXSk7CisJfQorCUNGSV9JTkZPKCIlczogZXBuYW1lPSVzOyBtcHM9JWRcbiIsIF9fZnVuY19fLCBlcC0+ZXAtPmVwLm5hbWUsIG1wcyk7CisjZW5kaWYKKworCS8qIENoZWNrIHRoZSB3VHhTaXplcyB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1wcyAqLworCWZvciAoaSA9IDA7IGkgPCBkZXNjY291bnQ7IGkrKykgeworCQlpZiAocFZhbHNbaV0gPiBtcHMpIHsKKwkJCUNGSV9JTkZPCisJCQkgICAgKCIlczogRVJST1IgLSB0aGUgd1R4U2l6ZVslZF0gc2hvdWxkIGJlIDw9IE1QUyAod1R4U2l6ZT0lZClcbiIsCisJCQkgICAgIF9fZnVuY19fLCBpLCBwVmFsc1tpXSk7CisJCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJCX0KKwl9CisKKwllcC0+ZXAtPmR3Y19lcC5idWZmX21vZGUgPSBCTV9DT05DQVQ7CisJZHdjX21lbWNweShlcC0+Ym1fY29uY2F0LCBwQ29uY2F0VmFsSGRyLCBCU19DT05DQVRfVkFMX0hEUl9MRU4pOworCisJLyogRnJlZSB0aGUgcHJldmlvdXNseSBhbGxvY2F0ZWQgc3RvcmFnZSBmb3IgdGhlIHdUeEJ5dGVzICovCisJaWYgKGVwLT5ibV9jb25jYXQtPndUeEJ5dGVzKSB7CisJCURXQ19GUkVFKGVwLT5ibV9jb25jYXQtPndUeEJ5dGVzKTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBhIG5ldyBzdG9yYWdlIGZvciB0aGUgd1R4Qnl0ZXMgZmllbGQgKi8KKwllcC0+Ym1fY29uY2F0LT53VHhCeXRlcyA9CisJICAgIERXQ19BTExPQyhzaXplb2YodWludDE2X3QpICogcENvbmNhdFZhbEhkci0+YkRlc2NDb3VudCk7CisJaWYgKE5VTEwgPT0gZXAtPmJtX2NvbmNhdC0+d1R4Qnl0ZXMpIHsKKwkJQ0ZJX0lORk8oIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCX0KKworCS8qIENvcHkgdGhlIG5ldyB2YWx1ZXMgaW50byB0aGUgd1R4Qnl0ZXMgZmlsZWQgKi8KKwlkd2NfbWVtY3B5KGVwLT5ibV9jb25jYXQtPndUeEJ5dGVzLCBidWYgKyBCU19DT05DQVRfVkFMX0hEUl9MRU4sCisJCSAgIHNpemVvZih1aW50MTZfdCkgKiBwQ29uY2F0VmFsSGRyLT5iRGVzY0NvdW50KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgdG90YWwgb2YgYWxsIEZJRk8gc2l6ZXMKKyAqIAorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqCisgKiBAcmV0dXJuIFRoZSB0b3RhbCBvZiBkYXRhIEZJRk8gc2l6ZXMuCisgKgorICovCitzdGF0aWMgdWludDE2X3QgZ2V0X2RmaWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWR3Y19vdGdfY29yZV9wYXJhbXNfdCAqcGFyYW1zID0gY29yZV9pZi0+Y29yZV9wYXJhbXM7CisJdWludDE2X3QgZGZpZm9fdG90YWwgPSAwOworCWludCBpOworCisJLyogVGhlIHNoYXJlZCBSeEZJRk8gc2l6ZSAqLworCWRmaWZvX3RvdGFsID0KKwkgICAgcGFyYW1zLT5kZXZfcnhfZmlmb19zaXplICsgcGFyYW1zLT5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKKworCS8qIEFkZCB1cCBlYWNoIFR4RklGTyBzaXplIHRvIHRoZSB0b3RhbCAqLworCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5od2NmZzQuYi5udW1faW5fZXBzOyBpKyspIHsKKwkJZGZpZm9fdG90YWwgKz0gcGFyYW1zLT5kZXZfdHhfZmlmb19zaXplW2ldOworCX0KKworCXJldHVybiBkZmlmb190b3RhbDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgUnggRklGTyBzaXplCisgKiAKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyCisgKgorICogQHJldHVybiBUaGUgdG90YWwgb2YgZGF0YSBGSUZPIHNpemVzLgorICoKKyAqLworc3RhdGljIGludDMyX3QgZ2V0X3J4Zmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDE2X3Qgd1ZhbHVlKQoreworCXN3aXRjaCAod1ZhbHVlID4+IDgpIHsKKwljYXNlIDA6CisJCXJldHVybiAoY29yZV9pZi0+cHdyb25fcnhmc2l6IDwKKwkJCTMyNzY4KSA/IGNvcmVfaWYtPnB3cm9uX3J4ZnNpeiA6IDMyNzY4OworCQlicmVhazsKKwljYXNlIDE6CisJCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGV2X3J4X2ZpZm9fc2l6ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIFR4IEZJRk8gc2l6ZSBmb3IgSU4gRVAKKyAqIAorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqCisgKiBAcmV0dXJuIFRoZSB0b3RhbCBvZiBkYXRhIEZJRk8gc2l6ZXMuCisgKgorICovCitzdGF0aWMgaW50MzJfdCBnZXRfdHhmaWZvX3NpemUoc3RydWN0IGR3Y19vdGdfcGNkICpwY2QsIHVpbnQxNl90IHdWYWx1ZSkKK3sKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDsKKworCWVwID0gZ2V0X2VwX2J5X2FkZHIocGNkLCB3VmFsdWUgJiAweGZmKTsKKworCWlmIChOVUxMID09IGVwKSB7CisJCUNGSV9JTkZPKCIlczogVW5hYmxlIHRvIGdldCB0aGUgZW5kcG9pbnQgYWRkcj0weCUwMnhcbiIsCisJCQkgX19mdW5jX18sIHdWYWx1ZSAmIDB4ZmYpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJaWYgKCFlcC0+ZHdjX2VwLmlzX2luKSB7CisJCUNGSV9JTkZPCisJCSAgICAoIiVzOiBObyBUeCBGSUZPIGFzc2luZ25lZCB0byB0aGUgT3V0IGVuZHBvaW50IGFkZHI9MHglMDJ4XG4iLAorCQkgICAgIF9fZnVuY19fLCB3VmFsdWUgJiAweGZmKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCXN3aXRjaCAod1ZhbHVlID4+IDgpIHsKKwljYXNlIDA6CisJCXJldHVybiAoR0VUX0NPUkVfSUYocGNkKS0+cHdyb25fdHhmc2l6CisJCQlbZXAtPmR3Y19lcC50eF9maWZvX251bSAtIDFdIDwKKwkJCTc2OCkgPyBHRVRfQ09SRV9JRihwY2QpLT5wd3Jvbl90eGZzaXpbZXAtPgorCQkJCQkJCSAgICAgIGR3Y19lcC50eF9maWZvX251bQorCQkJCQkJCSAgICAgIC0gMV0gOiAzMjc2ODsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyZXR1cm4gR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9wYXJhbXMtPgorCQkgICAgZGV2X3R4X2ZpZm9fc2l6ZVtlcC0+ZHdjX2VwLm51bSAtIDFdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgc3VibWl0dGVkIGNvbWJpbmF0aW9uIG9mIAorICogZGV2aWNlIG1vZGUgRklGTyBzaXplcyBpcyBwb3NzaWJsZSBvciBub3QuCisgKiAKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyCisgKgorICogQHJldHVybiAxIGlmIHBvc3NpYmxlLCAwIG90aGVyd2lzZS4KKyAqCisgKi8KK3N0YXRpYyB1aW50OF90IGNoZWNrX2ZpZm9fc2l6ZXMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXVpbnQxNl90IGRmaWZvX2FjdHVhbCA9IDA7CisJZHdjX290Z19jb3JlX3BhcmFtc190ICpwYXJhbXMgPSBjb3JlX2lmLT5jb3JlX3BhcmFtczsKKwl1aW50MTZfdCBzdGFydF9hZGRyID0gMDsKKwlpbnQgaTsKKworCWRmaWZvX2FjdHVhbCA9CisJICAgIHBhcmFtcy0+ZGV2X3J4X2ZpZm9fc2l6ZSArIHBhcmFtcy0+ZGV2X25wZXJpb190eF9maWZvX3NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29yZV9pZi0+aHdjZmc0LmIubnVtX2luX2VwczsgaSsrKSB7CisJCWRmaWZvX2FjdHVhbCArPSBwYXJhbXMtPmRldl90eF9maWZvX3NpemVbaV07CisJfQorCisJaWYgKGRmaWZvX2FjdHVhbCA+IGNvcmVfaWYtPnRvdGFsX2ZpZm9fc2l6ZSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGFyYW1zLT5kZXZfcnhfZmlmb19zaXplID4gMzI3NjggfHwgcGFyYW1zLT5kZXZfcnhfZmlmb19zaXplIDwgMTYpCisJCXJldHVybiAwOworCisJaWYgKHBhcmFtcy0+ZGV2X25wZXJpb190eF9maWZvX3NpemUgPiAzMjc2OAorCSAgICB8fCBwYXJhbXMtPmRldl9ucGVyaW9fdHhfZmlmb19zaXplIDwgMTYpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGNvcmVfaWYtPmh3Y2ZnNC5iLm51bV9pbl9lcHM7IGkrKykgeworCisJCWlmIChwYXJhbXMtPmRldl90eF9maWZvX3NpemVbaV0gPiA3NjgKKwkJICAgIHx8IHBhcmFtcy0+ZGV2X3R4X2ZpZm9fc2l6ZVtpXSA8IDQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGFyYW1zLT5kZXZfcnhfZmlmb19zaXplID4gY29yZV9pZi0+cHdyb25fcnhmc2l6KQorCQlyZXR1cm4gMDsKKwlzdGFydF9hZGRyID0gcGFyYW1zLT5kZXZfcnhfZmlmb19zaXplOworCisJaWYgKHBhcmFtcy0+ZGV2X25wZXJpb190eF9maWZvX3NpemUgPiBjb3JlX2lmLT5wd3Jvbl9nbnB0eGZzaXopCisJCXJldHVybiAwOworCXN0YXJ0X2FkZHIgKz0gcGFyYW1zLT5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5od2NmZzQuYi5udW1faW5fZXBzOyBpKyspIHsKKworCQlpZiAocGFyYW1zLT5kZXZfdHhfZmlmb19zaXplW2ldID4gY29yZV9pZi0+cHdyb25fdHhmc2l6W2ldKQorCQkJcmV0dXJuIDA7CisJCXN0YXJ0X2FkZHIgKz0gcGFyYW1zLT5kZXZfdHhfZmlmb19zaXplW2ldOworCX0KKworCXJldHVybiAxOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmVzaXplcyBEZXZpY2UgbW9kZSBGSUZPcworICogCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlcgorICoKKyAqIEByZXR1cm4gMSBpZiBzdWNjZXNzZnVsLCAwIG90aGVyd2lzZQorICoKKyAqLworc3RhdGljIHVpbnQ4X3QgcmVzaXplX2ZpZm9zKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpbnQgaSA9IDA7CisJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzID0gY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwlkd2Nfb3RnX2NvcmVfcGFyYW1zX3QgKnBhcmFtcyA9IGNvcmVfaWYtPmNvcmVfcGFyYW1zOworCXVpbnQzMl90IHJ4X2ZpZm9fc2l6ZTsKKwlmaWZvc2l6ZV9kYXRhX3QgbnB0eGZpZm9zaXplOworCWZpZm9zaXplX2RhdGFfdCB0eGZpZm9zaXplWzE1XTsKKworCXVpbnQzMl90IHJ4X2Zzel9iYWs7CisJdWludDMyX3QgbnB0eGZzel9iYWs7CisJdWludDMyX3QgdHhmc3pfYmFrWzE1XTsKKworCXVpbnQxNl90IHN0YXJ0X2FkZHJlc3M7CisJdWludDhfdCByZXR2YWwgPSAxOworCisJaWYgKCFjaGVja19maWZvX3NpemVzKGNvcmVfaWYpKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIENvbmZpZ3VyZSBkYXRhIEZJRk8gc2l6ZXMgKi8KKwlpZiAoY29yZV9pZi0+aHdjZmcyLmIuZHluYW1pY19maWZvICYmIHBhcmFtcy0+ZW5hYmxlX2R5bmFtaWNfZmlmbykgeworCQlyeF9mc3pfYmFrID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5ncnhmc2l6KTsKKwkJcnhfZmlmb19zaXplID0gcGFyYW1zLT5kZXZfcnhfZmlmb19zaXplOworCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5ncnhmc2l6LCByeF9maWZvX3NpemUpOworCisJCS8qCisJCSAqIFR4IEZJRk9zIFRoZXNlIEZJRk9zIGFyZSBudW1iZXJlZCBmcm9tIDEgdG8gMTUuCisJCSAqIEluZGV4ZXMgb2YgdGhlIEZJRk8gc2l6ZSBtb2R1bGUgcGFyYW1ldGVycyBpbiB0aGUKKwkJICogZGV2X3R4X2ZpZm9fc2l6ZSBhcnJheSBhbmQgdGhlIEZJRk8gc2l6ZSByZWdpc3RlcnMgaW4KKwkJICogdGhlIGR0eGZzaXogYXJyYXkgcnVuIGZyb20gMCB0byAxNC4KKwkJICovCisKKwkJLyogTm9uLXBlcmlvZGljIFR4IEZJRk8gKi8KKwkJbnB0eGZzel9iYWsgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeik7CisJCW5wdHhmaWZvc2l6ZS5iLmRlcHRoID0gcGFyYW1zLT5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKKwkJc3RhcnRfYWRkcmVzcyA9IDB4NDAwOworCQlucHR4Zmlmb3NpemUuYi5zdGFydGFkZHIgPSBzdGFydF9hZGRyZXNzOworCisJCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeiwgbnB0eGZpZm9zaXplLmQzMik7CisKKwkJc3RhcnRfYWRkcmVzcyArPSBucHR4Zmlmb3NpemUuYi5kZXB0aDsKKworCQlmb3IgKGkgPSAwOyBpIDwgY29yZV9pZi0+aHdjZmc0LmIubnVtX2luX2VwczsgaSsrKSB7CisJCQl0eGZzel9iYWtbaV0gPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmR0eGZzaXpbaV0pOworCisJCQl0eGZpZm9zaXplW2ldLmIuZGVwdGggPSBwYXJhbXMtPmRldl90eF9maWZvX3NpemVbaV07CisJCQl0eGZpZm9zaXplW2ldLmIuc3RhcnRhZGRyID0gc3RhcnRfYWRkcmVzczsKKwkJCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmR0eGZzaXpbaV0sCisJCQkJCXR4Zmlmb3NpemVbaV0uZDMyKTsKKworCQkJc3RhcnRfYWRkcmVzcyArPSB0eGZpZm9zaXplW2ldLmIuZGVwdGg7CisJCX0KKworCQkvKiogQ2hlY2sgaWYgcmVnaXN0ZXIgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5ICovCisJCWlmIChyeF9maWZvX3NpemUgIT0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5ncnhmc2l6KSkgeworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCWlmIChucHR4Zmlmb3NpemUuZDMyICE9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhmc2l6KSkgeworCQkJcmV0dmFsID0gMDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5od2NmZzQuYi5udW1faW5fZXBzOyBpKyspIHsKKwkJCWlmICh0eGZpZm9zaXplW2ldLmQzMiAhPQorCQkJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+ZHR4ZnNpeltpXSkpIHsKKwkJCQlyZXR2YWwgPSAwOworCQkJfQorCQl9CisKKwkJLyoqIElmIHJlZ2lzdGVyIHZhbHVlcyBhcmUgbm90IHNldCBjb3JyZWN0bHksIHJlc2V0IG9sZCB2YWx1ZXMgKi8KKwkJaWYgKHJldHZhbCA9PSAwKSB7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5ncnhmc2l6LCByeF9mc3pfYmFrKTsKKworCQkJLyogTm9uLXBlcmlvZGljIFR4IEZJRk8gKi8KKwkJCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeiwgbnB0eGZzel9iYWspOworCisJCQlmb3IgKGkgPSAwOyBpIDwgY29yZV9pZi0+aHdjZmc0LmIubnVtX2luX2VwczsgaSsrKSB7CisJCQkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+ZHR4ZnNpeltpXSwKKwkJCQkJCXR4ZnN6X2Jha1tpXSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGbHVzaCB0aGUgRklGT3MgKi8KKwlkd2Nfb3RnX2ZsdXNoX3R4X2ZpZm8oY29yZV9pZiwgMHgxMCk7CS8qIGFsbCBUeCBGSUZPcyAqLworCWR3Y19vdGdfZmx1c2hfcnhfZmlmbyhjb3JlX2lmKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGEgbmV3IHZhbHVlIGZvciB0aGUgYnVmZmVyIEFsaWdubWVudCBzZXR1cC4KKyAqLworc3RhdGljIGludCBjZmlfZXBfc2V0X3R4X2ZpZm9fdmFsKHVpbnQ4X3QgKiBidWYsIGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJaW50IHJldHZhbDsKKwl1aW50MzJfdCBmc2l6OworCXVpbnQxNl90IHNpemU7CisJdWludDE2X3QgZXBfYWRkcjsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDsKKwlkd2Nfb3RnX2NvcmVfcGFyYW1zX3QgKnBhcmFtcyA9IEdFVF9DT1JFX0lGKHBjZCktPmNvcmVfcGFyYW1zOworCXR4X2ZpZm9fc2l6ZV9zZXR1cF90ICpwdHhmaWZvdmFsOworCisJcHR4Zmlmb3ZhbCA9ICh0eF9maWZvX3NpemVfc2V0dXBfdCAqKSBidWY7CisJZXBfYWRkciA9IHB0eGZpZm92YWwtPmJFbmRwb2ludEFkZHJlc3M7CisJc2l6ZSA9IHB0eGZpZm92YWwtPndEZXB0aDsKKworCWVwID0gZ2V0X2VwX2J5X2FkZHIocGNkLCBlcF9hZGRyKTsKKworCUNGSV9JTkZPCisJICAgICgiJXM6IFNldCBUeCBGSUZPIHNpemU6IGVuZHBvaW50IGFkZHI9MHglMDJ4LCBkZXB0aD0lZCwgRklGTyBOdW09JWRcbiIsCisJICAgICBfX2Z1bmNfXywgZXBfYWRkciwgc2l6ZSwgZXAtPmR3Y19lcC50eF9maWZvX251bSk7CisKKwlpZiAoTlVMTCA9PSBlcCkgeworCQlDRklfSU5GTygiJXM6IFVuYWJsZSB0byBnZXQgdGhlIGVuZHBvaW50IGFkZHI9MHglMDJ4XG4iLAorCQkJIF9fZnVuY19fLCBlcF9hZGRyKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWZzaXogPSBwYXJhbXMtPmRldl90eF9maWZvX3NpemVbZXAtPmR3Y19lcC50eF9maWZvX251bSAtIDFdOworCXBhcmFtcy0+ZGV2X3R4X2ZpZm9fc2l6ZVtlcC0+ZHdjX2VwLnR4X2ZpZm9fbnVtIC0gMV0gPSBzaXplOworCisJaWYgKHJlc2l6ZV9maWZvcyhHRVRfQ09SRV9JRihwY2QpKSkgeworCQlyZXR2YWwgPSAwOworCX0gZWxzZSB7CisJCUNGSV9JTkZPCisJCSAgICAoIiVzOiBFcnJvciBzZXR0aW5nIHRoZSBmZWF0dXJlIFR4IEZJRk8gU2l6ZSBmb3IgRVAlZFxuIiwKKwkJICAgICBfX2Z1bmNfXywgZXBfYWRkcik7CisJCXBhcmFtcy0+ZGV2X3R4X2ZpZm9fc2l6ZVtlcC0+ZHdjX2VwLnR4X2ZpZm9fbnVtIC0gMV0gPSBmc2l6OworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyBhIG5ldyB2YWx1ZSBmb3IgdGhlIGJ1ZmZlciBBbGlnbm1lbnQgc2V0dXAuCisgKi8KK3N0YXRpYyBpbnQgY2ZpX3NldF9yeF9maWZvX3ZhbCh1aW50OF90ICogYnVmLCBkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCWludCByZXR2YWw7CisJdWludDMyX3QgZnNpejsKKwl1aW50MTZfdCBzaXplOworCWR3Y19vdGdfY29yZV9wYXJhbXNfdCAqcGFyYW1zID0gR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9wYXJhbXM7CisJcnhfZmlmb19zaXplX3NldHVwX3QgKnByeGZpZm92YWw7CisKKwlwcnhmaWZvdmFsID0gKHJ4X2ZpZm9fc2l6ZV9zZXR1cF90ICopIGJ1ZjsKKwlzaXplID0gcHJ4Zmlmb3ZhbC0+d0RlcHRoOworCisJZnNpeiA9IHBhcmFtcy0+ZGV2X3J4X2ZpZm9fc2l6ZTsKKwlwYXJhbXMtPmRldl9yeF9maWZvX3NpemUgPSBzaXplOworCisJaWYgKHJlc2l6ZV9maWZvcyhHRVRfQ09SRV9JRihwY2QpKSkgeworCQlyZXR2YWwgPSAwOworCX0gZWxzZSB7CisJCUNGSV9JTkZPKCIlczogRXJyb3Igc2V0dGluZyB0aGUgZmVhdHVyZSBSeCBGSUZPIFNpemVcbiIsCisJCQkgX19mdW5jX18pOworCQlwYXJhbXMtPmRldl9yeF9maWZvX3NpemUgPSBmc2l6OworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIFNHIG9mIGFuIEVQJ3MgYnVmZmVyIHNldHVwIGludG8gdGhlIGJ1ZmZlciBidWYKKyAqLworc3RhdGljIGludCBjZmlfZXBfZ2V0X3NnX3ZhbCh1aW50OF90ICogYnVmLCBzdHJ1Y3QgZHdjX290Z19wY2QgKnBjZCwKKwkJCSAgICAgc3RydWN0IGNmaV91c2JfY3RybHJlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJdWludDhfdCBhZGRyOworCWNmaV9lcF90ICplcDsKKworCS8qIFRoZSBMb3cgQnl0ZSBvZiB0aGUgd1ZhbHVlIGNvbnRhaW5zIGEgbm9uLXplcm8gYWRkcmVzcyBvZiB0aGUgZW5kcG9pbnQgKi8KKwlhZGRyID0gcmVxLT53VmFsdWUgJiAweEZGOworCWlmIChhZGRyID09IDApCQkvKiBUaGUgYWRkcmVzcyBzaG91bGQgYmUgbm9uLXplcm8gKi8KKwkJcmV0dXJuIHJldHZhbDsKKworCWVwID0gZ2V0X2NmaV9lcF9ieV9hZGRyKHBjZC0+Y2ZpLCBhZGRyKTsKKwlpZiAoTlVMTCA9PSBlcCkgeworCQlDRklfSU5GTygiJXM6IFVuYWJsZSB0byBnZXQgdGhlIGVuZHBvaW50IGFkZHJlc3MoMHglMDJ4KVxuIiwKKwkJCSBfX2Z1bmNfXywgYWRkcik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJZHdjX21lbWNweShidWYsIGVwLT5ibV9zZywgQlNfU0dfVkFMX0RFU0NfTEVOKTsKKwlyZXR2YWwgPSBCU19TR19WQUxfREVTQ19MRU47CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBDb25jYXRlbmF0aW9uIHZhbHVlIG9mIGFuIEVQJ3MgYnVmZmVyIG1vZGUgaW50byAKKyAqIHRoZSBidWZmZXIgYnVmCisgKi8KK3N0YXRpYyBpbnQgY2ZpX2VwX2dldF9jb25jYXRfdmFsKHVpbnQ4X3QgKiBidWYsIHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkLAorCQkJCSBzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCAqcmVxKQoreworCWludCByZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl1aW50OF90IGFkZHI7CisJY2ZpX2VwX3QgKmVwOworCXVpbnQ4X3QgZGVzY19jb3VudDsKKworCS8qIFRoZSBMb3cgQnl0ZSBvZiB0aGUgd1ZhbHVlIGNvbnRhaW5zIGEgbm9uLXplcm8gYWRkcmVzcyBvZiB0aGUgZW5kcG9pbnQgKi8KKwlhZGRyID0gcmVxLT53VmFsdWUgJiAweEZGOworCWlmIChhZGRyID09IDApCQkvKiBUaGUgYWRkcmVzcyBzaG91bGQgYmUgbm9uLXplcm8gKi8KKwkJcmV0dXJuIHJldHZhbDsKKworCWVwID0gZ2V0X2NmaV9lcF9ieV9hZGRyKHBjZC0+Y2ZpLCBhZGRyKTsKKwlpZiAoTlVMTCA9PSBlcCkgeworCQlDRklfSU5GTygiJXM6IFVuYWJsZSB0byBnZXQgdGhlIGVuZHBvaW50IGFkZHJlc3MoMHglMDJ4KVxuIiwKKwkJCSBfX2Z1bmNfXywgYWRkcik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLyogQ29weSB0aGUgaGVhZGVyIHRvIHRoZSBidWZmZXIgKi8KKwlkd2NfbWVtY3B5KGJ1ZiwgZXAtPmJtX2NvbmNhdCwgQlNfQ09OQ0FUX1ZBTF9IRFJfTEVOKTsKKwkvKiBBZHZhbmNlIHRoZSBidWZmZXIgcG9pbnRlciBieSB0aGUgaGVhZGVyIHNpemUgKi8KKwlidWYgKz0gQlNfQ09OQ0FUX1ZBTF9IRFJfTEVOOworCisJZGVzY19jb3VudCA9IGVwLT5ibV9jb25jYXQtPmhkci5iRGVzY0NvdW50OworCS8qIENvcHkgYWxsbCB0aGUgd1R4Qnl0ZXMgdG8gdGhlIGJ1ZmZlciAqLworCWR3Y19tZW1jcHkoYnVmLCBlcC0+Ym1fY29uY2F0LT53VHhCeXRlcywgc2l6ZW9mKHVpZDE2X3QpICogZGVzY19jb3VudCk7CisKKwlyZXR2YWwgPSBCU19DT05DQVRfVkFMX0hEUl9MRU4gKyBzaXplb2YodWlkMTZfdCkgKiBkZXNjX2NvdW50OworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgYnVmZmVyIEFsaWdubWVudCB2YWx1ZSBvZiBhbiBFUCdzIGJ1ZmZlciBtb2RlIGludG8gCisgKiB0aGUgYnVmZmVyIGJ1ZgorICoKKyAqIEByZXR1cm4gVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGJ1ZmZlciBvciBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IGNmaV9lcF9nZXRfYWxpZ25fdmFsKHVpbnQ4X3QgKiBidWYsIHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkLAorCQkJCXN0cnVjdCBjZmlfdXNiX2N0cmxyZXF1ZXN0ICpyZXEpCit7CisJaW50IHJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCXVpbnQ4X3QgYWRkcjsKKwljZmlfZXBfdCAqZXA7CisKKwkvKiBUaGUgTG93IEJ5dGUgb2YgdGhlIHdWYWx1ZSBjb250YWlucyBhIG5vbi16ZXJvIGFkZHJlc3Mgb2YgdGhlIGVuZHBvaW50ICovCisJYWRkciA9IHJlcS0+d1ZhbHVlICYgMHhGRjsKKwlpZiAoYWRkciA9PSAwKQkJLyogVGhlIGFkZHJlc3Mgc2hvdWxkIGJlIG5vbi16ZXJvICovCisJCXJldHVybiByZXR2YWw7CisKKwllcCA9IGdldF9jZmlfZXBfYnlfYWRkcihwY2QtPmNmaSwgYWRkcik7CisJaWYgKE5VTEwgPT0gZXApIHsKKwkJQ0ZJX0lORk8oIiVzOiBVbmFibGUgdG8gZ2V0IHRoZSBlbmRwb2ludCBhZGRyZXNzKDB4JTAyeClcbiIsCisJCQkgX19mdW5jX18sIGFkZHIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWR3Y19tZW1jcHkoYnVmLCBlcC0+Ym1fYWxpZ24sIEJTX0FMSUdOX1ZBTF9IRFJfTEVOKTsKKwlyZXR2YWwgPSBCU19BTElHTl9WQUxfSERSX0xFTjsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGEgbmV3IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIGZlYXR1cmUKKyAqIAorICogQHBhcmFtCXBjZAlBIHBvaW50ZXIgdG8gdGhlIFBDRCBvYmplY3QKKyAqIAorICogQHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlIHRvIHN0YWxsIHRoZSBEQ0UuCisgKi8KK3N0YXRpYyBpbnQgY2ZpX3NldF9mZWF0dXJlX3ZhbHVlKHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkKQoreworCWludCByZXR2YWwgPSAtRFdDX0VfTk9UX1NVUFBPUlRFRDsKKwl1aW50MTZfdCB3SW5kZXgsIHdWYWx1ZTsKKwl1aW50OF90IGJSZXF1ZXN0OworCXN0cnVjdCBkd2Nfb3RnX2NvcmVfaWYgKmNvcmVpZjsKKwljZmlvYmplY3RfdCAqY2ZpID0gcGNkLT5jZmk7CisJc3RydWN0IGNmaV91c2JfY3RybHJlcXVlc3QgKmN0cmxfcmVxOworCXVpbnQ4X3QgKmJ1ZjsKKwljdHJsX3JlcSA9ICZjZmktPmN0cmxfcmVxOworCisJYnVmID0gcGNkLT5jZmktPmN0cmxfcmVxLmRhdGE7CisKKwljb3JlaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCWJSZXF1ZXN0ID0gY3RybF9yZXEtPmJSZXF1ZXN0OworCXdJbmRleCA9IERXQ19DT05TVEFOVF9DUFVfVE9fTEUxNihjdHJsX3JlcS0+d0luZGV4KTsKKwl3VmFsdWUgPSBEV0NfQ09OU1RBTlRfQ1BVX1RPX0xFMTYoY3RybF9yZXEtPndWYWx1ZSk7CisKKwkvKiBTZWUgd2hpY2ggZmVhdHVyZSBpcyB0byBiZSBtb2RpZmllZCAqLworCXN3aXRjaCAod0luZGV4KSB7CisJY2FzZSBGVF9JRF9ETUFfQlVGRkVSX1NFVFVQOgorCQkvKiBNb2RpZnkgdGhlIGZlYXR1cmUgKi8KKwkJaWYgKChyZXR2YWwgPSBjZmlfZXBfc2V0X3NnX3ZhbChidWYsIHBjZCkpIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisKKwkJLyogQW5kIHNlbmQgdGhpcyByZXF1ZXN0IHRvIHRoZSBnYWRnZXQgKi8KKwkJY2ZpLT5uZWVkX2dhZGdldF9hdHQgPSAxOworCQlicmVhazsKKworCWNhc2UgRlRfSURfRE1BX0JVRkZfQUxJR046CisJCWlmICgocmV0dmFsID0gY2ZpX2VwX3NldF9hbGlnbm1lbnRfdmFsKGJ1ZiwgcGNkKSkgPCAwKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJY2ZpLT5uZWVkX2dhZGdldF9hdHQgPSAxOworCQlicmVhazsKKworCWNhc2UgRlRfSURfRE1BX0NPTkNBVF9TRVRVUDoKKwkJLyogTW9kaWZ5IHRoZSBmZWF0dXJlICovCisJCWlmICgocmV0dmFsID0gY2ZpX2VwX3NldF9jb25jYXRfdmFsKGJ1ZiwgcGNkKSkgPCAwKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJY2ZpLT5uZWVkX2dhZGdldF9hdHQgPSAxOworCQlicmVhazsKKworCWNhc2UgRlRfSURfRE1BX0NJUkNVTEFSOgorCQlDRklfSU5GTygiRlRfSURfRE1BX0NJUkNVTEFSXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIEZUX0lEX1RIUkVTSE9MRF9TRVRVUDoKKwkJQ0ZJX0lORk8oIkZUX0lEX1RIUkVTSE9MRF9TRVRVUFxuIik7CisJCWJyZWFrOworCisJY2FzZSBGVF9JRF9ERklGT19ERVBUSDoKKwkJQ0ZJX0lORk8oIkZUX0lEX0RGSUZPX0RFUFRIXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIEZUX0lEX1RYX0ZJRk9fREVQVEg6CisJCUNGSV9JTkZPKCJGVF9JRF9UWF9GSUZPX0RFUFRIXG4iKTsKKwkJaWYgKChyZXR2YWwgPSBjZmlfZXBfc2V0X3R4X2ZpZm9fdmFsKGJ1ZiwgcGNkKSkgPCAwKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJY2ZpLT5uZWVkX2dhZGdldF9hdHQgPSAwOworCQlicmVhazsKKworCWNhc2UgRlRfSURfUlhfRklGT19ERVBUSDoKKwkJQ0ZJX0lORk8oIkZUX0lEX1JYX0ZJRk9fREVQVEhcbiIpOworCQlpZiAoKHJldHZhbCA9IGNmaV9zZXRfcnhfZmlmb192YWwoYnVmLCBwY2QpKSA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQljZmktPm5lZWRfZ2FkZ2V0X2F0dCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvL0RXQ19VVEVfQ0ZJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY2ZpLmggYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY2ZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjY2RhYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19jZmkuaApAQCAtMCwwICsxLDMyMCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZiAhZGVmaW5lZChfX0RXQ19PVEdfQ0ZJX0hfXykKKyNkZWZpbmUgX19EV0NfT1RHX0NGSV9IX18KKworI2luY2x1ZGUgImR3Y19vdGdfcGNkLmgiCisjaW5jbHVkZSAiZHdjX2NmaV9jb21tb24uaCIKKworLyoqCisgKiBAZmlsZQorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBDRkkgcmVsYXRlZCBPVEcgUENEIHNwZWNpZmljIGNvbW1vbiBjb25zdGFudHMsIAorICogaW50ZXJmYWNlcyhmdW5jdGlvbnMgYW5kIG1hY3JvcykgYW5kIGRhdGEgc3RydWN0dXJlcy5UaGUgQ0ZJIFByb3RvY29sIGlzIGFuIAorICogb3B0aW9uYWwgaW50ZXJmYWNlIGZvciBpbnRlcm5hbCB0ZXN0aW5nIHB1cnBvc2VzIHRoYXQgYSBEVVQgbWF5IGltcGxlbWVudCB0byAKKyAqIHN1cHBvcnQgdGVzdGluZyBvZiBjb25maWd1cmFibGUgZmVhdHVyZXMuCisgKgorICovCisKK3N0cnVjdCBkd2Nfb3RnX3BjZDsKK3N0cnVjdCBkd2Nfb3RnX3BjZF9lcDsKKworLyoqIE9URyBDRkkgRmVhdHVyZXMgKHByb3BlcnRpZXMpIElEIGNvbnN0YW50cyAqLworLyoqIFRoaXMgaXMgYSByZXF1ZXN0IGZvciBhbGwgQ29yZSBGZWF0dXJlcyAqLworI2RlZmluZSBGVF9JRF9ETUFfTU9ERQkJCQkJMHgwMDAxCisjZGVmaW5lIEZUX0lEX0RNQV9CVUZGRVJfU0VUVVAJCQkweDAwMDIKKyNkZWZpbmUgRlRfSURfRE1BX0JVRkZfQUxJR04JCQkweDAwMDMKKyNkZWZpbmUgRlRfSURfRE1BX0NPTkNBVF9TRVRVUAkJCTB4MDAwNAorI2RlZmluZSBGVF9JRF9ETUFfQ0lSQ1VMQVIJCQkJMHgwMDA1CisjZGVmaW5lIEZUX0lEX1RIUkVTSE9MRF9TRVRVUAkJCTB4MDAwNgorI2RlZmluZSBGVF9JRF9ERklGT19ERVBUSAkJCQkweDAwMDcKKyNkZWZpbmUgRlRfSURfVFhfRklGT19ERVBUSAkJCQkweDAwMDgKKyNkZWZpbmUgRlRfSURfUlhfRklGT19ERVBUSAkJCQkweDAwMDkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIENGSV9JTkZPX0RFRgorCisjaWZkZWYgQ0ZJX0lORk9fREVGCisjZGVmaW5lIENGSV9JTkZPKGZtdC4uLikJRFdDX1BSSU5URigiQ0ZJOiAiIGZtdCk7CisjZWxzZQorI2RlZmluZSBDRklfSU5GTyhmbXQuLi4pCisjZW5kaWYKKworI2RlZmluZSBtaW4oeCx5KSAoeyBcCisJeCA8IHkgPyB4IDogeTsgfSkKKworI2RlZmluZSBtYXgoeCx5KSAoeyBcCisJeCA+IHkgPyB4IDogeTsgfSkKKworLyoqCisgKiBEZXNjcmlwdG9yIERNQSBTRyBCdWZmZXIgc2V0dXAgc3RydWN0dXJlIChTRyBidWZmZXIpLiBUaGlzIHN0cnVjdHVyZSBpcworICogYWxzbyB1c2VkIGZvciBzZXR0aW5nIHVwIGEgYnVmZmVyIGZvciBDaXJjdWxhciBERE1BLgorICovCitzdHJ1Y3QgX2RkbWFfc2dfYnVmZmVyX3NldHVwIHsKKyNkZWZpbmUgQlNfU0dfVkFMX0RFU0NfTEVOCTYKKwkvKiBUaGUgT1VUIEVQIGFkZHJlc3MgKi8KKwl1aW50OF90IGJPdXRFbmRwb2ludEFkZHJlc3M7CisJLyogVGhlIElOIEVQIGFkZHJlc3MgKi8KKwl1aW50OF90IGJJbkVuZHBvaW50QWRkcmVzczsKKwkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcHV0IGJldHdlZW4gdHJhbnNmZXIgc2VnbWVudHMgKG11c3QgYmUgRFdPUkQgYm91bmRhcmllcykgKi8KKwl1aW50OF90IGJPZmZzZXQ7CisJLyogVGhlIG51bWJlciBvZiB0cmFuc2ZlciBzZWdtZW50cyAoYSBETUEgZGVzY3JpcHRvcnMgcGVyIGVhY2ggc2VnbWVudCkgKi8KKwl1aW50OF90IGJDb3VudDsKKwkvKiBTaXplIChpbiBieXRlKSBvZiBlYWNoIHRyYW5zZmVyIHNlZ21lbnQgKi8KKwl1aW50MTZfdCB3U2l6ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwordHlwZWRlZiBzdHJ1Y3QgX2RkbWFfc2dfYnVmZmVyX3NldHVwIGRkbWFfc2dfYnVmZmVyX3NldHVwX3Q7CisKKy8qKiBEZXNjcmlwdG9yIERNQSBDb25jYXRlbmF0aW9uIEJ1ZmZlciBzZXR1cCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBfZGRtYV9jb25jYXRfYnVmZmVyX3NldHVwX2hkciB7CisjZGVmaW5lIEJTX0NPTkNBVF9WQUxfSERSX0xFTgk0CisJLyogVGhlIGVuZHBvaW50IGZvciB3aGljaCB0aGUgYnVmZmVyIGlzIHRvIGJlIHNldCB1cCAqLworCXVpbnQ4X3QgYkVuZHBvaW50QWRkcmVzczsKKwkvKiBUaGUgY291bnQgb2YgZGVzY3JpcHRvcnMgdG8gYmUgdXNlZCAqLworCXVpbnQ4X3QgYkRlc2NDb3VudDsKKwkvKiBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgdHJhbnNmZXIgKi8KKwl1aW50MTZfdCB3U2l6ZTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwordHlwZWRlZiBzdHJ1Y3QgX2RkbWFfY29uY2F0X2J1ZmZlcl9zZXR1cF9oZHIgZGRtYV9jb25jYXRfYnVmZmVyX3NldHVwX2hkcl90OworCisvKiogRGVzY3JpcHRvciBETUEgQ29uY2F0ZW5hdGlvbiBCdWZmZXIgc2V0dXAgc3RydWN0dXJlICovCitzdHJ1Y3QgX2RkbWFfY29uY2F0X2J1ZmZlcl9zZXR1cCB7CisJLyogVGhlIFNHIGhlYWRlciAqLworCWRkbWFfY29uY2F0X2J1ZmZlcl9zZXR1cF9oZHJfdCBoZHI7CisKKwkvKiBUaGUgWEZFUiBzaXplcyBwb2ludGVyIChhbGxvY2F0ZWQgZHluYW1pY2FsbHkpICovCisJdWludDE2X3QgKndUeEJ5dGVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit0eXBlZGVmIHN0cnVjdCBfZGRtYV9jb25jYXRfYnVmZmVyX3NldHVwIGRkbWFfY29uY2F0X2J1ZmZlcl9zZXR1cF90OworCisvKiogRGVzY3JpcHRvciBETUEgQWxpZ25tZW50IEJ1ZmZlciBzZXR1cCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBfZGRtYV9hbGlnbl9idWZmZXJfc2V0dXAgeworI2RlZmluZSBCU19BTElHTl9WQUxfSERSX0xFTgkyCisJdWludDhfdCBiRW5kcG9pbnRBZGRyZXNzOworCXVpbnQ4X3QgYkFsaWduOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit0eXBlZGVmIHN0cnVjdCBfZGRtYV9hbGlnbl9idWZmZXJfc2V0dXAgZGRtYV9hbGlnbl9idWZmZXJfc2V0dXBfdDsKKworLyoqIFRyYW5zbWl0IEZJRk8gU2l6ZSBzZXR1cCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBfdHhfZmlmb19zaXplX3NldHVwIHsKKwl1aW50OF90IGJFbmRwb2ludEFkZHJlc3M7CisJdWludDE2X3Qgd0RlcHRoOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit0eXBlZGVmIHN0cnVjdCBfdHhfZmlmb19zaXplX3NldHVwIHR4X2ZpZm9fc2l6ZV9zZXR1cF90OworCisvKiogVHJhbnNtaXQgRklGTyBTaXplIHNldHVwIHN0cnVjdHVyZSAqLworc3RydWN0IF9yeF9maWZvX3NpemVfc2V0dXAgeworCXVpbnQxNl90IHdEZXB0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwordHlwZWRlZiBzdHJ1Y3QgX3J4X2ZpZm9fc2l6ZV9zZXR1cCByeF9maWZvX3NpemVfc2V0dXBfdDsKKworLyoqCisgKiBzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCAtIHRoZSBDRkkgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QKKyAqIFRoaXMgc3RydWN0dXJlIGVuY2Fwc3VsYXRlcyB0aGUgc3RhbmRhcmQgdXNiX2N0cmxyZXF1ZXN0IGFuZCBhZGRzIGEgcG9pbnRlcgorICogdG8gdGhlIGRhdGEgcmV0dXJuZWQgaW4gdGhlIGRhdGEgc3RhZ2Ugb2YgYSAzLXN0YWdlIENvbnRyb2wgV3JpdGUgcmVxdWVzdHMuCisgKi8KK3N0cnVjdCBjZmlfdXNiX2N0cmxyZXF1ZXN0IHsKKwl1aW50OF90IGJSZXF1ZXN0VHlwZTsKKwl1aW50OF90IGJSZXF1ZXN0OworCXVpbnQxNl90IHdWYWx1ZTsKKwl1aW50MTZfdCB3SW5kZXg7CisJdWludDE2X3Qgd0xlbmd0aDsKKwl1aW50OF90ICpkYXRhOworfSBVUEFDS0VEOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qKgorICogVGhlIENGSSB3cmFwcGVyIG9mIHRoZSBlbmFibGVkIGFuZCBhY3RpdmF0ZWQgZHdjX290Z19wY2RfZXAgc3RydWN0dXJlcy4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGJ1ZmZlciBzZXR1cCBkYXRhIGZvciBhbnkKKyAqIGVuYWJsZWQgZW5kcG9pbnQgaW4gdGhlIFBDRC4KKyAqLworc3RydWN0IGNmaV9lcCB7CisJLyogRW50cnkgZm9yIHRoZSBsaXN0IGNvbnRhaW5lciAqLworCWR3Y19saXN0X2xpbmtfdCBsaDsKKwkvKiBQb2ludGVyIHRvIHRoZSBhY3RpdmUgUENEIGVuZHBvaW50IHN0cnVjdHVyZSAqLworCXN0cnVjdCBkd2Nfb3RnX3BjZF9lcCAqZXA7CisJLyogVGhlIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgY2hhaW4gb2YgRE1BIGRlc2NyaXB0b3JzIG9mIHRoZSBlbmRwb2ludCAqLworCXN0cnVjdCBkd2Nfb3RnX2RtYV9kZXNjICpkbWFfZGVzY19sYXN0OworCS8qIFRoZSBTRyBmZWF0dXJlIHZhbHVlICovCisJZGRtYV9zZ19idWZmZXJfc2V0dXBfdCAqYm1fc2c7CisJLyogVGhlIENpcmN1bGFyIGZlYXR1cmUgdmFsdWUgKi8KKwlkZG1hX3NnX2J1ZmZlcl9zZXR1cF90ICpibV9jaXJjOworCS8qIFRoZSBDb25jYXRlbmF0aW9uIGZlYXR1cmUgdmFsdWUgKi8KKwlkZG1hX2NvbmNhdF9idWZmZXJfc2V0dXBfdCAqYm1fY29uY2F0OworCS8qIFRoZSBBbGlnbm1lbnQgZmVhdHVyZSB2YWx1ZSAqLworCWRkbWFfYWxpZ25fYnVmZmVyX3NldHVwX3QgKmJtX2FsaWduOworCS8qIFhGRVIgbGVuZ3RoICovCisJdWludDMyX3QgeGZlcl9sZW47CisJLyoKKwkgKiBDb3VudCBvZiBETUEgZGVzY3JpcHRvcnMgY3VycmVudGx5IHVzZWQuCisJICogVGhlIHRvdGFsIHNob3VsZCBub3QgZXhjZWVkIHRoZSBNQVhfRE1BX0RFU0NTX1BFUl9FUCB2YWx1ZQorCSAqIGRlZmluZWQgaW4gdGhlIGR3Y19vdGdfY2lsLmgKKwkgKi8KKwl1aW50MzJfdCBkZXNjX2NvdW50OworfTsKK3R5cGVkZWYgc3RydWN0IGNmaV9lcCBjZmlfZXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2ZpX2RtYV9idWZmIHsKKyNkZWZpbmUgQ0ZJX0lOX0JVRl9MRU4JMTAyNAorI2RlZmluZSBDRklfT1VUX0JVRl9MRU4JMTAyNAorCWRtYV9hZGRyX3QgYWRkcjsKKwl1aW50OF90ICpidWY7Cit9IGNmaV9kbWFfYnVmZl90OworCitzdHJ1Y3QgY2Zpb2JqZWN0OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIENGSSBvcGVyYXRpb25zLgorICoKKyAqIEBwYXJhbQllcF9lbmFibGUJCQlDYWxsZWQgd2hlbiBhbnkgZW5kcG9pbnQgaXMgZW5hYmxlZCBhbmQgYWN0aXZhdGVkLgorICogQHBhcmFtCXJlbGVhc2UJCQkJQ2FsbGVkIHdoZW4gdGhlIENGSSBvYmplY3QgaXMgcmVsZWFzZWQgYW5kIGl0IG5lZWRzIHRvIGNvcnJlY3RseQorICoJCQkJCQkJCWRlYWxsb2NhdGUgdGhlIGR5bmFtaWMgbWVtb3J5CisgKiBAcGFyYW0JY3RybF93cml0ZV9jb21wbGV0ZQlDYWxsZWQgd2hlbiB0aGUgZGF0YSBzdGFnZSBvZiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZQorICovCit0eXBlZGVmIHN0cnVjdCBjZmlfb3BzIHsKKwlpbnQgKCplcF9lbmFibGUpIChzdHJ1Y3QgY2Zpb2JqZWN0ICogY2ZpLCBzdHJ1Y3QgZHdjX290Z19wY2QgKiBwY2QsCisJCQkgIHN0cnVjdCBkd2Nfb3RnX3BjZF9lcCAqIGVwKTsKKwl2b2lkICooKmVwX2FsbG9jX2J1ZikgKHN0cnVjdCBjZmlvYmplY3QgKiBjZmksIHN0cnVjdCBkd2Nfb3RnX3BjZCAqIHBjZCwKKwkJCSAgICAgICBzdHJ1Y3QgZHdjX290Z19wY2RfZXAgKiBlcCwgZG1hX2FkZHJfdCAqIGRtYSwKKwkJCSAgICAgICB1bnNpZ25lZCBzaXplLCBnZnBfdCBmbGFncyk7CisJdm9pZCAoKnJlbGVhc2UpIChzdHJ1Y3QgY2Zpb2JqZWN0ICogY2ZpKTsKKwlpbnQgKCpjdHJsX3dyaXRlX2NvbXBsZXRlKSAoc3RydWN0IGNmaW9iamVjdCAqIGNmaSwKKwkJCQkgICAgc3RydWN0IGR3Y19vdGdfcGNkICogcGNkKTsKKwl2b2lkICgqYnVpbGRfZGVzY3JpcHRvcnMpIChzdHJ1Y3QgY2Zpb2JqZWN0ICogY2ZpLAorCQkJCSAgIHN0cnVjdCBkd2Nfb3RnX3BjZCAqIHBjZCwKKwkJCQkgICBzdHJ1Y3QgZHdjX290Z19wY2RfZXAgKiBlcCwKKwkJCQkgICBkd2Nfb3RnX3BjZF9yZXF1ZXN0X3QgKiByZXEpOworfSBjZmlfb3BzX3Q7CisKK3N0cnVjdCBjZmlvYmplY3QgeworCWNmaV9vcHNfdCBvcHM7CisJc3RydWN0IGR3Y19vdGdfcGNkICpwY2Q7CisJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldDsKKworCS8qIEJ1ZmZlcnMgdXNlZCB0byBzZW5kL3JlY2VpdmUgQ0ZJLXJlbGF0ZWQgcmVxdWVzdCBkYXRhICovCisJY2ZpX2RtYV9idWZmX3QgYnVmX2luOworCWNmaV9kbWFfYnVmZl90IGJ1Zl9vdXQ7CisKKwkvKiBDRkkgc3BlY2lmaWMgQ29udHJvbCByZXF1ZXN0IHdyYXBwZXIgKi8KKwlzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCBjdHJsX3JlcTsKKworCS8qIFRoZSBsaXN0IG9mIGFjdGl2ZSBFUCdzIGluIHRoZSBQQ0Qgb2YgdHlwZSBjZmlfZXBfdCAqLworCWR3Y19saXN0X2xpbmtfdCBhY3RpdmVfZXBzOworCisJLyogVGhpcyBmbGFnIHNoYWxsIGNvbnRyb2wgdGhlIHByb3BhZ2F0aW9uIG9mIGEgc3BlY2lmaWMgcmVxdWVzdAorCSAqIHRvIHRoZSBnYWRnZXQncyBwcm9jZXNzaW5nIHJvdXRpbmVzLgorCSAqIDAgLSBubyBnYWRnZXQgaGFuZGxpbmcKKwkgKiAxIC0gdGhlIGdhZGdldCBuZWVkcyB0byBrbm93IGFib3V0IHRoaXMgcmVxdWVzdCAody9vIGNvbXBsZXRpbmcgYSBzdGF0dXMKKwkgKiBwaGFzZSAtIGp1c3QgcmV0dXJuIGEgMCB0byB0aGUgX3NldHVwIGNhbGxiYWNrKQorCSAqLworCXVpbnQ4X3QgbmVlZF9nYWRnZXRfYXR0OworCisJLyogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHN0YXR1cyBJTiBwaGFzZSBuZWVkcyB0byBiZQorCSAqIGNvbXBsZXRlZCBieSB0aGUgUENECisJICovCisJdWludDhfdCBuZWVkX3N0YXR1c19pbl9jb21wbGV0ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBjZmlvYmplY3QgY2Zpb2JqZWN0X3Q7CisKKyNkZWZpbmUgRFVNUF9NU0cKKworI2lmIGRlZmluZWQoRFVNUF9NU0cpCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9tc2coY29uc3QgdTggKiBidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJdW5zaWduZWQgaW50IHN0YXJ0LCBudW0sIGk7CisJY2hhciBsaW5lWzUyXSwgKnA7CisKKwlpZiAobGVuZ3RoID49IDUxMikKKwkJcmV0dXJuOworCisJc3RhcnQgPSAwOworCXdoaWxlIChsZW5ndGggPiAwKSB7CisJCW51bSA9IG1pbihsZW5ndGgsIDE2dSk7CisJCXAgPSBsaW5lOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKwkJCWlmIChpID09IDgpCisJCQkJKnArKyA9ICcgJzsKKwkJCURXQ19TUFJJTlRGKHAsICIgJTAyeCIsIGJ1ZltpXSk7CisJCQlwICs9IDM7CisJCX0KKwkJKnAgPSAwOworCQlEV0NfREVCVUcoIiU2eDogJXNcbiIsIHN0YXJ0LCBsaW5lKTsKKwkJYnVmICs9IG51bTsKKwkJc3RhcnQgKz0gbnVtOworCQlsZW5ndGggLT0gbnVtOworCX0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9tc2coY29uc3QgdTggKiBidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7Cit9CisjZW5kaWYKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGNmaV9lcF90IG9iamVjdCB3aXRoIHRoZSBhZGRyIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNmaV9lcCAqZ2V0X2NmaV9lcF9ieV9hZGRyKHN0cnVjdCBjZmlvYmplY3QgKmNmaSwKKwkJCQkJCXVpbnQ4X3QgYWRkcikKK3sKKwlzdHJ1Y3QgY2ZpX2VwICpwY2ZpZXA7CisJZHdjX2xpc3RfbGlua190ICp0bXA7CisKKwlEV0NfTElTVF9GT1JFQUNIKHRtcCwgJmNmaS0+YWN0aXZlX2VwcykgeworCQlwY2ZpZXAgPSBEV0NfTElTVF9FTlRSWSh0bXAsIHN0cnVjdCBjZmlfZXAsIGxoKTsKKworCQlpZiAocGNmaWVwLT5lcC0+ZGVzYy0+YkVuZHBvaW50QWRkcmVzcyA9PSBhZGRyKSB7CisJCQlyZXR1cm4gcGNmaWVwOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBjZmlfZXBfdCBvYmplY3QgdGhhdCBtYXRjaGVzCisgKiB0aGUgZHdjX290Z19wY2RfZXAgb2JqZWN0LgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjZmlfZXAgKmdldF9jZmlfZXBfYnlfcGNkX2VwKHN0cnVjdCBjZmlvYmplY3QgKmNmaSwKKwkJCQkJCSAgc3RydWN0IGR3Y19vdGdfcGNkX2VwICplcCkKK3sKKwlzdHJ1Y3QgY2ZpX2VwICpwY2ZpZXAgPSBOVUxMOworCWR3Y19saXN0X2xpbmtfdCAqdG1wOworCisJRFdDX0xJU1RfRk9SRUFDSCh0bXAsICZjZmktPmFjdGl2ZV9lcHMpIHsKKwkJcGNmaWVwID0gRFdDX0xJU1RfRU5UUlkodG1wLCBzdHJ1Y3QgY2ZpX2VwLCBsaCk7CisJCWlmIChwY2ZpZXAtPmVwID09IGVwKSB7CisJCQlyZXR1cm4gcGNmaWVwOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitpbnQgY2ZpX3NldHVwKHN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkLCBzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCAqY3RybCk7CisKKyNlbmRpZiAvKiAoX19EV0NfT1RHX0NGSV9IX18pICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY2lsLmMgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY2lsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmMTE3OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19jaWwuYwpAQCAtMCwwICsxLDcwNDkgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAkRmlsZTogLy9kd2gvdXNiX2lpcC9kZXYvc29mdHdhcmUvb3RnL2xpbnV4L2RyaXZlcnMvZHdjX290Z19jaWwuYyAkCisgKiAkUmV2aXNpb246ICMxODkgJAorICogJERhdGU6IDIwMTEvMTAvMjQgJAorICogJENoYW5nZTogMTg3MTE2MCAkCisgKgorICogU3lub3BzeXMgSFMgT1RHIExpbnV4IFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbiAoaGVyZWluYWZ0ZXIsCisgKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcworICogb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgKgorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKKyAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gdXNlIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgKiBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwgZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IKKyAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQorICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgKiBiZWxvdywgdGhlbiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIiBCQVNJUworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqIEBmaWxlCisgKgorICogVGhlIENvcmUgSW50ZXJmYWNlIExheWVyIHByb3ZpZGVzIGJhc2ljIHNlcnZpY2VzIGZvciBhY2Nlc3NpbmcgYW5kCisgKiBtYW5hZ2luZyB0aGUgRFdDX290ZyBoYXJkd2FyZS4gVGhlc2Ugc2VydmljZXMgYXJlIHVzZWQgYnkgYm90aCB0aGUKKyAqIEhvc3QgQ29udHJvbGxlciBEcml2ZXIgYW5kIHRoZSBQZXJpcGhlcmFsIENvbnRyb2xsZXIgRHJpdmVyLgorICoKKyAqIFRoZSBDSUwgbWFuYWdlcyB0aGUgbWVtb3J5IG1hcCBmb3IgdGhlIGNvcmUgc28gdGhhdCB0aGUgSENEIGFuZCBQQ0QKKyAqIGRvbid0IGhhdmUgdG8gZG8gdGhpcyBzZXBhcmF0ZWx5LiBJdCBhbHNvIGhhbmRsZXMgYmFzaWMgdGFza3MgbGlrZQorICogcmVhZGluZy93cml0aW5nIHRoZSByZWdpc3RlcnMgYW5kIGRhdGEgRklGT3MgaW4gdGhlIGNvbnRyb2xsZXIuCisgKiBTb21lIG9mIHRoZSBkYXRhIGFjY2VzcyBmdW5jdGlvbnMgcHJvdmlkZSBlbmNhcHN1bGF0aW9uIG9mIHNldmVyYWwKKyAqIG9wZXJhdGlvbnMgcmVxdWlyZWQgdG8gcGVyZm9ybSBhIHRhc2ssIHN1Y2ggYXMgd3JpdGluZyBtdWx0aXBsZQorICogcmVnaXN0ZXJzIHRvIHN0YXJ0IGEgdHJhbnNmZXIuIEZpbmFsbHksIHRoZSBDSUwgcGVyZm9ybXMgYmFzaWMKKyAqIHNlcnZpY2VzIHRoYXQgYXJlIG5vdCBzcGVjaWZpYyB0byBlaXRoZXIgdGhlIGhvc3Qgb3IgZGV2aWNlIG1vZGVzCisgKiBvZiBvcGVyYXRpb24uIFRoZXNlIHNlcnZpY2VzIGluY2x1ZGUgbWFuYWdlbWVudCBvZiB0aGUgT1RHIEhvc3QKKyAqIE5lZ290aWF0aW9uIFByb3RvY29sIChITlApIGFuZCBTZXNzaW9uIFJlcXVlc3QgUHJvdG9jb2wgKFNSUCkuIEEKKyAqIERpYWdub3N0aWMgQVBJIGlzIGFsc28gcHJvdmlkZWQgdG8gYWxsb3cgdGVzdGluZyBvZiB0aGUgY29udHJvbGxlcgorICogaGFyZHdhcmUuCisgKgorICogVGhlIENvcmUgSW50ZXJmYWNlIExheWVyIGhhcyB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoKKyAqIC0gUHJvdmlkZXMgYmFzaWMgY29udHJvbGxlciBvcGVyYXRpb25zLgorICogLSBNaW5pbWFsIHVzZSBvZiBPUyBzZXJ2aWNlcy4KKyAqIC0gVGhlIE9TIHNlcnZpY2VzIHVzZWQgd2lsbCBiZSBhYnN0cmFjdGVkIGJ5IHVzaW5nIGlubGluZSBmdW5jdGlvbnMKKyAqCSBvciBtYWNyb3MuCisgKgorICovCisKKyNpbmNsdWRlICJkd2Nfb3MuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX3JlZ3MuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2NpbC5oIgorCitzdGF0aWMgaW50IGR3Y19vdGdfc2V0dXBfcGFyYW1zKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgRFdDX290ZyBDU1IgZGF0YQorICogc3RydWN0dXJlcy4gVGhlIHJlZ2lzdGVyIGFkZHJlc3NlcyBpbiB0aGUgZGV2aWNlIGFuZCBob3N0CisgKiBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZCBmcm9tIHRoZSBiYXNlIGFkZHJlc3Mgc3VwcGxpZWQgYnkgdGhlCisgKiBjYWxsZXIuIFRoZSBjYWxsaW5nIGZ1bmN0aW9uIG11c3QgbWFrZSB0aGUgT1MgY2FsbHMgdG8gZ2V0IHRoZQorICogYmFzZSBhZGRyZXNzIG9mIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgcmVnaXN0ZXJzLiBUaGUgY29yZV9wYXJhbXMKKyAqIGFyZ3VtZW50IGhvbGRzIHRoZSBwYXJhbWV0ZXJzIHRoYXQgc3BlY2lmeSBob3cgdGhlIGNvcmUgc2hvdWxkIGJlCisgKiBjb25maWd1cmVkLgorICoKKyAqIEBwYXJhbSByZWdfYmFzZV9hZGRyIEJhc2UgYWRkcmVzcyBvZiBEV0Nfb3RnIGNvcmUgcmVnaXN0ZXJzCisgKgorICovCitkd2Nfb3RnX2NvcmVfaWZfdCAqZHdjX290Z19jaWxfaW5pdChjb25zdCB1aW50MzJfdCAqIHJlZ19iYXNlX2FkZHIpCit7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSAwOworCWR3Y19vdGdfZGV2X2lmX3QgKmRldl9pZiA9IDA7CisJZHdjX290Z19ob3N0X2lmX3QgKmhvc3RfaWYgPSAwOworCXVpbnQ4X3QgKnJlZ19iYXNlID0gKHVpbnQ4X3QgKikgcmVnX2Jhc2VfYWRkcjsKKwlpbnQgaSA9IDA7CisKKwlEV0NfREVCVUdQTChEQkdfQ0lMViwgIiVzKCVwKVxuIiwgX19mdW5jX18sIHJlZ19iYXNlX2FkZHIpOworCisJY29yZV9pZiA9IERXQ19BTExPQyhzaXplb2YoZHdjX290Z19jb3JlX2lmX3QpKTsKKworCWlmIChjb3JlX2lmID09IE5VTEwpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwKKwkJCSAgICAiQWxsb2NhdGlvbiBvZiBkd2Nfb3RnX2NvcmVfaWZfdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncyA9IChkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqKSByZWdfYmFzZTsKKworCS8qCisJICogQWxsb2NhdGUgdGhlIERldmljZSBNb2RlIHN0cnVjdHVyZXMuCisJICovCisJZGV2X2lmID0gRFdDX0FMTE9DKHNpemVvZihkd2Nfb3RnX2Rldl9pZl90KSk7CisKKwlpZiAoZGV2X2lmID09IE5VTEwpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIkFsbG9jYXRpb24gb2YgZHdjX290Z19kZXZfaWZfdCBmYWlsZWRcbiIpOworCQlEV0NfRlJFRShjb3JlX2lmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MgPQorCSAgICAoZHdjX290Z19kZXZpY2VfZ2xvYmFsX3JlZ3NfdCAqKSAocmVnX2Jhc2UgKworCQkJCQkgICAgICBEV0NfREVWX0dMT0JBTF9SRUdfT0ZGU0VUKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRVBTX0NIQU5ORUxTOyBpKyspIHsKKwkJZGV2X2lmLT5pbl9lcF9yZWdzW2ldID0gKGR3Y19vdGdfZGV2X2luX2VwX3JlZ3NfdCAqKQorCQkgICAgKHJlZ19iYXNlICsgRFdDX0RFVl9JTl9FUF9SRUdfT0ZGU0VUICsKKwkJICAgICAoaSAqIERXQ19FUF9SRUdfT0ZGU0VUKSk7CisKKwkJZGV2X2lmLT5vdXRfZXBfcmVnc1tpXSA9IChkd2Nfb3RnX2Rldl9vdXRfZXBfcmVnc190ICopCisJCSAgICAocmVnX2Jhc2UgKyBEV0NfREVWX09VVF9FUF9SRUdfT0ZGU0VUICsKKwkJICAgICAoaSAqIERXQ19FUF9SRUdfT0ZGU0VUKSk7CisJCURXQ19ERUJVR1BMKERCR19DSUxWLCAiaW5fZXBfcmVnc1slZF0tPmRpZXBjdGw9JXBcbiIsCisJCQkgICAgaSwgJmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGN0bCk7CisJCURXQ19ERUJVR1BMKERCR19DSUxWLCAib3V0X2VwX3JlZ3NbJWRdLT5kb2VwY3RsPSVwXG4iLAorCQkJICAgIGksICZkZXZfaWYtPm91dF9lcF9yZWdzW2ldLT5kb2VwY3RsKTsKKwl9CisKKwlkZXZfaWYtPnNwZWVkID0gMDsJLy8gdW5rbm93bgorCisJY29yZV9pZi0+ZGV2X2lmID0gZGV2X2lmOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgSG9zdCBNb2RlIHN0cnVjdHVyZXMuCisJICovCisJaG9zdF9pZiA9IERXQ19BTExPQyhzaXplb2YoZHdjX290Z19ob3N0X2lmX3QpKTsKKworCWlmIChob3N0X2lmID09IE5VTEwpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwKKwkJCSAgICAiQWxsb2NhdGlvbiBvZiBkd2Nfb3RnX2hvc3RfaWZfdCBmYWlsZWRcbiIpOworCQlEV0NfRlJFRShkZXZfaWYpOworCQlEV0NfRlJFRShjb3JlX2lmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncyA9IChkd2Nfb3RnX2hvc3RfZ2xvYmFsX3JlZ3NfdCAqKQorCSAgICAocmVnX2Jhc2UgKyBEV0NfT1RHX0hPU1RfR0xPQkFMX1JFR19PRkZTRVQpOworCisJaG9zdF9pZi0+aHBydDAgPQorCSAgICAodWludDMyX3QgKikgKHJlZ19iYXNlICsgRFdDX09UR19IT1NUX1BPUlRfUkVHU19PRkZTRVQpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9FUFNfQ0hBTk5FTFM7IGkrKykgeworCQlob3N0X2lmLT5oY19yZWdzW2ldID0gKGR3Y19vdGdfaGNfcmVnc190ICopCisJCSAgICAocmVnX2Jhc2UgKyBEV0NfT1RHX0hPU1RfQ0hBTl9SRUdTX09GRlNFVCArCisJCSAgICAgKGkgKiBEV0NfT1RHX0NIQU5fUkVHU19PRkZTRVQpKTsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJoY19yZWdbJWRdLT5oY2NoYXI9JXBcbiIsCisJCQkgICAgaSwgJmhvc3RfaWYtPmhjX3JlZ3NbaV0tPmhjY2hhcik7CisJfQorCisJaG9zdF9pZi0+bnVtX2hvc3RfY2hhbm5lbHMgPSBNQVhfRVBTX0NIQU5ORUxTOworCWNvcmVfaWYtPmhvc3RfaWYgPSBob3N0X2lmOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9FUFNfQ0hBTk5FTFM7IGkrKykgeworCQljb3JlX2lmLT5kYXRhX2ZpZm9baV0gPQorCQkgICAgKHVpbnQzMl90ICopIChyZWdfYmFzZSArIERXQ19PVEdfREFUQV9GSUZPX09GRlNFVCArCisJCQkJICAoaSAqIERXQ19PVEdfREFUQV9GSUZPX1NJWkUpKTsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJkYXRhX2ZpZm9bJWRdPTB4JTA4bHhcbiIsCisJCQkgICAgaSwgKHVuc2lnbmVkIGxvbmcpY29yZV9pZi0+ZGF0YV9maWZvW2ldKTsKKwl9CisKKwljb3JlX2lmLT5wY2djY3RsID0gKHVpbnQzMl90ICopIChyZWdfYmFzZSArIERXQ19PVEdfUENHQ0NUTF9PRkZTRVQpOworCisJLyogSW5pdGlhdGUgbHhfc3RhdGUgdG8gTDMgZGlzY29ubmVjdGVkIHN0YXRlICovCisJY29yZV9pZi0+bHhfc3RhdGUgPSBEV0NfT1RHX0wzOworCS8qCisJICogU3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBoZXJlIGZvcgorCSAqIGVhc3kgYWNjZXNzIGxhdGVyLgorCSAqLworCWNvcmVfaWYtPmh3Y2ZnMS5kMzIgPQorCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2h3Y2ZnMSk7CisJY29yZV9pZi0+aHdjZmcyLmQzMiA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naHdjZmcyKTsKKwljb3JlX2lmLT5od2NmZzMuZDMyID0KKwkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdod2NmZzMpOworCWNvcmVfaWYtPmh3Y2ZnNC5kMzIgPQorCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2h3Y2ZnNCk7CisKKwkvKiBGb3JjZSBob3N0IG1vZGUgdG8gZ2V0IEhQVFhGU0laIGV4YWN0IHBvd2VyIG9uIHZhbHVlICovCisJeworCQlndXNiY2ZnX2RhdGFfdCBndXNiY2ZnID0gey5kMzIgPSAwIH07CisJCWd1c2JjZmcuZDMyID0gIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndXNiY2ZnKTsKKwkJZ3VzYmNmZy5iLmZvcmNlX2hvc3RfbW9kZSA9IDE7CisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3VzYmNmZywgZ3VzYmNmZy5kMzIpOworCQlkd2NfbWRlbGF5KDEwMCk7CisJCWNvcmVfaWYtPmhwdHhmc2l6LmQzMiA9CisJCURXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ocHR4ZnNpeik7CisJCWd1c2JjZmcuZDMyID0gIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndXNiY2ZnKTsKKwkJZ3VzYmNmZy5iLmZvcmNlX2hvc3RfbW9kZSA9IDA7CisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3VzYmNmZywgZ3VzYmNmZy5kMzIpOworCQlkd2NfbWRlbGF5KDEwMCk7CisJfQorCisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJod2NmZzE9JTA4eFxuIiwgY29yZV9pZi0+aHdjZmcxLmQzMik7CisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJod2NmZzI9JTA4eFxuIiwgY29yZV9pZi0+aHdjZmcyLmQzMik7CisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJod2NmZzM9JTA4eFxuIiwgY29yZV9pZi0+aHdjZmczLmQzMik7CisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJod2NmZzQ9JTA4eFxuIiwgY29yZV9pZi0+aHdjZmc0LmQzMik7CisKKwljb3JlX2lmLT5oY2ZnLmQzMiA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnKTsKKwljb3JlX2lmLT5kY2ZnLmQzMiA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGNmZyk7CisKKwlEV0NfREVCVUdQTChEQkdfQ0lMViwgImhjZmc9JTA4eFxuIiwgY29yZV9pZi0+aGNmZy5kMzIpOworCURXQ19ERUJVR1BMKERCR19DSUxWLCAiZGNmZz0lMDh4XG4iLCBjb3JlX2lmLT5kY2ZnLmQzMik7CisKKwlEV0NfREVCVUdQTChEQkdfQ0lMViwgIm9wX21vZGU9JTB4XG4iLCBjb3JlX2lmLT5od2NmZzIuYi5vcF9tb2RlKTsKKwlEV0NfREVCVUdQTChEQkdfQ0lMViwgImFyY2g9JTB4XG4iLCBjb3JlX2lmLT5od2NmZzIuYi5hcmNoaXRlY3R1cmUpOworCURXQ19ERUJVR1BMKERCR19DSUxWLCAibnVtX2Rldl9lcD0lZFxuIiwgY29yZV9pZi0+aHdjZmcyLmIubnVtX2Rldl9lcCk7CisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJudW1faG9zdF9jaGFuPSVkXG4iLAorCQkgICAgY29yZV9pZi0+aHdjZmcyLmIubnVtX2hvc3RfY2hhbik7CisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJub25wZXJpb190eF9xX2RlcHRoPTB4JTB4XG4iLAorCQkgICAgY29yZV9pZi0+aHdjZmcyLmIubm9ucGVyaW9fdHhfcV9kZXB0aCk7CisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJob3N0X3BlcmlvX3R4X3FfZGVwdGg9MHglMHhcbiIsCisJCSAgICBjb3JlX2lmLT5od2NmZzIuYi5ob3N0X3BlcmlvX3R4X3FfZGVwdGgpOworCURXQ19ERUJVR1BMKERCR19DSUxWLCAiZGV2X3Rva2VuX3FfZGVwdGg9MHglMHhcbiIsCisJCSAgICBjb3JlX2lmLT5od2NmZzIuYi5kZXZfdG9rZW5fcV9kZXB0aCk7CisKKwlEV0NfREVCVUdQTChEQkdfQ0lMViwgIlRvdGFsIEZJRk8gU1o9JWRcbiIsCisJCSAgICBjb3JlX2lmLT5od2NmZzMuYi5kZmlmb19kZXB0aCk7CisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICJ4ZmVyX3NpemVfY250cl93aWR0aD0lMHhcbiIsCisJCSAgICBjb3JlX2lmLT5od2NmZzMuYi54ZmVyX3NpemVfY250cl93aWR0aCk7CisKKwkvKgorCSAqIFNldCB0aGUgU1JQIHN1Y2VzcyBiaXQgZm9yIEZTLUkyYworCSAqLworCWNvcmVfaWYtPnNycF9zdWNjZXNzID0gMDsKKwljb3JlX2lmLT5zcnBfdGltZXJfc3RhcnRlZCA9IDA7CisKKwkvKgorCSAqIENyZWF0ZSBuZXcgd29ya3F1ZXVlIGFuZCBpbml0IHdvcmtzCisJICovCisJY29yZV9pZi0+d3Ffb3RnID0gRFdDX1dPUktRX0FMTE9DKCJkd2Nfb3RnIik7CisJaWYgKGNvcmVfaWYtPndxX290ZyA9PSAwKSB7CisJCURXQ19XQVJOKCJEV0NfV09SS1FfQUxMT0MgZmFpbGVkXG4iKTsKKwkJRFdDX0ZSRUUoaG9zdF9pZik7CisJCURXQ19GUkVFKGRldl9pZik7CisJCURXQ19GUkVFKGNvcmVfaWYpOworCQlyZXR1cm4gMDsKKwl9CisKKwljb3JlX2lmLT5zbnBzaWQgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3NucHNpZCk7CisKKwlEV0NfUFJJTlRGKCJDb3JlIFJlbGVhc2U6ICV4LiV4JXgleFxuIiwKKwkJICAgKGNvcmVfaWYtPnNucHNpZCA+PiAxMiAmIDB4RiksCisJCSAgIChjb3JlX2lmLT5zbnBzaWQgPj4gOCAmIDB4RiksCisJCSAgIChjb3JlX2lmLT5zbnBzaWQgPj4gNCAmIDB4RiksIChjb3JlX2lmLT5zbnBzaWQgJiAweEYpKTsKKworCWNvcmVfaWYtPndrcF90aW1lciA9IERXQ19USU1FUl9BTExPQygiV2FrZSBVcCBUaW1lciIsCisJCQkJCSAgICAgd193YWtldXBfZGV0ZWN0ZWQsIGNvcmVfaWYpOworCWlmIChjb3JlX2lmLT53a3BfdGltZXIgPT0gMCkgeworCQlEV0NfV0FSTigiRFdDX1RJTUVSX0FMTE9DIGZhaWxlZFxuIik7CisJCURXQ19GUkVFKGhvc3RfaWYpOworCQlEV0NfRlJFRShkZXZfaWYpOworCQlEV0NfV09SS1FfRlJFRShjb3JlX2lmLT53cV9vdGcpOworCQlEV0NfRlJFRShjb3JlX2lmKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGR3Y19vdGdfc2V0dXBfcGFyYW1zKGNvcmVfaWYpKSB7CisJCURXQ19XQVJOKCJFcnJvciB3aGlsZSBzZXR0aW5nIGNvcmUgcGFyYW1zXG4iKTsKKwl9CisKKwljb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID0gMDsKKworCS8qKiBBRFAgaW5pdGlhbGl6YXRpb24gKi8KKwlkd2Nfb3RnX2FkcF9pbml0KGNvcmVfaWYpOworCisJcmV0dXJuIGNvcmVfaWY7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyB0aGUgc3RydWN0dXJlcyBhbGxvY2F0ZWQgYnkgZHdjX290Z19jaWxfaW5pdCgpLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFRoZSBjb3JlIGludGVyZmFjZSBwb2ludGVyIHJldHVybmVkIGZyb20KKyAqIAkJICBkd2Nfb3RnX2NpbF9pbml0KCkuCisgKgorICovCit2b2lkIGR3Y19vdGdfY2lsX3JlbW92ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdhaGJjZmcsIDEsIDApOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaywgMCk7CisKKwlpZiAoY29yZV9pZi0+d3Ffb3RnKSB7CisJCURXQ19XT1JLUV9XQUlUX1dPUktfRE9ORShjb3JlX2lmLT53cV9vdGcsIDUwMCk7CisJCURXQ19XT1JLUV9GUkVFKGNvcmVfaWYtPndxX290Zyk7CisJfQorCWlmIChjb3JlX2lmLT5kZXZfaWYpIHsKKwkJRFdDX0ZSRUUoY29yZV9pZi0+ZGV2X2lmKTsKKwl9CisJaWYgKGNvcmVfaWYtPmhvc3RfaWYpIHsKKwkJRFdDX0ZSRUUoY29yZV9pZi0+aG9zdF9pZik7CisJfQorCisJLyoqIFJlbW92ZSBBRFAgU3R1ZmYgICovCisJZHdjX290Z19hZHBfcmVtb3ZlKGNvcmVfaWYpOworCWlmIChjb3JlX2lmLT5jb3JlX3BhcmFtcykgeworCQlEV0NfRlJFRShjb3JlX2lmLT5jb3JlX3BhcmFtcyk7CisJfQorCWlmIChjb3JlX2lmLT53a3BfdGltZXIpIHsKKwkJRFdDX1RJTUVSX0ZSRUUoY29yZV9pZi0+d2twX3RpbWVyKTsKKwl9CisJaWYgKGNvcmVfaWYtPnNycF90aW1lcikgeworCQlEV0NfVElNRVJfRlJFRShjb3JlX2lmLT5zcnBfdGltZXIpOworCX0KKwlEV0NfRlJFRShjb3JlX2lmKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIGNvbnRyb2xsZXIncyBHbG9iYWwgSW50ZXJydXB0IGluIHRoZSBBSEIgQ29uZmlnCisgKiByZWdpc3Rlci4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqLwordm9pZCBkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZ2FoYmNmZ19kYXRhX3QgYWhiY2ZnID0gey5kMzIgPSAwIH07CisJYWhiY2ZnLmIuZ2xibGludHJtc2sgPSAxOwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdhaGJjZmcsIDAsIGFoYmNmZy5kMzIpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIGNvbnRyb2xsZXIncyBHbG9iYWwgSW50ZXJydXB0IGluIHRoZSBBSEIgQ29uZmlnCisgKiByZWdpc3Rlci4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqLwordm9pZCBkd2Nfb3RnX2Rpc2FibGVfZ2xvYmFsX2ludGVycnVwdHMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWdhaGJjZmdfZGF0YV90IGFoYmNmZyA9IHsuZDMyID0gMCB9OworCWFoYmNmZy5iLmdsYmxpbnRybXNrID0gMTsJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2FoYmNmZywgYWhiY2ZnLmQzMiwgMCk7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgY29tbW1vbiBpbnRlcnJ1cHRzLCB1c2VkIGluIGJvdGgKKyAqIGRldmljZSBhbmQgaG9zdCBtb2Rlcy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGR3Y19vdGdfZW5hYmxlX2NvbW1vbl9pbnRlcnJ1cHRzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqZ2xvYmFsX3JlZ3MgPSBjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzOworCWdpbnRtc2tfZGF0YV90IGludHJfbWFzayA9IHsuZDMyID0gMCB9OworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgT1RHIEludGVycnVwdHMgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5nb3RnaW50LCAweEZGRkZGRkZGKTsKKworCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzLCAweEZGRkZGRkZGKTsKKworCS8qCisJICogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGluIHRoZSBHSU5UTVNLLgorCSAqLworCWludHJfbWFzay5iLm1vZGVtaXNtYXRjaCA9IDE7CisJaW50cl9tYXNrLmIub3RnaW50ciA9IDE7CisKKwlpZiAoIWNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJaW50cl9tYXNrLmIucnhzdHNxbHZsID0gMTsKKwl9CisKKwlpbnRyX21hc2suYi5jb25pZHN0c2NobmcgPSAxOworCWludHJfbWFzay5iLndrdXBpbnRyID0gMTsKKwlpbnRyX21hc2suYi5kaXNjb25uZWN0ID0gMDsKKwlpbnRyX21hc2suYi51c2JzdXNwZW5kID0gMTsKKwlpbnRyX21hc2suYi5zZXNzcmVxaW50ciA9IDE7CisjaWZkZWYgQ09ORklHX1VTQl9EV0NfT1RHX0xQTQorCWlmIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+bHBtX2VuYWJsZSkgeworCQlpbnRyX21hc2suYi5scG10cmFucmN2ZCA9IDE7CisJfQorI2VuZGlmCisJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludG1zaywgaW50cl9tYXNrLmQzMik7Cit9CisKKy8qCisgKiBUaGUgcmVzdG9yZSBvcGVyYXRpb24gaXMgbW9kaWZpZWQgdG8gc3VwcG9ydCBTeW5vcHN5cyBFbXVsYXRlZCBQb3dlcmRvd24gYW5kCisgKiBIaWJlcm5hdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBmb3IgZXhpdGluZyBmcm9tIERldmljZSBtb2RlIGhpYmVybmF0aW9uIGJ5CisgKiBIb3N0IEluaXRpYXRlZCBSZXN1bWUvUmVzZXQgYW5kIERldmljZSBJbml0aWF0ZWQgUmVtb3RlLVdha2V1cC4KKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIHJlbV93YWtldXAgLSBpbmRpY2F0ZXMgd2hldGhlciByZXN1bWUgaXMgaW5pdGlhdGVkIGJ5IERldmljZSBvciBIb3N0LgorICogQHBhcmFtIHJlc2V0IC0gaW5kaWNhdGVzIHdoZXRoZXIgcmVzdW1lIGlzIGluaXRpYXRlZCBieSBSZXNldC4KKyAqLworaW50IGR3Y19vdGdfZGV2aWNlX2hpYmVybmF0aW9uX3Jlc3RvcmUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCSAgICAgICBpbnQgcmVtX3dha2V1cCwgaW50IHJlc2V0KQoreworCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuID0gey5kMzIgPSAwIH07CisJcGNnY2N0bF9kYXRhX3QgcGNnY2N0bCA9IHsuZDMyID0gMCB9OworCWRjdGxfZGF0YV90IGRjdGwgPSB7LmQzMiA9IDAgfTsKKworCWludCB0aW1lb3V0ID0gMjAwMDsKKworCWlmICghY29yZV9pZi0+aGliZXJuYXRpb25fc3VzcGVuZCkgeworCQlEV0NfUFJJTlRGKCJBbHJlYWR5IGV4aXRlZCBmcm9tIEhpYmVybmF0aW9uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJRFdDX0RFQlVHUEwoREJHX1BDRCwgIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkvKiBTd2l0Y2gtb24gdm9sdGFnZSB0byB0aGUgY29yZSAqLworCWdwd3Jkbi5iLnB3cmRuc3d0Y2ggPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJZHdjX3VkZWxheSgxMCk7CisKKwkvKiBSZXNldCBjb3JlICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucHdyZG5yc3RuID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCWR3Y191ZGVsYXkoMTApOworCisJLyogQXNzZXJ0IFJlc3RvcmUgc2lnbmFsICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucmVzdG9yZSA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIERpc2FibGUgcG93ZXIgY2xhbXBzICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucHdyZG5jbG1wID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCisJaWYgKHJlbV93YWtldXApIHsKKwkJZHdjX3VkZWxheSg3MCk7CisJfQorCisJLyogRGVhc3NlcnQgUmVzZXQgY29yZSAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnB3cmRucnN0biA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIERpc2FibGUgUE1VIGludGVycnVwdCAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnBtdWludHNlbCA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKworCS8qIE1hc2sgaW50ZXJydXB0cyBmcm9tIGdwd3JkbiAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLmNvbm5lY3RfZGV0X21zayA9IDE7CisJZ3B3cmRuLmIuc3JwX2RldF9tc2sgPSAxOworCWdwd3Jkbi5iLmRpc2Nvbm5fZGV0X21zayA9IDE7CisJZ3B3cmRuLmIucnN0X2RldF9tc2sgPSAxOworCWdwd3Jkbi5iLmxuc3RjaG5nX21zayA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKworCS8qIEluZGljYXRlcyB0aGF0IHdlIGFyZSBnb2luZyBvdXQgZnJvbSBoaWJlcm5hdGlvbiAqLworCWNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPSAwOworCisJLyoKKwkgKiBTZXQgUmVzdG9yZSBFc3NlbnRpYWwgUmVncyBiaXQgaW4gUENHQ0NUTCByZWdpc3RlciwgcmVzdG9yZV9tb2RlID0gMQorCSAqIGluZGljYXRlcyByZXN0b3JlIGZyb20gcmVtb3RlX3dha2V1cAorCSAqLworCXJlc3RvcmVfZXNzZW50aWFsX3JlZ3MoY29yZV9pZiwgcmVtX3dha2V1cCwgMCk7CisKKwkvKgorCSAqIFdhaXQgYSBsaXR0bGUgZm9yIHNlZWluZyBuZXcgdmFsdWUgb2YgdmFyaWFibGUgaGliZXJuYXRpb25fc3VzcGVuZCBpZgorCSAqIFJlc3RvcmUgZG9uZSBpbnRlcnJ1cHQgcmVjZWl2ZWQgYmVmb3JlIHBvbGxpbmcKKwkgKi8KKwlkd2NfdWRlbGF5KDEwKTsKKworCWlmIChjb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID09IDApIHsKKwkJLyoKKwkJICogV2FpdCBGb3IgUmVzdG9yZV9kb25lIEludGVycnVwdC4gVGhpcyBtZWNoYW5pc20gb2YgcG9sbGluZyB0aGUKKwkJICogaW50ZXJydXB0IGlzIGludHJvZHVjZWQgdG8gYXZvaWQgYW55IHBvc3NpYmxlIHJhY2UgY29uZGl0aW9ucworCQkgKi8KKwkJZG8geworCQkJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKwkJCWdpbnRzdHMuZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cyk7CisJCQlpZiAoZ2ludHN0cy5iLnJlc3RvcmVkb25lKSB7CisJCQkJZ2ludHN0cy5kMzIgPSAwOworCQkJCWdpbnRzdHMuYi5yZXN0b3JlZG9uZSA9IDE7CisJCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCWdpbnRzdHMsIGdpbnRzdHMuZDMyKTsKKwkJCQlEV0NfUFJJTlRGKCJSZXN0b3JlIERvbmUgSW50ZXJydXB0IHNlZW5cbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZHdjX3VkZWxheSgxMCk7CisJCX0gd2hpbGUgKC0tdGltZW91dCk7CisJCWlmICghdGltZW91dCkgeworCQkJRFdDX1BSSU5URigiUmVzdG9yZSBEb25lIGludGVycnVwdCB3YXNuJ3QgZ2VuZXJhdGVkIGhlcmVcbiIpOworCQl9CisJfQorCS8qIENsZWFyIGFsbCBwZW5kaW5nIGludGVydXB0cyAqLworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgMHhGRkZGRkZGRik7CisKKwkvKiBEZS1hc3NlcnQgUmVzdG9yZSAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnJlc3RvcmUgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJZHdjX3VkZWxheSgxMCk7CisKKwlpZiAoIXJlbV93YWtldXApIHsKKwkJcGNnY2N0bC5kMzIgPSAwOworCQlwY2djY3RsLmIucnN0cGR3bm1vZHVsZSA9IDE7CisJCURXQ19NT0RJRllfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCwgcGNnY2N0bC5kMzIsIDApOworCX0KKworCS8qIFJlc3RvcmUgR1VTQkNGRyBhbmQgRENGRyAqLworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3VzYmNmZywKKwkJCWNvcmVfaWYtPmdyX2JhY2t1cC0+Z3VzYmNmZ19sb2NhbCk7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGNmZywKKwkJCWNvcmVfaWYtPmRyX2JhY2t1cC0+ZGNmZyk7CisKKwkvKiBEZS1hc3NlcnQgV2FrZXVwIExvZ2ljICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCWlmICghcmVtX3dha2V1cCkgeworCQkvKiBTZXQgRGV2aWNlIHByb2dyYW1taW5nIGRvbmUgYml0ICovCisJCWRjdGwuYi5wd3JvbnByZ2RvbmUgPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwgMCwgZGN0bC5kMzIpOworCX0gZWxzZSB7CisJCS8qIFN0YXJ0IFJlbW90ZSBXYWtldXAgU2lnbmFsaW5nICovCisJCWRjdGwuZDMyID0gY29yZV9pZi0+ZHJfYmFja3VwLT5kY3RsOworCQlkY3RsLmIucm10d2t1cHNpZyA9IDE7CisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjdGwsIGRjdGwuZDMyKTsKKwl9CisKKwlkd2NfbWRlbGF5KDIpOworCS8qIENsZWFyIGFsbCBwZW5kaW5nIGludGVydXB0cyAqLworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgMHhGRkZGRkZGRik7CisKKwkvKiBSZXN0b3JlIGdsb2JhbCByZWdpc3RlcnMgKi8KKwlkd2Nfb3RnX3Jlc3RvcmVfZ2xvYmFsX3JlZ3MoY29yZV9pZik7CisJLyogUmVzdG9yZSBkZXZpY2UgZ2xvYmFsIHJlZ2lzdGVycyAqLworCWR3Y19vdGdfcmVzdG9yZV9kZXZfcmVncyhjb3JlX2lmLCByZW1fd2FrZXVwKTsKKworCWlmIChyZW1fd2FrZXVwKSB7CisJCWR3Y19tZGVsYXkoNyk7CisJCWRjdGwuZDMyID0gMDsKKwkJZGN0bC5iLnJtdHdrdXBzaWcgPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwgZGN0bC5kMzIsIDApOworCX0KKworCWNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPSAwOworCS8qIFRoZSBjb3JlIHdpbGwgYmUgaW4gT04gU1RBVEUgKi8KKwljb3JlX2lmLT5seF9zdGF0ZSA9IERXQ19PVEdfTDA7CisJRFdDX1BSSU5URigiSGliZXJuYXRpb24gcmVjb3ZlcnkgY29tcGxldGVzIGhlcmVcbiIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgcmVzdG9yZSBvcGVyYXRpb24gaXMgbW9kaWZpZWQgdG8gc3VwcG9ydCBTeW5vcHN5cyBFbXVsYXRlZCBQb3dlcmRvd24gYW5kCisgKiBIaWJlcm5hdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBmb3IgZXhpdGluZyBmcm9tIEhvc3QgbW9kZSBoaWJlcm5hdGlvbiBieQorICogSG9zdCBJbml0aWF0ZWQgUmVzdW1lL1Jlc2V0IGFuZCBEZXZpY2UgSW5pdGlhdGVkIFJlbW90ZS1XYWtldXAuCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSByZW1fd2FrZXVwIC0gaW5kaWNhdGVzIHdoZXRoZXIgcmVzdW1lIGlzIGluaXRpYXRlZCBieSBEZXZpY2Ugb3IgSG9zdC4KKyAqIEBwYXJhbSByZXNldCAtIGluZGljYXRlcyB3aGV0aGVyIHJlc3VtZSBpcyBpbml0aWF0ZWQgYnkgUmVzZXQuCisgKi8KK2ludCBkd2Nfb3RnX2hvc3RfaGliZXJuYXRpb25fcmVzdG9yZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJICAgICBpbnQgcmVtX3dha2V1cCwgaW50IHJlc2V0KQoreworCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuID0gey5kMzIgPSAwIH07CisJaHBydDBfZGF0YV90IGhwcnQwID0gey5kMzIgPSAwIH07CisKKwlpbnQgdGltZW91dCA9IDIwMDA7CisKKwlEV0NfREVCVUdQTChEQkdfSENELCAiJXMgY2FsbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCS8qIFN3aXRjaC1vbiB2b2x0YWdlIHRvIHRoZSBjb3JlICovCisJZ3B3cmRuLmIucHdyZG5zd3RjaCA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIFJlc2V0IGNvcmUgKi8KKwlncHdyZG4uZDMyID0gMDsKKwlncHdyZG4uYi5wd3JkbnJzdG4gPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJZHdjX3VkZWxheSgxMCk7CisKKwkvKiBBc3NlcnQgUmVzdG9yZSBzaWduYWwgKi8KKwlncHdyZG4uZDMyID0gMDsKKwlncHdyZG4uYi5yZXN0b3JlID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIDAsIGdwd3Jkbi5kMzIpOworCWR3Y191ZGVsYXkoMTApOworCisJLyogRGlzYWJsZSBwb3dlciBjbGFtcHMgKi8KKwlncHdyZG4uZDMyID0gMDsKKwlncHdyZG4uYi5wd3JkbmNsbXAgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisKKwlpZiAoIXJlbV93YWtldXApIHsKKwkJZHdjX3VkZWxheSg1MCk7CisJfQorCisJLyogRGVhc3NlcnQgUmVzZXQgY29yZSAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnB3cmRucnN0biA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIERpc2FibGUgUE1VIGludGVycnVwdCAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnBtdWludHNlbCA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLmNvbm5lY3RfZGV0X21zayA9IDE7CisJZ3B3cmRuLmIuc3JwX2RldF9tc2sgPSAxOworCWdwd3Jkbi5iLmRpc2Nvbm5fZGV0X21zayA9IDE7CisJZ3B3cmRuLmIucnN0X2RldF9tc2sgPSAxOworCWdwd3Jkbi5iLmxuc3RjaG5nX21zayA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKworCS8qIEluZGljYXRlcyB0aGF0IHdlIGFyZSBnb2luZyBvdXQgZnJvbSBoaWJlcm5hdGlvbiAqLworCWNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPSAwOworCisJLyogU2V0IFJlc3RvcmUgRXNzZW50aWFsIFJlZ3MgYml0IGluIFBDR0NDVEwgcmVnaXN0ZXIgKi8KKwlyZXN0b3JlX2Vzc2VudGlhbF9yZWdzKGNvcmVfaWYsIHJlbV93YWtldXAsIDEpOworCisJLyogV2FpdCBhIGxpdHRsZSBmb3Igc2VlaW5nIG5ldyB2YWx1ZSBvZiB2YXJpYWJsZSBoaWJlcm5hdGlvbl9zdXNwZW5kIGlmCisJICogUmVzdG9yZSBkb25lIGludGVycnVwdCByZWNlaXZlZCBiZWZvcmUgcG9sbGluZyAqLworCWR3Y191ZGVsYXkoMTApOworCisJaWYgKGNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPT0gMCkgeworCQkvKiBXYWl0IEZvciBSZXN0b3JlX2RvbmUgSW50ZXJydXB0LiBUaGlzIG1lY2hhbmlzbSBvZiBwb2xsaW5nIHRoZQorCQkgKiBpbnRlcnJ1cHQgaXMgaW50cm9kdWNlZCB0byBhdm9pZCBhbnkgcG9zc2libGUgcmFjZSBjb25kaXRpb25zCisJCSAqLworCQlkbyB7CisJCQlnaW50c3RzX2RhdGFfdCBnaW50c3RzOworCQkJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cyk7CisJCQlpZiAoZ2ludHN0cy5iLnJlc3RvcmVkb25lKSB7CisJCQkJZ2ludHN0cy5kMzIgPSAwOworCQkJCWdpbnRzdHMuYi5yZXN0b3JlZG9uZSA9IDE7CisgICAgICAgICAJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCQkJCURXQ19ERUJVR1BMKERCR19IQ0QsIlJlc3RvcmUgRG9uZSBJbnRlcnJ1cHQgc2VlblxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkd2NfdWRlbGF5KDEwKTsKKwkJfSB3aGlsZSAoLS10aW1lb3V0KTsKKwkJaWYgKCF0aW1lb3V0KSB7CisJCQlEV0NfV0FSTigiUmVzdG9yZSBEb25lIGludGVycnVwdCB3YXNuJ3QgZ2VuZXJhdGVkXG4iKTsKKwkJfQorCX0KKworCS8qIFNldCB0aGUgZmxhZydzIHZhbHVlIHRvIDAgYWdhaW4gYWZ0ZXIgcmVjZWl2aW5nIHJlc3RvcmUgZG9uZSBpbnRlcnJ1cHQgKi8KKwljb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID0gMDsKKworCS8qIFRoaXMgc3RlcCBpcyBub3QgZGVzY3JpYmVkIGluIGZ1bmN0aW9uYWwgc3BlYyBidXQgaWYgbm90IHdhaXQgZm9yIHRoaXMKKwkgKiBkZWxheSwgbWlzbWF0Y2ggaW50ZXJydXB0cyBvY2N1cnJlZCBiZWNhdXNlIGp1c3QgYWZ0ZXIgcmVzdG9yZSBjb3JlIGlzCisJICogaW4gRGV2aWNlIG1vZGUoZ2ludHN0cy5jdXJtb2RlID09IDApICovCisJZHdjX21kZWxheSgxMDApOworCisJLyogQ2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgMHhGRkZGRkZGRik7CisKKwkvKiBEZS1hc3NlcnQgUmVzdG9yZSAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnJlc3RvcmUgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJZHdjX3VkZWxheSgxMCk7CisKKwkvKiBSZXN0b3JlIEdVU0JDRkcgYW5kIEhDRkcgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmd1c2JjZmcsCisJCQljb3JlX2lmLT5ncl9iYWNrdXAtPmd1c2JjZmdfbG9jYWwpOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGNmZywKKwkJCWNvcmVfaWYtPmhyX2JhY2t1cC0+aGNmZ19sb2NhbCk7CisKKwkvKiBEZS1hc3NlcnQgV2FrZXVwIExvZ2ljICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIFN0YXJ0IHRoZSBSZXN1bWUgb3BlcmF0aW9uIGJ5IHByb2dyYW1taW5nIEhQUlQwICovCisJaHBydDAuZDMyID0gY29yZV9pZi0+aHJfYmFja3VwLT5ocHJ0MF9sb2NhbDsKKwlocHJ0MC5iLnBydHB3ciA9IDE7CisJaHBydDAuYi5wcnRlbmEgPSAwOworCWhwcnQwLmIucHJ0c3VzcCA9IDA7CisJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCBocHJ0MC5kMzIpOworCisJRFdDX1BSSU5URigiUmVzdW1lIFN0YXJ0cyBOb3dcbiIpOworCWlmICghcmVzZXQpIHsJCS8vIEluZGljYXRlcyBpdCBpcyBSZXN1bWUgT3BlcmF0aW9uCisJCWhwcnQwLmQzMiA9IGNvcmVfaWYtPmhyX2JhY2t1cC0+aHBydDBfbG9jYWw7CisJCWhwcnQwLmIucHJ0cmVzID0gMTsKKwkJaHBydDAuYi5wcnRwd3IgPSAxOworCQlocHJ0MC5iLnBydGVuYSA9IDA7CisJCWhwcnQwLmIucHJ0c3VzcCA9IDA7CisJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKworCQlpZiAoIXJlbV93YWtldXApCisJCQlocHJ0MC5iLnBydHJlcyA9IDA7CisJCS8qIFdhaXQgZm9yIFJlc3VtZSB0aW1lIGFuZCB0aGVuIHByb2dyYW0gSFBSVCBhZ2FpbiAqLworCQlkd2NfbWRlbGF5KDEwMCk7CisJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKworCX0gZWxzZSB7CQkvLyBJbmRpY2F0ZXMgaXQgaXMgUmVzZXQgT3BlcmF0aW9uCisJCWhwcnQwLmQzMiA9IGNvcmVfaWYtPmhyX2JhY2t1cC0+aHBydDBfbG9jYWw7CisJCWhwcnQwLmIucHJ0cnN0ID0gMTsKKwkJaHBydDAuYi5wcnRwd3IgPSAxOworCQlocHJ0MC5iLnBydGVuYSA9IDA7CisJCWhwcnQwLmIucHJ0c3VzcCA9IDA7CisJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKwkJLyogV2FpdCBmb3IgUmVzZXQgdGltZSBhbmQgdGhlbiBwcm9ncmFtIEhQUlQgYWdhaW4gKi8KKwkJZHdjX21kZWxheSg2MCk7CisJCWhwcnQwLmIucHJ0cnN0ID0gMDsKKwkJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCBocHJ0MC5kMzIpOworCX0KKwkvKiBDbGVhciBhbGwgaW50ZXJydXB0IHN0YXR1cyAqLworCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwlocHJ0MC5iLnBydGNvbm5kZXQgPSAxOworCWhwcnQwLmIucHJ0ZW5jaG5nID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisKKwkvKiBDbGVhciBhbGwgcGVuZGluZyBpbnRlcnVwdHMgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIDB4RkZGRkZGRkYpOworCisJLyogUmVzdG9yZSBnbG9iYWwgcmVnaXN0ZXJzICovCisJZHdjX290Z19yZXN0b3JlX2dsb2JhbF9yZWdzKGNvcmVfaWYpOworCS8qIFJlc3RvcmUgaG9zdCBnbG9iYWwgcmVnaXN0ZXJzICovCisJZHdjX290Z19yZXN0b3JlX2hvc3RfcmVncyhjb3JlX2lmLCByZXNldCk7CisKKwkvKiBUaGUgY29yZSB3aWxsIGJlIGluIE9OIFNUQVRFICovCisJY29yZV9pZi0+bHhfc3RhdGUgPSBEV0NfT1RHX0wwOworCURXQ19QUklOVEYoIkhpYmVybmF0aW9uIHJlY292ZXJ5IGlzIGNvbXBsZXRlIGhlcmVcbiIpOworCXJldHVybiAwOworfQorCisvKiogU2F2ZXMgc29tZSByZWdpc3RlciB2YWx1ZXMgaW50byBzeXN0ZW0gbWVtb3J5LiAqLworaW50IGR3Y19vdGdfc2F2ZV9nbG9iYWxfcmVncyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJc3RydWN0IGR3Y19vdGdfZ2xvYmFsX3JlZ3NfYmFja3VwICpncjsKKwlpbnQgaTsKKworCWdyID0gY29yZV9pZi0+Z3JfYmFja3VwOworCWlmICghZ3IpIHsKKwkJZ3IgPSBEV0NfQUxMT0Moc2l6ZW9mKCpncikpOworCQlpZiAoIWdyKSB7CisJCQlyZXR1cm4gLURXQ19FX05PX01FTU9SWTsKKwkJfQorCQljb3JlX2lmLT5ncl9iYWNrdXAgPSBncjsKKwl9CisKKwlnci0+Z290Z2N0bF9sb2NhbCA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsKTsKKwlnci0+Z2ludG1za19sb2NhbCA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrKTsKKwlnci0+Z2FoYmNmZ19sb2NhbCA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nYWhiY2ZnKTsKKwlnci0+Z3VzYmNmZ19sb2NhbCA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndXNiY2ZnKTsKKwlnci0+Z3J4ZnNpel9sb2NhbCA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnhmc2l6KTsKKwlnci0+Z25wdHhmc2l6X2xvY2FsID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeik7CisJZ3ItPmhwdHhmc2l6X2xvY2FsID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmhwdHhmc2l6KTsKKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCisJZ3ItPmdscG1jZmdfbG9jYWwgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisjZW5kaWYKKwlnci0+Z2kyY2N0bF9sb2NhbCA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naTJjY3RsKTsKKwlnci0+cGNnY2N0bF9sb2NhbCA9IERXQ19SRUFEX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwpOworCWdyLT5nZGZpZm9jZmdfbG9jYWwgPQorCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2RmaWZvY2ZnKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0VQU19DSEFOTkVMUzsgaSsrKSB7CisJCWdyLT5kdHhmc2l6X2xvY2FsW2ldID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCYoY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+ZHR4ZnNpeltpXSkpOworCX0KKworCURXQ19ERUJVR1BMKERCR19BTlksICI9PT09PT09PT09PUJhY2tpbmcgR2xvYmFsIHJlZ2lzdGVycz09PT09PT09PT1cbiIpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZ290Z2N0bCAgID0gJTA4eFxuIiwgZ3ItPmdvdGdjdGxfbG9jYWwpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZ2ludG1zayAgID0gJTA4eFxuIiwgZ3ItPmdpbnRtc2tfbG9jYWwpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZ2FoYmNmZyAgID0gJTA4eFxuIiwgZ3ItPmdhaGJjZmdfbG9jYWwpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZ3VzYmNmZyAgID0gJTA4eFxuIiwgZ3ItPmd1c2JjZmdfbG9jYWwpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZ3J4ZnNpeiAgID0gJTA4eFxuIiwgZ3ItPmdyeGZzaXpfbG9jYWwpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZ25wdHhmc2l6ID0gJTA4eFxuIiwKKwkJICAgIGdyLT5nbnB0eGZzaXpfbG9jYWwpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgaHB0eGZzaXogID0gJTA4eFxuIiwKKwkJICAgIGdyLT5ocHR4ZnNpel9sb2NhbCk7CisjaWZkZWYgQ09ORklHX1VTQl9EV0NfT1RHX0xQTQorCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZ2xwbWNmZyAgID0gJTA4eFxuIiwgZ3ItPmdscG1jZmdfbG9jYWwpOworI2VuZGlmCisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkJhY2tlZCB1cCBnaTJjY3RsICAgPSAlMDh4XG4iLCBnci0+Z2kyY2N0bF9sb2NhbCk7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkJhY2tlZCB1cCBwY2djY3RsICAgPSAlMDh4XG4iLCBnci0+cGNnY2N0bF9sb2NhbCk7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwiQmFja2VkIHVwIGdkZmlmb2NmZyAgID0gJTA4eFxuIixnci0+Z2RmaWZvY2ZnX2xvY2FsKTsKKworCXJldHVybiAwOworfQorCisvKiogU2F2ZXMgR0lOVE1TSyByZWdpc3RlciBiZWZvcmUgc2V0dGluZyB0aGUgbXNrIGJpdHMuICovCitpbnQgZHdjX290Z19zYXZlX2dpbnRtc2tfcmVnKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlzdHJ1Y3QgZHdjX290Z19nbG9iYWxfcmVnc19iYWNrdXAgKmdyOworCisJZ3IgPSBjb3JlX2lmLT5ncl9iYWNrdXA7CisJaWYgKCFncikgeworCQlnciA9IERXQ19BTExPQyhzaXplb2YoKmdyKSk7CisJCWlmICghZ3IpIHsKKwkJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCQl9CisJCWNvcmVfaWYtPmdyX2JhY2t1cCA9IGdyOworCX0KKworCWdyLT5naW50bXNrX2xvY2FsID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2spOworCisJRFdDX0RFQlVHUEwoREJHX0FOWSwiPT09PT09PT09PT09PUJhY2tpbmcgR0lOVE1TSyByZWdpc3RlcnM9PT09PT09PT09PT1cbiIpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZ2ludG1zayAgID0gJTA4eFxuIiwgZ3ItPmdpbnRtc2tfbG9jYWwpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkd2Nfb3RnX3NhdmVfZGV2X3JlZ3MoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXN0cnVjdCBkd2Nfb3RnX2Rldl9yZWdzX2JhY2t1cCAqZHI7CisJaW50IGk7CisKKwlkciA9IGNvcmVfaWYtPmRyX2JhY2t1cDsKKwlpZiAoIWRyKSB7CisJCWRyID0gRFdDX0FMTE9DKHNpemVvZigqZHIpKTsKKwkJaWYgKCFkcikgeworCQkJcmV0dXJuIC1EV0NfRV9OT19NRU1PUlk7CisJCX0KKwkJY29yZV9pZi0+ZHJfYmFja3VwID0gZHI7CisJfQorCisJZHItPmRjZmcgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcpOworCWRyLT5kY3RsID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsKTsKKwlkci0+ZGFpbnRtc2sgPQorCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRhaW50bXNrKTsKKwlkci0+ZGllcG1zayA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGllcG1zayk7CisJZHItPmRvZXBtc2sgPQorCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRvZXBtc2spOworCisJZm9yIChpID0gMDsgaSA8IGNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsgKytpKSB7CisJCWRyLT5kaWVwY3RsW2ldID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbaV0tPmRpZXBjdGwpOworCQlkci0+ZGllcHRzaXpbaV0gPQorCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcHRzaXopOworCQlkci0+ZGllcGRtYVtpXSA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwZG1hKTsKKwl9CisKKwlEV0NfREVCVUdQTChEQkdfQU5ZLAorCQkgICAgIj09PT09PT09PT09PT1CYWNraW5nIEhvc3QgcmVnaXN0ZXJzPT09PT09PT09PT09PT1cbiIpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZGNmZyAgICAgICAgICAgID0gJTA4eFxuIiwgZHItPmRjZmcpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZGN0bCAgICAgICAgPSAlMDh4XG4iLCBkci0+ZGN0bCk7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkJhY2tlZCB1cCBkYWludG1zayAgICAgICAgICAgID0gJTA4eFxuIiwKKwkJICAgIGRyLT5kYWludG1zayk7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkJhY2tlZCB1cCBkaWVwbXNrICAgICAgICA9ICUwOHhcbiIsIGRyLT5kaWVwbXNrKTsKKwlEV0NfREVCVUdQTChEQkdfQU5ZLCAiQmFja2VkIHVwIGRvZXBtc2sgICAgICAgID0gJTA4eFxuIiwgZHItPmRvZXBtc2spOworCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5kZXZfaWYtPm51bV9pbl9lcHM7ICsraSkgeworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiQmFja2VkIHVwIGRpZXBjdGxbJWRdICAgICAgICA9ICUwOHhcbiIsIGksCisJCQkgICAgZHItPmRpZXBjdGxbaV0pOworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiQmFja2VkIHVwIGRpZXB0c2l6WyVkXSAgICAgICAgPSAlMDh4XG4iLAorCQkJICAgIGksIGRyLT5kaWVwdHNpeltpXSk7CisJCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgZGllcGRtYVslZF0gICAgICAgID0gJTA4eFxuIiwgaSwKKwkJCSAgICBkci0+ZGllcGRtYVtpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkd2Nfb3RnX3NhdmVfaG9zdF9yZWdzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlzdHJ1Y3QgZHdjX290Z19ob3N0X3JlZ3NfYmFja3VwICpocjsKKwlpbnQgaTsKKworCWhyID0gY29yZV9pZi0+aHJfYmFja3VwOworCWlmICghaHIpIHsKKwkJaHIgPSBEV0NfQUxMT0Moc2l6ZW9mKCpocikpOworCQlpZiAoIWhyKSB7CisJCQlyZXR1cm4gLURXQ19FX05PX01FTU9SWTsKKwkJfQorCQljb3JlX2lmLT5ocl9iYWNrdXAgPSBocjsKKwl9CisKKwloci0+aGNmZ19sb2NhbCA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnKTsKKwloci0+aGFpbnRtc2tfbG9jYWwgPQorCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGFpbnRtc2spOworCWZvciAoaSA9IDA7IGkgPCBkd2Nfb3RnX2dldF9wYXJhbV9ob3N0X2NoYW5uZWxzKGNvcmVfaWYpOyArK2kpIHsKKwkJaHItPmhjaW50bXNrX2xvY2FsW2ldID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5oY19yZWdzW2ldLT5oY2ludG1zayk7CisJfQorCWhyLT5ocHJ0MF9sb2NhbCA9IERXQ19SRUFEX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwKTsKKwloci0+aGZpcl9sb2NhbCA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZmlyKTsKKworCURXQ19ERUJVR1BMKERCR19BTlksCisJCSAgICAiPT09PT09PT09PT09PUJhY2tpbmcgSG9zdCByZWdpc3RlcnM9PT09PT09PT09PT09PT1cbiIpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgaGNmZwkJPSAlMDh4XG4iLAorCQkgICAgaHItPmhjZmdfbG9jYWwpOworCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgaGFpbnRtc2sgPSAlMDh4XG4iLCBoci0+aGFpbnRtc2tfbG9jYWwpOworCWZvciAoaSA9IDA7IGkgPCBkd2Nfb3RnX2dldF9wYXJhbV9ob3N0X2NoYW5uZWxzKGNvcmVfaWYpOyArK2kpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkJhY2tlZCB1cCBoY2ludG1za1slMDJkXT0lMDh4XG4iLCBpLAorCQkJICAgIGhyLT5oY2ludG1za19sb2NhbFtpXSk7CisJfQorCURXQ19ERUJVR1BMKERCR19BTlksICJCYWNrZWQgdXAgaHBydDAgICAgICAgICAgID0gJTA4eFxuIiwKKwkJICAgIGhyLT5ocHJ0MF9sb2NhbCk7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkJhY2tlZCB1cCBoZmlyICAgICAgICAgICA9ICUwOHhcbiIsCisJCSAgICBoci0+aGZpcl9sb2NhbCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGR3Y19vdGdfcmVzdG9yZV9nbG9iYWxfcmVncyhkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZikKK3sKKwlzdHJ1Y3QgZHdjX290Z19nbG9iYWxfcmVnc19iYWNrdXAgKmdyOworCWludCBpOworCisJZ3IgPSBjb3JlX2lmLT5ncl9iYWNrdXA7CisJaWYgKCFncikgeworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsLCBnci0+Z290Z2N0bF9sb2NhbCk7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLCBnci0+Z2ludG1za19sb2NhbCk7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndXNiY2ZnLCBnci0+Z3VzYmNmZ19sb2NhbCk7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nYWhiY2ZnLCBnci0+Z2FoYmNmZ19sb2NhbCk7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnhmc2l6LCBnci0+Z3J4ZnNpel9sb2NhbCk7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbnB0eGZzaXosCisJCQlnci0+Z25wdHhmc2l6X2xvY2FsKTsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmhwdHhmc2l6LAorCQkJZ3ItPmhwdHhmc2l6X2xvY2FsKTsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdkZmlmb2NmZywKKwkJCWdyLT5nZGZpZm9jZmdfbG9jYWwpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRVBTX0NIQU5ORUxTOyBpKyspIHsKKwkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5kdHhmc2l6W2ldLAorCQkJCWdyLT5kdHhmc2l6X2xvY2FsW2ldKTsKKwl9CisKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIDB4RkZGRkZGRkYpOworCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgMHgwMDAwMTAwQSk7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nYWhiY2ZnLAorCQkJKGdyLT5nYWhiY2ZnX2xvY2FsKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkd2Nfb3RnX3Jlc3RvcmVfZGV2X3JlZ3MoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQgcmVtX3dha2V1cCkKK3sKKwlzdHJ1Y3QgZHdjX290Z19kZXZfcmVnc19iYWNrdXAgKmRyOworCWludCBpOworCisJZHIgPSBjb3JlX2lmLT5kcl9iYWNrdXA7CisKKwlpZiAoIWRyKSB7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAoIXJlbV93YWtldXApCisJeworCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsLCBkci0+ZGN0bCk7CisJfQorCisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGFpbnRtc2ssIGRyLT5kYWludG1zayk7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGllcG1zaywgZHItPmRpZXBtc2spOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRvZXBtc2ssIGRyLT5kb2VwbXNrKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5kZXZfaWYtPm51bV9pbl9lcHM7ICsraSkgeworCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGN0bCwgZHItPmRpZXBjdGxbaV0pOworCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcHRzaXosIGRyLT5kaWVwdHNpeltpXSk7CisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwZG1hLCBkci0+ZGllcGRtYVtpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkd2Nfb3RnX3Jlc3RvcmVfaG9zdF9yZWdzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50IHJlc2V0KQoreworCXN0cnVjdCBkd2Nfb3RnX2hvc3RfcmVnc19iYWNrdXAgKmhyOworCWludCBpOworCWhyID0gY29yZV9pZi0+aHJfYmFja3VwOworCisJaWYgKCFocikgeworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnLCBoci0+aGNmZ19sb2NhbCk7CisJLy9pZiAoIXJlc2V0KQorCS8veworCS8vICAgICAgRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZmlyLCBoci0+aGZpcl9sb2NhbCk7CisJLy99CisKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3MtPmhhaW50bXNrLAorCQkJaHItPmhhaW50bXNrX2xvY2FsKTsKKwlmb3IgKGkgPSAwOyBpIDwgZHdjX290Z19nZXRfcGFyYW1faG9zdF9jaGFubmVscyhjb3JlX2lmKTsgKytpKSB7CisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+aG9zdF9pZi0+aGNfcmVnc1tpXS0+aGNpbnRtc2ssCisJCQkJaHItPmhjaW50bXNrX2xvY2FsW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJlc3RvcmVfbHBtX2kyY19yZWdzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlzdHJ1Y3QgZHdjX290Z19nbG9iYWxfcmVnc19iYWNrdXAgKmdyOworCisJZ3IgPSBjb3JlX2lmLT5ncl9iYWNrdXA7CisKKwkvKiBSZXN0b3JlIHZhbHVlcyBmb3IgTFBNIGFuZCBJMkMgKi8KKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbHBtY2ZnLCBnci0+Z2xwbWNmZ19sb2NhbCk7CisjZW5kaWYKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpMmNjdGwsIGdyLT5naTJjY3RsX2xvY2FsKTsKKworCXJldHVybiAwOworfQorCitpbnQgcmVzdG9yZV9lc3NlbnRpYWxfcmVncyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludCBybW9kZSwgaW50IGlzX2hvc3QpCit7CisJc3RydWN0IGR3Y19vdGdfZ2xvYmFsX3JlZ3NfYmFja3VwICpncjsKKwlwY2djY3RsX2RhdGFfdCBwY2djY3RsID0gey5kMzIgPSAwIH07CisJZ2FoYmNmZ19kYXRhX3QgZ2FoYmNmZyA9IHsuZDMyID0gMCB9OworCWd1c2JjZmdfZGF0YV90IGd1c2JjZmcgPSB7LmQzMiA9IDAgfTsKKwlnaW50bXNrX2RhdGFfdCBnaW50bXNrID0gey5kMzIgPSAwIH07CisKKwkvKiBSZXN0b3JlIExQTSBhbmQgSTJDIHJlZ2lzdGVycyAqLworCXJlc3RvcmVfbHBtX2kyY19yZWdzKGNvcmVfaWYpOworCisJLyogU2V0IFBDR0NDVEwgdG8gMCAqLworCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCAweDAwMDAwMDAwKTsKKworCWdyID0gY29yZV9pZi0+Z3JfYmFja3VwOworCS8qIExvYWQgcmVzdG9yZSB2YWx1ZXMgZm9yIFszMToxNF0gYml0cyAqLworCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5wY2djY3RsLAorCQkJKChnci0+cGNnY2N0bF9sb2NhbCAmIDB4ZmZmZmMwMDApIHwgMHgwMDAyMDAwMCkpOworCisJLyogVW1uYXNrIGdsb2JhbCBJbnRlcnJ1cHQgaW4gR0FIQkNGRyBhbmQgcmVzdG9yZSBpdCAqLworCWdhaGJjZmcuZDMyID0gZ3ItPmdhaGJjZmdfbG9jYWw7CisJZ2FoYmNmZy5iLmdsYmxpbnRybXNrID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdhaGJjZmcsIGdhaGJjZmcuZDMyKTsKKworCS8qIENsZWFyIGFsbCBwZW5kaW5nIGludGVydXB0cyAqLworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgMHhGRkZGRkZGRik7CisKKwkvKiBVbm1hc2sgcmVzdG9yZSBkb25lIGludGVycnVwdCAqLworCWdpbnRtc2suYi5yZXN0b3JlZG9uZSA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLCBnaW50bXNrLmQzMik7CisKKwkvKiBSZXN0b3JlIEdVU0JDRkcgYW5kIEhDRkcvRENGRyAqLworCWd1c2JjZmcuZDMyID0gY29yZV9pZi0+Z3JfYmFja3VwLT5ndXNiY2ZnX2xvY2FsOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3VzYmNmZywgZ3VzYmNmZy5kMzIpOworCisJaWYgKGlzX2hvc3QpIHsKKwkJaGNmZ19kYXRhX3QgaGNmZyA9IHsuZDMyID0gMCB9OworCQloY2ZnLmQzMiA9IGNvcmVfaWYtPmhyX2JhY2t1cC0+aGNmZ19sb2NhbDsKKwkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnLAorCQkJCWhjZmcuZDMyKTsKKworCQkvKiBMb2FkIHJlc3RvcmUgdmFsdWVzIGZvciBbMzE6MTRdIGJpdHMgKi8KKwkJcGNnY2N0bC5kMzIgPSBnci0+cGNnY2N0bF9sb2NhbCAmIDB4ZmZmZmMwMDA7CisJCXBjZ2NjdGwuZDMyID0gZ3ItPnBjZ2NjdGxfbG9jYWwgfCAweDAwMDIwMDAwOworCisJCWlmIChybW9kZSkKKwkJCXBjZ2NjdGwuYi5yZXN0b3JlbW9kZSA9IDE7CisJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCBwY2djY3RsLmQzMik7CisJCWR3Y191ZGVsYXkoMTApOworCisJCS8qIExvYWQgcmVzdG9yZSB2YWx1ZXMgZm9yIFszMToxNF0gYml0cyBhbmQgc2V0IEVzc1JlZ1Jlc3RvcmVkIGJpdCAqLworCQlwY2djY3RsLmQzMiA9IGdyLT5wY2djY3RsX2xvY2FsIHwgMHhmZmZmYzAwMDsKKwkJcGNnY2N0bC5kMzIgPSBnci0+cGNnY2N0bF9sb2NhbCAmIDB4ZmZmZmMwMDA7CisJCXBjZ2NjdGwuYi5lc3NfcmVnX3Jlc3RvcmVkID0gMTsKKwkJaWYgKHJtb2RlKQorCQkJcGNnY2N0bC5iLnJlc3RvcmVtb2RlID0gMTsKKwkJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIHBjZ2NjdGwuZDMyKTsKKwl9IGVsc2UgeworCQlkY2ZnX2RhdGFfdCBkY2ZnID0gey5kMzIgPSAwIH07CisJCWRjZmcuZDMyID0gY29yZV9pZi0+ZHJfYmFja3VwLT5kY2ZnOworCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY2ZnLCBkY2ZnLmQzMik7CisKKwkJLyogTG9hZCByZXN0b3JlIHZhbHVlcyBmb3IgWzMxOjE0XSBiaXRzICovCisJCXBjZ2NjdGwuZDMyID0gZ3ItPnBjZ2NjdGxfbG9jYWwgJiAweGZmZmZjMDAwOworCQlwY2djY3RsLmQzMiA9IGdyLT5wY2djY3RsX2xvY2FsIHwgMHgwMDAyMDAwMDsKKwkJaWYgKCFybW9kZSkgeworCQkJcGNnY2N0bC5kMzIgfD0gMHgyMDg7CisJCX0KKwkJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIHBjZ2NjdGwuZDMyKTsKKwkJZHdjX3VkZWxheSgxMCk7CisKKwkJLyogTG9hZCByZXN0b3JlIHZhbHVlcyBmb3IgWzMxOjE0XSBiaXRzICovCisJCXBjZ2NjdGwuZDMyID0gZ3ItPnBjZ2NjdGxfbG9jYWwgJiAweGZmZmZjMDAwOworCQlwY2djY3RsLmQzMiA9IGdyLT5wY2djY3RsX2xvY2FsIHwgMHgwMDAyMDAwMDsKKwkJcGNnY2N0bC5iLmVzc19yZWdfcmVzdG9yZWQgPSAxOworCQlpZiAoIXJtb2RlKQorCQkJcGNnY2N0bC5kMzIgfD0gMHgyMDg7CisJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCBwY2djY3RsLmQzMik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIEZTTFNQQ2xrU2VsIGZpZWxkIG9mIHRoZSBIQ0ZHIHJlZ2lzdGVyIGRlcGVuZGluZyBvbiB0aGUgUEhZCisgKiB0eXBlLgorICovCitzdGF0aWMgdm9pZCBpbml0X2ZzbHNwY2xrc2VsKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwl1aW50MzJfdCB2YWw7CisJaGNmZ19kYXRhX3QgaGNmZzsKKworCWlmICgoKGNvcmVfaWYtPmh3Y2ZnMi5iLmhzX3BoeV90eXBlID09IDIpICYmCisJICAgICAoY29yZV9pZi0+aHdjZmcyLmIuZnNfcGh5X3R5cGUgPT0gMSkgJiYKKwkgICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+dWxwaV9mc19scykpIHx8CisJICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cGh5X3R5cGUgPT0gRFdDX1BIWV9UWVBFX1BBUkFNX0ZTKSkgeworCQkvKiBGdWxsIHNwZWVkIFBIWSAqLworCQl2YWwgPSBEV0NfSENGR180OF9NSFo7CisJfSBlbHNlIHsKKwkJLyogSGlnaCBzcGVlZCBQSFkgcnVubmluZyBhdCBmdWxsIHNwZWVkIG9yIGhpZ2ggc3BlZWQgKi8KKwkJdmFsID0gRFdDX0hDRkdfMzBfNjBfTUhaOworCX0KKworCURXQ19ERUJVR1BMKERCR19DSUwsICJJbml0aWFsaXppbmcgSENGRy5GU0xTUENsa1NlbCB0byAweCUxeFxuIiwgdmFsKTsKKwloY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnKTsKKwloY2ZnLmIuZnNsc3BjbGtzZWwgPSB2YWw7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnLCBoY2ZnLmQzMik7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZXMgdGhlIERldlNwZCBmaWVsZCBvZiB0aGUgRENGRyByZWdpc3RlciBkZXBlbmRpbmcgb24gdGhlIFBIWSB0eXBlCisgKiBhbmQgdGhlIGVudW1lcmF0aW9uIHNwZWVkIG9mIHRoZSBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfZGV2c3BkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwl1aW50MzJfdCB2YWw7CisJZGNmZ19kYXRhX3QgZGNmZzsKKworCWlmICgoKGNvcmVfaWYtPmh3Y2ZnMi5iLmhzX3BoeV90eXBlID09IDIpICYmCisJICAgICAoY29yZV9pZi0+aHdjZmcyLmIuZnNfcGh5X3R5cGUgPT0gMSkgJiYKKwkgICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+dWxwaV9mc19scykpIHx8CisJICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cGh5X3R5cGUgPT0gRFdDX1BIWV9UWVBFX1BBUkFNX0ZTKSkgeworCQkvKiBGdWxsIHNwZWVkIFBIWSAqLworCQl2YWwgPSAweDM7CisJfSBlbHNlIGlmIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+c3BlZWQgPT0gRFdDX1NQRUVEX1BBUkFNX0ZVTEwpIHsKKwkJLyogSGlnaCBzcGVlZCBQSFkgcnVubmluZyBhdCBmdWxsIHNwZWVkICovCisJCXZhbCA9IDB4MTsKKwl9IGVsc2UgeworCQkvKiBIaWdoIHNwZWVkIFBIWSBydW5uaW5nIGF0IGhpZ2ggc3BlZWQgKi8KKwkJdmFsID0gMHgwOworCX0KKworCURXQ19ERUJVR1BMKERCR19DSUwsICJJbml0aWFsaXppbmcgRENGRy5EZXZTcGQgdG8gMHglMXhcbiIsIHZhbCk7CisKKwlkY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGNmZyk7CisJZGNmZy5iLmRldnNwZCA9IHZhbDsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY2ZnLCBkY2ZnLmQzMik7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgSU4gRVBTCisgKiB1c2luZyBHSFdDRkcxIGFuZCBHSFdDRkcyIHJlZ2lzdGVycyB2YWx1ZXMKKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqLworc3RhdGljIHVpbnQzMl90IGNhbGNfbnVtX2luX2Vwcyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJdWludDMyX3QgbnVtX2luX2VwcyA9IDA7CisJdWludDMyX3QgbnVtX2VwcyA9IGNvcmVfaWYtPmh3Y2ZnMi5iLm51bV9kZXZfZXA7CisJdWludDMyX3QgaHdjZmcxID0gY29yZV9pZi0+aHdjZmcxLmQzMiA+PiAzOworCXVpbnQzMl90IG51bV90eF9maWZvcyA9IGNvcmVfaWYtPmh3Y2ZnNC5iLm51bV9pbl9lcHM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VwczsgKytpKSB7CisJCWlmICghKGh3Y2ZnMSAmIDB4MSkpCisJCQludW1faW5fZXBzKys7CisKKwkJaHdjZmcxID4+PSAyOworCX0KKworCWlmIChjb3JlX2lmLT5od2NmZzQuYi5kZWRfZmlmb19lbikgeworCQludW1faW5fZXBzID0KKwkJICAgIChudW1faW5fZXBzID4gbnVtX3R4X2ZpZm9zKSA/IG51bV90eF9maWZvcyA6IG51bV9pbl9lcHM7CisJfQorCisJcmV0dXJuIG51bV9pbl9lcHM7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgT1VUIEVQUworICogdXNpbmcgR0hXQ0ZHMSBhbmQgR0hXQ0ZHMiByZWdpc3RlcnMgdmFsdWVzCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiB0aGUgRFdDX290ZyBjb250cm9sbGVyCisgKi8KK3N0YXRpYyB1aW50MzJfdCBjYWxjX251bV9vdXRfZXBzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwl1aW50MzJfdCBudW1fb3V0X2VwcyA9IDA7CisJdWludDMyX3QgbnVtX2VwcyA9IGNvcmVfaWYtPmh3Y2ZnMi5iLm51bV9kZXZfZXA7CisJdWludDMyX3QgaHdjZmcxID0gY29yZV9pZi0+aHdjZmcxLmQzMiA+PiAyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9lcHM7ICsraSkgeworCQlpZiAoIShod2NmZzEgJiAweDEpKQorCQkJbnVtX291dF9lcHMrKzsKKworCQlod2NmZzEgPj49IDI7CisJfQorCXJldHVybiBudW1fb3V0X2VwczsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGFuZAorICogcHJlcGFyZXMgdGhlIGNvcmUgZm9yIGRldmljZSBtb2RlIG9yIGhvc3QgbW9kZSBvcGVyYXRpb24uCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiB0aGUgRFdDX290ZyBjb250cm9sbGVyCisgKgorICovCit2b2lkIGR3Y19vdGdfY29yZV9pbml0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpbnQgaSA9IDA7CisJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzID0gY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWYgPSBjb3JlX2lmLT5kZXZfaWY7CisJZ2FoYmNmZ19kYXRhX3QgYWhiY2ZnID0gey5kMzIgPSAwIH07CisJZ3VzYmNmZ19kYXRhX3QgdXNiY2ZnID0gey5kMzIgPSAwIH07CisJZ2kyY2N0bF9kYXRhX3QgaTJjY3RsID0gey5kMzIgPSAwIH07CisKKwlEV0NfREVCVUdQTChEQkdfQ0lMViwgImR3Y19vdGdfY29yZV9pbml0KCVwKVxuIiwgY29yZV9pZik7CisKKwkvKiBDb21tb24gSW5pdGlhbGl6YXRpb24gKi8KKwl1c2JjZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5ndXNiY2ZnKTsKKworCS8qIFByb2dyYW0gdGhlIFVMUEkgRXh0ZXJuYWwgVkJVUyBiaXQgaWYgbmVlZGVkICovCisJdXNiY2ZnLmIudWxwaV9leHRfdmJ1c19kcnYgPQorCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPnBoeV91bHBpX2V4dF92YnVzID09CisJICAgICBEV0NfUEhZX1VMUElfRVhURVJOQUxfVkJVUykgPyAxIDogMDsKKworCS8qIFNldCBleHRlcm5hbCBUUyBEbGluZSBwdWxzaW5nICovCisJdXNiY2ZnLmIudGVybV9zZWxfZGxfcHVsc2UgPQorCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPnRzX2RsaW5lID09IDEpID8gMSA6IDA7CisJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3VzYmNmZywgdXNiY2ZnLmQzMik7CisKKwkvKiBSZXNldCB0aGUgQ29udHJvbGxlciAqLworCWR3Y19vdGdfY29yZV9yZXNldChjb3JlX2lmKTsKKworCWNvcmVfaWYtPmFkcF9lbmFibGUgPSBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+YWRwX3N1cHBfZW5hYmxlOworCWNvcmVfaWYtPnBvd2VyX2Rvd24gPSBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cG93ZXJfZG93bjsKKwljb3JlX2lmLT5vdGdfc3RzID0gMDsKKworCS8qIEluaXRpYWxpemUgcGFyYW1ldGVycyBmcm9tIEhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAqLworCWRldl9pZi0+bnVtX2luX2VwcyA9IGNhbGNfbnVtX2luX2Vwcyhjb3JlX2lmKTsKKwlkZXZfaWYtPm51bV9vdXRfZXBzID0gY2FsY19udW1fb3V0X2Vwcyhjb3JlX2lmKTsKKworCURXQ19ERUJVR1BMKERCR19DSUwsICJudW1fZGV2X3BlcmlvX2luX2VwPSVkXG4iLAorCQkgICAgY29yZV9pZi0+aHdjZmc0LmIubnVtX2Rldl9wZXJpb19pbl9lcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29yZV9pZi0+aHdjZmc0LmIubnVtX2Rldl9wZXJpb19pbl9lcDsgaSsrKSB7CisJCWRldl9pZi0+cGVyaW9fdHhfZmlmb19zaXplW2ldID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+ZHR4ZnNpeltpXSkgPj4gMTY7CisJCURXQ19ERUJVR1BMKERCR19DSUwsICJQZXJpb2RpYyBUeCBGSUZPIFNaICMlZD0weCUweFxuIiwKKwkJCSAgICBpLCBkZXZfaWYtPnBlcmlvX3R4X2ZpZm9fc2l6ZVtpXSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvcmVfaWYtPmh3Y2ZnNC5iLm51bV9pbl9lcHM7IGkrKykgeworCQlkZXZfaWYtPnR4X2ZpZm9fc2l6ZVtpXSA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmR0eGZzaXpbaV0pID4+IDE2OworCQlEV0NfREVCVUdQTChEQkdfQ0lMLCAiVHggRklGTyBTWiAjJWQ9MHglMHhcbiIsCisJCQkgICAgaSwgZGV2X2lmLT50eF9maWZvX3NpemVbaV0pOworCX0KKworCWNvcmVfaWYtPnRvdGFsX2ZpZm9fc2l6ZSA9IGNvcmVfaWYtPmh3Y2ZnMy5iLmRmaWZvX2RlcHRoOworCWNvcmVfaWYtPnJ4X2ZpZm9fc2l6ZSA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3J4ZnNpeik7CisJY29yZV9pZi0+bnBlcmlvX3R4X2ZpZm9fc2l6ZSA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhmc2l6KSA+PiAxNjsKKworCURXQ19ERUJVR1BMKERCR19DSUwsICJUb3RhbCBGSUZPIFNaPSVkXG4iLCBjb3JlX2lmLT50b3RhbF9maWZvX3NpemUpOworCURXQ19ERUJVR1BMKERCR19DSUwsICJSeCBGSUZPIFNaPSVkXG4iLCBjb3JlX2lmLT5yeF9maWZvX3NpemUpOworCURXQ19ERUJVR1BMKERCR19DSUwsICJOUCBUeCBGSUZPIFNaPSVkXG4iLAorCQkgICAgY29yZV9pZi0+bnBlcmlvX3R4X2ZpZm9fc2l6ZSk7CisKKwkvKiBUaGlzIHByb2dyYW1taW5nIHNlcXVlbmNlIG5lZWRzIHRvIGhhcHBlbiBpbiBGUyBtb2RlIGJlZm9yZSBhbnkgb3RoZXIKKwkgKiBwcm9ncmFtbWluZyBvY2N1cnMgKi8KKwlpZiAoKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5zcGVlZCA9PSBEV0NfU1BFRURfUEFSQU1fRlVMTCkgJiYKKwkgICAgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5waHlfdHlwZSA9PSBEV0NfUEhZX1RZUEVfUEFSQU1fRlMpKSB7CisJCS8qIElmIEZTIG1vZGUgd2l0aCBGUyBQSFkgKi8KKworCQkvKiBjb3JlX2luaXQoKSBpcyBub3cgY2FsbGVkIG9uIGV2ZXJ5IHN3aXRjaCBzbyBvbmx5IGNhbGwgdGhlCisJCSAqIGZvbGxvd2luZyBmb3IgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaC4gKi8KKwkJaWYgKCFjb3JlX2lmLT5waHlfaW5pdF9kb25lKSB7CisJCQljb3JlX2lmLT5waHlfaW5pdF9kb25lID0gMTsKKwkJCURXQ19ERUJVR1BMKERCR19DSUwsICJGU19QSFkgZGV0ZWN0ZWRcbiIpOworCQkJdXNiY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3VzYmNmZyk7CisJCQl1c2JjZmcuYi5waHlzZWwgPSAxOworCQkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3VzYmNmZywgdXNiY2ZnLmQzMik7CisKKwkJCS8qIFJlc2V0IGFmdGVyIGEgUEhZIHNlbGVjdCAqLworCQkJZHdjX290Z19jb3JlX3Jlc2V0KGNvcmVfaWYpOworCQl9CisKKwkJLyogUHJvZ3JhbSBEQ0ZHLkRldlNwZCBvciBIQ0ZHLkZTTFNQY2xrU2VsIHRvIDQ4TWh6IGluIEZTLiAgICAgIEFsc28KKwkJICogZG8gdGhpcyBvbiBITlAgRGV2L0hvc3QgbW9kZSBzd2l0Y2hlcyAoZG9uZSBpbiBkZXZfaW5pdCBhbmQKKwkJICogaG9zdF9pbml0KS4gKi8KKwkJaWYgKGR3Y19vdGdfaXNfaG9zdF9tb2RlKGNvcmVfaWYpKSB7CisJCQlpbml0X2ZzbHNwY2xrc2VsKGNvcmVfaWYpOworCQl9IGVsc2UgeworCQkJaW5pdF9kZXZzcGQoY29yZV9pZik7CisJCX0KKworCQlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmkyY19lbmFibGUpIHsKKwkJCURXQ19ERUJVR1BMKERCR19DSUwsICJGU19QSFkgRW5hYmxpbmcgSTJjXG4iKTsKKwkJCS8qIFByb2dyYW0gR1VTQkNGRy5PdGdVdG1pZnNTZWwgdG8gSTJDICovCisJCQl1c2JjZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5ndXNiY2ZnKTsKKwkJCXVzYmNmZy5iLm90Z3V0bWlmc3NlbCA9IDE7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5ndXNiY2ZnLCB1c2JjZmcuZDMyKTsKKworCQkJLyogUHJvZ3JhbSBHSTJDQ1RMLkkyQ0VuICovCisJCQlpMmNjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5naTJjY3RsKTsKKwkJCWkyY2N0bC5iLmkyY2RldmFkZHIgPSAxOworCQkJaTJjY3RsLmIuaTJjZW4gPSAwOworCQkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2kyY2N0bCwgaTJjY3RsLmQzMik7CisJCQlpMmNjdGwuYi5pMmNlbiA9IDE7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naTJjY3RsLCBpMmNjdGwuZDMyKTsKKwkJfQorCisJfSAvKiBlbmRpZiBzcGVlZCA9PSBEV0NfU1BFRURfUEFSQU1fRlVMTCAqLworCWVsc2UgeworCQkvKiBIaWdoIHNwZWVkIFBIWS4gKi8KKwkJaWYgKCFjb3JlX2lmLT5waHlfaW5pdF9kb25lKSB7CisJCQljb3JlX2lmLT5waHlfaW5pdF9kb25lID0gMTsKKwkJCS8qIEhTIFBIWSBwYXJhbWV0ZXJzLiAgVGhlc2UgcGFyYW1ldGVycyBhcmUgcHJlc2VydmVkCisJCQkgKiBkdXJpbmcgc29mdCByZXNldCBzbyBvbmx5IHByb2dyYW0gdGhlIGZpcnN0IHRpbWUuICBEbworCQkJICogYSBzb2Z0IHJlc2V0IGltbWVkaWF0ZWx5IGFmdGVyIHNldHRpbmcgcGh5aWYuICAqLworCisJCQlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPnBoeV90eXBlID09IDIpIHsKKwkJCQkvKiBVTFBJIGludGVyZmFjZSAqLworCQkJCXVzYmNmZy5iLnVscGlfdXRtaV9zZWwgPSAxOworCQkJCXVzYmNmZy5iLnBoeWlmID0gMDsKKwkJCQl1c2JjZmcuYi5kZHJzZWwgPQorCQkJCSAgICBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cGh5X3VscGlfZGRyOworCQkJfSBlbHNlIGlmIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cGh5X3R5cGUgPT0gMSkgeworCQkJCS8qIFVUTUkrIGludGVyZmFjZSAqLworCQkJCXVzYmNmZy5iLnVscGlfdXRtaV9zZWwgPSAwOworCQkJCWlmIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cGh5X3V0bWlfd2lkdGggPT0gMTYpIHsKKwkJCQkJdXNiY2ZnLmIucGh5aWYgPSAxOworCisJCQkJfSBlbHNlIHsKKwkJCQkJdXNiY2ZnLmIucGh5aWYgPSAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJRFdDX0VSUk9SKCJGUyBQSFkgVFlQRVxuIik7CisJCQl9CisJCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5ndXNiY2ZnLCB1c2JjZmcuZDMyKTsKKwkJCS8qIFJlc2V0IGFmdGVyIHNldHRpbmcgdGhlIFBIWSBwYXJhbWV0ZXJzICovCisJCQlkd2Nfb3RnX2NvcmVfcmVzZXQoY29yZV9pZik7CisJCX0KKwl9CisKKwlpZiAoKGNvcmVfaWYtPmh3Y2ZnMi5iLmhzX3BoeV90eXBlID09IDIpICYmCisJICAgIChjb3JlX2lmLT5od2NmZzIuYi5mc19waHlfdHlwZSA9PSAxKSAmJgorCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPnVscGlfZnNfbHMpKSB7CisJCURXQ19ERUJVR1BMKERCR19DSUwsICJTZXR0aW5nIFVMUEkgRlNMU1xuIik7CisJCXVzYmNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmd1c2JjZmcpOworCQl1c2JjZmcuYi51bHBpX2ZzbHMgPSAxOworCQl1c2JjZmcuYi51bHBpX2Nsa19zdXNfbSA9IDE7CisJCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmd1c2JjZmcsIHVzYmNmZy5kMzIpOworCX0gZWxzZSB7CisJCXVzYmNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmd1c2JjZmcpOworCQl1c2JjZmcuYi51bHBpX2ZzbHMgPSAwOworCQl1c2JjZmcuYi51bHBpX2Nsa19zdXNfbSA9IDA7CisJCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmd1c2JjZmcsIHVzYmNmZy5kMzIpOworCX0KKworCS8qIFByb2dyYW0gdGhlIEdBSEJDRkcgUmVnaXN0ZXIuICovCisJc3dpdGNoIChjb3JlX2lmLT5od2NmZzIuYi5hcmNoaXRlY3R1cmUpIHsKKworCWNhc2UgRFdDX1NMQVZFX09OTFlfQVJDSDoKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIlNsYXZlIE9ubHkgTW9kZVxuIik7CisJCWFoYmNmZy5iLm5wdHhmZW1wbHZsX3R4ZmVtcGx2bCA9CisJCSAgICBEV0NfR0FIQkNGR19UWEZFTVBUWUxWTF9IQUxGRU1QVFk7CisJCWFoYmNmZy5iLnB0eGZlbXBsdmwgPSBEV0NfR0FIQkNGR19UWEZFTVBUWUxWTF9IQUxGRU1QVFk7CisJCWNvcmVfaWYtPmRtYV9lbmFibGUgPSAwOworCQljb3JlX2lmLT5kbWFfZGVzY19lbmFibGUgPSAwOworCQlicmVhazsKKworCWNhc2UgRFdDX0VYVF9ETUFfQVJDSDoKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIkV4dGVybmFsIERNQSBNb2RlXG4iKTsKKwkJeworCQkJdWludDhfdCBicnN0X3N6ID0gY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRtYV9idXJzdF9zaXplOworCQkJYWhiY2ZnLmIuaGJ1cnN0bGVuID0gMDsKKwkJCXdoaWxlIChicnN0X3N6ID4gMSkgeworCQkJCWFoYmNmZy5iLmhidXJzdGxlbisrOworCQkJCWJyc3Rfc3ogPj49IDE7CisJCQl9CisJCX0KKwkJY29yZV9pZi0+ZG1hX2VuYWJsZSA9IChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZG1hX2VuYWJsZSAhPSAwKTsKKwkJY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlID0KKwkJICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZG1hX2Rlc2NfZW5hYmxlICE9IDApOworCQlicmVhazsKKworCWNhc2UgRFdDX0lOVF9ETUFfQVJDSDoKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIkludGVybmFsIERNQSBNb2RlXG4iKTsKKwkJLyogT2xkIHZhbHVlIHdhcyBEV0NfR0FIQkNGR19JTlRfRE1BX0JVUlNUX0lOQ1IgLSBkb25lIGZvcgorCQkgIEhvc3QgbW9kZSBJU09DIGluIGlzc3VlIGZpeCAtIHZhaHJhbWEgKi8KKwkJYWhiY2ZnLmIuaGJ1cnN0bGVuID0gRFdDX0dBSEJDRkdfSU5UX0RNQV9CVVJTVF9JTkNSMTY7CisJCWNvcmVfaWYtPmRtYV9lbmFibGUgPSAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRtYV9lbmFibGUgIT0gMCk7CisJCWNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSA9CisJCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRtYV9kZXNjX2VuYWJsZSAhPSAwKTsKKwkJYnJlYWs7CisKKwl9CisJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJRFdDX1BSSU5URigiVXNpbmcgRGVzY3JpcHRvciBETUEgbW9kZVxuIik7CisJCX0gZWxzZSB7CisJCQlEV0NfUFJJTlRGKCJVc2luZyBCdWZmZXIgRE1BIG1vZGVcbiIpOworCisJCX0KKwl9IGVsc2UgeworCQlEV0NfUFJJTlRGKCJVc2luZyBTbGF2ZSBtb2RlXG4iKTsKKwkJY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlID0gMDsKKwl9CisKKwlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmFoYl9zaW5nbGUpIHsKKwkJYWhiY2ZnLmIuYWhic2luZ2xlID0gMTsKKwl9CisKKwlhaGJjZmcuYi5kbWFlbmFibGUgPSBjb3JlX2lmLT5kbWFfZW5hYmxlOworCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdhaGJjZmcsIGFoYmNmZy5kMzIpOworCisJY29yZV9pZi0+ZW5fbXVsdGlwbGVfdHhfZmlmbyA9IGNvcmVfaWYtPmh3Y2ZnNC5iLmRlZF9maWZvX2VuOworCisJY29yZV9pZi0+cHRpX2VuaF9lbmFibGUgPSBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cHRpX2VuYWJsZSAhPSAwOworCWNvcmVfaWYtPm11bHRpcHJvY19pbnRfZW5hYmxlID0gY29yZV9pZi0+Y29yZV9wYXJhbXMtPm1waV9lbmFibGU7CisJRFdDX1BSSU5URigiUGVyaW9kaWMgVHJhbnNmZXIgSW50ZXJydXB0IEVuaGFuY2VtZW50IC0gJXNcbiIsCisJCSAgICgoY29yZV9pZi0+cHRpX2VuaF9lbmFibGUpID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOworCURXQ19QUklOVEYoIk11bHRpcHJvY2Vzc29yIEludGVycnVwdCBFbmhhbmNlbWVudCAtICVzXG4iLAorCQkgICAoKGNvcmVfaWYtPm11bHRpcHJvY19pbnRfZW5hYmxlKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsKKworCS8qCisJICogUHJvZ3JhbSB0aGUgR1VTQkNGRyByZWdpc3Rlci4KKwkgKi8KKwl1c2JjZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5ndXNiY2ZnKTsKKworCXN3aXRjaCAoY29yZV9pZi0+aHdjZmcyLmIub3BfbW9kZSkgeworCWNhc2UgRFdDX01PREVfSE5QX1NSUF9DQVBBQkxFOgorCQl1c2JjZmcuYi5obnBjYXAgPSAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z19jYXAgPT0KKwkJCQkgICBEV0NfT1RHX0NBUF9QQVJBTV9ITlBfU1JQX0NBUEFCTEUpOworCQl1c2JjZmcuYi5zcnBjYXAgPSAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z19jYXAgIT0KKwkJCQkgICBEV0NfT1RHX0NBUF9QQVJBTV9OT19ITlBfU1JQX0NBUEFCTEUpOworCQlicmVhazsKKworCWNhc2UgRFdDX01PREVfU1JQX09OTFlfQ0FQQUJMRToKKwkJdXNiY2ZnLmIuaG5wY2FwID0gMDsKKwkJdXNiY2ZnLmIuc3JwY2FwID0gKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5vdGdfY2FwICE9CisJCQkJICAgRFdDX09UR19DQVBfUEFSQU1fTk9fSE5QX1NSUF9DQVBBQkxFKTsKKwkJYnJlYWs7CisKKwljYXNlIERXQ19NT0RFX05PX0hOUF9TUlBfQ0FQQUJMRToKKwkJdXNiY2ZnLmIuaG5wY2FwID0gMDsKKwkJdXNiY2ZnLmIuc3JwY2FwID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIERXQ19NT0RFX1NSUF9DQVBBQkxFX0RFVklDRToKKwkJdXNiY2ZnLmIuaG5wY2FwID0gMDsKKwkJdXNiY2ZnLmIuc3JwY2FwID0gKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5vdGdfY2FwICE9CisJCQkJICAgRFdDX09UR19DQVBfUEFSQU1fTk9fSE5QX1NSUF9DQVBBQkxFKTsKKwkJYnJlYWs7CisKKwljYXNlIERXQ19NT0RFX05PX1NSUF9DQVBBQkxFX0RFVklDRToKKwkJdXNiY2ZnLmIuaG5wY2FwID0gMDsKKwkJdXNiY2ZnLmIuc3JwY2FwID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIERXQ19NT0RFX1NSUF9DQVBBQkxFX0hPU1Q6CisJCXVzYmNmZy5iLmhucGNhcCA9IDA7CisJCXVzYmNmZy5iLnNycGNhcCA9IChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+b3RnX2NhcCAhPQorCQkJCSAgIERXQ19PVEdfQ0FQX1BBUkFNX05PX0hOUF9TUlBfQ0FQQUJMRSk7CisJCWJyZWFrOworCisJY2FzZSBEV0NfTU9ERV9OT19TUlBfQ0FQQUJMRV9IT1NUOgorCQl1c2JjZmcuYi5obnBjYXAgPSAwOworCQl1c2JjZmcuYi5zcnBjYXAgPSAwOworCQlicmVhazsKKwl9CisKKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5ndXNiY2ZnLCB1c2JjZmcuZDMyKTsKKworI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmxwbV9lbmFibGUpIHsKKwkJZ2xwbWNmZ19kYXRhX3QgbHBtY2ZnID0gey5kMzIgPSAwIH07CisKKwkJLyogVG8gZW5hYmxlIExQTSBzdXBwb3J0IHNldCBscG1fY2FwX2VuIGJpdCAqLworCQlscG1jZmcuYi5scG1fY2FwX2VuID0gMTsKKworCQkvKiBNYWtlIEFwcEwxUmVzIEFDSyAqLworCQlscG1jZmcuYi5hcHBsX3Jlc3AgPSAxOworCisJCS8qIFJldHJ5IDMgdGltZXMgKi8KKwkJbHBtY2ZnLmIucmV0cnlfY291bnQgPSAzOworCisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdscG1jZmcsCisJCQkJIDAsIGxwbWNmZy5kMzIpOworCisJfQorI2VuZGlmCisJaWYgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5pY191c2JfY2FwKSB7CisJCWd1c2JjZmdfZGF0YV90IGd1c2JjZmcgPSB7LmQzMiA9IDAgfTsKKwkJZ3VzYmNmZy5iLmljX3VzYl9jYXAgPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndXNiY2ZnLAorCQkJCSAwLCBndXNiY2ZnLmQzMik7CisJfQorCXsKKwkJZ290Z2N0bF9kYXRhX3QgZ290Z2N0bCA9IHsuZDMyID0gMCB9OworCQlnb3RnY3RsLmIub3RndmVyID0gY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z192ZXI7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdvdGdjdGwsIDAsCisJCQkJIGdvdGdjdGwuZDMyKTsKKwkJLyogU2V0IE9URyB2ZXJzaW9uIHN1cHBvcnRlZCAqLworCQljb3JlX2lmLT5vdGdfdmVyID0gY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z192ZXI7CisJCURXQ19QUklOVEYoIk9URyBWRVIgUEFSQU06ICVkLCBPVEcgVkVSIEZMQUc6ICVkXG4iLAorCQkJICAgY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z192ZXIsIGNvcmVfaWYtPm90Z192ZXIpOworCX0KKworCisJLyogRW5hYmxlIGNvbW1vbiBpbnRlcnJ1cHRzICovCisJZHdjX290Z19lbmFibGVfY29tbW9uX2ludGVycnVwdHMoY29yZV9pZik7CisKKwkvKiBEbyBkZXZpY2Ugb3IgaG9zdCBpbnRpYWxpemF0aW9uIGJhc2VkIG9uIG1vZGUgZHVyaW5nIFBDRAorCSAqIGFuZCBIQ0QgaW5pdGlhbGl6YXRpb24gICovCisJaWYgKGR3Y19vdGdfaXNfaG9zdF9tb2RlKGNvcmVfaWYpKSB7CisJCURXQ19ERUJVR1BMKERCR19BTlksICJIb3N0IE1vZGVcbiIpOworCQljb3JlX2lmLT5vcF9zdGF0ZSA9IEFfSE9TVDsKKwl9IGVsc2UgeworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiRGV2aWNlIE1vZGVcbiIpOworCQljb3JlX2lmLT5vcF9zdGF0ZSA9IEJfUEVSSVBIRVJBTDsKKyNpZmRlZiBEV0NfREVWSUNFX09OTFkKKwkJZHdjX290Z19jb3JlX2Rldl9pbml0KGNvcmVfaWYpOworI2VuZGlmCisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgRGV2aWNlIG1vZGUgaW50ZXJydXB0cy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlcgorICovCit2b2lkIGR3Y19vdGdfZW5hYmxlX2RldmljZV9pbnRlcnJ1cHRzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKwlkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqZ2xvYmFsX3JlZ3MgPSBjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzOworCisJRFdDX0RFQlVHUEwoREJHX0NJTCwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMuICovCisJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludG1zaywgMCk7CisKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cywgMHhGRkZGRkZGRik7CisKKwkvKiBFbmFibGUgdGhlIGNvbW1vbiBpbnRlcnJ1cHRzICovCisJZHdjX290Z19lbmFibGVfY29tbW9uX2ludGVycnVwdHMoY29yZV9pZik7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCWludHJfbWFzay5iLnVzYnJlc2V0ID0gMTsKKwlpbnRyX21hc2suYi5lbnVtZG9uZSA9IDE7CisJLyogRGlzYWJsZSBEaXNjb25uZWN0IGludGVycnVwdCBpbiBEZXZpY2UgbW9kZSAqLworCWludHJfbWFzay5iLmRpc2Nvbm5lY3QgPSAwOworCisJaWYgKCFjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQlpbnRyX21hc2suYi5pbmVwaW50ciA9IDE7CisJCWludHJfbWFzay5iLm91dGVwaW50ciA9IDE7CisJfQorCisJaW50cl9tYXNrLmIuZXJseXN1c3BlbmQgPSAxOworCisJaWYgKGNvcmVfaWYtPmVuX211bHRpcGxlX3R4X2ZpZm8gPT0gMCkgeworCQlpbnRyX21hc2suYi5lcG1pc21hdGNoID0gMTsKKwl9CisKKwkvL2ludHJfbWFzay5iLmluY29tcGxpc29vdXQgPSAxOworCWludHJfbWFzay5iLmluY29tcGxpc29pbiA9IDE7CisKKy8qIEVuYWJsZSB0aGUgaWdub3JlIGZyYW1lIG51bWJlciBmb3IgSVNPQyB4ZmVycyAtIE1BUyAqLworLyogRGlzYWJsZSB0byBzdXBwb3J0IGhpZ2ggYmFuZHdpdGggSVNPQyB0cmFuc2ZlcnMgLSBtYW51a3ogKi8KKyNpZiAwCisjaWZkZWYgRFdDX1VURV9QRVJfSU8KKwlpZiAoY29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQlpZiAoY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCQlkY3RsX2RhdGFfdCBkY3RsMSA9IHsuZDMyID0gMCB9OworCQkJZGN0bDEuYi5pZnJtbnVtID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT4KKwkJCQkJIGRjdGwsIDAsIGRjdGwxLmQzMik7CisJCQlEV0NfREVCVUcoIi0tLS1FbmFibGVkIElnbm9yZSBmcmFtZSBudW1iZXIgKDB4JTA4eCkiLAorCQkJCSAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJCQkgZGV2X2dsb2JhbF9yZWdzLT5kY3RsKSk7CisJCX0KKwl9CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIERXQ19FTl9JU09DCisJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSA9PSAwKSB7CisJCQlpZiAoY29yZV9pZi0+cHRpX2VuaF9lbmFibGUpIHsKKwkJCQlkY3RsX2RhdGFfdCBkY3RsID0gey5kMzIgPSAwIH07CisJCQkJZGN0bC5iLmlmcm1udW0gPSAxOworCQkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPgorCQkJCQkJIGRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsLAorCQkJCQkJIDAsIGRjdGwuZDMyKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50cl9tYXNrLmIuaW5jb21wbGlzb2luID0gMTsKKwkJCQlpbnRyX21hc2suYi5pbmNvbXBsaXNvb3V0ID0gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWludHJfbWFzay5iLmluY29tcGxpc29pbiA9IDE7CisJCWludHJfbWFzay5iLmluY29tcGxpc29vdXQgPSAxOworCX0KKyNlbmRpZiAvKiBEV0NfRU5fSVNPQyAqLworCisJLyoqIEB0b2RvIE5HUzogU2hvdWxkIHRoaXMgYmUgYSBtb2R1bGUgcGFyYW1ldGVyPyAqLworI2lmZGVmIFVTRV9QRVJJT0RJQ19FUAorCWludHJfbWFzay5iLmlzb291dGRyb3AgPSAxOworCWludHJfbWFzay5iLmVvcGZyYW1lID0gMTsKKwlpbnRyX21hc2suYi5pbmNvbXBsaXNvaW4gPSAxOworCWludHJfbWFzay5iLmluY29tcGxpc29vdXQgPSAxOworI2VuZGlmCisKKwlEV0NfTU9ESUZZX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludG1zaywgaW50cl9tYXNrLmQzMiwgaW50cl9tYXNrLmQzMik7CisKKwlEV0NfREVCVUdQTChEQkdfQ0lMLCAiJXMoKSBnaW50bXNrPSUweFxuIiwgX19mdW5jX18sCisJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRtc2spKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGZvcgorICogZGV2aWNlIG1vZGUuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqCisgKi8KK3ZvaWQgZHdjX290Z19jb3JlX2Rldl9pbml0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpbnQgaTsKKwlkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqZ2xvYmFsX3JlZ3MgPSBjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzOworCWR3Y19vdGdfZGV2X2lmX3QgKmRldl9pZiA9IGNvcmVfaWYtPmRldl9pZjsKKwlkd2Nfb3RnX2NvcmVfcGFyYW1zX3QgKnBhcmFtcyA9IGNvcmVfaWYtPmNvcmVfcGFyYW1zOworCWRjZmdfZGF0YV90IGRjZmcgPSB7LmQzMiA9IDAgfTsKKwlkZXBjdGxfZGF0YV90IGRpZXBjdGwgPSB7LmQzMiA9IDAgfTsKKwlncnN0Y3RsX3QgcmVzZXRjdGwgPSB7LmQzMiA9IDAgfTsKKwl1aW50MzJfdCByeF9maWZvX3NpemU7CisJZmlmb3NpemVfZGF0YV90IG5wdHhmaWZvc2l6ZTsKKwlmaWZvc2l6ZV9kYXRhX3QgdHhmaWZvc2l6ZTsKKwlkdGhyY3RsX2RhdGFfdCBkdGhyY3RsOworCWZpZm9zaXplX2RhdGFfdCBwdHhmaWZvc2l6ZTsKKwl1aW50MTZfdCByeGZzaXosIG5wdHhmc2l6OworCWdkZmlmb2NmZ19kYXRhX3QgZ2RmaWZvY2ZnID0gey5kMzIgPSAwIH07CisJaHdjZmczX2RhdGFfdCBod2NmZzMgPSB7LmQzMiA9IDAgfTsKKworCS8qIFJlc3RhcnQgdGhlIFBoeSBDbG9jayAqLworCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCAwKTsKKworCS8qIERldmljZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisJaW5pdF9kZXZzcGQoY29yZV9pZik7CisJZGNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcpOworCWRjZmcuYi5kZXNjZG1hID0gKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgPyAxIDogMDsKKwlkY2ZnLmIucGVyZnJpbnQgPSBEV0NfRENGR19GUkFNRV9JTlRFUlZBTF84MDsKKwkvKiBFbmFibGUgRGV2aWNlIE9VVCBOQUsgaW4gY2FzZSBvZiBERE1BIG1vZGUqLworCWlmIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGV2X291dF9uYWspIHsKKwkJZGNmZy5iLmVuZGV2b3V0bmFrID0gMTsKKwl9CisKKwlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmNvbnRfb25fYm5hKSB7CisJCWRjdGxfZGF0YV90IGRjdGwgPSB7LmQzMiA9IDAgfTsKKwkJZGN0bC5iLmVuY29udG9uYm5hID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjdGwsIDAsIGRjdGwuZDMyKTsKKwl9CisKKworCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcsIGRjZmcuZDMyKTsKKworCS8qIENvbmZpZ3VyZSBkYXRhIEZJRk8gc2l6ZXMgKi8KKwlpZiAoY29yZV9pZi0+aHdjZmcyLmIuZHluYW1pY19maWZvICYmIHBhcmFtcy0+ZW5hYmxlX2R5bmFtaWNfZmlmbykgeworCQlEV0NfREVCVUdQTChEQkdfQ0lMLCAiVG90YWwgRklGTyBTaXplPSVkXG4iLAorCQkJICAgIGNvcmVfaWYtPnRvdGFsX2ZpZm9fc2l6ZSk7CisJCURXQ19ERUJVR1BMKERCR19DSUwsICJSeCBGSUZPIFNpemU9JWRcbiIsCisJCQkgICAgcGFyYW1zLT5kZXZfcnhfZmlmb19zaXplKTsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIk5QIFR4IEZJRk8gU2l6ZT0lZFxuIiwKKwkJCSAgICBwYXJhbXMtPmRldl9ucGVyaW9fdHhfZmlmb19zaXplKTsKKworCQkvKiBSeCBGSUZPICovCisJCURXQ19ERUJVR1BMKERCR19DSUwsICJpbml0aWFsIGdyeGZzaXo9JTA4eFxuIiwKKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdyeGZzaXopKTsKKworI2lmZGVmIERXQ19VVEVfQ0ZJCisJCWNvcmVfaWYtPnB3cm9uX3J4ZnNpeiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3J4ZnNpeik7CisJCWNvcmVfaWYtPmluaXRfcnhmc2l6ID0gcGFyYW1zLT5kZXZfcnhfZmlmb19zaXplOworI2VuZGlmCisJCXJ4X2ZpZm9fc2l6ZSA9IHBhcmFtcy0+ZGV2X3J4X2ZpZm9fc2l6ZTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3J4ZnNpeiwgcnhfZmlmb19zaXplKTsKKworCQlEV0NfREVCVUdQTChEQkdfQ0lMLCAibmV3IGdyeGZzaXo9JTA4eFxuIiwKKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdyeGZzaXopKTsKKworCQkvKiogU2V0IFBlcmlvZGljIFR4IEZJRk8gTWFzayBhbGwgYml0cyAwICovCisJCWNvcmVfaWYtPnBfdHhfbXNrID0gMDsKKworCQkvKiogU2V0IFR4IEZJRk8gTWFzayBhbGwgYml0cyAwICovCisJCWNvcmVfaWYtPnR4X21zayA9IDA7CisKKwkJaWYgKGNvcmVfaWYtPmVuX211bHRpcGxlX3R4X2ZpZm8gPT0gMCkgeworCQkJLyogTm9uLXBlcmlvZGljIFR4IEZJRk8gKi8KKwkJCURXQ19ERUJVR1BMKERCR19DSUwsICJpbml0aWFsIGducHR4ZnNpej0lMDh4XG4iLAorCQkJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeikpOworCisJCQlucHR4Zmlmb3NpemUuYi5kZXB0aCA9IHBhcmFtcy0+ZGV2X25wZXJpb190eF9maWZvX3NpemU7CisJCQlucHR4Zmlmb3NpemUuYi5zdGFydGFkZHIgPSAweDQwMDsKKworCQkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhmc2l6LAorCQkJCQlucHR4Zmlmb3NpemUuZDMyKTsKKworCQkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIm5ldyBnbnB0eGZzaXo9JTA4eFxuIiwKKwkJCQkgICAgRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nbnB0eGZzaXopKTsKKworCQkJLyoqQHRvZG8gTkdTOiBGaXggUGVyaW9kaWMgRklGTyBTaXppbmchICovCisJCQkvKgorCQkJICogUGVyaW9kaWMgVHggRklGT3MgVGhlc2UgRklGT3MgYXJlIG51bWJlcmVkIGZyb20gMSB0byAxNS4KKwkJCSAqIEluZGV4ZXMgb2YgdGhlIEZJRk8gc2l6ZSBtb2R1bGUgcGFyYW1ldGVycyBpbiB0aGUKKwkJCSAqIGRldl9wZXJpb190eF9maWZvX3NpemUgYXJyYXkgYW5kIHRoZSBGSUZPIHNpemUgcmVnaXN0ZXJzIGluCisJCQkgKiB0aGUgZHB0eGZzaXogYXJyYXkgcnVuIGZyb20gMCB0byAxNC4KKwkJCSAqLworCQkJLyoqIEB0b2RvIEZpbmlzaCBkZWJ1ZyBvZiB0aGlzICovCisJCQlwdHhmaWZvc2l6ZS5iLnN0YXJ0YWRkciA9CisJCQkgICAgbnB0eGZpZm9zaXplLmIuc3RhcnRhZGRyICsgbnB0eGZpZm9zaXplLmIuZGVwdGg7CisJCQlmb3IgKGkgPSAwOyBpIDwgY29yZV9pZi0+aHdjZmc0LmIubnVtX2Rldl9wZXJpb19pbl9lcDsgaSsrKSB7CisJCQkJcHR4Zmlmb3NpemUuYi5kZXB0aCA9CisJCQkJICAgIHBhcmFtcy0+ZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVtpXTsKKwkJCQlEV0NfREVCVUdQTChEQkdfQ0lMLAorCQkJCQkgICAgImluaXRpYWwgZHR4ZnNpelslZF09JTA4eFxuIiwgaSwKKwkJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+ZHR4ZnNpegorCQkJCQkJCSAgIFtpXSkpOworCQkJCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmR0eGZzaXpbaV0sCisJCQkJCQlwdHhmaWZvc2l6ZS5kMzIpOworCQkJCURXQ19ERUJVR1BMKERCR19DSUwsICJuZXcgZHR4ZnNpelslZF09JTA4eFxuIiwKKwkJCQkJICAgIGksCisJCQkJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmR0eGZzaXoKKwkJCQkJCQkgICBbaV0pKTsKKwkJCQlwdHhmaWZvc2l6ZS5iLnN0YXJ0YWRkciArPSBwdHhmaWZvc2l6ZS5iLmRlcHRoOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFR4IEZJRk9zIFRoZXNlIEZJRk9zIGFyZSBudW1iZXJlZCBmcm9tIDEgdG8gMTUuCisJCQkgKiBJbmRleGVzIG9mIHRoZSBGSUZPIHNpemUgbW9kdWxlIHBhcmFtZXRlcnMgaW4gdGhlCisJCQkgKiBkZXZfdHhfZmlmb19zaXplIGFycmF5IGFuZCB0aGUgRklGTyBzaXplIHJlZ2lzdGVycyBpbgorCQkJICogdGhlIGR0eGZzaXogYXJyYXkgcnVuIGZyb20gMCB0byAxNC4KKwkJCSAqLworCisJCQkvKiBOb24tcGVyaW9kaWMgVHggRklGTyAqLworCQkJRFdDX0RFQlVHUEwoREJHX0NJTCwgImluaXRpYWwgZ25wdHhmc2l6PSUwOHhcbiIsCisJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhmc2l6KSk7CisKKyNpZmRlZiBEV0NfVVRFX0NGSQorCQkJY29yZV9pZi0+cHdyb25fZ25wdHhmc2l6ID0KKwkJCSAgICAoRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nbnB0eGZzaXopID4+IDE2KTsKKwkJCWNvcmVfaWYtPmluaXRfZ25wdHhmc2l6ID0KKwkJCSAgICBwYXJhbXMtPmRldl9ucGVyaW9fdHhfZmlmb19zaXplOworI2VuZGlmCisJCQlucHR4Zmlmb3NpemUuYi5kZXB0aCA9IHBhcmFtcy0+ZGV2X25wZXJpb190eF9maWZvX3NpemU7CisJCQlucHR4Zmlmb3NpemUuYi5zdGFydGFkZHIgPSAweDQwMDsKKworCQkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhmc2l6LAorCQkJCQlucHR4Zmlmb3NpemUuZDMyKTsKKworCQkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIm5ldyBnbnB0eGZzaXo9JTA4eFxuIiwKKwkJCQkgICAgRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nbnB0eGZzaXopKTsKKworCQkJdHhmaWZvc2l6ZS5iLnN0YXJ0YWRkciA9CisJCQkgICAgbnB0eGZpZm9zaXplLmIuc3RhcnRhZGRyICsgbnB0eGZpZm9zaXplLmIuZGVwdGg7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5od2NmZzQuYi5udW1faW5fZXBzOyBpKyspIHsKKworCQkJCXR4Zmlmb3NpemUuYi5kZXB0aCA9CisJCQkJICAgIHBhcmFtcy0+ZGV2X3R4X2ZpZm9fc2l6ZVtpXTsKKworCQkJCURXQ19ERUJVR1BMKERCR19DSUwsCisJCQkJCSAgICAiaW5pdGlhbCBkdHhmc2l6WyVkXT0lMDh4XG4iLAorCQkJCQkgICAgaSwKKwkJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+ZHR4ZnNpegorCQkJCQkJCSAgIFtpXSkpOworCisjaWZkZWYgRFdDX1VURV9DRkkKKwkJCQljb3JlX2lmLT5wd3Jvbl90eGZzaXpbaV0gPQorCQkJCSAgICAoRFdDX1JFQURfUkVHMzIKKwkJCQkgICAgICgmZ2xvYmFsX3JlZ3MtPmR0eGZzaXpbaV0pID4+IDE2KTsKKwkJCQljb3JlX2lmLT5pbml0X3R4ZnNpeltpXSA9CisJCQkJICAgIHBhcmFtcy0+ZGV2X3R4X2ZpZm9fc2l6ZVtpXTsKKyNlbmRpZgorCQkJCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmR0eGZzaXpbaV0sCisJCQkJCQl0eGZpZm9zaXplLmQzMik7CisKKwkJCQlEV0NfREVCVUdQTChEQkdfQ0lMLAorCQkJCQkgICAgIm5ldyBkdHhmc2l6WyVkXT0lMDh4XG4iLAorCQkJCQkgICAgaSwKKwkJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+ZHR4ZnNpegorCQkJCQkJCSAgIFtpXSkpOworCisJCQkJdHhmaWZvc2l6ZS5iLnN0YXJ0YWRkciArPSB0eGZpZm9zaXplLmIuZGVwdGg7CisJCQl9CisJCSAgICAgICAgLyogQ2FsY3VsYXRpbmcgREZJRk9DRkcgZm9yIERldmljZSBtb2RlIHRvIGluY2x1ZGUgUnhGSUZPIGFuZCBOUFRYRklGTyAqLworCQkJZ2RmaWZvY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2RmaWZvY2ZnKTsKKwkJCWh3Y2ZnMy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdod2NmZzMpOworCQkJZ2RmaWZvY2ZnLmIuZ2RmaWZvY2ZnID0gKERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2h3Y2ZnMykgPj4gMTYpOworCQkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2RmaWZvY2ZnLCBnZGZpZm9jZmcuZDMyKTsKKwkJCXJ4ZnNpeiA9IChEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdyeGZzaXopICYgMHgwMDAwZmZmZik7CisJCQlucHR4ZnNpeiA9IChEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeikgPj4gMTYpOworCQkJZ2RmaWZvY2ZnLmIuZXBpbmZvYmFzZSA9IHJ4ZnNpeiArIG5wdHhmc2l6OworCQkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2RmaWZvY2ZnLCBnZGZpZm9jZmcuZDMyKTsKKwkJfQorCX0KKworCS8qIEZsdXNoIHRoZSBGSUZPcyAqLworCWR3Y19vdGdfZmx1c2hfdHhfZmlmbyhjb3JlX2lmLCAweDEwKTsJLyogYWxsIFR4IEZJRk9zICovCisJZHdjX290Z19mbHVzaF9yeF9maWZvKGNvcmVfaWYpOworCisJLyogRmx1c2ggdGhlIExlYXJuaW5nIFF1ZXVlLiAqLworCXJlc2V0Y3RsLmIuaW50a25xZmxzaCA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnN0Y3RsLCByZXNldGN0bC5kMzIpOworCisJaWYgKCFjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZW5fbXVsdGlwbGVfdHhfZmlmbyAmJiBjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCWNvcmVfaWYtPnN0YXJ0X3ByZWRpY3QgPSAwOworCQlmb3IgKGkgPSAwOyBpPD0gY29yZV9pZi0+ZGV2X2lmLT5udW1faW5fZXBzOyArK2kpIHsKKwkJCWNvcmVfaWYtPm5leHRlcF9zZXFbaV0gPSAweGZmOwkvLyAweGZmIC0gRVAgbm90IGFjdGl2ZQorCQl9CisJCWNvcmVfaWYtPm5leHRlcF9zZXFbMF0gPSAwOworCQljb3JlX2lmLT5maXJzdF9pbl9uZXh0ZXBfc2VxID0gMDsKKwkJZGllcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzWzBdLT5kaWVwY3RsKTsKKwkJZGllcGN0bC5iLm5leHRlcCA9IDA7CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzWzBdLT5kaWVwY3RsLCBkaWVwY3RsLmQzMik7CisKKwkJLyogVXBkYXRlIElOIEVuZHBvaW50IE1pc21hdGNoIENvdW50IGJ5IGFjdGl2ZSBJTiBOUCBFUCBjb3VudCArIDEgKi8KKwkJZGNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcpOworCQlkY2ZnLmIuZXBtc2NudCA9IDI7CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcsIGRjZmcuZDMyKTsKKworCQlEV0NfREVCVUdQTChEQkdfQ0lMViwiJXMgZmlyc3RfaW5fbmV4dGVwX3NlcT0gJTJkOyBuZXh0ZXBfc2VxW106XG4iLAorCQkJX19mdW5jX18sIGNvcmVfaWYtPmZpcnN0X2luX25leHRlcF9zZXEpOworCQlmb3IgKGk9MDsgaSA8PSBjb3JlX2lmLT5kZXZfaWYtPm51bV9pbl9lcHM7IGkrKykgeworCQkJRFdDX0RFQlVHUEwoREJHX0NJTFYsICIlMmQgIiwgY29yZV9pZi0+bmV4dGVwX3NlcVtpXSk7CisJCX0KKwkJRFdDX0RFQlVHUEwoREJHX0NJTFYsIlxuIik7CisJfQorCisJLyogQ2xlYXIgYWxsIHBlbmRpbmcgRGV2aWNlIEludGVycnVwdHMgKi8KKwkvKiogQHRvZG8gLSBpZiB0aGUgY29uZGl0aW9uIG5lZWRlZCB0byBiZSBjaGVja2VkCisJICogIG9yIGluIGFueSBjYXNlIGFsbCBwZW5kaW5nIGludGVycnV0cHMgc2hvdWxkIGJlIGNsZWFyZWQ/CisgICAgICovCisJaWYgKGNvcmVfaWYtPm11bHRpcHJvY19pbnRfZW5hYmxlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5kZXZfaWYtPm51bV9pbl9lcHM7ICsraSkgeworCQkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPgorCQkJCQlkZXZfZ2xvYmFsX3JlZ3MtPmRpZXBlYWNoaW50bXNrW2ldLCAwKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBjb3JlX2lmLT5kZXZfaWYtPm51bV9vdXRfZXBzOyArK2kpIHsKKwkJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT4KKwkJCQkJZGV2X2dsb2JhbF9yZWdzLT5kb2VwZWFjaGludG1za1tpXSwgMCk7CisJCX0KKworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kZWFjaGludCwgMHhGRkZGRkZGRik7CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRlYWNoaW50bXNrLCAwKTsKKwl9IGVsc2UgeworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kaWVwbXNrLCAwKTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZG9lcG1zaywgMCk7CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRhaW50LCAweEZGRkZGRkZGKTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGFpbnRtc2ssIDApOworCX0KKworCWZvciAoaSA9IDA7IGkgPD0gZGV2X2lmLT5udW1faW5fZXBzOyBpKyspIHsKKwkJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJCWRlcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwY3RsKTsKKwkJaWYgKGRlcGN0bC5iLmVwZW5hKSB7CisJCQlkZXBjdGwuZDMyID0gMDsKKwkJCWRlcGN0bC5iLmVwZGlzID0gMTsKKwkJCWRlcGN0bC5iLnNuYWsgPSAxOworCQl9IGVsc2UgeworCQkJZGVwY3RsLmQzMiA9IDA7CisJCX0KKworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGN0bCwgZGVwY3RsLmQzMik7CisKKwkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbaV0tPmRpZXB0c2l6LCAwKTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbaV0tPmRpZXBkbWEsIDApOworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGludCwgMHhGRik7CisJfQorCisJZm9yIChpID0gMDsgaSA8PSBkZXZfaWYtPm51bV9vdXRfZXBzOyBpKyspIHsKKwkJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJCWRlcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5vdXRfZXBfcmVnc1tpXS0+ZG9lcGN0bCk7CisJCWlmIChkZXBjdGwuYi5lcGVuYSkgeworCQkJZGVwY3RsLmQzMiA9IDA7CisJCQlkZXBjdGwuYi5lcGRpcyA9IDE7CisJCQlkZXBjdGwuYi5zbmFrID0gMTsKKwkJfSBlbHNlIHsKKwkJCWRlcGN0bC5kMzIgPSAwOworCQl9CisKKwkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPm91dF9lcF9yZWdzW2ldLT5kb2VwY3RsLCBkZXBjdGwuZDMyKTsKKworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+b3V0X2VwX3JlZ3NbaV0tPmRvZXB0c2l6LCAwKTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPm91dF9lcF9yZWdzW2ldLT5kb2VwZG1hLCAwKTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPm91dF9lcF9yZWdzW2ldLT5kb2VwaW50LCAweEZGKTsKKwl9CisKKwlpZiAoY29yZV9pZi0+ZW5fbXVsdGlwbGVfdHhfZmlmbyAmJiBjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCWRldl9pZi0+bm9uX2lzb190eF90aHJfZW4gPSBwYXJhbXMtPnRocl9jdGwgJiAweDE7CisJCWRldl9pZi0+aXNvX3R4X3Rocl9lbiA9IChwYXJhbXMtPnRocl9jdGwgPj4gMSkgJiAweDE7CisJCWRldl9pZi0+cnhfdGhyX2VuID0gKHBhcmFtcy0+dGhyX2N0bCA+PiAyKSAmIDB4MTsKKworCQlkZXZfaWYtPnJ4X3Rocl9sZW5ndGggPSBwYXJhbXMtPnJ4X3Rocl9sZW5ndGg7CisJCWRldl9pZi0+dHhfdGhyX2xlbmd0aCA9IHBhcmFtcy0+dHhfdGhyX2xlbmd0aDsKKworCQlkZXZfaWYtPnNldHVwX2Rlc2NfaW5kZXggPSAwOworCisJCWR0aHJjdGwuZDMyID0gMDsKKwkJZHRocmN0bC5iLm5vbl9pc29fdGhyX2VuID0gZGV2X2lmLT5ub25faXNvX3R4X3Rocl9lbjsKKwkJZHRocmN0bC5iLmlzb190aHJfZW4gPSBkZXZfaWYtPmlzb190eF90aHJfZW47CisJCWR0aHJjdGwuYi50eF90aHJfbGVuID0gZGV2X2lmLT50eF90aHJfbGVuZ3RoOworCQlkdGhyY3RsLmIucnhfdGhyX2VuID0gZGV2X2lmLT5yeF90aHJfZW47CisJCWR0aHJjdGwuYi5yeF90aHJfbGVuID0gZGV2X2lmLT5yeF90aHJfbGVuZ3RoOworCQlkdGhyY3RsLmIuYWhiX3Rocl9yYXRpbyA9IHBhcmFtcy0+YWhiX3Rocl9yYXRpbzsKKworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kdGtucXIzX2R0aHJjdGwsCisJCQkJZHRocmN0bC5kMzIpOworCisJCURXQ19ERUJVR1BMKERCR19DSUwsCisJCQkgICAgIk5vbiBJU08gVHggVGhyIC0gJWRcbklTTyBUeCBUaHIgLSAlZFxuUnggVGhyIC0gJWRcblR4IFRociBMZW4gLSAlZFxuUnggVGhyIExlbiAtICVkXG4iLAorCQkJICAgIGR0aHJjdGwuYi5ub25faXNvX3Rocl9lbiwgZHRocmN0bC5iLmlzb190aHJfZW4sCisJCQkgICAgZHRocmN0bC5iLnJ4X3Rocl9lbiwgZHRocmN0bC5iLnR4X3Rocl9sZW4sCisJCQkgICAgZHRocmN0bC5iLnJ4X3Rocl9sZW4pOworCisJfQorCisJZHdjX290Z19lbmFibGVfZGV2aWNlX2ludGVycnVwdHMoY29yZV9pZik7CisKKwl7CisJCWRpZXBtc2tfZGF0YV90IG1zayA9IHsuZDMyID0gMCB9OworCQltc2suYi50eGZpZm91bmRybiA9IDE7CisJCWlmIChjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQkJRFdDX01PRElGWV9SRUczMigmZGV2X2lmLT4KKwkJCQkJIGRldl9nbG9iYWxfcmVncy0+ZGllcGVhY2hpbnRtc2tbMF0sCisJCQkJCSBtc2suZDMyLCBtc2suZDMyKTsKKwkJfSBlbHNlIHsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kaWVwbXNrLAorCQkJCQkgbXNrLmQzMiwgbXNrLmQzMik7CisJCX0KKwl9CisKKwlpZiAoY29yZV9pZi0+bXVsdGlwcm9jX2ludF9lbmFibGUpIHsKKwkJLyogU2V0IE5BSyBvbiBCYWJibGUgKi8KKwkJZGN0bF9kYXRhX3QgZGN0bCA9IHsuZDMyID0gMCB9OworCQlkY3RsLmIubmFrb25iYmxlID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjdGwsIDAsIGRjdGwuZDMyKTsKKwl9CisKKwlpZiAoY29yZV9pZi0+c25wc2lkID49IE9UR19DT1JFX1JFVl8yXzk0YSkgeworCQlkY3RsX2RhdGFfdCBkY3RsID0gey5kMzIgPSAwIH07CisJCWRjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsKTsKKwkJZGN0bC5iLnNmdGRpc2NvbiA9IDA7CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjdGwsIGRjdGwuZDMyKTsKKwl9Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBIb3N0IG1vZGUgaW50ZXJydXB0cy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlcgorICovCit2b2lkIGR3Y19vdGdfZW5hYmxlX2hvc3RfaW50ZXJydXB0cyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzID0gY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKworCURXQ19ERUJVR1BMKERCR19DSUwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzLiAqLworCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIDApOworCisJLyogQ2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzLCAweEZGRkZGRkZGKTsKKworCS8qIEVuYWJsZSB0aGUgY29tbW9uIGludGVycnVwdHMgKi8KKwlkd2Nfb3RnX2VuYWJsZV9jb21tb25faW50ZXJydXB0cyhjb3JlX2lmKTsKKworCS8qCisJICogRW5hYmxlIGhvc3QgbW9kZSBpbnRlcnJ1cHRzIHdpdGhvdXQgZGlzdHVyYmluZyBjb21tb24KKwkgKiBpbnRlcnJ1cHRzLgorCSAqLworCisJaW50cl9tYXNrLmIuZGlzY29ubmVjdCA9IDE7CisJaW50cl9tYXNrLmIucG9ydGludHIgPSAxOworCWludHJfbWFzay5iLmhjaW50ciA9IDE7CisKKwlEV0NfTU9ESUZZX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludG1zaywgaW50cl9tYXNrLmQzMiwgaW50cl9tYXNrLmQzMik7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGUgSG9zdCBNb2RlIGludGVycnVwdHMuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqLwordm9pZCBkd2Nfb3RnX2Rpc2FibGVfaG9zdF9pbnRlcnJ1cHRzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqZ2xvYmFsX3JlZ3MgPSBjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzOworCWdpbnRtc2tfZGF0YV90IGludHJfbWFzayA9IHsuZDMyID0gMCB9OworCisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKgorCSAqIERpc2FibGUgaG9zdCBtb2RlIGludGVycnVwdHMgd2l0aG91dCBkaXN0dXJiaW5nIGNvbW1vbgorCSAqIGludGVycnVwdHMuCisJICovCisJaW50cl9tYXNrLmIuc29maW50ciA9IDE7CisJaW50cl9tYXNrLmIucG9ydGludHIgPSAxOworCWludHJfbWFzay5iLmhjaW50ciA9IDE7CisJaW50cl9tYXNrLmIucHR4ZmVtcHR5ID0gMTsKKwlpbnRyX21hc2suYi5ucHR4ZmVtcHR5ID0gMTsKKworCURXQ19NT0RJRllfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCBpbnRyX21hc2suZDMyLCAwKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgcmVnaXN0ZXJzIGZvcgorICogaG9zdCBtb2RlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZmx1c2hlcyB0aGUgVHggYW5kIFJ4IEZJRk9zIGFuZCBpdCBmbHVzaGVzIGFueSBlbnRyaWVzIGluIHRoZQorICogcmVxdWVzdCBxdWV1ZXMuIEhvc3QgY2hhbm5lbHMgYXJlIHJlc2V0IHRvIGVuc3VyZSB0aGF0IHRoZXkgYXJlIHJlYWR5IGZvcgorICogcGVyZm9ybWluZyB0cmFuc2ZlcnMuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqCisgKi8KK3ZvaWQgZHdjX290Z19jb3JlX2hvc3RfaW5pdChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzID0gY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwlkd2Nfb3RnX2hvc3RfaWZfdCAqaG9zdF9pZiA9IGNvcmVfaWYtPmhvc3RfaWY7CisJZHdjX290Z19jb3JlX3BhcmFtc190ICpwYXJhbXMgPSBjb3JlX2lmLT5jb3JlX3BhcmFtczsKKwlocHJ0MF9kYXRhX3QgaHBydDAgPSB7LmQzMiA9IDAgfTsKKwlmaWZvc2l6ZV9kYXRhX3QgbnB0eGZpZm9zaXplOworCWZpZm9zaXplX2RhdGFfdCBwdHhmaWZvc2l6ZTsKKwl1aW50MTZfdCByeGZzaXosIG5wdHhmc2l6LCBocHR4ZnNpejsKKwlnZGZpZm9jZmdfZGF0YV90IGdkZmlmb2NmZyA9IHsuZDMyID0gMCB9OworCWludCBpOworCWhjY2hhcl9kYXRhX3QgaGNjaGFyOworCWhjZmdfZGF0YV90IGhjZmc7CisJaGZpcl9kYXRhX3QgaGZpcjsKKwlkd2Nfb3RnX2hjX3JlZ3NfdCAqaGNfcmVnczsKKwlpbnQgbnVtX2NoYW5uZWxzOworCWdvdGdjdGxfZGF0YV90IGdvdGdjdGwgPSB7LmQzMiA9IDAgfTsKKworCURXQ19ERUJVR1BMKERCR19DSUxWLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgY29yZV9pZik7CisKKwkvKiBSZXN0YXJ0IHRoZSBQaHkgQ2xvY2sgKi8KKwlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCwgMCk7CisKKwkvKiBJbml0aWFsaXplIEhvc3QgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCWluaXRfZnNsc3BjbGtzZWwoY29yZV9pZik7CisJaWYgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5zcGVlZCA9PSBEV0NfU1BFRURfUEFSQU1fRlVMTCkgeworCQloY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnKTsKKwkJaGNmZy5iLmZzbHNzdXBwID0gMTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnLCBoY2ZnLmQzMik7CisKKwl9CisKKwkvKiBUaGlzIGJpdCBhbGxvd3MgZHluYW1pYyByZWxvYWRpbmcgb2YgdGhlIEhGSVIgcmVnaXN0ZXIKKwkgKiBkdXJpbmcgcnVudGltZS4gVGhpcyBiaXQgbmVlZHMgdG8gYmUgcHJvZ3JhbW1lZCBkdXJpbmcKKwkgKiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gYW5kIGl0cyB2YWx1ZSBtdXN0IG5vdCBiZSBjaGFuZ2VkCisJICogZHVyaW5nIHJ1bnRpbWUuKi8KKwlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPnJlbG9hZF9jdGwgPT0gMSkgeworCQloZmlyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZmlyKTsKKwkJaGZpci5iLmhmaXJybGRjdHJsID0gMTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZmlyLCBoZmlyLmQzMik7CisJfQorCisJaWYgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJdWludDhfdCBvcF9tb2RlID0gY29yZV9pZi0+aHdjZmcyLmIub3BfbW9kZTsKKwkJaWYgKCEKKwkJICAgIChjb3JlX2lmLT5od2NmZzQuYi5kZXNjX2RtYQorCQkgICAgICYmIChjb3JlX2lmLT5zbnBzaWQgPj0gT1RHX0NPUkVfUkVWXzJfOTBhKQorCQkgICAgICYmICgob3BfbW9kZSA9PSBEV0NfSFdDRkcyX09QX01PREVfSE5QX1NSUF9DQVBBQkxFX09URykKKwkJCSB8fCAob3BfbW9kZSA9PSBEV0NfSFdDRkcyX09QX01PREVfU1JQX09OTFlfQ0FQQUJMRV9PVEcpCisJCQkgfHwgKG9wX21vZGUgPT0KKwkJCSAgICAgRFdDX0hXQ0ZHMl9PUF9NT0RFX05PX0hOUF9TUlBfQ0FQQUJMRV9PVEcpCisJCQkgfHwgKG9wX21vZGUgPT0gRFdDX0hXQ0ZHMl9PUF9NT0RFX1NSUF9DQVBBQkxFX0hPU1QpCisJCQkgfHwgKG9wX21vZGUgPT0KKwkJCSAgICAgRFdDX0hXQ0ZHMl9PUF9NT0RFX05PX1NSUF9DQVBBQkxFX0hPU1QpKSkpIHsKKworCQkJRFdDX0VSUk9SKCJIb3N0IGNhbid0IG9wZXJhdGUgaW4gRGVzY3JpcHRvciBETUEgbW9kZS5cbiIKKwkJCQkgICJFaXRoZXIgY29yZSB2ZXJzaW9uIGlzIGJlbG93IDIuOTBhIG9yICIKKwkJCQkgICJHSFdDRkcyLCBHSFdDRkc0IHJlZ2lzdGVycycgdmFsdWVzIGRvIG5vdCBhbGxvdyBEZXNjcmlwdG9yIERNQSBpbiBob3N0IG1vZGUuXG4iCisJCQkJICAiVG8gcnVuIHRoZSBkcml2ZXIgaW4gQnVmZmVyIERNQSBob3N0IG1vZGUgc2V0IGRtYV9kZXNjX2VuYWJsZSAiCisJCQkJICAibW9kdWxlIHBhcmFtZXRlciB0byAwLlxuIik7CisJCQlyZXR1cm47CisJCX0KKwkJaGNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmaG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGNmZyk7CisJCWhjZmcuYi5kZXNjZG1hID0gMTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnLCBoY2ZnLmQzMik7CisJfQorCisJLyogQ29uZmlndXJlIGRhdGEgRklGTyBzaXplcyAqLworCWlmIChjb3JlX2lmLT5od2NmZzIuYi5keW5hbWljX2ZpZm8gJiYgcGFyYW1zLT5lbmFibGVfZHluYW1pY19maWZvKSB7CisJCURXQ19ERUJVR1BMKERCR19DSUwsICJUb3RhbCBGSUZPIFNpemU9JWRcbiIsCisJCQkgICAgY29yZV9pZi0+dG90YWxfZmlmb19zaXplKTsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIlJ4IEZJRk8gU2l6ZT0lZFxuIiwKKwkJCSAgICBwYXJhbXMtPmhvc3RfcnhfZmlmb19zaXplKTsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIk5QIFR4IEZJRk8gU2l6ZT0lZFxuIiwKKwkJCSAgICBwYXJhbXMtPmhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSk7CisJCURXQ19ERUJVR1BMKERCR19DSUwsICJQIFR4IEZJRk8gU2l6ZT0lZFxuIiwKKwkJCSAgICBwYXJhbXMtPmhvc3RfcGVyaW9fdHhfZmlmb19zaXplKTsKKworCQkvKiBSeCBGSUZPICovCisJCURXQ19ERUJVR1BMKERCR19DSUwsICJpbml0aWFsIGdyeGZzaXo9JTA4eFxuIiwKKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdyeGZzaXopKTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3J4ZnNpeiwKKwkJCQlwYXJhbXMtPmhvc3RfcnhfZmlmb19zaXplKTsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIm5ldyBncnhmc2l6PSUwOHhcbiIsCisJCQkgICAgRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5ncnhmc2l6KSk7CisKKwkJLyogTm9uLXBlcmlvZGljIFR4IEZJRk8gKi8KKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgImluaXRpYWwgZ25wdHhmc2l6PSUwOHhcbiIsCisJCQkgICAgRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nbnB0eGZzaXopKTsKKwkJbnB0eGZpZm9zaXplLmIuZGVwdGggPSBwYXJhbXMtPmhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKKwkJbnB0eGZpZm9zaXplLmIuc3RhcnRhZGRyID0gMHg0MDA7CisKKwkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhmc2l6LCBucHR4Zmlmb3NpemUuZDMyKTsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIm5ldyBnbnB0eGZzaXo9JTA4eFxuIiwKKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeikpOworCisJCS8qIFBlcmlvZGljIFR4IEZJRk8gKi8KKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgImluaXRpYWwgaHB0eGZzaXo9JTA4eFxuIiwKKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmhwdHhmc2l6KSk7CisJCXB0eGZpZm9zaXplLmIuZGVwdGggPSBwYXJhbXMtPmhvc3RfcGVyaW9fdHhfZmlmb19zaXplOworCQlwdHhmaWZvc2l6ZS5iLnN0YXJ0YWRkciA9IDB4QzAwOworCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5ocHR4ZnNpeiwgcHR4Zmlmb3NpemUuZDMyKTsKKwkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIm5ldyBocHR4ZnNpej0lMDh4XG4iLAorCQkJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+aHB0eGZzaXopKTsKKworCQlpZiAoY29yZV9pZi0+ZW5fbXVsdGlwbGVfdHhfZmlmbykgeworCQkJLyogR2xvYmFsIERGSUZPQ0ZHIGNhbGN1bGF0aW9uIGZvciBIb3N0IG1vZGUgLSBpbmNsdWRlIFJ4RklGTywgTlBUWEZJRk8gYW5kIEhQVFhGSUZPICovCisJCQlnZGZpZm9jZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nZGZpZm9jZmcpOworCQkJcnhmc2l6ID0gKERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3J4ZnNpeikgJiAweDAwMDBmZmZmKTsKKwkJCW5wdHhmc2l6ID0gKERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhmc2l6KSA+PiAxNik7CisJCQlocHR4ZnNpeiA9IChEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmhwdHhmc2l6KSA+PiAxNik7CisJCQlnZGZpZm9jZmcuYi5lcGluZm9iYXNlID0gcnhmc2l6ICsgbnB0eGZzaXogKyBocHR4ZnNpejsKKwkJCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdkZmlmb2NmZywgZ2RmaWZvY2ZnLmQzMik7CisJCX0KKwl9CisKKwkvKiBUT0RPIC0gY2hlY2sgdGhpcyAqLworCS8qIENsZWFyIEhvc3QgU2V0IEhOUCBFbmFibGUgaW4gdGhlIE9URyBDb250cm9sIFJlZ2lzdGVyICovCisJZ290Z2N0bC5iLmhzdHNldGhucGVuID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZnbG9iYWxfcmVncy0+Z290Z2N0bCwgZ290Z2N0bC5kMzIsIDApOworCS8qIE1ha2Ugc3VyZSB0aGUgRklGT3MgYXJlIGZsdXNoZWQuICovCisJZHdjX290Z19mbHVzaF90eF9maWZvKGNvcmVfaWYsIDB4MTAgLyogYWxsIFRYIEZJRk9zICovICk7CisJZHdjX290Z19mbHVzaF9yeF9maWZvKGNvcmVfaWYpOworCisJLyogQ2xlYXIgSG9zdCBTZXQgSE5QIEVuYWJsZSBpbiB0aGUgT1RHIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlnb3RnY3RsLmIuaHN0c2V0aG5wZW4gPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmdsb2JhbF9yZWdzLT5nb3RnY3RsLCBnb3RnY3RsLmQzMiwgMCk7CisKKwlpZiAoIWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJLyogRmx1c2ggb3V0IGFueSBsZWZ0b3ZlciBxdWV1ZWQgcmVxdWVzdHMuICovCisJCW51bV9jaGFubmVscyA9IGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5ob3N0X2NoYW5uZWxzOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fY2hhbm5lbHM7IGkrKykgeworCQkJaGNfcmVncyA9IGNvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbaV07CisJCQloY2NoYXIuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjY2hhcik7CisJCQloY2NoYXIuYi5jaGVuID0gMDsKKwkJCWhjY2hhci5iLmNoZGlzID0gMTsKKwkJCWhjY2hhci5iLmVwZGlyID0gMDsKKwkJCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNjaGFyLCBoY2NoYXIuZDMyKTsKKwkJfQorCisJCS8qIEhhbHQgYWxsIGNoYW5uZWxzIHRvIHB1dCB0aGVtIGludG8gYSBrbm93biBzdGF0ZS4gKi8KKwkJZm9yIChpID0gMDsgaSA8IG51bV9jaGFubmVsczsgaSsrKSB7CisJCQlpbnQgY291bnQgPSAwOworCQkJaGNfcmVncyA9IGNvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbaV07CisJCQloY2NoYXIuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjY2hhcik7CisJCQloY2NoYXIuYi5jaGVuID0gMTsKKwkJCWhjY2hhci5iLmNoZGlzID0gMTsKKwkJCWhjY2hhci5iLmVwZGlyID0gMDsKKwkJCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNjaGFyLCBoY2NoYXIuZDMyKTsKKwkJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiJXM6IEhhbHQgY2hhbm5lbCAlZFxuIiwgX19mdW5jX18sIGkpOworCQkJZG8geworCQkJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwkJCQlpZiAoKytjb3VudCA+IDEwMDApIHsKKwkJCQkJRFdDX0VSUk9SCisJCQkJCSAgICAoIiVzOiBVbmFibGUgdG8gY2xlYXIgaGFsdCBvbiBjaGFubmVsICVkXG4iLAorCQkJCQkgICAgIF9fZnVuY19fLCBpKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWR3Y191ZGVsYXkoMSk7CisJCQl9IHdoaWxlIChoY2NoYXIuYi5jaGVuKTsKKwkJfQorCX0KKworCS8qIFR1cm4gb24gdGhlIHZidXMgcG93ZXIuICovCisJRFdDX1BSSU5URigiSW5pdDogUG9ydCBQb3dlcj8gb3Bfc3RhdGU9JWRcbiIsIGNvcmVfaWYtPm9wX3N0YXRlKTsKKwlpZiAoY29yZV9pZi0+b3Bfc3RhdGUgPT0gQV9IT1NUKSB7CisJCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwkJRFdDX1BSSU5URigiSW5pdDogUG93ZXIgUG9ydCAoJWQpXG4iLCBocHJ0MC5iLnBydHB3cik7CisJCWlmIChocHJ0MC5iLnBydHB3ciA9PSAwKSB7CisJCQlocHJ0MC5iLnBydHB3ciA9IDE7CisJCQlEV0NfV1JJVEVfUkVHMzIoaG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisJCX0KKwl9CisKKwlkd2Nfb3RnX2VuYWJsZV9ob3N0X2ludGVycnVwdHMoY29yZV9pZik7Cit9CisKKy8qKgorICogUHJlcGFyZXMgYSBob3N0IGNoYW5uZWwgZm9yIHRyYW5zZmVycmluZyBwYWNrZXRzIHRvL2Zyb20gYSBzcGVjaWZpYworICogZW5kcG9pbnQuIFRoZSBIQ0NIQVJuIHJlZ2lzdGVyIGlzIHNldCB1cCB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgc3BlY2lmaWVkCisgKiBpbiBfaGMuIEhvc3QgY2hhbm5lbCBpbnRlcnJ1cHRzIHRoYXQgbWF5IG5lZWQgdG8gYmUgc2VydmljZWQgd2hpbGUgdGhpcworICogdHJhbnNmZXIgaXMgaW4gcHJvZ3Jlc3MgYXJlIGVuYWJsZWQuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIKKyAqIEBwYXJhbSBoYyBJbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgaG9zdCBjaGFubmVsCisgKi8KK3ZvaWQgZHdjX290Z19oY19pbml0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgZHdjX2hjX3QgKiBoYykKK3sKKwl1aW50MzJfdCBpbnRyX2VuYWJsZTsKKwloY2ludG1za19kYXRhX3QgaGNfaW50cl9tYXNrOworCWdpbnRtc2tfZGF0YV90IGdpbnRtc2sgPSB7LmQzMiA9IDAgfTsKKwloY2NoYXJfZGF0YV90IGhjY2hhcjsKKwloY3NwbHRfZGF0YV90IGhjc3BsdDsKKworCXVpbnQ4X3QgaGNfbnVtID0gaGMtPmhjX251bTsKKwlkd2Nfb3RnX2hvc3RfaWZfdCAqaG9zdF9pZiA9IGNvcmVfaWYtPmhvc3RfaWY7CisJZHdjX290Z19oY19yZWdzX3QgKmhjX3JlZ3MgPSBob3N0X2lmLT5oY19yZWdzW2hjX251bV07CisKKwkvKiBDbGVhciBvbGQgaW50ZXJydXB0IGNvbmRpdGlvbnMgZm9yIHRoaXMgaG9zdCBjaGFubmVsLiAqLworCWhjX2ludHJfbWFzay5kMzIgPSAweEZGRkZGRkZGOworCWhjX2ludHJfbWFzay5iLnJlc2VydmVkMTRfMzEgPSAwOworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNpbnQsIGhjX2ludHJfbWFzay5kMzIpOworCisJLyogRW5hYmxlIGNoYW5uZWwgaW50ZXJydXB0cyByZXF1aXJlZCBmb3IgdGhpcyB0cmFuc2Zlci4gKi8KKwloY19pbnRyX21hc2suZDMyID0gMDsKKwloY19pbnRyX21hc2suYi5jaGhsdGQgPSAxOworCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCS8qIEZvciBEZXNjcmlwdG9yIERNQSBtb2RlIGNvcmUgaGFsdHMgdGhlIGNoYW5uZWwgb24gQUhCIGVycm9yLiBJbnRlcnJ1cHQgaXMgbm90IHJlcXVpcmVkICovCisJCWlmICghY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKQorCQkJaGNfaW50cl9tYXNrLmIuYWhiZXJyID0gMTsKKwkJZWxzZSB7CisJCQlpZiAoaGMtPmVwX3R5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpCisJCQkJaGNfaW50cl9tYXNrLmIueGZlcmNvbXBsID0gMTsKKwkJfQorCisJCWlmIChoYy0+ZXJyb3Jfc3RhdGUgJiYgIWhjLT5kb19zcGxpdCAmJgorCQkgICAgaGMtPmVwX3R5cGUgIT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJCWhjX2ludHJfbWFzay5iLmFjayA9IDE7CisJCQlpZiAoaGMtPmVwX2lzX2luKSB7CisJCQkJaGNfaW50cl9tYXNrLmIuZGF0YXRnbGVyciA9IDE7CisJCQkJaWYgKGhjLT5lcF90eXBlICE9IERXQ19PVEdfRVBfVFlQRV9JTlRSKSB7CisJCQkJCWhjX2ludHJfbWFzay5iLm5hayA9IDE7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChoYy0+ZXBfdHlwZSkgeworCQljYXNlIERXQ19PVEdfRVBfVFlQRV9DT05UUk9MOgorCQljYXNlIERXQ19PVEdfRVBfVFlQRV9CVUxLOgorCQkJaGNfaW50cl9tYXNrLmIueGZlcmNvbXBsID0gMTsKKwkJCWhjX2ludHJfbWFzay5iLnN0YWxsID0gMTsKKwkJCWhjX2ludHJfbWFzay5iLnhhY3RlcnIgPSAxOworCQkJaGNfaW50cl9tYXNrLmIuZGF0YXRnbGVyciA9IDE7CisJCQlpZiAoaGMtPmVwX2lzX2luKSB7CisJCQkJaGNfaW50cl9tYXNrLmIuYmJsZXJyID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJaGNfaW50cl9tYXNrLmIubmFrID0gMTsKKwkJCQloY19pbnRyX21hc2suYi5ueWV0ID0gMTsKKwkJCQlpZiAoaGMtPmRvX3BpbmcpIHsKKwkJCQkJaGNfaW50cl9tYXNrLmIuYWNrID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChoYy0+ZG9fc3BsaXQpIHsKKwkJCQloY19pbnRyX21hc2suYi5uYWsgPSAxOworCQkJCWlmIChoYy0+Y29tcGxldGVfc3BsaXQpIHsKKwkJCQkJaGNfaW50cl9tYXNrLmIubnlldCA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJaGNfaW50cl9tYXNrLmIuYWNrID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChoYy0+ZXJyb3Jfc3RhdGUpIHsKKwkJCQloY19pbnRyX21hc2suYi5hY2sgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRFdDX09UR19FUF9UWVBFX0lOVFI6CisJCQloY19pbnRyX21hc2suYi54ZmVyY29tcGwgPSAxOworCQkJaGNfaW50cl9tYXNrLmIubmFrID0gMTsKKwkJCWhjX2ludHJfbWFzay5iLnN0YWxsID0gMTsKKwkJCWhjX2ludHJfbWFzay5iLnhhY3RlcnIgPSAxOworCQkJaGNfaW50cl9tYXNrLmIuZGF0YXRnbGVyciA9IDE7CisJCQloY19pbnRyX21hc2suYi5mcm1vdnJ1biA9IDE7CisKKwkJCWlmIChoYy0+ZXBfaXNfaW4pIHsKKwkJCQloY19pbnRyX21hc2suYi5iYmxlcnIgPSAxOworCQkJfQorCQkJaWYgKGhjLT5lcnJvcl9zdGF0ZSkgeworCQkJCWhjX2ludHJfbWFzay5iLmFjayA9IDE7CisJCQl9CisJCQlpZiAoaGMtPmRvX3NwbGl0KSB7CisJCQkJaWYgKGhjLT5jb21wbGV0ZV9zcGxpdCkgeworCQkJCQloY19pbnRyX21hc2suYi5ueWV0ID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQloY19pbnRyX21hc2suYi5hY2sgPSAxOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERXQ19PVEdfRVBfVFlQRV9JU09DOgorCQkJaGNfaW50cl9tYXNrLmIueGZlcmNvbXBsID0gMTsKKwkJCWhjX2ludHJfbWFzay5iLmZybW92cnVuID0gMTsKKwkJCWhjX2ludHJfbWFzay5iLmFjayA9IDE7CisKKwkJCWlmIChoYy0+ZXBfaXNfaW4pIHsKKwkJCQloY19pbnRyX21hc2suYi54YWN0ZXJyID0gMTsKKwkJCQloY19pbnRyX21hc2suYi5iYmxlcnIgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2ludG1zaywgaGNfaW50cl9tYXNrLmQzMik7CisKKwkvKiBFbmFibGUgdGhlIHRvcCBsZXZlbCBob3N0IGNoYW5uZWwgaW50ZXJydXB0LiAqLworCWludHJfZW5hYmxlID0gKDEgPDwgaGNfbnVtKTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oYWludG1zaywgMCwgaW50cl9lbmFibGUpOworCisJLyogTWFrZSBzdXJlIGhvc3QgY2hhbm5lbCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLiAqLworCWdpbnRtc2suYi5oY2ludHIgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIDAsIGdpbnRtc2suZDMyKTsKKworCS8qCisJICogUHJvZ3JhbSB0aGUgSENDSEFSbiByZWdpc3RlciB3aXRoIHRoZSBlbmRwb2ludCBjaGFyYWN0ZXJpc3RpY3MgZm9yCisJICogdGhlIGN1cnJlbnQgdHJhbnNmZXIuCisJICovCisJaGNjaGFyLmQzMiA9IDA7CisJaGNjaGFyLmIuZGV2YWRkciA9IGhjLT5kZXZfYWRkcjsKKwloY2NoYXIuYi5lcG51bSA9IGhjLT5lcF9udW07CisJaGNjaGFyLmIuZXBkaXIgPSBoYy0+ZXBfaXNfaW47CisJaGNjaGFyLmIubHNwZGRldiA9IChoYy0+c3BlZWQgPT0gRFdDX09UR19FUF9TUEVFRF9MT1cpOworCWhjY2hhci5iLmVwdHlwZSA9IGhjLT5lcF90eXBlOworCWhjY2hhci5iLm1wcyA9IGhjLT5tYXhfcGFja2V0OworCisJRFdDX1dSSVRFX1JFRzMyKCZob3N0X2lmLT5oY19yZWdzW2hjX251bV0tPmhjY2hhciwgaGNjaGFyLmQzMik7CisKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiVzOiBDaGFubmVsICVkXG4iLCBfX2Z1bmNfXywgaGMtPmhjX251bSk7CisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIJIERldiBBZGRyOiAlZFxuIiwgaGNjaGFyLmIuZGV2YWRkcik7CisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIJIEVwIE51bTogJWRcbiIsIGhjY2hhci5iLmVwbnVtKTsKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIgkgSXMgSW46ICVkXG4iLCBoY2NoYXIuYi5lcGRpcik7CisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIJIElzIExvdyBTcGVlZDogJWRcbiIsIGhjY2hhci5iLmxzcGRkZXYpOworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiCSBFcCBUeXBlOiAlZFxuIiwgaGNjaGFyLmIuZXB0eXBlKTsKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIgkgTWF4IFBrdDogJWRcbiIsIGhjY2hhci5iLm1wcyk7CisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIJIE11bHRpIENudDogJWRcbiIsIGhjY2hhci5iLm11bHRpY250KTsKKworCS8qCisJICogUHJvZ3JhbSB0aGUgSENTUExJVCByZWdpc3RlciBmb3IgU1BMSVRzCisJICovCisJaGNzcGx0LmQzMiA9IDA7CisJaWYgKGhjLT5kb19zcGxpdCkgeworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIlByb2dyYW1taW5nIEhDICVkIHdpdGggc3BsaXQgLS0+ICVzXG4iLAorCQkJICAgIGhjLT5oY19udW0sCisJCQkgICAgaGMtPmNvbXBsZXRlX3NwbGl0ID8gIkNTUExJVCIgOiAiU1NQTElUIik7CisJCWhjc3BsdC5iLmNvbXBzcGx0ID0gaGMtPmNvbXBsZXRlX3NwbGl0OworCQloY3NwbHQuYi54YWN0cG9zID0gaGMtPnhhY3RfcG9zOworCQloY3NwbHQuYi5odWJhZGRyID0gaGMtPmh1Yl9hZGRyOworCQloY3NwbHQuYi5wcnRhZGRyID0gaGMtPnBvcnRfYWRkcjsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIJICBjb21wIHNwbGl0ICVkXG4iLCBoYy0+Y29tcGxldGVfc3BsaXQpOworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIgkgIHhhY3QgcG9zICVkXG4iLCBoYy0+eGFjdF9wb3MpOworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIgkgIGh1YiBhZGRyICVkXG4iLCBoYy0+aHViX2FkZHIpOworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIgkgIHBvcnQgYWRkciAlZFxuIiwgaGMtPnBvcnRfYWRkcik7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiCSAgaXNfaW4gJWRcbiIsIGhjLT5lcF9pc19pbik7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiCSAgTWF4IFBrdDogJWRcbiIsIGhjY2hhci5iLm1wcyk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiCSAgeGZlcmxlbjogJWRcbiIsIGhjLT54ZmVyX2xlbik7CisJfQorCURXQ19XUklURV9SRUczMigmaG9zdF9pZi0+aGNfcmVnc1toY19udW1dLT5oY3NwbHQsIGhjc3BsdC5kMzIpOworCit9CisKKy8qKgorICogQXR0ZW1wdHMgdG8gaGFsdCBhIGhvc3QgY2hhbm5lbC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4KKyAqIFNsYXZlIG1vZGUgb3IgdG8gYWJvcnQgYSB0cmFuc2ZlciBpbiBlaXRoZXIgU2xhdmUgbW9kZSBvciBETUEgbW9kZS4gVW5kZXIKKyAqIG5vcm1hbCBjaXJjdW1zdGFuY2VzIGluIERNQSBtb2RlLCB0aGUgY29udHJvbGxlciBoYWx0cyB0aGUgY2hhbm5lbCB3aGVuIHRoZQorICogdHJhbnNmZXIgaXMgY29tcGxldGUgb3IgYSBjb25kaXRpb24gb2NjdXJzIHRoYXQgcmVxdWlyZXMgYXBwbGljYXRpb24KKyAqIGludGVydmVudGlvbi4KKyAqCisgKiBJbiBzbGF2ZSBtb2RlLCBjaGVja3MgZm9yIGEgZnJlZSByZXF1ZXN0IHF1ZXVlIGVudHJ5LCB0aGVuIHNldHMgdGhlIENoYW5uZWwKKyAqIEVuYWJsZSBhbmQgQ2hhbm5lbCBEaXNhYmxlIGJpdHMgb2YgdGhlIEhvc3QgQ2hhbm5lbCBDaGFyYWN0ZXJpc3RpY3MKKyAqIHJlZ2lzdGVyIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCB0byBpbnRpYXRlIHRoZSBoYWx0LiBJZiB0aGVyZSBpcyBubyBmcmVlCisgKiByZXF1ZXN0IHF1ZXVlIGVudHJ5LCBzZXRzIG9ubHkgdGhlIENoYW5uZWwgRGlzYWJsZSBiaXQgb2YgdGhlIEhDQ0hBUm4KKyAqIHJlZ2lzdGVyIHRvIGZsdXNoIHJlcXVlc3RzIGZvciB0aGlzIGNoYW5uZWwuIEluIHRoZSBsYXR0ZXIgY2FzZSwgc2V0cyBhCisgKiBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGhvc3QgY2hhbm5lbCBuZWVkcyB0byBiZSBoYWx0ZWQgd2hlbiBhIHJlcXVlc3QKKyAqIHF1ZXVlIHNsb3QgaXMgb3Blbi4KKyAqCisgKiBJbiBETUEgbW9kZSwgYWx3YXlzIHNldHMgdGhlIENoYW5uZWwgRW5hYmxlIGFuZCBDaGFubmVsIERpc2FibGUgYml0cyBvZiB0aGUKKyAqIEhDQ0hBUm4gcmVnaXN0ZXIuIFRoZSBjb250cm9sbGVyIGVuc3VyZXMgdGhlcmUgaXMgc3BhY2UgaW4gdGhlIHJlcXVlc3QKKyAqIHF1ZXVlIGJlZm9yZSBzdWJtaXR0aW5nIHRoZSBoYWx0IHJlcXVlc3QuCisgKgorICogU29tZSB0aW1lIG1heSBlbGFwc2UgYmVmb3JlIHRoZSBjb3JlIGZsdXNoZXMgYW55IHBvc3RlZCByZXF1ZXN0cyBmb3IgdGhpcworICogaG9zdCBjaGFubmVsIGFuZCBoYWx0cy4gVGhlIENoYW5uZWwgSGFsdGVkIGludGVycnVwdCBoYW5kbGVyIGNvbXBsZXRlcyB0aGUKKyAqIGRlYWN0aXZhdGlvbiBvZiB0aGUgaG9zdCBjaGFubmVsLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIENvbnRyb2xsZXIgcmVnaXN0ZXIgaW50ZXJmYWNlLgorICogQHBhcmFtIGhjIEhvc3QgY2hhbm5lbCB0byBoYWx0LgorICogQHBhcmFtIGhhbHRfc3RhdHVzIFJlYXNvbiBmb3IgaGFsdGluZyB0aGUgY2hhbm5lbC4KKyAqLwordm9pZCBkd2Nfb3RnX2hjX2hhbHQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkgICAgIGR3Y19oY190ICogaGMsIGR3Y19vdGdfaGFsdF9zdGF0dXNfZSBoYWx0X3N0YXR1cykKK3sKKwlnbnB0eHN0c19kYXRhX3QgbnB0eHN0czsKKwlocHR4c3RzX2RhdGFfdCBocHR4c3RzOworCWhjY2hhcl9kYXRhX3QgaGNjaGFyOworCWR3Y19vdGdfaGNfcmVnc190ICpoY19yZWdzOworCWR3Y19vdGdfY29yZV9nbG9iYWxfcmVnc190ICpnbG9iYWxfcmVnczsKKwlkd2Nfb3RnX2hvc3RfZ2xvYmFsX3JlZ3NfdCAqaG9zdF9nbG9iYWxfcmVnczsKKworCWhjX3JlZ3MgPSBjb3JlX2lmLT5ob3N0X2lmLT5oY19yZWdzW2hjLT5oY19udW1dOworCWdsb2JhbF9yZWdzID0gY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwlob3N0X2dsb2JhbF9yZWdzID0gY29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVnczsKKworCURXQ19BU1NFUlQoIShoYWx0X3N0YXR1cyA9PSBEV0NfT1RHX0hDX1hGRVJfTk9fSEFMVF9TVEFUVVMpLAorCQkgICAiaGFsdF9zdGF0dXMgPSAlZFxuIiwgaGFsdF9zdGF0dXMpOworCisJaWYgKGhhbHRfc3RhdHVzID09IERXQ19PVEdfSENfWEZFUl9VUkJfREVRVUVVRSB8fAorCSAgICBoYWx0X3N0YXR1cyA9PSBEV0NfT1RHX0hDX1hGRVJfQUhCX0VSUikgeworCQkvKgorCQkgKiBEaXNhYmxlIGFsbCBjaGFubmVsIGludGVycnVwdHMgZXhjZXB0IENoIEhhbHRlZC4gVGhlIFFURAorCQkgKiBhbmQgUUggc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNmZXIgaGFzIGJlZW4gY2xlYXJlZAorCQkgKiAoaW4gdGhlIGNhc2Ugb2YgVVJCX0RFUVVFVUUpLCBzbyB0aGUgY2hhbm5lbCBuZWVkcyB0byBiZQorCQkgKiBzaHV0IGRvd24gY2FyZWZ1bGx5IHRvIHByZXZlbnQgY3Jhc2hlcy4KKwkJICovCisJCWhjaW50bXNrX2RhdGFfdCBoY2ludG1zazsKKwkJaGNpbnRtc2suZDMyID0gMDsKKwkJaGNpbnRtc2suYi5jaGhsdGQgPSAxOworCQlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjaW50bXNrLCBoY2ludG1zay5kMzIpOworCisJCS8qCisJCSAqIE1ha2Ugc3VyZSBubyBvdGhlciBpbnRlcnJ1cHRzIGJlc2lkZXMgaGFsdCBhcmUgY3VycmVudGx5CisJCSAqIHBlbmRpbmcuIEhhbmRsaW5nIGFub3RoZXIgaW50ZXJydXB0IGNvdWxkIGNhdXNlIGEgY3Jhc2ggZHVlCisJCSAqIHRvIHRoZSBRVEQgYW5kIFFIIHN0YXRlLgorCQkgKi8KKwkJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2ludCwgfmhjaW50bXNrLmQzMik7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBoYWx0IHN0YXR1cyBpcyBzZXQgdG8gVVJCX0RFUVVFVUUgb3IgQUhCX0VSUgorCQkgKiBldmVuIGlmIHRoZSBjaGFubmVsIHdhcyBhbHJlYWR5IGhhbHRlZCBmb3Igc29tZSBvdGhlcgorCQkgKiByZWFzb24uCisJCSAqLworCQloYy0+aGFsdF9zdGF0dXMgPSBoYWx0X3N0YXR1czsKKworCQloY2NoYXIuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjY2hhcik7CisJCWlmIChoY2NoYXIuYi5jaGVuID09IDApIHsKKwkJCS8qCisJCQkgKiBUaGUgY2hhbm5lbCBpcyBlaXRoZXIgYWxyZWFkeSBoYWx0ZWQgb3IgaXQgaGFzbid0CisJCQkgKiBzdGFydGVkIHlldC4gSW4gRE1BIG1vZGUsIHRoZSB0cmFuc2ZlciBtYXkgaGFsdCBpZgorCQkJICogaXQgZmluaXNoZXMgbm9ybWFsbHkgb3IgYSBjb25kaXRpb24gb2NjdXJzIHRoYXQKKwkJCSAqIHJlcXVpcmVzIGRyaXZlciBpbnRlcnZlbnRpb24uIERvbid0IHdhbnQgdG8gaGFsdAorCQkJICogdGhlIGNoYW5uZWwgYWdhaW4uIEluIGVpdGhlciBTbGF2ZSBvciBETUEgbW9kZSwKKwkJCSAqIGl0J3MgcG9zc2libGUgdGhhdCB0aGUgdHJhbnNmZXIgaGFzIGJlZW4gYXNzaWduZWQKKwkJCSAqIHRvIGEgY2hhbm5lbCwgYnV0IG5vdCBzdGFydGVkIHlldCB3aGVuIGFuIFVSQiBpcworCQkJICogZGVxdWV1ZWQuIERvbid0IHdhbnQgdG8gaGFsdCBhIGNoYW5uZWwgdGhhdCBoYXNuJ3QKKwkJCSAqIHN0YXJ0ZWQgeWV0LgorCQkJICovCisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKGhjLT5oYWx0X3BlbmRpbmcpIHsKKwkJLyoKKwkJICogQSBoYWx0IGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkIGZvciB0aGlzIGNoYW5uZWwuIFRoaXMgbWlnaHQKKwkJICogaGFwcGVuIHdoZW4gYSB0cmFuc2ZlciBpcyBhYm9ydGVkIGJ5IGEgaGlnaGVyIGxldmVsIGluCisJCSAqIHRoZSBzdGFjay4KKwkJICovCisjaWZkZWYgREVCVUcKKwkJRFdDX1BSSU5URgorCQkgICAgKCIqKiogJXM6IENoYW5uZWwgJWQsIF9oYy0+aGFsdF9wZW5kaW5nIGFscmVhZHkgc2V0ICoqKlxuIiwKKwkJICAgICBfX2Z1bmNfXywgaGMtPmhjX251bSk7CisKKyNlbmRpZgorCQlyZXR1cm47CisJfQorCisJaGNjaGFyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIpOworCisJLyogTm8gbmVlZCB0byBzZXQgdGhlIGJpdCBpbiBERE1BIGZvciBkaXNhYmxpbmcgdGhlIGNoYW5uZWwgKi8KKwkvL1RPRE8gY2hlY2sgaXQgZXZlcnl3aGVyZSBjaGFubmVsIGlzIGRpc2FibGVkCisJaWYgKCFjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZG1hX2Rlc2NfZW5hYmxlKQorCQloY2NoYXIuYi5jaGVuID0gMTsKKwloY2NoYXIuYi5jaGRpcyA9IDE7CisKKwlpZiAoIWNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJLyogQ2hlY2sgZm9yIHNwYWNlIGluIHRoZSByZXF1ZXN0IHF1ZXVlIHRvIGlzc3VlIHRoZSBoYWx0LiAqLworCQlpZiAoaGMtPmVwX3R5cGUgPT0gRFdDX09UR19FUF9UWVBFX0NPTlRST0wgfHwKKwkJICAgIGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9CVUxLKSB7CisJCQlucHR4c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhzdHMpOworCQkJaWYgKG5wdHhzdHMuYi5ucHR4cXNwY2F2YWlsID09IDApIHsKKwkJCQloY2NoYXIuYi5jaGVuID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWhwdHhzdHMuZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmaG9zdF9nbG9iYWxfcmVncy0+aHB0eHN0cyk7CisJCQlpZiAoKGhwdHhzdHMuYi5wdHhxc3BjYXZhaWwgPT0gMCkKKwkJCSAgICB8fCAoY29yZV9pZi0+cXVldWluZ19oaWdoX2JhbmR3aWR0aCkpIHsKKwkJCQloY2NoYXIuYi5jaGVuID0gMDsKKwkJCX0KKwkJfQorCX0KKwlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjY2hhciwgaGNjaGFyLmQzMik7CisKKwloYy0+aGFsdF9zdGF0dXMgPSBoYWx0X3N0YXR1czsKKworCWlmIChoY2NoYXIuYi5jaGVuKSB7CisJCWhjLT5oYWx0X3BlbmRpbmcgPSAxOworCQloYy0+aGFsdF9vbl9xdWV1ZSA9IDA7CisJfSBlbHNlIHsKKwkJaGMtPmhhbHRfb25fcXVldWUgPSAxOworCX0KKworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiJXM6IENoYW5uZWwgJWRcbiIsIF9fZnVuY19fLCBoYy0+aGNfbnVtKTsKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIgkgaGNjaGFyOiAweCUwOHhcbiIsIGhjY2hhci5kMzIpOworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiCSBoYWx0X3BlbmRpbmc6ICVkXG4iLCBoYy0+aGFsdF9wZW5kaW5nKTsKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIgkgaGFsdF9vbl9xdWV1ZTogJWRcbiIsIGhjLT5oYWx0X29uX3F1ZXVlKTsKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIgkgaGFsdF9zdGF0dXM6ICVkXG4iLCBoYy0+aGFsdF9zdGF0dXMpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIENsZWFycyB0aGUgdHJhbnNmZXIgc3RhdGUgZm9yIGEgaG9zdCBjaGFubmVsLiBUaGlzIGZ1bmN0aW9uIGlzIG5vcm1hbGx5CisgKiBjYWxsZWQgYWZ0ZXIgYSB0cmFuc2ZlciBpcyBkb25lIGFuZCB0aGUgaG9zdCBjaGFubmVsIGlzIGJlaW5nIHJlbGVhc2VkLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGhjIElkZW50aWZpZXMgdGhlIGhvc3QgY2hhbm5lbCB0byBjbGVhbiB1cC4KKyAqLwordm9pZCBkd2Nfb3RnX2hjX2NsZWFudXAoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBkd2NfaGNfdCAqIGhjKQoreworCWR3Y19vdGdfaGNfcmVnc190ICpoY19yZWdzOworCisJaGMtPnhmZXJfc3RhcnRlZCA9IDA7CisKKwkvKgorCSAqIENsZWFyIGNoYW5uZWwgaW50ZXJydXB0IGVuYWJsZXMgYW5kIGFueSB1bmhhbmRsZWQgY2hhbm5lbCBpbnRlcnJ1cHQKKwkgKiBjb25kaXRpb25zLgorCSAqLworCWhjX3JlZ3MgPSBjb3JlX2lmLT5ob3N0X2lmLT5oY19yZWdzW2hjLT5oY19udW1dOworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNpbnRtc2ssIDApOworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNpbnQsIDB4RkZGRkZGRkYpOworI2lmZGVmIERFQlVHCisJRFdDX1RJTUVSX0NBTkNFTChjb3JlX2lmLT5oY194ZmVyX3RpbWVyW2hjLT5oY19udW1dKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFNldHMgdGhlIGNoYW5uZWwgcHJvcGVydHkgdGhhdCBpbmRpY2F0ZXMgaW4gd2hpY2ggZnJhbWUgYSBwZXJpb2RpYyB0cmFuc2ZlcgorICogc2hvdWxkIG9jY3VyLiBUaGlzIGlzIGFsd2F5cyBzZXQgdG8gdGhlIF9uZXh0XyBmcmFtZS4gVGhpcyBmdW5jdGlvbiBoYXMgbm8KKyAqIGVmZmVjdCBvbiBub24tcGVyaW9kaWMgdHJhbnNmZXJzLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGhjIElkZW50aWZpZXMgdGhlIGhvc3QgY2hhbm5lbCB0byBzZXQgdXAgYW5kIGl0cyBwcm9wZXJ0aWVzLgorICogQHBhcmFtIGhjY2hhciBDdXJyZW50IHZhbHVlIG9mIHRoZSBIQ0NIQVIgcmVnaXN0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaG9zdAorICogY2hhbm5lbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhjX3NldF9ldmVuX29kZF9mcmFtZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCSBkd2NfaGNfdCAqIGhjLCBoY2NoYXJfZGF0YV90ICogaGNjaGFyKQoreworCWlmIChoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSU5UUiB8fAorCSAgICBoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykgeworCQloZm51bV9kYXRhX3QgaGZudW07CisJCWhmbnVtLmQzMiA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGZudW0pOworCisJCS8qIDEgaWYgX25leHRfIGZyYW1lIGlzIG9kZCwgMCBpZiBpdCdzIGV2ZW4gKi8KKwkJaGNjaGFyLT5iLm9kZGZybSA9IChoZm51bS5iLmZybnVtICYgMHgxKSA/IDAgOiAxOworI2lmZGVmIERFQlVHCisJCWlmIChoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSU5UUiAmJiBoYy0+ZG9fc3BsaXQKKwkJICAgICYmICFoYy0+Y29tcGxldGVfc3BsaXQpIHsKKwkJCXN3aXRjaCAoaGZudW0uYi5mcm51bSAmIDB4NykgeworCQkJY2FzZSA3OgorCQkJCWNvcmVfaWYtPmhmbnVtXzdfc2FtcGxlcysrOworCQkJCWNvcmVfaWYtPmhmbnVtXzdfZnJyZW1fYWNjdW0gKz0gaGZudW0uYi5mcnJlbTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCQljb3JlX2lmLT5oZm51bV8wX3NhbXBsZXMrKzsKKwkJCQljb3JlX2lmLT5oZm51bV8wX2ZycmVtX2FjY3VtICs9IGhmbnVtLmIuZnJyZW07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNvcmVfaWYtPmhmbnVtX290aGVyX3NhbXBsZXMrKzsKKwkJCQljb3JlX2lmLT5oZm51bV9vdGhlcl9mcnJlbV9hY2N1bSArPQorCQkJCSAgICBoZm51bS5iLmZycmVtOworCQkJCWJyZWFrOworCQkJfQorCQl9CisjZW5kaWYKKwl9Cit9CisKKyNpZmRlZiBERUJVRwordm9pZCBoY194ZmVyX3RpbWVvdXQodm9pZCAqcHRyKQoreworCWhjX3hmZXJfaW5mb190ICp4ZmVyX2luZm8gPSBOVUxMOworCWludCBoY19udW0gPSAwOworCisJaWYgKHB0cikKKwkJeGZlcl9pbmZvID0gKGhjX3hmZXJfaW5mb190ICopIHB0cjsKKworCWlmICgheGZlcl9pbmZvLT5oYykgeworCQlEV0NfRVJST1IoInhmZXJfaW5mby0+aGMgPSAlcFxuIiwgeGZlcl9pbmZvLT5oYyk7CisJCXJldHVybjsKKwl9CisKKwloY19udW0gPSB4ZmVyX2luZm8tPmhjLT5oY19udW07CisJRFdDX1dBUk4oIiVzOiB0aW1lb3V0IG9uIGNoYW5uZWwgJWRcbiIsIF9fZnVuY19fLCBoY19udW0pOworCURXQ19XQVJOKCIJc3RhcnRfaGNjaGFyX3ZhbCAweCUwOHhcbiIsCisJCSB4ZmVyX2luZm8tPmNvcmVfaWYtPnN0YXJ0X2hjY2hhcl92YWxbaGNfbnVtXSk7Cit9CisjZW5kaWYKKwordm9pZCBlcF94ZmVyX3RpbWVvdXQodm9pZCAqcHRyKQoreworCWVwX3hmZXJfaW5mb190ICp4ZmVyX2luZm8gPSBOVUxMOworCWludCBlcF9udW0gPSAwOworCWRjdGxfZGF0YV90IGRjdGwgPSB7LmQzMiA9IDAgfTsKKwlnaW50c3RzX2RhdGFfdCBnaW50c3RzID0gey5kMzIgPSAwIH07CisJZ2ludG1za19kYXRhX3QgZ2ludG1zayA9IHsuZDMyID0gMCB9OworCisJaWYgKHB0cikKKwkJeGZlcl9pbmZvID0gKGVwX3hmZXJfaW5mb190ICopIHB0cjsKKworCWlmICgheGZlcl9pbmZvLT5lcCkgeworCQlEV0NfRVJST1IoInhmZXJfaW5mby0+ZXAgPSAlcFxuIiwgeGZlcl9pbmZvLT5lcCk7CisJCXJldHVybjsKKwl9CisKKwllcF9udW0gPSB4ZmVyX2luZm8tPmVwLT5udW07CisJRFdDX1dBUk4oIiVzOiB0aW1lb3V0IG9uIGVuZHBvaXQgJWRcbiIsIF9fZnVuY19fLCBlcF9udW0pOworCS8qIFB1dCB0aGUgc2F0ZSB0byAyIGFzIGl0IHdhcyB0aW1lIG91dGVkICovCisJeGZlcl9pbmZvLT5zdGF0ZSA9IDI7CisKKwlkY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZ4ZmVyX2luZm8tPmNvcmVfaWYtPgorCQlkZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCk7CisJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmeGZlcl9pbmZvLT5jb3JlX2lmLT4KKwkJY29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cyk7CisJZ2ludG1zay5kMzIgPSBEV0NfUkVBRF9SRUczMigmeGZlcl9pbmZvLT5jb3JlX2lmLT4KKwkJY29yZV9nbG9iYWxfcmVncy0+Z2ludG1zayk7CisKKwlpZiAoIWdpbnRtc2suYi5nb3V0bmFrZWZmKSB7CisJCS8qIFVubWFzayBpdCAqLworCQlnaW50bXNrLmIuZ291dG5ha2VmZiA9IDE7CisJCURXQ19XUklURV9SRUczMigmeGZlcl9pbmZvLT5jb3JlX2lmLT4KKwkJCWNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIGdpbnRtc2suZDMyKTsKKworCX0KKworCWlmICghZ2ludHN0cy5iLmdvdXRuYWtlZmYpIHsKKwkJZGN0bC5iLnNnb3V0bmFrID0gMTsKKwl9CisJRFdDX1dSSVRFX1JFRzMyKCZ4ZmVyX2luZm8tPmNvcmVfaWYtPmRldl9pZi0+CisJCWRldl9nbG9iYWxfcmVncy0+ZGN0bCwgZGN0bC5kMzIpOworCit9CisKK3ZvaWQgc2V0X3BpZF9pc29jKGR3Y19oY190ICogaGMpCit7CisJLyogU2V0IHVwIHRoZSBpbml0aWFsIFBJRCBmb3IgdGhlIHRyYW5zZmVyLiAqLworCWlmIChoYy0+c3BlZWQgPT0gRFdDX09UR19FUF9TUEVFRF9ISUdIKSB7CisJCWlmIChoYy0+ZXBfaXNfaW4pIHsKKwkJCWlmIChoYy0+bXVsdGlfY291bnQgPT0gMSkgeworCQkJCWhjLT5kYXRhX3BpZF9zdGFydCA9IERXQ19PVEdfSENfUElEX0RBVEEwOworCQkJfSBlbHNlIGlmIChoYy0+bXVsdGlfY291bnQgPT0gMikgeworCQkJCWhjLT5kYXRhX3BpZF9zdGFydCA9IERXQ19PVEdfSENfUElEX0RBVEExOworCQkJfSBlbHNlIHsKKwkJCQloYy0+ZGF0YV9waWRfc3RhcnQgPSBEV0NfT1RHX0hDX1BJRF9EQVRBMjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChoYy0+bXVsdGlfY291bnQgPT0gMSkgeworCQkJCWhjLT5kYXRhX3BpZF9zdGFydCA9IERXQ19PVEdfSENfUElEX0RBVEEwOworCQkJfSBlbHNlIHsKKwkJCQloYy0+ZGF0YV9waWRfc3RhcnQgPSBEV0NfT1RHX0hDX1BJRF9NREFUQTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWhjLT5kYXRhX3BpZF9zdGFydCA9IERXQ19PVEdfSENfUElEX0RBVEEwOworCX0KK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNldHVwIGZvciBhIGRhdGEgdHJhbnNmZXIgZm9yIGEgaG9zdCBjaGFubmVsIGFuZAorICogc3RhcnRzIHRoZSB0cmFuc2Zlci4gTWF5IGJlIGNhbGxlZCBpbiBlaXRoZXIgU2xhdmUgbW9kZSBvciBETUEgbW9kZS4gSW4KKyAqIFNsYXZlIG1vZGUsIHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHNwYWNlIGluIHRoZQorICogcmVxdWVzdCBxdWV1ZSBhbmQgVHggRGF0YSBGSUZPLgorICoKKyAqIEZvciBhbiBPVVQgdHJhbnNmZXIgaW4gU2xhdmUgbW9kZSwgaXQgbG9hZHMgYSBkYXRhIHBhY2tldCBpbnRvIHRoZQorICogYXBwcm9wcmlhdGUgRklGTy4gSWYgbmVjZXNzYXJ5LCBhZGRpdGlvbmFsIGRhdGEgcGFja2V0cyB3aWxsIGJlIGxvYWRlZCBpbgorICogdGhlIEhvc3QgSVNSLgorICoKKyAqIEZvciBhbiBJTiB0cmFuc2ZlciBpbiBTbGF2ZSBtb2RlLCBhIGRhdGEgcGFja2V0IGlzIHJlcXVlc3RlZC4gVGhlIGRhdGEKKyAqIHBhY2tldHMgYXJlIHVubG9hZGVkIGZyb20gdGhlIFJ4IEZJRk8gaW4gdGhlIEhvc3QgSVNSLiBJZiBuZWNlc3NhcnksCisgKiBhZGRpdGlvbmFsIGRhdGEgcGFja2V0cyBhcmUgcmVxdWVzdGVkIGluIHRoZSBIb3N0IElTUi4KKyAqCisgKiBGb3IgYSBQSU5HIHRyYW5zZmVyIGluIFNsYXZlIG1vZGUsIHRoZSBEbyBQaW5nIGJpdCBpcyBzZXQgaW4gdGhlIEhDVFNJWgorICogcmVnaXN0ZXIgYWxvbmcgd2l0aCBhIHBhY2tldCBjb3VudCBvZiAxIGFuZCB0aGUgY2hhbm5lbCBpcyBlbmFibGVkLiBUaGlzCisgKiBjYXVzZXMgYSBzaW5nbGUgUElORyB0cmFuc2FjdGlvbiB0byBvY2N1ci4gT3RoZXIgZmllbGRzIGluIEhDVFNJWiBhcmUKKyAqIHNpbXBseSBzZXQgdG8gMCBzaW5jZSBubyBkYXRhIHRyYW5zZmVyIG9jY3VycyBpbiB0aGlzIGNhc2UuCisgKgorICogRm9yIGEgUElORyB0cmFuc2ZlciBpbiBETUEgbW9kZSwgdGhlIEhDVFNJWiByZWdpc3RlciBpcyBpbml0aWFsaXplZCB3aXRoCisgKiBhbGwgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIHBlcmZvcm0gdGhlIHN1YnNlcXVlbnQgZGF0YSB0cmFuc2Zlci4gSW4KKyAqIGFkZGl0aW9uLCB0aGUgRG8gUGluZyBiaXQgaXMgc2V0IGluIHRoZSBIQ1RTSVogcmVnaXN0ZXIuIEluIHRoaXMgY2FzZSwgdGhlCisgKiBjb250cm9sbGVyIHBlcmZvcm1zIHRoZSBlbnRpcmUgUElORyBwcm90b2NvbCwgdGhlbiBzdGFydHMgdGhlIGRhdGEKKyAqIHRyYW5zZmVyLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGhjIEluZm9ybWF0aW9uIG5lZWRlZCB0byBpbml0aWFsaXplIHRoZSBob3N0IGNoYW5uZWwuIFRoZSB4ZmVyX2xlbgorICogdmFsdWUgbWF5IGJlIHJlZHVjZWQgdG8gYWNjb21tb2RhdGUgdGhlIG1heCB3aWR0aHMgb2YgdGhlIFhmZXJTaXplIGFuZAorICogUGt0Q250IGZpZWxkcyBpbiB0aGUgSENUU0labiByZWdpc3Rlci4gVGhlIG11bHRpX2NvdW50IHZhbHVlIG1heSBiZSBjaGFuZ2VkCisgKiB0byByZWZsZWN0IHRoZSBmaW5hbCB4ZmVyX2xlbiB2YWx1ZS4KKyAqLwordm9pZCBkd2Nfb3RnX2hjX3N0YXJ0X3RyYW5zZmVyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgZHdjX2hjX3QgKiBoYykKK3sKKwloY2NoYXJfZGF0YV90IGhjY2hhcjsKKwloY3RzaXpfZGF0YV90IGhjdHNpejsKKwl1aW50MTZfdCBudW1fcGFja2V0czsKKwl1aW50MzJfdCBtYXhfaGNfeGZlcl9zaXplID0gY29yZV9pZi0+Y29yZV9wYXJhbXMtPm1heF90cmFuc2Zlcl9zaXplOworCXVpbnQxNl90IG1heF9oY19wa3RfY291bnQgPSBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+bWF4X3BhY2tldF9jb3VudDsKKwlkd2Nfb3RnX2hjX3JlZ3NfdCAqaGNfcmVncyA9IGNvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbaGMtPmhjX251bV07CisKKwloY3RzaXouZDMyID0gMDsKKworCWlmIChoYy0+ZG9fcGluZykgeworCQlpZiAoIWNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJCWR3Y19vdGdfaGNfZG9fcGluZyhjb3JlX2lmLCBoYyk7CisJCQloYy0+eGZlcl9zdGFydGVkID0gMTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWhjdHNpei5iLmRvcG5nID0gMTsKKwkJfQorCX0KKworCWlmIChoYy0+ZG9fc3BsaXQpIHsKKwkJbnVtX3BhY2tldHMgPSAxOworCisJCWlmIChoYy0+Y29tcGxldGVfc3BsaXQgJiYgIWhjLT5lcF9pc19pbikgeworCQkJLyogRm9yIENTUExJVCBPVVQgVHJhbnNmZXIsIHNldCB0aGUgc2l6ZSB0byAwIHNvIHRoZQorCQkJICogY29yZSBkb2Vzbid0IGV4cGVjdCBhbnkgZGF0YSB3cml0dGVuIHRvIHRoZSBGSUZPICovCisJCQloYy0+eGZlcl9sZW4gPSAwOworCQl9IGVsc2UgaWYgKGhjLT5lcF9pc19pbiB8fCAoaGMtPnhmZXJfbGVuID4gaGMtPm1heF9wYWNrZXQpKSB7CisJCQloYy0+eGZlcl9sZW4gPSBoYy0+bWF4X3BhY2tldDsKKwkJfSBlbHNlIGlmICghaGMtPmVwX2lzX2luICYmIChoYy0+eGZlcl9sZW4gPiAxODgpKSB7CisJCQloYy0+eGZlcl9sZW4gPSAxODg7CisJCX0KKworCQloY3RzaXouYi54ZmVyc2l6ZSA9IGhjLT54ZmVyX2xlbjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBFbnN1cmUgdGhhdCB0aGUgdHJhbnNmZXIgbGVuZ3RoIGFuZCBwYWNrZXQgY291bnQgd2lsbCBmaXQKKwkJICogaW4gdGhlIHdpZHRocyBhbGxvY2F0ZWQgZm9yIHRoZW0gaW4gdGhlIEhDVFNJWm4gcmVnaXN0ZXIuCisJCSAqLworCQlpZiAoaGMtPmVwX3R5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lOVFIgfHwKKwkJICAgIGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRoZSB0cmFuc2ZlciBzaXplIGlzIG5vIGxhcmdlciB0aGFuIG9uZQorCQkJICogKG1pY3JvKWZyYW1lJ3Mgd29ydGggb2YgZGF0YS4gKEEgY2hlY2sgd2FzIGRvbmUKKwkJCSAqIHdoZW4gdGhlIHBlcmlvZGljIHRyYW5zZmVyIHdhcyBhY2NlcHRlZCB0byBlbnN1cmUKKwkJCSAqIHRoYXQgYSAobWljcm8pZnJhbWUncyB3b3J0aCBvZiBkYXRhIGNhbiBiZQorCQkJICogcHJvZ3JhbW1lZCBpbnRvIGEgY2hhbm5lbC4pCisJCQkgKi8KKwkJCXVpbnQzMl90IG1heF9wZXJpb2RpY19sZW4gPQorCQkJICAgIGhjLT5tdWx0aV9jb3VudCAqIGhjLT5tYXhfcGFja2V0OworCQkJaWYgKGhjLT54ZmVyX2xlbiA+IG1heF9wZXJpb2RpY19sZW4pIHsKKwkJCQloYy0+eGZlcl9sZW4gPSBtYXhfcGVyaW9kaWNfbGVuOworCQkJfSBlbHNlIHsKKwkJCX0KKwkJfSBlbHNlIGlmIChoYy0+eGZlcl9sZW4gPiBtYXhfaGNfeGZlcl9zaXplKSB7CisJCQkvKiBNYWtlIHN1cmUgdGhhdCB4ZmVyX2xlbiBpcyBhIG11bHRpcGxlIG9mIG1heCBwYWNrZXQgc2l6ZS4gKi8KKwkJCWhjLT54ZmVyX2xlbiA9IG1heF9oY194ZmVyX3NpemUgLSBoYy0+bWF4X3BhY2tldCArIDE7CisJCX0KKworCQlpZiAoaGMtPnhmZXJfbGVuID4gMCkgeworCQkJbnVtX3BhY2tldHMgPQorCQkJICAgIChoYy0+eGZlcl9sZW4gKyBoYy0+bWF4X3BhY2tldCAtCisJCQkgICAgIDEpIC8gaGMtPm1heF9wYWNrZXQ7CisJCQlpZiAobnVtX3BhY2tldHMgPiBtYXhfaGNfcGt0X2NvdW50KSB7CisJCQkJbnVtX3BhY2tldHMgPSBtYXhfaGNfcGt0X2NvdW50OworCQkJCWhjLT54ZmVyX2xlbiA9IG51bV9wYWNrZXRzICogaGMtPm1heF9wYWNrZXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBOZWVkIDEgcGFja2V0IGZvciB0cmFuc2ZlciBsZW5ndGggb2YgMC4gKi8KKwkJCW51bV9wYWNrZXRzID0gMTsKKwkJfQorCisJCWlmIChoYy0+ZXBfaXNfaW4pIHsKKwkJCS8qIEFsd2F5cyBwcm9ncmFtIGFuIGludGVncmFsICMgb2YgbWF4IHBhY2tldHMgZm9yIElOIHRyYW5zZmVycy4gKi8KKwkJCWhjLT54ZmVyX2xlbiA9IG51bV9wYWNrZXRzICogaGMtPm1heF9wYWNrZXQ7CisJCX0KKworCQlpZiAoaGMtPmVwX3R5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lOVFIgfHwKKwkJICAgIGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRoYXQgdGhlIG11bHRpX2NvdW50IGZpZWxkIG1hdGNoZXMgdGhlCisJCQkgKiBhY3R1YWwgdHJhbnNmZXIgbGVuZ3RoLgorCQkJICovCisJCQloYy0+bXVsdGlfY291bnQgPSBudW1fcGFja2V0czsKKwkJfQorCisJCWlmIChoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykKKwkJCXNldF9waWRfaXNvYyhoYyk7CisKKwkJaGN0c2l6LmIueGZlcnNpemUgPSBoYy0+eGZlcl9sZW47CisJfQorCisJaGMtPnN0YXJ0X3BrdF9jb3VudCA9IG51bV9wYWNrZXRzOworCWhjdHNpei5iLnBrdGNudCA9IG51bV9wYWNrZXRzOworCWhjdHNpei5iLnBpZCA9IGhjLT5kYXRhX3BpZF9zdGFydDsKKwlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjdHNpeiwgaGN0c2l6LmQzMik7CisKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiVzOiBDaGFubmVsICVkXG4iLCBfX2Z1bmNfXywgaGMtPmhjX251bSk7CisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIJIFhmZXIgU2l6ZTogJWRcbiIsIGhjdHNpei5iLnhmZXJzaXplKTsKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIgkgTnVtIFBrdHM6ICVkXG4iLCBoY3RzaXouYi5wa3RjbnQpOworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiCSBTdGFydCBQSUQ6ICVkXG4iLCBoY3RzaXouYi5waWQpOworCisJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJZHdjX2RtYV90IGRtYV9hZGRyOworCQlpZiAoaGMtPmFsaWduX2J1ZmYpIHsKKwkJCWRtYV9hZGRyID0gaGMtPmFsaWduX2J1ZmY7CisJCX0gZWxzZSB7CisJCQlkbWFfYWRkciA9ICgodW5zaWduZWQgbG9uZyloYy0+eGZlcl9idWZmICYgMHhmZmZmZmZmZik7CisJCX0KKwkJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2RtYSwgZG1hX2FkZHIpOworCX0KKworCS8qIFN0YXJ0IHRoZSBzcGxpdCAqLworCWlmIChoYy0+ZG9fc3BsaXQpIHsKKwkJaGNzcGx0X2RhdGFfdCBoY3NwbHQ7CisJCWhjc3BsdC5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNzcGx0KTsKKwkJaGNzcGx0LmIuc3BsdGVuYSA9IDE7CisJCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNzcGx0LCBoY3NwbHQuZDMyKTsKKwl9CisKKwloY2NoYXIuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjY2hhcik7CisJaGNjaGFyLmIubXVsdGljbnQgPSBoYy0+bXVsdGlfY291bnQ7CisJaGNfc2V0X2V2ZW5fb2RkX2ZyYW1lKGNvcmVfaWYsIGhjLCAmaGNjaGFyKTsKKyNpZmRlZiBERUJVRworCWNvcmVfaWYtPnN0YXJ0X2hjY2hhcl92YWxbaGMtPmhjX251bV0gPSBoY2NoYXIuZDMyOworCWlmIChoY2NoYXIuYi5jaGRpcykgeworCQlEV0NfV0FSTigiJXM6IGNoZGlzIHNldCwgY2hhbm5lbCAlZCwgaGNjaGFyIDB4JTA4eFxuIiwKKwkJCSBfX2Z1bmNfXywgaGMtPmhjX251bSwgaGNjaGFyLmQzMik7CisJfQorI2VuZGlmCisKKwkvKiBTZXQgaG9zdCBjaGFubmVsIGVuYWJsZSBhZnRlciBhbGwgb3RoZXIgc2V0dXAgaXMgY29tcGxldGUuICovCisJaGNjaGFyLmIuY2hlbiA9IDE7CisJaGNjaGFyLmIuY2hkaXMgPSAwOworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNjaGFyLCBoY2NoYXIuZDMyKTsKKworCWhjLT54ZmVyX3N0YXJ0ZWQgPSAxOworCWhjLT5yZXF1ZXN0cysrOworCisJaWYgKCFjb3JlX2lmLT5kbWFfZW5hYmxlICYmICFoYy0+ZXBfaXNfaW4gJiYgaGMtPnhmZXJfbGVuID4gMCkgeworCQkvKiBMb2FkIE9VVCBwYWNrZXQgaW50byB0aGUgYXBwcm9wcmlhdGUgVHggRklGTy4gKi8KKwkJZHdjX290Z19oY193cml0ZV9wYWNrZXQoY29yZV9pZiwgaGMpOworCX0KKyNpZmRlZiBERUJVRworCWlmIChoYy0+ZXBfdHlwZSAhPSBEV0NfT1RHX0VQX1RZUEVfSU5UUikgeworCQljb3JlX2lmLT5oY194ZmVyX2luZm9baGMtPmhjX251bV0uY29yZV9pZiA9IGNvcmVfaWY7CisJCWNvcmVfaWYtPmhjX3hmZXJfaW5mb1toYy0+aGNfbnVtXS5oYyA9IGhjOworCisJCS8qIFN0YXJ0IGEgdGltZXIgZm9yIHRoaXMgdHJhbnNmZXIuICovCisJCURXQ19USU1FUl9TQ0hFRFVMRShjb3JlX2lmLT5oY194ZmVyX3RpbWVyW2hjLT5oY19udW1dLCAxMDAwMCk7CisJfQorI2VuZGlmCit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzZXR1cCBmb3IgYSBkYXRhIHRyYW5zZmVyIGZvciBhIGhvc3QgY2hhbm5lbAorICogYW5kIHN0YXJ0cyB0aGUgdHJhbnNmZXIgaW4gRGVzY3JpcHRvciBETUEgbW9kZS4KKyAqCisgKiBJbml0aWFsaXplcyBIQ1RTSVogcmVnaXN0ZXIuIEZvciBhIFBJTkcgdHJhbnNmZXIgdGhlIERvIFBpbmcgYml0IGlzIHNldC4KKyAqIFNldHMgUElEIGFuZCBOVEQgdmFsdWVzLiBGb3IgcGVyaW9kaWMgdHJhbnNmZXJzCisgKiBpbml0aWFsaXplcyBTQ0hFRF9JTkZPIGZpZWxkIHdpdGggbWljcm8tZnJhbWUgYml0bWFwLgorICoKKyAqIEluaXRpYWxpemVzIEhDRE1BIHJlZ2lzdGVyIHdpdGggZGVzY3JpcHRvciBsaXN0IGFkZHJlc3MgYW5kIENURCB2YWx1ZQorICogdGhlbiBzdGFydHMgdGhlIHRyYW5zZmVyIHZpYSBlbmFibGluZyB0aGUgY2hhbm5lbC4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBoYyBJbmZvcm1hdGlvbiBuZWVkZWQgdG8gaW5pdGlhbGl6ZSB0aGUgaG9zdCBjaGFubmVsLgorICovCit2b2lkIGR3Y19vdGdfaGNfc3RhcnRfdHJhbnNmZXJfZGRtYShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGR3Y19oY190ICogaGMpCit7CisJZHdjX290Z19oY19yZWdzX3QgKmhjX3JlZ3MgPSBjb3JlX2lmLT5ob3N0X2lmLT5oY19yZWdzW2hjLT5oY19udW1dOworCWhjY2hhcl9kYXRhX3QgaGNjaGFyOworCWhjdHNpel9kYXRhX3QgaGN0c2l6OworCWhjZG1hX2RhdGFfdCBoY2RtYTsKKworCWhjdHNpei5kMzIgPSAwOworCisJaWYgKGhjLT5kb19waW5nKQorCQloY3RzaXouYl9kZG1hLmRvcG5nID0gMTsKKworCWlmIChoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykKKwkJc2V0X3BpZF9pc29jKGhjKTsKKworCS8qIFBhY2tldCBDb3VudCBhbmQgWGZlciBTaXplIGFyZSBub3QgdXNlZCBpbiBEZXNjcmlwdG9yIERNQSBtb2RlICovCisJaGN0c2l6LmJfZGRtYS5waWQgPSBoYy0+ZGF0YV9waWRfc3RhcnQ7CisJaGN0c2l6LmJfZGRtYS5udGQgPSBoYy0+bnRkIC0gMTsJLyogMCAtIDEgZGVzY3JpcHRvciwgMSAtIDIgZGVzY3JpcHRvcnMsIGV0Yy4gKi8KKwloY3RzaXouYl9kZG1hLnNjaGluZm8gPSBoYy0+c2NoaW5mbzsJLyogTm9uLXplcm8gb25seSBmb3IgaGlnaC1zcGVlZCBpbnRlcnJ1cHQgZW5kcG9pbnRzICovCisKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiVzOiBDaGFubmVsICVkXG4iLCBfX2Z1bmNfXywgaGMtPmhjX251bSk7CisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIJIFN0YXJ0IFBJRDogJWRcbiIsIGhjdHNpei5iLnBpZCk7CisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIJIE5URDogJWRcbiIsIGhjdHNpei5iX2RkbWEubnRkKTsKKworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGN0c2l6LCBoY3RzaXouZDMyKTsKKworCWhjZG1hLmQzMiA9IDA7CisJaGNkbWEuYi5kbWFfYWRkciA9ICgodWludDMyX3QpIGhjLT5kZXNjX2xpc3RfYWRkcikgPj4gMTE7CisKKwkvKiBBbHdheXMgc3RhcnQgZnJvbSBmaXJzdCBkZXNjcmlwdG9yLiAqLworCWhjZG1hLmIuY3RkID0gMDsKKwlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjZG1hLCBoY2RtYS5kMzIpOworCisJaGNjaGFyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIpOworCWhjY2hhci5iLm11bHRpY250ID0gaGMtPm11bHRpX2NvdW50OworCisjaWZkZWYgREVCVUcKKwljb3JlX2lmLT5zdGFydF9oY2NoYXJfdmFsW2hjLT5oY19udW1dID0gaGNjaGFyLmQzMjsKKwlpZiAoaGNjaGFyLmIuY2hkaXMpIHsKKwkJRFdDX1dBUk4oIiVzOiBjaGRpcyBzZXQsIGNoYW5uZWwgJWQsIGhjY2hhciAweCUwOHhcbiIsCisJCQkgX19mdW5jX18sIGhjLT5oY19udW0sIGhjY2hhci5kMzIpOworCX0KKyNlbmRpZgorCisJLyogU2V0IGhvc3QgY2hhbm5lbCBlbmFibGUgYWZ0ZXIgYWxsIG90aGVyIHNldHVwIGlzIGNvbXBsZXRlLiAqLworCWhjY2hhci5iLmNoZW4gPSAxOworCWhjY2hhci5iLmNoZGlzID0gMDsKKworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNjaGFyLCBoY2NoYXIuZDMyKTsKKworCWhjLT54ZmVyX3N0YXJ0ZWQgPSAxOworCWhjLT5yZXF1ZXN0cysrOworCisjaWZkZWYgREVCVUcKKwlpZiAoKGhjLT5lcF90eXBlICE9IERXQ19PVEdfRVBfVFlQRV9JTlRSKQorCSAgICAmJiAoaGMtPmVwX3R5cGUgIT0gRFdDX09UR19FUF9UWVBFX0lTT0MpKSB7CisJCWNvcmVfaWYtPmhjX3hmZXJfaW5mb1toYy0+aGNfbnVtXS5jb3JlX2lmID0gY29yZV9pZjsKKwkJY29yZV9pZi0+aGNfeGZlcl9pbmZvW2hjLT5oY19udW1dLmhjID0gaGM7CisJCS8qIFN0YXJ0IGEgdGltZXIgZm9yIHRoaXMgdHJhbnNmZXIuICovCisJCURXQ19USU1FUl9TQ0hFRFVMRShjb3JlX2lmLT5oY194ZmVyX3RpbWVyW2hjLT5oY19udW1dLCAxMDAwMCk7CisJfQorI2VuZGlmCisKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnRpbnVlcyBhIGRhdGEgdHJhbnNmZXIgdGhhdCB3YXMgc3RhcnRlZCBieSBwcmV2aW91cyBjYWxsCisgKiB0byA8Y29kZT5kd2Nfb3RnX2hjX3N0YXJ0X3RyYW5zZmVyPC9jb2RlPi4gVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGVyZSBpcworICogc3VmZmljaWVudCBzcGFjZSBpbiB0aGUgcmVxdWVzdCBxdWV1ZSBhbmQgVHggRGF0YSBGSUZPLiBUaGlzIGZ1bmN0aW9uCisgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gU2xhdmUgbW9kZS4gSW4gRE1BIG1vZGUsIHRoZSBjb250cm9sbGVyIGFjdHMKKyAqIGF1dG9ub21vdXNseSB0byBjb21wbGV0ZSB0cmFuc2ZlcnMgcHJvZ3JhbW1lZCB0byBhIGhvc3QgY2hhbm5lbC4KKyAqCisgKiBGb3IgYW4gT1VUIHRyYW5zZmVyLCBhIG5ldyBkYXRhIHBhY2tldCBpcyBsb2FkZWQgaW50byB0aGUgYXBwcm9wcmlhdGUgRklGTworICogaWYgdGhlcmUgaXMgYW55IGRhdGEgcmVtYWluaW5nIHRvIGJlIHF1ZXVlZC4gRm9yIGFuIElOIHRyYW5zZmVyLCBhbm90aGVyCisgKiBkYXRhIHBhY2tldCBpcyBhbHdheXMgcmVxdWVzdGVkLiBGb3IgdGhlIFNFVFVQIHBoYXNlIG9mIGEgY29udHJvbCB0cmFuc2ZlciwKKyAqIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLgorICoKKyAqIEByZXR1cm4gMSBpZiBhIG5ldyByZXF1ZXN0IGlzIHF1ZXVlZCwgMCBpZiBubyBtb3JlIHJlcXVlc3RzIGFyZSByZXF1aXJlZAorICogZm9yIHRoaXMgdHJhbnNmZXIuCisgKi8KK2ludCBkd2Nfb3RnX2hjX2NvbnRpbnVlX3RyYW5zZmVyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgZHdjX2hjX3QgKiBoYykKK3sKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiVzOiBDaGFubmVsICVkXG4iLCBfX2Z1bmNfXywgaGMtPmhjX251bSk7CisKKwlpZiAoaGMtPmRvX3NwbGl0KSB7CisJCS8qIFNQTElUcyBhbHdheXMgcXVldWUganVzdCBvbmNlIHBlciBjaGFubmVsICovCisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaGMtPmRhdGFfcGlkX3N0YXJ0ID09IERXQ19PVEdfSENfUElEX1NFVFVQKSB7CisJCS8qIFNFVFVQcyBhcmUgcXVldWVkIG9ubHkgb25jZSBzaW5jZSB0aGV5IGNhbid0IGJlIE5BS2VkLiAqLworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGhjLT5lcF9pc19pbikgeworCQkvKgorCQkgKiBBbHdheXMgcXVldWUgYW5vdGhlciByZXF1ZXN0IGZvciBvdGhlciBJTiB0cmFuc2ZlcnMuIElmCisJCSAqIGJhY2stdG8tYmFjayBJTnMgYXJlIGlzc3VlZCBhbmQgTkFLcyBhcmUgcmVjZWl2ZWQgZm9yIGJvdGgsCisJCSAqIHRoZSBkcml2ZXIgbWF5IHN0aWxsIGJlIHByb2Nlc3NpbmcgdGhlIGZpcnN0IE5BSyB3aGVuIHRoZQorCQkgKiBzZWNvbmQgTkFLIGlzIHJlY2VpdmVkLiBXaGVuIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBjbGVhcnMKKwkJICogdGhlIE5BSyBpbnRlcnJ1cHQgZm9yIHRoZSBmaXJzdCBOQUssIHRoZSBzZWNvbmQgTkFLIHdpbGwKKwkJICogbm90IGJlIHNlZW4uIFNvIHdlIGNhbid0IGRlcGVuZCBvbiB0aGUgTkFLIGludGVycnVwdAorCQkgKiBoYW5kbGVyIHRvIHJlcXVldWUgYSBOQUtlZCByZXF1ZXN0LiBJbnN0ZWFkLCBJTiByZXF1ZXN0cworCQkgKiBhcmUgaXNzdWVkIGVhY2ggdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gV2hlbiB0aGUKKwkJICogdHJhbnNmZXIgY29tcGxldGVzLCB0aGUgZXh0cmEgcmVxdWVzdHMgZm9yIHRoZSBjaGFubmVsIHdpbGwKKwkJICogYmUgZmx1c2hlZC4KKwkJICovCisJCWhjY2hhcl9kYXRhX3QgaGNjaGFyOworCQlkd2Nfb3RnX2hjX3JlZ3NfdCAqaGNfcmVncyA9CisJCSAgICBjb3JlX2lmLT5ob3N0X2lmLT5oY19yZWdzW2hjLT5oY19udW1dOworCisJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwkJaGNfc2V0X2V2ZW5fb2RkX2ZyYW1lKGNvcmVfaWYsIGhjLCAmaGNjaGFyKTsKKwkJaGNjaGFyLmIuY2hlbiA9IDE7CisJCWhjY2hhci5iLmNoZGlzID0gMDsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIJIElOIHhmZXI6IGhjY2hhciA9IDB4JTA4eFxuIiwKKwkJCSAgICBoY2NoYXIuZDMyKTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIsIGhjY2hhci5kMzIpOworCQloYy0+cmVxdWVzdHMrKzsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJLyogT1VUIHRyYW5zZmVycy4gKi8KKwkJaWYgKGhjLT54ZmVyX2NvdW50IDwgaGMtPnhmZXJfbGVuKSB7CisJCQlpZiAoaGMtPmVwX3R5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lOVFIgfHwKKwkJCSAgICBoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykgeworCQkJCWhjY2hhcl9kYXRhX3QgaGNjaGFyOworCQkJCWR3Y19vdGdfaGNfcmVnc190ICpoY19yZWdzOworCQkJCWhjX3JlZ3MgPSBjb3JlX2lmLT5ob3N0X2lmLT5oY19yZWdzW2hjLT5oY19udW1dOworCQkJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwkJCQloY19zZXRfZXZlbl9vZGRfZnJhbWUoY29yZV9pZiwgaGMsICZoY2NoYXIpOworCQkJfQorCisJCQkvKiBMb2FkIE9VVCBwYWNrZXQgaW50byB0aGUgYXBwcm9wcmlhdGUgVHggRklGTy4gKi8KKwkJCWR3Y19vdGdfaGNfd3JpdGVfcGFja2V0KGNvcmVfaWYsIGhjKTsKKwkJCWhjLT5yZXF1ZXN0cysrOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KK30KKworLyoqCisgKiBTdGFydHMgYSBQSU5HIHRyYW5zZmVyLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBTbGF2ZSBtb2RlLgorICogVGhlIERvIFBpbmcgYml0IGlzIHNldCBpbiB0aGUgSENUU0laIHJlZ2lzdGVyLCB0aGVuIHRoZSBjaGFubmVsIGlzIGVuYWJsZWQuCisgKi8KK3ZvaWQgZHdjX290Z19oY19kb19waW5nKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgZHdjX2hjX3QgKiBoYykKK3sKKwloY2NoYXJfZGF0YV90IGhjY2hhcjsKKwloY3RzaXpfZGF0YV90IGhjdHNpejsKKwlkd2Nfb3RnX2hjX3JlZ3NfdCAqaGNfcmVncyA9IGNvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbaGMtPmhjX251bV07CisKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiVzOiBDaGFubmVsICVkXG4iLCBfX2Z1bmNfXywgaGMtPmhjX251bSk7CisKKwloY3RzaXouZDMyID0gMDsKKwloY3RzaXouYi5kb3BuZyA9IDE7CisJaGN0c2l6LmIucGt0Y250ID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjdHNpeiwgaGN0c2l6LmQzMik7CisKKwloY2NoYXIuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjY2hhcik7CisJaGNjaGFyLmIuY2hlbiA9IDE7CisJaGNjaGFyLmIuY2hkaXMgPSAwOworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNjaGFyLCBoY2NoYXIuZDMyKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgcGFja2V0IGludG8gdGhlIFR4IEZJRk8gYXNzb2NpYXRlZCB3aXRoIHRoZSBIb3N0CisgKiBDaGFubmVsLiBGb3IgYSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCBhIG5vbi1wZXJpb2RpYyBFUCwgdGhlIG5vbi1wZXJpb2RpYworICogVHggRklGTyBpcyB3cml0dGVuLiBGb3IgYSBjaGFubmVsIGFzc29jaWF0ZWQgd2l0aCBhIHBlcmlvZGljIEVQLCB0aGUKKyAqIHBlcmlvZGljIFR4IEZJRk8gaXMgd3JpdHRlbi4gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gU2xhdmUKKyAqIG1vZGUuCisgKgorICogVXBvbiByZXR1cm4gdGhlIHhmZXJfYnVmZiBhbmQgeGZlcl9jb3VudCBmaWVsZHMgaW4gX2hjIGFyZSBpbmNyZW1lbnRlZCBieQorICogdGhlbiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byB0aGUgVHggRklGTy4KKyAqLwordm9pZCBkd2Nfb3RnX2hjX3dyaXRlX3BhY2tldChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGR3Y19oY190ICogaGMpCit7CisJdWludDMyX3QgaTsKKwl1aW50MzJfdCByZW1haW5pbmdfY291bnQ7CisJdWludDMyX3QgYnl0ZV9jb3VudDsKKwl1aW50MzJfdCBkd29yZF9jb3VudDsKKworCXVpbnQzMl90ICpkYXRhX2J1ZmYgPSAodWludDMyX3QgKikgKGhjLT54ZmVyX2J1ZmYpOworCXVpbnQzMl90ICpkYXRhX2ZpZm8gPSBjb3JlX2lmLT5kYXRhX2ZpZm9baGMtPmhjX251bV07CisKKwlyZW1haW5pbmdfY291bnQgPSBoYy0+eGZlcl9sZW4gLSBoYy0+eGZlcl9jb3VudDsKKwlpZiAocmVtYWluaW5nX2NvdW50ID4gaGMtPm1heF9wYWNrZXQpIHsKKwkJYnl0ZV9jb3VudCA9IGhjLT5tYXhfcGFja2V0OworCX0gZWxzZSB7CisJCWJ5dGVfY291bnQgPSByZW1haW5pbmdfY291bnQ7CisJfQorCisJZHdvcmRfY291bnQgPSAoYnl0ZV9jb3VudCArIDMpIC8gNDsKKworCWlmICgoKCh1bnNpZ25lZCBsb25nKWRhdGFfYnVmZikgJiAweDMpID09IDApIHsKKwkJLyogeGZlcl9idWZmIGlzIERXT1JEIGFsaWduZWQuICovCisJCWZvciAoaSA9IDA7IGkgPCBkd29yZF9jb3VudDsgaSsrLCBkYXRhX2J1ZmYrKykgeworCQkJRFdDX1dSSVRFX1JFRzMyKGRhdGFfZmlmbywgKmRhdGFfYnVmZik7CisJCX0KKwl9IGVsc2UgeworCQkvKiB4ZmVyX2J1ZmYgaXMgbm90IERXT1JEIGFsaWduZWQuICovCisJCWZvciAoaSA9IDA7IGkgPCBkd29yZF9jb3VudDsgaSsrLCBkYXRhX2J1ZmYrKykgeworCQkJdWludDMyX3QgZGF0YTsKKwkJCWRhdGEgPQorCQkJICAgIChkYXRhX2J1ZmZbMF0gfCBkYXRhX2J1ZmZbMV0gPDwgOCB8IGRhdGFfYnVmZlsyXSA8PAorCQkJICAgICAxNiB8IGRhdGFfYnVmZlszXSA8PCAyNCk7CisJCQlEV0NfV1JJVEVfUkVHMzIoZGF0YV9maWZvLCBkYXRhKTsKKwkJfQorCX0KKworCWhjLT54ZmVyX2NvdW50ICs9IGJ5dGVfY291bnQ7CisJaGMtPnhmZXJfYnVmZiArPSBieXRlX2NvdW50OworfQorCisvKioKKyAqIEdldHMgdGhlIGN1cnJlbnQgVVNCIGZyYW1lIG51bWJlci4gVGhpcyBpcyB0aGUgZnJhbWUgbnVtYmVyIGZyb20gdGhlIGxhc3QKKyAqIFNPRiBwYWNrZXQuCisgKi8KK3VpbnQzMl90IGR3Y19vdGdfZ2V0X2ZyYW1lX251bWJlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZHN0c19kYXRhX3QgZHN0czsKKwlkc3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZHN0cyk7CisKKwkvKiByZWFkIGN1cnJlbnQgZnJhbWUvbWljcm9mcmFtZSBudW1iZXIgZnJvbSBEU1RTIHJlZ2lzdGVyICovCisJcmV0dXJuIGRzdHMuYi5zb2ZmbjsKK30KKworLyoqCisgKiBDYWxjdWxhdGVzIGFuZCBnZXRzIHRoZSBmcmFtZSBJbnRlcnZhbCB2YWx1ZSBvZiBIRklSIHJlZ2lzdGVyIGFjY29yZGluZyBQSFkKKyAqIHR5cGUgYW5kIHNwZWVkLlRoZSBhcHBsaWNhdGlvbiBjYW4gbW9kaWZ5IGEgdmFsdWUgb2YgSEZJUiByZWdpc3RlciBvbmx5IGFmdGVyCisgKiB0aGUgUG9ydCBFbmFibGUgYml0IG9mIHRoZSBIb3N0IFBvcnQgQ29udHJvbCBhbmQgU3RhdHVzIHJlZ2lzdGVyCisgKiAoSFBSVC5QcnRFbmFQb3J0KSBoYXMgYmVlbiBzZXQuCisqLworCit1aW50MzJfdCBjYWxjX2ZyYW1lX2ludGVydmFsKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlndXNiY2ZnX2RhdGFfdCB1c2JjZmc7CisJaHdjZmcyX2RhdGFfdCBod2NmZzI7CisJaHBydDBfZGF0YV90IGhwcnQwOworCWludCBjbG9jayA9IDYwOwkJLy8gZGVmYXVsdCB2YWx1ZQorCXVzYmNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3VzYmNmZyk7CisJaHdjZmcyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naHdjZmcyKTsKKwlocHJ0MC5kMzIgPSBEV0NfUkVBRF9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCk7CisJaWYgKCF1c2JjZmcuYi5waHlzZWwgJiYgdXNiY2ZnLmIudWxwaV91dG1pX3NlbCAmJiAhdXNiY2ZnLmIucGh5aWYpCisJCWNsb2NrID0gNjA7CisJaWYgKHVzYmNmZy5iLnBoeXNlbCAmJiBod2NmZzIuYi5mc19waHlfdHlwZSA9PSAzKQorCQljbG9jayA9IDQ4OworCWlmICghdXNiY2ZnLmIucGh5bHB3cmNsa3NlbCAmJiAhdXNiY2ZnLmIucGh5c2VsICYmCisJICAgICF1c2JjZmcuYi51bHBpX3V0bWlfc2VsICYmIHVzYmNmZy5iLnBoeWlmKQorCQljbG9jayA9IDMwOworCWlmICghdXNiY2ZnLmIucGh5bHB3cmNsa3NlbCAmJiAhdXNiY2ZnLmIucGh5c2VsICYmCisJICAgICF1c2JjZmcuYi51bHBpX3V0bWlfc2VsICYmICF1c2JjZmcuYi5waHlpZikKKwkJY2xvY2sgPSA2MDsKKwlpZiAodXNiY2ZnLmIucGh5bHB3cmNsa3NlbCAmJiAhdXNiY2ZnLmIucGh5c2VsICYmCisJICAgICF1c2JjZmcuYi51bHBpX3V0bWlfc2VsICYmIHVzYmNmZy5iLnBoeWlmKQorCQljbG9jayA9IDQ4OworCWlmICh1c2JjZmcuYi5waHlzZWwgJiYgIXVzYmNmZy5iLnBoeWlmICYmIGh3Y2ZnMi5iLmZzX3BoeV90eXBlID09IDIpCisJCWNsb2NrID0gNDg7CisJaWYgKHVzYmNmZy5iLnBoeXNlbCAmJiBod2NmZzIuYi5mc19waHlfdHlwZSA9PSAxKQorCQljbG9jayA9IDQ4OworCWlmIChocHJ0MC5iLnBydHNwZCA9PSAwKQorCQkvKiBIaWdoIHNwZWVkIGNhc2UgKi8KKwkJcmV0dXJuIDEyNSAqIGNsb2NrOworCWVsc2UKKwkJLyogRlMvTFMgY2FzZSAqLworCQlyZXR1cm4gMTAwMCAqIGNsb2NrOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgYSBzZXR1cCBwYWNrZXQgZnJvbSB0aGUgUnggRklGTyBpbnRvIHRoZSBkZXN0aW5hdGlvbgorICogYnVmZmVyLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBSeCBTdGF0dXMgUXVldWUgTGV2ZWwgKFJ4U3RzUUx2bCkKKyAqIEludGVycnVwdCByb3V0aW5lIHdoZW4gYSBTRVRVUCBwYWNrZXQgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gU2xhdmUgbW9kZS4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBkZXN0IERlc3RpbmF0aW9uIGJ1ZmZlciBmb3IgcGFja2V0IGRhdGEuCisgKi8KK3ZvaWQgZHdjX290Z19yZWFkX3NldHVwX3BhY2tldChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQzMl90ICogZGVzdCkKK3sKKwkvKiBHZXQgdGhlIDggYnl0ZXMgb2YgYSBzZXR1cCB0cmFuc2FjdGlvbiBkYXRhICovCisKKwkvKiBQb3AgMiBEV09SRFMgb2ZmIHRoZSByZWNlaXZlIGRhdGEgRklGTyBpbnRvIG1lbW9yeSAqLworCWRlc3RbMF0gPSBEV0NfUkVBRF9SRUczMihjb3JlX2lmLT5kYXRhX2ZpZm9bMF0pOworCWRlc3RbMV0gPSBEV0NfUkVBRF9SRUczMihjb3JlX2lmLT5kYXRhX2ZpZm9bMF0pOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyBFUDAgT1VUIHRvIHJlY2VpdmUgU0VUVVAgcGFja2V0cyBhbmQgY29uZmlndXJlcyBFUDAKKyAqIElOIGZvciB0cmFuc21pdHRpbmcgcGFja2V0cy4gSXQgaXMgbm9ybWFsbHkgY2FsbGVkIHdoZW4gdGhlCisgKiAiRW51bWVyYXRpb24gRG9uZSIgaW50ZXJydXB0IG9jY3Vycy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBlcCBUaGUgRVAwIGRhdGEuCisgKi8KK3ZvaWQgZHdjX290Z19lcDBfYWN0aXZhdGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBkd2NfZXBfdCAqIGVwKQoreworCWR3Y19vdGdfZGV2X2lmX3QgKmRldl9pZiA9IGNvcmVfaWYtPmRldl9pZjsKKwlkc3RzX2RhdGFfdCBkc3RzOworCWRlcGN0bF9kYXRhX3QgZGllcGN0bDsKKwlkZXBjdGxfZGF0YV90IGRvZXBjdGw7CisJZGN0bF9kYXRhX3QgZGN0bCA9IHsuZDMyID0gMCB9OworCisJLyogUmVhZCB0aGUgRGV2aWNlIFN0YXR1cyBhbmQgRW5kcG9pbnQgMCBDb250cm9sIHJlZ2lzdGVycyAqLworCWRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kc3RzKTsKKwlkaWVwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbMF0tPmRpZXBjdGwpOworCWRvZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+b3V0X2VwX3JlZ3NbMF0tPmRvZXBjdGwpOworCisJLyogU2V0IHRoZSBNUFMgb2YgdGhlIElOIEVQIGJhc2VkIG9uIHRoZSBlbnVtZXJhdGlvbiBzcGVlZCAqLworCXN3aXRjaCAoZHN0cy5iLmVudW1zcGQpIHsKKwljYXNlIERXQ19EU1RTX0VOVU1TUERfSFNfUEhZXzMwTUhaX09SXzYwTUhaOgorCWNhc2UgRFdDX0RTVFNfRU5VTVNQRF9GU19QSFlfMzBNSFpfT1JfNjBNSFo6CisJY2FzZSBEV0NfRFNUU19FTlVNU1BEX0ZTX1BIWV80OE1IWjoKKwkJZGllcGN0bC5iLm1wcyA9IERXQ19ERVAwQ1RMX01QU182NDsKKwkJYnJlYWs7CisJY2FzZSBEV0NfRFNUU19FTlVNU1BEX0xTX1BIWV82TUhaOgorCQlkaWVwY3RsLmIubXBzID0gRFdDX0RFUDBDVExfTVBTXzg7CisJCWJyZWFrOworCX0KKworCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzWzBdLT5kaWVwY3RsLCBkaWVwY3RsLmQzMik7CisKKwkvKiBFbmFibGUgT1VUIEVQIGZvciByZWNlaXZlICovCisJZG9lcGN0bC5iLmVwZW5hID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+b3V0X2VwX3JlZ3NbMF0tPmRvZXBjdGwsIGRvZXBjdGwuZDMyKTsKKworI2lmZGVmIFZFUkJPU0UKKwlEV0NfREVCVUdQTChEQkdfUENEViwgImRvZXBjdGwwPSUweFxuIiwKKwkJICAgIERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPm91dF9lcF9yZWdzWzBdLT5kb2VwY3RsKSk7CisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICJkaWVwY3RsMD0lMHhcbiIsCisJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzWzBdLT5kaWVwY3RsKSk7CisjZW5kaWYKKwlkY3RsLmIuY2ducGlubmFrID0gMTsKKworCURXQ19NT0RJRllfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsLCBkY3RsLmQzMiwgZGN0bC5kMzIpOworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiZGN0bD0lMHhcbiIsCisJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjdGwpKTsKKworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYWN0aXZhdGVzIGFuIEVQLiAgVGhlIERldmljZSBFUCBjb250cm9sIHJlZ2lzdGVyIGZvcgorICogdGhlIEVQIGlzIGNvbmZpZ3VyZWQgYXMgZGVmaW5lZCBpbiB0aGUgZXAgc3RydWN0dXJlLiBOb3RlOiBUaGlzCisgKiBmdW5jdGlvbiBpcyBub3QgdXNlZCBmb3IgRVAwLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGVwIFRoZSBFUCB0byBhY3RpdmF0ZS4KKyAqLwordm9pZCBkd2Nfb3RnX2VwX2FjdGl2YXRlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgZHdjX2VwX3QgKiBlcCkKK3sKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWYgPSBjb3JlX2lmLT5kZXZfaWY7CisJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJdm9sYXRpbGUgdWludDMyX3QgKmFkZHI7CisJZGFpbnRfZGF0YV90IGRhaW50bXNrID0gey5kMzIgPSAwIH07CisJZGNmZ19kYXRhX3QgZGNmZzsKKwl1aW50OF90IGk7CisKKwlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzKCkgRVAlZC0lc1xuIiwgX19mdW5jX18sIGVwLT5udW0sCisJCSAgICAoZXAtPmlzX2luID8gIklOIiA6ICJPVVQiKSk7CisKKyNpZmRlZiBEV0NfVVRFX1BFUl9JTworCWVwLT54aXNvX2ZyYW1lX251bSA9IDB4RkZGRkZGRkY7CisJZXAtPnhpc29fYWN0aXZlX3hmZXJzID0gMDsKKwllcC0+eGlzb19xdWV1ZWRfeGZlcnMgPSAwOworI2VuZGlmCisJLyogUmVhZCBERVBDVExuIHJlZ2lzdGVyICovCisJaWYgKGVwLT5pc19pbiA9PSAxKSB7CisJCWFkZHIgPSAmZGV2X2lmLT5pbl9lcF9yZWdzW2VwLT5udW1dLT5kaWVwY3RsOworCQlkYWludG1zay5lcC5pbiA9IDEgPDwgZXAtPm51bTsKKwl9IGVsc2UgeworCQlhZGRyID0gJmRldl9pZi0+b3V0X2VwX3JlZ3NbZXAtPm51bV0tPmRvZXBjdGw7CisJCWRhaW50bXNrLmVwLm91dCA9IDEgPDwgZXAtPm51bTsKKwl9CisKKwkvKiBJZiB0aGUgRVAgaXMgYWxyZWFkeSBhY3RpdmUgZG9uJ3QgY2hhbmdlIHRoZSBFUCBDb250cm9sCisJICogcmVnaXN0ZXIuICovCisJZGVwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKGFkZHIpOworCWlmICghZGVwY3RsLmIudXNiYWN0ZXApIHsKKwkJZGVwY3RsLmIubXBzID0gZXAtPm1heHBhY2tldDsKKwkJZGVwY3RsLmIuZXB0eXBlID0gZXAtPnR5cGU7CisJCWRlcGN0bC5iLnR4Zm51bSA9IGVwLT50eF9maWZvX251bTsKKworCQlpZiAoZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJCWRlcGN0bC5iLnNldGQwcGlkID0gMTsJLy8gPz8/CisJCX0gZWxzZSB7CisJCQlkZXBjdGwuYi5zZXRkMHBpZCA9IDE7CisJCX0KKwkJZGVwY3RsLmIudXNiYWN0ZXAgPSAxOworCisJCS8qIFVwZGF0ZSBuZXh0ZXBfc2VxIGFycmF5IGFuZCBFUE1TQ05UIGluIERDRkcqLworCQlpZiAoIShkZXBjdGwuYi5lcHR5cGUgJiAxKSAmJiAoZXAtPmlzX2luID09IDEpKSB7CS8vIE5QIElOIEVQCisJCQlmb3IgKGkgPSAwOyBpIDw9IGNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsgaSsrKSB7CisJCQkJaWYgKGNvcmVfaWYtPm5leHRlcF9zZXFbaV0gPT0gY29yZV9pZi0+Zmlyc3RfaW5fbmV4dGVwX3NlcSkKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvcmVfaWYtPm5leHRlcF9zZXFbaV0gPSBlcC0+bnVtOworCQkJY29yZV9pZi0+bmV4dGVwX3NlcVtlcC0+bnVtXSA9IGNvcmVfaWYtPmZpcnN0X2luX25leHRlcF9zZXE7CisJCQlkZXBjdGwuYi5uZXh0ZXAgPSBjb3JlX2lmLT5uZXh0ZXBfc2VxW2VwLT5udW1dOworCQkJZGNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcpOworCQkJZGNmZy5iLmVwbXNjbnQrKzsKKwkJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcsIGRjZmcuZDMyKTsKKworCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsIiVzIGZpcnN0X2luX25leHRlcF9zZXE9ICUyZDsgbmV4dGVwX3NlcVtdOlxuIiwKKwkJCQlfX2Z1bmNfXywgY29yZV9pZi0+Zmlyc3RfaW5fbmV4dGVwX3NlcSk7CisJCQlmb3IgKGk9MDsgaSA8PSBjb3JlX2lmLT5kZXZfaWYtPm51bV9pbl9lcHM7IGkrKykgeworCQkJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiJTJkXG4iLCBjb3JlX2lmLT5uZXh0ZXBfc2VxW2ldKTsKKwkJCX0KKworCQl9CisKKworCQlEV0NfV1JJVEVfUkVHMzIoYWRkciwgZGVwY3RsLmQzMik7CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiREVQQ1RMPSUwOHhcbiIsIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwl9CisKKwkvKiBFbmFibGUgdGhlIEludGVycnVwdCBmb3IgdGhpcyBFUCAqLworCWlmIChjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQlpZiAoZXAtPmlzX2luID09IDEpIHsKKwkJCWRpZXBtc2tfZGF0YV90IGRpZXBtc2sgPSB7LmQzMiA9IDAgfTsKKwkJCWRpZXBtc2suYi54ZmVyY29tcGwgPSAxOworCQkJZGllcG1zay5iLnRpbWVvdXQgPSAxOworCQkJZGllcG1zay5iLmVwZGlzYWJsZWQgPSAxOworCQkJZGllcG1zay5iLmFoYmVyciA9IDE7CisJCQlkaWVwbXNrLmIuaW50a25lcG1pcyA9IDE7CisJCQlpZiAoIWNvcmVfaWYtPmVuX211bHRpcGxlX3R4X2ZpZm8gJiYgY29yZV9pZi0+ZG1hX2VuYWJsZSkKKwkJCQlkaWVwbXNrLmIuaW50a25lcG1pcyA9IDA7CisJCQlkaWVwbXNrLmIudHhmaWZvdW5kcm4gPSAxOwkvLz8/Pz8/CisJCQlpZiAoZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJCQlkaWVwbXNrLmIubmFrID0gMTsKKwkJCX0KKworCisKKy8qCisJCQlpZiAoY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCQkJZGllcG1zay5iLmJuYSA9IDE7CisJCQl9CisqLworLyoKKwkJCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQkJZG9lcG1zay5iLm5hayA9IDE7CisJCQl9CisqLworCQkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+CisJCQkJCWRpZXBlYWNoaW50bXNrW2VwLT5udW1dLCBkaWVwbXNrLmQzMik7CisKKwkJfSBlbHNlIHsKKwkJCWRvZXBtc2tfZGF0YV90IGRvZXBtc2sgPSB7LmQzMiA9IDAgfTsKKwkJCWRvZXBtc2suYi54ZmVyY29tcGwgPSAxOworCQkJZG9lcG1zay5iLmFoYmVyciA9IDE7CisJCQlkb2VwbXNrLmIuZXBkaXNhYmxlZCA9IDE7CisJCQlpZiAoZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpCisJCQkJZG9lcG1zay5iLm91dHRrbmVwZGlzID0gMTsKKworLyoKKworCQkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJCWRvZXBtc2suYi5ibmEgPSAxOworCQkJfQorKi8KKy8qCisJCQlkb2VwbXNrLmIuYmFiYmxlID0gMTsKKwkJCWRvZXBtc2suYi5ueWV0ID0gMTsKKwkJCWRvZXBtc2suYi5uYWsgPSAxOworKi8KKwkJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPgorCQkJCQlkb2VwZWFjaGludG1za1tlcC0+bnVtXSwgZG9lcG1zay5kMzIpOworCQl9CisJCURXQ19NT0RJRllfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kZWFjaGludG1zaywKKwkJCQkgMCwgZGFpbnRtc2suZDMyKTsKKwl9IGVsc2UgeworCQlpZiAoZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJCWlmIChlcC0+aXNfaW4pCisJCQl7CisJCQkJZGllcG1za19kYXRhX3QgZGllcG1zayA9IHsuZDMyID0gMCB9OworCQkJCWRpZXBtc2suYi5uYWsgPSAxOworCQkJCURXQ19NT0RJRllfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kaWVwbXNrLCAwLCBkaWVwbXNrLmQzMik7CisJCQl9IGVsc2UgeworCQkJCWRvZXBtc2tfZGF0YV90IGRvZXBtc2sgPSB7LmQzMiA9IDAgfTsKKwkJCQlkb2VwbXNrLmIub3V0dGtuZXBkaXMgPSAxOworCQkJCURXQ19NT0RJRllfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kb2VwbXNrLCAwLCBkb2VwbXNrLmQzMik7CisJCQl9CisJCX0KKwkJRFdDX01PRElGWV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRhaW50bXNrLAorCQkJCSAwLCBkYWludG1zay5kMzIpOworCX0KKworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiREFJTlRNU0s9JTB4XG4iLAorCQkgICAgRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kYWludG1zaykpOworCisJZXAtPnN0YWxsX2NsZWFyX2ZsYWcgPSAwOworCisJcmV0dXJuOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZGVhY3RpdmF0ZXMgYW4gRVAuIFRoaXMgaXMgZG9uZSBieSBjbGVhcmluZyB0aGUgVVNCIEFjdGl2ZQorICogRVAgYml0IGluIHRoZSBEZXZpY2UgRVAgY29udHJvbCByZWdpc3Rlci4gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBub3QgdXNlZAorICogZm9yIEVQMC4gRVAwIGNhbm5vdCBiZSBkZWFjdGl2YXRlZC4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBlcCBUaGUgRVAgdG8gZGVhY3RpdmF0ZS4KKyAqLwordm9pZCBkd2Nfb3RnX2VwX2RlYWN0aXZhdGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBkd2NfZXBfdCAqIGVwKQoreworCWRlcGN0bF9kYXRhX3QgZGVwY3RsID0gey5kMzIgPSAwIH07CisJdm9sYXRpbGUgdWludDMyX3QgKmFkZHI7CisJZGFpbnRfZGF0YV90IGRhaW50bXNrID0gey5kMzIgPSAwIH07CisJZGNmZ19kYXRhX3QgZGNmZzsKKwl1aW50OF90IGkgPSAwOworCisjaWZkZWYgRFdDX1VURV9QRVJfSU8KKwllcC0+eGlzb19mcmFtZV9udW0gPSAweEZGRkZGRkZGOworCWVwLT54aXNvX2FjdGl2ZV94ZmVycyA9IDA7CisJZXAtPnhpc29fcXVldWVkX3hmZXJzID0gMDsKKyNlbmRpZgorCisJLyogUmVhZCBERVBDVExuIHJlZ2lzdGVyICovCisJaWYgKGVwLT5pc19pbiA9PSAxKSB7CisJCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2VwLT5udW1dLT5kaWVwY3RsOworCQlkYWludG1zay5lcC5pbiA9IDEgPDwgZXAtPm51bTsKKwl9IGVsc2UgeworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+b3V0X2VwX3JlZ3NbZXAtPm51bV0tPmRvZXBjdGw7CisJCWRhaW50bXNrLmVwLm91dCA9IDEgPDwgZXAtPm51bTsKKwl9CisKKwlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoYWRkcik7CisKKwlkZXBjdGwuYi51c2JhY3RlcCA9IDA7CisKKwkvKiBVcGRhdGUgbmV4dGVwX3NlcSBhcnJheSBhbmQgRVBNU0NOVCBpbiBEQ0ZHKi8KKwlpZiAoIShkZXBjdGwuYi5lcHR5cGUgJiAxKSAmJiBlcC0+aXNfaW4gPT0gMSkgewkvLyBOUCBFUCBJTgorCQlmb3IgKGkgPSAwOyBpIDw9IGNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsgaSsrKSB7CisJCQlpZiAoY29yZV9pZi0+bmV4dGVwX3NlcVtpXSA9PSBlcC0+bnVtKQorCQkJYnJlYWs7CisJCX0KKwkJY29yZV9pZi0+bmV4dGVwX3NlcVtpXSA9IGNvcmVfaWYtPm5leHRlcF9zZXFbZXAtPm51bV07CisJCWlmIChjb3JlX2lmLT5maXJzdF9pbl9uZXh0ZXBfc2VxID09IGVwLT5udW0pCisJCQljb3JlX2lmLT5maXJzdF9pbl9uZXh0ZXBfc2VxID0gaTsKKwkJY29yZV9pZi0+bmV4dGVwX3NlcVtlcC0+bnVtXSA9IDB4ZmY7CisJCWRlcGN0bC5iLm5leHRlcCA9IDA7CisJCWRjZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY2ZnKTsKKwkJZGNmZy5iLmVwbXNjbnQtLTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGNmZywgZGNmZy5kMzIpOworCisJCQlEV0NfREVCVUdQTChEQkdfUENEViwiJXMgZmlyc3RfaW5fbmV4dGVwX3NlcT0gJTJkOyBuZXh0ZXBfc2VxW106XG4iLAorCQkJCV9fZnVuY19fLCBjb3JlX2lmLT5maXJzdF9pbl9uZXh0ZXBfc2VxKTsKKwkJCWZvciAoaT0wOyBpIDw9IGNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsgaSsrKSB7CisJCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlMmRcbiIsIGNvcmVfaWYtPm5leHRlcF9zZXFbaV0pOworCQkJfQorCX0KKworCWlmIChlcC0+aXNfaW4gPT0gMSkKKwkJZGVwY3RsLmIudHhmbnVtID0gMDsKKworCWlmIChjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpCisJCWRlcGN0bC5iLmVwZGlzID0gMTsKKworCURXQ19XUklURV9SRUczMihhZGRyLCBkZXBjdGwuZDMyKTsKKwlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoYWRkcik7CisJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUgJiYgZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MgJiYgZGVwY3RsLmIuZXBlbmEpCisJeworCQlkZXBjdGxfZGF0YV90IGRlcGN0bCA9IHsuZDMyID0gMH07CisJCWlmIChlcC0+aXNfaW4pCisJCXsKKwkJCWRpZXBpbnRfZGF0YV90IGRpZXBpbnQgPSB7LmQzMiA9IDB9OworCisJCQlkZXBjdGwuYi5zbmFrID0gMTsKKwkJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2VwLT5udW1dLT5kaWVwY3RsLCBkZXBjdGwuZDMyKTsKKwkJCWRvCisJCQl7CisJCQkJZHdjX3VkZWxheSgxMCk7CisJCQkJZGllcGludC5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQkJCQkJCQkJaW5fZXBfcmVnc1tlcC0+bnVtXS0+ZGllcGludCk7CisJCQl9IHdoaWxlICghZGllcGludC5iLmluZXBuYWtlZmYpOworCQkJZGllcGludC5iLmluZXBuYWtlZmYgPSAxOworCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPgorCQkJCQkJCWluX2VwX3JlZ3NbZXAtPm51bV0tPmRpZXBpbnQsIGRpZXBpbnQuZDMyKTsKKwkJCWRlcGN0bC5kMzIgPSAwOworCQkJZGVwY3RsLmIuZXBkaXMgPSAxOworCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbZXAtPm51bV0tPmRpZXBjdGwsIGRlcGN0bC5kMzIpOworCQkJZG8KKwkJCXsKKwkJCQlkd2NfdWRlbGF5KDEwKTsKKwkJCQlkaWVwaW50LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPgorCQkJCQkJCQkJCQlpbl9lcF9yZWdzW2VwLT5udW1dLT5kaWVwaW50KTsKKwkJCX0gd2hpbGUgKCFkaWVwaW50LmIuZXBkaXNhYmxlZCk7CisJCQlkaWVwaW50LmIuZXBkaXNhYmxlZCA9IDE7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tlcC0+bnVtXS0+ZGllcGludCwgZGllcGludC5kMzIpOworCQl9IGVsc2UgeworCQkJZGN0bF9kYXRhX3QgZGN0bCA9IHsuZDMyID0gMH07CisJCQlnaW50bXNrX2RhdGFfdCBnaW50c3RzID0gey5kMzIgPSAwfTsKKwkJCWRvZXBpbnRfZGF0YV90IGRvZXBpbnQgPSB7LmQzMiA9IDB9OworCQkJZGN0bC5iLnNnb3V0bmFrID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsLCAwLCBkY3RsLmQzMik7CisJCQlkbworCQkJeworCQkJCWR3Y191ZGVsYXkoMTApOworCQkJCWdpbnRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCQkJfSB3aGlsZSAoIWdpbnRzdHMuYi5nb3V0bmFrZWZmKTsKKwkJCWdpbnRzdHMuZDMyID0gMDsKKwkJCWdpbnRzdHMuYi5nb3V0bmFrZWZmID0gMTsKKwkJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCisJCQlkZXBjdGwuZDMyID0gMDsKKwkJCWRlcGN0bC5iLmVwZGlzID0gMTsKKwkJCWRlcGN0bC5iLnNuYWsgPSAxOworCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2VwLT5udW1dLT5kb2VwY3RsLCBkZXBjdGwuZDMyKTsKKwkJCWRvCisJCQl7CisJCQkJZHdjX3VkZWxheSgxMCk7CisJCQkJZG9lcGludC5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQkJCQkJCQkJb3V0X2VwX3JlZ3NbZXAtPm51bV0tPmRvZXBpbnQpOworCQkJfSB3aGlsZSAoIWRvZXBpbnQuYi5lcGRpc2FibGVkKTsKKworCQkJZG9lcGludC5iLmVwZGlzYWJsZWQgPSAxOworCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2VwLT5udW1dLT5kb2VwaW50LCBkb2VwaW50LmQzMik7CisKKwkJCWRjdGwuZDMyID0gMDsKKwkJCWRjdGwuYi5jZ291dG5hayA9IDE7CisJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwgMCwgZGN0bC5kMzIpOworCQl9CisJfQorCisJLyogRGlzYWJsZSB0aGUgSW50ZXJydXB0IGZvciB0aGlzIEVQICovCisJaWYgKGNvcmVfaWYtPm11bHRpcHJvY19pbnRfZW5hYmxlKSB7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kZWFjaGludG1zaywKKwkJCQkgZGFpbnRtc2suZDMyLCAwKTsKKworCQlpZiAoZXAtPmlzX2luID09IDEpIHsKKwkJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPgorCQkJCQlkaWVwZWFjaGludG1za1tlcC0+bnVtXSwgMCk7CisJCX0gZWxzZSB7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT4KKwkJCQkJZG9lcGVhY2hpbnRtc2tbZXAtPm51bV0sIDApOworCQl9CisJfSBlbHNlIHsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRhaW50bXNrLAorCQkJCSBkYWludG1zay5kMzIsIDApOworCX0KKworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgZG1hIGRlc2NyaXB0b3IgY2hhaW4uCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZXAgVGhlIEVQIHRvIHN0YXJ0IHRoZSB0cmFuc2ZlciBvbi4KKyAqLworc3RhdGljIHZvaWQgaW5pdF9kbWFfZGVzY19jaGFpbihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGR3Y19lcF90ICogZXApCit7CisJZHdjX290Z19kZXZfZG1hX2Rlc2NfdCAqZG1hX2Rlc2M7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IHhmZXJfZXN0OworCWludCBpOworCXVuc2lnbmVkIG1heHhmZXJfbG9jYWwsIHRvdGFsX2xlbjsKKworCWlmICghZXAtPmlzX2luICYmIGVwLT50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JTlRSICYmCisJCQkJCShlcC0+bWF4cGFja2V0JTQpKSB7CisJCW1heHhmZXJfbG9jYWwgPSBlcC0+bWF4cGFja2V0OworCQl0b3RhbF9sZW4gPSBlcC0+eGZlcl9sZW47CisJfSBlbHNlIHsKKwkJbWF4eGZlcl9sb2NhbCA9IGVwLT5tYXh4ZmVyOworCQl0b3RhbF9sZW4gPSBlcC0+dG90YWxfbGVuOworCX0KKworCWVwLT5kZXNjX2NudCA9ICh0b3RhbF9sZW4gLyBtYXh4ZmVyX2xvY2FsKSArCisgICAgICAgICAgICAoKHRvdGFsX2xlbiAlIG1heHhmZXJfbG9jYWwpID8gMSA6IDApOworCisJaWYgKCFlcC0+ZGVzY19jbnQpCisJCWVwLT5kZXNjX2NudCA9IDE7CisKKwlpZiAoZXAtPmRlc2NfY250ID4gTUFYX0RNQV9ERVNDX0NOVCkKKwkJZXAtPmRlc2NfY250ID0gTUFYX0RNQV9ERVNDX0NOVDsKKworCWRtYV9kZXNjID0gZXAtPmRlc2NfYWRkcjsKKwlpZiAobWF4eGZlcl9sb2NhbCA9PSBlcC0+bWF4cGFja2V0KSB7CisJCWlmICgodG90YWxfbGVuICUgbWF4eGZlcl9sb2NhbCkgJiYKKwkJCQkodG90YWxfbGVuL21heHhmZXJfbG9jYWwgPCBNQVhfRE1BX0RFU0NfQ05UKSkgeworCQkJeGZlcl9lc3QgPSAoZXAtPmRlc2NfY250IC0gMSkgKiBtYXh4ZmVyX2xvY2FsICsKKwkJCQkJKHRvdGFsX2xlbiAlIG1heHhmZXJfbG9jYWwpOworCQl9IGVsc2UKKwkJCXhmZXJfZXN0ID0gZXAtPmRlc2NfY250ICogbWF4eGZlcl9sb2NhbDsKKwl9CisJZWxzZQorCQl4ZmVyX2VzdCA9IHRvdGFsX2xlbjsKKwlvZmZzZXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBlcC0+ZGVzY19jbnQ7ICsraSkgeworCQkvKiogRE1BIERlc2NyaXB0b3IgU2V0dXAgKi8KKwkJaWYgKHhmZXJfZXN0ID4gbWF4eGZlcl9sb2NhbCkgeworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmJzID0gQlNfSE9TVF9CVVNZOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmwgPSAwOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmlvYyA9IDA7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuc3AgPSAwOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmJ5dGVzID0gbWF4eGZlcl9sb2NhbDsKKwkJCWRtYV9kZXNjLT5idWYgPSBlcC0+ZG1hX2FkZHIgKyBvZmZzZXQ7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuc3RzID0gMDsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5icyA9IEJTX0hPU1RfUkVBRFk7CisKKwkJCXhmZXJfZXN0IC09IG1heHhmZXJfbG9jYWw7CisJCQlvZmZzZXQgKz0gbWF4eGZlcl9sb2NhbDsKKwkJfSBlbHNlIHsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5icyA9IEJTX0hPU1RfQlVTWTsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5sID0gMTsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5pb2MgPSAxOworCQkJaWYgKGVwLT5pc19pbikgeworCQkJCWRtYV9kZXNjLT5zdGF0dXMuYi5zcCA9CisJCQkJICAgICh4ZmVyX2VzdCAlCisJCQkJICAgICBlcC0+bWF4cGFja2V0KSA/IDEgOiAoKGVwLT4KKwkJCQkJCQkgICAgc2VudF96bHApID8gMSA6IDApOworCQkJCWRtYV9kZXNjLT5zdGF0dXMuYi5ieXRlcyA9IHhmZXJfZXN0OworCQkJfSBlbHNlIHsKKwkJCQlpZiAobWF4eGZlcl9sb2NhbCA9PSBlcC0+bWF4cGFja2V0KQorCQkJCQlkbWFfZGVzYy0+c3RhdHVzLmIuYnl0ZXMgPSB4ZmVyX2VzdDsKKwkJCQllbHNlCisJCQkJCWRtYV9kZXNjLT5zdGF0dXMuYi5ieXRlcyA9CisJCQkJICAgIAkJeGZlcl9lc3QgKyAoKDQgLSAoeGZlcl9lc3QgJiAweDMpKSAmIDB4Myk7CisJCQl9CisKKwkJCWRtYV9kZXNjLT5idWYgPSBlcC0+ZG1hX2FkZHIgKyBvZmZzZXQ7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuc3RzID0gMDsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5icyA9IEJTX0hPU1RfUkVBRFk7CisJCX0KKwkJZG1hX2Rlc2MrKzsKKwl9Cit9CisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdG8gd3JpdGUgSVNPQyBkYXRhIGludG8gYXBwcm9wcmlhdGUgZGVkaWNhdGVkCisgKiBwZXJpb2RpYyBGSUZPLgorICovCitzdGF0aWMgaW50MzJfdCB3cml0ZV9pc29jX3R4X2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBkd2NfZXBfdCAqIGR3Y19lcCkKK3sKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWYgPSBjb3JlX2lmLT5kZXZfaWY7CisJZHdjX290Z19kZXZfaW5fZXBfcmVnc190ICplcF9yZWdzOworCWR0eGZzdHNfZGF0YV90IHR4c3RhdHVzID0gey5kMzIgPSAwIH07CisJdWludDMyX3QgbGVuID0gMDsKKwlpbnQgZXBudW0gPSBkd2NfZXAtPm51bTsKKwlpbnQgZHdvcmRzOworCisJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkRlZGljYXRlZCBUeEZpZm8gRW1wdHk6ICVkIFxuIiwgZXBudW0pOworCisJZXBfcmVncyA9IGNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tlcG51bV07CisKKwlsZW4gPSBkd2NfZXAtPnhmZXJfbGVuIC0gZHdjX2VwLT54ZmVyX2NvdW50OworCisJaWYgKGxlbiA+IGR3Y19lcC0+bWF4cGFja2V0KSB7CisJCWxlbiA9IGR3Y19lcC0+bWF4cGFja2V0OworCX0KKworCWR3b3JkcyA9IChsZW4gKyAzKSAvIDQ7CisKKwkvKiBXaGlsZSB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgcXVldWUgYW5kIHNwYWNlIGluIHRoZSBGSUZPIGFuZAorCSAqIE1vcmUgZGF0YSB0byB0cmFuZmVyLCBXcml0ZSBwYWNrZXRzIHRvIHRoZSBUeCBGSUZPICovCisJdHhzdGF0dXMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tlcG51bV0tPmR0eGZzdHMpOworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiYjQgZHR4ZnN0c1slZF09MHglMDh4XG4iLCBlcG51bSwgdHhzdGF0dXMuZDMyKTsKKworCXdoaWxlICh0eHN0YXR1cy5iLnR4ZnNwY2F2YWlsID4gZHdvcmRzICYmCisJICAgICAgIGR3Y19lcC0+eGZlcl9jb3VudCA8IGR3Y19lcC0+eGZlcl9sZW4gJiYKKwkgICAgICAgZHdjX2VwLT54ZmVyX2xlbiAhPSAwKSB7CisJCS8qIFdyaXRlIHRoZSBGSUZPICovCisJCWR3Y19vdGdfZXBfd3JpdGVfcGFja2V0KGNvcmVfaWYsIGR3Y19lcCwgMCk7CisKKwkJbGVuID0gZHdjX2VwLT54ZmVyX2xlbiAtIGR3Y19lcC0+eGZlcl9jb3VudDsKKwkJaWYgKGxlbiA+IGR3Y19lcC0+bWF4cGFja2V0KSB7CisJCQlsZW4gPSBkd2NfZXAtPm1heHBhY2tldDsKKwkJfQorCisJCWR3b3JkcyA9IChsZW4gKyAzKSAvIDQ7CisJCXR4c3RhdHVzLmQzMiA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2VwbnVtXS0+ZHR4ZnN0cyk7CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiZHR4ZnN0c1slZF09MHglMDh4XG4iLCBlcG51bSwKKwkJCSAgICB0eHN0YXR1cy5kMzIpOworCX0KKworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiYjQgZHR4ZnN0c1slZF09MHglMDh4XG4iLCBlcG51bSwKKwkJICAgIERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbZXBudW1dLT5kdHhmc3RzKSk7CisKKwlyZXR1cm4gMTsKK30KKy8qKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzZXR1cCBmb3IgYSBkYXRhIHRyYW5zZmVyIGZvciBhbiBFUCBhbmQKKyAqIHN0YXJ0cyB0aGUgdHJhbnNmZXIuIEZvciBhbiBJTiB0cmFuc2ZlciwgdGhlIHBhY2tldHMgd2lsbCBiZQorICogbG9hZGVkIGludG8gdGhlIGFwcHJvcHJpYXRlIFR4IEZJRk8gaW4gdGhlIElTUi4gRm9yIE9VVCB0cmFuc2ZlcnMsCisgKiB0aGUgcGFja2V0cyBhcmUgdW5sb2FkZWQgZnJvbSB0aGUgUnggRklGTyBpbiB0aGUgSVNSLiAgdGhlIElTUi4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBlcCBUaGUgRVAgdG8gc3RhcnQgdGhlIHRyYW5zZmVyIG9uLgorICovCisKK3ZvaWQgZHdjX290Z19lcF9zdGFydF90cmFuc2Zlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGR3Y19lcF90ICogZXApCit7CisJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJZGVwdHNpel9kYXRhX3QgZGVwdHNpejsKKwlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKworCURXQ19ERUJVR1BMKChEQkdfUENEViB8IERCR19DSUxWKSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwlEV0NfREVCVUdQTChEQkdfUENELCAiZXAlZC0lcyB4ZmVyX2xlbj0lZCB4ZmVyX2NudD0lZCAiCisJCSAgICAieGZlcl9idWZmPSVwIHN0YXJ0X3hmZXJfYnVmZj0lcCwgdG90YWxfbGVuID0gJWRcbiIsCisJCSAgICBlcC0+bnVtLCAoZXAtPmlzX2luID8gIklOIiA6ICJPVVQiKSwgZXAtPnhmZXJfbGVuLAorCQkgICAgZXAtPnhmZXJfY291bnQsIGVwLT54ZmVyX2J1ZmYsIGVwLT5zdGFydF94ZmVyX2J1ZmYsCisJCSAgICBlcC0+dG90YWxfbGVuKTsKKwkvKiBJTiBlbmRwb2ludCAqLworCWlmIChlcC0+aXNfaW4gPT0gMSkgeworCQlkd2Nfb3RnX2Rldl9pbl9lcF9yZWdzX3QgKmluX3JlZ3MgPQorCQkgICAgY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2VwLT5udW1dOworCisJCWducHR4c3RzX2RhdGFfdCBndHhzdGF0dXM7CisKKwkJZ3R4c3RhdHVzLmQzMiA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z25wdHhzdHMpOworCisJCWlmIChjb3JlX2lmLT5lbl9tdWx0aXBsZV90eF9maWZvID09IDAKKwkJICAgICYmIGd0eHN0YXR1cy5iLm5wdHhxc3BjYXZhaWwgPT0gMAorCQkgICAgJiYgIWNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKyNpZmRlZiBERUJVRworCQkJRFdDX1BSSU5URigiVFggUXVldWUgRnVsbCAoMHglMHgpXG4iLCBndHhzdGF0dXMuZDMyKTsKKyNlbmRpZgorCQkJcmV0dXJuOworCQl9CisKKwkJZGVwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCYoaW5fcmVncy0+ZGllcGN0bCkpOworCQlkZXB0c2l6LmQzMiA9IERXQ19SRUFEX1JFRzMyKCYoaW5fcmVncy0+ZGllcHRzaXopKTsKKworCQlpZiAoZXAtPm1heHBhY2tldCA+IGVwLT5tYXh4ZmVyIC8gTUFYX1BLVF9DTlQpCisJCQllcC0+eGZlcl9sZW4gKz0gKGVwLT5tYXh4ZmVyIDwgKGVwLT50b3RhbF9sZW4gLSBlcC0+eGZlcl9sZW4pKSA/CisJCSAgICAJCWVwLT5tYXh4ZmVyIDogKGVwLT50b3RhbF9sZW4gLSBlcC0+eGZlcl9sZW4pOworCQllbHNlCisJCQllcC0+eGZlcl9sZW4gKz0gKE1BWF9QS1RfQ05UICogZXAtPm1heHBhY2tldCA8IChlcC0+dG90YWxfbGVuIC0gZXAtPnhmZXJfbGVuKSkgPworCQkJCSBNQVhfUEtUX0NOVCAqIGVwLT5tYXhwYWNrZXQgOiAoZXAtPnRvdGFsX2xlbiAtIGVwLT54ZmVyX2xlbik7CisKKworCQkvKiBaZXJvIExlbmd0aCBQYWNrZXQ/ICovCisJCWlmICgoZXAtPnhmZXJfbGVuIC0gZXAtPnhmZXJfY291bnQpID09IDApIHsKKwkJCWRlcHRzaXouYi54ZmVyc2l6ZSA9IDA7CisJCQlkZXB0c2l6LmIucGt0Y250ID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIFByb2dyYW0gdGhlIHRyYW5zZmVyIHNpemUgYW5kIHBhY2tldCBjb3VudAorCQkJICogICAgICBhcyBmb2xsb3dzOiB4ZmVyc2l6ZSA9IE4gKiBtYXhwYWNrZXQgKworCQkJICogICAgICBzaG9ydF9wYWNrZXQgcGt0Y250ID0gTiArIChzaG9ydF9wYWNrZXQKKwkJCSAqICAgICAgZXhpc3QgPyAxIDogMCkKKwkJCSAqLworCQkJZGVwdHNpei5iLnhmZXJzaXplID0gZXAtPnhmZXJfbGVuIC0gZXAtPnhmZXJfY291bnQ7CisJCQlkZXB0c2l6LmIucGt0Y250ID0KKwkJCSAgICAoZXAtPnhmZXJfbGVuIC0gZXAtPnhmZXJfY291bnQgLSAxICsKKwkJCSAgICAgZXAtPm1heHBhY2tldCkgLyBlcC0+bWF4cGFja2V0OworCQkJaWYgKGRlcHRzaXouYi5wa3RjbnQgPiBNQVhfUEtUX0NOVCkgeworCQkJCWRlcHRzaXouYi5wa3RjbnQgPSBNQVhfUEtUX0NOVDsKKwkJCQlkZXB0c2l6LmIueGZlcnNpemUgPSBkZXB0c2l6LmIucGt0Y250ICogZXAtPm1heHBhY2tldDsKKwkJCX0KKwkJCWlmIChlcC0+dHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykKKwkJCQlkZXB0c2l6LmIubWMgPSBkZXB0c2l6LmIucGt0Y250OworCQl9CisKKwkJLyogV3JpdGUgdGhlIERNQSByZWdpc3RlciAqLworCQlpZiAoY29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSA9PSAwKSB7CisJCQkJaWYgKGVwLT50eXBlICE9IERXQ19PVEdfRVBfVFlQRV9JU09DKQorCQkJCQlkZXB0c2l6LmIubWMgPSAxOworCQkJCURXQ19XUklURV9SRUczMigmaW5fcmVncy0+ZGllcHRzaXosCisJCQkJCQlkZXB0c2l6LmQzMik7CisJCQkJRFdDX1dSSVRFX1JFRzMyKCYoaW5fcmVncy0+ZGllcGRtYSksCisJCQkJCQkodWludDMyX3QpIGVwLT5kbWFfYWRkcik7CisJCQl9IGVsc2UgeworI2lmZGVmIERXQ19VVEVfQ0ZJCisJCQkJLyogVGhlIGRlc2NyaXB0b3IgY2hhaW4gc2hvdWxkIGJlIGFscmVhZHkgaW5pdGlhbGl6ZWQgYnkgbm93ICovCisJCQkJaWYgKGVwLT5idWZmX21vZGUgIT0gQk1fU1RBTkRBUkQpIHsKKwkJCQkJRFdDX1dSSVRFX1JFRzMyKCZpbl9yZWdzLT5kaWVwZG1hLAorCQkJCQkJCWVwLT5kZXNjc19kbWFfYWRkcik7CisJCQkJfSBlbHNlIHsKKyNlbmRpZgorCQkJCQlpbml0X2RtYV9kZXNjX2NoYWluKGNvcmVfaWYsIGVwKTsKKwkJCQkvKiogRElFUERNQW4gUmVnaXN0ZXIgd3JpdGUgKi8KKwkJCQkJRFdDX1dSSVRFX1JFRzMyKCZpbl9yZWdzLT5kaWVwZG1hLAorCQkJCQkJCWVwLT5kbWFfZGVzY19hZGRyKTsKKyNpZmRlZiBEV0NfVVRFX0NGSQorCQkJCX0KKyNlbmRpZgorCQkJfQorCQl9IGVsc2UgeworCQkJRFdDX1dSSVRFX1JFRzMyKCZpbl9yZWdzLT5kaWVwdHNpeiwgZGVwdHNpei5kMzIpOworCQkJaWYgKGVwLT50eXBlICE9IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCQkJLyoqCisJCQkJICogRW5hYmxlIHRoZSBOb24tUGVyaW9kaWMgVHggRklGTyBlbXB0eSBpbnRlcnJ1cHQsCisJCQkJICogb3IgdGhlIFR4IEZJRk8gZXBtdHkgaW50ZXJydXB0IGluIGRlZGljYXRlZCBUeCBGSUZPIG1vZGUsCisJCQkJICogdGhlIGRhdGEgd2lsbCBiZSB3cml0dGVuIGludG8gdGhlIGZpZm8gYnkgdGhlIElTUi4KKwkJCQkgKi8KKwkJCQlpZiAoY29yZV9pZi0+ZW5fbXVsdGlwbGVfdHhfZmlmbyA9PSAwKSB7CisJCQkJCWludHJfbWFzay5iLm5wdHhmZW1wdHkgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyCisJCQkJCSAgICAoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssCisJCQkJCSAgICAgaW50cl9tYXNrLmQzMiwgaW50cl9tYXNrLmQzMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogRW5hYmxlIHRoZSBUeCBGSUZPIEVtcHR5IEludGVycnVwdCBmb3IgdGhpcyBFUCAqLworCQkJCQlpZiAoZXAtPnhmZXJfbGVuID4gMCkgeworCQkJCQkJdWludDMyX3QgZmlmb2VtcHR5bXNrID0gMDsKKwkJCQkJCWZpZm9lbXB0eW1zayA9IDEgPDwgZXAtPm51bTsKKwkJCQkJCURXQ19NT0RJRllfUkVHMzIKKwkJCQkJCSAgICAoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kdGtucXI0X2ZpZm9lbXB0eW1zaywKKwkJCQkJCSAgICAgMCwgZmlmb2VtcHR5bXNrKTsKKworCQkJCQl9CisJCQkJfQorCQkJfSAgZWxzZSB7CisJCQkJCSB3cml0ZV9pc29jX3R4X2ZpZm8oY29yZV9pZiwgZXApOworCQkJfQorCQl9CisJCWlmICghY29yZV9pZi0+Y29yZV9wYXJhbXMtPmVuX211bHRpcGxlX3R4X2ZpZm8gJiYgY29yZV9pZi0+ZG1hX2VuYWJsZSkKKwkJCWRlcGN0bC5iLm5leHRlcCA9IGNvcmVfaWYtPm5leHRlcF9zZXFbZXAtPm51bV07CisKKwkJaWYgKGVwLT50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKQorCQl7CisJCQlkc3RzX2RhdGFfdCBkc3RzID0gey5kMzIgPSAwfTsKKwkJCWlmIChlcC0+YkludGVydmFsID09IDEpIHsKKwkJCQlkc3RzLmQzMiA9CisJCQkJCURXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZHN0cyk7CisJCQkJZXAtPmZyYW1lX251bSA9IGRzdHMuYi5zb2ZmbiArIGVwLT5iSW50ZXJ2YWw7CisJCQkJaWYgKGVwLT5mcmFtZV9udW0gPiAweDNGRkYpCisJCQkJeworCQkJCQllcC0+ZnJtX292ZXJydW4gPSAxOworCQkJCQllcC0+ZnJhbWVfbnVtICY9IDB4M0ZGRjsKKwkJCQl9IGVsc2UKKwkJCQkJZXAtPmZybV9vdmVycnVuID0gMDsKKwkJCQlpZiAoZXAtPmZyYW1lX251bSAmIDB4MSkgeworCQkJCQlkZXBjdGwuYi5zZXRkMXBpZCA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGVwY3RsLmIuc2V0ZDBwaWQgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBFUCBlbmFibGUsIElOIGRhdGEgaW4gRklGTyAqLworCQlkZXBjdGwuYi5jbmFrID0gMTsKKwkJZGVwY3RsLmIuZXBlbmEgPSAxOworCQlEV0NfV1JJVEVfUkVHMzIoJmluX3JlZ3MtPmRpZXBjdGwsIGRlcGN0bC5kMzIpOworCisJfSBlbHNlIHsKKwkJLyogT1VUIGVuZHBvaW50ICovCisJCWR3Y19vdGdfZGV2X291dF9lcF9yZWdzX3QgKm91dF9yZWdzID0KKwkJICAgIGNvcmVfaWYtPmRldl9pZi0+b3V0X2VwX3JlZ3NbZXAtPm51bV07CisKKwkJZGVwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCYob3V0X3JlZ3MtPmRvZXBjdGwpKTsKKwkJZGVwdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmKG91dF9yZWdzLT5kb2VwdHNpeikpOworCisJCWlmICghY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCQlpZiAoZXAtPm1heHBhY2tldCA+IGVwLT5tYXh4ZmVyIC8gTUFYX1BLVF9DTlQpCisJCQkJZXAtPnhmZXJfbGVuICs9IChlcC0+bWF4eGZlciA8IChlcC0+dG90YWxfbGVuIC0gZXAtPnhmZXJfbGVuKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgCWVwLT5tYXh4ZmVyIDogKGVwLT50b3RhbF9sZW4gLSBlcC0+eGZlcl9sZW4pOworICAgICAgICAgICAgICAgIGVsc2UKKwkJCQkJZXAtPnhmZXJfbGVuICs9IChNQVhfUEtUX0NOVCAqIGVwLT5tYXhwYWNrZXQgPCAoZXAtPnRvdGFsX2xlbgorCQkJCQktIGVwLT54ZmVyX2xlbikpID8gTUFYX1BLVF9DTlQgKiBlcC0+bWF4cGFja2V0IDogKGVwLT50b3RhbF9sZW4gLSBlcC0+eGZlcl9sZW4pOworCQl9CisKKwkJLyogUHJvZ3JhbSB0aGUgdHJhbnNmZXIgc2l6ZSBhbmQgcGFja2V0IGNvdW50IGFzIGZvbGxvd3M6CisJCSAqCisJCSAqICAgICAgcGt0Y250ID0gTgorCQkgKiAgICAgIHhmZXJzaXplID0gTiAqIG1heHBhY2tldAorCQkgKi8KKwkJaWYgKChlcC0+eGZlcl9sZW4gLSBlcC0+eGZlcl9jb3VudCkgPT0gMCkgeworCQkJLyogWmVybyBMZW5ndGggUGFja2V0ICovCisJCQlkZXB0c2l6LmIueGZlcnNpemUgPSBlcC0+bWF4cGFja2V0OworCQkJZGVwdHNpei5iLnBrdGNudCA9IDE7CisJCX0gZWxzZSB7CisJCQlkZXB0c2l6LmIucGt0Y250ID0KKwkJCSAgICAoZXAtPnhmZXJfbGVuIC0gZXAtPnhmZXJfY291bnQgKworCQkJICAgICAoZXAtPm1heHBhY2tldCAtIDEpKSAvIGVwLT5tYXhwYWNrZXQ7CisJCQlpZiAoZGVwdHNpei5iLnBrdGNudCA+IE1BWF9QS1RfQ05UKSB7CisJCQkJZGVwdHNpei5iLnBrdGNudCA9IE1BWF9QS1RfQ05UOworCQkJfQorCQkJaWYgKCFjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJCQllcC0+eGZlcl9sZW4gPQorCQkJICAgIAkJZGVwdHNpei5iLnBrdGNudCAqIGVwLT5tYXhwYWNrZXQgKyBlcC0+eGZlcl9jb3VudDsKKwkJCX0KKwkJCWRlcHRzaXouYi54ZmVyc2l6ZSA9IGVwLT54ZmVyX2xlbiAtIGVwLT54ZmVyX2NvdW50OworCQl9CisKKwkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICJlcCVkIHhmZXJzaXplPSVkIHBrdGNudD0lZFxuIiwKKwkJCSAgICBlcC0+bnVtLCBkZXB0c2l6LmIueGZlcnNpemUsIGRlcHRzaXouYi5wa3RjbnQpOworCisJCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQlpZiAoIWNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJCURXQ19XUklURV9SRUczMigmb3V0X3JlZ3MtPmRvZXB0c2l6LAorCQkJCQkJZGVwdHNpei5kMzIpOworCisJCQkJRFdDX1dSSVRFX1JFRzMyKCYob3V0X3JlZ3MtPmRvZXBkbWEpLAorCQkJCQkJKHVpbnQzMl90KSBlcC0+ZG1hX2FkZHIpOworCQkJfSBlbHNlIHsKKyNpZmRlZiBEV0NfVVRFX0NGSQorCQkJCS8qIFRoZSBkZXNjcmlwdG9yIGNoYWluIHNob3VsZCBiZSBhbHJlYWR5IGluaXRpYWxpemVkIGJ5IG5vdyAqLworCQkJCWlmIChlcC0+YnVmZl9tb2RlICE9IEJNX1NUQU5EQVJEKSB7CisJCQkJCURXQ19XUklURV9SRUczMigmb3V0X3JlZ3MtPmRvZXBkbWEsCisJCQkJCQkJZXAtPmRlc2NzX2RtYV9hZGRyKTsKKwkJCQl9IGVsc2UgeworI2VuZGlmCisJCQkJCS8qKiBUaGlzIGlzIHVzZWQgZm9yIGludGVycnVwdCBvdXQgdHJhbnNmZXJzKi8KKwkJCQkJaWYgKCFlcC0+eGZlcl9sZW4pCisJCQkJCQllcC0+eGZlcl9sZW4gPSBlcC0+dG90YWxfbGVuOworCQkJCQlpbml0X2RtYV9kZXNjX2NoYWluKGNvcmVfaWYsIGVwKTsKKworCQkJCQlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRldl9vdXRfbmFrKSB7CisJCQkJCQlpZiAoZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0JVTEspIHsKKwkJCQkJCQlkZXB0c2l6LmIucGt0Y250ID0gKGVwLT50b3RhbF9sZW4gKworCQkJCQkJCQkoZXAtPm1heHBhY2tldCAtIDEpKSAvIGVwLT5tYXhwYWNrZXQ7CisJCQkJCQkJZGVwdHNpei5iLnhmZXJzaXplID0gZXAtPnRvdGFsX2xlbjsKKwkJCQkJCQkvKiBSZW1lbWJlciBpbml0aWFsIHZhbHVlIG9mIGRvZXB0c2l6ICovCisJCQkJCQkJY29yZV9pZi0+c3RhcnRfZG9lcHRzaXpfdmFsW2VwLT5udW1dID0gZGVwdHNpei5kMzI7CisJCQkJCQkJRFdDX1dSSVRFX1JFRzMyKCZvdXRfcmVncy0+ZG9lcHRzaXosCisJCQkJCQkJCWRlcHRzaXouZDMyKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCS8qKiBET0VQRE1BbiBSZWdpc3RlciB3cml0ZSAqLworCQkJCQlEV0NfV1JJVEVfUkVHMzIoJm91dF9yZWdzLT5kb2VwZG1hLAorCQkJCQkJCWVwLT5kbWFfZGVzY19hZGRyKTsKKyNpZmRlZiBEV0NfVVRFX0NGSQorCQkJCX0KKyNlbmRpZgorCQkJfQorCQl9IGVsc2UgeworCQkJRFdDX1dSSVRFX1JFRzMyKCZvdXRfcmVncy0+ZG9lcHRzaXosIGRlcHRzaXouZDMyKTsKKwkJfQorCisJCWlmIChlcC0+dHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykKKwkJeworCQkJZHN0c19kYXRhX3QgZHN0cyA9IHsuZDMyID0gMH07CisJCQlpZiAoZXAtPmJJbnRlcnZhbCA9PSAxKSB7CisJCQkJZHN0cy5kMzIgPQorCQkJCQlEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRzdHMpOworCQkJCWVwLT5mcmFtZV9udW0gPSBkc3RzLmIuc29mZm4gKyBlcC0+YkludGVydmFsOworCQkJCWlmIChlcC0+ZnJhbWVfbnVtID4gMHgzRkZGKQorCQkJCXsKKwkJCQkJZXAtPmZybV9vdmVycnVuID0gMTsKKwkJCQkJZXAtPmZyYW1lX251bSAmPSAweDNGRkY7CisJCQkJfSBlbHNlCisJCQkJCWVwLT5mcm1fb3ZlcnJ1biA9IDA7CisKKwkJCQlpZiAoZXAtPmZyYW1lX251bSAmIDB4MSkgeworCQkJCQlkZXBjdGwuYi5zZXRkMXBpZCA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJZGVwY3RsLmIuc2V0ZDBwaWQgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIEVQIGVuYWJsZSAqLworCQlkZXBjdGwuYi5jbmFrID0gMTsKKwkJZGVwY3RsLmIuZXBlbmEgPSAxOworCisJCURXQ19XUklURV9SRUczMigmb3V0X3JlZ3MtPmRvZXBjdGwsIGRlcGN0bC5kMzIpOworCisJCURXQ19ERUJVR1BMKERCR19QQ0QsICJET0VQQ1RMPSUwOHggRE9FUFRTSVo9JTA4eFxuIiwKKwkJCSAgICBEV0NfUkVBRF9SRUczMigmb3V0X3JlZ3MtPmRvZXBjdGwpLAorCQkJICAgIERXQ19SRUFEX1JFRzMyKCZvdXRfcmVncy0+ZG9lcHRzaXopKTsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkRBSU5UTVNLPSUwOHggR0lOVE1TSz0lMDh4XG4iLAorCQkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPgorCQkJCQkgICBkZXZfZ2xvYmFsX3JlZ3MtPmRhaW50bXNrKSwKKwkJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+CisJCQkJCSAgIGNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2spKTsKKworCisJCS8qIFRpbWVyIGlzIHNjaGVkdWxpbmcgb25seSBmb3Igb3V0IGJ1bGsgdHJhbnNmZXJzIGZvcgorCQkgKiAiRGV2aWNlIERETUEgT1VUIE5BSyBFbmhhbmNlbWVudCIgZmVhdHVyZSB0byBpbmZvcm0gdXNlcgorCQkgKiBhYm91dCByZWNlaXZlZCBkYXRhIHBheWxvYWQgaW4gY2FzZSBvZiB0aW1lb3V0CisJCSAqLworCQlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRldl9vdXRfbmFrKSB7CisJCQlpZiAoZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0JVTEspIHsKKwkJCQljb3JlX2lmLT5lcF94ZmVyX2luZm9bZXAtPm51bV0uY29yZV9pZiA9IGNvcmVfaWY7CisJCQkJY29yZV9pZi0+ZXBfeGZlcl9pbmZvW2VwLT5udW1dLmVwID0gZXA7CisJCQkJY29yZV9pZi0+ZXBfeGZlcl9pbmZvW2VwLT5udW1dLnN0YXRlID0gMTsKKworCQkJCS8qIFN0YXJ0IGEgdGltZXIgZm9yIHRoaXMgdHJhbnNmZXIuICovCisJCQkJRFdDX1RJTUVSX1NDSEVEVUxFKGNvcmVfaWYtPmVwX3hmZXJfdGltZXJbZXAtPm51bV0sIDEwMDAwKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHVwIGEgemVybyBsZW5ndGggdHJhbnNmZXIgaW4gQnVmZmVyIERNQSBhbmQKKyAqIFNsYXZlIG1vZGVzIGZvciB1c2IgcmVxdWVzdHMgd2l0aCB6ZXJvIGZpZWxkIHNldAorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGVwIFRoZSBFUCB0byBzdGFydCB0aGUgdHJhbnNmZXIgb24uCisgKgorICovCit2b2lkIGR3Y19vdGdfZXBfc3RhcnRfemxfdHJhbnNmZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBkd2NfZXBfdCAqIGVwKQoreworCisJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJZGVwdHNpel9kYXRhX3QgZGVwdHNpejsKKwlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKworCURXQ19ERUJVR1BMKChEQkdfUENEViB8IERCR19DSUxWKSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwlEV0NfUFJJTlRGKCJ6ZXJvIGxlbmd0aCB0cmFuc2ZlciBpcyBjYWxsZWRcbiIpOworCisJLyogSU4gZW5kcG9pbnQgKi8KKwlpZiAoZXAtPmlzX2luID09IDEpIHsKKwkJZHdjX290Z19kZXZfaW5fZXBfcmVnc190ICppbl9yZWdzID0KKwkJICAgIGNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tlcC0+bnVtXTsKKworCQlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJihpbl9yZWdzLT5kaWVwY3RsKSk7CisJCWRlcHRzaXouZDMyID0gRFdDX1JFQURfUkVHMzIoJihpbl9yZWdzLT5kaWVwdHNpeikpOworCisJCWRlcHRzaXouYi54ZmVyc2l6ZSA9IDA7CisJCWRlcHRzaXouYi5wa3RjbnQgPSAxOworCisJCS8qIFdyaXRlIHRoZSBETUEgcmVnaXN0ZXIgKi8KKwkJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJCWlmIChjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUgPT0gMCkgeworCQkJCWRlcHRzaXouYi5tYyA9IDE7CisJCQkJRFdDX1dSSVRFX1JFRzMyKCZpbl9yZWdzLT5kaWVwdHNpeiwKKwkJCQkJCWRlcHRzaXouZDMyKTsKKwkJCQlEV0NfV1JJVEVfUkVHMzIoJihpbl9yZWdzLT5kaWVwZG1hKSwKKwkJCQkJCSh1aW50MzJfdCkgZXAtPmRtYV9hZGRyKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCURXQ19XUklURV9SRUczMigmaW5fcmVncy0+ZGllcHRzaXosIGRlcHRzaXouZDMyKTsKKwkJCS8qKgorCQkJICogRW5hYmxlIHRoZSBOb24tUGVyaW9kaWMgVHggRklGTyBlbXB0eSBpbnRlcnJ1cHQsCisJCQkgKiBvciB0aGUgVHggRklGTyBlcG10eSBpbnRlcnJ1cHQgaW4gZGVkaWNhdGVkIFR4IEZJRk8gbW9kZSwKKwkJCSAqIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiBpbnRvIHRoZSBmaWZvIGJ5IHRoZSBJU1IuCisJCQkgKi8KKwkJCWlmIChjb3JlX2lmLT5lbl9tdWx0aXBsZV90eF9maWZvID09IDApIHsKKwkJCQlpbnRyX21hc2suYi5ucHR4ZmVtcHR5ID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCSBjb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLAorCQkJCQkJIGludHJfbWFzay5kMzIsIGludHJfbWFzay5kMzIpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBFbmFibGUgdGhlIFR4IEZJRk8gRW1wdHkgSW50ZXJydXB0IGZvciB0aGlzIEVQICovCisJCQkJaWYgKGVwLT54ZmVyX2xlbiA+IDApIHsKKwkJCQkJdWludDMyX3QgZmlmb2VtcHR5bXNrID0gMDsKKwkJCQkJZmlmb2VtcHR5bXNrID0gMSA8PCBlcC0+bnVtOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmR0a25xcjRfZmlmb2VtcHR5bXNrLAorCQkJCQkJCSAwLCBmaWZvZW1wdHltc2spOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghY29yZV9pZi0+Y29yZV9wYXJhbXMtPmVuX211bHRpcGxlX3R4X2ZpZm8gJiYgY29yZV9pZi0+ZG1hX2VuYWJsZSkKKwkJCWRlcGN0bC5iLm5leHRlcCA9IGNvcmVfaWYtPm5leHRlcF9zZXFbZXAtPm51bV07CisJCS8qIEVQIGVuYWJsZSwgSU4gZGF0YSBpbiBGSUZPICovCisJCWRlcGN0bC5iLmNuYWsgPSAxOworCQlkZXBjdGwuYi5lcGVuYSA9IDE7CisJCURXQ19XUklURV9SRUczMigmaW5fcmVncy0+ZGllcGN0bCwgZGVwY3RsLmQzMik7CisKKwl9IGVsc2UgeworCQkvKiBPVVQgZW5kcG9pbnQgKi8KKwkJZHdjX290Z19kZXZfb3V0X2VwX3JlZ3NfdCAqb3V0X3JlZ3MgPQorCQkgICAgY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tlcC0+bnVtXTsKKworCQlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJihvdXRfcmVncy0+ZG9lcGN0bCkpOworCQlkZXB0c2l6LmQzMiA9IERXQ19SRUFEX1JFRzMyKCYob3V0X3JlZ3MtPmRvZXB0c2l6KSk7CisKKwkJLyogWmVybyBMZW5ndGggUGFja2V0ICovCisJCWRlcHRzaXouYi54ZmVyc2l6ZSA9IGVwLT5tYXhwYWNrZXQ7CisJCWRlcHRzaXouYi5wa3RjbnQgPSAxOworCisJCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQlpZiAoIWNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJCURXQ19XUklURV9SRUczMigmb3V0X3JlZ3MtPmRvZXB0c2l6LAorCQkJCQkJZGVwdHNpei5kMzIpOworCisJCQkJRFdDX1dSSVRFX1JFRzMyKCYob3V0X3JlZ3MtPmRvZXBkbWEpLAorCQkJCQkJKHVpbnQzMl90KSBlcC0+ZG1hX2FkZHIpOworCQkJfQorCQl9IGVsc2UgeworCQkJRFdDX1dSSVRFX1JFRzMyKCZvdXRfcmVncy0+ZG9lcHRzaXosIGRlcHRzaXouZDMyKTsKKwkJfQorCisJCS8qIEVQIGVuYWJsZSAqLworCQlkZXBjdGwuYi5jbmFrID0gMTsKKwkJZGVwY3RsLmIuZXBlbmEgPSAxOworCisJCURXQ19XUklURV9SRUczMigmb3V0X3JlZ3MtPmRvZXBjdGwsIGRlcGN0bC5kMzIpOworCisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGUgc2V0dXAgZm9yIGEgZGF0YSB0cmFuc2ZlciBmb3IgRVAwIGFuZCBzdGFydHMKKyAqIHRoZSB0cmFuc2Zlci4gIEZvciBhbiBJTiB0cmFuc2ZlciwgdGhlIHBhY2tldHMgd2lsbCBiZSBsb2FkZWQgaW50bworICogdGhlIGFwcHJvcHJpYXRlIFR4IEZJRk8gaW4gdGhlIElTUi4gRm9yIE9VVCB0cmFuc2ZlcnMsIHRoZSBwYWNrZXRzIGFyZQorICogdW5sb2FkZWQgZnJvbSB0aGUgUnggRklGTyBpbiB0aGUgSVNSLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGVwIFRoZSBFUDAgZGF0YS4KKyAqLwordm9pZCBkd2Nfb3RnX2VwMF9zdGFydF90cmFuc2Zlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGR3Y19lcF90ICogZXApCit7CisJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJZGVwdHNpejBfZGF0YV90IGRlcHRzaXo7CisJZ2ludG1za19kYXRhX3QgaW50cl9tYXNrID0gey5kMzIgPSAwIH07CisJZHdjX290Z19kZXZfZG1hX2Rlc2NfdCAqZG1hX2Rlc2M7CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAiZXAlZC0lcyB4ZmVyX2xlbj0lZCB4ZmVyX2NudD0lZCAiCisJCSAgICAieGZlcl9idWZmPSVwIHN0YXJ0X3hmZXJfYnVmZj0lcCBcbiIsCisJCSAgICBlcC0+bnVtLCAoZXAtPmlzX2luID8gIklOIiA6ICJPVVQiKSwgZXAtPnhmZXJfbGVuLAorCQkgICAgZXAtPnhmZXJfY291bnQsIGVwLT54ZmVyX2J1ZmYsIGVwLT5zdGFydF94ZmVyX2J1ZmYpOworCisJZXAtPnRvdGFsX2xlbiA9IGVwLT54ZmVyX2xlbjsKKworCS8qIElOIGVuZHBvaW50ICovCisJaWYgKGVwLT5pc19pbiA9PSAxKSB7CisJCWR3Y19vdGdfZGV2X2luX2VwX3JlZ3NfdCAqaW5fcmVncyA9CisJCSAgICBjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbMF07CisKKwkJZ25wdHhzdHNfZGF0YV90IGd0eHN0YXR1czsKKworCQlndHhzdGF0dXMuZDMyID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbnB0eHN0cyk7CisKKwkJaWYgKGNvcmVfaWYtPmVuX211bHRpcGxlX3R4X2ZpZm8gPT0gMAorCQkgICAgJiYgZ3R4c3RhdHVzLmIubnB0eHFzcGNhdmFpbCA9PSAwCisJCSAgICAmJiAhY29yZV9pZi0+ZG1hX2VuYWJsZSkgeworI2lmZGVmIERFQlVHCisJCQlkZXB0c2l6LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZpbl9yZWdzLT5kaWVwdHNpeik7CisJCQlEV0NfREVCVUdQTChEQkdfUENELCAiRElFUENUTDA9JTB4XG4iLAorCQkJCSAgICBEV0NfUkVBRF9SRUczMigmaW5fcmVncy0+ZGllcGN0bCkpOworCQkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkRJRVBUU0laMD0lMHggKHN6PSVkLCBwY250PSVkKVxuIiwKKwkJCQkgICAgZGVwdHNpei5kMzIsCisJCQkJICAgIGRlcHRzaXouYi54ZmVyc2l6ZSwgZGVwdHNpei5iLnBrdGNudCk7CisJCQlEV0NfUFJJTlRGKCJUWCBRdWV1ZSBvciBGSUZPIEZ1bGwgKDB4JTB4KVxuIiwKKwkJCQkgICBndHhzdGF0dXMuZDMyKTsKKyNlbmRpZgorCQkJcmV0dXJuOworCQl9CisKKwkJZGVwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZpbl9yZWdzLT5kaWVwY3RsKTsKKwkJZGVwdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmaW5fcmVncy0+ZGllcHRzaXopOworCisJCS8qIFplcm8gTGVuZ3RoIFBhY2tldD8gKi8KKwkJaWYgKGVwLT54ZmVyX2xlbiA9PSAwKSB7CisJCQlkZXB0c2l6LmIueGZlcnNpemUgPSAwOworCQkJZGVwdHNpei5iLnBrdGNudCA9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBQcm9ncmFtIHRoZSB0cmFuc2ZlciBzaXplIGFuZCBwYWNrZXQgY291bnQKKwkJCSAqICAgICAgYXMgZm9sbG93czogeGZlcnNpemUgPSBOICogbWF4cGFja2V0ICsKKwkJCSAqICAgICAgc2hvcnRfcGFja2V0IHBrdGNudCA9IE4gKyAoc2hvcnRfcGFja2V0CisJCQkgKiAgICAgIGV4aXN0ID8gMSA6IDApCisJCQkgKi8KKwkJCWlmIChlcC0+eGZlcl9sZW4gPiBlcC0+bWF4cGFja2V0KSB7CisJCQkJZXAtPnhmZXJfbGVuID0gZXAtPm1heHBhY2tldDsKKwkJCQlkZXB0c2l6LmIueGZlcnNpemUgPSBlcC0+bWF4cGFja2V0OworCQkJfSBlbHNlIHsKKwkJCQlkZXB0c2l6LmIueGZlcnNpemUgPSBlcC0+eGZlcl9sZW47CisJCQl9CisJCQlkZXB0c2l6LmIucGt0Y250ID0gMTsKKworCQl9CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLAorCQkJICAgICJJTiBsZW49JWQgIHhmZXJzaXplPSVkIHBrdGNudD0lZCBbJTA4eF1cbiIsCisJCQkgICAgZXAtPnhmZXJfbGVuLCBkZXB0c2l6LmIueGZlcnNpemUsIGRlcHRzaXouYi5wa3RjbnQsCisJCQkgICAgZGVwdHNpei5kMzIpOworCisJCS8qIFdyaXRlIHRoZSBETUEgcmVnaXN0ZXIgKi8KKwkJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJCWlmIChjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUgPT0gMCkgeworCQkJCURXQ19XUklURV9SRUczMigmaW5fcmVncy0+ZGllcHRzaXosCisJCQkJCQlkZXB0c2l6LmQzMik7CisKKwkJCQlEV0NfV1JJVEVfUkVHMzIoJihpbl9yZWdzLT5kaWVwZG1hKSwKKwkJCQkJCSh1aW50MzJfdCkgZXAtPmRtYV9hZGRyKTsKKwkJCX0gZWxzZSB7CisJCQkJZG1hX2Rlc2MgPSBjb3JlX2lmLT5kZXZfaWYtPmluX2Rlc2NfYWRkcjsKKworCQkJCS8qKiBETUEgRGVzY3JpcHRvciBTZXR1cCAqLworCQkJCWRtYV9kZXNjLT5zdGF0dXMuYi5icyA9IEJTX0hPU1RfQlVTWTsKKwkJCQlkbWFfZGVzYy0+c3RhdHVzLmIubCA9IDE7CisJCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmlvYyA9IDE7CisJCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLnNwID0KKwkJCQkgICAgKGVwLT54ZmVyX2xlbiA9PSBlcC0+bWF4cGFja2V0KSA/IDAgOiAxOworCQkJCWRtYV9kZXNjLT5zdGF0dXMuYi5ieXRlcyA9IGVwLT54ZmVyX2xlbjsKKwkJCQlkbWFfZGVzYy0+YnVmID0gZXAtPmRtYV9hZGRyOworCQkJCWRtYV9kZXNjLT5zdGF0dXMuYi5zdHMgPSAwOworCQkJCWRtYV9kZXNjLT5zdGF0dXMuYi5icyA9IEJTX0hPU1RfUkVBRFk7CisKKwkJCQkvKiogRElFUERNQTAgUmVnaXN0ZXIgd3JpdGUgKi8KKwkJCQlEV0NfV1JJVEVfUkVHMzIoJmluX3JlZ3MtPmRpZXBkbWEsCisJCQkJCQljb3JlX2lmLT4KKwkJCQkJCWRldl9pZi0+ZG1hX2luX2Rlc2NfYWRkcik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmluX3JlZ3MtPmRpZXB0c2l6LCBkZXB0c2l6LmQzMik7CisJCX0KKworCQlpZiAoIWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5lbl9tdWx0aXBsZV90eF9maWZvICYmIGNvcmVfaWYtPmRtYV9lbmFibGUpCisJCQlkZXBjdGwuYi5uZXh0ZXAgPSBjb3JlX2lmLT5uZXh0ZXBfc2VxW2VwLT5udW1dOworCQkvKiBFUCBlbmFibGUsIElOIGRhdGEgaW4gRklGTyAqLworCQlkZXBjdGwuYi5jbmFrID0gMTsKKwkJZGVwY3RsLmIuZXBlbmEgPSAxOworCQlEV0NfV1JJVEVfUkVHMzIoJmluX3JlZ3MtPmRpZXBjdGwsIGRlcGN0bC5kMzIpOworCisJCS8qKgorCQkgKiBFbmFibGUgdGhlIE5vbi1QZXJpb2RpYyBUeCBGSUZPIGVtcHR5IGludGVycnVwdCwgdGhlCisJCSAqIGRhdGEgd2lsbCBiZSB3cml0dGVuIGludG8gdGhlIGZpZm8gYnkgdGhlIElTUi4KKwkJICovCisJCWlmICghY29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQkJaWYgKGNvcmVfaWYtPmVuX211bHRpcGxlX3R4X2ZpZm8gPT0gMCkgeworCQkJCWludHJfbWFzay5iLm5wdHhmZW1wdHkgPSAxOworCQkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPgorCQkJCQkJIGNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssCisJCQkJCQkgaW50cl9tYXNrLmQzMiwgaW50cl9tYXNrLmQzMik7CisJCQl9IGVsc2UgeworCQkJCS8qIEVuYWJsZSB0aGUgVHggRklGTyBFbXB0eSBJbnRlcnJ1cHQgZm9yIHRoaXMgRVAgKi8KKwkJCQlpZiAoZXAtPnhmZXJfbGVuID4gMCkgeworCQkJCQl1aW50MzJfdCBmaWZvZW1wdHltc2sgPSAwOworCQkJCQlmaWZvZW1wdHltc2sgfD0gMSA8PCBlcC0+bnVtOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmR0a25xcjRfZmlmb2VtcHR5bXNrLAorCQkJCQkJCSAwLCBmaWZvZW1wdHltc2spOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIE9VVCBlbmRwb2ludCAqLworCQlkd2Nfb3RnX2Rldl9vdXRfZXBfcmVnc190ICpvdXRfcmVncyA9CisJCSAgICBjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzWzBdOworCisJCWRlcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmb3V0X3JlZ3MtPmRvZXBjdGwpOworCQlkZXB0c2l6LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZvdXRfcmVncy0+ZG9lcHRzaXopOworCisJCS8qIFByb2dyYW0gdGhlIHRyYW5zZmVyIHNpemUgYW5kIHBhY2tldCBjb3VudCBhcyBmb2xsb3dzOgorCQkgKiAgICAgIHhmZXJzaXplID0gTiAqIChtYXhwYWNrZXQgKyA0IC0gKG1heHBhY2tldCAlIDQpKQorCQkgKiAgICAgIHBrdGNudCA9IE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCS8qIFplcm8gTGVuZ3RoIFBhY2tldCAqLworCQlkZXB0c2l6LmIueGZlcnNpemUgPSBlcC0+bWF4cGFja2V0OworCQlkZXB0c2l6LmIucGt0Y250ID0gMTsKKworCQlEV0NfREVCVUdQTChEQkdfUENEViwgImxlbj0lZCAgeGZlcnNpemU9JWQgcGt0Y250PSVkXG4iLAorCQkJICAgIGVwLT54ZmVyX2xlbiwgZGVwdHNpei5iLnhmZXJzaXplLCBkZXB0c2l6LmIucGt0Y250KTsKKworCQlpZiAoY29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQkJaWYgKCFjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJCQlEV0NfV1JJVEVfUkVHMzIoJm91dF9yZWdzLT5kb2VwdHNpeiwKKwkJCQkJCWRlcHRzaXouZDMyKTsKKworCQkJCURXQ19XUklURV9SRUczMigmKG91dF9yZWdzLT5kb2VwZG1hKSwKKwkJCQkJCSh1aW50MzJfdCkgZXAtPmRtYV9hZGRyKTsKKwkJCX0gZWxzZSB7CisJCQkJZG1hX2Rlc2MgPSBjb3JlX2lmLT5kZXZfaWYtPm91dF9kZXNjX2FkZHI7CisKKwkJCQkvKiogRE1BIERlc2NyaXB0b3IgU2V0dXAgKi8KKwkJCQlkbWFfZGVzYy0+c3RhdHVzLmIuYnMgPSBCU19IT1NUX0JVU1k7CisJCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmwgPSAxOworCQkJCWRtYV9kZXNjLT5zdGF0dXMuYi5pb2MgPSAxOworCQkJCWRtYV9kZXNjLT5zdGF0dXMuYi5ieXRlcyA9IGVwLT5tYXhwYWNrZXQ7CisJCQkJZG1hX2Rlc2MtPmJ1ZiA9IGVwLT5kbWFfYWRkcjsKKwkJCQlkbWFfZGVzYy0+c3RhdHVzLmIuc3RzID0gMDsKKwkJCQlkbWFfZGVzYy0+c3RhdHVzLmIuYnMgPSBCU19IT1NUX1JFQURZOworCisJCQkJLyoqIERPRVBETUEwIFJlZ2lzdGVyIHdyaXRlICovCisJCQkJRFdDX1dSSVRFX1JFRzMyKCZvdXRfcmVncy0+ZG9lcGRtYSwKKwkJCQkJCWNvcmVfaWYtPgorCQkJCQkJZGV2X2lmLT5kbWFfb3V0X2Rlc2NfYWRkcik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlEV0NfV1JJVEVfUkVHMzIoJm91dF9yZWdzLT5kb2VwdHNpeiwgZGVwdHNpei5kMzIpOworCQl9CisKKwkJLyogRVAgZW5hYmxlICovCisJCWRlcGN0bC5iLmNuYWsgPSAxOworCQlkZXBjdGwuYi5lcGVuYSA9IDE7CisJCURXQ19XUklURV9SRUczMigmKG91dF9yZWdzLT5kb2VwY3RsKSwgZGVwY3RsLmQzMik7CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gY29udGludWVzIGNvbnRyb2wgSU4gdHJhbnNmZXJzIHN0YXJ0ZWQgYnkKKyAqIGR3Y19vdGdfZXAwX3N0YXJ0X3RyYW5zZmVyLCB3aGVuIHRoZSB0cmFuc2ZlciBkb2VzIG5vdCBmaXQgaW4gYQorICogc2luZ2xlIHBhY2tldC4gIE5PVEU6IFRoZSBESUVQQ1RMMC9ET0VQQ1RMMCByZWdpc3RlcnMgb25seSBoYXZlIG9uZQorICogYml0IGZvciB0aGUgcGFja2V0IGNvdW50LgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGVwIFRoZSBFUDAgZGF0YS4KKyAqLwordm9pZCBkd2Nfb3RnX2VwMF9jb250aW51ZV90cmFuc2Zlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGR3Y19lcF90ICogZXApCit7CisJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJZGVwdHNpejBfZGF0YV90IGRlcHRzaXo7CisJZ2ludG1za19kYXRhX3QgaW50cl9tYXNrID0gey5kMzIgPSAwIH07CisJZHdjX290Z19kZXZfZG1hX2Rlc2NfdCAqZG1hX2Rlc2M7CisKKwlpZiAoZXAtPmlzX2luID09IDEpIHsKKwkJZHdjX290Z19kZXZfaW5fZXBfcmVnc190ICppbl9yZWdzID0KKwkJICAgIGNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1swXTsKKwkJZ25wdHhzdHNfZGF0YV90IHR4X3N0YXR1cyA9IHsuZDMyID0gMCB9OworCisJCXR4X3N0YXR1cy5kMzIgPQorCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmducHR4c3RzKTsKKwkJLyoqIEB0b2RvIFNob3VsZCB0aGVyZSBiZSBjaGVjayBmb3Igcm9vbSBpbiB0aGUgVHgKKwkJICogU3RhdHVzIFF1ZXVlLiAgSWYgbm90IHJlbW92ZSB0aGUgY29kZSBhYm92ZSB0aGlzIGNvbW1lbnQuICovCisKKwkJZGVwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZpbl9yZWdzLT5kaWVwY3RsKTsKKwkJZGVwdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmaW5fcmVncy0+ZGllcHRzaXopOworCisJCS8qIFByb2dyYW0gdGhlIHRyYW5zZmVyIHNpemUgYW5kIHBhY2tldCBjb3VudAorCQkgKiAgICAgIGFzIGZvbGxvd3M6IHhmZXJzaXplID0gTiAqIG1heHBhY2tldCArCisJCSAqICAgICAgc2hvcnRfcGFja2V0IHBrdGNudCA9IE4gKyAoc2hvcnRfcGFja2V0CisJCSAqICAgICAgZXhpc3QgPyAxIDogMCkKKwkJICovCisKKwkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSA9PSAwKSB7CisJCQlkZXB0c2l6LmIueGZlcnNpemUgPQorCQkJICAgIChlcC0+dG90YWxfbGVuIC0gZXAtPnhmZXJfY291bnQpID4KKwkJCSAgICBlcC0+bWF4cGFja2V0ID8gZXAtPm1heHBhY2tldCA6IChlcC0+dG90YWxfbGVuIC0KKwkJCQkJCQkgICAgIGVwLT54ZmVyX2NvdW50KTsKKwkJCWRlcHRzaXouYi5wa3RjbnQgPSAxOworCQkJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUgPT0gMCkgeworCQkJCWVwLT54ZmVyX2xlbiArPSBkZXB0c2l6LmIueGZlcnNpemU7CisJCQl9IGVsc2UgeworCQkJCWVwLT54ZmVyX2xlbiA9IGRlcHRzaXouYi54ZmVyc2l6ZTsKKwkJCX0KKwkJCURXQ19XUklURV9SRUczMigmaW5fcmVncy0+ZGllcHRzaXosIGRlcHRzaXouZDMyKTsKKwkJfSBlbHNlIHsKKwkJCWVwLT54ZmVyX2xlbiA9CisJCQkgICAgKGVwLT50b3RhbF9sZW4gLSBlcC0+eGZlcl9jb3VudCkgPgorCQkJICAgIGVwLT5tYXhwYWNrZXQgPyBlcC0+bWF4cGFja2V0IDogKGVwLT50b3RhbF9sZW4gLQorCQkJCQkJCSAgICAgZXAtPnhmZXJfY291bnQpOworCisJCQlkbWFfZGVzYyA9IGNvcmVfaWYtPmRldl9pZi0+aW5fZGVzY19hZGRyOworCisJCQkvKiogRE1BIERlc2NyaXB0b3IgU2V0dXAgKi8KKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5icyA9IEJTX0hPU1RfQlVTWTsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5sID0gMTsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5pb2MgPSAxOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLnNwID0KKwkJCSAgICAoZXAtPnhmZXJfbGVuID09IGVwLT5tYXhwYWNrZXQpID8gMCA6IDE7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuYnl0ZXMgPSBlcC0+eGZlcl9sZW47CisJCQlkbWFfZGVzYy0+YnVmID0gZXAtPmRtYV9hZGRyOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLnN0cyA9IDA7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuYnMgPSBCU19IT1NUX1JFQURZOworCisJCQkvKiogRElFUERNQTAgUmVnaXN0ZXIgd3JpdGUgKi8KKwkJCURXQ19XUklURV9SRUczMigmaW5fcmVncy0+ZGllcGRtYSwKKwkJCQkJY29yZV9pZi0+ZGV2X2lmLT5kbWFfaW5fZGVzY19hZGRyKTsKKwkJfQorCisJCURXQ19ERUJVR1BMKERCR19QQ0RWLAorCQkJICAgICJJTiBsZW49JWQgIHhmZXJzaXplPSVkIHBrdGNudD0lZCBbJTA4eF1cbiIsCisJCQkgICAgZXAtPnhmZXJfbGVuLCBkZXB0c2l6LmIueGZlcnNpemUsIGRlcHRzaXouYi5wa3RjbnQsCisJCQkgICAgZGVwdHNpei5kMzIpOworCisJCS8qIFdyaXRlIHRoZSBETUEgcmVnaXN0ZXIgKi8KKwkJaWYgKGNvcmVfaWYtPmh3Y2ZnMi5iLmFyY2hpdGVjdHVyZSA9PSBEV0NfSU5UX0RNQV9BUkNIKSB7CisJCQlpZiAoY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlID09IDApCisJCQkJRFdDX1dSSVRFX1JFRzMyKCYoaW5fcmVncy0+ZGllcGRtYSksCisJCQkJCQkodWludDMyX3QpIGVwLT5kbWFfYWRkcik7CisJCX0KKwkJaWYgKCFjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZW5fbXVsdGlwbGVfdHhfZmlmbyAmJiBjb3JlX2lmLT5kbWFfZW5hYmxlKQorCQkJZGVwY3RsLmIubmV4dGVwID0gY29yZV9pZi0+bmV4dGVwX3NlcVtlcC0+bnVtXTsKKwkJLyogRVAgZW5hYmxlLCBJTiBkYXRhIGluIEZJRk8gKi8KKwkJZGVwY3RsLmIuY25hayA9IDE7CisJCWRlcGN0bC5iLmVwZW5hID0gMTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZpbl9yZWdzLT5kaWVwY3RsLCBkZXBjdGwuZDMyKTsKKworCQkvKioKKwkJICogRW5hYmxlIHRoZSBOb24tUGVyaW9kaWMgVHggRklGTyBlbXB0eSBpbnRlcnJ1cHQsIHRoZQorCQkgKiBkYXRhIHdpbGwgYmUgd3JpdHRlbiBpbnRvIHRoZSBmaWZvIGJ5IHRoZSBJU1IuCisJCSAqLworCQlpZiAoIWNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJCWlmIChjb3JlX2lmLT5lbl9tdWx0aXBsZV90eF9maWZvID09IDApIHsKKwkJCQkvKiBGaXJzdCBjbGVhciBpdCBmcm9tIEdJTlRTVFMgKi8KKwkJCQlpbnRyX21hc2suYi5ucHR4ZmVtcHR5ID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCSBjb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLAorCQkJCQkJIGludHJfbWFzay5kMzIsIGludHJfbWFzay5kMzIpOworCisJCQl9IGVsc2UgeworCQkJCS8qIEVuYWJsZSB0aGUgVHggRklGTyBFbXB0eSBJbnRlcnJ1cHQgZm9yIHRoaXMgRVAgKi8KKwkJCQlpZiAoZXAtPnhmZXJfbGVuID4gMCkgeworCQkJCQl1aW50MzJfdCBmaWZvZW1wdHltc2sgPSAwOworCQkJCQlmaWZvZW1wdHltc2sgfD0gMSA8PCBlcC0+bnVtOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmR0a25xcjRfZmlmb2VtcHR5bXNrLAorCQkJCQkJCSAwLCBmaWZvZW1wdHltc2spOworCQkJCX0KKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWR3Y19vdGdfZGV2X291dF9lcF9yZWdzX3QgKm91dF9yZWdzID0KKwkJICAgIGNvcmVfaWYtPmRldl9pZi0+b3V0X2VwX3JlZ3NbMF07CisKKwkJZGVwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZvdXRfcmVncy0+ZG9lcGN0bCk7CisJCWRlcHRzaXouZDMyID0gRFdDX1JFQURfUkVHMzIoJm91dF9yZWdzLT5kb2VwdHNpeik7CisKKwkJLyogUHJvZ3JhbSB0aGUgdHJhbnNmZXIgc2l6ZSBhbmQgcGFja2V0IGNvdW50CisJCSAqICAgICAgYXMgZm9sbG93czogeGZlcnNpemUgPSBOICogbWF4cGFja2V0ICsKKwkJICogICAgICBzaG9ydF9wYWNrZXQgcGt0Y250ID0gTiArIChzaG9ydF9wYWNrZXQKKwkJICogICAgICBleGlzdCA/IDEgOiAwKQorCQkgKi8KKwkJZGVwdHNpei5iLnhmZXJzaXplID0gZXAtPm1heHBhY2tldDsKKwkJZGVwdHNpei5iLnBrdGNudCA9IDE7CisKKwkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSA9PSAwKSB7CisJCQlEV0NfV1JJVEVfUkVHMzIoJm91dF9yZWdzLT5kb2VwdHNpeiwgZGVwdHNpei5kMzIpOworCQl9IGVsc2UgeworCQkJZG1hX2Rlc2MgPSBjb3JlX2lmLT5kZXZfaWYtPm91dF9kZXNjX2FkZHI7CisKKwkJCS8qKiBETUEgRGVzY3JpcHRvciBTZXR1cCAqLworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmJzID0gQlNfSE9TVF9CVVNZOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmwgPSAxOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmlvYyA9IDE7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuYnl0ZXMgPSBlcC0+bWF4cGFja2V0OworCQkJZG1hX2Rlc2MtPmJ1ZiA9IGVwLT5kbWFfYWRkcjsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5zdHMgPSAwOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmJzID0gQlNfSE9TVF9SRUFEWTsKKworCQkJLyoqIERPRVBETUEwIFJlZ2lzdGVyIHdyaXRlICovCisJCQlEV0NfV1JJVEVfUkVHMzIoJm91dF9yZWdzLT5kb2VwZG1hLAorCQkJCQljb3JlX2lmLT5kZXZfaWYtPmRtYV9vdXRfZGVzY19hZGRyKTsKKwkJfQorCisJCURXQ19ERUJVR1BMKERCR19QQ0RWLAorCQkJICAgICJJTiBsZW49JWQgIHhmZXJzaXplPSVkIHBrdGNudD0lZCBbJTA4eF1cbiIsCisJCQkgICAgZXAtPnhmZXJfbGVuLCBkZXB0c2l6LmIueGZlcnNpemUsIGRlcHRzaXouYi5wa3RjbnQsCisJCQkgICAgZGVwdHNpei5kMzIpOworCisJCS8qIFdyaXRlIHRoZSBETUEgcmVnaXN0ZXIgKi8KKwkJaWYgKGNvcmVfaWYtPmh3Y2ZnMi5iLmFyY2hpdGVjdHVyZSA9PSBEV0NfSU5UX0RNQV9BUkNIKSB7CisJCQlpZiAoY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlID09IDApCisJCQkJRFdDX1dSSVRFX1JFRzMyKCYob3V0X3JlZ3MtPmRvZXBkbWEpLAorCQkJCQkJKHVpbnQzMl90KSBlcC0+ZG1hX2FkZHIpOworCisJCX0KKworCQkvKiBFUCBlbmFibGUsIElOIGRhdGEgaW4gRklGTyAqLworCQlkZXBjdGwuYi5jbmFrID0gMTsKKwkJZGVwY3RsLmIuZXBlbmEgPSAxOworCQlEV0NfV1JJVEVfUkVHMzIoJm91dF9yZWdzLT5kb2VwY3RsLCBkZXBjdGwuZDMyKTsKKworCX0KK30KKworI2lmZGVmIERFQlVHCit2b2lkIGR1bXBfbXNnKGNvbnN0IHU4ICogYnVmLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworCXVuc2lnbmVkIGludCBzdGFydCwgbnVtLCBpOworCWNoYXIgbGluZVs1Ml0sICpwOworCisJaWYgKGxlbmd0aCA+PSA1MTIpCisJCXJldHVybjsKKwlzdGFydCA9IDA7CisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJbnVtID0gbGVuZ3RoIDwgMTZ1ID8gbGVuZ3RoIDogMTZ1OworCQlwID0gbGluZTsKKwkJZm9yIChpID0gMDsgaSA8IG51bTsgKytpKSB7CisJCQlpZiAoaSA9PSA4KQorCQkJCSpwKysgPSAnICc7CisJCQlEV0NfU1BSSU5URihwLCAiICUwMngiLCBidWZbaV0pOworCQkJcCArPSAzOworCQl9CisJCSpwID0gMDsKKwkJRFdDX1BSSU5URigiJTZ4OiAlc1xuIiwgc3RhcnQsIGxpbmUpOworCQlidWYgKz0gbnVtOworCQlzdGFydCArPSBudW07CisJCWxlbmd0aCAtPSBudW07CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1wX21zZyhjb25zdCB1OCAqIGJ1ZiwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKK30KKyNlbmRpZgorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGEgcGFja2V0IGludG8gdGhlIFR4IEZJRk8gYXNzb2NpYXRlZCB3aXRoIHRoZQorICogRVAuIEZvciBub24tcGVyaW9kaWMgRVBzIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyBpcyB3cml0dGVuLiAgRm9yCisgKiBwZXJpb2RpYyBFUHMgdGhlIHBlcmlvZGljIFR4IEZJRk8gYXNzb2NpYXRlZCB3aXRoIHRoZSBFUCBpcyB3cml0dGVuCisgKiB3aXRoIGFsbCBwYWNrZXRzIGZvciB0aGUgbmV4dCBtaWNyby1mcmFtZS4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBlcCBUaGUgRVAgdG8gd3JpdGUgcGFja2V0IGZvci4KKyAqIEBwYXJhbSBkbWEgSW5kaWNhdGVzIGlmIERNQSBpcyBiZWluZyB1c2VkLgorICovCit2b2lkIGR3Y19vdGdfZXBfd3JpdGVfcGFja2V0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgZHdjX2VwX3QgKiBlcCwKKwkJCSAgICAgaW50IGRtYSkKK3sKKwkvKioKKwkgKiBUaGUgYnVmZmVyIGlzIHBhZGRlZCB0byBEV09SRCBvbiBhIHBlciBwYWNrZXQgYmFzaXMgaW4KKwkgKiBzbGF2ZS9kbWEgbW9kZSBpZiB0aGUgTVBTIGlzIG5vdCBEV09SRCBhbGlnbmVkLiBUaGUgbGFzdAorCSAqIHBhY2tldCwgaWYgc2hvcnQsIGlzIGFsc28gcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2YgRFdPUkQuCisJICoKKwkgKiBlcC0+eGZlcl9idWZmIGFsd2F5cyBzdGFydHMgRFdPUkQgYWxpZ25lZCBpbiBtZW1vcnkgYW5kIGlzIGEKKwkgKiBtdWx0aXBsZSBvZiBEV09SRCBpbiBsZW5ndGgKKwkgKgorCSAqIGVwLT54ZmVyX2xlbiBjYW4gYmUgYW55IG51bWJlciBvZiBieXRlcworCSAqCisJICogZXAtPnhmZXJfY291bnQgaXMgYSBtdWx0aXBsZSBvZiBlcC0+bWF4cGFja2V0IHVudGlsIHRoZSBsYXN0CisJICoJcGFja2V0CisJICoKKwkgKiBGSUZPIGFjY2VzcyBpcyBEV09SRCAqLworCisJdWludDMyX3QgaTsKKwl1aW50MzJfdCBieXRlX2NvdW50OworCXVpbnQzMl90IGR3b3JkX2NvdW50OworCXVpbnQzMl90ICpmaWZvOworCXVpbnQzMl90ICpkYXRhX2J1ZmYgPSAodWludDMyX3QgKikgZXAtPnhmZXJfYnVmZjsKKworCURXQ19ERUJVR1BMKChEQkdfUENEViB8IERCR19DSUxWKSwgIiVzKCVwLCVwKVxuIiwgX19mdW5jX18sIGNvcmVfaWYsCisJCSAgICBlcCk7CisJaWYgKGVwLT54ZmVyX2NvdW50ID49IGVwLT54ZmVyX2xlbikgeworCQlEV0NfV0FSTigiJXMoKSBObyBkYXRhIGZvciBFUCVkISEhXG4iLCBfX2Z1bmNfXywgZXAtPm51bSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaW5kIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGVpdGhlciBzaG9ydCBwYWNrZXQgb3IgTVBTICovCisJaWYgKChlcC0+eGZlcl9sZW4gLSBlcC0+eGZlcl9jb3VudCkgPCBlcC0+bWF4cGFja2V0KSB7CisJCWJ5dGVfY291bnQgPSBlcC0+eGZlcl9sZW4gLSBlcC0+eGZlcl9jb3VudDsKKwl9IGVsc2UgeworCQlieXRlX2NvdW50ID0gZXAtPm1heHBhY2tldDsKKwl9CisKKwkvKiBGaW5kIHRoZSBEV09SRCBsZW5ndGgsIHBhZGRlZCBieSBleHRyYSBieXRlcyBhcyBuZWNjZXNzYXJ5IGlmIE1QUworCSAqIGlzIG5vdCBhIG11bHRpcGxlIG9mIERXT1JEICovCisJZHdvcmRfY291bnQgPSAoYnl0ZV9jb3VudCArIDMpIC8gNDsKKworI2lmZGVmIFZFUkJPU0UKKwlkdW1wX21zZyhlcC0+eGZlcl9idWZmLCBieXRlX2NvdW50KTsKKyNlbmRpZgorCisJLyoqQHRvZG8gTkdTIFdoZXJlIGFyZSB0aGUgUGVyaW9kaWMgVHggRklGTyBhZGRyZXNzZXMKKwkgKiBpbnRpYWxpemVkPwlXaGF0IHNob3VsZCB0aGlzIGJlPyAqLworCisJZmlmbyA9IGNvcmVfaWYtPmRhdGFfZmlmb1tlcC0+bnVtXTsKKworCURXQ19ERUJVR1BMKChEQkdfUENEViB8IERCR19DSUxWKSwgImZpZm89JXAgYnVmZj0lcCAqcD0lMDh4IGJjPSVkXG4iLAorCQkgICAgZmlmbywgZGF0YV9idWZmLCAqZGF0YV9idWZmLCBieXRlX2NvdW50KTsKKworCWlmICghZG1hKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkd29yZF9jb3VudDsgaSsrLCBkYXRhX2J1ZmYrKykgeworCQkJRFdDX1dSSVRFX1JFRzMyKGZpZm8sICpkYXRhX2J1ZmYpOworCQl9CisJfQorCisJZXAtPnhmZXJfY291bnQgKz0gYnl0ZV9jb3VudDsKKwllcC0+eGZlcl9idWZmICs9IGJ5dGVfY291bnQ7CisJZXAtPmRtYV9hZGRyICs9IGJ5dGVfY291bnQ7Cit9CisKKy8qKgorICogU2V0IHRoZSBFUCBTVEFMTC4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBlcCBUaGUgRVAgdG8gc2V0IHRoZSBzdGFsbCBvbi4KKyAqLwordm9pZCBkd2Nfb3RnX2VwX3NldF9zdGFsbChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGR3Y19lcF90ICogZXApCit7CisJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJdm9sYXRpbGUgdWludDMyX3QgKmRlcGN0bF9hZGRyOworCisJRFdDX0RFQlVHUEwoREJHX1BDRCwgIiVzIGVwJWQtJXNcbiIsIF9fZnVuY19fLCBlcC0+bnVtLAorCQkgICAgKGVwLT5pc19pbiA/ICJJTiIgOiAiT1VUIikpOworCisJaWYgKGVwLT5pc19pbiA9PSAxKSB7CisJCWRlcGN0bF9hZGRyID0gJihjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbZXAtPm51bV0tPmRpZXBjdGwpOworCQlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoZGVwY3RsX2FkZHIpOworCisJCS8qIHNldCB0aGUgZGlzYWJsZSBhbmQgc3RhbGwgYml0cyAqLworCQlpZiAoZGVwY3RsLmIuZXBlbmEpIHsKKwkJCWRlcGN0bC5iLmVwZGlzID0gMTsKKwkJfQorCQlkZXBjdGwuYi5zdGFsbCA9IDE7CisJCURXQ19XUklURV9SRUczMihkZXBjdGxfYWRkciwgZGVwY3RsLmQzMik7CisJfSBlbHNlIHsKKwkJZGVwY3RsX2FkZHIgPSAmKGNvcmVfaWYtPmRldl9pZi0+b3V0X2VwX3JlZ3NbZXAtPm51bV0tPmRvZXBjdGwpOworCQlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoZGVwY3RsX2FkZHIpOworCisJCS8qIHNldCB0aGUgc3RhbGwgYml0ICovCisJCWRlcGN0bC5iLnN0YWxsID0gMTsKKwkJRFdDX1dSSVRFX1JFRzMyKGRlcGN0bF9hZGRyLCBkZXBjdGwuZDMyKTsKKwl9CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAiREVQQ1RMPSUweFxuIiwgRFdDX1JFQURfUkVHMzIoZGVwY3RsX2FkZHIpKTsKKworCXJldHVybjsKK30KKworLyoqCisgKiBDbGVhciB0aGUgRVAgU1RBTEwuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZXAgVGhlIEVQIHRvIGNsZWFyIHN0YWxsIGZyb20uCisgKi8KK3ZvaWQgZHdjX290Z19lcF9jbGVhcl9zdGFsbChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGR3Y19lcF90ICogZXApCit7CisJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJdm9sYXRpbGUgdWludDMyX3QgKmRlcGN0bF9hZGRyOworCisJRFdDX0RFQlVHUEwoREJHX1BDRCwgIiVzIGVwJWQtJXNcbiIsIF9fZnVuY19fLCBlcC0+bnVtLAorCQkgICAgKGVwLT5pc19pbiA/ICJJTiIgOiAiT1VUIikpOworCisJaWYgKGVwLT5pc19pbiA9PSAxKSB7CisJCWRlcGN0bF9hZGRyID0gJihjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbZXAtPm51bV0tPmRpZXBjdGwpOworCX0gZWxzZSB7CisJCWRlcGN0bF9hZGRyID0gJihjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2VwLT5udW1dLT5kb2VwY3RsKTsKKwl9CisKKwlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoZGVwY3RsX2FkZHIpOworCisJLyogY2xlYXIgdGhlIHN0YWxsIGJpdHMgKi8KKwlkZXBjdGwuYi5zdGFsbCA9IDA7CisKKwkvKgorCSAqIFVTQiBTcGVjIDkuNC41OiBGb3IgZW5kcG9pbnRzIHVzaW5nIGRhdGEgdG9nZ2xlLCByZWdhcmRsZXNzCisJICogb2Ygd2hldGhlciBhbiBlbmRwb2ludCBoYXMgdGhlIEhhbHQgZmVhdHVyZSBzZXQsIGEKKwkgKiBDbGVhckZlYXR1cmUoRU5EUE9JTlRfSEFMVCkgcmVxdWVzdCBhbHdheXMgcmVzdWx0cyBpbiB0aGUKKwkgKiBkYXRhIHRvZ2dsZSBiZWluZyByZWluaXRpYWxpemVkIHRvIERBVEEwLgorCSAqLworCWlmIChlcC0+dHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSU5UUiB8fAorCSAgICBlcC0+dHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfQlVMSykgeworCQlkZXBjdGwuYi5zZXRkMHBpZCA9IDE7CS8qIERBVEEwICovCisJfQorCisJRFdDX1dSSVRFX1JFRzMyKGRlcGN0bF9hZGRyLCBkZXBjdGwuZDMyKTsKKwlEV0NfREVCVUdQTChEQkdfUENELCAiREVQQ1RMPSUweFxuIiwgRFdDX1JFQURfUkVHMzIoZGVwY3RsX2FkZHIpKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyBhIHBhY2tldCBmcm9tIHRoZSBSeCBGSUZPIGludG8gdGhlIGRlc3RpbmF0aW9uCisgKiBidWZmZXIuIFRvIHJlYWQgU0VUVVAgZGF0YSB1c2UgZHdjX290Z19yZWFkX3NldHVwX3BhY2tldC4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBkZXN0CSAgRGVzdGluYXRpb24gYnVmZmVyIGZvciB0aGUgcGFja2V0LgorICogQHBhcmFtIGJ5dGVzICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weSB0byB0aGUgZGVzdGluYXRpb24uCisgKi8KK3ZvaWQgZHdjX290Z19yZWFkX3BhY2tldChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkgdWludDhfdCAqIGRlc3QsIHVpbnQxNl90IGJ5dGVzKQoreworCWludCBpOworCWludCB3b3JkX2NvdW50ID0gKGJ5dGVzICsgMykgLyA0OworCisJdm9sYXRpbGUgdWludDMyX3QgKmZpZm8gPSBjb3JlX2lmLT5kYXRhX2ZpZm9bMF07CisJdWludDMyX3QgKmRhdGFfYnVmZiA9ICh1aW50MzJfdCAqKSBkZXN0OworCisJLyoqCisJICogQHRvZG8gQWNjb3VudCBmb3IgdGhlIGNhc2Ugd2hlcmUgX2Rlc3QgaXMgbm90IGR3b3JkIGFsaWduZWQuIFRoaXMKKwkgKiByZXF1aXJlcyByZWFkaW5nIGRhdGEgZnJvbSB0aGUgRklGTyBpbnRvIGEgdWludDMyX3QgdGVtcCBidWZmZXIsCisJICogdGhlbiBtb3ZpbmcgaXQgaW50byB0aGUgZGF0YSBidWZmZXIuCisJICovCisKKwlEV0NfREVCVUdQTCgoREJHX1BDRFYgfCBEQkdfQ0lMViksICIlcyglcCwlcCwlZClcbiIsIF9fZnVuY19fLAorCQkgICAgY29yZV9pZiwgZGVzdCwgYnl0ZXMpOworCisJZm9yIChpID0gMDsgaSA8IHdvcmRfY291bnQ7IGkrKywgZGF0YV9idWZmKyspIHsKKwkJKmRhdGFfYnVmZiA9IERXQ19SRUFEX1JFRzMyKGZpZm8pOworCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9ucyByZWFkcyB0aGUgZGV2aWNlIHJlZ2lzdGVycyBhbmQgcHJpbnRzIHRoZW0KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqLwordm9pZCBkd2Nfb3RnX2R1bXBfZGV2X3JlZ2lzdGVycyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJaW50IGk7CisJdm9sYXRpbGUgdWludDMyX3QgKmFkZHI7CisKKwlEV0NfUFJJTlRGKCJEZXZpY2UgR2xvYmFsIFJlZ2lzdGVyc1xuIik7CisJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGNmZzsKKwlEV0NfUFJJTlRGKCJEQ0ZHCQkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKSBhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bDsKKwlEV0NfUFJJTlRGKCJEQ1RMCQkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKSBhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZHN0czsKKwlEV0NfUFJJTlRGKCJEU1RTCQkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKSBhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGllcG1zazsKKwlEV0NfUFJJTlRGKCJESUVQTVNLCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRvZXBtc2s7CisJRFdDX1BSSU5URigiRE9FUE1TSwkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCSAgIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kYWludDsKKwlEV0NfUFJJTlRGKCJEQUlOVAkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCSAgIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kYWludG1zazsKKwlEV0NfUFJJTlRGKCJEQUlOVE1TSwkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCSAgIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kdGtucXIxOworCURXQ19QUklOVEYoIkRUS05RUjEJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJaWYgKGNvcmVfaWYtPmh3Y2ZnMi5iLmRldl90b2tlbl9xX2RlcHRoID4gNikgeworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kdGtucXIyOworCQlEV0NfUFJJTlRGKCJEVEtOUVIyCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKWFkZHIsIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwl9CisKKwlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kdmJ1c2RpczsKKwlEV0NfUFJJTlRGKCJEVkJVU0lECSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCisJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZHZidXNwdWxzZTsKKwlEV0NfUFJJTlRGKCJEVkJVU1BVTFNFCUAweCUwOGxYIDogMHglMDhYXG4iLAorCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisKKwlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kdGtucXIzX2R0aHJjdGw7CisJRFdDX1BSSU5URigiRFRLTlFSM19EVEhSQ1RMCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCisJaWYgKGNvcmVfaWYtPmh3Y2ZnMi5iLmRldl90b2tlbl9xX2RlcHRoID4gMjIpIHsKKwkJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZHRrbnFyNF9maWZvZW1wdHltc2s7CisJCURXQ19QUklOVEYoIkRUS05RUjQJIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCX0KKworCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmR0a25xcjRfZmlmb2VtcHR5bXNrOworCURXQ19QUklOVEYoIkZJRk9FTVBNU0sJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisKKwlpZiAoY29yZV9pZi0+aHdjZmcyLmIubXVsdGlfcHJvY19pbnQpIHsKKworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kZWFjaGludDsKKwkJRFdDX1BSSU5URigiREVBQ0hJTlQJIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kZWFjaGludG1zazsKKwkJRFdDX1BSSU5URigiREVBQ0hJTlRNU0sJIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCisJCWZvciAoaSA9IDA7IGkgPD0gY29yZV9pZi0+ZGV2X2lmLT5udW1faW5fZXBzOyBpKyspIHsKKwkJCWFkZHIgPQorCQkJICAgICZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+CisJCQkgICAgZGllcGVhY2hpbnRtc2tbaV07CisJCQlEV0NfUFJJTlRGKCJESUVQRUFDSElOVE1TS1slZF0JIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJCSAgIGksICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCQkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8PSBjb3JlX2lmLT5kZXZfaWYtPm51bV9vdXRfZXBzOyBpKyspIHsKKwkJCWFkZHIgPQorCQkJICAgICZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+CisJCQkgICAgZG9lcGVhY2hpbnRtc2tbaV07CisJCQlEV0NfUFJJTlRGKCJET0VQRUFDSElOVE1TS1slZF0JIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJCSAgIGksICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCQkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8PSBjb3JlX2lmLT5kZXZfaWYtPm51bV9pbl9lcHM7IGkrKykgeworCQlEV0NfUFJJTlRGKCJEZXZpY2UgSU4gRVAgJWQgUmVnaXN0ZXJzXG4iLCBpKTsKKwkJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbaV0tPmRpZXBjdGw7CisJCURXQ19QUklOVEYoIkRJRVBDVEwJIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGludDsKKwkJRFdDX1BSSU5URigiRElFUElOVAkgQDB4JTA4bFggOiAweCUwOFhcbiIsCisJCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwdHNpejsKKwkJRFdDX1BSSU5URigiRElFVFNJWgkgQDB4JTA4bFggOiAweCUwOFhcbiIsCisJCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwZG1hOworCQlEV0NfUFJJTlRGKCJESUVQRE1BCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKWFkZHIsIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwkJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbaV0tPmR0eGZzdHM7CisJCURXQ19QUklOVEYoIkRUWEZTVFMJIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGRtYWI7CisJCURXQ19QUklOVEYoIkRJRVBETUFCCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKWFkZHIsIDAgLypEV0NfUkVBRF9SRUczMihhZGRyKSAqLyApOworCX0KKworCWZvciAoaSA9IDA7IGkgPD0gY29yZV9pZi0+ZGV2X2lmLT5udW1fb3V0X2VwczsgaSsrKSB7CisJCURXQ19QUklOVEYoIkRldmljZSBPVVQgRVAgJWQgUmVnaXN0ZXJzXG4iLCBpKTsKKwkJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2ldLT5kb2VwY3RsOworCQlEV0NfUFJJTlRGKCJET0VQQ1RMCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKWFkZHIsIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwkJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2ldLT5kb2VwaW50OworCQlEV0NfUFJJTlRGKCJET0VQSU5UCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKWFkZHIsIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwkJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2ldLT5kb2VwdHNpejsKKwkJRFdDX1BSSU5URigiRE9FVFNJWgkgQDB4JTA4bFggOiAweCUwOFhcbiIsCisJCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tpXS0+ZG9lcGRtYTsKKwkJRFdDX1BSSU5URigiRE9FUERNQQkgQDB4JTA4bFggOiAweCUwOFhcbiIsCisJCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CS8qIERvbid0IGFjY2VzcyB0aGlzIHJlZ2lzdGVyIGluIFNMQVZFIG1vZGUgKi8KKwkJCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tpXS0+ZG9lcGRtYWI7CisJCQlEV0NfUFJJTlRGKCJET0VQRE1BQgkgQDB4JTA4bFggOiAweCUwOFhcbiIsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCQl9CisKKwl9Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbnMgcmVhZHMgdGhlIFNQUkFNIGFuZCBwcmludHMgaXRzIGNvbnRlbnQKKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqLwordm9pZCBkd2Nfb3RnX2R1bXBfc3ByYW0oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXZvbGF0aWxlIHVpbnQ4X3QgKmFkZHIsICpzdGFydF9hZGRyLCAqZW5kX2FkZHI7CisKKwlEV0NfUFJJTlRGKCJTUFJBTSBEYXRhOlxuIik7CisJc3RhcnRfYWRkciA9ICh2b2lkICopY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwlEV0NfUFJJTlRGKCJCYXNlIEFkZHJlc3M6IDB4JThsWFxuIiwgKHVuc2lnbmVkIGxvbmcpc3RhcnRfYWRkcik7CisJc3RhcnRfYWRkciArPSAweDAwMDI4MDAwOworCWVuZF9hZGRyID0gKHZvaWQgKiljb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzOworCWVuZF9hZGRyICs9IDB4MDAwMjgwZTA7CisKKwlmb3IgKGFkZHIgPSBzdGFydF9hZGRyOyBhZGRyIDwgZW5kX2FkZHI7IGFkZHIgKz0gMTYpIHsKKwkJRFdDX1BSSU5URgorCQkgICAgKCIweCU4bFg6XHQlMlggJTJYICUyWCAlMlggJTJYICUyWCAlMlggJTJYICUyWCAlMlggJTJYICUyWCAlMlggJTJYICUyWCAlMlhcbiIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSwKKwkJICAgICBhZGRyWzRdLCBhZGRyWzVdLCBhZGRyWzZdLCBhZGRyWzddLCBhZGRyWzhdLCBhZGRyWzldLAorCQkgICAgIGFkZHJbMTBdLCBhZGRyWzExXSwgYWRkclsxMl0sIGFkZHJbMTNdLCBhZGRyWzE0XSwgYWRkclsxNV0KKwkJICAgICk7CisJfQorCisJcmV0dXJuOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGhvc3QgcmVnaXN0ZXJzIGFuZCBwcmludHMgdGhlbQorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICovCit2b2lkIGR3Y19vdGdfZHVtcF9ob3N0X3JlZ2lzdGVycyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJaW50IGk7CisJdm9sYXRpbGUgdWludDMyX3QgKmFkZHI7CisKKwlEV0NfUFJJTlRGKCJIb3N0IEdsb2JhbCBSZWdpc3RlcnNcbiIpOworCWFkZHIgPSAmY29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGNmZzsKKwlEV0NfUFJJTlRGKCJIQ0ZHCQkgQDB4JTA4bFggOiAweCUwOFhcbiIsCisJCSAgICh1bnNpZ25lZCBsb25nKWFkZHIsIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwlhZGRyID0gJmNvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3MtPmhmaXI7CisJRFdDX1BSSU5URigiSEZJUgkJIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZm51bTsKKwlEV0NfUFJJTlRGKCJIRk5VTQkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCSAgIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwlhZGRyID0gJmNvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3MtPmhwdHhzdHM7CisJRFdDX1BSSU5URigiSFBUWFNUUwkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCSAgIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwlhZGRyID0gJmNvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3MtPmhhaW50OworCURXQ19QUklOVEYoIkhBSU5UCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGFpbnRtc2s7CisJRFdDX1BSSU5URigiSEFJTlRNU0sJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQlhZGRyID0gJmNvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3MtPmhmbGJhZGRyOworCQlEV0NfUFJJTlRGKCJIRkxCQUREUgkgQDB4JTA4bFggOiAweCUwOFhcbiIsCisJCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJfQorCisJYWRkciA9IGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwOworCURXQ19QUklOVEYoIkhQUlQwCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCisJZm9yIChpID0gMDsgaSA8IGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5ob3N0X2NoYW5uZWxzOyBpKyspIHsKKwkJRFdDX1BSSU5URigiSG9zdCBDaGFubmVsICVkIFNwZWNpZmljIFJlZ2lzdGVyc1xuIiwgaSk7CisJCWFkZHIgPSAmY29yZV9pZi0+aG9zdF9pZi0+aGNfcmVnc1tpXS0+aGNjaGFyOworCQlEV0NfUFJJTlRGKCJIQ0NIQVIJIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCQlhZGRyID0gJmNvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbaV0tPmhjc3BsdDsKKwkJRFdDX1BSSU5URigiSENTUExUCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKWFkZHIsIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwkJYWRkciA9ICZjb3JlX2lmLT5ob3N0X2lmLT5oY19yZWdzW2ldLT5oY2ludDsKKwkJRFdDX1BSSU5URigiSENJTlQJIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCQlhZGRyID0gJmNvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbaV0tPmhjaW50bXNrOworCQlEV0NfUFJJTlRGKCJIQ0lOVE1TSwkgQDB4JTA4bFggOiAweCUwOFhcbiIsCisJCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJCWFkZHIgPSAmY29yZV9pZi0+aG9zdF9pZi0+aGNfcmVnc1tpXS0+aGN0c2l6OworCQlEV0NfUFJJTlRGKCJIQ1RTSVoJIEAweCUwOGxYIDogMHglMDhYXG4iLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCQlhZGRyID0gJmNvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbaV0tPmhjZG1hOworCQlEV0NfUFJJTlRGKCJIQ0RNQQkgQDB4JTA4bFggOiAweCUwOFhcbiIsCisJCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJCWlmIChjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJCWFkZHIgPSAmY29yZV9pZi0+aG9zdF9pZi0+aGNfcmVnc1tpXS0+aGNkbWFiOworCQkJRFdDX1BSSU5URigiSENETUFCCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwKKwkJCQkgICAodW5zaWduZWQgbG9uZylhZGRyLCBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJCX0KKworCX0KKwlyZXR1cm47Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgY29yZSBnbG9iYWwgcmVnaXN0ZXJzIGFuZCBwcmludHMgdGhlbQorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICovCit2b2lkIGR3Y19vdGdfZHVtcF9nbG9iYWxfcmVnaXN0ZXJzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpbnQgaSwgZXBfbnVtOworCXZvbGF0aWxlIHVpbnQzMl90ICphZGRyOworCWNoYXIgKnR4ZnNpejsKKworCURXQ19QUklOVEYoIkNvcmUgR2xvYmFsIFJlZ2lzdGVyc1xuIik7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsOworCURXQ19QUklOVEYoIkdPVEdDVEwJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnaW50OworCURXQ19QUklOVEYoIkdPVEdJTlQJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nYWhiY2ZnOworCURXQ19QUklOVEYoIkdBSEJDRkcJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndXNiY2ZnOworCURXQ19QUklOVEYoIkdVU0JDRkcJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnN0Y3RsOworCURXQ19QUklOVEYoIkdSU1RDVEwJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzOworCURXQ19QUklOVEYoIkdJTlRTVFMJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrOworCURXQ19QUklOVEYoIkdJTlRNU0sJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnhzdHNyOworCURXQ19QUklOVEYoIkdSWFNUU1IJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnhmc2l6OworCURXQ19QUklOVEYoIkdSWEZTSVoJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbnB0eGZzaXo7CisJRFdDX1BSSU5URigiR05QVFhGU0laIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbnB0eHN0czsKKwlEV0NfUFJJTlRGKCJHTlBUWFNUUwkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCSAgIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwlhZGRyID0gJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpMmNjdGw7CisJRFdDX1BSSU5URigiR0kyQ0NUTAkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCSAgIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwlhZGRyID0gJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwdm5kY3RsOworCURXQ19QUklOVEYoIkdQVk5EQ1RMCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2dwaW87CisJRFdDX1BSSU5URigiR0dQSU8JIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndWlkOworCURXQ19QUklOVEYoIkdVSUQJCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3NucHNpZDsKKwlEV0NfUFJJTlRGKCJHU05QU0lECSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2h3Y2ZnMTsKKwlEV0NfUFJJTlRGKCJHSFdDRkcxCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2h3Y2ZnMjsKKwlEV0NfUFJJTlRGKCJHSFdDRkcyCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2h3Y2ZnMzsKKwlEV0NfUFJJTlRGKCJHSFdDRkczCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2h3Y2ZnNDsKKwlEV0NfUFJJTlRGKCJHSFdDRkc0CSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZzsKKwlEV0NfUFJJTlRGKCJHTFBNQ0ZHCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuOworCURXQ19QUklOVEYoIkdQV1JETgkgQDB4JTA4bFggOiAweCUwOFhcbiIsICh1bnNpZ25lZCBsb25nKWFkZHIsCisJCSAgIERXQ19SRUFEX1JFRzMyKGFkZHIpKTsKKwlhZGRyID0gJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdkZmlmb2NmZzsKKwlEV0NfUFJJTlRGKCJHREZJRk9DRkcJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisJYWRkciA9ICZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5hZHBjdGw7CisJRFdDX1BSSU5URigiQURQQ1RMCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgZHdjX290Z19hZHBfcmVhZF9yZWcoY29yZV9pZikpOworCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+aHB0eGZzaXo7CisJRFdDX1BSSU5URigiSFBUWEZTSVoJIEAweCUwOGxYIDogMHglMDhYXG4iLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkgICBEV0NfUkVBRF9SRUczMihhZGRyKSk7CisKKwlpZiAoY29yZV9pZi0+ZW5fbXVsdGlwbGVfdHhfZmlmbyA9PSAwKSB7CisJCWVwX251bSA9IGNvcmVfaWYtPmh3Y2ZnNC5iLm51bV9kZXZfcGVyaW9faW5fZXA7CisJCXR4ZnNpeiA9ICJEUFRYRlNJWiI7CisJfSBlbHNlIHsKKwkJZXBfbnVtID0gY29yZV9pZi0+aHdjZmc0LmIubnVtX2luX2VwczsKKwkJdHhmc2l6ID0gIkRJRU5QVFhGIjsKKwl9CisJZm9yIChpID0gMDsgaSA8IGVwX251bTsgaSsrKSB7CisJCWFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+ZHR4ZnNpeltpXTsKKwkJRFdDX1BSSU5URigiJXNbJWRdIEAweCUwOGxYIDogMHglMDhYXG4iLCB0eGZzaXosIGkgKyAxLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpYWRkciwgRFdDX1JFQURfUkVHMzIoYWRkcikpOworCX0KKwlhZGRyID0gY29yZV9pZi0+cGNnY2N0bDsKKwlEV0NfUFJJTlRGKCJQQ0dDQ1RMCSBAMHglMDhsWCA6IDB4JTA4WFxuIiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJICAgRFdDX1JFQURfUkVHMzIoYWRkcikpOworfQorCisvKioKKyAqIEZsdXNoIGEgVHggRklGTy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBudW0gVHggRklGTyB0byBmbHVzaC4KKyAqLwordm9pZCBkd2Nfb3RnX2ZsdXNoX3R4X2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBjb25zdCBpbnQgbnVtKQoreworCWR3Y19vdGdfY29yZV9nbG9iYWxfcmVnc190ICpnbG9iYWxfcmVncyA9IGNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3M7CisJdm9sYXRpbGUgZ3JzdGN0bF90IGdyZXNldCA9IHsuZDMyID0gMCB9OworCWludCBjb3VudCA9IDA7CisKKwlEV0NfREVCVUdQTCgoREJHX0NJTCB8IERCR19QQ0RWKSwgIkZsdXNoIFR4IEZJRk8gJWRcbiIsIG51bSk7CisKKwlncmVzZXQuYi50eGZmbHNoID0gMTsKKwlncmVzZXQuYi50eGZudW0gPSBudW07CisJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3JzdGN0bCwgZ3Jlc2V0LmQzMik7CisKKwlkbyB7CisJCWdyZXNldC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdyc3RjdGwpOworCQlpZiAoKytjb3VudCA+IDEwMDAwKSB7CisJCQlEV0NfV0FSTigiJXMoKSBIQU5HISBHUlNUQ1RMPSUweCBHTlBUWFNUUz0weCUwOHhcbiIsCisJCQkJIF9fZnVuY19fLCBncmVzZXQuZDMyLAorCQkJCSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmducHR4c3RzKSk7CisJCQlicmVhazsKKwkJfQorCQlkd2NfdWRlbGF5KDEpOworCX0gd2hpbGUgKGdyZXNldC5iLnR4ZmZsc2ggPT0gMSk7CisKKwkvKiBXYWl0IGZvciAzIFBIWSBDbG9ja3MgKi8KKwlkd2NfdWRlbGF5KDEpOworfQorCisvKioKKyAqIEZsdXNoIFJ4IEZJRk8uCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKi8KK3ZvaWQgZHdjX290Z19mbHVzaF9yeF9maWZvKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqZ2xvYmFsX3JlZ3MgPSBjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzOworCXZvbGF0aWxlIGdyc3RjdGxfdCBncmVzZXQgPSB7LmQzMiA9IDAgfTsKKwlpbnQgY291bnQgPSAwOworCisJRFdDX0RFQlVHUEwoKERCR19DSUwgfCBEQkdfUENEViksICIlc1xuIiwgX19mdW5jX18pOworCS8qCisJICoKKwkgKi8KKwlncmVzZXQuYi5yeGZmbHNoID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5ncnN0Y3RsLCBncmVzZXQuZDMyKTsKKworCWRvIHsKKwkJZ3Jlc2V0LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3JzdGN0bCk7CisJCWlmICgrK2NvdW50ID4gMTAwMDApIHsKKwkJCURXQ19XQVJOKCIlcygpIEhBTkchIEdSU1RDVEw9JTB4XG4iLCBfX2Z1bmNfXywKKwkJCQkgZ3Jlc2V0LmQzMik7CisJCQlicmVhazsKKwkJfQorCQlkd2NfdWRlbGF5KDEpOworCX0gd2hpbGUgKGdyZXNldC5iLnJ4ZmZsc2ggPT0gMSk7CisKKwkvKiBXYWl0IGZvciAzIFBIWSBDbG9ja3MgKi8KKwlkd2NfdWRlbGF5KDEpOworfQorCisvKioKKyAqIERvIGNvcmUgYSBzb2Z0IHJlc2V0IG9mIHRoZSBjb3JlLiAgQmUgY2FyZWZ1bCB3aXRoIHRoaXMgYmVjYXVzZSBpdAorICogcmVzZXRzIGFsbCB0aGUgaW50ZXJuYWwgc3RhdGUgbWFjaGluZXMgb2YgdGhlIGNvcmUuCisgKi8KK3ZvaWQgZHdjX290Z19jb3JlX3Jlc2V0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqZ2xvYmFsX3JlZ3MgPSBjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzOworCXZvbGF0aWxlIGdyc3RjdGxfdCBncmVzZXQgPSB7LmQzMiA9IDAgfTsKKwlpbnQgY291bnQgPSAwOworCisJRFdDX0RFQlVHUEwoREJHX0NJTFYsICIlc1xuIiwgX19mdW5jX18pOworCS8qIFdhaXQgZm9yIEFIQiBtYXN0ZXIgSURMRSBzdGF0ZS4gKi8KKwlkbyB7CisJCWR3Y191ZGVsYXkoMTApOworCQlncmVzZXQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5ncnN0Y3RsKTsKKwkJaWYgKCsrY291bnQgPiAxMDAwMDApIHsKKwkJCURXQ19XQVJOKCIlcygpIEhBTkchIEFIQiBJZGxlIEdSU1RDVEw9JTB4XG4iLCBfX2Z1bmNfXywKKwkJCQkgZ3Jlc2V0LmQzMik7CisJCQlyZXR1cm47CisJCX0KKwl9CisJd2hpbGUgKGdyZXNldC5iLmFoYmlkbGUgPT0gMCk7CisKKwkvKiBDb3JlIFNvZnQgUmVzZXQgKi8KKwljb3VudCA9IDA7CisJZ3Jlc2V0LmIuY3NmdHJzdCA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3JzdGN0bCwgZ3Jlc2V0LmQzMik7CisJZG8geworCQlncmVzZXQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5ncnN0Y3RsKTsKKwkJaWYgKCsrY291bnQgPiAxMDAwMCkgeworCQkJRFdDX1dBUk4oIiVzKCkgSEFORyEgU29mdCBSZXNldCBHUlNUQ1RMPSUweFxuIiwKKwkJCQkgX19mdW5jX18sIGdyZXNldC5kMzIpOworCQkJYnJlYWs7CisJCX0KKwkJZHdjX3VkZWxheSgxKTsKKwl9CisJd2hpbGUgKGdyZXNldC5iLmNzZnRyc3QgPT0gMSk7CisKKwkvKiBXYWl0IGZvciAzIFBIWSBDbG9ja3MgKi8KKwlkd2NfbWRlbGF5KDEwMCk7Cit9CisKK3VpbnQ4X3QgZHdjX290Z19pc19kZXZpY2VfbW9kZShkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKQoreworCXJldHVybiAoZHdjX290Z19tb2RlKF9jb3JlX2lmKSAhPSBEV0NfSE9TVF9NT0RFKTsKK30KKwordWludDhfdCBkd2Nfb3RnX2lzX2hvc3RfbW9kZShkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKQoreworCXJldHVybiAoZHdjX290Z19tb2RlKF9jb3JlX2lmKSA9PSBEV0NfSE9TVF9NT0RFKTsKK30KKworLyoqCisgKiBSZWdpc3RlciBIQ0QgY2FsbGJhY2tzLiBUaGUgY2FsbGJhY2tzIGFyZSB1c2VkIHRvIHN0YXJ0IGFuZCBzdG9wCisgKiB0aGUgSENEIGZvciBpbnRlcnJ1cHQgcHJvY2Vzc2luZy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBjYiB0aGUgSENEIGNhbGxiYWNrIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBwIHBvaW50ZXIgdG8gYmUgcGFzc2VkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uICh1c2JfaGNkKikuCisgKi8KK3ZvaWQgZHdjX290Z19jaWxfcmVnaXN0ZXJfaGNkX2NhbGxiYWNrcyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCWR3Y19vdGdfY2lsX2NhbGxiYWNrc190ICogY2IsIHZvaWQgKnApCit7CisJY29yZV9pZi0+aGNkX2NiID0gY2I7CisJY2ItPnAgPSBwOworfQorCisvKioKKyAqIFJlZ2lzdGVyIFBDRCBjYWxsYmFja3MuIFRoZSBjYWxsYmFja3MgYXJlIHVzZWQgdG8gc3RhcnQgYW5kIHN0b3AKKyAqIHRoZSBQQ0QgZm9yIGludGVycnVwdCBwcm9jZXNzaW5nLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGNiIHRoZSBQQ0QgY2FsbGJhY2sgc3RydWN0dXJlLgorICogQHBhcmFtIHAgcG9pbnRlciB0byBiZSBwYXNzZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24gKHBjZCopLgorICovCit2b2lkIGR3Y19vdGdfY2lsX3JlZ2lzdGVyX3BjZF9jYWxsYmFja3MoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQlkd2Nfb3RnX2NpbF9jYWxsYmFja3NfdCAqIGNiLCB2b2lkICpwKQoreworCWNvcmVfaWYtPnBjZF9jYiA9IGNiOworCWNiLT5wID0gcDsKK30KKworI2lmZGVmIERXQ19FTl9JU09DCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB3cml0ZXMgaXNvYyBkYXRhIHBlciAxIChtaWNybylmcmFtZSBpbnRvIHR4IGZpZm8KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBlcCBUaGUgRVAgdG8gc3RhcnQgdGhlIHRyYW5zZmVyIG9uLgorICoKKyAqLwordm9pZCB3cml0ZV9pc29jX2ZyYW1lX2RhdGEoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBkd2NfZXBfdCAqIGVwKQoreworCWR3Y19vdGdfZGV2X2luX2VwX3JlZ3NfdCAqZXBfcmVnczsKKwlkdHhmc3RzX2RhdGFfdCB0eHN0YXR1cyA9IHsuZDMyID0gMCB9OworCXVpbnQzMl90IGxlbiA9IDA7CisJdWludDMyX3QgZHdvcmRzOworCisJZXAtPnhmZXJfbGVuID0gZXAtPmRhdGFfcGVyX2ZyYW1lOworCWVwLT54ZmVyX2NvdW50ID0gMDsKKworCWVwX3JlZ3MgPSBjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbZXAtPm51bV07CisKKwlsZW4gPSBlcC0+eGZlcl9sZW4gLSBlcC0+eGZlcl9jb3VudDsKKworCWlmIChsZW4gPiBlcC0+bWF4cGFja2V0KSB7CisJCWxlbiA9IGVwLT5tYXhwYWNrZXQ7CisJfQorCisJZHdvcmRzID0gKGxlbiArIDMpIC8gNDsKKworCS8qIFdoaWxlIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBxdWV1ZSBhbmQgc3BhY2UgaW4gdGhlIEZJRk8gYW5kCisJICogTW9yZSBkYXRhIHRvIHRyYW5mZXIsIFdyaXRlIHBhY2tldHMgdG8gdGhlIFR4IEZJRk8gKi8KKwl0eHN0YXR1cy5kMzIgPQorCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2VwLT5udW1dLT5kdHhmc3RzKTsKKwlEV0NfREVCVUdQTChEQkdfUENEViwgImI0IGR0eGZzdHNbJWRdPTB4JTA4eFxuIiwgZXAtPm51bSwgdHhzdGF0dXMuZDMyKTsKKworCXdoaWxlICh0eHN0YXR1cy5iLnR4ZnNwY2F2YWlsID4gZHdvcmRzICYmCisJICAgICAgIGVwLT54ZmVyX2NvdW50IDwgZXAtPnhmZXJfbGVuICYmIGVwLT54ZmVyX2xlbiAhPSAwKSB7CisJCS8qIFdyaXRlIHRoZSBGSUZPICovCisJCWR3Y19vdGdfZXBfd3JpdGVfcGFja2V0KGNvcmVfaWYsIGVwLCAwKTsKKworCQlsZW4gPSBlcC0+eGZlcl9sZW4gLSBlcC0+eGZlcl9jb3VudDsKKwkJaWYgKGxlbiA+IGVwLT5tYXhwYWNrZXQpIHsKKwkJCWxlbiA9IGVwLT5tYXhwYWNrZXQ7CisJCX0KKworCQlkd29yZHMgPSAobGVuICsgMykgLyA0OworCQl0eHN0YXR1cy5kMzIgPQorCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJICAgaW5fZXBfcmVnc1tlcC0+bnVtXS0+ZHR4ZnN0cyk7CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiZHR4ZnN0c1slZF09MHglMDh4XG4iLCBlcC0+bnVtLAorCQkJICAgIHR4c3RhdHVzLmQzMik7CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgYSBkZXNjcmlwdG9yIGNoYWluIGZvciBJc29jaHJvbm91cyB0cmFuc2ZlcgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGVwIFRoZSBFUCB0byBzdGFydCB0aGUgdHJhbnNmZXIgb24uCisgKgorICovCit2b2lkIGR3Y19vdGdfaXNvX2VwX3N0YXJ0X2ZybV90cmFuc2Zlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJICAgICAgIGR3Y19lcF90ICogZXApCit7CisJZGVwdHNpel9kYXRhX3QgZGVwdHNpeiA9IHsuZDMyID0gMCB9OworCWRlcGN0bF9kYXRhX3QgZGVwY3RsID0gey5kMzIgPSAwIH07CisJZHN0c19kYXRhX3QgZHN0cyA9IHsuZDMyID0gMCB9OworCXZvbGF0aWxlIHVpbnQzMl90ICphZGRyOworCisJaWYgKGVwLT5pc19pbikgeworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tlcC0+bnVtXS0+ZGllcGN0bDsKKwl9IGVsc2UgeworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+b3V0X2VwX3JlZ3NbZXAtPm51bV0tPmRvZXBjdGw7CisJfQorCisJZXAtPnhmZXJfbGVuID0gZXAtPmRhdGFfcGVyX2ZyYW1lOworCWVwLT54ZmVyX2NvdW50ID0gMDsKKwllcC0+eGZlcl9idWZmID0gZXAtPmN1cl9wa3RfYWRkcjsKKwllcC0+ZG1hX2FkZHIgPSBlcC0+Y3VyX3BrdF9kbWFfYWRkcjsKKworCWlmIChlcC0+aXNfaW4pIHsKKwkJLyogUHJvZ3JhbSB0aGUgdHJhbnNmZXIgc2l6ZSBhbmQgcGFja2V0IGNvdW50CisJCSAqICAgICAgYXMgZm9sbG93czogeGZlcnNpemUgPSBOICogbWF4cGFja2V0ICsKKwkJICogICAgICBzaG9ydF9wYWNrZXQgcGt0Y250ID0gTiArIChzaG9ydF9wYWNrZXQKKwkJICogICAgICBleGlzdCA/IDEgOiAwKQorCQkgKi8KKwkJZGVwdHNpei5iLnhmZXJzaXplID0gZXAtPnhmZXJfbGVuOworCQlkZXB0c2l6LmIucGt0Y250ID0KKwkJICAgIChlcC0+eGZlcl9sZW4gLSAxICsgZXAtPm1heHBhY2tldCkgLyBlcC0+bWF4cGFja2V0OworCQlkZXB0c2l6LmIubWMgPSBkZXB0c2l6LmIucGt0Y250OworCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tlcC0+bnVtXS0+ZGllcHRzaXosCisJCQkJZGVwdHNpei5kMzIpOworCisJCS8qIFdyaXRlIHRoZSBETUEgcmVnaXN0ZXIgKi8KKwkJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJCURXQ19XUklURV9SRUczMigmCisJCQkJCShjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbZXAtPm51bV0tPgorCQkJCQkgZGllcGRtYSksICh1aW50MzJfdCkgZXAtPmRtYV9hZGRyKTsKKwkJfQorCX0gZWxzZSB7CisJCWRlcHRzaXouYi5wa3RjbnQgPQorCQkgICAgKGVwLT54ZmVyX2xlbiArIChlcC0+bWF4cGFja2V0IC0gMSkpIC8gZXAtPm1heHBhY2tldDsKKwkJZGVwdHNpei5iLnhmZXJzaXplID0gZGVwdHNpei5iLnBrdGNudCAqIGVwLT5tYXhwYWNrZXQ7CisKKwkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2VwLT5udW1dLT4KKwkJCQlkb2VwdHNpeiwgZGVwdHNpei5kMzIpOworCisJCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQlEV0NfV1JJVEVfUkVHMzIoJgorCQkJCQkoY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tlcC0+bnVtXS0+CisJCQkJCSBkb2VwZG1hKSwgKHVpbnQzMl90KSBlcC0+ZG1hX2FkZHIpOworCQl9CisJfQorCisJLyoqIEVuYWJsZSBlbmRwb2ludCwgY2xlYXIgbmFrICAqLworCisJZGVwY3RsLmQzMiA9IDA7CisJaWYgKGVwLT5iSW50ZXJ2YWwgPT0gMSkgeworCQlkc3RzLmQzMiA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRzdHMpOworCQllcC0+bmV4dF9mcmFtZSA9IGRzdHMuYi5zb2ZmbiArIGVwLT5iSW50ZXJ2YWw7CisKKwkJaWYgKGVwLT5uZXh0X2ZyYW1lICYgMHgxKSB7CisJCQlkZXBjdGwuYi5zZXRkMXBpZCA9IDE7CisJCX0gZWxzZSB7CisJCQlkZXBjdGwuYi5zZXRkMHBpZCA9IDE7CisJCX0KKwl9IGVsc2UgeworCQllcC0+bmV4dF9mcmFtZSArPSBlcC0+YkludGVydmFsOworCisJCWlmIChlcC0+bmV4dF9mcmFtZSAmIDB4MSkgeworCQkJZGVwY3RsLmIuc2V0ZDFwaWQgPSAxOworCQl9IGVsc2UgeworCQkJZGVwY3RsLmIuc2V0ZDBwaWQgPSAxOworCQl9CisJfQorCWRlcGN0bC5iLmVwZW5hID0gMTsKKwlkZXBjdGwuYi5jbmFrID0gMTsKKworCURXQ19NT0RJRllfUkVHMzIoYWRkciwgMCwgZGVwY3RsLmQzMik7CisJZGVwY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKGFkZHIpOworCisJaWYgKGVwLT5pc19pbiAmJiBjb3JlX2lmLT5kbWFfZW5hYmxlID09IDApIHsKKwkJd3JpdGVfaXNvY19mcmFtZV9kYXRhKGNvcmVfaWYsIGVwKTsKKwl9CisKK30KKyNlbmRpZiAvKiBEV0NfRU5fSVNPQyAqLworCitzdGF0aWMgdm9pZCBkd2Nfb3RnX3NldF91bmluaXRpYWxpemVkKGludDMyX3QgKiBwLCBpbnQgc2l6ZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXBbaV0gPSAtMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHdjX290Z19wYXJhbV9pbml0aWFsaXplZChpbnQzMl90IHZhbCkKK3sKKwlyZXR1cm4gdmFsICE9IC0xOworfQorCitzdGF0aWMgaW50IGR3Y19vdGdfc2V0dXBfcGFyYW1zKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpbnQgaTsKKwljb3JlX2lmLT5jb3JlX3BhcmFtcyA9IERXQ19BTExPQyhzaXplb2YoKmNvcmVfaWYtPmNvcmVfcGFyYW1zKSk7CisJaWYgKCFjb3JlX2lmLT5jb3JlX3BhcmFtcykgeworCQlyZXR1cm4gLURXQ19FX05PX01FTU9SWTsKKwl9CisJZHdjX290Z19zZXRfdW5pbml0aWFsaXplZCgoaW50MzJfdCAqKSBjb3JlX2lmLT5jb3JlX3BhcmFtcywKKwkJCQkgIHNpemVvZigqY29yZV9pZi0+Y29yZV9wYXJhbXMpIC8KKwkJCQkgIHNpemVvZihpbnQzMl90KSk7CisJRFdDX1BSSU5URigiU2V0dGluZyBkZWZhdWx0IHZhbHVlcyBmb3IgY29yZSBwYXJhbXNcbiIpOworCWR3Y19vdGdfc2V0X3BhcmFtX290Z19jYXAoY29yZV9pZiwgZHdjX3BhcmFtX290Z19jYXBfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fZG1hX2VuYWJsZShjb3JlX2lmLCBkd2NfcGFyYW1fZG1hX2VuYWJsZV9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9kbWFfZGVzY19lbmFibGUoY29yZV9pZiwKKwkJCQkJICBkd2NfcGFyYW1fZG1hX2Rlc2NfZW5hYmxlX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX29wdChjb3JlX2lmLCBkd2NfcGFyYW1fb3B0X2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2RtYV9idXJzdF9zaXplKGNvcmVfaWYsCisJCQkJCSBkd2NfcGFyYW1fZG1hX2J1cnN0X3NpemVfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1faG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcihjb3JlX2lmLAorCQkJCQkJICAgICAgIGR3Y19wYXJhbV9ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2VuYWJsZV9keW5hbWljX2ZpZm8oY29yZV9pZiwKKwkJCQkJICAgICAgZHdjX3BhcmFtX2VuYWJsZV9keW5hbWljX2ZpZm9fZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fZGF0YV9maWZvX3NpemUoY29yZV9pZiwKKwkJCQkJIGR3Y19wYXJhbV9kYXRhX2ZpZm9fc2l6ZV9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9kZXZfcnhfZmlmb19zaXplKGNvcmVfaWYsCisJCQkJCSAgIGR3Y19wYXJhbV9kZXZfcnhfZmlmb19zaXplX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2Rldl9ucGVyaW9fdHhfZmlmb19zaXplKGNvcmVfaWYsCisJCQkJCQkgIGR3Y19wYXJhbV9kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZV9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3J4X2ZpZm9fc2l6ZShjb3JlX2lmLAorCQkJCQkgICAgZHdjX3BhcmFtX2hvc3RfcnhfZmlmb19zaXplX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAorCQkJCQkJICAgZHdjX3BhcmFtX2hvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZV9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAorCQkJCQkJICBkd2NfcGFyYW1faG9zdF9wZXJpb190eF9maWZvX3NpemVfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fbWF4X3RyYW5zZmVyX3NpemUoY29yZV9pZiwKKwkJCQkJICAgIGR3Y19wYXJhbV9tYXhfdHJhbnNmZXJfc2l6ZV9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9tYXhfcGFja2V0X2NvdW50KGNvcmVfaWYsCisJCQkJCSAgIGR3Y19wYXJhbV9tYXhfcGFja2V0X2NvdW50X2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfY2hhbm5lbHMoY29yZV9pZiwKKwkJCQkJZHdjX3BhcmFtX2hvc3RfY2hhbm5lbHNfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fZGV2X2VuZHBvaW50cyhjb3JlX2lmLAorCQkJCQlkd2NfcGFyYW1fZGV2X2VuZHBvaW50c19kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9waHlfdHlwZShjb3JlX2lmLCBkd2NfcGFyYW1fcGh5X3R5cGVfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fc3BlZWQoY29yZV9pZiwgZHdjX3BhcmFtX3NwZWVkX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGsoY29yZV9pZiwKKwkJCQkJCSAgICBkd2NfcGFyYW1faG9zdF9sc19sb3dfcG93ZXJfcGh5X2Nsa19kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9waHlfdWxwaV9kZHIoY29yZV9pZiwgZHdjX3BhcmFtX3BoeV91bHBpX2Rkcl9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9waHlfdWxwaV9leHRfdmJ1cyhjb3JlX2lmLAorCQkJCQkgICAgZHdjX3BhcmFtX3BoeV91bHBpX2V4dF92YnVzX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX3BoeV91dG1pX3dpZHRoKGNvcmVfaWYsCisJCQkJCSBkd2NfcGFyYW1fcGh5X3V0bWlfd2lkdGhfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fdHNfZGxpbmUoY29yZV9pZiwgZHdjX3BhcmFtX3RzX2RsaW5lX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2kyY19lbmFibGUoY29yZV9pZiwgZHdjX3BhcmFtX2kyY19lbmFibGVfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fdWxwaV9mc19scyhjb3JlX2lmLCBkd2NfcGFyYW1fdWxwaV9mc19sc19kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9lbl9tdWx0aXBsZV90eF9maWZvKGNvcmVfaWYsCisJCQkJCSAgICAgIGR3Y19wYXJhbV9lbl9tdWx0aXBsZV90eF9maWZvX2RlZmF1bHQpOworCWZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisJCWR3Y19vdGdfc2V0X3BhcmFtX2Rldl9wZXJpb190eF9maWZvX3NpemUoY29yZV9pZiwKKwkJCQkJCQkgZHdjX3BhcmFtX2Rldl9wZXJpb190eF9maWZvX3NpemVfZGVmYXVsdCwKKwkJCQkJCQkgaSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKKwkJZHdjX290Z19zZXRfcGFyYW1fZGV2X3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAorCQkJCQkJICAgZHdjX3BhcmFtX2Rldl90eF9maWZvX3NpemVfZGVmYXVsdCwKKwkJCQkJCSAgIGkpOworCX0KKwlkd2Nfb3RnX3NldF9wYXJhbV90aHJfY3RsKGNvcmVfaWYsIGR3Y19wYXJhbV90aHJfY3RsX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX21waV9lbmFibGUoY29yZV9pZiwgZHdjX3BhcmFtX21waV9lbmFibGVfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fcHRpX2VuYWJsZShjb3JlX2lmLCBkd2NfcGFyYW1fcHRpX2VuYWJsZV9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9scG1fZW5hYmxlKGNvcmVfaWYsIGR3Y19wYXJhbV9scG1fZW5hYmxlX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2ljX3VzYl9jYXAoY29yZV9pZiwgZHdjX3BhcmFtX2ljX3VzYl9jYXBfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fdHhfdGhyX2xlbmd0aChjb3JlX2lmLAorCQkJCQlkd2NfcGFyYW1fdHhfdGhyX2xlbmd0aF9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9yeF90aHJfbGVuZ3RoKGNvcmVfaWYsCisJCQkJCWR3Y19wYXJhbV9yeF90aHJfbGVuZ3RoX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2FoYl90aHJfcmF0aW8oY29yZV9pZiwKKwkJCQkJZHdjX3BhcmFtX2FoYl90aHJfcmF0aW9fZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fcG93ZXJfZG93bihjb3JlX2lmLCBkd2NfcGFyYW1fcG93ZXJfZG93bl9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9yZWxvYWRfY3RsKGNvcmVfaWYsIGR3Y19wYXJhbV9yZWxvYWRfY3RsX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2Rldl9vdXRfbmFrKGNvcmVfaWYsIGR3Y19wYXJhbV9kZXZfb3V0X25ha19kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9jb250X29uX2JuYShjb3JlX2lmLCBkd2NfcGFyYW1fY29udF9vbl9ibmFfZGVmYXVsdCk7CisJZHdjX290Z19zZXRfcGFyYW1fYWhiX3NpbmdsZShjb3JlX2lmLCBkd2NfcGFyYW1fYWhiX3NpbmdsZV9kZWZhdWx0KTsKKwlkd2Nfb3RnX3NldF9wYXJhbV9vdGdfdmVyKGNvcmVfaWYsIGR3Y19wYXJhbV9vdGdfdmVyX2RlZmF1bHQpOworCWR3Y19vdGdfc2V0X3BhcmFtX2FkcF9lbmFibGUoY29yZV9pZiwgZHdjX3BhcmFtX2FkcF9lbmFibGVfZGVmYXVsdCk7CisJcmV0dXJuIDA7Cit9CisKK3VpbnQ4X3QgZHdjX290Z19pc19kbWFfZW5hYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+ZG1hX2VuYWJsZTsKK30KKworLyogQ2hlY2tzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgb3V0c2lkZSBvZiBpdHMgdmFsaWQgcmFuZ2Ugb2YgdmFsdWVzICovCisjZGVmaW5lIERXQ19PVEdfUEFSQU1fVEVTVChfcGFyYW1fLCBfbG93XywgX2hpZ2hfKSBcCisJCSgoKF9wYXJhbV8pIDwgKF9sb3dfKSkgfHwgXAorCQkoKF9wYXJhbV8pID4gKF9oaWdoXykpKQorCisvKiBQYXJhbWV0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLworaW50IGR3Y19vdGdfc2V0X3BhcmFtX290Z19jYXAoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgdmFsaWQ7CisJaW50IHJldHZhbCA9IDA7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDIpKSB7CisJCURXQ19XQVJOKCJXcm9uZyB2YWx1ZSBmb3Igb3RnX2NhcCBwYXJhbWV0ZXJcbiIpOworCQlEV0NfV0FSTigib3RnX2NhcCBwYXJhbWV0ZXIgbXVzdCBiZSAwLDEgb3IgMlxuIik7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQlnb3RvIG91dDsKKwl9CisKKwl2YWxpZCA9IDE7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIERXQ19PVEdfQ0FQX1BBUkFNX0hOUF9TUlBfQ0FQQUJMRToKKwkJaWYgKGNvcmVfaWYtPmh3Y2ZnMi5iLm9wX21vZGUgIT0KKwkJICAgIERXQ19IV0NGRzJfT1BfTU9ERV9ITlBfU1JQX0NBUEFCTEVfT1RHKQorCQkJdmFsaWQgPSAwOworCQlicmVhazsKKwljYXNlIERXQ19PVEdfQ0FQX1BBUkFNX1NSUF9PTkxZX0NBUEFCTEU6CisJCWlmICgoY29yZV9pZi0+aHdjZmcyLmIub3BfbW9kZSAhPQorCQkgICAgIERXQ19IV0NGRzJfT1BfTU9ERV9ITlBfU1JQX0NBUEFCTEVfT1RHKQorCQkgICAgJiYgKGNvcmVfaWYtPmh3Y2ZnMi5iLm9wX21vZGUgIT0KKwkJCURXQ19IV0NGRzJfT1BfTU9ERV9TUlBfT05MWV9DQVBBQkxFX09URykKKwkJICAgICYmIChjb3JlX2lmLT5od2NmZzIuYi5vcF9tb2RlICE9CisJCQlEV0NfSFdDRkcyX09QX01PREVfU1JQX0NBUEFCTEVfREVWSUNFKQorCQkgICAgJiYgKGNvcmVfaWYtPmh3Y2ZnMi5iLm9wX21vZGUgIT0KKwkJCURXQ19IV0NGRzJfT1BfTU9ERV9TUlBfQ0FQQUJMRV9IT1NUKSkgeworCQkJdmFsaWQgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgRFdDX09UR19DQVBfUEFSQU1fTk9fSE5QX1NSUF9DQVBBQkxFOgorCQkvKiBhbHdheXMgdmFsaWQgKi8KKwkJYnJlYWs7CisJfQorCWlmICghdmFsaWQpIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQoY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z19jYXApKSB7CisJCQlEV0NfRVJST1IKKwkJCSAgICAoIiVkIGludmFsaWQgZm9yIG90Z19jYXAgcGFyZW10ZXIuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXZhbCA9CisJCSAgICAoKChjb3JlX2lmLT5od2NmZzIuYi5vcF9tb2RlID09CisJCSAgICAgICBEV0NfSFdDRkcyX09QX01PREVfSE5QX1NSUF9DQVBBQkxFX09URykKKwkJICAgICAgfHwgKGNvcmVfaWYtPmh3Y2ZnMi5iLm9wX21vZGUgPT0KKwkJCSAgRFdDX0hXQ0ZHMl9PUF9NT0RFX1NSUF9PTkxZX0NBUEFCTEVfT1RHKQorCQkgICAgICB8fCAoY29yZV9pZi0+aHdjZmcyLmIub3BfbW9kZSA9PQorCQkJICBEV0NfSFdDRkcyX09QX01PREVfU1JQX0NBUEFCTEVfREVWSUNFKQorCQkgICAgICB8fCAoY29yZV9pZi0+aHdjZmcyLmIub3BfbW9kZSA9PQorCQkJICBEV0NfSFdDRkcyX09QX01PREVfU1JQX0NBUEFCTEVfSE9TVCkpID8KKwkJICAgICBEV0NfT1RHX0NBUF9QQVJBTV9TUlBfT05MWV9DQVBBQkxFIDoKKwkJICAgICBEV0NfT1RHX0NBUF9QQVJBTV9OT19ITlBfU1JQX0NBUEFCTEUpOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+b3RnX2NhcCA9IHZhbDsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX290Z19jYXAoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+b3RnX2NhcDsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX29wdChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludDMyX3QgdmFsKQoreworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsdWUgZm9yIG9wdCBwYXJhbWV0ZXJcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5vcHQgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fb3B0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPm9wdDsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2RtYV9lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMCwgMSkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbHVlIGZvciBkbWEgZW5hYmxlXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICgodmFsID09IDEpICYmIChjb3JlX2lmLT5od2NmZzIuYi5hcmNoaXRlY3R1cmUgPT0gMCkpIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRtYV9lbmFibGUpKSB7CisJCQlEV0NfRVJST1IKKwkJCSAgICAoIiVkIGludmFsaWQgZm9yIGRtYV9lbmFibGUgcGFyZW10ZXIuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXZhbCA9IDA7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kbWFfZW5hYmxlID0gdmFsOworCWlmICh2YWwgPT0gMCkgeworCQlkd2Nfb3RnX3NldF9wYXJhbV9kbWFfZGVzY19lbmFibGUoY29yZV9pZiwgMCk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fZG1hX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kbWFfZW5hYmxlOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1fZG1hX2Rlc2NfZW5hYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDEpKSB7CisJCURXQ19XQVJOKCJXcm9uZyB2YWx1ZSBmb3IgZG1hX2VuYWJsZVxuIik7CisJCURXQ19XQVJOKCJkbWFfZGVzY19lbmFibGUgbXVzdCBiZSAwIG9yIDFcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJaWYgKCh2YWwgPT0gMSkKKwkgICAgJiYgKChkd2Nfb3RnX2dldF9wYXJhbV9kbWFfZW5hYmxlKGNvcmVfaWYpID09IDApCisJCXx8IChjb3JlX2lmLT5od2NmZzQuYi5kZXNjX2RtYSA9PSAwKSkpIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQKKwkJICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZG1hX2Rlc2NfZW5hYmxlKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBkbWFfZGVzY19lbmFibGUgcGFyZW10ZXIuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXZhbCA9IDA7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCX0KKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZG1hX2Rlc2NfZW5hYmxlID0gdmFsOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fZG1hX2Rlc2NfZW5hYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRtYV9kZXNjX2VuYWJsZTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2hvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkJICAgaW50MzJfdCB2YWwpCit7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDEpKSB7CisJCURXQ19XQVJOKCJXcm9uZyB2YWx1ZSBmb3IgaG9zdF9zdXBwb3J0X2ZzX2xvd19wb3dlclxuIik7CisJCURXQ19XQVJOKCJob3N0X3N1cHBvcnRfZnNfbG93X3Bvd2VyIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyKGR3Y19vdGdfY29yZV9pZl90ICoKKwkJCQkJCSAgICAgICBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcjsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2VuYWJsZV9keW5hbWljX2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgIGludDMyX3QgdmFsKQoreworCWludCByZXR2YWwgPSAwOworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsdWUgZm9yIGVuYWJsZV9keW5hbWljX2ZpZm9cbiIpOworCQlEV0NfV0FSTigiZW5hYmxlX2R5bmFtaWNfZmlmbyBtdXN0IGJlIDAgb3IgMVxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAoKHZhbCA9PSAxKSAmJiAoY29yZV9pZi0+aHdjZmcyLmIuZHluYW1pY19maWZvID09IDApKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkCisJCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmVuYWJsZV9keW5hbWljX2ZpZm8pKSB7CisJCQlEV0NfRVJST1IKKwkJCSAgICAoIiVkIGludmFsaWQgZm9yIGVuYWJsZV9keW5hbWljX2ZpZm8gcGFyZW10ZXIuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXZhbCA9IDA7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCX0KKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZW5hYmxlX2R5bmFtaWNfZmlmbyA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2VuYWJsZV9keW5hbWljX2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZW5hYmxlX2R5bmFtaWNfZmlmbzsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2RhdGFfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDMyLCAzMjc2OCkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbHVlIGZvciBkYXRhX2ZpZm9fc2l6ZVxuIik7CisJCURXQ19XQVJOKCJkYXRhX2ZpZm9fc2l6ZSBtdXN0IGJlIDMyLTMyNzY4XG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICh2YWwgPiBjb3JlX2lmLT5od2NmZzMuYi5kZmlmb19kZXB0aCkgeworCQlpZiAoZHdjX290Z19wYXJhbV9pbml0aWFsaXplZAorCQkgICAgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kYXRhX2ZpZm9fc2l6ZSkpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiJWQgaW52YWxpZCBmb3IgZGF0YV9maWZvX3NpemUgcGFyYW1ldGVyLiBDaGVjayBIVyBjb25maWd1cmF0aW9uLlxuIiwKKwkJCSAgICAgdmFsKTsKKwkJfQorCQl2YWwgPSBjb3JlX2lmLT5od2NmZzMuYi5kZmlmb19kZXB0aDsKKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRhdGFfZmlmb19zaXplID0gdmFsOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fZGF0YV9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGF0YV9maWZvX3NpemU7Cit9CisKK2ludCBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfcnhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDE2LCAzMjc2OCkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbHVlIGZvciBkZXZfcnhfZmlmb19zaXplXG4iKTsKKwkJRFdDX1dBUk4oImRldl9yeF9maWZvX3NpemUgbXVzdCBiZSAxNi0zMjc2OFxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAodmFsID4gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdyeGZzaXopKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfcnhfZmlmb19zaXplKSkgeworCQlEV0NfV0FSTigiJWQgaW52YWxpZCBmb3IgZGV2X3J4X2ZpZm9fc2l6ZSBwYXJhbWV0ZXJcbiIsIHZhbCk7CisJCX0KKwkJdmFsID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdyeGZzaXopOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGV2X3J4X2ZpZm9fc2l6ZSA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2Rldl9yeF9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGV2X3J4X2ZpZm9fc2l6ZTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9ucGVyaW9fdHhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgICAgaW50MzJfdCB2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMTYsIDMyNzY4KSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsdWUgZm9yIGRldl9ucGVyaW9fdHhfZmlmb1xuIik7CisJCURXQ19XQVJOKCJkZXZfbnBlcmlvX3R4X2ZpZm8gbXVzdCBiZSAxNi0zMjc2OFxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAodmFsID4gKERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbnB0eGZzaXopID4+IDE2KSkgeworCQlpZiAoZHdjX290Z19wYXJhbV9pbml0aWFsaXplZAorCQkgICAgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZSkpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiJWQgaW52YWxpZCBmb3IgZGV2X25wZXJpb190eF9maWZvX3NpemUuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXZhbCA9CisJCSAgICAoRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeikgPj4KKwkJICAgICAxNik7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZSA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2Rldl9ucGVyaW9fdHhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRldl9ucGVyaW9fdHhfZmlmb19zaXplOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1faG9zdF9yeF9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQlpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAxNiwgMzI3NjgpKSB7CisJCURXQ19XQVJOKCJXcm9uZyB2YWx1ZSBmb3IgaG9zdF9yeF9maWZvX3NpemVcbiIpOworCQlEV0NfV0FSTigiaG9zdF9yeF9maWZvX3NpemUgbXVzdCBiZSAxNi0zMjc2OFxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAodmFsID4gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdyeGZzaXopKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkCisJCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmhvc3RfcnhfZmlmb19zaXplKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBob3N0X3J4X2ZpZm9fc2l6ZS4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbi5cbiIsCisJCQkgICAgIHZhbCk7CisJCX0KKwkJdmFsID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdyeGZzaXopOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9yeF9maWZvX3NpemUgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKKworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2hvc3RfcnhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPmhvc3RfcnhfZmlmb19zaXplOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1faG9zdF9ucGVyaW9fdHhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgICAgIGludDMyX3QgdmFsKQoreworCWludCByZXR2YWwgPSAwOworCisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDE2LCAzMjc2OCkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbHVlIGZvciBob3N0X25wZXJpb190eF9maWZvX3NpemVcbiIpOworCQlEV0NfV0FSTigiaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplIG11c3QgYmUgMTYtMzI3NjhcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJaWYgKHZhbCA+IChEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z25wdHhmc2l6KSA+PiAxNikpIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQKKwkJICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9ucGVyaW9fdHhfZmlmb19zaXplKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBob3N0X25wZXJpb190eF9maWZvX3NpemUuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXZhbCA9CisJCSAgICAoRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeikgPj4KKwkJICAgICAxNik7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5ob3N0X25wZXJpb190eF9maWZvX3NpemUgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9ob3N0X25wZXJpb190eF9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9ucGVyaW9fdHhfZmlmb19zaXplOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1faG9zdF9wZXJpb190eF9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgICAgICBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMTYsIDMyNzY4KSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsdWUgZm9yIGhvc3RfcGVyaW9fdHhfZmlmb19zaXplXG4iKTsKKwkJRFdDX1dBUk4oImhvc3RfcGVyaW9fdHhfZmlmb19zaXplIG11c3QgYmUgMTYtMzI3NjhcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJaWYgKHZhbCA+CisJCSgoY29yZV9pZi0+aHB0eGZzaXouZDMyKT4+IDE2KSkgeworCQlpZiAoZHdjX290Z19wYXJhbV9pbml0aWFsaXplZAorCQkgICAgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSkpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiJWQgaW52YWxpZCBmb3IgaG9zdF9wZXJpb190eF9maWZvX3NpemUuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXZhbCA9IChjb3JlX2lmLT5ocHR4ZnNpei5kMzIpID4+IDE2OworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9wZXJpb190eF9maWZvX3NpemUgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX21heF90cmFuc2Zlcl9zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJaW50MzJfdCB2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMjA0NywgNTI0Mjg4KSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsdWUgZm9yIG1heF90cmFuc2Zlcl9zaXplXG4iKTsKKwkJRFdDX1dBUk4oIm1heF90cmFuc2Zlcl9zaXplIG11c3QgYmUgMjA0Ny01MjQyODhcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJaWYgKHZhbCA+PSAoMSA8PCAoY29yZV9pZi0+aHdjZmczLmIueGZlcl9zaXplX2NudHJfd2lkdGggKyAxMSkpKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkCisJCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPm1heF90cmFuc2Zlcl9zaXplKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBtYXhfdHJhbnNmZXJfc2l6ZS4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbi5cbiIsCisJCQkgICAgIHZhbCk7CisJCX0KKwkJdmFsID0KKwkJICAgICgoMSA8PCAoY29yZV9pZi0+aHdjZmczLmIucGFja2V0X3NpemVfY250cl93aWR0aCArIDExKSkgLQorCQkgICAgIDEpOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+bWF4X3RyYW5zZmVyX3NpemUgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9tYXhfdHJhbnNmZXJfc2l6ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5tYXhfdHJhbnNmZXJfc2l6ZTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX21heF9wYWNrZXRfY291bnQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAxNSwgNTExKSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsdWUgZm9yIG1heF9wYWNrZXRfY291bnRcbiIpOworCQlEV0NfV0FSTigibWF4X3BhY2tldF9jb3VudCBtdXN0IGJlIDE1LTUxMVxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAodmFsID4gKDEgPDwgKGNvcmVfaWYtPmh3Y2ZnMy5iLnBhY2tldF9zaXplX2NudHJfd2lkdGggKyA0KSkpIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQKKwkJICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+bWF4X3BhY2tldF9jb3VudCkpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiJWQgaW52YWxpZCBmb3IgbWF4X3BhY2tldF9jb3VudC4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbi5cbiIsCisJCQkgICAgIHZhbCk7CisJCX0KKwkJdmFsID0KKwkJICAgICgoMSA8PCAoY29yZV9pZi0+aHdjZmczLmIucGFja2V0X3NpemVfY250cl93aWR0aCArIDQpKSAtIDEpOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+bWF4X3BhY2tldF9jb3VudCA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX21heF9wYWNrZXRfY291bnQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+bWF4X3BhY2tldF9jb3VudDsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfY2hhbm5lbHMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAxLCAxNikpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbHVlIGZvciBob3N0X2NoYW5uZWxzXG4iKTsKKwkJRFdDX1dBUk4oImhvc3RfY2hhbm5lbHMgbXVzdCBiZSAxLTE2XG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICh2YWwgPiAoY29yZV9pZi0+aHdjZmcyLmIubnVtX2hvc3RfY2hhbiArIDEpKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkCisJCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmhvc3RfY2hhbm5lbHMpKSB7CisJCQlEV0NfRVJST1IKKwkJCSAgICAoIiVkIGludmFsaWQgZm9yIGhvc3RfY2hhbm5lbHMuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb25zLlxuIiwKKwkJCSAgICAgdmFsKTsKKwkJfQorCQl2YWwgPSAoY29yZV9pZi0+aHdjZmcyLmIubnVtX2hvc3RfY2hhbiArIDEpOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9jaGFubmVscyA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2hvc3RfY2hhbm5lbHMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9jaGFubmVsczsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9lbmRwb2ludHMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAxLCAxNSkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbHVlIGZvciBkZXZfZW5kcG9pbnRzXG4iKTsKKwkJRFdDX1dBUk4oImRldl9lbmRwb2ludHMgbXVzdCBiZSAxLTE1XG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICh2YWwgPiAoY29yZV9pZi0+aHdjZmcyLmIubnVtX2Rldl9lcCkpIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQKKwkJICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGV2X2VuZHBvaW50cykpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiJWQgaW52YWxpZCBmb3IgZGV2X2VuZHBvaW50cy4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbnMuXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXZhbCA9IGNvcmVfaWYtPmh3Y2ZnMi5iLm51bV9kZXZfZXA7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfZW5kcG9pbnRzID0gdmFsOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fZGV2X2VuZHBvaW50cyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfZW5kcG9pbnRzOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1fcGh5X3R5cGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgdmFsaWQgPSAwOworCisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDIpKSB7CisJCURXQ19XQVJOKCJXcm9uZyB2YWx1ZSBmb3IgcGh5X3R5cGVcbiIpOworCQlEV0NfV0FSTigicGh5X3R5cGUgbXVzdCBiZSAwLDEgb3IgMlxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisjaWZuZGVmIE5PX0ZTX1BIWV9IV19DSEVDS1MKKwlpZiAoKHZhbCA9PSBEV0NfUEhZX1RZUEVfUEFSQU1fVVRNSSkgJiYKKwkgICAgKChjb3JlX2lmLT5od2NmZzIuYi5oc19waHlfdHlwZSA9PSAxKSB8fAorCSAgICAgKGNvcmVfaWYtPmh3Y2ZnMi5iLmhzX3BoeV90eXBlID09IDMpKSkgeworCQl2YWxpZCA9IDE7CisJfSBlbHNlIGlmICgodmFsID09IERXQ19QSFlfVFlQRV9QQVJBTV9VTFBJKSAmJgorCQkgICAoKGNvcmVfaWYtPmh3Y2ZnMi5iLmhzX3BoeV90eXBlID09IDIpIHx8CisJCSAgICAoY29yZV9pZi0+aHdjZmcyLmIuaHNfcGh5X3R5cGUgPT0gMykpKSB7CisJCXZhbGlkID0gMTsKKwl9IGVsc2UgaWYgKCh2YWwgPT0gRFdDX1BIWV9UWVBFX1BBUkFNX0ZTKSAmJgorCQkgICAoY29yZV9pZi0+aHdjZmcyLmIuZnNfcGh5X3R5cGUgPT0gMSkpIHsKKwkJdmFsaWQgPSAxOworCX0KKwlpZiAoIXZhbGlkKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5waHlfdHlwZSkpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiJWQgaW52YWxpZCBmb3IgcGh5X3R5cGUuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb25zLlxuIiwKKwkJCSAgICAgdmFsKTsKKwkJfQorCQlpZiAoY29yZV9pZi0+aHdjZmcyLmIuaHNfcGh5X3R5cGUpIHsKKwkJCWlmICgoY29yZV9pZi0+aHdjZmcyLmIuaHNfcGh5X3R5cGUgPT0gMykgfHwKKwkJCSAgICAoY29yZV9pZi0+aHdjZmcyLmIuaHNfcGh5X3R5cGUgPT0gMSkpIHsKKwkJCQl2YWwgPSBEV0NfUEhZX1RZUEVfUEFSQU1fVVRNSTsKKwkJCX0gZWxzZSB7CisJCQkJdmFsID0gRFdDX1BIWV9UWVBFX1BBUkFNX1VMUEk7CisJCQl9CisJCX0KKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJfQorI2VuZGlmCisJY29yZV9pZi0+Y29yZV9wYXJhbXMtPnBoeV90eXBlID0gdmFsOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fcGh5X3R5cGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cGh5X3R5cGU7Cit9CisKK2ludCBkd2Nfb3RnX3NldF9wYXJhbV9zcGVlZChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludDMyX3QgdmFsKQoreworCWludCByZXR2YWwgPSAwOworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsdWUgZm9yIHNwZWVkIHBhcmFtZXRlclxuIik7CisJCURXQ19XQVJOKCJtYXhfc3BlZWQgcGFyYW1ldGVyIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKwlpZiAoKHZhbCA9PSAwKQorCSAgICAmJiBkd2Nfb3RnX2dldF9wYXJhbV9waHlfdHlwZShjb3JlX2lmKSA9PSBEV0NfUEhZX1RZUEVfUEFSQU1fRlMpIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQoY29yZV9pZi0+Y29yZV9wYXJhbXMtPnNwZWVkKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBzcGVlZCBwYXJlbXRlci4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbi5cbiIsCisJCQkgICAgIHZhbCk7CisJCX0KKwkJdmFsID0KKwkJICAgIChkd2Nfb3RnX2dldF9wYXJhbV9waHlfdHlwZShjb3JlX2lmKSA9PQorCQkgICAgIERXQ19QSFlfVFlQRV9QQVJBTV9GUyA/IDEgOiAwKTsKKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJfQorCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5zcGVlZCA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX3NwZWVkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPnNwZWVkOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1faG9zdF9sc19sb3dfcG93ZXJfcGh5X2Nsayhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCQlpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTgorCQkgICAgKCJXcm9uZyB2YWx1ZSBmb3IgaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsayBwYXJhbWV0ZXJcbiIpOworCQlEV0NfV0FSTigiaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsayBtdXN0IGJlIDAgb3IgMVxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAoKHZhbCA9PSBEV0NfSE9TVF9MU19MT1dfUE9XRVJfUEhZX0NMS19QQVJBTV80OE1IWikKKwkgICAgJiYgKGR3Y19vdGdfZ2V0X3BhcmFtX3BoeV90eXBlKGNvcmVfaWYpID09IERXQ19QSFlfVFlQRV9QQVJBTV9GUykpIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQKKwkJICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsaykpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiJWQgaW52YWxpZCBmb3IgaG9zdF9sc19sb3dfcG93ZXJfcGh5X2Nsay4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbi5cbiIsCisJCQkgICAgIHZhbCk7CisJCX0KKwkJdmFsID0KKwkJICAgIChkd2Nfb3RnX2dldF9wYXJhbV9waHlfdHlwZShjb3JlX2lmKSA9PQorCQkgICAgIERXQ19QSFlfVFlQRV9QQVJBTV9GUykgPworCQkgICAgRFdDX0hPU1RfTFNfTE9XX1BPV0VSX1BIWV9DTEtfUEFSQU1fNk1IWiA6CisJCSAgICBEV0NfSE9TVF9MU19MT1dfUE9XRVJfUEhZX0NMS19QQVJBTV80OE1IWjsKKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJY29yZV9pZi0+Y29yZV9wYXJhbXMtPmhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGsgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9ob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPmhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGs7Cit9CisKK2ludCBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdWxwaV9kZHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMCwgMSkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbHVlIGZvciBwaHlfdWxwaV9kZHJcbiIpOworCQlEV0NfV0FSTigicGh5X3VwbGlfZGRyIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5waHlfdWxwaV9kZHIgPSB2YWw7CisJcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fcGh5X3VscGlfZGRyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPnBoeV91bHBpX2RkcjsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX3BoeV91bHBpX2V4dF92YnVzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJaW50MzJfdCB2YWwpCit7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDEpKSB7CisJCURXQ19XQVJOKCJXcm9uZyB2YWxhdWUgZm9yIHBoeV91bHBpX2V4dF92YnVzXG4iKTsKKwkJRFdDX1dBUk4oInBoeV91bHBpX2V4dF92YnVzIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5waHlfdWxwaV9leHRfdmJ1cyA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9waHlfdWxwaV9leHRfdmJ1cyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5waHlfdWxwaV9leHRfdmJ1czsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX3BoeV91dG1pX3dpZHRoKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpCit7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDgsIDgpICYmIERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDE2LCAxNikpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbGF1ZSBmb3IgcGh5X3V0bWlfd2lkdGhcbiIpOworCQlEV0NfV0FSTigicGh5X3V0bWlfd2lkdGggbXVzdCBiZSA4IG9yIDE2XG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5waHlfdXRtaV93aWR0aCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9waHlfdXRtaV93aWR0aChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5waHlfdXRtaV93aWR0aDsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX3VscGlfZnNfbHMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMCwgMSkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbGF1ZSBmb3IgdWxwaV9mc19sc1xuIik7CisJCURXQ19XQVJOKCJ1bHBpX2ZzX2xzIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT51bHBpX2ZzX2xzID0gdmFsOworCXJldHVybiAwOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX3VscGlfZnNfbHMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+dWxwaV9mc19sczsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX3RzX2RsaW5lKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpCit7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDEpKSB7CisJCURXQ19XQVJOKCJXcm9uZyB2YWxhdWUgZm9yIHRzX2RsaW5lXG4iKTsKKwkJRFdDX1dBUk4oInRzX2RsaW5lIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT50c19kbGluZSA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV90c19kbGluZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT50c19kbGluZTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2kyY19lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMCwgMSkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbGF1ZSBmb3IgaTJjX2VuYWJsZVxuIik7CisJCURXQ19XQVJOKCJpMmNfZW5hYmxlIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKyNpZm5kZWYgTk9fRlNfUEhZX0hXX0NIRUNLCisJaWYgKHZhbCA9PSAxICYmIGNvcmVfaWYtPmh3Y2ZnMy5iLmkyYyA9PSAwKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5pMmNfZW5hYmxlKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBpMmNfZW5hYmxlLiBDaGVjayBIVyBjb25maWd1cmF0aW9uLlxuIiwKKwkJCSAgICAgdmFsKTsKKwkJfQorCQl2YWwgPSAwOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisjZW5kaWYKKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5pMmNfZW5hYmxlID0gdmFsOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1faTJjX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5pMmNfZW5hYmxlOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1fZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCSAgICAgaW50MzJfdCB2YWwsIGludCBmaWZvX251bSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCA0LCA3NjgpKSB7CisJCURXQ19XQVJOKCJXcm9uZyB2YWx1ZSBmb3IgZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVxuIik7CisJCURXQ19XQVJOKCJkZXZfcGVyaW9fdHhfZmlmb19zaXplIG11c3QgYmUgNC03NjhcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJaWYgKHZhbCA+CisJICAgIChEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+ZHR4ZnNpeltmaWZvX251bV0pKSkgeworCQlpZiAoZHdjX290Z19wYXJhbV9pbml0aWFsaXplZAorCQkgICAgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfcGVyaW9fdHhfZmlmb19zaXplW2ZpZm9fbnVtXSkpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiYCVkJyBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgYGRldl9wZXJpb19maWZvX3NpemVfJWQnLiBDaGVjayBIVyBjb25maWd1cmF0aW9uLlxuIiwKKwkJCSAgICAgdmFsLCBmaWZvX251bSk7CisJCX0KKwkJdmFsID0gKERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5kdHhmc2l6W2ZpZm9fbnVtXSkpOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVtmaWZvX251bV0gPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9kZXZfcGVyaW9fdHhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJCSBpbnQgZmlmb19udW0pCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfcGVyaW9fdHhfZmlmb19zaXplW2ZpZm9fbnVtXTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2VuX211bHRpcGxlX3R4X2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgIGludDMyX3QgdmFsKQoreworCWludCByZXR2YWwgPSAwOworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsYXVlIGZvciBlbl9tdWx0aXBsZV90eF9maWZvLFxuIik7CisJCURXQ19XQVJOKCJlbl9tdWx0aXBsZV90eF9maWZvIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICh2YWwgPT0gMSAmJiBjb3JlX2lmLT5od2NmZzQuYi5kZWRfZmlmb19lbiA9PSAwKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkCisJCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmVuX211bHRpcGxlX3R4X2ZpZm8pKSB7CisJCQlEV0NfRVJST1IKKwkJCSAgICAoIiVkIGludmFsaWQgZm9yIHBhcmFtZXRlciBlbl9tdWx0aXBsZV90eF9maWZvLiBDaGVjayBIVyBjb25maWd1cmF0aW9uLlxuIiwKKwkJCSAgICAgdmFsKTsKKwkJfQorCQl2YWwgPSAwOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZW5fbXVsdGlwbGVfdHhfZmlmbyA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2VuX211bHRpcGxlX3R4X2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZW5fbXVsdGlwbGVfdHhfZmlmbzsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2Rldl90eF9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCwKKwkJCQkgICAgICAgaW50IGZpZm9fbnVtKQoreworCWludCByZXR2YWwgPSAwOworCisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDQsIDc2OCkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbHVlIGZvciBkZXZfdHhfZmlmb19zaXplXG4iKTsKKwkJRFdDX1dBUk4oImRldl90eF9maWZvX3NpemUgbXVzdCBiZSA0LTc2OFxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAodmFsID4KKwkgICAgKERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5kdHhmc2l6W2ZpZm9fbnVtXSkpKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkCisJCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRldl90eF9maWZvX3NpemVbZmlmb19udW1dKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCJgJWQnIGludmFsaWQgZm9yIHBhcmFtZXRlciBgZGV2X3R4X2ZpZm9fc2l6ZV8lZCcuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwsIGZpZm9fbnVtKTsKKwkJfQorCQl2YWwgPSAoRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmR0eGZzaXpbZmlmb19udW1dKSk7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfdHhfZmlmb19zaXplW2ZpZm9fbnVtXSA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2Rldl90eF9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgICBpbnQgZmlmb19udW0pCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfdHhfZmlmb19zaXplW2ZpZm9fbnVtXTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX3Rocl9jdGwoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCA3KSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsdWUgZm9yIHRocl9jdGxcbiIpOworCQlEV0NfV0FSTigidGhyX2N0bCBtdXN0IGJlIDAtN1xuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAoKHZhbCAhPSAwKSAmJgorCSAgICAoIWR3Y19vdGdfZ2V0X3BhcmFtX2RtYV9lbmFibGUoY29yZV9pZikgfHwKKwkgICAgICFjb3JlX2lmLT5od2NmZzQuYi5kZWRfZmlmb19lbikpIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQoY29yZV9pZi0+Y29yZV9wYXJhbXMtPnRocl9jdGwpKSB7CisJCQlEV0NfRVJST1IKKwkJCSAgICAoIiVkIGludmFsaWQgZm9yIHBhcmFtZXRlciB0aHJfY3RsLiBDaGVjayBIVyBjb25maWd1cmF0aW9uLlxuIiwKKwkJCSAgICAgdmFsKTsKKwkJfQorCQl2YWwgPSAwOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+dGhyX2N0bCA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX3Rocl9jdGwoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+dGhyX2N0bDsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2xwbV9lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTigiV3JvbmcgdmFsdWUgZm9yIGxwbV9lbmFibGVcbiIpOworCQlEV0NfV0FSTigibHBtX2VuYWJsZSBtdXN0IGJlIDAgb3IgMVxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAodmFsICYmICFjb3JlX2lmLT5od2NmZzMuYi5vdGdfbHBtX2VuKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5scG1fZW5hYmxlKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgbHBtX2VuYWJsZS4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbi5cbiIsCisJCQkgICAgIHZhbCk7CisJCX0KKwkJdmFsID0gMDsKKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJY29yZV9pZi0+Y29yZV9wYXJhbXMtPmxwbV9lbmFibGUgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9scG1fZW5hYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPmxwbV9lbmFibGU7Cit9CisKK2ludCBkd2Nfb3RnX3NldF9wYXJhbV90eF90aHJfbGVuZ3RoKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpCit7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDgsIDEyOCkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbGF1ZSBmb3IgdHhfdGhyX2xlbmd0aFxuIik7CisJCURXQ19XQVJOKCJ0eF90aHJfbGVuZ3RoIG11c3QgYmUgOCAtIDEyOFxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+dHhfdGhyX2xlbmd0aCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV90eF90aHJfbGVuZ3RoKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPnR4X3Rocl9sZW5ndGg7Cit9CisKK2ludCBkd2Nfb3RnX3NldF9wYXJhbV9yeF90aHJfbGVuZ3RoKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpCit7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDgsIDEyOCkpIHsKKwkJRFdDX1dBUk4oIldyb25nIHZhbGF1ZSBmb3IgcnhfdGhyX2xlbmd0aFxuIik7CisJCURXQ19XQVJOKCJyeF90aHJfbGVuZ3RoIG11c3QgYmUgOCAtIDEyOFxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+cnhfdGhyX2xlbmd0aCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9yeF90aHJfbGVuZ3RoKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPnJ4X3Rocl9sZW5ndGg7Cit9CisKK2ludCBkd2Nfb3RnX3NldF9wYXJhbV9kbWFfYnVyc3Rfc2l6ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludDMyX3QgdmFsKQoreworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAxLCAxKSAmJgorCSAgICBEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCA0LCA0KSAmJgorCSAgICBEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCA4LCA4KSAmJgorCSAgICBEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAxNiwgMTYpICYmCisJICAgIERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDMyLCAzMikgJiYKKwkgICAgRFdDX09UR19QQVJBTV9URVNUKHZhbCwgNjQsIDY0KSAmJgorCSAgICBEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAxMjgsIDEyOCkgJiYKKwkgICAgRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMjU2LCAyNTYpKSB7CisJCURXQ19XQVJOKCJgJWQnIGludmFsaWQgZm9yIHBhcmFtZXRlciBgZG1hX2J1cnN0X3NpemUnXG4iLCB2YWwpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kbWFfYnVyc3Rfc2l6ZSA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9kbWFfYnVyc3Rfc2l6ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kbWFfYnVyc3Rfc2l6ZTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX3B0aV9lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMCwgMSkpIHsKKwkJRFdDX1dBUk4oImAlZCcgaW52YWxpZCBmb3IgcGFyYW1ldGVyIGBwdGlfZW5hYmxlJ1xuIiwgdmFsKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKwlpZiAodmFsICYmIChjb3JlX2lmLT5zbnBzaWQgPCBPVEdfQ09SRV9SRVZfMl83MmEpKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5wdGlfZW5hYmxlKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgcHRpX2VuYWJsZS4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbi5cbiIsCisJCQkgICAgIHZhbCk7CisJCX0KKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJCXZhbCA9IDA7CisJfQorCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5wdGlfZW5hYmxlID0gdmFsOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fcHRpX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5wdGlfZW5hYmxlOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1fbXBpX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludDMyX3QgdmFsKQoreworCWludCByZXR2YWwgPSAwOworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTigiYCVkJyBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgYG1waV9lbmFibGUnXG4iLCB2YWwpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCWlmICh2YWwgJiYgKGNvcmVfaWYtPmh3Y2ZnMi5iLm11bHRpX3Byb2NfaW50ID09IDApKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5tcGlfZW5hYmxlKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgbXBpX2VuYWJsZS4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbi5cbiIsCisJCQkgICAgIHZhbCk7CisJCX0KKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJCXZhbCA9IDA7CisJfQorCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5tcGlfZW5hYmxlID0gdmFsOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fbXBpX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5tcGlfZW5hYmxlOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1fYWRwX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludDMyX3QgdmFsKQoreworCWludCByZXR2YWwgPSAwOworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTigiYCVkJyBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgYGFkcF9lbmFibGUnXG4iLCB2YWwpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCWlmICh2YWwgJiYgKGNvcmVfaWYtPmh3Y2ZnMy5iLmFkcF9zdXBwID09IDApKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkCisJCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmFkcF9zdXBwX2VuYWJsZSkpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiJWQgaW52YWxpZCBmb3IgcGFyYW1ldGVyIGFkcF9lbmFibGUuIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQl2YWwgPSAwOworCX0KKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+YWRwX3N1cHBfZW5hYmxlID0gdmFsOworCS8qU2V0IE9URyB2ZXJzaW9uIDIuMCBpbiBjYXNlIG9mIGVuYWJsaW5nIEFEUCovCisJaWYgKHZhbCkKKwkJZHdjX290Z19zZXRfcGFyYW1fb3RnX3Zlcihjb3JlX2lmLCAxKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fYWRwX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5hZHBfc3VwcF9lbmFibGU7Cit9CisKK2ludCBkd2Nfb3RnX3NldF9wYXJhbV9pY191c2JfY2FwKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDEpKSB7CisJCURXQ19XQVJOKCJgJWQnIGludmFsaWQgZm9yIHBhcmFtZXRlciBgaWNfdXNiX2NhcCdcbiIsIHZhbCk7CisJCURXQ19XQVJOKCJpY191c2JfY2FwIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICh2YWwgJiYgKGNvcmVfaWYtPmh3Y2ZnMi5iLm90Z19lbmFibGVfaWNfdXNiID09IDApKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5pY191c2JfY2FwKSkgeworCQkJRFdDX0VSUk9SCisJCQkgICAgKCIlZCBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgaWNfdXNiX2NhcC4gQ2hlY2sgSFcgY29uZmlndXJhdGlvbi5cbiIsCisJCQkgICAgIHZhbCk7CisJCX0KKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJCXZhbCA9IDA7CisJfQorCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5pY191c2JfY2FwID0gdmFsOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1faWNfdXNiX2NhcChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5pY191c2JfY2FwOworfQorCitpbnQgZHdjX290Z19zZXRfcGFyYW1fYWhiX3Rocl9yYXRpbyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludDMyX3QgdmFsKQoreworCWludCByZXR2YWwgPSAwOworCWludCB2YWxpZCA9IDE7CisKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMCwgMykpIHsKKwkJRFdDX1dBUk4oImAlZCcgaW52YWxpZCBmb3IgcGFyYW1ldGVyIGBhaGJfdGhyX3JhdGlvJ1xuIiwgdmFsKTsKKwkJRFdDX1dBUk4oImFoYl90aHJfcmF0aW8gbXVzdCBiZSAwIC0gM1xuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAodmFsCisJICAgICYmIChjb3JlX2lmLT5zbnBzaWQgPCBPVEdfQ09SRV9SRVZfMl84MWEKKwkJfHwgIWR3Y19vdGdfZ2V0X3BhcmFtX3Rocl9jdGwoY29yZV9pZikpKSB7CisJCXZhbGlkID0gMDsKKwl9IGVsc2UgaWYgKHZhbAorCQkgICAmJiAoKGR3Y19vdGdfZ2V0X3BhcmFtX3R4X3Rocl9sZW5ndGgoY29yZV9pZikgLyAoMSA8PCB2YWwpKSA8CisJCSAgICAgICA0KSkgeworCQl2YWxpZCA9IDA7CisJfQorCWlmICh2YWxpZCA9PSAwKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkCisJCSAgICAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmFoYl90aHJfcmF0aW8pKSB7CisJCQlEV0NfRVJST1IKKwkJCSAgICAoIiVkIGludmFsaWQgZm9yIHBhcmFtZXRlciBhaGJfdGhyX3JhdGlvLiBDaGVjayBIVyBjb25maWd1cmF0aW9uLlxuIiwKKwkJCSAgICAgdmFsKTsKKwkJfQorCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwkJdmFsID0gMDsKKwl9CisKKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+YWhiX3Rocl9yYXRpbyA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2FoYl90aHJfcmF0aW8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+YWhiX3Rocl9yYXRpbzsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX3Bvd2VyX2Rvd24oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgdmFsaWQgPSAxOworCisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDIpKSB7CisJCURXQ19XQVJOKCJgJWQnIGludmFsaWQgZm9yIHBhcmFtZXRlciBgcG93ZXJfZG93bidcbiIsIHZhbCk7CisJCURXQ19XQVJOKCJwb3dlcl9kb3duIG11c3QgYmUgMCAtIDJcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJaWYgKCh2YWwgPT0gMikgJiYgKGNvcmVfaWYtPnNucHNpZCA8IE9UR19DT1JFX1JFVl8yXzkxYSkpIHsKKwkJdmFsaWQgPSAwOworCX0KKwlpZiAodmFsaWQgPT0gMCkgeworCQlpZiAoZHdjX290Z19wYXJhbV9pbml0aWFsaXplZChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cG93ZXJfZG93bikpIHsKKwkJCURXQ19FUlJPUgorCQkJICAgICgiJWQgaW52YWxpZCBmb3IgcGFyYW1ldGVyIHBvd2VyX2Rvd24uIENoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJICAgICB2YWwpOworCQl9CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQl2YWwgPSAwOworCX0KKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+cG93ZXJfZG93biA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX3Bvd2VyX2Rvd24oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cG93ZXJfZG93bjsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX3JlbG9hZF9jdGwoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgdmFsaWQgPSAxOworCisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDEpKSB7CisJCURXQ19XQVJOKCJgJWQnIGludmFsaWQgZm9yIHBhcmFtZXRlciBgcmVsb2FkX2N0bCdcbiIsIHZhbCk7CisJCURXQ19XQVJOKCJyZWxvYWRfY3RsIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICgodmFsID09IDEpICYmIChjb3JlX2lmLT5zbnBzaWQgPCBPVEdfQ09SRV9SRVZfMl85MmEpKSB7CisJCXZhbGlkID0gMDsKKwl9CisJaWYgKHZhbGlkID09IDApIHsKKwkJaWYgKGR3Y19vdGdfcGFyYW1faW5pdGlhbGl6ZWQoY29yZV9pZi0+Y29yZV9wYXJhbXMtPnJlbG9hZF9jdGwpKSB7CisJCQlEV0NfRVJST1IoIiVkIGludmFsaWQgZm9yIHBhcmFtZXRlciByZWxvYWRfY3RsLiIKKwkJCQkgICJDaGVjayBIVyBjb25maWd1cmF0aW9uLlxuIiwgdmFsKTsKKwkJfQorCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwkJdmFsID0gMDsKKwl9CisJY29yZV9pZi0+Y29yZV9wYXJhbXMtPnJlbG9hZF9jdGwgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9yZWxvYWRfY3RsKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+Y29yZV9wYXJhbXMtPnJlbG9hZF9jdGw7Cit9CisKK2ludCBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfb3V0X25hayhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludDMyX3QgdmFsKQoreworCWludCByZXR2YWwgPSAwOworCWludCB2YWxpZCA9IDE7CisKKwlpZiAoRFdDX09UR19QQVJBTV9URVNUKHZhbCwgMCwgMSkpIHsKKwkJRFdDX1dBUk4oImAlZCcgaW52YWxpZCBmb3IgcGFyYW1ldGVyIGBkZXZfb3V0X25haydcbiIsIHZhbCk7CisJCURXQ19XQVJOKCJkZXZfb3V0X25hayBtdXN0IGJlIDAgb3IgMVxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlpZiAoKHZhbCA9PSAxKSAmJiAoKGNvcmVfaWYtPnNucHNpZCA8IE9UR19DT1JFX1JFVl8yXzkzYSkgfHwKKwkJIShjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZG1hX2Rlc2NfZW5hYmxlKSkpIHsKKwkJdmFsaWQgPSAwOworCX0KKwlpZiAodmFsaWQgPT0gMCkgeworCQlpZiAoZHdjX290Z19wYXJhbV9pbml0aWFsaXplZChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGV2X291dF9uYWspKSB7CisJCQlEV0NfRVJST1IoIiVkIGludmFsaWQgZm9yIHBhcmFtZXRlciBkZXZfb3V0X25hay4iCisJCQkJIkNoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLCB2YWwpOworCQl9CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQl2YWwgPSAwOworCX0KKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGV2X291dF9uYWsgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9kZXZfb3V0X25hayhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfb3V0X25hazsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2NvbnRfb25fYm5hKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IHZhbGlkID0gMTsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTigiYCVkJyBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgYGNvbnRfb25fYm5hJ1xuIiwgdmFsKTsKKwkJRFdDX1dBUk4oImNvbnRfb25fYm5hIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICgodmFsID09IDEpICYmICgoY29yZV9pZi0+c25wc2lkIDwgT1RHX0NPUkVfUkVWXzJfOTRhKSB8fAorCQkhKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kbWFfZGVzY19lbmFibGUpKSkgeworCQkJdmFsaWQgPSAwOworCX0KKwlpZiAodmFsaWQgPT0gMCkgeworCQlpZiAoZHdjX290Z19wYXJhbV9pbml0aWFsaXplZChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+Y29udF9vbl9ibmEpKSB7CisJCQlEV0NfRVJST1IoIiVkIGludmFsaWQgZm9yIHBhcmFtZXRlciBjb250X29uX2JuYS4iCisJCQkJIkNoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLCB2YWwpOworCQl9CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQl2YWwgPSAwOworCX0KKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+Y29udF9vbl9ibmEgPSB2YWw7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9jb250X29uX2JuYShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5jb250X29uX2JuYTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX2FoYl9zaW5nbGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgdmFsaWQgPSAxOworCisJaWYgKERXQ19PVEdfUEFSQU1fVEVTVCh2YWwsIDAsIDEpKSB7CisJCURXQ19XQVJOKCJgJWQnIGludmFsaWQgZm9yIHBhcmFtZXRlciBgYWhiX3NpbmdsZSdcbiIsIHZhbCk7CisJCURXQ19XQVJOKCJhaGJfc2luZ2xlIG11c3QgYmUgMCBvciAxXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICgodmFsID09IDEpICYmIChjb3JlX2lmLT5zbnBzaWQgPCBPVEdfQ09SRV9SRVZfMl85NGEpKSB7CisJCQl2YWxpZCA9IDA7CisJfQorCWlmICh2YWxpZCA9PSAwKSB7CisJCWlmIChkd2Nfb3RnX3BhcmFtX2luaXRpYWxpemVkKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5haGJfc2luZ2xlKSkgeworCQkJRFdDX0VSUk9SKCIlZCBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgYWhiX3NpbmdsZS4iCisJCQkJIkNoZWNrIEhXIGNvbmZpZ3VyYXRpb24uXG4iLCB2YWwpOworCQl9CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQl2YWwgPSAwOworCX0KKwljb3JlX2lmLT5jb3JlX3BhcmFtcy0+YWhiX3NpbmdsZSA9IHZhbDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2FoYl9zaW5nbGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBjb3JlX2lmLT5jb3JlX3BhcmFtcy0+YWhiX3NpbmdsZTsKK30KKworaW50IGR3Y19vdGdfc2V0X3BhcmFtX290Z192ZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmIChEV0NfT1RHX1BBUkFNX1RFU1QodmFsLCAwLCAxKSkgeworCQlEV0NfV0FSTigiYCVkJyBpbnZhbGlkIGZvciBwYXJhbWV0ZXIgYG90Z192ZXInXG4iLCB2YWwpOworCQlEV0NfV0FSTgorCQkgICAgKCJvdGdfdmVyIG11c3QgYmUgMChmb3IgT1RHIDEuMyBzdXBwb3J0KSBvciAxKGZvciBPVEcgMi4wIHN1cHBvcnQpXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWNvcmVfaWYtPmNvcmVfcGFyYW1zLT5vdGdfdmVyID0gdmFsOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fb3RnX3Zlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5vdGdfdmVyOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9obnBzdGF0dXMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWdvdGdjdGxfZGF0YV90IG90Z2N0bDsKKwlvdGdjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdvdGdjdGwpOworCXJldHVybiBvdGdjdGwuYi5oc3RuZWdzY3M7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfZ2V0X3NycHN0YXR1cyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZ290Z2N0bF9kYXRhX3Qgb3RnY3RsOworCW90Z2N0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z290Z2N0bCk7CisJcmV0dXJuIG90Z2N0bC5iLnNlc3JlcXNjczsKK30KKwordm9pZCBkd2Nfb3RnX3NldF9obnByZXEoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJaWYoY29yZV9pZi0+b3RnX3ZlciA9PSAwKSB7CisJCWdvdGdjdGxfZGF0YV90IG90Z2N0bDsKKwkJb3RnY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsKTsKKwkJb3RnY3RsLmIuaG5wcmVxID0gdmFsOworCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdvdGdjdGwsIG90Z2N0bC5kMzIpOworCX0gZWxzZSB7CisJCWNvcmVfaWYtPm90Z19zdHMgPSB2YWw7CisJfQorfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9nc25wc2lkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gY29yZV9pZi0+c25wc2lkOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9tb2RlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlnaW50c3RzX2RhdGFfdCBnaW50c3RzOworCWdpbnRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCXJldHVybiBnaW50c3RzLmIuY3VybW9kZTsKK30KKwordWludDMyX3QgZHdjX290Z19nZXRfaG5wY2FwYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZ3VzYmNmZ19kYXRhX3QgdXNiY2ZnOworCXVzYmNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3VzYmNmZyk7CisJcmV0dXJuIHVzYmNmZy5iLmhucGNhcDsKK30KKwordm9pZCBkd2Nfb3RnX3NldF9obnBjYXBhYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKQoreworCWd1c2JjZmdfZGF0YV90IHVzYmNmZzsKKwl1c2JjZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmd1c2JjZmcpOworCXVzYmNmZy5iLmhucGNhcCA9IHZhbDsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmd1c2JjZmcsIHVzYmNmZy5kMzIpOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9zcnBjYXBhYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlndXNiY2ZnX2RhdGFfdCB1c2JjZmc7CisJdXNiY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndXNiY2ZnKTsKKwlyZXR1cm4gdXNiY2ZnLmIuc3JwY2FwOworfQorCit2b2lkIGR3Y19vdGdfc2V0X3NycGNhcGFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJZ3VzYmNmZ19kYXRhX3QgdXNiY2ZnOworCXVzYmNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3VzYmNmZyk7CisJdXNiY2ZnLmIuc3JwY2FwID0gdmFsOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3VzYmNmZywgdXNiY2ZnLmQzMik7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfZ2V0X2RldnNwZWVkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlkY2ZnX2RhdGFfdCBkY2ZnOworCWRjZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY2ZnKTsKKwlyZXR1cm4gZGNmZy5iLmRldnNwZDsKK30KKwordm9pZCBkd2Nfb3RnX3NldF9kZXZzcGVlZChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQzMl90IHZhbCkKK3sKKwlkY2ZnX2RhdGFfdCBkY2ZnOworCWRjZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY2ZnKTsKKwlkY2ZnLmIuZGV2c3BkID0gdmFsOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcsIGRjZmcuZDMyKTsKK30KKwordWludDMyX3QgZHdjX290Z19nZXRfYnVzY29ubmVjdGVkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlocHJ0MF9kYXRhX3QgaHBydDA7CisJaHBydDAuZDMyID0gRFdDX1JFQURfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDApOworCXJldHVybiBocHJ0MC5iLnBydGNvbm5zdHM7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfZ2V0X2VudW1zcGVlZChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZHN0c19kYXRhX3QgZHN0czsKKwlkc3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZHN0cyk7CisJcmV0dXJuIGRzdHMuYi5lbnVtc3BkOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9wcnRwb3dlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJaHBydDBfZGF0YV90IGhwcnQwOworCWhwcnQwLmQzMiA9IERXQ19SRUFEX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwKTsKKwlyZXR1cm4gaHBydDAuYi5wcnRwd3I7CisKK30KKwordWludDMyX3QgZHdjX290Z19nZXRfY29yZV9zdGF0ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIGNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQ7Cit9CisKK3ZvaWQgZHdjX290Z19zZXRfcHJ0cG93ZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJaHBydDBfZGF0YV90IGhwcnQwOworCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwlocHJ0MC5iLnBydHB3ciA9IHZhbDsKKwlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfZ2V0X3BydHN1c3BlbmQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWhwcnQwX2RhdGFfdCBocHJ0MDsKKwlocHJ0MC5kMzIgPSBEV0NfUkVBRF9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCk7CisJcmV0dXJuIGhwcnQwLmIucHJ0c3VzcDsKKworfQorCit2b2lkIGR3Y19vdGdfc2V0X3BydHN1c3BlbmQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJaHBydDBfZGF0YV90IGhwcnQwOworCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwlocHJ0MC5iLnBydHN1c3AgPSB2YWw7CisJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCBocHJ0MC5kMzIpOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9mcl9pbnRlcnZhbChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJaGZpcl9kYXRhX3QgaGZpcjsKKwloZmlyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZmlyKTsKKwlyZXR1cm4gaGZpci5iLmZyaW50OworCit9CisKK3ZvaWQgZHdjX290Z19zZXRfZnJfaW50ZXJ2YWwoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJaGZpcl9kYXRhX3QgaGZpcjsKKwl1aW50MzJfdCBmcmFtX2ludDsKKwlmcmFtX2ludCA9IGNhbGNfZnJhbWVfaW50ZXJ2YWwoY29yZV9pZik7CisJaGZpci5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGZpcik7CisJaWYgKCFjb3JlX2lmLT5jb3JlX3BhcmFtcy0+cmVsb2FkX2N0bCkgeworCQlEV0NfV0FSTigiXG5DYW5ub3QgcmVsb2FkIEhGSVIgcmVnaXN0ZXIuSEZJUi5IRklSUmxkQ3RybCBiaXQgaXMiCisJCQkgIm5vdCBzZXQgdG8gMS5cblNob3VsZCBsb2FkIGRyaXZlciB3aXRoIHJlbG9hZF9jdGw9MSIKKwkJCSAiIG1vZHVsZSBwYXJhbWV0ZXJcbiIpOworCQlyZXR1cm47CisJfQorCXN3aXRjaCAoZnJhbV9pbnQpIHsKKwljYXNlIDM3NTA6CisJCWlmICgodmFsIDwgMzM1MCkgfHwgKHZhbCA+IDQxNTApKSB7CisJCQlEV0NfV0FSTigiSEZJUiBpbnRlcnZhbCBmb3IgSFMgY29yZSBhbmQgMzAgTUh6IgorCQkJCSAiY2xvY2sgZnJlcSBzaG91bGQgYmUgZnJvbSAzMzUwIHRvIDQxNTBcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgMzAwMDA6CisJCWlmICgodmFsIDwgMjY4MjApIHx8ICh2YWwgPiAzMzE4MCkpIHsKKwkJCURXQ19XQVJOKCJIRklSIGludGVydmFsIGZvciBGUy9MUyBjb3JlIGFuZCAzMCBNSHoiCisJCQkJICJjbG9jayBmcmVxIHNob3VsZCBiZSBmcm9tIDI2ODIwIHRvIDMzMTgwXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIDYwMDA6CisJCWlmICgodmFsIDwgNTM2MCkgfHwgKHZhbCA+IDY2NDApKSB7CisJCQlEV0NfV0FSTigiSEZJUiBpbnRlcnZhbCBmb3IgSFMgY29yZSBhbmQgNDggTUh6IgorCQkJCSAiY2xvY2sgZnJlcSBzaG91bGQgYmUgZnJvbSA1MzYwIHRvIDY2NDBcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgNDgwMDA6CisJCWlmICgodmFsIDwgNDI5MTIpIHx8ICh2YWwgPiA1MzA4OCkpIHsKKwkJCURXQ19XQVJOKCJIRklSIGludGVydmFsIGZvciBGUy9MUyBjb3JlIGFuZCA0OCBNSHoiCisJCQkJICJjbG9jayBmcmVxIHNob3VsZCBiZSBmcm9tIDQyOTEyIHRvIDUzMDg4XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwljYXNlIDc1MDA6CisJCWlmICgodmFsIDwgNjcwMCkgfHwgKHZhbCA+IDgzMDApKSB7CisJCQlEV0NfV0FSTigiSEZJUiBpbnRlcnZhbCBmb3IgSFMgY29yZSBhbmQgNjAgTUh6IgorCQkJCSAiY2xvY2sgZnJlcSBzaG91bGQgYmUgZnJvbSA2NzAwIHRvIDgzMDBcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgNjAwMDA6CisJCWlmICgodmFsIDwgNTM2NDApIHx8ICh2YWwgPiA2NTUzNikpIHsKKwkJCURXQ19XQVJOKCJIRklSIGludGVydmFsIGZvciBGUy9MUyBjb3JlIGFuZCA2MCBNSHoiCisJCQkJICJjbG9jayBmcmVxIHNob3VsZCBiZSBmcm9tIDUzNjQwIHRvIDY1NTM2XG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlEV0NfV0FSTigiVW5rbm93biBmcmFtZSBpbnRlcnZhbFxuIik7CisJCXJldHVybjsKKwkJYnJlYWs7CisKKwl9CisJaGZpci5iLmZyaW50ID0gdmFsOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGZpciwgaGZpci5kMzIpOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9tb2RlX2NoX3RpbShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJaGNmZ19kYXRhX3QgaGNmZzsKKwloY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnKTsKKwlyZXR1cm4gaGNmZy5iLm1vZGVjaHRpbWVuOworCit9CisKK3ZvaWQgZHdjX290Z19zZXRfbW9kZV9jaF90aW0oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJaGNmZ19kYXRhX3QgaGNmZzsKKwloY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnKTsKKwloY2ZnLmIubW9kZWNodGltZW4gPSB2YWw7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnLCBoY2ZnLmQzMik7Cit9CisKK3ZvaWQgZHdjX290Z19zZXRfcHJ0cmVzdW1lKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKQoreworCWhwcnQwX2RhdGFfdCBocHJ0MDsKKwlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJaHBydDAuYi5wcnRyZXMgPSB2YWw7CisJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCBocHJ0MC5kMzIpOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9yZW1vdGV3YWtlc2lnKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlkY3RsX2RhdGFfdCBkY3RsOworCWRjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsKTsKKwlyZXR1cm4gZGN0bC5iLnJtdHdrdXBzaWc7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfZ2V0X2xwbV9wb3J0c2xlZXBzdGF0dXMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWdscG1jZmdfZGF0YV90IGxwbWNmZzsKKwlscG1jZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdscG1jZmcpOworCisJRFdDX0FTU0VSVCghCisJCSAgICgoY29yZV9pZi0+bHhfc3RhdGUgPT0gRFdDX09UR19MMSkgXiBscG1jZmcuYi5wcnRfc2xlZXBfc3RzKSwKKwkJICAgImx4X3N0YXRlID0gJWQsIGxtcGNmZy5wcnRfc2xlZXBfc3RzID0gJWRcbiIsCisJCSAgIGNvcmVfaWYtPmx4X3N0YXRlLCBscG1jZmcuYi5wcnRfc2xlZXBfc3RzKTsKKworCXJldHVybiBscG1jZmcuYi5wcnRfc2xlZXBfc3RzOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9scG1fcmVtb3Rld2FrZWVuYWJsZWQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWdscG1jZmdfZGF0YV90IGxwbWNmZzsKKwlscG1jZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdscG1jZmcpOworCXJldHVybiBscG1jZmcuYi5yZW1fd2t1cF9lbjsKK30KKwordWludDMyX3QgZHdjX290Z19nZXRfbHBtcmVzcG9uc2UoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWdscG1jZmdfZGF0YV90IGxwbWNmZzsKKwlscG1jZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdscG1jZmcpOworCXJldHVybiBscG1jZmcuYi5hcHBsX3Jlc3A7Cit9CisKK3ZvaWQgZHdjX290Z19zZXRfbHBtcmVzcG9uc2UoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJZ2xwbWNmZ19kYXRhX3QgbHBtY2ZnOworCWxwbWNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJbHBtY2ZnLmIuYXBwbF9yZXNwID0gdmFsOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZywgbHBtY2ZnLmQzMik7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfZ2V0X2hzaWNfY29ubmVjdChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZ2xwbWNmZ19kYXRhX3QgbHBtY2ZnOworCWxwbWNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJcmV0dXJuIGxwbWNmZy5iLmhzaWNfY29ubmVjdDsKK30KKwordm9pZCBkd2Nfb3RnX3NldF9oc2ljX2Nvbm5lY3QoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJZ2xwbWNmZ19kYXRhX3QgbHBtY2ZnOworCWxwbWNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJbHBtY2ZnLmIuaHNpY19jb25uZWN0ID0gdmFsOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZywgbHBtY2ZnLmQzMik7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfZ2V0X2ludl9zZWxfaHNpYyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZ2xwbWNmZ19kYXRhX3QgbHBtY2ZnOworCWxwbWNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJcmV0dXJuIGxwbWNmZy5iLmludl9zZWxfaHNpYzsKKworfQorCit2b2lkIGR3Y19vdGdfc2V0X2ludl9zZWxfaHNpYyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQzMl90IHZhbCkKK3sKKwlnbHBtY2ZnX2RhdGFfdCBscG1jZmc7CisJbHBtY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbHBtY2ZnKTsKKwlscG1jZmcuYi5pbnZfc2VsX2hzaWMgPSB2YWw7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbHBtY2ZnLCBscG1jZmcuZDMyKTsKK30KKwordWludDMyX3QgZHdjX290Z19nZXRfZ290Z2N0bChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsKTsKK30KKwordm9pZCBkd2Nfb3RnX3NldF9nb3RnY3RsKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKQoreworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z290Z2N0bCwgdmFsKTsKK30KKwordWludDMyX3QgZHdjX290Z19nZXRfZ3VzYmNmZyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndXNiY2ZnKTsKK30KKwordm9pZCBkd2Nfb3RnX3NldF9ndXNiY2ZnKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKQoreworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3VzYmNmZywgdmFsKTsKK30KKwordWludDMyX3QgZHdjX290Z19nZXRfZ3J4ZnNpeihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnhmc2l6KTsKK30KKwordm9pZCBkd2Nfb3RnX3NldF9ncnhmc2l6KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKQoreworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3J4ZnNpeiwgdmFsKTsKK30KKwordWludDMyX3QgZHdjX290Z19nZXRfZ25wdHhmc2l6KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmducHR4ZnNpeik7Cit9CisKK3ZvaWQgZHdjX290Z19zZXRfZ25wdHhmc2l6KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKQoreworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z25wdHhmc2l6LCB2YWwpOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9ncHZuZGN0bChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHZuZGN0bCk7Cit9CisKK3ZvaWQgZHdjX290Z19zZXRfZ3B2bmRjdGwoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHZuZGN0bCwgdmFsKTsKK30KKwordWludDMyX3QgZHdjX290Z19nZXRfZ2dwaW8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2dwaW8pOworfQorCit2b2lkIGR3Y19vdGdfc2V0X2dncGlvKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKQoreworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2dwaW8sIHZhbCk7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfZ2V0X2hwcnQwKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gRFdDX1JFQURfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDApOworCit9CisKK3ZvaWQgZHdjX290Z19zZXRfaHBydDAoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCB2YWwpOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9ndWlkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmd1aWQpOworfQorCit2b2lkIGR3Y19vdGdfc2V0X2d1aWQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpCit7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ndWlkLCB2YWwpOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2dldF9ocHR4ZnNpeihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ocHR4ZnNpeik7Cit9CisKK3VpbnQxNl90IGR3Y19vdGdfZ2V0X290Z192ZXJzaW9uKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gKChjb3JlX2lmLT5vdGdfdmVyID09IDEpID8gKHVpbnQxNl90KTB4MDIwMCA6ICh1aW50MTZfdCkweDAxMDMpOworfQorCisvKioKKyAqIFN0YXJ0IHRoZSBTUlAgdGltZXIgdG8gZGV0ZWN0IHdoZW4gdGhlIFNSUCBkb2VzIG5vdCBjb21wbGV0ZSB3aXRoaW4KKyAqIDYgc2Vjb25kcy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiB0aGUgcG9pbnRlciB0byBjb3JlX2lmIHN0cnVjdXJlLgorICovCit2b2lkIGR3Y19vdGdfcGNkX3N0YXJ0X3NycF90aW1lcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJY29yZV9pZi0+c3JwX3RpbWVyX3N0YXJ0ZWQgPSAxOworCURXQ19USU1FUl9TQ0hFRFVMRShjb3JlX2lmLT5zcnBfdGltZXIsIDYwMDAgLyogNiBzZWNzICovICk7Cit9CisKK3ZvaWQgZHdjX290Z19pbml0aWF0ZV9zcnAoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXVpbnQzMl90ICphZGRyID0gKHVpbnQzMl90ICopICYgKGNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdvdGdjdGwpOworCWdvdGdjdGxfZGF0YV90IG1lbTsKKwlnb3RnY3RsX2RhdGFfdCB2YWw7CisKKwl2YWwuZDMyID0gRFdDX1JFQURfUkVHMzIoYWRkcik7CisJaWYgKHZhbC5iLnNlc3JlcSkgeworCQlEV0NfRVJST1IoIlNlc3Npb24gUmVxdWVzdCBBbHJlYWR5IGFjdGl2ZSFcbiIpOworCQlyZXR1cm47CisJfQorCisJRFdDX0lORk8oIlNlc3Npb24gUmVxdWVzdCBJbml0YXRlZFxuIik7CS8vTk9USUNFCisJbWVtLmQzMiA9IERXQ19SRUFEX1JFRzMyKGFkZHIpOworCW1lbS5iLnNlc3JlcSA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKGFkZHIsIG1lbS5kMzIpOworCisJLyogU3RhcnQgdGhlIFNSUCB0aW1lciAqLworCWR3Y19vdGdfcGNkX3N0YXJ0X3NycF90aW1lcihjb3JlX2lmKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY2lsLmggYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY2lsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1Nzg2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19jaWwuaApAQCAtMCwwICsxLDE0NTMgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAkRmlsZTogLy9kd2gvdXNiX2lpcC9kZXYvc29mdHdhcmUvb3RnL2xpbnV4L2RyaXZlcnMvZHdjX290Z19jaWwuaCAkCisgKiAkUmV2aXNpb246ICMxMjIgJAorICogJERhdGU6IDIwMTEvMTAvMjQgJAorICogJENoYW5nZTogMTg3MTE2MCAkCisgKgorICogU3lub3BzeXMgSFMgT1RHIExpbnV4IFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbiAoaGVyZWluYWZ0ZXIsCisgKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcworICogb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgKgorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKKyAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gdXNlIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgKiBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwgZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IKKyAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQorICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgKiBiZWxvdywgdGhlbiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIiBCQVNJUworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2lmICFkZWZpbmVkKF9fRFdDX0NJTF9IX18pCisjZGVmaW5lIF9fRFdDX0NJTF9IX18KKworI2luY2x1ZGUgImR3Y19saXN0LmgiCisjaW5jbHVkZSAiZHdjX290Z19kYmcuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX3JlZ3MuaCIKKworI2luY2x1ZGUgImR3Y19vdGdfY29yZV9pZi5oIgorI2luY2x1ZGUgImR3Y19vdGdfYWRwLmgiCisKKy8qKgorICogQGZpbGUKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBDb3JlIEludGVyZmFjZSBMYXllci4KKyAqLworCisjaWZkZWYgRFdDX1VURV9DRkkKKworI2RlZmluZSBNQVhfRE1BX0RFU0NTX1BFUl9FUAkyNTYKKworLyoqCisgKiBFbnVtZXJhdGlvbiBmb3IgdGhlIGRhdGEgYnVmZmVyIG1vZGUKKyAqLwordHlwZWRlZiBlbnVtIF9kYXRhX2J1ZmZlcl9tb2RlIHsKKwlCTV9TVEFOREFSRCA9IDAsCS8qIGRhdGEgYnVmZmVyIGlzIGluIG5vcm1hbCBtb2RlICovCisJQk1fU0cgPSAxLAkJLyogZGF0YSBidWZmZXIgdXNlcyB0aGUgc2NhdHRlci9nYXRoZXIgbW9kZSAqLworCUJNX0NPTkNBVCA9IDIsCQkvKiBkYXRhIGJ1ZmZlciB1c2VzIHRoZSBjb25jYXRlbmF0aW9uIG1vZGUgKi8KKwlCTV9DSVJDVUxBUiA9IDMsCS8qIGRhdGEgYnVmZmVyIHVzZXMgdGhlIGNpcmN1bGFyIERNQSBtb2RlICovCisJQk1fQUxJR04gPSA0CQkvKiBkYXRhIGJ1ZmZlciBpcyBpbiBidWZmZXIgYWxpZ25tZW50IG1vZGUgKi8KK30gZGF0YV9idWZmZXJfbW9kZV9lOworI2VuZGlmIC8vRFdDX1VURV9DRkkKKworLyoqIE1hY3JvcyBkZWZpbmVkIGZvciBEV0MgT1RHIEhXIFJlbGVhc2UgdmVyc2lvbiAqLworCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzYwYQkweDRGNTQyNjBBCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzcxYQkweDRGNTQyNzFBCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzcyYQkweDRGNTQyNzJBCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzgwYQkweDRGNTQyODBBCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzgxYQkweDRGNTQyODFBCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzkwYQkweDRGNTQyOTBBCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzkxYQkweDRGNTQyOTFBCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzkyYQkweDRGNTQyOTJBCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzkzYQkweDRGNTQyOTNBCisjZGVmaW5lIE9UR19DT1JFX1JFVl8yXzk0YQkweDRGNTQyOTRBCisKKy8qKgorICogSW5mb3JtYXRpb24gZm9yIGVhY2ggSVNPQyBwYWNrZXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IGlzb19wa3RfaW5mbyB7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IGxlbmd0aDsKKwlpbnQzMl90IHN0YXR1czsKK30gaXNvX3BrdF9pbmZvX3Q7CisKKy8qKgorICogVGhlIDxjb2RlPmR3Y19lcDwvY29kZT4gc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgc2luZ2xlCisgKiBlbmRwb2ludCB3aGVuIGFjdGluZyBpbiBkZXZpY2UgbW9kZS4gSXQgY29udGFpbnMgdGhlIGRhdGEgaXRlbXMKKyAqIG5lZWRlZCBmb3IgYW4gZW5kcG9pbnQgdG8gYmUgYWN0aXZhdGVkIGFuZCB0cmFuc2ZlciBwYWNrZXRzLgorICovCit0eXBlZGVmIHN0cnVjdCBkd2NfZXAgeworCS8qKiBFUCBudW1iZXIgdXNlZCBmb3IgcmVnaXN0ZXIgYWRkcmVzcyBsb29rdXAgKi8KKwl1aW50OF90IG51bTsKKwkvKiogRVAgZGlyZWN0aW9uIDAgPSBPVVQgKi8KKwl1bnNpZ25lZCBpc19pbjoxOworCS8qKiBFUCBhY3RpdmUuICovCisJdW5zaWduZWQgYWN0aXZlOjE7CisKKwkvKioKKwkgKiBQZXJpb2RpYyBUeCBGSUZPICMgZm9yIElOIEVQcyBGb3IgSU5UUiBFUCBzZXQgdG8gMCB0byB1c2Ugbm9uLXBlcmlvZGljCisJICogVHggRklGTy4gSWYgZGVkaWNhdGVkIFR4IEZJRk9zIGFyZSBlbmFibGVkIFR4IEZJRk8gIyBGT1IgSU4gRVBzKi8KKwl1bnNpZ25lZCB0eF9maWZvX251bTo0OworCS8qKiBFUCB0eXBlOiAwIC0gQ29udHJvbCwgMSAtIElTT0MsCSAyIC0gQlVMSywJMyAtIElOVFIgKi8KKwl1bnNpZ25lZCB0eXBlOjI7CisjZGVmaW5lIERXQ19PVEdfRVBfVFlQRV9DT05UUk9MCSAgIDAKKyNkZWZpbmUgRFdDX09UR19FUF9UWVBFX0lTT0MJICAgMQorI2RlZmluZSBEV0NfT1RHX0VQX1RZUEVfQlVMSwkgICAyCisjZGVmaW5lIERXQ19PVEdfRVBfVFlQRV9JTlRSCSAgIDMKKworCS8qKiBEQVRBIHN0YXJ0IFBJRCBmb3IgSU5UUiBhbmQgQlVMSyBFUCAqLworCXVuc2lnbmVkIGRhdGFfcGlkX3N0YXJ0OjE7CisJLyoqIEZyYW1lIChldmVuL29kZCkgZm9yIElTT0MgRVAgKi8KKwl1bnNpZ25lZCBldmVuX29kZF9mcmFtZToxOworCS8qKiBNYXggUGFja2V0IGJ5dGVzICovCisJdW5zaWduZWQgbWF4cGFja2V0OjExOworCisJLyoqIE1heCBUcmFuc2ZlciBzaXplICovCisJdWludDMyX3QgbWF4eGZlcjsKKworCS8qKiBAbmFtZSBUcmFuc2ZlciBzdGF0ZSAqLworCS8qKiBAeyAqLworCisJLyoqCisJICogUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2ZlciBidWZmZXIgLS0gZG8gbm90IG1vZGlmeQorCSAqIGR1cmluZyB0cmFuc2Zlci4KKwkgKi8KKworCWR3Y19kbWFfdCBkbWFfYWRkcjsKKworCWR3Y19kbWFfdCBkbWFfZGVzY19hZGRyOworCWR3Y19vdGdfZGV2X2RtYV9kZXNjX3QgKmRlc2NfYWRkcjsKKworCXVpbnQ4X3QgKnN0YXJ0X3hmZXJfYnVmZjsKKwkvKiogcG9pbnRlciB0byB0aGUgdHJhbnNmZXIgYnVmZmVyICovCisJdWludDhfdCAqeGZlcl9idWZmOworCS8qKiBOdW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgKi8KKwl1bnNpZ25lZCB4ZmVyX2xlbjoxOTsKKwkvKiogTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLiAqLworCXVuc2lnbmVkIHhmZXJfY291bnQ6MTk7CisJLyoqIFNlbnQgWkxQICovCisJdW5zaWduZWQgc2VudF96bHA6MTsKKwkvKiogVG90YWwgbGVuIGZvciBjb250cm9sIHRyYW5zZmVyICovCisJdW5zaWduZWQgdG90YWxfbGVuOjE5OworCisJLyoqIHN0YWxsIGNsZWFyIGZsYWcgKi8KKwl1bnNpZ25lZCBzdGFsbF9jbGVhcl9mbGFnOjE7CisKKyNpZmRlZiBEV0NfVVRFX0NGSQorCS8qIFRoZSBidWZmZXIgbW9kZSAqLworCWRhdGFfYnVmZmVyX21vZGVfZSBidWZmX21vZGU7CisKKwkvKiBUaGUgY2hhaW4gb2YgRE1BIGRlc2NyaXB0b3JzLgorCSAqIE1BWF9ETUFfREVTQ1NfUEVSX0VQIHdpbGwgYmUgYWxsb2NhdGVkIGZvciBlYWNoIGFjdGl2ZSBFUC4KKwkgKi8KKwlkd2Nfb3RnX2RtYV9kZXNjX3QgKmRlc2NzOworCisJLyogVGhlIERNQSBhZGRyZXNzIG9mIHRoZSBkZXNjcmlwdG9ycyBjaGFpbiBzdGFydCAqLworCWRtYV9hZGRyX3QgZGVzY3NfZG1hX2FkZHI7CisJLyoqIFRoaXMgdmFyaWFibGUgc3RvcmVzIHRoZSBsZW5ndGggb2YgdGhlIGxhc3QgZW5xdWV1ZWQgcmVxdWVzdCAqLworCXVpbnQzMl90IGNmaV9yZXFfbGVuOworI2VuZGlmCQkJCS8vRFdDX1VURV9DRkkKKworLyoqIE1heCBETUEgRGVzY3JpcHRvciBjb3VudCBmb3IgYW55IEVQICovCisjZGVmaW5lIE1BWF9ETUFfREVTQ19DTlQgMjU2CisJLyoqIEFsbG9jYXRlZCBETUEgRGVzYyBjb3VudCAqLworCXVpbnQzMl90IGRlc2NfY250OworCisJLyoqIGJJbnRlcnZhbCAqLworCXVpbnQzMl90IGJJbnRlcnZhbDsKKwkvKiogTmV4dCBmcmFtZSBudW0gdG8gc2V0dXAgbmV4dCBJU09DIHRyYW5zZmVyICovCisJdWludDMyX3QgZnJhbWVfbnVtOworCS8qKiBJbmRpY2F0ZXMgU09GIG51bWJlciBvdmVycnVuIGluIERTVFMgKi8KKwl1aW50OF90IGZybV9vdmVycnVuOworCisjaWZkZWYgRFdDX1VURV9QRVJfSU8KKwkvKiogTmV4dCBmcmFtZSBudW0gZm9yIHdoaWNoIHdpbGwgYmUgc2V0dXAgRE1BIERlc2MgKi8KKwl1aW50MzJfdCB4aXNvX2ZyYW1lX251bTsKKwkvKiogYkludGVydmFsICovCisJdWludDMyX3QgeGlzb19iSW50ZXJ2YWw7CisJLyoqIENvdW50IG9mIGN1cnJlbnRseSBhY3RpdmUgdHJhbnNmZXJzIC0gc2hhbGwgYmUgZWl0aGVyIDAgb3IgMSAqLworCWludCB4aXNvX2FjdGl2ZV94ZmVyczsKKwlpbnQgeGlzb19xdWV1ZWRfeGZlcnM7CisjZW5kaWYKKyNpZmRlZiBEV0NfRU5fSVNPQworCS8qKgorCSAqIFZhcmlhYmxlcyBzcGVjaWZpYyBmb3IgSVNPQyBFUHMKKwkgKgorCSAqLworCS8qKiBETUEgYWRkcmVzc2VzIG9mIElTT0MgYnVmZmVycyAqLworCWR3Y19kbWFfdCBkbWFfYWRkcjA7CisJZHdjX2RtYV90IGRtYV9hZGRyMTsKKworCWR3Y19kbWFfdCBpc29fZG1hX2Rlc2NfYWRkcjsKKwlkd2Nfb3RnX2Rldl9kbWFfZGVzY190ICppc29fZGVzY19hZGRyOworCisJLyoqIHBvaW50ZXIgdG8gdGhlIHRyYW5zZmVyIGJ1ZmZlcnMgKi8KKwl1aW50OF90ICp4ZmVyX2J1ZmYwOworCXVpbnQ4X3QgKnhmZXJfYnVmZjE7CisKKwkvKiogbnVtYmVyIG9mIElTT0MgQnVmZmVyIGlzIHByb2Nlc3NpbmcgKi8KKwl1aW50MzJfdCBwcm9jX2J1Zl9udW07CisJLyoqIEludGVydmFsIG9mIElTT0MgQnVmZmVyIHByb2Nlc3NpbmcgKi8KKwl1aW50MzJfdCBidWZfcHJvY19pbnRydmw7CisJLyoqIERhdGEgc2l6ZSBmb3IgcmVndWxhciBmcmFtZSAqLworCXVpbnQzMl90IGRhdGFfcGVyX2ZyYW1lOworCisJLyogdG9kbyAtIHBhdHRlcm4gZGF0YSBzdXBwb3J0IGlzIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSBmdXR1cmUgKi8KKwkvKiogRGF0YSBzaXplIGZvciBwYXR0ZXJuIGZyYW1lICovCisJdWludDMyX3QgZGF0YV9wYXR0ZXJuX2ZyYW1lOworCS8qKiBGcmFtZSBudW1iZXIgb2YgcGF0dGVybiBkYXRhICovCisJdWludDMyX3Qgc3luY19mcmFtZTsKKworCS8qKiBJU08gUGFja2V0IG51bWJlciBwZXIgZnJhbWUgKi8KKwl1aW50MzJfdCBwa3RfcGVyX2ZybTsKKwkvKiogTmV4dCBmcmFtZSBudW0gZm9yIHdoaWNoIHdpbGwgYmUgc2V0dXAgRE1BIERlc2MgKi8KKwl1aW50MzJfdCBuZXh0X2ZyYW1lOworCS8qKiBOdW1iZXIgb2YgcGFja2V0cyBwZXIgYnVmZmVyIHByb2Nlc3NpbmcgKi8KKwl1aW50MzJfdCBwa3RfY250OworCS8qKiBJbmZvIGZvciBhbGwgaXNvYyBwYWNrZXRzICovCisJaXNvX3BrdF9pbmZvX3QgKnBrdF9pbmZvOworCS8qKiBjdXJyZW50IHBrdCBudW1iZXIgKi8KKwl1aW50MzJfdCBjdXJfcGt0OworCS8qKiBjdXJyZW50IHBrdCBudW1iZXIgKi8KKwl1aW50OF90ICpjdXJfcGt0X2FkZHI7CisJLyoqIGN1cnJlbnQgcGt0IG51bWJlciAqLworCXVpbnQzMl90IGN1cl9wa3RfZG1hX2FkZHI7CisjZW5kaWYJCQkJLyogRFdDX0VOX0lTT0MgKi8KKworLyoqIEB9ICovCit9IGR3Y19lcF90OworCisvKgorICogUmVhc29ucyBmb3IgaGFsdGluZyBhIGhvc3QgY2hhbm5lbC4KKyAqLwordHlwZWRlZiBlbnVtIGR3Y19vdGdfaGFsdF9zdGF0dXMgeworCURXQ19PVEdfSENfWEZFUl9OT19IQUxUX1NUQVRVUywKKwlEV0NfT1RHX0hDX1hGRVJfQ09NUExFVEUsCisJRFdDX09UR19IQ19YRkVSX1VSQl9DT01QTEVURSwKKwlEV0NfT1RHX0hDX1hGRVJfQUNLLAorCURXQ19PVEdfSENfWEZFUl9OQUssCisJRFdDX09UR19IQ19YRkVSX05ZRVQsCisJRFdDX09UR19IQ19YRkVSX1NUQUxMLAorCURXQ19PVEdfSENfWEZFUl9YQUNUX0VSUiwKKwlEV0NfT1RHX0hDX1hGRVJfRlJBTUVfT1ZFUlJVTiwKKwlEV0NfT1RHX0hDX1hGRVJfQkFCQkxFX0VSUiwKKwlEV0NfT1RHX0hDX1hGRVJfREFUQV9UT0dHTEVfRVJSLAorCURXQ19PVEdfSENfWEZFUl9BSEJfRVJSLAorCURXQ19PVEdfSENfWEZFUl9QRVJJT0RJQ19JTkNPTVBMRVRFLAorCURXQ19PVEdfSENfWEZFUl9VUkJfREVRVUVVRQorfSBkd2Nfb3RnX2hhbHRfc3RhdHVzX2U7CisKKy8qKgorICogSG9zdCBjaGFubmVsIGRlc2NyaXB0b3IuIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgc2luZ2xlCisgKiBob3N0IGNoYW5uZWwgd2hlbiBhY3RpbmcgaW4gaG9zdCBtb2RlLiBJdCBjb250YWlucyB0aGUgZGF0YSBpdGVtcyBuZWVkZWQgdG8KKyAqIHRyYW5zZmVyIHBhY2tldHMgdG8gYW4gZW5kcG9pbnQgdmlhIGEgaG9zdCBjaGFubmVsLgorICovCit0eXBlZGVmIHN0cnVjdCBkd2NfaGMgeworCS8qKiBIb3N0IGNoYW5uZWwgbnVtYmVyIHVzZWQgZm9yIHJlZ2lzdGVyIGFkZHJlc3MgbG9va3VwICovCisJdWludDhfdCBoY19udW07CisKKwkvKiogRGV2aWNlIHRvIGFjY2VzcyAqLworCXVuc2lnbmVkIGRldl9hZGRyOjc7CisKKwkvKiogRVAgdG8gYWNjZXNzICovCisJdW5zaWduZWQgZXBfbnVtOjQ7CisKKwkvKiogRVAgZGlyZWN0aW9uLiAwOiBPVVQsIDE6IElOICovCisJdW5zaWduZWQgZXBfaXNfaW46MTsKKworCS8qKgorCSAqIEVQIHNwZWVkLgorCSAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKwkgKgktIERXQ19PVEdfRVBfU1BFRURfTE9XCisJICoJLSBEV0NfT1RHX0VQX1NQRUVEX0ZVTEwKKwkgKgktIERXQ19PVEdfRVBfU1BFRURfSElHSAorCSAqLworCXVuc2lnbmVkIHNwZWVkOjI7CisjZGVmaW5lIERXQ19PVEdfRVBfU1BFRURfTE9XCTAKKyNkZWZpbmUgRFdDX09UR19FUF9TUEVFRF9GVUxMCTEKKyNkZWZpbmUgRFdDX09UR19FUF9TUEVFRF9ISUdICTIKKworCS8qKgorCSAqIEVuZHBvaW50IHR5cGUuCisJICogT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCSAqCS0gRFdDX09UR19FUF9UWVBFX0NPTlRST0w6IDAKKwkgKgktIERXQ19PVEdfRVBfVFlQRV9JU09DOiAxCisJICoJLSBEV0NfT1RHX0VQX1RZUEVfQlVMSzogMgorCSAqCS0gRFdDX09UR19FUF9UWVBFX0lOVFI6IDMKKwkgKi8KKwl1bnNpZ25lZCBlcF90eXBlOjI7CisKKwkvKiogTWF4IHBhY2tldCBzaXplIGluIGJ5dGVzICovCisJdW5zaWduZWQgbWF4X3BhY2tldDoxMTsKKworCS8qKgorCSAqIFBJRCBmb3IgaW5pdGlhbCB0cmFuc2FjdGlvbi4KKwkgKiAwOiBEQVRBMCw8YnI+CisJICogMTogREFUQTIsPGJyPgorCSAqIDI6IERBVEExLDxicj4KKwkgKiAzOiBNREFUQSAobm9uLUNvbnRyb2wgRVApLAorCSAqCSAgU0VUVVAgKENvbnRyb2wgRVApCisJICovCisJdW5zaWduZWQgZGF0YV9waWRfc3RhcnQ6MjsKKyNkZWZpbmUgRFdDX09UR19IQ19QSURfREFUQTAgMAorI2RlZmluZSBEV0NfT1RHX0hDX1BJRF9EQVRBMiAxCisjZGVmaW5lIERXQ19PVEdfSENfUElEX0RBVEExIDIKKyNkZWZpbmUgRFdDX09UR19IQ19QSURfTURBVEEgMworI2RlZmluZSBEV0NfT1RHX0hDX1BJRF9TRVRVUCAzCisKKwkvKiogTnVtYmVyIG9mIHBlcmlvZGljIHRyYW5zYWN0aW9ucyBwZXIgKG1pY3JvKWZyYW1lICovCisJdW5zaWduZWQgbXVsdGlfY291bnQ6MjsKKworCS8qKiBAbmFtZSBUcmFuc2ZlciBTdGF0ZSAqLworCS8qKiBAeyAqLworCisJLyoqIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdHJhbnNmZXIgYnVmZmVyIHBvc2l0aW9uLiAqLworCXVpbnQ4X3QgKnhmZXJfYnVmZjsKKwkvKioKKwkgKiBJbiBCdWZmZXIgRE1BIG1vZGUgdGhpcyBidWZmZXIgd2lsbCBiZSB1c2VkCisJICogaWYgeGZlcl9idWZmIGlzIG5vdCBEV09SRCBhbGlnbmVkLgorCSAqLworCWR3Y19kbWFfdCBhbGlnbl9idWZmOworCS8qKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuICovCisJdWludDMyX3QgeGZlcl9sZW47CisJLyoqIE51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCBzbyBmYXIuICovCisJdWludDMyX3QgeGZlcl9jb3VudDsKKwkvKiogUGFja2V0IGNvdW50IGF0IHN0YXJ0IG9mIHRyYW5zZmVyLiovCisJdWludDE2X3Qgc3RhcnRfcGt0X2NvdW50OworCisJLyoqCisJICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0cmFuc2ZlciBoYXMgYmVlbiBzdGFydGVkLiBTZXQgdG8gMSBpZgorCSAqIGl0IGhhcyBiZWVuIHN0YXJ0ZWQsIDAgb3RoZXJ3aXNlLgorCSAqLworCXVpbnQ4X3QgeGZlcl9zdGFydGVkOworCisJLyoqCisJICogU2V0IHRvIDEgdG8gaW5kaWNhdGUgdGhhdCBhIFBJTkcgcmVxdWVzdCBzaG91bGQgYmUgaXNzdWVkIG9uIHRoaXMKKwkgKiBjaGFubmVsLiBJZiAwLCBwcm9jZXNzIG5vcm1hbGx5LgorCSAqLworCXVpbnQ4X3QgZG9fcGluZzsKKworCS8qKgorCSAqIFNldCB0byAxIHRvIGluZGljYXRlIHRoYXQgdGhlIGVycm9yIGNvdW50IGZvciB0aGlzIHRyYW5zYWN0aW9uIGlzCisJICogbm9uLXplcm8uIFNldCB0byAwIGlmIHRoZSBlcnJvciBjb3VudCBpcyAwLgorCSAqLworCXVpbnQ4X3QgZXJyb3Jfc3RhdGU7CisKKwkvKioKKwkgKiBTZXQgdG8gMSB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgY2hhbm5lbCBzaG91bGQgYmUgaGFsdGVkIHRoZSBuZXh0CisJICogdGltZSBhIHJlcXVlc3QgaXMgcXVldWVkIGZvciB0aGUgY2hhbm5lbC4gVGhpcyBpcyBuZWNlc3NhcnkgaW4KKwkgKiBzbGF2ZSBtb2RlIGlmIG5vIHJlcXVlc3QgcXVldWUgc3BhY2UgaXMgYXZhaWxhYmxlIHdoZW4gYW4gYXR0ZW1wdAorCSAqIGlzIG1hZGUgdG8gaGFsdCB0aGUgY2hhbm5lbC4KKwkgKi8KKwl1aW50OF90IGhhbHRfb25fcXVldWU7CisKKwkvKioKKwkgKiBTZXQgdG8gMSBpZiB0aGUgaG9zdCBjaGFubmVsIGhhcyBiZWVuIGhhbHRlZCwgYnV0IHRoZSBjb3JlIGlzIG5vdAorCSAqIGZpbmlzaGVkIGZsdXNoaW5nIHF1ZXVlZCByZXF1ZXN0cy4gT3RoZXJ3aXNlIDAuCisJICovCisJdWludDhfdCBoYWx0X3BlbmRpbmc7CisKKwkvKioKKwkgKiBSZWFzb24gZm9yIGhhbHRpbmcgdGhlIGhvc3QgY2hhbm5lbC4KKwkgKi8KKwlkd2Nfb3RnX2hhbHRfc3RhdHVzX2UgaGFsdF9zdGF0dXM7CisKKwkvKgorCSAqIFNwbGl0IHNldHRpbmdzIGZvciB0aGUgaG9zdCBjaGFubmVsCisJICovCisJdWludDhfdCBkb19zcGxpdDsJCSAgIC8qKjwgRW5hYmxlIHNwbGl0IGZvciB0aGUgY2hhbm5lbCAqLworCXVpbnQ4X3QgY29tcGxldGVfc3BsaXQ7CSAgIC8qKjwgRW5hYmxlIGNvbXBsZXRlIHNwbGl0ICovCisJdWludDhfdCBodWJfYWRkcjsJCSAgIC8qKjwgQWRkcmVzcyBvZiBoaWdoIHNwZWVkIGh1YiAqLworCisJdWludDhfdCBwb3J0X2FkZHI7CQkgICAvKio8IFBvcnQgb2YgdGhlIGxvdy9mdWxsIHNwZWVkIGRldmljZSAqLworCS8qKiBTcGxpdCB0cmFuc2FjdGlvbiBwb3NpdGlvbgorCSAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKwkgKgkgIC0gRFdDX0hDU1BMSVRfWEFDVFBPU19NSUQKKwkgKgkgIC0gRFdDX0hDU1BMSVRfWEFDVFBPU19CRUdJTgorCSAqCSAgLSBEV0NfSENTUExJVF9YQUNUUE9TX0VORAorCSAqCSAgLSBEV0NfSENTUExJVF9YQUNUUE9TX0FMTCAqLworCXVpbnQ4X3QgeGFjdF9wb3M7CisKKwkvKiogU2V0IHdoZW4gdGhlIGhvc3QgY2hhbm5lbCBkb2VzIGEgc2hvcnQgcmVhZC4gKi8KKwl1aW50OF90IHNob3J0X3JlYWQ7CisKKwkvKioKKwkgKiBOdW1iZXIgb2YgcmVxdWVzdHMgaXNzdWVkIGZvciB0aGlzIGNoYW5uZWwgc2luY2UgaXQgd2FzIGFzc2lnbmVkIHRvCisJICogdGhlIGN1cnJlbnQgdHJhbnNmZXIgKG5vdCBjb3VudGluZyBQSU5HcykuCisJICovCisJdWludDhfdCByZXF1ZXN0czsKKworCS8qKgorCSAqIFF1ZXVlIEhlYWQgZm9yIHRoZSB0cmFuc2ZlciBiZWluZyBwcm9jZXNzZWQgYnkgdGhpcyBjaGFubmVsLgorCSAqLworCXN0cnVjdCBkd2Nfb3RnX3FoICpxaDsKKworCS8qKiBAfSAqLworCisJLyoqIEVudHJ5IGluIGxpc3Qgb2YgaG9zdCBjaGFubmVscy4gKi8KKwkgRFdDX0NJUkNMRVFfRU5UUlkoZHdjX2hjKSBoY19saXN0X2VudHJ5OworCisJLyoqIEBuYW1lIERlc2NyaXB0b3IgRE1BIHN1cHBvcnQgKi8KKwkvKiogQHsgKi8KKworCS8qKiBOdW1iZXIgb2YgVHJhbnNmZXIgRGVzY3JpcHRvcnMgKi8KKwl1aW50MTZfdCBudGQ7CisKKwkvKiogRGVzY3JpcHRvciBMaXN0IERNQSBhZGRyZXNzICovCisJZHdjX2RtYV90IGRlc2NfbGlzdF9hZGRyOworCisJLyoqIFNjaGVkdWxpbmcgbWljcm8tZnJhbWUgYml0bWFwLiAqLworCXVpbnQ4X3Qgc2NoaW5mbzsKKworCS8qKiBAfSAqLworfSBkd2NfaGNfdDsKKworLyoqCisgKiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgbWF5IGJlIHNwZWNpZmllZCB3aGVuIHN0YXJ0aW5nIHRoZSBtb2R1bGUuIFRoZXNlCisgKiBwYXJhbWV0ZXJzIGRlZmluZSBob3cgdGhlIERXQ19vdGcgY29udHJvbGxlciBzaG91bGQgYmUgY29uZmlndXJlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHdjX290Z19jb3JlX3BhcmFtcyB7CisJaW50MzJfdCBvcHQ7CisKKwkvKioKKwkgKiBTcGVjaWZpZXMgdGhlIE9URyBjYXBhYmlsaXRpZXMuIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5CisJICogZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcyBzcGVjaWZpZWQuCisJICogMCAtIEhOUCBhbmQgU1JQIGNhcGFibGUgKGRlZmF1bHQpCisJICogMSAtIFNSUCBPbmx5IGNhcGFibGUKKwkgKiAyIC0gTm8gSE5QL1NSUCBjYXBhYmxlCisJICovCisJaW50MzJfdCBvdGdfY2FwOworCisJLyoqCisJICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHNsYXZlIG9yIERNQSBtb2RlIGZvciBhY2Nlc3NpbmcgdGhlIGRhdGEKKwkgKiBGSUZPcy4gVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcworCSAqIHBhcmFtZXRlciBpZiBub25lIGlzIHNwZWNpZmllZC4KKwkgKiAwIC0gU2xhdmUKKwkgKiAxIC0gRE1BIChkZWZhdWx0LCBpZiBhdmFpbGFibGUpCisJICovCisJaW50MzJfdCBkbWFfZW5hYmxlOworCisJLyoqCisJICogV2hlbiBETUEgbW9kZSBpcyBlbmFibGVkIHNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBhZGRyZXNzIERNQSBvciBETUEKKwkgKiBEZXNjcmlwdG9yIG1vZGUgZm9yIGFjY2Vzc2luZyB0aGUgZGF0YSBGSUZPcyBpbiBkZXZpY2UgbW9kZS4gVGhlIGRyaXZlcgorCSAqIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIGlmIG5vbmUgaXMgc3BlY2lmaWVkLgorCSAqIDAgLSBhZGRyZXNzIERNQQorCSAqIDEgLSBETUEgRGVzY3JpcHRvcihkZWZhdWx0LCBpZiBhdmFpbGFibGUpCisJICovCisJaW50MzJfdCBkbWFfZGVzY19lbmFibGU7CisJLyoqIFRoZSBETUEgQnVyc3Qgc2l6ZSAoYXBwbGljYWJsZSBvbmx5IGZvciBFeHRlcm5hbCBETUEKKwkgKiBNb2RlKS4gMSwgNCwgOCAxNiwgMzIsIDY0LCAxMjgsIDI1NiAoZGVmYXVsdCAzMikKKwkgKi8KKwlpbnQzMl90IGRtYV9idXJzdF9zaXplOwkvKiBUcmFuc2xhdGUgdGhpcyB0byBHQUhCQ0ZHIHZhbHVlcyAqLworCisJLyoqCisJICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNwZWVkIG9mIG9wZXJhdGlvbiBpbiBob3N0IGFuZCBkZXZpY2UgbW9kZS4KKwkgKiBUaGUgYWN0dWFsIHNwZWVkIGRlcGVuZHMgb24gdGhlIHNwZWVkIG9mIHRoZSBhdHRhY2hlZCBkZXZpY2UgYW5kCisJICogdGhlIHZhbHVlIG9mIHBoeV90eXBlLiBUaGUgYWN0dWFsIHNwZWVkIGRlcGVuZHMgb24gdGhlIHNwZWVkIG9mIHRoZQorCSAqIGF0dGFjaGVkIGRldmljZS4KKwkgKiAwIC0gSGlnaCBTcGVlZCAoZGVmYXVsdCkKKwkgKiAxIC0gRnVsbCBTcGVlZAorCSAqLworCWludDMyX3Qgc3BlZWQ7CisJLyoqIFNwZWNpZmllcyB3aGV0aGVyIGxvdyBwb3dlciBtb2RlIGlzIHN1cHBvcnRlZCB3aGVuIGF0dGFjaGVkCisJICoJdG8gYSBGdWxsIFNwZWVkIG9yIExvdyBTcGVlZCBkZXZpY2UgaW4gaG9zdCBtb2RlLgorCSAqIDAgLSBEb24ndCBzdXBwb3J0IGxvdyBwb3dlciBtb2RlIChkZWZhdWx0KQorCSAqIDEgLSBTdXBwb3J0IGxvdyBwb3dlciBtb2RlCisJICovCisJaW50MzJfdCBob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyOworCisJLyoqIFNwZWNpZmllcyB0aGUgUEhZIGNsb2NrIHJhdGUgaW4gbG93IHBvd2VyIG1vZGUgd2hlbiBjb25uZWN0ZWQgdG8gYQorCSAqIExvdyBTcGVlZCBkZXZpY2UgaW4gaG9zdCBtb2RlLiBUaGlzIHBhcmFtZXRlciBpcyBhcHBsaWNhYmxlIG9ubHkgaWYKKwkgKiBIT1NUX1NVUFBPUlRfRlNfTFNfTE9XX1BPV0VSIGlzIGVuYWJsZWQuIElmIFBIWV9UWVBFIGlzIHNldCB0byBGUworCSAqIHRoZW4gZGVmYXVsdHMgdG8gNiBNSFogb3RoZXJ3aXNlIDQ4IE1IWi4KKwkgKgorCSAqIDAgLSA0OCBNSHoKKwkgKiAxIC0gNiBNSHoKKwkgKi8KKwlpbnQzMl90IGhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGs7CisKKwkvKioKKwkgKiAwIC0gVXNlIGNDIEZJRk8gc2l6ZSBwYXJhbWV0ZXJzCisJICogMSAtIEFsbG93IGR5bmFtaWMgRklGTyBzaXppbmcgKGRlZmF1bHQpCisJICovCisJaW50MzJfdCBlbmFibGVfZHluYW1pY19maWZvOworCisJLyoqIFRvdGFsIG51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIGRhdGEgRklGTyBtZW1vcnkuIFRoaXMKKwkgKiBtZW1vcnkgaW5jbHVkZXMgdGhlIFJ4IEZJRk8sIG5vbi1wZXJpb2RpYyBUeCBGSUZPLCBhbmQgcGVyaW9kaWMKKwkgKiBUeCBGSUZPcy4KKwkgKiAzMiB0byAzMjc2OCAoZGVmYXVsdCA4MTkyKQorCSAqIE5vdGU6IFRoZSB0b3RhbCBGSUZPIG1lbW9yeSBkZXB0aCBpbiB0aGUgRlBHQSBjb25maWd1cmF0aW9uIGlzIDgxOTIuCisJICovCisJaW50MzJfdCBkYXRhX2ZpZm9fc2l6ZTsKKworCS8qKiBOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBSeCBGSUZPIGluIGRldmljZSBtb2RlIHdoZW4gZHluYW1pYworCSAqIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQuCisJICogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTA2NCkKKwkgKi8KKwlpbnQzMl90IGRldl9yeF9maWZvX3NpemU7CisKKwkvKiogTnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiB0aGUgbm9uLXBlcmlvZGljIFR4IEZJRk8gaW4gZGV2aWNlIG1vZGUKKwkgKiB3aGVuIGR5bmFtaWMgRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KKwkgKiAxNiB0byAzMjc2OCAoZGVmYXVsdCAxMDI0KQorCSAqLworCWludDMyX3QgZGV2X25wZXJpb190eF9maWZvX3NpemU7CisKKwkvKiogTnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiBlYWNoIG9mIHRoZSBwZXJpb2RpYyBUeCBGSUZPcyBpbiBkZXZpY2UKKwkgKiBtb2RlIHdoZW4gZHluYW1pYyBGSUZPIHNpemluZyBpcyBlbmFibGVkLgorCSAqIDQgdG8gNzY4IChkZWZhdWx0IDI1NikKKwkgKi8KKwl1aW50MzJfdCBkZXZfcGVyaW9fdHhfZmlmb19zaXplW01BWF9QRVJJT19GSUZPU107CisKKwkvKiogTnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiB0aGUgUnggRklGTyBpbiBob3N0IG1vZGUgd2hlbiBkeW5hbWljCisJICogRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KKwkgKiAxNiB0byAzMjc2OCAoZGVmYXVsdCAxMDI0KQorCSAqLworCWludDMyX3QgaG9zdF9yeF9maWZvX3NpemU7CisKKwkvKiogTnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiB0aGUgbm9uLXBlcmlvZGljIFR4IEZJRk8gaW4gaG9zdCBtb2RlCisJICogd2hlbiBEeW5hbWljIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQgaW4gdGhlIGNvcmUuCisJICogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTAyNCkKKwkgKi8KKwlpbnQzMl90IGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKKworCS8qKiBOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBob3N0IHBlcmlvZGljIFR4IEZJRk8gd2hlbiBkeW5hbWljCisJICogRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KKwkgKiAxNiB0byAzMjc2OCAoZGVmYXVsdCAxMDI0KQorCSAqLworCWludDMyX3QgaG9zdF9wZXJpb190eF9maWZvX3NpemU7CisKKwkvKiogVGhlIG1heGltdW0gdHJhbnNmZXIgc2l6ZSBzdXBwb3J0ZWQgaW4gYnl0ZXMuCisJICogMjA0NyB0byA2NSw1MzUgIChkZWZhdWx0IDY1LDUzNSkKKwkgKi8KKwlpbnQzMl90IG1heF90cmFuc2Zlcl9zaXplOworCisJLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIGluIGEgdHJhbnNmZXIuCisJICogMTUgdG8gNTExICAoZGVmYXVsdCA1MTEpCisJICovCisJaW50MzJfdCBtYXhfcGFja2V0X2NvdW50OworCisJLyoqIFRoZSBudW1iZXIgb2YgaG9zdCBjaGFubmVsIHJlZ2lzdGVycyB0byB1c2UuCisJICogMSB0byAxNiAoZGVmYXVsdCAxMikKKwkgKiBOb3RlOiBUaGUgRlBHQSBjb25maWd1cmF0aW9uIHN1cHBvcnRzIGEgbWF4aW11bSBvZiAxMiBob3N0IGNoYW5uZWxzLgorCSAqLworCWludDMyX3QgaG9zdF9jaGFubmVsczsKKworCS8qKiBUaGUgbnVtYmVyIG9mIGVuZHBvaW50cyBpbiBhZGRpdGlvbiB0byBFUDAgYXZhaWxhYmxlIGZvciBkZXZpY2UKKwkgKiBtb2RlIG9wZXJhdGlvbnMuCisJICogMSB0byAxNSAoZGVmYXVsdCA2IElOIGFuZCBPVVQpCisJICogTm90ZTogVGhlIEZQR0EgY29uZmlndXJhdGlvbiBzdXBwb3J0cyBhIG1heGltdW0gb2YgNiBJTiBhbmQgT1VUCisJICogZW5kcG9pbnRzIGluIGFkZGl0aW9uIHRvIEVQMC4KKwkgKi8KKwlpbnQzMl90IGRldl9lbmRwb2ludHM7CisKKwkJLyoqCisJCSAqIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBQSFkgaW50ZXJmYWNlIHRvIHVzZS4gQnkgZGVmYXVsdCwgdGhlIGRyaXZlcgorCQkgKiB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSBwaHlfdHlwZS4KKwkJICoKKwkJICogMCAtIEZ1bGwgU3BlZWQgUEhZCisJCSAqIDEgLSBVVE1JKyAoZGVmYXVsdCkKKwkJICogMiAtIFVMUEkKKwkJICovCisJaW50MzJfdCBwaHlfdHlwZTsKKworCS8qKgorCSAqIFNwZWNpZmllcyB0aGUgVVRNSSsgRGF0YSBXaWR0aC4gVGhpcyBwYXJhbWV0ZXIgaXMKKwkgKiBhcHBsaWNhYmxlIGZvciBhIFBIWV9UWVBFIG9mIFVUTUkrIG9yIFVMUEkuIChGb3IgYSBVTFBJCisJICogUEhZX1RZUEUsIHRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgZGF0YSB3aWR0aCBiZXR3ZWVuCisJICogdGhlIE1BQyBhbmQgdGhlIFVMUEkgV3JhcHBlci4pIEFsc28sIHRoaXMgcGFyYW1ldGVyIGlzCisJICogYXBwbGljYWJsZSBvbmx5IGlmIHRoZSBPVEdfSFNQSFlfV0lEVEggY0MgcGFyYW1ldGVyIHdhcyBzZXQKKwkgKiB0byAiOCBhbmQgMTYgYml0cyIsIG1lYW5pbmcgdGhhdCB0aGUgY29yZSBoYXMgYmVlbgorCSAqIGNvbmZpZ3VyZWQgdG8gd29yayBhdCBlaXRoZXIgZGF0YSBwYXRoIHdpZHRoLgorCSAqCisJICogOCBvciAxNiBiaXRzIChkZWZhdWx0IDE2KQorCSAqLworCWludDMyX3QgcGh5X3V0bWlfd2lkdGg7CisKKwkvKioKKwkgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgVUxQSSBvcGVyYXRlcyBhdCBkb3VibGUgb3Igc2luZ2xlCisJICogZGF0YSByYXRlLiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IGFwcGxpY2FibGUgaWYgUEhZX1RZUEUgaXMKKwkgKiBVTFBJLgorCSAqCisJICogMCAtIHNpbmdsZSBkYXRhIHJhdGUgVUxQSSBpbnRlcmZhY2Ugd2l0aCA4IGJpdCB3aWRlIGRhdGEKKwkgKiBidXMgKGRlZmF1bHQpCisJICogMSAtIGRvdWJsZSBkYXRhIHJhdGUgVUxQSSBpbnRlcmZhY2Ugd2l0aCA0IGJpdCB3aWRlIGRhdGEKKwkgKiBidXMKKwkgKi8KKwlpbnQzMl90IHBoeV91bHBpX2RkcjsKKworCS8qKgorCSAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSB0aGUgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgc3VwcGx5IHRvCisJICogZHJpdmUgdGhlIHZidXMgd2l0aCBhIFVMUEkgcGh5LgorCSAqLworCWludDMyX3QgcGh5X3VscGlfZXh0X3ZidXM7CisKKwkvKioKKwkgKiBTcGVjaWZpZXMgd2hldGhlciB0byB1c2UgdGhlIEkyQ2ludGVyZmFjZSBmb3IgZnVsbCBzcGVlZCBQSFkuIFRoaXMKKwkgKiBwYXJhbWV0ZXIgaXMgb25seSBhcHBsaWNhYmxlIGlmIFBIWV9UWVBFIGlzIEZTLgorCSAqIDAgLSBObyAoZGVmYXVsdCkKKwkgKiAxIC0gWWVzCisJICovCisJaW50MzJfdCBpMmNfZW5hYmxlOworCisJaW50MzJfdCB1bHBpX2ZzX2xzOworCisJaW50MzJfdCB0c19kbGluZTsKKworCS8qKgorCSAqIFNwZWNpZmllcyB3aGV0aGVyIGRlZGljYXRlZCB0cmFuc21pdCBGSUZPcyBhcmUKKwkgKiBlbmFibGVkIGZvciBub24gcGVyaW9kaWMgSU4gZW5kcG9pbnRzIGluIGRldmljZSBtb2RlCisJICogMCAtIE5vCisJICogMSAtIFllcworCSAqLworCWludDMyX3QgZW5fbXVsdGlwbGVfdHhfZmlmbzsKKworCS8qKiBOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIGVhY2ggb2YgdGhlIFR4IEZJRk9zIGluIGRldmljZQorCSAqIG1vZGUgd2hlbiBkeW5hbWljIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQuCisJICogNCB0byA3NjggKGRlZmF1bHQgMjU2KQorCSAqLworCXVpbnQzMl90IGRldl90eF9maWZvX3NpemVbTUFYX1RYX0ZJRk9TXTsKKworCS8qKiBUaHJlc2hvbGRpbmcgZW5hYmxlIGZsYWctCisJICogYml0IDAgLSBlbmFibGUgbm9uLUlTTyBUeCB0aHJlc2hvbGRpbmcKKwkgKiBiaXQgMSAtIGVuYWJsZSBJU08gVHggdGhyZXNob2xkaW5nCisJICogYml0IDIgLSBlbmFibGUgUnggdGhyZXNob2xkaW5nCisJICovCisJdWludDMyX3QgdGhyX2N0bDsKKworCS8qKiBUaHJlc2hvbGRpbmcgbGVuZ3RoIGZvciBUeAorCSAqCUZJRk9zIGluIDMyIGJpdCBEV09SRHMKKwkgKi8KKwl1aW50MzJfdCB0eF90aHJfbGVuZ3RoOworCisJLyoqIFRocmVzaG9sZGluZyBsZW5ndGggZm9yIFJ4CisJICoJRklGT3MgaW4gMzIgYml0IERXT1JEcworCSAqLworCXVpbnQzMl90IHJ4X3Rocl9sZW5ndGg7CisKKwkvKioKKwkgKiBTcGVjaWZpZXMgd2hldGhlciBMUE0gKExpbmsgUG93ZXIgTWFuYWdlbWVudCkgc3VwcG9ydCBpcyBlbmFibGVkCisJICovCisJaW50MzJfdCBscG1fZW5hYmxlOworCisJLyoqIFBlciBUcmFuc2ZlciBJbnRlcnJ1cHQKKwkgKgltb2RlIGVuYWJsZSBmbGFnCisJICogMSAtIEVuYWJsZWQKKwkgKiAwIC0gRGlzYWJsZWQKKwkgKi8KKwlpbnQzMl90IHB0aV9lbmFibGU7CisKKwkvKiogTXVsdGkgUHJvY2Vzc29yIEludGVycnVwdAorCSAqCW1vZGUgZW5hYmxlIGZsYWcKKwkgKiAxIC0gRW5hYmxlZAorCSAqIDAgLSBEaXNhYmxlZAorCSAqLworCWludDMyX3QgbXBpX2VuYWJsZTsKKworCS8qKiBJU19VU0IgQ2FwYWJpbGl0eQorCSAqIDEgLSBFbmFibGVkCisJICogMCAtIERpc2FibGVkCisJICovCisJaW50MzJfdCBpY191c2JfY2FwOworCisJLyoqIEFIQiBUaHJlc2hvbGQgUmF0aW8KKwkgKiAyJ2IwMCBBSEIgVGhyZXNob2xkID0gCU1BQyBUaHJlc2hvbGQKKwkgKiAyJ2IwMSBBSEIgVGhyZXNob2xkID0gMS8yIAlNQUMgVGhyZXNob2xkCisJICogMidiMTAgQUhCIFRocmVzaG9sZCA9IDEvNAlNQUMgVGhyZXNob2xkCisJICogMidiMTEgQUhCIFRocmVzaG9sZCA9IDEvOAlNQUMgVGhyZXNob2xkCisJICovCisJaW50MzJfdCBhaGJfdGhyX3JhdGlvOworCisJLyoqIEFEUCBTdXBwb3J0CisJICogMSAtIEVuYWJsZWQKKwkgKiAwIC0gRGlzYWJsZWQKKwkgKi8KKwlpbnQzMl90IGFkcF9zdXBwX2VuYWJsZTsKKworCS8qKiBIRklSIFJlbG9hZCBDb250cm9sCisJICogMCAtIFRoZSBIRklSIGNhbm5vdCBiZSByZWxvYWRlZCBkeW5hbWljYWxseS4KKwkgKiAxIC0gQWxsb3cgZHluYW1pYyByZWxvYWRpbmcgb2YgdGhlIEhGSVIgcmVnaXN0ZXIgZHVyaW5nIHJ1bnRpbWUuCisJICovCisJaW50MzJfdCByZWxvYWRfY3RsOworCisJLyoqIERDRkc6IEVuYWJsZSBkZXZpY2UgT3V0IE5BSworCSAqIDAgLSBUaGUgY29yZSBkb2VzIG5vdCBzZXQgTkFLIGFmdGVyIEJ1bGsgT3V0IHRyYW5zZmVyIGNvbXBsZXRlLgorCSAqIDEgLSBUaGUgY29yZSBzZXRzIE5BSyBhZnRlciBCdWxrIE9VVCB0cmFuc2ZlciBjb21wbGV0ZS4KKwkgKi8KKwlpbnQzMl90IGRldl9vdXRfbmFrOworCisJLyoqIERDRkc6IEVuYWJsZSBDb250aW51ZSBvbiBCTkEKKwkgKiBBZnRlciByZWNlaXZpbmcgQk5BIGludGVycnVwdCB0aGUgY29yZSBkaXNhYmxlcyB0aGUgZW5kcG9pbnQsd2hlbiB0aGUKKwkgKiBlbmRwb2ludCBpcyByZS1lbmFibGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0aGUgY29yZSBzdGFydHMgcHJvY2Vzc2luZworCSAqIDAgLSBmcm9tIHRoZSBET0VQRE1BIGRlc2NyaXB0b3IKKwkgKiAxIC0gZnJvbSB0aGUgZGVzY3JpcHRvciB3aGljaCByZWNlaXZlZCB0aGUgQk5BLgorCSAqLworCWludDMyX3QgY29udF9vbl9ibmE7CisKKwkvKiogR0FIQkNGRzogQUhCIFNpbmdsZSBTdXBwb3J0CisJICogVGhpcyBiaXQgd2hlbiBwcm9ncmFtbWVkIHN1cHBvcnRzIFNJTkdMRSB0cmFuc2ZlcnMgZm9yIHJlbWFpbmRlcgorCSAqIGRhdGEgaW4gYSB0cmFuc2ZlciBmb3IgRE1BIG1vZGUgb2Ygb3BlcmF0aW9uLgorCSAqIDAgLSBpbiB0aGlzIGNhc2UgdGhlIHJlbWFpbmRlciBkYXRhIHdpbGwgYmUgc2VudCB1c2luZyBJTkNSIGJ1cnN0IHNpemUuCisJICogMSAtIGluIHRoaXMgY2FzZSB0aGUgcmVtYWluZGVyIGRhdGEgd2lsbCBiZSBzZW50IHVzaW5nIFNJTkdMRSBidXJzdCBzaXplLgorCSAqLworCWludDMyX3QgYWhiX3NpbmdsZTsKKworCS8qKiBDb3JlIFBvd2VyIGRvd24gbW9kZQorCSAqIDAgLSBObyBQb3dlciBEb3duIGlzIGVuYWJsZWQKKwkgKiAxIC0gUmVzZXJ2ZWQKKwkgKiAyIC0gQ29tcGxldGUgUG93ZXIgRG93biAoSGliZXJuYXRpb24pCisJICovCisJaW50MzJfdCBwb3dlcl9kb3duOworCisJLyoqIE9URyByZXZpc2lvbiBzdXBwb3J0ZWQKKwkgKiAwIC0gT1RHIDEuMyByZXZpc2lvbgorCSAqIDEgLSBPVEcgMi4wIHJldmlzaW9uCisJICovCisJaW50MzJfdCBvdGdfdmVyOworCit9IGR3Y19vdGdfY29yZV9wYXJhbXNfdDsKKworI2lmZGVmIERFQlVHCitzdHJ1Y3QgZHdjX290Z19jb3JlX2lmOwordHlwZWRlZiBzdHJ1Y3QgaGNfeGZlcl9pbmZvIHsKKwlzdHJ1Y3QgZHdjX290Z19jb3JlX2lmICpjb3JlX2lmOworCWR3Y19oY190ICpoYzsKK30gaGNfeGZlcl9pbmZvX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgZXBfeGZlcl9pbmZvIHsKKwlzdHJ1Y3QgZHdjX290Z19jb3JlX2lmICpjb3JlX2lmOworCWR3Y19lcF90ICplcDsKKwl1aW50OF90IHN0YXRlOworfSBlcF94ZmVyX2luZm9fdDsKKy8qCisgKiBEZXZpY2UgU3RhdGVzCisgKi8KK3R5cGVkZWYgZW51bSBkd2Nfb3RnX2x4X3N0YXRlIHsKKwkvKiogT24gc3RhdGUgKi8KKwlEV0NfT1RHX0wwLAorCS8qKiBMUE0gc2xlZXAgc3RhdGUqLworCURXQ19PVEdfTDEsCisJLyoqIFVTQiBzdXNwZW5kIHN0YXRlKi8KKwlEV0NfT1RHX0wyLAorCS8qKiBPZmYgc3RhdGUqLworCURXQ19PVEdfTDMKK30gZHdjX290Z19seF9zdGF0ZV9lOworCitzdHJ1Y3QgZHdjX290Z19nbG9iYWxfcmVnc19iYWNrdXAgeworCXVpbnQzMl90IGdvdGdjdGxfbG9jYWw7CisJdWludDMyX3QgZ2ludG1za19sb2NhbDsKKwl1aW50MzJfdCBnYWhiY2ZnX2xvY2FsOworCXVpbnQzMl90IGd1c2JjZmdfbG9jYWw7CisJdWludDMyX3QgZ3J4ZnNpel9sb2NhbDsKKwl1aW50MzJfdCBnbnB0eGZzaXpfbG9jYWw7CisjaWZkZWYgQ09ORklHX1VTQl9EV0NfT1RHX0xQTQorCXVpbnQzMl90IGdscG1jZmdfbG9jYWw7CisjZW5kaWYKKwl1aW50MzJfdCBnaTJjY3RsX2xvY2FsOworCXVpbnQzMl90IGhwdHhmc2l6X2xvY2FsOworCXVpbnQzMl90IHBjZ2NjdGxfbG9jYWw7CisJdWludDMyX3QgZ2RmaWZvY2ZnX2xvY2FsOworCXVpbnQzMl90IGR0eGZzaXpfbG9jYWxbTUFYX0VQU19DSEFOTkVMU107CisJdWludDMyX3QgZ3B3cmRuX2xvY2FsOworfTsKKworc3RydWN0IGR3Y19vdGdfaG9zdF9yZWdzX2JhY2t1cCB7CisJdWludDMyX3QgaGNmZ19sb2NhbDsKKwl1aW50MzJfdCBoYWludG1za19sb2NhbDsKKwl1aW50MzJfdCBoY2ludG1za19sb2NhbFtNQVhfRVBTX0NIQU5ORUxTXTsKKwl1aW50MzJfdCBocHJ0MF9sb2NhbDsKKwl1aW50MzJfdCBoZmlyX2xvY2FsOworfTsKKworc3RydWN0IGR3Y19vdGdfZGV2X3JlZ3NfYmFja3VwIHsKKwl1aW50MzJfdCBkY2ZnOworCXVpbnQzMl90IGRjdGw7CisJdWludDMyX3QgZGFpbnRtc2s7CisJdWludDMyX3QgZGllcG1zazsKKwl1aW50MzJfdCBkb2VwbXNrOworCXVpbnQzMl90IGRpZXBjdGxbTUFYX0VQU19DSEFOTkVMU107CisJdWludDMyX3QgZGllcHRzaXpbTUFYX0VQU19DSEFOTkVMU107CisJdWludDMyX3QgZGllcGRtYVtNQVhfRVBTX0NIQU5ORUxTXTsKK307CisvKioKKyAqIFRoZSA8Y29kZT5kd2Nfb3RnX2NvcmVfaWY8L2NvZGU+IHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gbWFuYWdlCisgKiB0aGUgRFdDX290ZyBjb250cm9sbGVyIGFjdGluZyBpbiBlaXRoZXIgaG9zdCBvciBkZXZpY2UgbW9kZS4gSXQKKyAqIHJlcHJlc2VudHMgdGhlIHByb2dyYW1taW5nIHZpZXcgb2YgdGhlIGNvbnRyb2xsZXIgYXMgYSB3aG9sZS4KKyAqLworc3RydWN0IGR3Y19vdGdfY29yZV9pZiB7CisJLyoqIFBhcmFtZXRlcnMgdGhhdCBkZWZpbmUgaG93IHRoZSBjb3JlIHNob3VsZCBiZSBjb25maWd1cmVkLiovCisJZHdjX290Z19jb3JlX3BhcmFtc190ICpjb3JlX3BhcmFtczsKKworCS8qKiBDb3JlIEdsb2JhbCByZWdpc3RlcnMgc3RhcnRpbmcgYXQgb2Zmc2V0IDAwMGguICovCisJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmNvcmVfZ2xvYmFsX3JlZ3M7CisKKwkvKiogRGV2aWNlLXNwZWNpZmljIGluZm9ybWF0aW9uICovCisJZHdjX290Z19kZXZfaWZfdCAqZGV2X2lmOworCS8qKiBIb3N0LXNwZWNpZmljIGluZm9ybWF0aW9uICovCisJZHdjX290Z19ob3N0X2lmX3QgKmhvc3RfaWY7CisKKwkvKiogVmFsdWUgZnJvbSBTTlBTSUQgcmVnaXN0ZXIgKi8KKwl1aW50MzJfdCBzbnBzaWQ7CisKKwkvKgorCSAqIFNldCB0byAxIGlmIHRoZSBjb3JlIFBIWSBpbnRlcmZhY2UgYml0cyBpbiBVU0JDRkcgaGF2ZSBiZWVuCisJICogaW5pdGlhbGl6ZWQuCisJICovCisJdWludDhfdCBwaHlfaW5pdF9kb25lOworCisJLyoKKwkgKiBTUlAgU3VjY2VzcyBmbGFnLCBzZXQgYnkgc3JwIHN1Y2Nlc3MgaW50ZXJydXB0IGluIEZTIEkyQyBtb2RlCisJICovCisJdWludDhfdCBzcnBfc3VjY2VzczsKKwl1aW50OF90IHNycF90aW1lcl9zdGFydGVkOworCS8qKiBUaW1lciBmb3IgU1JQLiBJZiBpdCBleHBpcmVzIGJlZm9yZSBTUlAgaXMgc3VjY2Vzc2Z1bAorCSAqIGNsZWFyIHRoZSBTUlAuICovCisJZHdjX3RpbWVyX3QgKnNycF90aW1lcjsKKworI2lmZGVmIERXQ19ERVZfU1JQQ0FQCisJLyogVGhpcyB0aW1lciBpcyBuZWVkZWQgdG8gcG93ZXIgb24gdGhlIGhpYmVybmF0ZWQgaG9zdCBjb3JlIGlmIFNSUCBpcyBub3QKKwkgKiBpbml0aWF0ZWQgb24gY29ubmVjdGVkIFNSUCBjYXBhYmxlIGRldmljZSBmb3IgbGltaXRlZCBwZXJpb2Qgb2YgdGltZQorCSAqLworCXVpbnQ4X3QgcHdyb25fdGltZXJfc3RhcnRlZDsKKwlkd2NfdGltZXJfdCAqcHdyb25fdGltZXI7CisjZW5kaWYKKwkvKiBDb21tb24gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAqLworCS8qKiBQb3dlciBhbmQgQ2xvY2sgR2F0aW5nIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl2b2xhdGlsZSB1aW50MzJfdCAqcGNnY2N0bDsKKyNkZWZpbmUgRFdDX09UR19QQ0dDQ1RMX09GRlNFVCAweEUwMAorCisJLyoqIFB1c2gvcG9wIGFkZHJlc3NlcyBmb3IgZW5kcG9pbnRzIG9yIGhvc3QgY2hhbm5lbHMuKi8KKwl1aW50MzJfdCAqZGF0YV9maWZvW01BWF9FUFNfQ0hBTk5FTFNdOworI2RlZmluZSBEV0NfT1RHX0RBVEFfRklGT19PRkZTRVQgMHgxMDAwCisjZGVmaW5lIERXQ19PVEdfREFUQV9GSUZPX1NJWkUgMHgxMDAwCisKKwkvKiogVG90YWwgUkFNIGZvciBGSUZPcyAoQnl0ZXMpICovCisJdWludDE2X3QgdG90YWxfZmlmb19zaXplOworCS8qKiBTaXplIG9mIFJ4IEZJRk8gKEJ5dGVzKSAqLworCXVpbnQxNl90IHJ4X2ZpZm9fc2l6ZTsKKwkvKiogU2l6ZSBvZiBOb24tcGVyaW9kaWMgVHggRklGTyAoQnl0ZXMpICovCisJdWludDE2X3QgbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKKworCS8qKiAxIGlmIERNQSBpcyBlbmFibGVkLCAwIG90aGVyd2lzZS4gKi8KKwl1aW50OF90IGRtYV9lbmFibGU7CisKKwkvKiogMSBpZiBETUEgZGVzY3JpcHRvciBpcyBlbmFibGVkLCAwIG90aGVyd2lzZS4gKi8KKwl1aW50OF90IGRtYV9kZXNjX2VuYWJsZTsKKworCS8qKiAxIGlmIFBUSSBFbmhhbmNlbWVudCBtb2RlIGlzIGVuYWJsZWQsIDAgb3RoZXJ3aXNlLiAqLworCXVpbnQ4X3QgcHRpX2VuaF9lbmFibGU7CisKKwkvKiogMSBpZiBNUEkgRW5oYW5jZW1lbnQgbW9kZSBpcyBlbmFibGVkLCAwIG90aGVyd2lzZS4gKi8KKwl1aW50OF90IG11bHRpcHJvY19pbnRfZW5hYmxlOworCisJLyoqIDEgaWYgZGVkaWNhdGVkIFR4IEZJRk9zIGFyZSBlbmFibGVkLCAwIG90aGVyd2lzZS4gKi8KKwl1aW50OF90IGVuX211bHRpcGxlX3R4X2ZpZm87CisKKwkvKiogU2V0IHRvIDEgaWYgbXVsdGlwbGUgcGFja2V0cyBvZiBhIGhpZ2gtYmFuZHdpZHRoIHRyYW5zZmVyIGlzIGluCisJICogcHJvY2VzcyBvZiBiZWluZyBxdWV1ZWQgKi8KKwl1aW50OF90IHF1ZXVpbmdfaGlnaF9iYW5kd2lkdGg7CisKKwkvKiogSGFyZHdhcmUgQ29uZmlndXJhdGlvbiAtLSBzdG9yZWQgaGVyZSBmb3IgY29udmVuaWVuY2UuKi8KKwlod2NmZzFfZGF0YV90IGh3Y2ZnMTsKKwlod2NmZzJfZGF0YV90IGh3Y2ZnMjsKKwlod2NmZzNfZGF0YV90IGh3Y2ZnMzsKKwlod2NmZzRfZGF0YV90IGh3Y2ZnNDsKKwlmaWZvc2l6ZV9kYXRhX3QgaHB0eGZzaXo7CisKKwkvKiogSG9zdCBhbmQgRGV2aWNlIENvbmZpZ3VyYXRpb24gLS0gc3RvcmVkIGhlcmUgZm9yIGNvbnZlbmllbmNlLiovCisJaGNmZ19kYXRhX3QgaGNmZzsKKwlkY2ZnX2RhdGFfdCBkY2ZnOworCisJLyoqIFRoZSBvcGVyYXRpb25hbCBTdGF0ZSwgZHVyaW5nIHRyYW5zYXRpb25zCisJICogKGFfaG9zdD4+YV9wZXJpcGhlcmlhbCBhbmQgYl9kZXZpY2U9PmJfaG9zdCkgdGhpcyBtYXkgbm90CisJICogbWF0Y2ggdGhlIGNvcmUgYnV0IGFsbG93cyB0aGUgc29mdHdhcmUgdG8gZGV0ZXJtaW5lCisJICogdHJhbnNpdGlvbnMuCisJICovCisJdWludDhfdCBvcF9zdGF0ZTsKKworCS8qKgorCSAqIFNldCB0byAxIGlmIHRoZSBIQ0QgbmVlZHMgdG8gYmUgcmVzdGFydGVkIG9uIGEgc2Vzc2lvbiByZXF1ZXN0CisJICogaW50ZXJydXB0LiBUaGlzIGlzIHJlcXVpcmVkIGlmIG5vIGNvbm5lY3RvciBJRCBzdGF0dXMgY2hhbmdlIGhhcworCSAqIG9jY3VycmVkIHNpbmNlIHRoZSBIQ0Qgd2FzIGxhc3QgZGlzY29ubmVjdGVkLgorCSAqLworCXVpbnQ4X3QgcmVzdGFydF9oY2Rfb25fc2Vzc2lvbl9yZXE7CisKKwkvKiogSENEIGNhbGxiYWNrcyAqLworCS8qKiBBLURldmljZSBpcyBhX2hvc3QgKi8KKyNkZWZpbmUgQV9IT1NUCQkoMSkKKwkvKiogQS1EZXZpY2UgaXMgYV9zdXNwZW5kICovCisjZGVmaW5lIEFfU1VTUEVORAkoMikKKwkvKiogQS1EZXZpY2UgaXMgYV9wZXJpcGhlcmlhbCAqLworI2RlZmluZSBBX1BFUklQSEVSQUwJKDMpCisJLyoqIEItRGV2aWNlIGlzIG9wZXJhdGluZyBhcyBhIFBlcmlwaGVyYWwuICovCisjZGVmaW5lIEJfUEVSSVBIRVJBTAkoNCkKKwkvKiogQi1EZXZpY2UgaXMgb3BlcmF0aW5nIGFzIGEgSG9zdC4gKi8KKyNkZWZpbmUgQl9IT1NUCQkoNSkKKworCS8qKiBIQ0QgY2FsbGJhY2tzICovCisJc3RydWN0IGR3Y19vdGdfY2lsX2NhbGxiYWNrcyAqaGNkX2NiOworCS8qKiBQQ0QgY2FsbGJhY2tzICovCisJc3RydWN0IGR3Y19vdGdfY2lsX2NhbGxiYWNrcyAqcGNkX2NiOworCisJLyoqIERldmljZSBtb2RlIFBlcmlvZGljIFR4IEZJRk8gTWFzayAqLworCXVpbnQzMl90IHBfdHhfbXNrOworCS8qKiBEZXZpY2UgbW9kZSBQZXJpb2RpYyBUeCBGSUZPIE1hc2sgKi8KKwl1aW50MzJfdCB0eF9tc2s7CisKKwkvKiogV29ya3F1ZXVlIG9iamVjdCB1c2VkIGZvciBoYW5kbGluZyBzZXZlcmFsIGludGVycnVwdHMgKi8KKwlkd2Nfd29ya3FfdCAqd3Ffb3RnOworCisJLyoqIFRpbWVyIG9iamVjdCB1c2VkIGZvciBoYW5kbGluZyAiV2FrZXVwIERldGVjdGVkIiBJbnRlcnJ1cHQgKi8KKwlkd2NfdGltZXJfdCAqd2twX3RpbWVyOworCS8qKiBUaGlzIGFycmF5cyB1c2VkIGZvciBkZWJ1ZyBwdXJwb3NlcyBmb3IgREVWIE9VVCBOQUsgZW5oYW5jZW1lbnQgKi8KKwl1aW50MzJfdCBzdGFydF9kb2VwdHNpel92YWxbTUFYX0VQU19DSEFOTkVMU107CisJZXBfeGZlcl9pbmZvX3QgZXBfeGZlcl9pbmZvW01BWF9FUFNfQ0hBTk5FTFNdOworCWR3Y190aW1lcl90ICplcF94ZmVyX3RpbWVyW01BWF9FUFNfQ0hBTk5FTFNdOworI2lmZGVmIERFQlVHCisJdWludDMyX3Qgc3RhcnRfaGNjaGFyX3ZhbFtNQVhfRVBTX0NIQU5ORUxTXTsKKworCWhjX3hmZXJfaW5mb190IGhjX3hmZXJfaW5mb1tNQVhfRVBTX0NIQU5ORUxTXTsKKwlkd2NfdGltZXJfdCAqaGNfeGZlcl90aW1lcltNQVhfRVBTX0NIQU5ORUxTXTsKKworCXVpbnQzMl90IGhmbnVtXzdfc2FtcGxlczsKKwl1aW50NjRfdCBoZm51bV83X2ZycmVtX2FjY3VtOworCXVpbnQzMl90IGhmbnVtXzBfc2FtcGxlczsKKwl1aW50NjRfdCBoZm51bV8wX2ZycmVtX2FjY3VtOworCXVpbnQzMl90IGhmbnVtX290aGVyX3NhbXBsZXM7CisJdWludDY0X3QgaGZudW1fb3RoZXJfZnJyZW1fYWNjdW07CisjZW5kaWYKKworI2lmZGVmIERXQ19VVEVfQ0ZJCisJdWludDE2X3QgcHdyb25fcnhmc2l6OworCXVpbnQxNl90IHB3cm9uX2ducHR4ZnNpejsKKwl1aW50MTZfdCBwd3Jvbl90eGZzaXpbMTVdOworCisJdWludDE2X3QgaW5pdF9yeGZzaXo7CisJdWludDE2X3QgaW5pdF9nbnB0eGZzaXo7CisJdWludDE2X3QgaW5pdF90eGZzaXpbMTVdOworI2VuZGlmCisKKwkvKiogTHggc3RhdGUgb2YgZGV2aWNlICovCisJZHdjX290Z19seF9zdGF0ZV9lIGx4X3N0YXRlOworCisJLyoqIFNhdmVkIENvcmUgR2xvYmFsIHJlZ2lzdGVycyAqLworCXN0cnVjdCBkd2Nfb3RnX2dsb2JhbF9yZWdzX2JhY2t1cCAqZ3JfYmFja3VwOworCS8qKiBTYXZlZCBIb3N0IHJlZ2lzdGVycyAqLworCXN0cnVjdCBkd2Nfb3RnX2hvc3RfcmVnc19iYWNrdXAgKmhyX2JhY2t1cDsKKwkvKiogU2F2ZWQgRGV2aWNlIHJlZ2lzdGVycyAqLworCXN0cnVjdCBkd2Nfb3RnX2Rldl9yZWdzX2JhY2t1cCAqZHJfYmFja3VwOworCisJLyoqIFBvd2VyIERvd24gRW5hYmxlICovCisJdWludDMyX3QgcG93ZXJfZG93bjsKKworCS8qKiBBRFAgc3VwcG9ydCBFbmFibGUgKi8KKwl1aW50MzJfdCBhZHBfZW5hYmxlOworCisJLyoqIEFEUCBzdHJ1Y3R1cmUgb2JqZWN0ICovCisJZHdjX290Z19hZHBfdCBhZHA7CisKKwkvKiogaGliZXJuYXRpb24vc3VzcGVuZCBmbGFnICovCisJaW50IGhpYmVybmF0aW9uX3N1c3BlbmQ7CisKKwkvKiogT1RHIHJldmlzaW9uIHN1cHBvcnRlZCAqLworCXVpbnQzMl90IG90Z192ZXI7CisKKwkvKiogT1RHIHN0YXR1cyBmbGFnIHVzZWQgZm9yIEhOUCBwb2xsaW5nICovCisJdWludDhfdCBvdGdfc3RzOworCisJLyoqIFBvaW50ZXIgdG8gZWl0aGVyIGhjZC0+bG9jayBvciBwY2QtPmxvY2sgKi8KKwlkd2Nfc3BpbmxvY2tfdCAqbG9jazsKKworCS8qKiBTdGFydCBwcmVkaWN0IE5leHRFUCBiYXNlZCBvbiBMZWFybmluZyBRdWV1ZSBpZiBlcXVhbCAxLAorCSAqIGFsc28gdXNlZCBhcyBjb3VudGVyIG9mIGRpc2FibGVkIE5QIElOIEVQJ3MgKi8KKwl1aW50OF90IHN0YXJ0X3ByZWRpY3Q7CisKKwkvKiogTmV4dEVwIHNlcXVlbmNlLCBpbmNsdWRpbmcgRVAwOiBuZXh0ZXBfc2VxW10gPSBFUCBpZiBub24tcGVyaW9kaWMgYW5kCisJICogYWN0aXZlLCAweGZmIG90aGVyd2lzZSAqLworCXVpbnQ4X3QgbmV4dGVwX3NlcVtNQVhfRVBTX0NIQU5ORUxTXTsKKworCS8qKiBJbmRleCBvZiBmaXNydCBFUCBpbiBuZXh0ZXBfc2VxIGFycmF5IHdoaWNoIHNob3VsZCBiZSByZS1lbmFibGVkICoqLworCXVpbnQ4X3QgZmlyc3RfaW5fbmV4dGVwX3NlcTsKKworCS8qKiBGcmFtZSBudW1iZXIgd2hpbGUgZW50ZXJpbmcgdG8gSVNSIC0gbmVlZGVkIGZvciBJU09DcyAqKi8KKwl1aW50MzJfdCBmcmFtZV9udW07CisKK307CisKKyNpZmRlZiBERUJVRworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdHJhbnNmZXIgaXMgdGltZWQgb3V0LgorICovCitleHRlcm4gdm9pZCBoY194ZmVyX3RpbWVvdXQodm9pZCAqcHRyKTsKKyNlbmRpZgorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0cmFuc2ZlciBpcyB0aW1lZCBvdXQgb24gZW5kcG9pbnQuCisgKi8KK2V4dGVybiB2b2lkIGVwX3hmZXJfdGltZW91dCh2b2lkICpwdHIpOworCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGZ1bmN0aW9ucyBmb3Igd29ya3MKKyAqIHVzaW5nIGR1cmluZyBoYW5kbGluZyBzb21lIGludGVycnVwdHMKKyAqLworZXh0ZXJuIHZvaWQgd19jb25uX2lkX3N0YXR1c19jaGFuZ2Uodm9pZCAqcCk7CisKK2V4dGVybiB2b2lkIHdfd2FrZXVwX2RldGVjdGVkKHZvaWQgKnApOworCisvKiogU2F2ZXMgZ2xvYmFsIHJlZ2lzdGVyIHZhbHVlcyBpbnRvIHN5c3RlbSBtZW1vcnkuICovCitleHRlcm4gaW50IGR3Y19vdGdfc2F2ZV9nbG9iYWxfcmVncyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworLyoqIFNhdmVzIGRldmljZSByZWdpc3RlciB2YWx1ZXMgaW50byBzeXN0ZW0gbWVtb3J5LiAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NhdmVfZGV2X3JlZ3MoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKy8qKiBTYXZlcyBob3N0IHJlZ2lzdGVyIHZhbHVlcyBpbnRvIHN5c3RlbSBtZW1vcnkuICovCitleHRlcm4gaW50IGR3Y19vdGdfc2F2ZV9ob3N0X3JlZ3MoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKy8qKiBSZXN0b3JlIGdsb2JhbCByZWdpc3RlciB2YWx1ZXMuICovCitleHRlcm4gaW50IGR3Y19vdGdfcmVzdG9yZV9nbG9iYWxfcmVncyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworLyoqIFJlc3RvcmUgaG9zdCByZWdpc3RlciB2YWx1ZXMuICovCitleHRlcm4gaW50IGR3Y19vdGdfcmVzdG9yZV9ob3N0X3JlZ3MoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQgcmVzZXQpOworLyoqIFJlc3RvcmUgZGV2aWNlIHJlZ2lzdGVyIHZhbHVlcy4gKi8KK2V4dGVybiBpbnQgZHdjX290Z19yZXN0b3JlX2Rldl9yZWdzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkgICAgaW50IHJlbV93YWtldXApOworZXh0ZXJuIGludCByZXN0b3JlX2xwbV9pMmNfcmVncyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworZXh0ZXJuIGludCByZXN0b3JlX2Vzc2VudGlhbF9yZWdzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50IHJtb2RlLAorCQkJCSAgaW50IGlzX2hvc3QpOworCitleHRlcm4gaW50IGR3Y19vdGdfaG9zdF9oaWJlcm5hdGlvbl9yZXN0b3JlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgIGludCByZXN0b3JlX21vZGUsIGludCByZXNldCk7CitleHRlcm4gaW50IGR3Y19vdGdfZGV2aWNlX2hpYmVybmF0aW9uX3Jlc3RvcmUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgICAgICBpbnQgcmVtX3dha2V1cCwgaW50IHJlc2V0KTsKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHN1cHBvcnQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIENJTCBkcml2ZXIgY29tcG9uZW50CisgKiBhbmQgdGhlIERXQ19vdGcgY29udHJvbGxlci4KKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19jb3JlX2hvc3RfaW5pdChkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfY29yZV9kZXZfaW5pdChkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKKworLyoqIEBuYW1lIERldmljZSBDSUwgRnVuY3Rpb25zCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzdXBwb3J0IG1hbmFnaW5nIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgaW4gZGV2aWNlCisgKiBtb2RlLgorICovCisvKipAeyovCitleHRlcm4gdm9pZCBkd2Nfb3RnX3dha2V1cChkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfcmVhZF9zZXR1cF9wYWNrZXQoZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZiwKKwkJCQkgICAgICB1aW50MzJfdCAqIF9kZXN0KTsKK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9mcmFtZV9udW1iZXIoZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZik7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2VwMF9hY3RpdmF0ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmLCBkd2NfZXBfdCAqIF9lcCk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2VwX2FjdGl2YXRlKGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYsIGR3Y19lcF90ICogX2VwKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfZXBfZGVhY3RpdmF0ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmLCBkd2NfZXBfdCAqIF9lcCk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2VwX3N0YXJ0X3RyYW5zZmVyKGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYsCisJCQkJICAgICAgZHdjX2VwX3QgKiBfZXApOworZXh0ZXJuIHZvaWQgZHdjX290Z19lcF9zdGFydF96bF90cmFuc2Zlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmLAorCQkJCQkgZHdjX2VwX3QgKiBfZXApOworZXh0ZXJuIHZvaWQgZHdjX290Z19lcDBfc3RhcnRfdHJhbnNmZXIoZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZiwKKwkJCQkgICAgICAgZHdjX2VwX3QgKiBfZXApOworZXh0ZXJuIHZvaWQgZHdjX290Z19lcDBfY29udGludWVfdHJhbnNmZXIoZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZiwKKwkJCQkJICBkd2NfZXBfdCAqIF9lcCk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2VwX3dyaXRlX3BhY2tldChkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmLAorCQkJCSAgICBkd2NfZXBfdCAqIF9lcCwgaW50IF9kbWEpOworZXh0ZXJuIHZvaWQgZHdjX290Z19lcF9zZXRfc3RhbGwoZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZiwgZHdjX2VwX3QgKiBfZXApOworZXh0ZXJuIHZvaWQgZHdjX290Z19lcF9jbGVhcl9zdGFsbChkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmLAorCQkJCSAgIGR3Y19lcF90ICogX2VwKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfZW5hYmxlX2RldmljZV9pbnRlcnJ1cHRzKGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYpOworCisjaWZkZWYgRFdDX0VOX0lTT0MKK2V4dGVybiB2b2lkIGR3Y19vdGdfaXNvX2VwX3N0YXJ0X2ZybV90cmFuc2Zlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCSAgICAgIGR3Y19lcF90ICogZXApOworZXh0ZXJuIHZvaWQgZHdjX290Z19pc29fZXBfc3RhcnRfYnVmX3RyYW5zZmVyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgICAgZHdjX2VwX3QgKiBlcCk7CisjZW5kaWYgLyogRFdDX0VOX0lTT0MgKi8KKy8qKkB9Ki8KKworLyoqIEBuYW1lIEhvc3QgQ0lMIEZ1bmN0aW9ucworICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc3VwcG9ydCBtYW5hZ2luZyB0aGUgRFdDX290ZyBjb250cm9sbGVyIGluIGhvc3QKKyAqIG1vZGUuCisgKi8KKy8qKkB7Ki8KK2V4dGVybiB2b2lkIGR3Y19vdGdfaGNfaW5pdChkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmLCBkd2NfaGNfdCAqIF9oYyk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2hjX2hhbHQoZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZiwKKwkJCSAgICBkd2NfaGNfdCAqIF9oYywgZHdjX290Z19oYWx0X3N0YXR1c19lIF9oYWx0X3N0YXR1cyk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2hjX2NsZWFudXAoZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZiwgZHdjX2hjX3QgKiBfaGMpOworZXh0ZXJuIHZvaWQgZHdjX290Z19oY19zdGFydF90cmFuc2Zlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmLAorCQkJCSAgICAgIGR3Y19oY190ICogX2hjKTsKK2V4dGVybiBpbnQgZHdjX290Z19oY19jb250aW51ZV90cmFuc2Zlcihkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmLAorCQkJCQlkd2NfaGNfdCAqIF9oYyk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2hjX2RvX3BpbmcoZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZiwgZHdjX2hjX3QgKiBfaGMpOworZXh0ZXJuIHZvaWQgZHdjX290Z19oY193cml0ZV9wYWNrZXQoZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZiwKKwkJCQkgICAgZHdjX2hjX3QgKiBfaGMpOworZXh0ZXJuIHZvaWQgZHdjX290Z19lbmFibGVfaG9zdF9pbnRlcnJ1cHRzKGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYpOworZXh0ZXJuIHZvaWQgZHdjX290Z19kaXNhYmxlX2hvc3RfaW50ZXJydXB0cyhkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKKworZXh0ZXJuIHZvaWQgZHdjX290Z19oY19zdGFydF90cmFuc2Zlcl9kZG1hKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgZHdjX2hjX3QgKiBoYyk7CisKK2V4dGVybiB1aW50MzJfdCBjYWxjX2ZyYW1lX2ludGVydmFsKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisKKy8qIE1hY3JvIHVzZWQgdG8gY2xlYXIgb25lIGNoYW5uZWwgaW50ZXJydXB0ICovCisjZGVmaW5lIGNsZWFyX2hjX2ludChfaGNfcmVnc18sIF9pbnRyXykgXAorZG8geyBcCisJaGNpbnRfZGF0YV90IGhjaW50X2NsZWFyID0gey5kMzIgPSAwfTsgXAorCWhjaW50X2NsZWFyLmIuX2ludHJfID0gMTsgXAorCURXQ19XUklURV9SRUczMigmKF9oY19yZWdzXyktPmhjaW50LCBoY2ludF9jbGVhci5kMzIpOyBcCit9IHdoaWxlICgwKQorCisvKgorICogTWFjcm8gdXNlZCB0byBkaXNhYmxlIG9uZSBjaGFubmVsIGludGVycnVwdC4gQ2hhbm5lbCBpbnRlcnJ1cHRzIGFyZQorICogZGlzYWJsZWQgd2hlbiB0aGUgY2hhbm5lbCBpcyBoYWx0ZWQgb3IgcmVsZWFzZWQgYnkgdGhlIGludGVycnVwdCBoYW5kbGVyLgorICogVGhlcmUgaXMgbm8gbmVlZCB0byBoYW5kbGUgZnVydGhlciBpbnRlcnJ1cHRzIG9mIHRoYXQgdHlwZSB1bnRpbCB0aGUKKyAqIGNoYW5uZWwgaXMgcmUtYXNzaWduZWQuIEluIGZhY3QsIHN1YnNlcXVlbnQgaGFuZGxpbmcgbWF5IGNhdXNlIGNyYXNoZXMKKyAqIGJlY2F1c2UgdGhlIGNoYW5uZWwgc3RydWN0dXJlcyBhcmUgY2xlYW5lZCB1cCB3aGVuIHRoZSBjaGFubmVsIGlzIHJlbGVhc2VkLgorICovCisjZGVmaW5lIGRpc2FibGVfaGNfaW50KF9oY19yZWdzXywgX2ludHJfKSBcCitkbyB7IFwKKwloY2ludG1za19kYXRhX3QgaGNpbnRtc2sgPSB7LmQzMiA9IDB9OyBcCisJaGNpbnRtc2suYi5faW50cl8gPSAxOyBcCisJRFdDX01PRElGWV9SRUczMigmKF9oY19yZWdzXyktPmhjaW50bXNrLCBoY2ludG1zay5kMzIsIDApOyBcCit9IHdoaWxlICgwKQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gUmVhZHMgSFBSVDAgaW4gcHJlcGFyYXRpb24gdG8gbW9kaWZ5LiBJdCBrZWVwcyB0aGUKKyAqIFdDIGJpdHMgMCBzbyB0aGF0IGlmIHRoZXkgYXJlIHJlYWQgYXMgMSwgdGhleSB3b24ndCBjbGVhciB3aGVuIHlvdQorICogd3JpdGUgaXQgYmFjaworICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGR3Y19vdGdfcmVhZF9ocHJ0MChkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKQoreworCWhwcnQwX2RhdGFfdCBocHJ0MDsKKwlocHJ0MC5kMzIgPSBEV0NfUkVBRF9SRUczMihfY29yZV9pZi0+aG9zdF9pZi0+aHBydDApOworCWhwcnQwLmIucHJ0ZW5hID0gMDsKKwlocHJ0MC5iLnBydGNvbm5kZXQgPSAwOworCWhwcnQwLmIucHJ0ZW5jaG5nID0gMDsKKwlocHJ0MC5iLnBydG92cmN1cnJjaG5nID0gMDsKKwlyZXR1cm4gaHBydDAuZDMyOworfQorCisvKipAfSovCisKKy8qKiBAbmFtZSBDb21tb24gQ0lMIEZ1bmN0aW9ucworICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc3VwcG9ydCBtYW5hZ2luZyB0aGUgRFdDX290ZyBjb250cm9sbGVyIGluIGVpdGhlcgorICogZGV2aWNlIG9yIGhvc3QgbW9kZS4KKyAqLworLyoqQHsqLworCitleHRlcm4gdm9pZCBkd2Nfb3RnX3JlYWRfcGFja2V0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQl1aW50OF90ICogZGVzdCwgdWludDE2X3QgYnl0ZXMpOworCitleHRlcm4gdm9pZCBkd2Nfb3RnX2ZsdXNoX3R4X2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKiBfY29yZV9pZiwgY29uc3QgaW50IF9udW0pOworZXh0ZXJuIHZvaWQgZHdjX290Z19mbHVzaF9yeF9maWZvKGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYpOworZXh0ZXJuIHZvaWQgZHdjX290Z19jb3JlX3Jlc2V0KGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgQ29yZSBJbnRlcnJ1cHQgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZHdjX290Z19yZWFkX2NvcmVfaW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJcmV0dXJuIChEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cykgJgorCQlEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaykpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgT1RHIEludGVycnVwdCByZWdpc3Rlci4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBkd2Nfb3RnX3JlYWRfb3RnX2ludHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXJldHVybiAoRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdvdGdpbnQpKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBEZXZpY2UgQWxsIEVuZHBvaW50cyBJbnRlcnJ1cHQgcmVnaXN0ZXIgYW5kCisgKiByZXR1cm5zIHRoZSBJTiBlbmRwb2ludCBpbnRlcnJ1cHQgYml0cy4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBkd2Nfb3RnX3JlYWRfZGV2X2FsbF9pbl9lcF9pbnRyKGR3Y19vdGdfY29yZV9pZl90ICoKKwkJCQkJCSAgICAgICBjb3JlX2lmKQoreworCisJdWludDMyX3QgdjsKKworCWlmIChjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQl2ID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJICAgZGV2X2dsb2JhbF9yZWdzLT5kZWFjaGludCkgJgorCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPgorCQkJCSAgIGRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kZWFjaGludG1zayk7CisJfSBlbHNlIHsKKwkJdiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGFpbnQpICYKKwkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGFpbnRtc2spOworCX0KKwlyZXR1cm4gKHYgJiAweGZmZmYpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIERldmljZSBBbGwgRW5kcG9pbnRzIEludGVycnVwdCByZWdpc3RlciBhbmQKKyAqIHJldHVybnMgdGhlIE9VVCBlbmRwb2ludCBpbnRlcnJ1cHQgYml0cy4KKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBkd2Nfb3RnX3JlYWRfZGV2X2FsbF9vdXRfZXBfaW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqCisJCQkJCQkJY29yZV9pZikKK3sKKwl1aW50MzJfdCB2OworCisJaWYgKGNvcmVfaWYtPm11bHRpcHJvY19pbnRfZW5hYmxlKSB7CisJCXYgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQkgICBkZXZfZ2xvYmFsX3JlZ3MtPmRlYWNoaW50KSAmCisJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+CisJCQkJICAgZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRlYWNoaW50bXNrKTsKKwl9IGVsc2UgeworCQl2ID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kYWludCkgJgorCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kYWludG1zayk7CisJfQorCisJcmV0dXJuICgodiAmIDB4ZmZmZjAwMDApID4+IDE2KTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIERldmljZSBJTiBFUCBJbnRlcnJ1cHQgcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBkd2Nfb3RnX3JlYWRfZGV2X2luX2VwX2ludHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkJICAgZHdjX2VwX3QgKiBlcCkKK3sKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWYgPSBjb3JlX2lmLT5kZXZfaWY7CisJdWludDMyX3QgdiwgbXNrLCBlbXA7CisKKwlpZiAoY29yZV9pZi0+bXVsdGlwcm9jX2ludF9lbmFibGUpIHsKKwkJbXNrID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPgorCQkJCSAgIGRldl9nbG9iYWxfcmVncy0+ZGllcGVhY2hpbnRtc2tbZXAtPm51bV0pOworCQllbXAgPQorCQkgICAgRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+CisJCQkJICAgZGV2X2dsb2JhbF9yZWdzLT5kdGtucXI0X2ZpZm9lbXB0eW1zayk7CisJCW1zayB8PSAoKGVtcCA+PiBlcC0+bnVtKSAmIDB4MSkgPDwgNzsKKwkJdiA9IERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbZXAtPm51bV0tPmRpZXBpbnQpICYgbXNrOworCX0gZWxzZSB7CisJCW1zayA9IERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGllcG1zayk7CisJCWVtcCA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT4KKwkJCQkgICBkZXZfZ2xvYmFsX3JlZ3MtPmR0a25xcjRfZmlmb2VtcHR5bXNrKTsKKwkJbXNrIHw9ICgoZW1wID4+IGVwLT5udW0pICYgMHgxKSA8PCA3OworCQl2ID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tlcC0+bnVtXS0+ZGllcGludCkgJiBtc2s7CisJfQorCisJcmV0dXJuIHY7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBEZXZpY2UgT1VUIEVQIEludGVycnVwdCByZWdpc3RlcgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGR3Y19vdGdfcmVhZF9kZXZfb3V0X2VwX2ludHIoZHdjX290Z19jb3JlX2lmX3QgKgorCQkJCQkJICAgIF9jb3JlX2lmLCBkd2NfZXBfdCAqIF9lcCkKK3sKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWYgPSBfY29yZV9pZi0+ZGV2X2lmOworCXVpbnQzMl90IHY7CisJZG9lcG1za19kYXRhX3QgbXNrID0gey5kMzIgPSAwIH07CisKKwlpZiAoX2NvcmVfaWYtPm11bHRpcHJvY19pbnRfZW5hYmxlKSB7CisJCW1zay5kMzIgPQorCQkgICAgRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+CisJCQkJICAgZGV2X2dsb2JhbF9yZWdzLT5kb2VwZWFjaGludG1za1tfZXAtPm51bV0pOworCQlpZiAoX2NvcmVfaWYtPnB0aV9lbmhfZW5hYmxlKSB7CisJCQltc2suYi5wa3RkcnBzdHMgPSAxOworCQl9CisJCXYgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT4KKwkJCQkgICBvdXRfZXBfcmVnc1tfZXAtPm51bV0tPmRvZXBpbnQpICYgbXNrLmQzMjsKKwl9IGVsc2UgeworCQltc2suZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kb2VwbXNrKTsKKwkJaWYgKF9jb3JlX2lmLT5wdGlfZW5oX2VuYWJsZSkgeworCQkJbXNrLmIucGt0ZHJwc3RzID0gMTsKKwkJfQorCQl2ID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+CisJCQkJICAgb3V0X2VwX3JlZ3NbX2VwLT5udW1dLT5kb2VwaW50KSAmIG1zay5kMzI7CisJfQorCXJldHVybiB2OworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgSG9zdCBBbGwgQ2hhbm5lbCBJbnRlcnJ1cHQgcmVnaXN0ZXIKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBkd2Nfb3RnX3JlYWRfaG9zdF9hbGxfY2hhbm5lbHNfaW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqCisJCQkJCQkJICAgX2NvcmVfaWYpCit7CisJcmV0dXJuIChEV0NfUkVBRF9SRUczMigmX2NvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3MtPmhhaW50KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZHdjX290Z19yZWFkX2hvc3RfY2hhbm5lbF9pbnRyKGR3Y19vdGdfY29yZV9pZl90ICoKKwkJCQkJCSAgICAgIF9jb3JlX2lmLCBkd2NfaGNfdCAqIF9oYykKK3sKKwlyZXR1cm4gKERXQ19SRUFEX1JFRzMyCisJCSgmX2NvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbX2hjLT5oY19udW1dLT5oY2ludCkpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbW9kZSBvZiB0aGUgb3BlcmF0aW9uLCBob3N0IG9yIGRldmljZS4KKyAqCisgKiBAcmV0dXJuIDAgLSBEZXZpY2UgTW9kZSwgMSAtIEhvc3QgTW9kZQorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGR3Y19vdGdfbW9kZShkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKQoreworCXJldHVybiAoRFdDX1JFQURfUkVHMzIoJl9jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzKSAmIDB4MSk7Cit9CisKKy8qKkB9Ki8KKworLyoqCisgKiBEV0Nfb3RnIENJTCBjYWxsYmFjayBzdHJ1Y3R1cmUuIFRoaXMgc3RydWN0dXJlIGFsbG93cyB0aGUgSENEIGFuZAorICogUENEIHRvIHJlZ2lzdGVyIGZ1bmN0aW9ucyB1c2VkIGZvciBzdGFydGluZyBhbmQgc3RvcHBpbmcgdGhlIFBDRAorICogYW5kIEhDRCBmb3Igcm9sZSBjaGFuZ2Ugb24gZm9yIGEgRFJELgorICovCit0eXBlZGVmIHN0cnVjdCBkd2Nfb3RnX2NpbF9jYWxsYmFja3MgeworCS8qKiBTdGFydCBmdW5jdGlvbiBmb3Igcm9sZSBjaGFuZ2UgKi8KKwlpbnQgKCpzdGFydCkgKHZvaWQgKl9wKTsKKwkvKiogU3RvcCBGdW5jdGlvbiBmb3Igcm9sZSBjaGFuZ2UgKi8KKwlpbnQgKCpzdG9wKSAodm9pZCAqX3ApOworCS8qKiBEaXNjb25uZWN0IEZ1bmN0aW9uIGZvciByb2xlIGNoYW5nZSAqLworCWludCAoKmRpc2Nvbm5lY3QpICh2b2lkICpfcCk7CisJLyoqIFJlc3VtZS9SZW1vdGUgd2FrZXVwIEZ1bmN0aW9uICovCisJaW50ICgqcmVzdW1lX3dha2V1cCkgKHZvaWQgKl9wKTsKKwkvKiogU3VzcGVuZCBmdW5jdGlvbiAqLworCWludCAoKnN1c3BlbmQpICh2b2lkICpfcCk7CisJLyoqIFNlc3Npb24gU3RhcnQgKFNSUCkgKi8KKwlpbnQgKCpzZXNzaW9uX3N0YXJ0KSAodm9pZCAqX3ApOworI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwkvKiogU2xlZXAgKHN3aXRjaCB0byBMMCBzdGF0ZSkgKi8KKwlpbnQgKCpzbGVlcCkgKHZvaWQgKl9wKTsKKyNlbmRpZgorCS8qKiBQb2ludGVyIHBhc3NlZCB0byBzdGFydCgpIGFuZCBzdG9wKCkgKi8KKwl2b2lkICpwOworfSBkd2Nfb3RnX2NpbF9jYWxsYmFja3NfdDsKKworZXh0ZXJuIHZvaWQgZHdjX290Z19jaWxfcmVnaXN0ZXJfcGNkX2NhbGxiYWNrcyhkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmLAorCQkJCQkgICAgICAgZHdjX290Z19jaWxfY2FsbGJhY2tzX3QgKiBfY2IsCisJCQkJCSAgICAgICB2b2lkICpfcCk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2NpbF9yZWdpc3Rlcl9oY2RfY2FsbGJhY2tzKGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYsCisJCQkJCSAgICAgICBkd2Nfb3RnX2NpbF9jYWxsYmFja3NfdCAqIF9jYiwKKwkJCQkJICAgICAgIHZvaWQgKl9wKTsKKwordm9pZCBkd2Nfb3RnX2luaXRpYXRlX3NycChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvKiogU3RhcnQgdGhlIEhDRC4gIEhlbHBlciBmdW5jdGlvbiBmb3IgdXNpbmcgdGhlIEhDRCBjYWxsYmFja3MuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaWxfaGNkX3N0YXJ0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpZiAoY29yZV9pZi0+aGNkX2NiICYmIGNvcmVfaWYtPmhjZF9jYi0+c3RhcnQpIHsKKwkJY29yZV9pZi0+aGNkX2NiLT5zdGFydChjb3JlX2lmLT5oY2RfY2ItPnApOworCX0KK30KKworLyoqIFN0b3AgdGhlIEhDRC4gIEhlbHBlciBmdW5jdGlvbiBmb3IgdXNpbmcgdGhlIEhDRCBjYWxsYmFja3MuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaWxfaGNkX3N0b3AoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWlmIChjb3JlX2lmLT5oY2RfY2IgJiYgY29yZV9pZi0+aGNkX2NiLT5zdG9wKSB7CisJCWNvcmVfaWYtPmhjZF9jYi0+c3RvcChjb3JlX2lmLT5oY2RfY2ItPnApOworCX0KK30KKworLyoqIERpc2Nvbm5lY3QgdGhlIEhDRC4gIEhlbHBlciBmdW5jdGlvbiBmb3IgdXNpbmcgdGhlIEhDRCBjYWxsYmFja3MuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaWxfaGNkX2Rpc2Nvbm5lY3QoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWlmIChjb3JlX2lmLT5oY2RfY2IgJiYgY29yZV9pZi0+aGNkX2NiLT5kaXNjb25uZWN0KSB7CisJCWNvcmVfaWYtPmhjZF9jYi0+ZGlzY29ubmVjdChjb3JlX2lmLT5oY2RfY2ItPnApOworCX0KK30KKworLyoqIEluZm9ybSB0aGUgSENEIHRoZSBhIE5ldyBTZXNzaW9uIGhhcyBiZWd1bi4gIEhlbHBlciBmdW5jdGlvbiBmb3IKKyAqIHVzaW5nIHRoZSBIQ0QgY2FsbGJhY2tzLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2lsX2hjZF9zZXNzaW9uX3N0YXJ0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpZiAoY29yZV9pZi0+aGNkX2NiICYmIGNvcmVfaWYtPmhjZF9jYi0+c2Vzc2lvbl9zdGFydCkgeworCQljb3JlX2lmLT5oY2RfY2ItPnNlc3Npb25fc3RhcnQoY29yZV9pZi0+aGNkX2NiLT5wKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCisvKioKKyAqIEluZm9ybSB0aGUgSENEIGFib3V0IExQTSBzbGVlcC4KKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgdXNpbmcgdGhlIEhDRCBjYWxsYmFja3MuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaWxfaGNkX3NsZWVwKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpZiAoY29yZV9pZi0+aGNkX2NiICYmIGNvcmVfaWYtPmhjZF9jYi0+c2xlZXApIHsKKwkJY29yZV9pZi0+aGNkX2NiLT5zbGVlcChjb3JlX2lmLT5oY2RfY2ItPnApOworCX0KK30KKyNlbmRpZgorCisvKiogUmVzdW1lIHRoZSBIQ0QuICBIZWxwZXIgZnVuY3Rpb24gZm9yIHVzaW5nIHRoZSBIQ0QgY2FsbGJhY2tzLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2lsX2hjZF9yZXN1bWUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWlmIChjb3JlX2lmLT5oY2RfY2IgJiYgY29yZV9pZi0+aGNkX2NiLT5yZXN1bWVfd2FrZXVwKSB7CisJCWNvcmVfaWYtPmhjZF9jYi0+cmVzdW1lX3dha2V1cChjb3JlX2lmLT5oY2RfY2ItPnApOworCX0KK30KKworLyoqIFN0YXJ0IHRoZSBQQ0QuICBIZWxwZXIgZnVuY3Rpb24gZm9yIHVzaW5nIHRoZSBQQ0QgY2FsbGJhY2tzLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2lsX3BjZF9zdGFydChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJaWYgKGNvcmVfaWYtPnBjZF9jYiAmJiBjb3JlX2lmLT5wY2RfY2ItPnN0YXJ0KSB7CisJCWNvcmVfaWYtPnBjZF9jYi0+c3RhcnQoY29yZV9pZi0+cGNkX2NiLT5wKTsKKwl9Cit9CisKKy8qKiBTdG9wIHRoZSBQQ0QuICBIZWxwZXIgZnVuY3Rpb24gZm9yIHVzaW5nIHRoZSBQQ0QgY2FsbGJhY2tzLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2lsX3BjZF9zdG9wKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpZiAoY29yZV9pZi0+cGNkX2NiICYmIGNvcmVfaWYtPnBjZF9jYi0+c3RvcCkgeworCQljb3JlX2lmLT5wY2RfY2ItPnN0b3AoY29yZV9pZi0+cGNkX2NiLT5wKTsKKwl9Cit9CisKKy8qKiBTdXNwZW5kIHRoZSBQQ0QuICBIZWxwZXIgZnVuY3Rpb24gZm9yIHVzaW5nIHRoZSBQQ0QgY2FsbGJhY2tzLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2lsX3BjZF9zdXNwZW5kKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpZiAoY29yZV9pZi0+cGNkX2NiICYmIGNvcmVfaWYtPnBjZF9jYi0+c3VzcGVuZCkgeworCQljb3JlX2lmLT5wY2RfY2ItPnN1c3BlbmQoY29yZV9pZi0+cGNkX2NiLT5wKTsKKwl9Cit9CisKKy8qKiBSZXN1bWUgdGhlIFBDRC4gIEhlbHBlciBmdW5jdGlvbiBmb3IgdXNpbmcgdGhlIFBDRCBjYWxsYmFja3MuCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaWxfcGNkX3Jlc3VtZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJaWYgKGNvcmVfaWYtPnBjZF9jYiAmJiBjb3JlX2lmLT5wY2RfY2ItPnJlc3VtZV93YWtldXApIHsKKwkJY29yZV9pZi0+cGNkX2NiLT5yZXN1bWVfd2FrZXVwKGNvcmVfaWYtPnBjZF9jYi0+cCk7CisJfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2NpbF9pbnRyLmMgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY2lsX2ludHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTgxYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2NpbF9pbnRyLmMKQEAgLTAsMCArMSwxMzkzIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfY2lsX2ludHIuYyAkCisgKiAkUmV2aXNpb246ICMzMSAkCisgKiAkRGF0ZTogMjAxMS8xMC8yNCAkCisgKiAkQ2hhbmdlOiAxODcxMjg2ICQKKyAqCisgKiBTeW5vcHN5cyBIUyBPVEcgTGludXggU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIChoZXJlaW5hZnRlciwKKyAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdCB1bmRlcgorICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAorICogd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKKyAqIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLCBkaXNjbG9zZSwgY29weSBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSBvcgorICogYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tCisgKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKKyAqIGJlbG93LCB0aGVuIHlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiogQGZpbGUKKyAqCisgKiBUaGUgQ29yZSBJbnRlcmZhY2UgTGF5ZXIgcHJvdmlkZXMgYmFzaWMgc2VydmljZXMgZm9yIGFjY2Vzc2luZyBhbmQKKyAqIG1hbmFnaW5nIHRoZSBEV0Nfb3RnIGhhcmR3YXJlLiBUaGVzZSBzZXJ2aWNlcyBhcmUgdXNlZCBieSBib3RoIHRoZQorICogSG9zdCBDb250cm9sbGVyIERyaXZlciBhbmQgdGhlIFBlcmlwaGVyYWwgQ29udHJvbGxlciBEcml2ZXIuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBDb21tb24gSW50ZXJydXB0IGhhbmRsZXJzLgorICovCisjaW5jbHVkZSAiZHdjX29zLmgiCisjaW5jbHVkZSAiZHdjX290Z19yZWdzLmgiCisjaW5jbHVkZSAiZHdjX290Z19jaWwuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2RyaXZlci5oIgorI2luY2x1ZGUgImR3Y19vdGdfcGNkLmgiCisjaW5jbHVkZSAiZHdjX290Z19oY2QuaCIKKworI2lmZGVmIERFQlVHCitpbmxpbmUgY29uc3QgY2hhciAqb3Bfc3RhdGVfc3RyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlyZXR1cm4gKGNvcmVfaWYtPm9wX3N0YXRlID09IEFfSE9TVCA/ICJhX2hvc3QiIDoKKwkJKGNvcmVfaWYtPm9wX3N0YXRlID09IEFfU1VTUEVORCA/ICJhX3N1c3BlbmQiIDoKKwkJIChjb3JlX2lmLT5vcF9zdGF0ZSA9PSBBX1BFUklQSEVSQUwgPyAiYV9wZXJpcGhlcmFsIiA6CisJCSAgKGNvcmVfaWYtPm9wX3N0YXRlID09IEJfUEVSSVBIRVJBTCA/ICJiX3BlcmlwaGVyYWwiIDoKKwkJICAgKGNvcmVfaWYtPm9wX3N0YXRlID09IEJfSE9TVCA/ICJiX2hvc3QiIDogInVua25vd24iKSkpKSk7Cit9CisjZW5kaWYKKworLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2cgYSBkZWJ1ZyBtZXNzYWdlCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKi8KK2ludDMyX3QgZHdjX290Z19oYW5kbGVfbW9kZV9taXNtYXRjaF9pbnRyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlnaW50c3RzX2RhdGFfdCBnaW50c3RzOworCURXQ19XQVJOKCJNb2RlIE1pc21hdGNoIEludGVycnVwdDogY3VycmVudGx5IGluICVzIG1vZGVcbiIsCisJCSBkd2Nfb3RnX21vZGUoY29yZV9pZikgPyAiSG9zdCIgOiAiRGV2aWNlIik7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwlnaW50c3RzLmQzMiA9IDA7CisJZ2ludHN0cy5iLm1vZGVtaXNtYXRjaCA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzLCBnaW50c3RzLmQzMik7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBPVEcgSW50ZXJydXB0cy4gSXQgcmVhZHMgdGhlIE9URworICogSW50ZXJydXB0IFJlZ2lzdGVyIChHT1RHSU5UKSB0byBkZXRlcm1pbmUgd2hhdCBpbnRlcnJ1cHQgaGFzCisgKiBvY2N1cnJlZC4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqLworaW50MzJfdCBkd2Nfb3RnX2hhbmRsZV9vdGdfaW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzID0gY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwlnb3RnaW50X2RhdGFfdCBnb3RnaW50OworCWdvdGdjdGxfZGF0YV90IGdvdGdjdGw7CisJZ2ludG1za19kYXRhX3QgZ2ludG1zazsKKwlncHdyZG5fZGF0YV90IGdwd3JkbjsKKworCWdvdGdpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nb3RnaW50KTsKKwlnb3RnY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z290Z2N0bCk7CisJRFdDX0RFQlVHUEwoREJHX0NJTCwgIisrT1RHIEludGVycnVwdCBnb3RnaW50PSUweCBbJXNdXG4iLCBnb3RnaW50LmQzMiwKKwkJICAgIG9wX3N0YXRlX3N0cihjb3JlX2lmKSk7CisKKwlpZiAoZ290Z2ludC5iLnNlc2VuZGRldCkgeworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiICsrT1RHIEludGVycnVwdDogIgorCQkJICAgICJTZXNzaW9uIEVuZCBEZXRlY3RlZCsrICglcylcbiIsCisJCQkgICAgb3Bfc3RhdGVfc3RyKGNvcmVfaWYpKTsKKwkJZ290Z2N0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdvdGdjdGwpOworCisJCWlmIChjb3JlX2lmLT5vcF9zdGF0ZSA9PSBCX0hPU1QpIHsKKwkJCWNpbF9wY2Rfc3RhcnQoY29yZV9pZik7CisJCQljb3JlX2lmLT5vcF9zdGF0ZSA9IEJfUEVSSVBIRVJBTDsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIG5vdCBCX0hPU1QgYW5kIERldmljZSBITlAgc3RpbGwgc2V0LiBITlAKKwkJCSAqIERpZCBub3Qgc3VjY2VlZCEqLworCQkJaWYgKGdvdGdjdGwuYi5kZXZobnBlbikgeworCQkJCURXQ19ERUJVR1BMKERCR19BTlksICJTZXNzaW9uIEVuZCBEZXRlY3RlZFxuIik7CisJCQkJX19EV0NfRVJST1IoIkRldmljZSBOb3QgQ29ubmVjdGVkL1Jlc3BvbmRpbmchXG4iKTsKKwkJCX0KKworCQkJLyogSWYgU2Vzc2lvbiBFbmQgRGV0ZWN0ZWQgdGhlIEItQ2FibGUgaGFzCisJCQkgKiBiZWVuIGRpc2Nvbm5lY3RlZC4gKi8KKwkJCS8qIFJlc2V0IFBDRCBhbmQgR2FkZ2V0IGRyaXZlciB0byBhCisJCQkgKiBjbGVhbiBzdGF0ZS4gKi8KKwkJCWNvcmVfaWYtPmx4X3N0YXRlID0gRFdDX09UR19MMDsKKwkJCURXQ19TUElOVU5MT0NLKGNvcmVfaWYtPmxvY2spOworCQkJY2lsX3BjZF9zdG9wKGNvcmVfaWYpOworCQkJRFdDX1NQSU5MT0NLKGNvcmVfaWYtPmxvY2spOworCisJCQlpZiAoY29yZV9pZi0+YWRwX2VuYWJsZSkgeworCQkJCWlmIChjb3JlX2lmLT5wb3dlcl9kb3duID09IDIpIHsKKwkJCQkJZ3B3cmRuLmQzMiA9IDA7CisJCQkJCWdwd3Jkbi5iLnB3cmRuc3d0Y2ggPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgY29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkJIGdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJCQkJfQorCisJCQkJZ3B3cmRuLmQzMiA9IDA7CisJCQkJZ3B3cmRuLmIucG11aW50c2VsID0gMTsKKwkJCQlncHdyZG4uYi5wbXVhY3R2ID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBncHdyZG4sIDAsIGdwd3Jkbi5kMzIpOworCisJCQkJZHdjX290Z19hZHBfc2Vuc2Vfc3RhcnQoY29yZV9pZik7CisJCQl9CisJCX0KKworCQlnb3RnY3RsLmQzMiA9IDA7CisJCWdvdGdjdGwuYi5kZXZobnBlbiA9IDE7CisJCURXQ19NT0RJRllfUkVHMzIoJmdsb2JhbF9yZWdzLT5nb3RnY3RsLCBnb3RnY3RsLmQzMiwgMCk7CisJfQorCWlmIChnb3RnaW50LmIuc2VzcmVxc3Vjc3RzY2huZykgeworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiICsrT1RHIEludGVycnVwdDogIgorCQkJICAgICJTZXNzaW9uIFJlcWV1c3QgU3VjY2VzcyBTdGF0dXMgQ2hhbmdlKytcbiIpOworCQlnb3RnY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z290Z2N0bCk7CisJCWlmIChnb3RnY3RsLmIuc2VzcmVxc2NzKSB7CisKKwkJCWlmICgoY29yZV9pZi0+Y29yZV9wYXJhbXMtPnBoeV90eXBlID09CisJCQkgICAgIERXQ19QSFlfVFlQRV9QQVJBTV9GUykgJiYgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5pMmNfZW5hYmxlKSkgeworCQkJCWNvcmVfaWYtPnNycF9zdWNjZXNzID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJRFdDX1NQSU5VTkxPQ0soY29yZV9pZi0+bG9jayk7CisJCQkJY2lsX3BjZF9yZXN1bWUoY29yZV9pZik7CisJCQkJRFdDX1NQSU5MT0NLKGNvcmVfaWYtPmxvY2spOworCQkJCS8qIENsZWFyIFNlc3Npb24gUmVxdWVzdCAqLworCQkJCWdvdGdjdGwuZDMyID0gMDsKKwkJCQlnb3RnY3RsLmIuc2VzcmVxID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZnbG9iYWxfcmVncy0+Z290Z2N0bCwKKwkJCQkJCSBnb3RnY3RsLmQzMiwgMCk7CisJCQl9CisJCX0KKwl9CisJaWYgKGdvdGdpbnQuYi5oc3RuZWdzdWNzdHNjaG5nKSB7CisJCS8qIFByaW50IHN0YXRlbWVudHMgZHVyaW5nIHRoZSBITlAgaW50ZXJydXB0IGhhbmRsaW5nCisJCSAqIGNhbiBjYXVzZSBpdCB0byBmYWlsLiovCisJCWdvdGdjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nb3RnY3RsKTsKKwkJaWYgKGdvdGdjdGwuYi5oc3RuZWdzY3MpIHsKKwkJCWlmIChkd2Nfb3RnX2lzX2hvc3RfbW9kZShjb3JlX2lmKSkgeworCQkJCWNvcmVfaWYtPm9wX3N0YXRlID0gQl9IT1NUOworCQkJCS8qCisJCQkJICogTmVlZCB0byBkaXNhYmxlIFNPRiBpbnRlcnJ1cHQgaW1tZWRpYXRlbHkuCisJCQkJICogV2hlbiBzd2l0Y2hpbmcgZnJvbSBkZXZpY2UgdG8gaG9zdCwgdGhlIFBDRAorCQkJCSAqIGludGVycnVwdCBoYW5kbGVyIHdvbid0IGhhbmRsZSB0aGUKKwkJCQkgKiBpbnRlcnJ1cHQgaWYgaG9zdCBtb2RlIGlzIGFscmVhZHkgc2V0LiBUaGUKKwkJCQkgKiBIQ0QgaW50ZXJydXB0IGhhbmRsZXIgd29uJ3QgZ2V0IGNhbGxlZCBpZgorCQkJCSAqIHRoZSBIQ0Qgc3RhdGUgaXMgSEFMVC4gVGhpcyBtZWFucyB0aGF0IHRoZQorCQkJCSAqIGludGVycnVwdCBkb2VzIG5vdCBnZXQgaGFuZGxlZCBhbmQgTGludXgKKwkJCQkgKiBjb21wbGFpbnMgbG91ZGx5LgorCQkJCSAqLworCQkJCWdpbnRtc2suZDMyID0gMDsKKwkJCQlnaW50bXNrLmIuc29maW50ciA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssCisJCQkJCQkgZ2ludG1zay5kMzIsIDApOworCQkJCS8qIENhbGwgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aCBzcGluIGxvY2sgcmVsZWFzZWQgKi8KKwkJCQlEV0NfU1BJTlVOTE9DSyhjb3JlX2lmLT5sb2NrKTsKKwkJCQljaWxfcGNkX3N0b3AoY29yZV9pZik7CisJCQkJLyoKKwkJCQkgKiBJbml0aWFsaXplIHRoZSBDb3JlIGZvciBIb3N0IG1vZGUuCisJCQkJICovCisJCQkJY2lsX2hjZF9zdGFydChjb3JlX2lmKTsKKwkJCQlEV0NfU1BJTkxPQ0soY29yZV9pZi0+bG9jayk7CisJCQkJY29yZV9pZi0+b3Bfc3RhdGUgPSBCX0hPU1Q7CisJCQl9CisJCX0gZWxzZSB7CisJCQlnb3RnY3RsLmQzMiA9IDA7CisJCQlnb3RnY3RsLmIuaG5wcmVxID0gMTsKKwkJCWdvdGdjdGwuYi5kZXZobnBlbiA9IDE7CisJCQlEV0NfTU9ESUZZX1JFRzMyKCZnbG9iYWxfcmVncy0+Z290Z2N0bCwgZ290Z2N0bC5kMzIsIDApOworCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkhOUCBGYWlsZWRcbiIpOworCQkJX19EV0NfRVJST1IoIkRldmljZSBOb3QgQ29ubmVjdGVkL1Jlc3BvbmRpbmdcbiIpOworCQl9CisJfQorCWlmIChnb3RnaW50LmIuaHN0bmVnZGV0KSB7CisJCS8qIFRoZSBkaXNjb25uZWN0IGludGVycnVwdCBpcyBzZXQgYXQgdGhlIHNhbWUgdGltZSBhcworCQkgKiBIb3N0IE5lZ290aWF0aW9uIERldGVjdGVkLiAgRHVyaW5nIHRoZSBtb2RlCisJCSAqIHN3aXRjaCBhbGwgaW50ZXJydXB0cyBhcmUgY2xlYXJlZCBzbyB0aGUgZGlzY29ubmVjdAorCQkgKiBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIG5vdCBnZXQgZXhlY3V0ZWQuCisJCSAqLworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiICsrT1RHIEludGVycnVwdDogIgorCQkJICAgICJIb3N0IE5lZ290aWF0aW9uIERldGVjdGVkKysgKCVzKVxuIiwKKwkJCSAgICAoZHdjX290Z19pc19ob3N0X21vZGUoY29yZV9pZikgPyAiSG9zdCIgOgorCQkJICAgICAiRGV2aWNlIikpOworCQlpZiAoZHdjX290Z19pc19kZXZpY2VfbW9kZShjb3JlX2lmKSkgeworCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwgImFfc3VzcGVuZC0+YV9wZXJpcGhlcmFsICglZClcbiIsCisJCQkJICAgIGNvcmVfaWYtPm9wX3N0YXRlKTsKKwkJCURXQ19TUElOVU5MT0NLKGNvcmVfaWYtPmxvY2spOworCQkJY2lsX2hjZF9kaXNjb25uZWN0KGNvcmVfaWYpOworCQkJY2lsX3BjZF9zdGFydChjb3JlX2lmKTsKKwkJCURXQ19TUElOTE9DSyhjb3JlX2lmLT5sb2NrKTsKKwkJCWNvcmVfaWYtPm9wX3N0YXRlID0gQV9QRVJJUEhFUkFMOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5lZWQgdG8gZGlzYWJsZSBTT0YgaW50ZXJydXB0IGltbWVkaWF0ZWx5LiBXaGVuCisJCQkgKiBzd2l0Y2hpbmcgZnJvbSBkZXZpY2UgdG8gaG9zdCwgdGhlIFBDRCBpbnRlcnJ1cHQKKwkJCSAqIGhhbmRsZXIgd29uJ3QgaGFuZGxlIHRoZSBpbnRlcnJ1cHQgaWYgaG9zdCBtb2RlIGlzCisJCQkgKiBhbHJlYWR5IHNldC4gVGhlIEhDRCBpbnRlcnJ1cHQgaGFuZGxlciB3b24ndCBnZXQKKwkJCSAqIGNhbGxlZCBpZiB0aGUgSENEIHN0YXRlIGlzIEhBTFQuIFRoaXMgbWVhbnMgdGhhdAorCQkJICogdGhlIGludGVycnVwdCBkb2VzIG5vdCBnZXQgaGFuZGxlZCBhbmQgTGludXgKKwkJCSAqIGNvbXBsYWlucyBsb3VkbHkuCisJCQkgKi8KKwkJCWdpbnRtc2suZDMyID0gMDsKKwkJCWdpbnRtc2suYi5zb2ZpbnRyID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCBnaW50bXNrLmQzMiwgMCk7CisJCQlEV0NfU1BJTlVOTE9DSyhjb3JlX2lmLT5sb2NrKTsKKwkJCWNpbF9wY2Rfc3RvcChjb3JlX2lmKTsKKwkJCWNpbF9oY2Rfc3RhcnQoY29yZV9pZik7CisJCQlEV0NfU1BJTkxPQ0soY29yZV9pZi0+bG9jayk7CisJCQljb3JlX2lmLT5vcF9zdGF0ZSA9IEFfSE9TVDsKKwkJfQorCX0KKwlpZiAoZ290Z2ludC5iLmFkZXZ0b3V0Y2huZykgeworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiICsrT1RHIEludGVycnVwdDogIgorCQkJICAgICJBLURldmljZSBUaW1lb3V0IENoYW5nZSsrXG4iKTsKKwl9CisJaWYgKGdvdGdpbnQuYi5kZWJkb25lKSB7CisJCURXQ19ERUJVR1BMKERCR19BTlksICIgKytPVEcgSW50ZXJydXB0OiAiICJEZWJvdW5jZSBEb25lKytcbiIpOworCX0KKworCS8qIENsZWFyIEdPVEdJTlQgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdvdGdpbnQsIGdvdGdpbnQuZDMyKTsKKworCXJldHVybiAxOworfQorCit2b2lkIHdfY29ubl9pZF9zdGF0dXNfY2hhbmdlKHZvaWQgKnApCit7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBwOworCXVpbnQzMl90IGNvdW50ID0gMDsKKwlnb3RnY3RsX2RhdGFfdCBnb3RnY3RsID0gey5kMzIgPSAwIH07CisKKwlnb3RnY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsKTsKKwlEV0NfREVCVUdQTChEQkdfQ0lMLCAiZ290Z2N0bD0lMHhcbiIsIGdvdGdjdGwuZDMyKTsKKwlEV0NfREVCVUdQTChEQkdfQ0lMLCAiZ290Z2N0bC5iLmNvbmlkc3RzPSVkXG4iLCBnb3RnY3RsLmIuY29uaWRzdHMpOworCisJLyogQi1EZXZpY2UgY29ubmVjdG9yIChEZXZpY2UgTW9kZSkgKi8KKwlpZiAoZ290Z2N0bC5iLmNvbmlkc3RzKSB7CisJCS8qIFdhaXQgZm9yIHN3aXRjaCB0byBkZXZpY2UgbW9kZS4gKi8KKwkJd2hpbGUgKCFkd2Nfb3RnX2lzX2RldmljZV9tb2RlKGNvcmVfaWYpKSB7CisJCQlEV0NfUFJJTlRGKCJXYWl0aW5nIGZvciBQZXJpcGhlcmFsIE1vZGUsIE1vZGU9JXNcbiIsCisJCQkJICAgKGR3Y19vdGdfaXNfaG9zdF9tb2RlKGNvcmVfaWYpID8gIkhvc3QiIDoKKwkJCQkgICAgIlBlcmlwaGVyYWwiKSk7CisJCQlkd2NfbWRlbGF5KDEwMCk7CisJCQlpZiAoKytjb3VudCA+IDEwMDAwKQorCQkJCWJyZWFrOworCQl9CisJCURXQ19BU1NFUlQoKytjb3VudCA8IDEwMDAwLAorCQkJICAgIkNvbm5lY3Rpb24gaWQgc3RhdHVzIGNoYW5nZSB0aW1lZCBvdXQiKTsKKwkJY29yZV9pZi0+b3Bfc3RhdGUgPSBCX1BFUklQSEVSQUw7CisJCWR3Y19vdGdfY29yZV9pbml0KGNvcmVfaWYpOworCQlkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhjb3JlX2lmKTsKKwkJY2lsX3BjZF9zdGFydChjb3JlX2lmKTsKKwl9IGVsc2UgeworCQkvKiBBLURldmljZSBjb25uZWN0b3IgKEhvc3QgTW9kZSkgKi8KKwkJd2hpbGUgKCFkd2Nfb3RnX2lzX2hvc3RfbW9kZShjb3JlX2lmKSkgeworCQkJRFdDX1BSSU5URigiV2FpdGluZyBmb3IgSG9zdCBNb2RlLCBNb2RlPSVzXG4iLAorCQkJCSAgIChkd2Nfb3RnX2lzX2hvc3RfbW9kZShjb3JlX2lmKSA/ICJIb3N0IiA6CisJCQkJICAgICJQZXJpcGhlcmFsIikpOworCQkJZHdjX21kZWxheSgxMDApOworCQkJaWYgKCsrY291bnQgPiAxMDAwMCkKKwkJCQlicmVhazsKKwkJfQorCQlEV0NfQVNTRVJUKCsrY291bnQgPCAxMDAwMCwKKwkJCSAgICJDb25uZWN0aW9uIGlkIHN0YXR1cyBjaGFuZ2UgdGltZWQgb3V0Iik7CisJCWNvcmVfaWYtPm9wX3N0YXRlID0gQV9IT1NUOworCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBDb3JlIGZvciBIb3N0IG1vZGUuCisJCSAqLworCQlkd2Nfb3RnX2NvcmVfaW5pdChjb3JlX2lmKTsKKwkJZHdjX290Z19lbmFibGVfZ2xvYmFsX2ludGVycnVwdHMoY29yZV9pZik7CisJCWNpbF9oY2Rfc3RhcnQoY29yZV9pZik7CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgQ29ubmVjdG9yIElEIFN0YXR1cyBDaGFuZ2UgSW50ZXJydXB0LiAgSXQKKyAqIHJlYWRzIHRoZSBPVEcgSW50ZXJydXB0IFJlZ2lzdGVyIChHT1RDVEwpIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMKKyAqIGlzIGEgRGV2aWNlIHRvIEhvc3QgTW9kZSB0cmFuc2l0aW9uIG9yIGEgSG9zdCBNb2RlIHRvIERldmljZQorICogVHJhbnNpdGlvbi4gCisgKgorICogVGhpcyBvbmx5IG9jY3VycyB3aGVuIHRoZSBjYWJsZSBpcyBjb25uZWN0ZWQvcmVtb3ZlZCBmcm9tIHRoZSBQSFkKKyAqIGNvbm5lY3Rvci4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqLworaW50MzJfdCBkd2Nfb3RnX2hhbmRsZV9jb25uX2lkX3N0YXR1c19jaGFuZ2VfaW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisKKwkvKgorCSAqIE5lZWQgdG8gZGlzYWJsZSBTT0YgaW50ZXJydXB0IGltbWVkaWF0ZWx5LiBJZiBzd2l0Y2hpbmcgZnJvbSBkZXZpY2UKKwkgKiB0byBob3N0LCB0aGUgUENEIGludGVycnVwdCBoYW5kbGVyIHdvbid0IGhhbmRsZSB0aGUgaW50ZXJydXB0IGlmCisJICogaG9zdCBtb2RlIGlzIGFscmVhZHkgc2V0LiBUaGUgSENEIGludGVycnVwdCBoYW5kbGVyIHdvbid0IGdldAorCSAqIGNhbGxlZCBpZiB0aGUgSENEIHN0YXRlIGlzIEhBTFQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgaW50ZXJydXB0IGRvZXMKKwkgKiBub3QgZ2V0IGhhbmRsZWQgYW5kIExpbnV4IGNvbXBsYWlucyBsb3VkbHkuCisJICovCisJZ2ludG1za19kYXRhX3QgZ2ludG1zayA9IHsuZDMyID0gMCB9OworCWdpbnRzdHNfZGF0YV90IGdpbnRzdHMgPSB7LmQzMiA9IDAgfTsKKworCWdpbnRtc2suYi5zb2ZpbnRyID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLCBnaW50bXNrLmQzMiwgMCk7CisKKwlEV0NfREVCVUdQTChEQkdfQ0lMLAorCQkgICAgIiArK0Nvbm5lY3RvciBJRCBTdGF0dXMgQ2hhbmdlIEludGVycnVwdCsrICAoJXMpXG4iLAorCQkgICAgKGR3Y19vdGdfaXNfaG9zdF9tb2RlKGNvcmVfaWYpID8gIkhvc3QiIDogIkRldmljZSIpKTsKKwkKKwlpZiAoY29yZV9pZi0+bG9jaykKKwkJRFdDX1NQSU5VTkxPQ0soY29yZV9pZi0+bG9jayk7CisKKwkvKgorCSAqIE5lZWQgdG8gc2NoZWR1bGUgYSB3b3JrLCBhcyB0aGVyZSBhcmUgcG9zc2libGUgREVMQVkgZnVuY3Rpb24gY2FsbHMKKwkgKiBSZWxlYXNlIGxvY2sgYmVmb3JlIHNjaGVkdWxpbmcgd29ya3EgYXMgaXQgaG9sZHMgc3BpbmxvY2sgZHVyaW5nIHNjaGVkdWxpbmcKKwkgKi8KKworCURXQ19XT1JLUV9TQ0hFRFVMRShjb3JlX2lmLT53cV9vdGcsIHdfY29ubl9pZF9zdGF0dXNfY2hhbmdlLAorCQkJICAgY29yZV9pZiwgImNvbm5lY3Rpb24gaWQgc3RhdHVzIGNoYW5nZSIpOworCWlmIChjb3JlX2lmLT5sb2NrKQorCQlEV0NfU1BJTkxPQ0soY29yZV9pZi0+bG9jayk7CisKKwkvKiBTZXQgZmxhZyBhbmQgY2xlYXIgaW50ZXJydXB0ICovCisJZ2ludHN0cy5iLmNvbmlkc3RzY2huZyA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzLCBnaW50c3RzLmQzMik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBUaGlzIGludGVycnVwdCBpbmRpY2F0ZXMgdGhhdCBhIGRldmljZSBpcyBpbml0aWF0aW5nIHRoZSBTZXNzaW9uCisgKiBSZXF1ZXN0IFByb3RvY29sIHRvIHJlcXVlc3QgdGhlIGhvc3QgdG8gdHVybiBvbiBidXMgcG93ZXIgc28gYSBuZXcKKyAqIHNlc3Npb24gY2FuIGJlZ2luLiBUaGUgaGFuZGxlciByZXNwb25kcyBieSB0dXJuaW5nIG9uIGJ1cyBwb3dlci4gSWYKKyAqIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgaXMgaW4gbG93IHBvd2VyIG1vZGUsIHRoZSBoYW5kbGVyIGJyaW5ncyB0aGUKKyAqIGNvbnRyb2xsZXIgb3V0IG9mIGxvdyBwb3dlciBtb2RlIGJlZm9yZSB0dXJuaW5nIG9uIGJ1cyBwb3dlci4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqLworaW50MzJfdCBkd2Nfb3RnX2hhbmRsZV9zZXNzaW9uX3JlcV9pbnRyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlnaW50c3RzX2RhdGFfdCBnaW50c3RzOworCisjaWZuZGVmIERXQ19IT1NUX09OTFkKKwlEV0NfREVCVUdQTChEQkdfQU5ZLCAiKytTZXNzaW9uIFJlcXVlc3QgSW50ZXJydXB0KytcbiIpOworCisJaWYgKGR3Y19vdGdfaXNfZGV2aWNlX21vZGUoY29yZV9pZikpIHsKKwkJRFdDX1BSSU5URigiU1JQOiBEZXZpY2UgbW9kZVxuIik7CisJfSBlbHNlIHsKKwkJaHBydDBfZGF0YV90IGhwcnQwOworCQlEV0NfUFJJTlRGKCJTUlA6IEhvc3QgbW9kZVxuIik7CisKKwkJLyogVHVybiBvbiB0aGUgcG9ydCBwb3dlciBiaXQuICovCisJCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwkJaHBydDAuYi5wcnRwd3IgPSAxOworCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisKKwkJLyogU3RhcnQgdGhlIENvbm5lY3Rpb24gdGltZXIuIFNvIGEgbWVzc2FnZSBjYW4gYmUgZGlzcGxheWVkCisJCSAqIGlmIGNvbm5lY3QgZG9lcyBub3Qgb2NjdXIgd2l0aGluIDEwIHNlY29uZHMuICovCisJCWNpbF9oY2Rfc2Vzc2lvbl9zdGFydChjb3JlX2lmKTsKKwl9CisjZW5kaWYKKworCS8qIENsZWFyIGludGVycnVwdCAqLworCWdpbnRzdHMuZDMyID0gMDsKKwlnaW50c3RzLmIuc2Vzc3JlcWludHIgPSAxOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgd193YWtldXBfZGV0ZWN0ZWQodm9pZCAqcCkKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IChkd2Nfb3RnX2NvcmVfaWZfdCAqKSBwOworCS8qCisJICogQ2xlYXIgdGhlIFJlc3VtZSBhZnRlciA3MG1zLiAoTmVlZCAyMCBtcyBtaW5pbXVtLiBVc2UgNzAgbXMKKwkgKiBzbyB0aGF0IE9QVCB0ZXN0cyBwYXNzIHdpdGggYWxsIFBIWXMpLgorCSAqLworCWhwcnQwX2RhdGFfdCBocHJ0MCA9IHsuZDMyID0gMCB9OworI2lmIDAKKwlwY2djY3RsX2RhdGFfdCBwY2djY3RsID0gey5kMzIgPSAwIH07CisJLyogUmVzdGFydCB0aGUgUGh5IENsb2NrICovCisJcGNnY2N0bC5iLnN0b3BwY2xrID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIHBjZ2NjdGwuZDMyLCAwKTsKKwlkd2NfdWRlbGF5KDEwKTsKKyNlbmRpZiAvLzAKKwlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIlJlc3VtZTogSFBSVDA9JTB4XG4iLCBocHJ0MC5kMzIpOworLy8gICAgICBkd2NfbWRlbGF5KDcwKTsKKwlocHJ0MC5iLnBydHJlcyA9IDA7CS8qIFJlc3VtZSAqLworCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKwlEV0NfREVCVUdQTChEQkdfQU5ZLCAiQ2xlYXIgUmVzdW1lOiBIUFJUMD0lMHhcbiIsCisJCSAgICBEV0NfUkVBRF9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCkpOworCisJY2lsX2hjZF9yZXN1bWUoY29yZV9pZik7CisKKwkvKiogQ2hhbmdlIHRvIEwwIHN0YXRlKi8KKwljb3JlX2lmLT5seF9zdGF0ZSA9IERXQ19PVEdfTDA7Cit9CisKKy8qKgorICogVGhpcyBpbnRlcnJ1cHQgaW5kaWNhdGVzIHRoYXQgdGhlIERXQ19vdGcgY29udHJvbGxlciBoYXMgZGV0ZWN0ZWQgYQorICogcmVzdW1lIG9yIHJlbW90ZSB3YWtldXAgc2VxdWVuY2UuIElmIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgaXMgaW4KKyAqIGxvdyBwb3dlciBtb2RlLCB0aGUgaGFuZGxlciBtdXN0IGJyaW5ncyB0aGUgY29udHJvbGxlciBvdXQgb2YgbG93CisgKiBwb3dlciBtb2RlLiBUaGUgY29udHJvbGxlciBhdXRvbWF0aWNhbGx5IGJlZ2lucyByZXN1bWUKKyAqIHNpZ25hbGluZy4gVGhlIGhhbmRsZXIgc2NoZWR1bGVzIGEgdGltZSB0byBzdG9wIHJlc3VtZSBzaWduYWxpbmcuCisgKi8KK2ludDMyX3QgZHdjX290Z19oYW5kbGVfd2FrZXVwX2RldGVjdGVkX2ludHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWdpbnRzdHNfZGF0YV90IGdpbnRzdHM7CisKKwlEV0NfREVCVUdQTChEQkdfQU5ZLAorCQkgICAgIisrUmVzdW1lIGFuZCBSZW1vdGUgV2FrZXVwIERldGVjdGVkIEludGVycnVwdCsrXG4iKTsKKworCURXQ19QUklOVEYoIiVzIGx4c3RhdGUgPSAlZFxuIiwgX19mdW5jX18sIGNvcmVfaWYtPmx4X3N0YXRlKTsKKworCWlmIChkd2Nfb3RnX2lzX2RldmljZV9tb2RlKGNvcmVfaWYpKSB7CisJCWRjdGxfZGF0YV90IGRjdGwgPSB7LmQzMiA9IDAgfTsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkRTVFM9MHglMHhcbiIsCisJCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJCSAgIGRldl9nbG9iYWxfcmVncy0+ZHN0cykpOworCQlpZiAoY29yZV9pZi0+bHhfc3RhdGUgPT0gRFdDX09UR19MMikgeworI2lmZGVmIFBBUlRJQUxfUE9XRVJfRE9XTgorCQkJaWYgKGNvcmVfaWYtPmh3Y2ZnNC5iLnBvd2VyX29wdGltaXopIHsKKwkJCQlwY2djY3RsX2RhdGFfdCBwb3dlciA9IHsuZDMyID0gMCB9OworCisJCQkJcG93ZXIuZDMyID0gRFdDX1JFQURfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCk7CisJCQkJRFdDX0RFQlVHUEwoREJHX0NJTCwgIlBDR0NDVEw9JTB4XG4iLAorCQkJCQkgICAgcG93ZXIuZDMyKTsKKworCQkJCXBvd2VyLmIuc3RvcHBjbGsgPSAwOworCQkJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCBwb3dlci5kMzIpOworCisJCQkJcG93ZXIuYi5wd3JjbG1wID0gMDsKKwkJCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCwgcG93ZXIuZDMyKTsKKworCQkJCXBvd2VyLmIucnN0cGR3bm1vZHVsZSA9IDA7CisJCQkJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIHBvd2VyLmQzMik7CisJCQl9CisjZW5kaWYKKwkJCS8qIENsZWFyIHRoZSBSZW1vdGUgV2FrZXVwIFNpZ25hbGluZyAqLworCQkJZGN0bC5iLnJtdHdrdXBzaWcgPSAxOworCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQkJIGRldl9nbG9iYWxfcmVncy0+ZGN0bCwgZGN0bC5kMzIsIDApOworCisJCQlEV0NfU1BJTlVOTE9DSyhjb3JlX2lmLT5sb2NrKTsKKwkJCWlmIChjb3JlX2lmLT5wY2RfY2IgJiYgY29yZV9pZi0+cGNkX2NiLT5yZXN1bWVfd2FrZXVwKSB7CisJCQkJY29yZV9pZi0+cGNkX2NiLT5yZXN1bWVfd2FrZXVwKGNvcmVfaWYtPnBjZF9jYi0+cCk7CisJCQl9CisJCQlEV0NfU1BJTkxPQ0soY29yZV9pZi0+bG9jayk7CisJCX0gZWxzZSB7CisJCQlnbHBtY2ZnX2RhdGFfdCBscG1jZmc7CisJCQlscG1jZmcuZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJCQlscG1jZmcuYi5oaXJkX3RocmVzICY9ICh+KDEgPDwgNCkpOworCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbHBtY2ZnLAorCQkJCQlscG1jZmcuZDMyKTsKKwkJfQorCQkvKiogQ2hhbmdlIHRvIEwwIHN0YXRlKi8KKwkJY29yZV9pZi0+bHhfc3RhdGUgPSBEV0NfT1RHX0wwOworCX0gZWxzZSB7CisJCWlmIChjb3JlX2lmLT5seF9zdGF0ZSAhPSBEV0NfT1RHX0wxKSB7CisJCQlwY2djY3RsX2RhdGFfdCBwY2djY3RsID0gey5kMzIgPSAwIH07CisKKwkJCS8qIFJlc3RhcnQgdGhlIFBoeSBDbG9jayAqLworCQkJcGNnY2N0bC5iLnN0b3BwY2xrID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCwgcGNnY2N0bC5kMzIsIDApOworCQkJRFdDX1RJTUVSX1NDSEVEVUxFKGNvcmVfaWYtPndrcF90aW1lciwgNzEpOworCQl9IGVsc2UgeworCQkJLyoqIENoYW5nZSB0byBMMCBzdGF0ZSovCisJCQljb3JlX2lmLT5seF9zdGF0ZSA9IERXQ19PVEdfTDA7CisJCX0KKwl9CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwlnaW50c3RzLmQzMiA9IDA7CisJZ2ludHN0cy5iLndrdXBpbnRyID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIGdpbnRzdHMuZDMyKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIFRoaXMgaW50ZXJydXB0IGluZGljYXRlcyB0aGF0IHRoZSBXYWtldXAgTG9naWMgaGFzIGRldGVjdGVkIGEKKyAqIERldmljZSBkaXNjb25uZWN0LgorICovCitzdGF0aWMgaW50MzJfdCBkd2Nfb3RnX2hhbmRsZV9wd3Jkbl9kaXNjb25uZWN0X2ludHIoZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYpCit7CisJZ3B3cmRuX2RhdGFfdCBncHdyZG4gPSB7IC5kMzIgPSAwIH07CisJZ3B3cmRuX2RhdGFfdCBncHdyZG5fdGVtcCA9IHsgLmQzMiA9IDAgfTsKKwlncHdyZG5fdGVtcC5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuKTsKKworCURXQ19QUklOVEYoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKworCWlmICghY29yZV9pZi0+aGliZXJuYXRpb25fc3VzcGVuZCkgeworCQlEV0NfUFJJTlRGKCJBbHJlYWR5IGV4aXRlZCBmcm9tIEhpYmVybmF0aW9uXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogU3dpdGNoIG9uIHRoZSB2b2x0YWdlIHRvIHRoZSBjb3JlICovCisJZ3B3cmRuLmIucHdyZG5zd3RjaCA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIFJlc2V0IHRoZSBjb3JlICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucHdyZG5yc3RuID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCWR3Y191ZGVsYXkoMTApOworCisJLyogRGlzYWJsZSBwb3dlciBjbGFtcHMqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnB3cmRuY2xtcCA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKworCS8qIFJlbW92ZSByZXNldCB0aGUgY29yZSBzaWduYWwgKi8KKwlncHdyZG4uZDMyID0gMDsKKwlncHdyZG4uYi5wd3JkbnJzdG4gPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJZHdjX3VkZWxheSgxMCk7CisKKwkvKiBEaXNhYmxlIFBNVSBpbnRlcnJ1cHQgKi8KKwlncHdyZG4uZDMyID0gMDsKKwlncHdyZG4uYi5wbXVpbnRzZWwgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisKKwljb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID0gMDsKKworCS8qIERpc2FibGUgUE1VICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCWlmIChncHdyZG5fdGVtcC5iLmlkc3RzKSB7CisJCWNvcmVfaWYtPm9wX3N0YXRlID0gQl9QRVJJUEhFUkFMOworCQlkd2Nfb3RnX2NvcmVfaW5pdChjb3JlX2lmKTsKKwkJZHdjX290Z19lbmFibGVfZ2xvYmFsX2ludGVycnVwdHMoY29yZV9pZik7CisJCWNpbF9wY2Rfc3RhcnQoY29yZV9pZik7CisJfSBlbHNlIHsKKwkJY29yZV9pZi0+b3Bfc3RhdGUgPSBBX0hPU1Q7CisJCWR3Y19vdGdfY29yZV9pbml0KGNvcmVfaWYpOworCQlkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhjb3JlX2lmKTsKKwkJY2lsX2hjZF9zdGFydChjb3JlX2lmKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBUaGlzIGludGVycnVwdCBpbmRpY2F0ZXMgdGhhdCB0aGUgV2FrZXVwIExvZ2ljIGhhcyBkZXRlY3RlZCBhCisgKiByZW1vdGUgd2FrZXVwIHNlcXVlbmNlLgorICovCitzdGF0aWMgaW50MzJfdCBkd2Nfb3RnX2hhbmRsZV9wd3Jkbl93YWtldXBfZGV0ZWN0ZWRfaW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZ3B3cmRuX2RhdGFfdCBncHdyZG4gPSB7LmQzMiA9IDAgfTsKKwlEV0NfREVCVUdQTChEQkdfQU5ZLAorCQkgICAgIisrUG93ZXJkb3duIFJlbW90ZSBXYWtldXAgRGV0ZWN0ZWQgSW50ZXJydXB0KytcbiIpOworCisJaWYgKCFjb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kKSB7CisJCURXQ19QUklOVEYoIkFscmVhZHkgZXhpdGVkIGZyb20gSGliZXJuYXRpb25cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlncHdyZG4uZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3Jkbik7CisJaWYgKGdwd3Jkbi5iLmlkc3RzKSB7CS8vIERldmljZSBNb2RlCisJCWlmICgoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKQorCQkgICAgJiYgKGNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPT0gMSkpIHsKKwkJCWR3Y19vdGdfZGV2aWNlX2hpYmVybmF0aW9uX3Jlc3RvcmUoY29yZV9pZiwgMCwgMCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGNvcmVfaWYtPnBvd2VyX2Rvd24gPT0gMikKKwkJICAgICYmIChjb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID09IDEpKSB7CisJCQlkd2Nfb3RnX2hvc3RfaGliZXJuYXRpb25fcmVzdG9yZShjb3JlX2lmLCAxLCAwKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludDMyX3QgZHdjX290Z19oYW5kbGVfcHdyZG5faWRzdHNfY2hhbmdlKGR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYpCit7CisJZ3B3cmRuX2RhdGFfdCBncHdyZG4gPSB7LmQzMiA9IDAgfTsKKwlncHdyZG5fZGF0YV90IGdwd3Jkbl90ZW1wID0gey5kMzIgPSAwIH07CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBvdGdfZGV2LT5jb3JlX2lmOworCisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwlncHdyZG5fdGVtcC5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuKTsKKwlpZiAoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKQorCXsJCQorCQlpZiAoIWNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQpIHsKKwkJCURXQ19QUklOVEYoIkFscmVhZHkgZXhpdGVkIGZyb20gSGliZXJuYXRpb25cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkV4aXQgZnJvbSBoaWJlcm5hdGlvbiBvbiBJRCBzdHMgY2hhbmdlXG4iKTsKKwkJLyogU3dpdGNoIG9uIHRoZSB2b2x0YWdlIHRvIHRoZSBjb3JlICovCisJCWdwd3Jkbi5iLnB3cmRuc3d0Y2ggPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCQlkd2NfdWRlbGF5KDEwKTsKKworCQkvKiBSZXNldCB0aGUgY29yZSAqLworCQlncHdyZG4uZDMyID0gMDsKKwkJZ3B3cmRuLmIucHdyZG5yc3RuID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwkJZHdjX3VkZWxheSgxMCk7CisKKwkJLyogRGlzYWJsZSBwb3dlciBjbGFtcHMgKi8KKwkJZ3B3cmRuLmQzMiA9IDA7CisJCWdwd3Jkbi5iLnB3cmRuY2xtcCA9IDE7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisKKwkJLyogUmVtb3ZlIHJlc2V0IHRoZSBjb3JlIHNpZ25hbCAqLworCQlncHdyZG4uZDMyID0gMDsKKwkJZ3B3cmRuLmIucHdyZG5yc3RuID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwkJZHdjX3VkZWxheSgxMCk7CisKKwkJLyogRGlzYWJsZSBQTVUgaW50ZXJydXB0ICovCisJCWdwd3Jkbi5kMzIgPSAwOworCQlncHdyZG4uYi5wbXVpbnRzZWwgPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCisJCS8qSW5kaWNhdGVzIHRoYXQgd2UgYXJlIGV4aXRpbmcgZnJvbSBoaWJlcm5hdGlvbiAqLworCQljb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID0gMDsKKworCQkvKiBEaXNhYmxlIFBNVSAqLworCQlncHdyZG4uZDMyID0gMDsKKwkJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJCWR3Y191ZGVsYXkoMTApOworCisJCWdwd3Jkbi5kMzIgPSBjb3JlX2lmLT5ncl9iYWNrdXAtPmdwd3Jkbl9sb2NhbDsKKwkJaWYgKGdwd3Jkbi5iLmRpc192YnVzID09IDEpIHsKKwkJCWdwd3Jkbi5kMzIgPSAwOworCQkJZ3B3cmRuLmIuZGlzX3ZidXMgPSAxOworCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwkJfQorCisJCWlmIChncHdyZG5fdGVtcC5iLmlkc3RzKSB7CisJCQljb3JlX2lmLT5vcF9zdGF0ZSA9IEJfUEVSSVBIRVJBTDsKKwkJCWR3Y19vdGdfY29yZV9pbml0KGNvcmVfaWYpOworCQkJZHdjX290Z19lbmFibGVfZ2xvYmFsX2ludGVycnVwdHMoY29yZV9pZik7CisJCQljaWxfcGNkX3N0YXJ0KGNvcmVfaWYpOworCQl9IGVsc2UgeworCQkJY29yZV9pZi0+b3Bfc3RhdGUgPSBBX0hPU1Q7CisJCQlkd2Nfb3RnX2NvcmVfaW5pdChjb3JlX2lmKTsKKwkJCWR3Y19vdGdfZW5hYmxlX2dsb2JhbF9pbnRlcnJ1cHRzKGNvcmVfaWYpOworCQkJY2lsX2hjZF9zdGFydChjb3JlX2lmKTsKKwkJfQorCX0KKworCWlmIChjb3JlX2lmLT5hZHBfZW5hYmxlKQorCXsKKwkJdWludDhfdCBpc19ob3N0ID0gMDsKKwkJRFdDX1NQSU5VTkxPQ0soY29yZV9pZi0+bG9jayk7CisJCS8qIENoYW5nZSB0aGUgY29yZV9pZidzIGxvY2sgdG8gaGNkL3BjZCBsb2NrIGRlcGVuZCBvbiBtb2RlPyAqLworI2lmbmRlZiBEV0NfSE9TVF9PTkxZCQkKKwkJaWYgKGdwd3Jkbl90ZW1wLmIuaWRzdHMpCisJCQljb3JlX2lmLT5sb2NrID0gb3RnX2Rldi0+cGNkLT5sb2NrOworI2VuZGlmCisjaWZuZGVmIERXQ19ERVZJQ0VfT05MWQorCQlpZiAoIWdwd3Jkbl90ZW1wLmIuaWRzdHMpIHsKKwkJCQljb3JlX2lmLT5sb2NrID0gb3RnX2Rldi0+aGNkLT5sb2NrOwkKKwkJCQlpc19ob3N0ID0gMTsKKwkJfQorI2VuZGlmCisJCURXQ19QUklOVEYoIlJFU1RBUlQgQURQXG4iKTsKKwkJaWYgKGNvcmVfaWYtPmFkcC5wcm9iZV9lbmFibGVkKQkJCisJCQlkd2Nfb3RnX2FkcF9wcm9iZV9zdG9wKGNvcmVfaWYpOworCQlpZiAoY29yZV9pZi0+YWRwLnNlbnNlX2VuYWJsZWQpCQkKKwkJCWR3Y19vdGdfYWRwX3NlbnNlX3N0b3AoY29yZV9pZik7CisJCWlmIChjb3JlX2lmLT5hZHAuc2Vuc2VfdGltZXJfc3RhcnRlZCkJCQorCQkJRFdDX1RJTUVSX0NBTkNFTChjb3JlX2lmLT5hZHAuc2Vuc2VfdGltZXIpOworCQlpZiAoY29yZV9pZi0+YWRwLnZidXNvbl90aW1lcl9zdGFydGVkKQkJCisJCQlEV0NfVElNRVJfQ0FOQ0VMKGNvcmVfaWYtPmFkcC52YnVzb25fdGltZXIpOworCQljb3JlX2lmLT5hZHAucHJvYmVfdGltZXJfdmFsdWVzWzBdID0gLTE7CisJCWNvcmVfaWYtPmFkcC5wcm9iZV90aW1lcl92YWx1ZXNbMV0gPSAtMTsKKwkJY29yZV9pZi0+YWRwLnNlbnNlX3RpbWVyX3N0YXJ0ZWQgPSAwOworCQljb3JlX2lmLT5hZHAudmJ1c29uX3RpbWVyX3N0YXJ0ZWQgPSAwOworCQljb3JlX2lmLT5hZHAucHJvYmVfY291bnRlciA9IDA7CisJCWNvcmVfaWYtPmFkcC5ncHdyZG4gPSAwOworCQkKKwkJLyogRGlzYWJsZSBQTVUgYW5kIHJlc3RhcnQgQURQICovCisJCWdwd3Jkbl90ZW1wLmQzMiA9IDA7CisJCWdwd3Jkbl90ZW1wLmIucG11YWN0diA9IDE7CisJCWdwd3Jkbl90ZW1wLmIucG11aW50c2VsID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwkJRFdDX1BSSU5URigiQ2hlY2sgcG9pbnQgMVxuIik7CisJCWR3Y19tZGVsYXkoMTEwKTsKKwkJZHdjX290Z19hZHBfc3RhcnQoY29yZV9pZiwgaXNfaG9zdCk7CisJCURXQ19TUElOTE9DSyhjb3JlX2lmLT5sb2NrKTsKKwl9CisJCisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludDMyX3QgZHdjX290Z19oYW5kbGVfcHdyZG5fc2Vzc2lvbl9jaGFuZ2UoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuID0gey5kMzIgPSAwIH07CisJaW50MzJfdCBvdGdfY2FwX3BhcmFtID0gY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z19jYXA7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKworCWdwd3Jkbi5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuKTsKKwlpZiAoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKSB7CisJCWlmICghY29yZV9pZi0+aGliZXJuYXRpb25fc3VzcGVuZCkgeworCQkJRFdDX1BSSU5URigiQWxyZWFkeSBleGl0ZWQgZnJvbSBIaWJlcm5hdGlvblxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCWlmICgob3RnX2NhcF9wYXJhbSAhPSBEV0NfT1RHX0NBUF9QQVJBTV9ITlBfU1JQX0NBUEFCTEUgfHwKKwkJCSBvdGdfY2FwX3BhcmFtICE9IERXQ19PVEdfQ0FQX1BBUkFNX1NSUF9PTkxZX0NBUEFCTEUpICYmCisJCQlncHdyZG4uYi5ic2Vzc3ZsZCA9PSAwKSB7CisJCQkvKiBTYXZlIGdwd3JkbiByZWdpc3RlciBmb3IgZnVydGhlciB1c2FnZSBpZiBzdHNjaG5nIGludGVycnVwdCAqLworCQkJY29yZV9pZi0+Z3JfYmFja3VwLT5ncHdyZG5fbG9jYWwgPQorCQkJCURXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4pOworCQkJLypFeGl0IGZyb20gSVNSIGFuZCB3YWl0IGZvciBzdHNjaG5nIGludGVycnVwdCB3aXRoIGJzZXNzdmxkID0gMSAqLworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBTd2l0Y2ggb24gdGhlIHZvbHRhZ2UgdG8gdGhlIGNvcmUgKi8KKwkJZ3B3cmRuLmQzMiA9IDA7CisJCWdwd3Jkbi5iLnB3cmRuc3d0Y2ggPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCQlkd2NfdWRlbGF5KDEwKTsKKworCQkvKiBSZXNldCB0aGUgY29yZSAqLworCQlncHdyZG4uZDMyID0gMDsKKwkJZ3B3cmRuLmIucHdyZG5yc3RuID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwkJZHdjX3VkZWxheSgxMCk7CisKKwkJLyogRGlzYWJsZSBwb3dlciBjbGFtcHMgKi8KKwkJZ3B3cmRuLmQzMiA9IDA7CisJCWdwd3Jkbi5iLnB3cmRuY2xtcCA9IDE7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisKKwkJLyogUmVtb3ZlIHJlc2V0IHRoZSBjb3JlIHNpZ25hbCAqLworCQlncHdyZG4uZDMyID0gMDsKKwkJZ3B3cmRuLmIucHdyZG5yc3RuID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwkJZHdjX3VkZWxheSgxMCk7CisKKwkJLyogRGlzYWJsZSBQTVUgaW50ZXJydXB0ICovCisJCWdwd3Jkbi5kMzIgPSAwOworCQlncHdyZG4uYi5wbXVpbnRzZWwgPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCQlkd2NfdWRlbGF5KDEwKTsKKworCQkvKkluZGljYXRlcyB0aGF0IHdlIGFyZSBleGl0aW5nIGZyb20gaGliZXJuYXRpb24gKi8KKwkJY29yZV9pZi0+aGliZXJuYXRpb25fc3VzcGVuZCA9IDA7CisKKwkJLyogRGlzYWJsZSBQTVUgKi8KKwkJZ3B3cmRuLmQzMiA9IDA7CisJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCQlkd2NfdWRlbGF5KDEwKTsKKworCQljb3JlX2lmLT5vcF9zdGF0ZSA9IEJfUEVSSVBIRVJBTDsKKwkJZHdjX290Z19jb3JlX2luaXQoY29yZV9pZik7CisJCWR3Y19vdGdfZW5hYmxlX2dsb2JhbF9pbnRlcnJ1cHRzKGNvcmVfaWYpOworCQljaWxfcGNkX3N0YXJ0KGNvcmVfaWYpOworCisJCWlmIChvdGdfY2FwX3BhcmFtID09IERXQ19PVEdfQ0FQX1BBUkFNX0hOUF9TUlBfQ0FQQUJMRSB8fAorCQkJb3RnX2NhcF9wYXJhbSA9PSBEV0NfT1RHX0NBUF9QQVJBTV9TUlBfT05MWV9DQVBBQkxFKSB7CisJCQkvKgorCQkJICogSW5pdGlhdGUgU1JQIGFmdGVyIGluaXRpYWwgQURQIHByb2JlLgorCQkJICovCisJCQlkd2Nfb3RnX2luaXRpYXRlX3NycChjb3JlX2lmKTsJCisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKy8qKgorICogVGhpcyBpbnRlcnJ1cHQgaW5kaWNhdGVzIHRoYXQgdGhlIFdha2V1cCBMb2dpYyBoYXMgZGV0ZWN0ZWQgYQorICogc3RhdHVzIGNoYW5nZSBlaXRoZXIgb24gSURESUcgb3IgQlNlc3NWbGQuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBkd2Nfb3RnX2hhbmRsZV9wd3Jkbl9zdHNjaG5nX2ludHIoZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldikKK3sKKwlpbnQgcmV0dmFsOworCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuID0gey5kMzIgPSAwIH07CisJZ3B3cmRuX2RhdGFfdCBncHdyZG5fdGVtcCA9IHsuZDMyID0gMCB9OworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gb3RnX2Rldi0+Y29yZV9pZjsKKworCURXQ19QUklOVEYoIiVzIGNhbGxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkKKwlpZiAoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKSB7CisJCWlmIChjb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kIDw9IDApIHsKKwkJCURXQ19QUklOVEYoIkFscmVhZHkgZXhpdGVkIGZyb20gSGliZXJuYXRpb25cbiIpOworCQkJcmV0dXJuIDE7CisJCX0gZWxzZQorCQkJZ3B3cmRuX3RlbXAuZDMyID0gY29yZV9pZi0+Z3JfYmFja3VwLT5ncHdyZG5fbG9jYWw7CisKKwl9IGVsc2UgeworCQlncHdyZG5fdGVtcC5kMzIgPSBjb3JlX2lmLT5hZHAuZ3B3cmRuOworCX0KKworCWdwd3Jkbi5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuKTsKKwkKKwlpZiAoZ3B3cmRuLmIuaWRzdHMgXiBncHdyZG5fdGVtcC5iLmlkc3RzKSB7CisJCXJldHZhbCA9IGR3Y19vdGdfaGFuZGxlX3B3cmRuX2lkc3RzX2NoYW5nZShvdGdfZGV2KTsKKwl9IGVsc2UgaWYgKGdwd3Jkbi5iLmJzZXNzdmxkIF4gZ3B3cmRuX3RlbXAuYi5ic2Vzc3ZsZCkgeworCQlyZXR2YWwgPSBkd2Nfb3RnX2hhbmRsZV9wd3Jkbl9zZXNzaW9uX2NoYW5nZShjb3JlX2lmKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFRoaXMgaW50ZXJydXB0IGluZGljYXRlcyB0aGF0IHRoZSBXYWtldXAgTG9naWMgaGFzIGRldGVjdGVkIGEKKyAqIFNSUC4KKyAqLworc3RhdGljIGludDMyX3QgZHdjX290Z19oYW5kbGVfcHdyZG5fc3JwX2ludHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuID0gey5kMzIgPSAwIH07CisKKwlEV0NfUFJJTlRGKCIlcyBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIWNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQpIHsKKwkJRFdDX1BSSU5URigiQWxyZWFkeSBleGl0ZWQgZnJvbSBIaWJlcm5hdGlvblxuIik7CisJCXJldHVybiAxOworCX0KKyNpZmRlZiBEV0NfREVWX1NSUENBUAorCWlmIChjb3JlX2lmLT5wd3Jvbl90aW1lcl9zdGFydGVkKSB7CisJCWNvcmVfaWYtPnB3cm9uX3RpbWVyX3N0YXJ0ZWQgPSAwOworCQlEV0NfVElNRVJfQ0FOQ0VMKGNvcmVfaWYtPnB3cm9uX3RpbWVyKTsKKwl9CisjZW5kaWYKKworCS8qIFN3aXRjaCBvbiB0aGUgdm9sdGFnZSB0byB0aGUgY29yZSAqLworCWdwd3Jkbi5iLnB3cmRuc3d0Y2ggPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJZHdjX3VkZWxheSgxMCk7CisKKwkvKiBSZXNldCB0aGUgY29yZSAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnB3cmRucnN0biA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIERpc2FibGUgcG93ZXIgY2xhbXBzICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucHdyZG5jbG1wID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCisJLyogUmVtb3ZlIHJlc2V0IHRoZSBjb3JlIHNpZ25hbCAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnB3cmRucnN0biA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIERpc2FibGUgUE1VIGludGVycnVwdCAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnBtdWludHNlbCA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKworCS8qIEluZGljYXRlcyB0aGF0IHdlIGFyZSBleGl0aW5nIGZyb20gaGliZXJuYXRpb24gKi8KKwljb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID0gMDsKKworCS8qIERpc2FibGUgUE1VICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIFByb2dyYW1tIERpc2FibGUgVkJVUyB0byAwICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIuZGlzX3ZidXMgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisKKwkvKkluaXRpYWxpemUgdGhlIGNvcmUgYXMgSG9zdCAqLworCWNvcmVfaWYtPm9wX3N0YXRlID0gQV9IT1NUOworCWR3Y19vdGdfY29yZV9pbml0KGNvcmVfaWYpOworCWR3Y19vdGdfZW5hYmxlX2dsb2JhbF9pbnRlcnJ1cHRzKGNvcmVfaWYpOworCWNpbF9oY2Rfc3RhcnQoY29yZV9pZik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqIFRoaXMgaW50ZXJydXB0IGluZGljYXRlcyB0aGF0IHJlc3RvcmUgY29tbWFuZCBhZnRlciBIaWJlcm5hdGlvbgorICogd2FzIGNvbXBsZXRlZCBieSB0aGUgY29yZS4gKi8KK2ludDMyX3QgZHdjX290Z19oYW5kbGVfcmVzdG9yZV9kb25lX2ludHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCXBjZ2NjdGxfZGF0YV90IHBjZ2NjdGw7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIisrUmVzdG9yZSBEb25lIEludGVycnVwdCsrXG4iKTsKKworCS8vVE9ETyBEZS1hc3NlcnQgcmVzdG9yZSBzaWduYWwuIDguYQorCXBjZ2NjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCk7CisJaWYgKHBjZ2NjdGwuYi5yZXN0b3JlbW9kZSA9PSAxKSB7CisJCWdpbnRtc2tfZGF0YV90IGdpbnRtc2sgPSB7LmQzMiA9IDAgfTsKKwkJLyoKKwkJICogSWYgcmVzdG9yZSBtb2RlIGlzIFJlbW90ZSBXYWtldXAsCisJCSAqIHVubWFzayBSZW1vdGUgV2FrZXVwIGludGVycnVwdC4KKwkJICovCisJCWdpbnRtc2suYi53a3VwaW50ciA9IDE7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssCisJCQkJIDAsIGdpbnRtc2suZDMyKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBUaGlzIGludGVycnVwdCBpbmRpY2F0ZXMgdGhhdCBhIGRldmljZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgZnJvbQorICogdGhlIHJvb3QgcG9ydC4KKyAqLworaW50MzJfdCBkd2Nfb3RnX2hhbmRsZV9kaXNjb25uZWN0X2ludHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKQoreworCWdpbnRzdHNfZGF0YV90IGdpbnRzdHM7CisKKwlEV0NfREVCVUdQTChEQkdfQU5ZLCAiKytEaXNjb25uZWN0IERldGVjdGVkIEludGVycnVwdCsrICglcykgJXNcbiIsCisJCSAgICAoZHdjX290Z19pc19ob3N0X21vZGUoY29yZV9pZikgPyAiSG9zdCIgOiAiRGV2aWNlIiksCisJCSAgICBvcF9zdGF0ZV9zdHIoY29yZV9pZikpOworCisvKiogQHRvZG8gQ29uc29saWRhdGUgdGhpcyBpZiBzdGF0ZW1lbnQuICovCisjaWZuZGVmIERXQ19IT1NUX09OTFkKKwlpZiAoY29yZV9pZi0+b3Bfc3RhdGUgPT0gQl9IT1NUKSB7CisJCS8qIElmIGluIGRldmljZSBtb2RlIERpc2Nvbm5lY3QgYW5kIHN0b3AgdGhlIEhDRCwgdGhlbgorCQkgKiBzdGFydCB0aGUgUENELiAqLworCQlEV0NfU1BJTlVOTE9DSyhjb3JlX2lmLT5sb2NrKTsKKwkJY2lsX2hjZF9kaXNjb25uZWN0KGNvcmVfaWYpOworCQljaWxfcGNkX3N0YXJ0KGNvcmVfaWYpOworCQlEV0NfU1BJTkxPQ0soY29yZV9pZi0+bG9jayk7CisJCWNvcmVfaWYtPm9wX3N0YXRlID0gQl9QRVJJUEhFUkFMOworCX0gZWxzZSBpZiAoZHdjX290Z19pc19kZXZpY2VfbW9kZShjb3JlX2lmKSkgeworCQlnb3RnY3RsX2RhdGFfdCBnb3RnY3RsID0gey5kMzIgPSAwIH07CisJCWdvdGdjdGwuZDMyID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsKTsKKwkJaWYgKGdvdGdjdGwuYi5oc3RzZXRobnBlbiA9PSAxKSB7CisJCQkvKiBEbyBub3RoaW5nLCBpZiBITlAgaW4gcHJvY2VzcyB0aGUgT1RHCisJCQkgKiBpbnRlcnJ1cHQgIkhvc3QgTmVnb3RpYXRpb24gRGV0ZWN0ZWQiCisJCQkgKiBpbnRlcnJ1cHQgd2lsbCBkbyB0aGUgbW9kZSBzd2l0Y2guCisJCQkgKi8KKwkJfSBlbHNlIGlmIChnb3RnY3RsLmIuZGV2aG5wZW4gPT0gMCkgeworCQkJLyogSWYgaW4gZGV2aWNlIG1vZGUgRGlzY29ubmVjdCBhbmQgc3RvcCB0aGUgSENELCB0aGVuCisJCQkgKiBzdGFydCB0aGUgUENELiAqLworCQkJRFdDX1NQSU5VTkxPQ0soY29yZV9pZi0+bG9jayk7CisJCQljaWxfaGNkX2Rpc2Nvbm5lY3QoY29yZV9pZik7CisJCQljaWxfcGNkX3N0YXJ0KGNvcmVfaWYpOworCQkJRFdDX1NQSU5MT0NLKGNvcmVfaWYtPmxvY2spOworCQkJY29yZV9pZi0+b3Bfc3RhdGUgPSBCX1BFUklQSEVSQUw7CisJCX0gZWxzZSB7CisJCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiIWFfcGVyaXBoZXJhbCAmJiAhZGV2aG5wZW5cbiIpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNvcmVfaWYtPm9wX3N0YXRlID09IEFfSE9TVCkgeworCQkJLyogQS1DYWJsZSBzdGlsbCBjb25uZWN0ZWQgYnV0IGRldmljZSBkaXNjb25uZWN0ZWQuICovCisJCQljaWxfaGNkX2Rpc2Nvbm5lY3QoY29yZV9pZik7CisJCQlpZiAoY29yZV9pZi0+YWRwX2VuYWJsZSkgeworCQkJCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuID0geyAuZDMyID0gMCB9OworCQkJCWNpbF9oY2Rfc3RvcChjb3JlX2lmKTsKKwkJCQkvKiBFbmFibGUgUG93ZXIgRG93biBMb2dpYyAqLworCQkJCWdwd3Jkbi5iLnBtdWludHNlbCA9IDE7CisJCQkJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwkJCQlkd2Nfb3RnX2FkcF9wcm9iZV9zdGFydChjb3JlX2lmKTsKKworCQkJCS8qIFBvd2VyIG9mZiB0aGUgY29yZSAqLworCQkJCWlmIChjb3JlX2lmLT5wb3dlcl9kb3duID09IDIpIHsKKwkJCQkJZ3B3cmRuLmQzMiA9IDA7CisJCQkJCWdwd3Jkbi5iLnB3cmRuc3d0Y2ggPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgY29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkJIGdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmCisJLyogQ2hhbmdlIHRvIEwzKE9GRikgc3RhdGUgKi8KKwljb3JlX2lmLT5seF9zdGF0ZSA9IERXQ19PVEdfTDM7CisKKwlnaW50c3RzLmQzMiA9IDA7CisJZ2ludHN0cy5iLmRpc2Nvbm5lY3QgPSAxOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCXJldHVybiAxOworfQorCisvKioKKyAqIFRoaXMgaW50ZXJydXB0IGluZGljYXRlcyB0aGF0IFNVU1BFTkQgc3RhdGUgaGFzIGJlZW4gZGV0ZWN0ZWQgb24KKyAqIHRoZSBVU0IuCisgKgorICogRm9yIEhOUCB0aGUgVVNCIFN1c3BlbmQgaW50ZXJydXB0IHNpZ25hbHMgdGhlIGNoYW5nZSBmcm9tCisgKiAiYV9wZXJpcGhlcmFsIiB0byAiYV9ob3N0Ii4KKyAqCisgKiBXaGVuIHBvd2VyIG1hbmFnZW1lbnQgaXMgZW5hYmxlZCB0aGUgY29yZSB3aWxsIGJlIHB1dCBpbiBsb3cgcG93ZXIKKyAqIG1vZGUuCisgKi8KK2ludDMyX3QgZHdjX290Z19oYW5kbGVfdXNiX3N1c3BlbmRfaW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZHN0c19kYXRhX3QgZHN0czsKKwlnaW50c3RzX2RhdGFfdCBnaW50c3RzOworCWRjZmdfZGF0YV90IGRjZmc7CisKKwlEV0NfREVCVUdQTChEQkdfQU5ZLCAiVVNCIFNVU1BFTkRcbiIpOworCisJaWYgKGR3Y19vdGdfaXNfZGV2aWNlX21vZGUoY29yZV9pZikpIHsKKwkJLyogQ2hlY2sgdGhlIERldmljZSBzdGF0dXMgcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBTdXNwZW5kCisJCSAqIHN0YXRlIGlzIGFjdGl2ZS4gKi8KKwkJZHN0cy5kMzIgPQorCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kc3RzKTsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkRTVFM9MHglMHhcbiIsIGRzdHMuZDMyKTsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkRTVFMuU3VzcGVuZCBTdGF0dXM9JWQgIgorCQkJICAgICJIV0NGRzQucG93ZXIgT3B0aW1pemU9JWRcbiIsCisJCQkgICAgZHN0cy5iLnN1c3BzdHMsIGNvcmVfaWYtPmh3Y2ZnNC5iLnBvd2VyX29wdGltaXopOworCisjaWZkZWYgUEFSVElBTF9QT1dFUl9ET1dOCisvKiogQHRvZG8gQWRkIGEgbW9kdWxlIHBhcmFtZXRlciBmb3IgcG93ZXIgbWFuYWdlbWVudC4gKi8KKworCQlpZiAoZHN0cy5iLnN1c3BzdHMgJiYgY29yZV9pZi0+aHdjZmc0LmIucG93ZXJfb3B0aW1peikgeworCQkJcGNnY2N0bF9kYXRhX3QgcG93ZXIgPSB7LmQzMiA9IDAgfTsKKwkJCURXQ19ERUJVR1BMKERCR19DSUwsICJzdXNwZW5kXG4iKTsKKworCQkJcG93ZXIuYi5wd3JjbG1wID0gMTsKKwkJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCBwb3dlci5kMzIpOworCisJCQlwb3dlci5iLnJzdHBkd25tb2R1bGUgPSAxOworCQkJRFdDX01PRElGWV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCAwLCBwb3dlci5kMzIpOworCisJCQlwb3dlci5iLnN0b3BwY2xrID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCwgMCwgcG93ZXIuZDMyKTsKKworCQl9IGVsc2UgeworCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwgImRpc2Nvbm5lY3Q/XG4iKTsKKwkJfQorI2VuZGlmCisJCS8qIFBDRCBjYWxsYmFjayBmb3Igc3VzcGVuZC4gUmVsZWFzZSB0aGUgbG9jayBpbnNpZGUgb2YgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwkJY2lsX3BjZF9zdXNwZW5kKGNvcmVfaWYpOworCQlpZiAoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKQorCQl7CisJCQlkY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGNmZyk7CisJCQlEV0NfREVCVUdQTChEQkdfQU5ZLCJseF9zdGF0ZSA9ICUwOHhcbiIsY29yZV9pZi0+bHhfc3RhdGUpOworCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwiIGRldmljZSBhZGRyZXNzID0gJTA4ZFxuIixkY2ZnLmIuZGV2YWRkcik7CisKKwkJCWlmIChjb3JlX2lmLT5seF9zdGF0ZSAhPSBEV0NfT1RHX0wzICYmIGRjZmcuYi5kZXZhZGRyKSB7CisJCQkJcGNnY2N0bF9kYXRhX3QgcGNnY2N0bCA9IHsuZDMyID0gMCB9OworCQkJCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuID0gey5kMzIgPSAwIH07CisJCQkJZ3VzYmNmZ19kYXRhX3QgZ3VzYmNmZyA9IHsuZDMyID0gMCB9OworCisJCQkJLyogQ2hhbmdlIHRvIEwyKHN1c3BlbmQpIHN0YXRlICovCisJCQkJY29yZV9pZi0+bHhfc3RhdGUgPSBEV0NfT1RHX0wyOworCisJCQkJLyogQ2xlYXIgaW50ZXJydXB0IGluIGdpbnRzdHMgKi8KKwkJCQlnaW50c3RzLmQzMiA9IDA7CisJCQkJZ2ludHN0cy5iLnVzYnN1c3BlbmQgPSAxOworCQkJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQlnaW50c3RzLCBnaW50c3RzLmQzMik7CisJCQkJRFdDX1BSSU5URigiU3RhcnQgb2YgaGliZXJuYXRpb24gY29tcGxldGVkXG4iKTsKKwkJCQlkd2Nfb3RnX3NhdmVfZ2xvYmFsX3JlZ3MoY29yZV9pZik7CisJCQkJZHdjX290Z19zYXZlX2Rldl9yZWdzKGNvcmVfaWYpOworCisJCQkJZ3VzYmNmZy5kMzIgPQorCQkJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkgICBndXNiY2ZnKTsKKwkJCQlpZiAoZ3VzYmNmZy5iLnVscGlfdXRtaV9zZWwgPT0gMSkgeworCQkJCQkvKiBVTFBJIGludGVyZmFjZSAqLworCQkJCQkvKiBTdXNwZW5kIHRoZSBQaHkgQ2xvY2sgKi8KKwkJCQkJcGNnY2N0bC5kMzIgPSAwOworCQkJCQlwY2djY3RsLmIuc3RvcHBjbGsgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIDAsCisJCQkJCQkJIHBjZ2NjdGwuZDMyKTsKKwkJCQkJZHdjX3VkZWxheSgxMCk7CisJCQkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgY29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkJIGdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogVVRNSSsgSW50ZXJmYWNlICovCisJCQkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgY29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkJIGdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJCQkJCWR3Y191ZGVsYXkoMTApOworCQkJCQlwY2djY3RsLmIuc3RvcHBjbGsgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIDAsCisJCQkJCQkJIHBjZ2NjdGwuZDMyKTsKKwkJCQkJZHdjX3VkZWxheSgxMCk7CisJCQkJfQorCisJCQkJLyogU2V0IGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgaW4gaGliZXJuYXRpb24gKi8KKwkJCQljb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID0gMTsKKwkJCQkvKiBFbmFibGUgaW50ZXJydXB0cyBmcm9tIHdha2UgdXAgbG9naWMgKi8KKwkJCQlncHdyZG4uZDMyID0gMDsKKwkJCQlncHdyZG4uYi5wbXVpbnRzZWwgPSAxOworCQkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPgorCQkJCQkJIGdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJCQkJZHdjX3VkZWxheSgxMCk7CisKKwkJCQkvKiBVbm1hc2sgZGV2aWNlIG1vZGUgaW50ZXJydXB0cyBpbiBHUFdSRE4gKi8KKwkJCQlncHdyZG4uZDMyID0gMDsKKwkJCQlncHdyZG4uYi5yc3RfZGV0X21zayA9IDE7CisJCQkJZ3B3cmRuLmIubG5zdGNobmdfbXNrID0gMTsKKwkJCQlncHdyZG4uYi5zdHNfY2huZ2ludF9tc2sgPSAxOworCQkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPgorCQkJCQkJIGdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJCQkJZHdjX3VkZWxheSgxMCk7CisKKwkJCQkvKiBFbmFibGUgUG93ZXIgRG93biBDbGFtcCAqLworCQkJCWdwd3Jkbi5kMzIgPSAwOworCQkJCWdwd3Jkbi5iLnB3cmRuY2xtcCA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkgZ3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwkJCQlkd2NfdWRlbGF5KDEwKTsKKworCQkJCS8qIFN3aXRjaCBvZmYgVkREICovCisJCQkJZ3B3cmRuLmQzMiA9IDA7CisJCQkJZ3B3cmRuLmIucHdyZG5zd3RjaCA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkgZ3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKworCQkJCS8qIFNhdmUgZ3B3cmRuIHJlZ2lzdGVyIGZvciBmdXJ0aGVyIHVzYWdlIGlmIHN0c2NobmcgaW50ZXJydXB0ICovCisJCQkJY29yZV9pZi0+Z3JfYmFja3VwLT5ncHdyZG5fbG9jYWwgPQorCQkJCQkJCURXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4pOworCQkJCURXQ19QUklOVEYoIkhpYmVybmF0aW9uIGNvbXBsZXRlZFxuIik7CisKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChjb3JlX2lmLT5vcF9zdGF0ZSA9PSBBX1BFUklQSEVSQUwpIHsKKwkJCURXQ19ERUJVR1BMKERCR19BTlksICJhX3BlcmlwaGVyYWwtPmFfaG9zdFxuIik7CisJCQkvKiBDbGVhciB0aGUgYV9wZXJpcGhlcmFsIGZsYWcsIGJhY2sgdG8gYV9ob3N0LiAqLworCQkJRFdDX1NQSU5VTkxPQ0soY29yZV9pZi0+bG9jayk7CisJCQljaWxfcGNkX3N0b3AoY29yZV9pZik7CisJCQljaWxfaGNkX3N0YXJ0KGNvcmVfaWYpOworCQkJRFdDX1NQSU5MT0NLKGNvcmVfaWYtPmxvY2spOworCQkJY29yZV9pZi0+b3Bfc3RhdGUgPSBBX0hPU1Q7CisJCX0KKwl9CisKKwkvKiBDaGFuZ2UgdG8gTDIoc3VzcGVuZCkgc3RhdGUgKi8KKwljb3JlX2lmLT5seF9zdGF0ZSA9IERXQ19PVEdfTDI7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwlnaW50c3RzLmQzMiA9IDA7CisJZ2ludHN0cy5iLnVzYnN1c3BlbmQgPSAxOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaGFkbGVzIExQTSB0cmFuc2FjdGlvbiByZWNlaXZlZCBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyBpbnQzMl90IGR3Y19vdGdfaGFuZGxlX2xwbV9pbnRyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlnbHBtY2ZnX2RhdGFfdCBscG1jZmc7CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKworCWlmICghY29yZV9pZi0+Y29yZV9wYXJhbXMtPmxwbV9lbmFibGUpIHsKKwkJRFdDX1BSSU5URigiVW5leHBlY3RlZCBMUE0gaW50ZXJydXB0XG4iKTsKKwl9CisKKwlscG1jZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdscG1jZmcpOworCURXQ19QUklOVEYoIkxQTSBjb25maWcgcmVnaXN0ZXIgPSAweCUwOHhcbiIsIGxwbWNmZy5kMzIpOworCisJaWYgKGR3Y19vdGdfaXNfaG9zdF9tb2RlKGNvcmVfaWYpKSB7CisJCWNpbF9oY2Rfc2xlZXAoY29yZV9pZik7CisJfSBlbHNlIHsKKwkJbHBtY2ZnLmIuaGlyZF90aHJlcyB8PSAoMSA8PCA0KTsKKwkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbHBtY2ZnLAorCQkJCWxwbWNmZy5kMzIpOworCX0KKworCS8qIEV4YW1pbmUgcHJ0X3NsZWVwX3N0cyBhZnRlciBUTDFUb2tlblRldHJ5IHBlcmlvZCBtYXggKDEwIHVzKSAqLworCWR3Y191ZGVsYXkoMTApOworCWxwbWNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJaWYgKGxwbWNmZy5iLnBydF9zbGVlcF9zdHMpIHsKKwkJLyogU2F2ZSB0aGUgY3VycmVudCBzdGF0ZSAqLworCQljb3JlX2lmLT5seF9zdGF0ZSA9IERXQ19PVEdfTDE7CisJfQorCisJLyogQ2xlYXIgaW50ZXJydXB0ICAqLworCWdpbnRzdHMuZDMyID0gMDsKKwlnaW50c3RzLmIubHBtdHJhbnJjdmQgPSAxOworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCXJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19VU0JfRFdDX09UR19MUE0gKi8KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIENvcmUgSW50ZXJydXB0IHJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGR3Y19vdGdfcmVhZF9jb21tb25faW50cihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZ2FoYmNmZ19kYXRhX3QgZ2FoYmNmZyA9IHsuZDMyID0gMCB9OworCWdpbnRzdHNfZGF0YV90IGdpbnRzdHM7CisJZ2ludG1za19kYXRhX3QgZ2ludG1zazsKKwlnaW50bXNrX2RhdGFfdCBnaW50bXNrX2NvbW1vbiA9IHsuZDMyID0gMCB9OworCWdpbnRtc2tfY29tbW9uLmIud2t1cGludHIgPSAxOworCWdpbnRtc2tfY29tbW9uLmIuc2Vzc3JlcWludHIgPSAxOworCWdpbnRtc2tfY29tbW9uLmIuY29uaWRzdHNjaG5nID0gMTsKKwlnaW50bXNrX2NvbW1vbi5iLm90Z2ludHIgPSAxOworCWdpbnRtc2tfY29tbW9uLmIubW9kZW1pc21hdGNoID0gMTsKKwlnaW50bXNrX2NvbW1vbi5iLmRpc2Nvbm5lY3QgPSAxOworCWdpbnRtc2tfY29tbW9uLmIudXNic3VzcGVuZCA9IDE7CisjaWZkZWYgQ09ORklHX1VTQl9EV0NfT1RHX0xQTQorCWdpbnRtc2tfY29tbW9uLmIubHBtdHJhbnJjdmQgPSAxOworI2VuZGlmCisJZ2ludG1za19jb21tb24uYi5yZXN0b3JlZG9uZSA9IDE7CisJLyoqIEB0b2RvOiBUaGUgcG9ydCBpbnRlcnJ1cHQgb2NjdXJzIHdoaWxlIGluIGRldmljZQorICAgICAgICAgKiBtb2RlLiBBZGRlZCBjb2RlIHRvIENJTCB0byBjbGVhciB0aGUgaW50ZXJydXB0IGZvciBub3chCisgICAgICAgICAqLworCWdpbnRtc2tfY29tbW9uLmIucG9ydGludHIgPSAxOworCisJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cyk7CisJZ2ludG1zay5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zayk7CisJZ2FoYmNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2FoYmNmZyk7CisKKyNpZmRlZiBERUJVRworCS8qIGlmIGFueSBjb21tb24gaW50ZXJydXB0cyBzZXQgKi8KKwlpZiAoZ2ludHN0cy5kMzIgJiBnaW50bXNrX2NvbW1vbi5kMzIpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0FOWSwgImdpbnRzdHM9JTA4eCAgZ2ludG1zaz0lMDh4XG4iLAorCQkJICAgIGdpbnRzdHMuZDMyLCBnaW50bXNrLmQzMik7CisJfQorI2VuZGlmCisJaWYgKGdhaGJjZmcuYi5nbGJsaW50cm1zaykJCisJCXJldHVybiAoKGdpbnRzdHMuZDMyICYgZ2ludG1zay5kMzIpICYgZ2ludG1za19jb21tb24uZDMyKTsKKwllbHNlCisJCXJldHVybiAwOworCit9CisKKy8qIE1BQ1JPIGZvciBjbGVhcmluZyBpbnRlcnVwdCBiaXRzIGluIEdQV1JETiByZWdpc3RlciAqLworI2RlZmluZSBDTEVBUl9HUFdSRE5fSU5UUihfX2NvcmVfaWYsX19pbnRyKSBcCitkbyB7IFwKKwkJZ3B3cmRuX2RhdGFfdCBncHdyZG4gPSB7LmQzMj0wfTsgXAorCQlncHdyZG4uYi5fX2ludHIgPSAxOyBcCisJCURXQ19NT0RJRllfUkVHMzIoJl9fY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBcCisJCTAsIGdwd3Jkbi5kMzIpOyBcCit9IHdoaWxlICgwKQorCisvKioKKyAqIENvbW1vbiBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKiBUaGUgY29tbW9uIGludGVycnVwdHMgYXJlIHRob3NlIHRoYXQgb2NjdXIgaW4gYm90aCBIb3N0IGFuZCBEZXZpY2UgbW9kZS4KKyAqIFRoaXMgaGFuZGxlciBoYW5kbGVzIHRoZSBmb2xsb3dpbmcgaW50ZXJydXB0czoKKyAqIC0gTW9kZSBNaXNtYXRjaCBJbnRlcnJ1cHQKKyAqIC0gRGlzY29ubmVjdCBJbnRlcnJ1cHQKKyAqIC0gT1RHIEludGVycnVwdAorICogLSBDb25uZWN0b3IgSUQgU3RhdHVzIENoYW5nZSBJbnRlcnJ1cHQKKyAqIC0gU2Vzc2lvbiBSZXF1ZXN0IEludGVycnVwdC4KKyAqIC0gUmVzdW1lIC8gUmVtb3RlIFdha2V1cCBEZXRlY3RlZCBJbnRlcnJ1cHQuCisgKiAtIExQTSBUcmFuc2FjdGlvbiBSZWNlaXZlZCBJbnRlcnJ1cHQKKyAqIC0gQURQIFRyYW5zYWN0aW9uIFJlY2VpdmVkIEludGVycnVwdAorICoKKyAqLworaW50MzJfdCBkd2Nfb3RnX2hhbmRsZV9jb21tb25faW50cih2b2lkICpkZXYpCit7CisJaW50IHJldHZhbCA9IDA7CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKwlncHdyZG5fZGF0YV90IGdwd3JkbiA9IHsuZDMyID0gMCB9OworCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBkZXY7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBvdGdfZGV2LT5jb3JlX2lmOworCWdwd3Jkbi5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuKTsKKwlpZiAoZHdjX290Z19pc19kZXZpY2VfbW9kZShjb3JlX2lmKSkKKwkJY29yZV9pZi0+ZnJhbWVfbnVtID0gZHdjX290Z19nZXRfZnJhbWVfbnVtYmVyKGNvcmVfaWYpOworCQkKKwlpZiAoY29yZV9pZi0+bG9jaykKKwkJRFdDX1NQSU5MT0NLKGNvcmVfaWYtPmxvY2spOworCisJaWYgKGNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPD0gMCkgeworCQlnaW50c3RzLmQzMiA9IGR3Y19vdGdfcmVhZF9jb21tb25faW50cihjb3JlX2lmKTsKKworCQlpZiAoZ2ludHN0cy5iLm1vZGVtaXNtYXRjaCkgeworCQkJcmV0dmFsIHw9IGR3Y19vdGdfaGFuZGxlX21vZGVfbWlzbWF0Y2hfaW50cihjb3JlX2lmKTsKKwkJfQorCQlpZiAoZ2ludHN0cy5iLm90Z2ludHIpIHsKKwkJCXJldHZhbCB8PSBkd2Nfb3RnX2hhbmRsZV9vdGdfaW50cihjb3JlX2lmKTsKKwkJfQorCQlpZiAoZ2ludHN0cy5iLmNvbmlkc3RzY2huZykgeworCQkJcmV0dmFsIHw9IGR3Y19vdGdfaGFuZGxlX2Nvbm5faWRfc3RhdHVzX2NoYW5nZV9pbnRyKGNvcmVfaWYpOworCQl9CisJCWlmIChnaW50c3RzLmIuZGlzY29ubmVjdCkgeworCQkJcmV0dmFsIHw9IGR3Y19vdGdfaGFuZGxlX2Rpc2Nvbm5lY3RfaW50cihjb3JlX2lmKTsKKwkJfQorCQlpZiAoZ2ludHN0cy5iLnNlc3NyZXFpbnRyKSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19oYW5kbGVfc2Vzc2lvbl9yZXFfaW50cihjb3JlX2lmKTsKKwkJfQorCQlpZiAoZ2ludHN0cy5iLndrdXBpbnRyKSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19oYW5kbGVfd2FrZXVwX2RldGVjdGVkX2ludHIoY29yZV9pZik7CisJCX0KKwkJaWYgKGdpbnRzdHMuYi51c2JzdXNwZW5kKSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19oYW5kbGVfdXNiX3N1c3BlbmRfaW50cihjb3JlX2lmKTsKKwkJfQorI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwkJaWYgKGdpbnRzdHMuYi5scG10cmFucmN2ZCkgeworCQkJcmV0dmFsIHw9IGR3Y19vdGdfaGFuZGxlX2xwbV9pbnRyKGNvcmVfaWYpOworCQl9CisjZW5kaWYKKwkJaWYgKGdpbnRzdHMuYi5yZXN0b3JlZG9uZSkgeworCQkJZ2ludHN0cy5kMzIgPSAwOworCSAgICAgICAgICAgICAgICBpZiAoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKQorCQkJCWNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPSAtMTsKKwkJCWdpbnRzdHMuYi5yZXN0b3JlZG9uZSA9IDE7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsZ2ludHN0cy5kMzIpOworCQkJRFdDX1BSSU5URigiIC0tUmVzdG9yZSBkb25lIGludGVycnVwdCByZWNlaXZlZC0tIFxuIik7CisJCQlyZXR2YWwgfD0gMTsKKwkJfQorCQlpZiAoZ2ludHN0cy5iLnBvcnRpbnRyICYmIGR3Y19vdGdfaXNfZGV2aWNlX21vZGUoY29yZV9pZikpIHsKKwkJCS8qIFRoZSBwb3J0IGludGVycnVwdCBvY2N1cnMgd2hpbGUgaW4gZGV2aWNlIG1vZGUgd2l0aCBIUFJUMAorCQkJICogUG9ydCBFbmFibGUvRGlzYWJsZS4KKwkJCSAqLworCQkJZ2ludHN0cy5kMzIgPSAwOworCQkJZ2ludHN0cy5iLnBvcnRpbnRyID0gMTsKKwkJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cyxnaW50c3RzLmQzMik7CisJCQlyZXR2YWwgfD0gMTsKKworCQl9CisJfSBlbHNlIHsKKwkJRFdDX0RFQlVHUEwoREJHX0FOWSwgImdwd3Jkbj0lMDh4XG4iLCBncHdyZG4uZDMyKTsKKworCQlpZiAoZ3B3cmRuLmIuZGlzY29ubl9kZXQgJiYgZ3B3cmRuLmIuZGlzY29ubl9kZXRfbXNrKSB7CisJCQlDTEVBUl9HUFdSRE5fSU5UUihjb3JlX2lmLCBkaXNjb25uX2RldCk7CisJCQlpZiAoZ3B3cmRuLmIubGluZXN0YXRlID09IDApIHsKKwkJCQlkd2Nfb3RnX2hhbmRsZV9wd3Jkbl9kaXNjb25uZWN0X2ludHIoY29yZV9pZik7CisJCQl9IGVsc2UgeworCQkJCURXQ19QUklOVEYoIkRpc2Nvbm5lY3QgZGV0ZWN0ZWQgd2hpbGUgbGluZXN0YXRlIGlzIG5vdCAwXG4iKTsKKwkJCX0KKworCQkJcmV0dmFsIHw9IDE7CisJCX0KKwkgCWlmIChncHdyZG4uYi5sbnN0c2NobmcgJiYgZ3B3cmRuLmIubG5zdGNobmdfbXNrKSB7CisJCQlDTEVBUl9HUFdSRE5fSU5UUihjb3JlX2lmLCBsbnN0c2NobmcpOworCQkJLyogcmVtb3RlIHdha2V1cCBmcm9tIGhpYmVybmF0aW9uICovCisJCQlpZiAoZ3B3cmRuLmIubGluZXN0YXRlID09IDIgfHwgZ3B3cmRuLmIubGluZXN0YXRlID09IDEpIHsKKwkJCQlkd2Nfb3RnX2hhbmRsZV9wd3Jkbl93YWtldXBfZGV0ZWN0ZWRfaW50cihjb3JlX2lmKTsKKwkJCX0gZWxzZSB7CisJCQkJRFdDX1BSSU5URigiZ3B3cmRuLmxpbmVzdGF0ZSA9ICVkXG4iLCBncHdyZG4uYi5saW5lc3RhdGUpOworCQkJfQorCQkJcmV0dmFsIHw9IDE7CisJIAl9CisJCWlmIChncHdyZG4uYi5yc3RfZGV0ICYmIGdwd3Jkbi5iLnJzdF9kZXRfbXNrKSB7CisJCQlDTEVBUl9HUFdSRE5fSU5UUihjb3JlX2lmLCByc3RfZGV0KTsKKwkJCWlmIChncHdyZG4uYi5saW5lc3RhdGUgPT0gMCkgeworCQkJCURXQ19QUklOVEYoIlJlc2V0IGRldGVjdGVkXG4iKTsKKwkJCQlyZXR2YWwgfD0gZHdjX290Z19kZXZpY2VfaGliZXJuYXRpb25fcmVzdG9yZShjb3JlX2lmLCAwLCAxKTsKKwkJCX0KKwkJfQorCQlpZiAoZ3B3cmRuLmIuc3JwX2RldCAmJiBncHdyZG4uYi5zcnBfZGV0X21zaykgeworCQkJQ0xFQVJfR1BXUkROX0lOVFIoY29yZV9pZiwgc3JwX2RldCk7CisJCQlkd2Nfb3RnX2hhbmRsZV9wd3Jkbl9zcnBfaW50cihjb3JlX2lmKTsKKwkJCXJldHZhbCB8PSAxOworCQl9CisJfQorCS8qIEhhbmRsZSBBRFAgaW50ZXJydXB0IGhlcmUgKi8KKwlpZiAoZ3B3cmRuLmIuYWRwX2ludCkgeworCQlEV0NfUFJJTlRGKCJBRFAgaW50ZXJydXB0XG4iKTsKKwkJQ0xFQVJfR1BXUkROX0lOVFIoY29yZV9pZiwgYWRwX2ludCk7CisJCWR3Y19vdGdfYWRwX2hhbmRsZV9pbnRyKGNvcmVfaWYpOworCQlyZXR2YWwgfD0gMTsKKwl9CisJaWYgKGdwd3Jkbi5iLnN0c19jaG5naW50ICYmIGdwd3Jkbi5iLnN0c19jaG5naW50X21zaykgeworCQlEV0NfUFJJTlRGKCJTVFMgQ0hORyBpbnRlcnJ1cHQgYXNzZXJ0ZWRcbiIpOworCQlDTEVBUl9HUFdSRE5fSU5UUihjb3JlX2lmLCBzdHNfY2huZ2ludCk7CisJCWR3Y19vdGdfaGFuZGxlX3B3cmRuX3N0c2NobmdfaW50cihvdGdfZGV2KTsKKworCQlyZXR2YWwgfD0gMTsKKwl9CisJaWYgKGNvcmVfaWYtPmxvY2spCisJCURXQ19TUElOVU5MT0NLKGNvcmVfaWYtPmxvY2spOworCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19jb3JlX2lmLmggYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY29yZV9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZjUyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfY29yZV9pZi5oCkBAIC0wLDAgKzEsNjk5IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfY29yZV9pZi5oICQKKyAqICRSZXZpc2lvbjogIzEyICQKKyAqICREYXRlOiAyMDExLzEwLzI0ICQKKyAqICRDaGFuZ2U6IDE4NzExNTkgJAorICoKKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWYgIWRlZmluZWQoX19EV0NfQ09SRV9JRl9IX18pCisjZGVmaW5lIF9fRFdDX0NPUkVfSUZfSF9fCisKKyNpbmNsdWRlICJkd2Nfb3MuaCIKKworLyoqIEBmaWxlCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBEV0NfT1RHIENvcmUgQVBJCisgKi8KKworc3RydWN0IGR3Y19vdGdfY29yZV9pZjsKK3R5cGVkZWYgc3RydWN0IGR3Y19vdGdfY29yZV9pZiBkd2Nfb3RnX2NvcmVfaWZfdDsKKworLyoqIE1heGltdW0gbnVtYmVyIG9mIFBlcmlvZGljIEZJRk9zICovCisjZGVmaW5lIE1BWF9QRVJJT19GSUZPUyAxNQorLyoqIE1heGltdW0gbnVtYmVyIG9mIFBlcmlvZGljIEZJRk9zICovCisjZGVmaW5lIE1BWF9UWF9GSUZPUyAxNQorCisvKiogTWF4aW11bSBudW1iZXIgb2YgRW5kcG9pbnRzL0hvc3RDaGFubmVscyAqLworI2RlZmluZSBNQVhfRVBTX0NIQU5ORUxTIDE2CisKK2V4dGVybiBkd2Nfb3RnX2NvcmVfaWZfdCAqZHdjX290Z19jaWxfaW5pdChjb25zdCB1aW50MzJfdCAqIF9yZWdfYmFzZV9hZGRyKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfY29yZV9pbml0KGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYpOworZXh0ZXJuIHZvaWQgZHdjX290Z19jaWxfcmVtb3ZlKGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYpOworCitleHRlcm4gdm9pZCBkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfZGlzYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKKworZXh0ZXJuIHVpbnQ4X3QgZHdjX290Z19pc19kZXZpY2VfbW9kZShkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKK2V4dGVybiB1aW50OF90IGR3Y19vdGdfaXNfaG9zdF9tb2RlKGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYpOworCitleHRlcm4gdWludDhfdCBkd2Nfb3RnX2lzX2RtYV9lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKworLyoqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbiBldmVyeSBoYXJkd2FyZSBpbnRlcnJ1cHQuICovCitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2hhbmRsZV9jb21tb25faW50cih2b2lkICpvdGdfZGV2KTsKKworLyoqIEBuYW1lIE9URyBDb3JlIFBhcmFtZXRlcnMgKi8KKy8qKiBAeyAqLworCisvKioKKyAqIFNwZWNpZmllcyB0aGUgT1RHIGNhcGFiaWxpdGllcy4gVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkKKyAqIGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMgc3BlY2lmaWVkLgorICogMCAtIEhOUCBhbmQgU1JQIGNhcGFibGUgKGRlZmF1bHQpCisgKiAxIC0gU1JQIE9ubHkgY2FwYWJsZQorICogMiAtIE5vIEhOUC9TUlAgY2FwYWJsZQorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX290Z19jYXAoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9vdGdfY2FwKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIERXQ19PVEdfQ0FQX1BBUkFNX0hOUF9TUlBfQ0FQQUJMRSAwCisjZGVmaW5lIERXQ19PVEdfQ0FQX1BBUkFNX1NSUF9PTkxZX0NBUEFCTEUgMQorI2RlZmluZSBEV0NfT1RHX0NBUF9QQVJBTV9OT19ITlBfU1JQX0NBUEFCTEUgMgorI2RlZmluZSBkd2NfcGFyYW1fb3RnX2NhcF9kZWZhdWx0IERXQ19PVEdfQ0FQX1BBUkFNX0hOUF9TUlBfQ0FQQUJMRQorCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX29wdChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX29wdChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fb3B0X2RlZmF1bHQgMQorCisvKioKKyAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBzbGF2ZSBvciBETUEgbW9kZSBmb3IgYWNjZXNzaW5nIHRoZSBkYXRhCisgKiBGSUZPcy4gVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcworICogcGFyYW1ldGVyIGlmIG5vbmUgaXMgc3BlY2lmaWVkLgorICogMCAtIFNsYXZlCisgKiAxIC0gRE1BIChkZWZhdWx0LCBpZiBhdmFpbGFibGUpCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19zZXRfcGFyYW1fZG1hX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCWludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2RtYV9lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKyNkZWZpbmUgZHdjX3BhcmFtX2RtYV9lbmFibGVfZGVmYXVsdCAxCisKKy8qKgorICogV2hlbiBETUEgbW9kZSBpcyBlbmFibGVkIHNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZQorICogYWRkcmVzcyBETUEgb3IgRE1BIERlc2NyaXRvciBtb2RlIGZvciBhY2Nlc3NpbmcgdGhlIGRhdGEKKyAqIEZJRk9zIGluIGRldmljZSBtb2RlLiBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QKKyAqIHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcyBzcGVjaWZpZWQuCisgKiAwIC0gYWRkcmVzcyBETUEKKyAqIDEgLSBETUEgRGVzY3JpcHRvcihkZWZhdWx0LCBpZiBhdmFpbGFibGUpCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19zZXRfcGFyYW1fZG1hX2Rlc2NfZW5hYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgICBpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9kbWFfZGVzY19lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKyNkZWZpbmUgZHdjX3BhcmFtX2RtYV9kZXNjX2VuYWJsZV9kZWZhdWx0IDAKKworLyoqIFRoZSBETUEgQnVyc3Qgc2l6ZSAoYXBwbGljYWJsZSBvbmx5IGZvciBFeHRlcm5hbCBETUEKKyAqIE1vZGUpLiAxLCA0LCA4IDE2LCAzMiwgNjQsIDEyOCwgMjU2IChkZWZhdWx0IDMyKQorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2RtYV9idXJzdF9zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2RtYV9idXJzdF9zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9kbWFfYnVyc3Rfc2l6ZV9kZWZhdWx0IDMyCisKKy8qKgorICogU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNwZWVkIG9mIG9wZXJhdGlvbiBpbiBob3N0IGFuZCBkZXZpY2UgbW9kZS4KKyAqIFRoZSBhY3R1YWwgc3BlZWQgZGVwZW5kcyBvbiB0aGUgc3BlZWQgb2YgdGhlIGF0dGFjaGVkIGRldmljZSBhbmQKKyAqIHRoZSB2YWx1ZSBvZiBwaHlfdHlwZS4gVGhlIGFjdHVhbCBzcGVlZCBkZXBlbmRzIG9uIHRoZSBzcGVlZCBvZiB0aGUKKyAqIGF0dGFjaGVkIGRldmljZS4KKyAqIDAgLSBIaWdoIFNwZWVkIChkZWZhdWx0KQorICogMSAtIEZ1bGwgU3BlZWQKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9zcGVlZChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX3NwZWVkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9zcGVlZF9kZWZhdWx0IDAKKyNkZWZpbmUgRFdDX1NQRUVEX1BBUkFNX0hJR0ggMAorI2RlZmluZSBEV0NfU1BFRURfUEFSQU1fRlVMTCAxCisKKy8qKiBTcGVjaWZpZXMgd2hldGhlciBsb3cgcG93ZXIgbW9kZSBpcyBzdXBwb3J0ZWQgd2hlbiBhdHRhY2hlZAorICoJdG8gYSBGdWxsIFNwZWVkIG9yIExvdyBTcGVlZCBkZXZpY2UgaW4gaG9zdCBtb2RlLgorICogMCAtIERvbid0IHN1cHBvcnQgbG93IHBvd2VyIG1vZGUgKGRlZmF1bHQpCisgKiAxIC0gU3VwcG9ydCBsb3cgcG93ZXIgbW9kZQorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2hvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIoZHdjX290Z19jb3JlX2lmX3QgKgorCQkJCQkJCSAgY29yZV9pZiwgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1faG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcihkd2Nfb3RnX2NvcmVfaWZfdAorCQkJCQkJCSAgICAgICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyX2RlZmF1bHQgMAorCisvKiogU3BlY2lmaWVzIHRoZSBQSFkgY2xvY2sgcmF0ZSBpbiBsb3cgcG93ZXIgbW9kZSB3aGVuIGNvbm5lY3RlZCB0byBhCisgKiBMb3cgU3BlZWQgZGV2aWNlIGluIGhvc3QgbW9kZS4gVGhpcyBwYXJhbWV0ZXIgaXMgYXBwbGljYWJsZSBvbmx5IGlmCisgKiBIT1NUX1NVUFBPUlRfRlNfTFNfTE9XX1BPV0VSIGlzIGVuYWJsZWQuIElmIFBIWV9UWVBFIGlzIHNldCB0byBGUworICogdGhlbiBkZWZhdWx0cyB0byA2IE1IWiBvdGhlcndpc2UgNDggTUhaLgorICoKKyAqIDAgLSA0OCBNSHoKKyAqIDEgLSA2IE1IegorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGsoZHdjX290Z19jb3JlX2lmX3QgKgorCQkJCQkJICAgICAgIGNvcmVfaWYsIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2hvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGsoZHdjX290Z19jb3JlX2lmX3QgKgorCQkJCQkJCSAgIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1faG9zdF9sc19sb3dfcG93ZXJfcGh5X2Nsa19kZWZhdWx0IDAKKyNkZWZpbmUgRFdDX0hPU1RfTFNfTE9XX1BPV0VSX1BIWV9DTEtfUEFSQU1fNDhNSFogMAorI2RlZmluZSBEV0NfSE9TVF9MU19MT1dfUE9XRVJfUEhZX0NMS19QQVJBTV82TUhaIDEKKworLyoqCisgKiAwIC0gVXNlIGNDIEZJRk8gc2l6ZSBwYXJhbWV0ZXJzCisgKiAxIC0gQWxsb3cgZHluYW1pYyBGSUZPIHNpemluZyAoZGVmYXVsdCkKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9lbmFibGVfZHluYW1pY19maWZvKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJCSBpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9lbmFibGVfZHluYW1pY19maWZvKGR3Y19vdGdfY29yZV9pZl90ICoKKwkJCQkJCSAgICAgY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9lbmFibGVfZHluYW1pY19maWZvX2RlZmF1bHQgMQorCisvKiogVG90YWwgbnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiB0aGUgZGF0YSBGSUZPIG1lbW9yeS4gVGhpcworICogbWVtb3J5IGluY2x1ZGVzIHRoZSBSeCBGSUZPLCBub24tcGVyaW9kaWMgVHggRklGTywgYW5kIHBlcmlvZGljCisgKiBUeCBGSUZPcy4KKyAqIDMyIHRvIDMyNzY4IChkZWZhdWx0IDgxOTIpCisgKiBOb3RlOiBUaGUgdG90YWwgRklGTyBtZW1vcnkgZGVwdGggaW4gdGhlIEZQR0EgY29uZmlndXJhdGlvbiBpcyA4MTkyLgorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2RhdGFfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2RhdGFfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9kYXRhX2ZpZm9fc2l6ZV9kZWZhdWx0IDgxOTIKKworLyoqIE51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIFJ4IEZJRk8gaW4gZGV2aWNlIG1vZGUgd2hlbiBkeW5hbWljCisgKiBGSUZPIHNpemluZyBpcyBlbmFibGVkLgorICogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTA2NCkKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfcnhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgICAgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fZGV2X3J4X2ZpZm9fc2l6ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fZGV2X3J4X2ZpZm9fc2l6ZV9kZWZhdWx0IDEwNjQKKworLyoqIE51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIG5vbi1wZXJpb2RpYyBUeCBGSUZPIGluIGRldmljZSBtb2RlCisgKiB3aGVuIGR5bmFtaWMgRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KKyAqIDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwMjQpCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19zZXRfcGFyYW1fZGV2X25wZXJpb190eF9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKgorCQkJCQkJICAgICBjb3JlX2lmLCBpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZShkd2Nfb3RnX2NvcmVfaWZfdCAqCisJCQkJCQkJIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fZGV2X25wZXJpb190eF9maWZvX3NpemVfZGVmYXVsdCAxMDI0CisKKy8qKiBOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIGVhY2ggb2YgdGhlIHBlcmlvZGljIFR4IEZJRk9zIGluIGRldmljZQorICogbW9kZSB3aGVuIGR5bmFtaWMgRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KKyAqIDQgdG8gNzY4IChkZWZhdWx0IDI1NikKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfcGVyaW9fdHhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJCSAgICBpbnQzMl90IHZhbCwgaW50IGZpZm9fbnVtKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2Rldl9wZXJpb190eF9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKgorCQkJCQkJCWNvcmVfaWYsIGludCBmaWZvX251bSk7CisjZGVmaW5lIGR3Y19wYXJhbV9kZXZfcGVyaW9fdHhfZmlmb19zaXplX2RlZmF1bHQgMjU2CisKKy8qKiBOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBSeCBGSUZPIGluIGhvc3QgbW9kZSB3aGVuIGR5bmFtaWMKKyAqIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQuCisgKiAxNiB0byAzMjc2OCAoZGVmYXVsdCAxMDI0KQorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfcnhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgICAgIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2hvc3RfcnhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9ob3N0X3J4X2ZpZm9fc2l6ZV9kZWZhdWx0IDc3NgorCisKKy8qKiBOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyBpbiBob3N0IG1vZGUKKyAqIHdoZW4gRHluYW1pYyBGSUZPIHNpemluZyBpcyBlbmFibGVkIGluIHRoZSBjb3JlLgorICogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTAyNCkKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X25wZXJpb190eF9maWZvX3NpemUoZHdjX290Z19jb3JlX2lmX3QgKgorCQkJCQkJICAgICAgY29yZV9pZiwgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1faG9zdF9ucGVyaW9fdHhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICoKKwkJCQkJCQkgIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1faG9zdF9ucGVyaW9fdHhfZmlmb19zaXplX2RlZmF1bHQgNTEyCisKKy8qKiBOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBob3N0IHBlcmlvZGljIFR4IEZJRk8gd2hlbiBkeW5hbWljCisgKiBGSUZPIHNpemluZyBpcyBlbmFibGVkLgorICogMTYgdG8gMzI3NjggKGRlZmF1bHQgMTAyNCkKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZShkd2Nfb3RnX2NvcmVfaWZfdCAqCisJCQkJCQkgICAgIGNvcmVfaWYsIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2hvc3RfcGVyaW9fdHhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICoKKwkJCQkJCQkgY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZV9kZWZhdWx0IDc2OAorCisvKiogVGhlIG1heGltdW0gdHJhbnNmZXIgc2l6ZSBzdXBwb3J0ZWQgaW4gYnl0ZXMuCisgKiAyMDQ3IHRvIDY1LDUzNSAgKGRlZmF1bHQgNjUsNTM1KQorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX21heF90cmFuc2Zlcl9zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgICAgIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX21heF90cmFuc2Zlcl9zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9tYXhfdHJhbnNmZXJfc2l6ZV9kZWZhdWx0IDY1NTM1CisKKy8qKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyBpbiBhIHRyYW5zZmVyLgorICogMTUgdG8gNTExICAoZGVmYXVsdCA1MTEpCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19zZXRfcGFyYW1fbWF4X3BhY2tldF9jb3VudChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCSAgICAgIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX21heF9wYWNrZXRfY291bnQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKyNkZWZpbmUgZHdjX3BhcmFtX21heF9wYWNrZXRfY291bnRfZGVmYXVsdCA1MTEKKworLyoqIFRoZSBudW1iZXIgb2YgaG9zdCBjaGFubmVsIHJlZ2lzdGVycyB0byB1c2UuCisgKiAxIHRvIDE2IChkZWZhdWx0IDEyKQorICogTm90ZTogVGhlIEZQR0EgY29uZmlndXJhdGlvbiBzdXBwb3J0cyBhIG1heGltdW0gb2YgMTIgaG9zdCBjaGFubmVscy4KKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X2NoYW5uZWxzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1faG9zdF9jaGFubmVscyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1faG9zdF9jaGFubmVsc19kZWZhdWx0IDE0CisKKy8qKiBUaGUgbnVtYmVyIG9mIGVuZHBvaW50cyBpbiBhZGRpdGlvbiB0byBFUDAgYXZhaWxhYmxlIGZvciBkZXZpY2UKKyAqIG1vZGUgb3BlcmF0aW9ucy4KKyAqIDEgdG8gMTUgKGRlZmF1bHQgNiBJTiBhbmQgT1VUKQorICogTm90ZTogVGhlIEZQR0EgY29uZmlndXJhdGlvbiBzdXBwb3J0cyBhIG1heGltdW0gb2YgNiBJTiBhbmQgT1VUCisgKiBlbmRwb2ludHMgaW4gYWRkaXRpb24gdG8gRVAwLgorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9lbmRwb2ludHMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgICBpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9kZXZfZW5kcG9pbnRzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9kZXZfZW5kcG9pbnRzX2RlZmF1bHQgNworCisvKioKKyAqIFNwZWNpZmllcyB0aGUgdHlwZSBvZiBQSFkgaW50ZXJmYWNlIHRvIHVzZS4gQnkgZGVmYXVsdCwgdGhlIGRyaXZlcgorICogd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgcGh5X3R5cGUuCisgKgorICogMCAtIEZ1bGwgU3BlZWQgUEhZCisgKiAxIC0gVVRNSSsgKGRlZmF1bHQpCisgKiAyIC0gVUxQSQorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX3BoeV90eXBlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fcGh5X3R5cGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKyNkZWZpbmUgRFdDX1BIWV9UWVBFX1BBUkFNX0ZTIDAKKyNkZWZpbmUgRFdDX1BIWV9UWVBFX1BBUkFNX1VUTUkgMQorI2RlZmluZSBEV0NfUEhZX1RZUEVfUEFSQU1fVUxQSSAyCisjZGVmaW5lIGR3Y19wYXJhbV9waHlfdHlwZV9kZWZhdWx0IERXQ19QSFlfVFlQRV9QQVJBTV9VVE1JCisKKy8qKgorICogU3BlY2lmaWVzIHRoZSBVVE1JKyBEYXRhIFdpZHRoLiBUaGlzIHBhcmFtZXRlciBpcworICogYXBwbGljYWJsZSBmb3IgYSBQSFlfVFlQRSBvZiBVVE1JKyBvciBVTFBJLiAoRm9yIGEgVUxQSQorICogUEhZX1RZUEUsIHRoaXMgcGFyYW1ldGVyIGluZGljYXRlcyB0aGUgZGF0YSB3aWR0aCBiZXR3ZWVuCisgKiB0aGUgTUFDIGFuZCB0aGUgVUxQSSBXcmFwcGVyLikgQWxzbywgdGhpcyBwYXJhbWV0ZXIgaXMKKyAqIGFwcGxpY2FibGUgb25seSBpZiB0aGUgT1RHX0hTUEhZX1dJRFRIIGNDIHBhcmFtZXRlciB3YXMgc2V0CisgKiB0byAiOCBhbmQgMTYgYml0cyIsIG1lYW5pbmcgdGhhdCB0aGUgY29yZSBoYXMgYmVlbgorICogY29uZmlndXJlZCB0byB3b3JrIGF0IGVpdGhlciBkYXRhIHBhdGggd2lkdGguCisgKgorICogOCBvciAxNiBiaXRzIChkZWZhdWx0IDE2KQorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX3BoeV91dG1pX3dpZHRoKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX3BoeV91dG1pX3dpZHRoKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9waHlfdXRtaV93aWR0aF9kZWZhdWx0IDE2CisKKy8qKgorICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIFVMUEkgb3BlcmF0ZXMgYXQgZG91YmxlIG9yIHNpbmdsZQorICogZGF0YSByYXRlLiBUaGlzIHBhcmFtZXRlciBpcyBvbmx5IGFwcGxpY2FibGUgaWYgUEhZX1RZUEUgaXMKKyAqIFVMUEkuCisgKgorICogMCAtIHNpbmdsZSBkYXRhIHJhdGUgVUxQSSBpbnRlcmZhY2Ugd2l0aCA4IGJpdCB3aWRlIGRhdGEKKyAqIGJ1cyAoZGVmYXVsdCkKKyAqIDEgLSBkb3VibGUgZGF0YSByYXRlIFVMUEkgaW50ZXJmYWNlIHdpdGggNCBiaXQgd2lkZSBkYXRhCisgKiBidXMKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdWxwaV9kZHIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX3BoeV91bHBpX2Rkcihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fcGh5X3VscGlfZGRyX2RlZmF1bHQgMAorCisvKioKKyAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSB0aGUgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgc3VwcGx5IHRvCisgKiBkcml2ZSB0aGUgdmJ1cyB3aXRoIGEgVUxQSSBwaHkuCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19zZXRfcGFyYW1fcGh5X3VscGlfZXh0X3ZidXMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgICAgICAgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fcGh5X3VscGlfZXh0X3ZidXMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKyNkZWZpbmUgRFdDX1BIWV9VTFBJX0lOVEVSTkFMX1ZCVVMgMAorI2RlZmluZSBEV0NfUEhZX1VMUElfRVhURVJOQUxfVkJVUyAxCisjZGVmaW5lIGR3Y19wYXJhbV9waHlfdWxwaV9leHRfdmJ1c19kZWZhdWx0IERXQ19QSFlfVUxQSV9JTlRFUk5BTF9WQlVTCisKKy8qKgorICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHRoZSBJMkNpbnRlcmZhY2UgZm9yIGZ1bGwgc3BlZWQgUEhZLiBUaGlzCisgKiBwYXJhbWV0ZXIgaXMgb25seSBhcHBsaWNhYmxlIGlmIFBIWV9UWVBFIGlzIEZTLgorICogMCAtIE5vIChkZWZhdWx0KQorICogMSAtIFllcworICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2kyY19lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQlpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9pMmNfZW5hYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9pMmNfZW5hYmxlX2RlZmF1bHQgMAorCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX3VscGlfZnNfbHMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQlpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV91bHBpX2ZzX2xzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV91bHBpX2ZzX2xzX2RlZmF1bHQgMAorCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX3RzX2RsaW5lKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fdHNfZGxpbmUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKyNkZWZpbmUgZHdjX3BhcmFtX3RzX2RsaW5lX2RlZmF1bHQgMAorCisvKioKKyAqIFNwZWNpZmllcyB3aGV0aGVyIGRlZGljYXRlZCB0cmFuc21pdCBGSUZPcyBhcmUKKyAqIGVuYWJsZWQgZm9yIG5vbiBwZXJpb2RpYyBJTiBlbmRwb2ludHMgaW4gZGV2aWNlIG1vZGUKKyAqIDAgLSBObworICogMSAtIFllcworICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2VuX211bHRpcGxlX3R4X2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkJIGludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2VuX211bHRpcGxlX3R4X2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKgorCQkJCQkJICAgICBjb3JlX2lmKTsKKyNkZWZpbmUgZHdjX3BhcmFtX2VuX211bHRpcGxlX3R4X2ZpZm9fZGVmYXVsdCAxCisKKy8qKiBOdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIGVhY2ggb2YgdGhlIFR4IEZJRk9zIGluIGRldmljZQorICogbW9kZSB3aGVuIGR5bmFtaWMgRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KKyAqIDQgdG8gNzY4IChkZWZhdWx0IDI1NikKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfdHhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgICAgaW50IGZpZm9fbnVtLCBpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9kZXZfdHhfZmlmb19zaXplKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJCSAgaW50IGZpZm9fbnVtKTsKKyNkZWZpbmUgZHdjX3BhcmFtX2Rldl90eF9maWZvX3NpemVfZGVmYXVsdCA3NjgKKworLyoqIFRocmVzaG9sZGluZyBlbmFibGUgZmxhZy0KKyAqIGJpdCAwIC0gZW5hYmxlIG5vbi1JU08gVHggdGhyZXNob2xkaW5nCisgKiBiaXQgMSAtIGVuYWJsZSBJU08gVHggdGhyZXNob2xkaW5nCisgKiBiaXQgMiAtIGVuYWJsZSBSeCB0aHJlc2hvbGRpbmcKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV90aHJfY3RsKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfdGhyX2N0bChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGludCBmaWZvX251bSk7CisjZGVmaW5lIGR3Y19wYXJhbV90aHJfY3RsX2RlZmF1bHQgMAorCisvKiogVGhyZXNob2xkaW5nIGxlbmd0aCBmb3IgVHgKKyAqIEZJRk9zIGluIDMyIGJpdCBEV09SRHMKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV90eF90aHJfbGVuZ3RoKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfdHhfdGhyX2xlbmd0aChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fdHhfdGhyX2xlbmd0aF9kZWZhdWx0IDY0CisKKy8qKiBUaHJlc2hvbGRpbmcgbGVuZ3RoIGZvciBSeAorICoJRklGT3MgaW4gMzIgYml0IERXT1JEcworICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX3J4X3Rocl9sZW5ndGgoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgICBpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9yeF90aHJfbGVuZ3RoKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9yeF90aHJfbGVuZ3RoX2RlZmF1bHQgNjQKKworLyoqCisgKiBTcGVjaWZpZXMgd2hldGhlciBMUE0gKExpbmsgUG93ZXIgTWFuYWdlbWVudCkgc3VwcG9ydCBpcyBlbmFibGVkCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19zZXRfcGFyYW1fbHBtX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCWludDMyX3QgdmFsKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfZ2V0X3BhcmFtX2xwbV9lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKyNkZWZpbmUgZHdjX3BhcmFtX2xwbV9lbmFibGVfZGVmYXVsdCAxCisKKy8qKgorICogU3BlY2lmaWVzIHdoZXRoZXIgUFRJIGVuaGFuY2VtZW50IGlzIGVuYWJsZWQKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9wdGlfZW5hYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fcHRpX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fcHRpX2VuYWJsZV9kZWZhdWx0IDAKKworLyoqCisgKiBTcGVjaWZpZXMgd2hldGhlciBNUEkgZW5oYW5jZW1lbnQgaXMgZW5hYmxlZAorICovCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX21waV9lbmFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQlpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9tcGlfZW5hYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9tcGlfZW5hYmxlX2RlZmF1bHQgMAorCisvKioKKyAqIFNwZWNpZmllcyB3aGV0aGVyIEFEUCBjYXBhYmlsaXR5IGlzIGVuYWJsZWQKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9hZHBfZW5hYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fYWRwX2VuYWJsZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fYWRwX2VuYWJsZV9kZWZhdWx0IDAKKworLyoqCisgKiBTcGVjaWZpZXMgd2hldGhlciBJQ19VU0IgY2FwYWJpbGl0eSBpcyBlbmFibGVkCisgKi8KKworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9pY191c2JfY2FwKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1faWNfdXNiX2NhcChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1faWNfdXNiX2NhcF9kZWZhdWx0IDAKKworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9haGJfdGhyX3JhdGlvKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJICAgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fYWhiX3Rocl9yYXRpbyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fYWhiX3Rocl9yYXRpb19kZWZhdWx0IDAKKworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9wb3dlcl9kb3duKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fcG93ZXJfZG93bihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fcG93ZXJfZG93bl9kZWZhdWx0IDAKKworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9yZWxvYWRfY3RsKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fcmVsb2FkX2N0bChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworI2RlZmluZSBkd2NfcGFyYW1fcmVsb2FkX2N0bF9kZWZhdWx0IDAKKworZXh0ZXJuIGludCBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfb3V0X25hayhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJCQkJCQkJaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fZGV2X291dF9uYWsoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKyNkZWZpbmUgZHdjX3BhcmFtX2Rldl9vdXRfbmFrX2RlZmF1bHQgMAorCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2NvbnRfb25fYm5hKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkJCQkJCQkgaW50MzJfdCB2YWwpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19nZXRfcGFyYW1fY29udF9vbl9ibmEoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKyNkZWZpbmUgZHdjX3BhcmFtX2NvbnRfb25fYm5hX2RlZmF1bHQgMAorCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX2FoYl9zaW5nbGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkJCQkJCSBpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9haGJfc2luZ2xlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9haGJfc2luZ2xlX2RlZmF1bHQgMAorCitleHRlcm4gaW50IGR3Y19vdGdfc2V0X3BhcmFtX290Z192ZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBpbnQzMl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2dldF9wYXJhbV9vdGdfdmVyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisjZGVmaW5lIGR3Y19wYXJhbV9vdGdfdmVyX2RlZmF1bHQgMAorCisvKiogQH0gKi8KKworLyoqIEBuYW1lIEFjY2VzcyB0byByZWdpc3RlcnMgYW5kIGJpdC1maWVsZHMgKi8KKworLyoqCisgKiBEdW1wIGNvcmUgcmVnaXN0ZXJzIGFuZCBTUFJBTQorICovCitleHRlcm4gdm9pZCBkd2Nfb3RnX2R1bXBfZGV2X3JlZ2lzdGVycyhkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfZHVtcF9zcHJhbShkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfZHVtcF9ob3N0X3JlZ2lzdGVycyhkd2Nfb3RnX2NvcmVfaWZfdCAqIF9jb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfZHVtcF9nbG9iYWxfcmVnaXN0ZXJzKGR3Y19vdGdfY29yZV9pZl90ICogX2NvcmVfaWYpOworCisvKioKKyAqIEdldCBob3N0IG5lZ290aWF0aW9uIHN0YXR1cy4KKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfZ2V0X2hucHN0YXR1cyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworCisvKioKKyAqIEdldCBzcnAgc3RhdHVzCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9zcnBzdGF0dXMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKworLyoqCisgKiBTZXQgaG5wcmVxIGJpdCBpbiB0aGUgR09UR0NUTCByZWdpc3Rlci4KKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19zZXRfaG5wcmVxKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKTsKKworLyoqCisgKiBHZXQgQ29udGVudCBvZiBTTlBTSUQgcmVnaXN0ZXIuCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9nc25wc2lkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisKKy8qKgorICogR2V0IGN1cnJlbnQgbW9kZS4KKyAqIFJldHVybnMgMCBpZiBpbiBkZXZpY2UgbW9kZSwgYW5kIDEgaWYgaW4gaG9zdCBtb2RlLgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfbW9kZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworCisvKioKKyAqIEdldCB2YWx1ZSBvZiBobnBjYXBhYmxlIGZpZWxkIGluIHRoZSBHVVNCQ0ZHIHJlZ2lzdGVyCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9obnBjYXBhYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisvKioKKyAqIFNldCB2YWx1ZSBvZiBobnBjYXBhYmxlIGZpZWxkIGluIHRoZSBHVVNCQ0ZHIHJlZ2lzdGVyCisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2hucGNhcGFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpOworCisvKioKKyAqIEdldCB2YWx1ZSBvZiBzcnBjYXBhYmxlIGZpZWxkIGluIHRoZSBHVVNCQ0ZHIHJlZ2lzdGVyCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9zcnBjYXBhYmxlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisvKioKKyAqIFNldCB2YWx1ZSBvZiBzcnBjYXBhYmxlIGZpZWxkIGluIHRoZSBHVVNCQ0ZHIHJlZ2lzdGVyCisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X3NycGNhcGFibGUoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpOworCisvKioKKyAqIEdldCB2YWx1ZSBvZiBkZXZzcGVlZCBmaWVsZCBpbiB0aGUgRENGRyByZWdpc3RlcgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfZGV2c3BlZWQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKy8qKgorICogU2V0IHZhbHVlIG9mIGRldnNwZWVkIGZpZWxkIGluIHRoZSBEQ0ZHIHJlZ2lzdGVyCisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2RldnNwZWVkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKTsKKworLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIGJ1c2Nvbm5lY3RlZCBmaWVsZCBmcm9tIHRoZSBIUFJUMCByZWdpc3RlcgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfYnVzY29ubmVjdGVkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisKKy8qKgorICogR2V0cyB0aGUgZGV2aWNlIGVudW1lcmF0aW9uIFNwZWVkLgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfZW51bXNwZWVkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisKKy8qKgorICogR2V0IHZhbHVlIG9mIHBydHB3ciBmaWVsZCBmcm9tIHRoZSBIUFJUMCByZWdpc3RlcgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfcHJ0cG93ZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKworLyoqCisgKiBHZXQgdmFsdWUgb2YgZmxhZyBpbmRpY2F0aW5nIGNvcmUgc3RhdGUgLSBoaWJlcm5hdGVkIG9yIG5vdAorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfY29yZV9zdGF0ZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworCisvKioKKyAqIFNldCB2YWx1ZSBvZiBwcnRwd3IgZmllbGQgZnJvbSB0aGUgSFBSVDAgcmVnaXN0ZXIKKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19zZXRfcHJ0cG93ZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpOworCisvKioKKyAqIEdldCB2YWx1ZSBvZiBwcnRzdXNwIGZpZWxkIGZyb20gdGhlIEhQUlQwIHJlZ3NpdGVyCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9wcnRzdXNwZW5kKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisvKioKKyAqIFNldCB2YWx1ZSBvZiBwcnRwd3IgZmllbGQgZnJvbSB0aGUgSFBSVDAgcmVnaXN0ZXIKKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19zZXRfcHJ0c3VzcGVuZChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQzMl90IHZhbCk7CisKKy8qKgorICogR2V0IHZhbHVlIG9mIE1vZGVDaFRpbUVuIGZpZWxkIGZyb20gdGhlIEhDRkcgcmVnc2l0ZXIKKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfZ2V0X21vZGVfY2hfdGltKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisvKioKKyAqIFNldCB2YWx1ZSBvZiBNb2RlQ2hUaW1FbiBmaWVsZCBmcm9tIHRoZSBIQ0ZHIHJlZ3NpdGVyCisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X21vZGVfY2hfdGltKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKTsKKworLyoqCisgKiBHZXQgdmFsdWUgb2YgRnJhbSBJbnRlcnZhbCBmaWVsZCBmcm9tIHRoZSBIRklSIHJlZ3NpdGVyCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9mcl9pbnRlcnZhbChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworLyoqCisgKiBTZXQgdmFsdWUgb2YgRnJhbWUgSW50ZXJ2YWwgZmllbGQgZnJvbSB0aGUgSEZJUiByZWdzaXRlcgorICovCitleHRlcm4gdm9pZCBkd2Nfb3RnX3NldF9mcl9pbnRlcnZhbChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQzMl90IHZhbCk7CisKKy8qKgorICogU2V0IHZhbHVlIG9mIHBydHJlcyBmaWVsZCBmcm9tIHRoZSBIUFJUMCByZWdpc3RlcgorICpGSVhNRSBSZW1vdmU/CisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X3BydHJlc3VtZShkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQzMl90IHZhbCk7CisKKy8qKgorICogR2V0IHZhbHVlIG9mIHJtdHdrdXBzaWcgYml0IGluIERDVEwgcmVnaXN0ZXIKKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfZ2V0X3JlbW90ZXdha2VzaWcoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKworLyoqCisgKiBHZXQgdmFsdWUgb2YgcHJ0X3NsZWVwX3N0cyBmaWVsZCBmcm9tIHRoZSBHTFBNQ0ZHIHJlZ2lzdGVyCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9scG1fcG9ydHNsZWVwc3RhdHVzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisKKy8qKgorICogR2V0IHZhbHVlIG9mIHJlbV93a3VwX2VuIGZpZWxkIGZyb20gdGhlIEdMUE1DRkcgcmVnaXN0ZXIKKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfZ2V0X2xwbV9yZW1vdGV3YWtlZW5hYmxlZChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworCisvKioKKyAqIEdldCB2YWx1ZSBvZiBhcHBsX3Jlc3AgZmllbGQgZnJvbSB0aGUgR0xQTUNGRyByZWdpc3RlcgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfbHBtcmVzcG9uc2UoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKy8qKgorICogU2V0IHZhbHVlIG9mIGFwcGxfcmVzcCBmaWVsZCBmcm9tIHRoZSBHTFBNQ0ZHIHJlZ2lzdGVyCisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2xwbXJlc3BvbnNlKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKTsKKworLyoqCisgKiBHZXQgdmFsdWUgb2YgaHNpY19jb25uZWN0IGZpZWxkIGZyb20gdGhlIEdMUE1DRkcgcmVnaXN0ZXIKKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfZ2V0X2hzaWNfY29ubmVjdChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworLyoqCisgKiBTZXQgdmFsdWUgb2YgaHNpY19jb25uZWN0IGZpZWxkIGZyb20gdGhlIEdMUE1DRkcgcmVnaXN0ZXIKKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19zZXRfaHNpY19jb25uZWN0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKTsKKworLyoqCisgKiBHZXQgdmFsdWUgb2YgaW52X3NlbF9oc2ljIGZpZWxkIGZyb20gdGhlIEdMUE1DRkcgcmVnaXN0ZXIuCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9pbnZfc2VsX2hzaWMoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKKy8qKgorICogU2V0IHZhbHVlIG9mIGludl9zZWxfaHNpYyBmaWVsZCBmcm9tIHRoZSBHTFBNRkcgcmVnaXN0ZXIuCisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2ludl9zZWxfaHNpYyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQzMl90IHZhbCk7CisKKy8qCisgKiBTb21lIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIHJlZ2lzdGVycworICovCisKKy8qKgorICogIEdPVEdDVEwgcmVnaXN0ZXIKKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfZ2V0X2dvdGdjdGwoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2dvdGdjdGwoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpOworCisvKioKKyAqIEdVU0JDRkcgcmVnaXN0ZXIKKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfZ2V0X2d1c2JjZmcoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2d1c2JjZmcoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpOworCisvKioKKyAqIEdSWEZTSVogcmVnaXN0ZXIKKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfZ2V0X2dyeGZzaXooZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2dyeGZzaXooZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpOworCisvKioKKyAqIEdOUFRYRlNJWiByZWdpc3RlcgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfZ25wdHhmc2l6KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CitleHRlcm4gdm9pZCBkd2Nfb3RnX3NldF9nbnB0eGZzaXooZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCB2YWwpOworCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfZ3B2bmRjdGwoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2dwdm5kY3RsKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKTsKKworLyoqCisgKiBHR1BJTyByZWdpc3RlcgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfZ2dwaW8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2dncGlvKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKTsKKworLyoqCisgKiBHVUlEIHJlZ2lzdGVyCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9ndWlkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CitleHRlcm4gdm9pZCBkd2Nfb3RnX3NldF9ndWlkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKTsKKworLyoqCisgKiBIUFJUMCByZWdpc3RlcgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19nZXRfaHBydDAoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfc2V0X2hwcnQwKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgdWludDMyX3QgdmFsKTsKKworLyoqCisgKiBHSFBUWEZTSVpFCisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2dldF9ocHR4ZnNpeihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworCisvKiogQH0gKi8KKworI2VuZGlmCQkJCS8qIF9fRFdDX0NPUkVfSUZfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfZGJnLmggYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfZGJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxZDA5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19kYmcuaApAQCAtMCwwICsxLDExMyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBTeW5vcHN5cyBIUyBPVEcgTGludXggU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIChoZXJlaW5hZnRlciwKKyAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqIAorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKKyAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gdXNlIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgKiBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwgZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IKKyAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQorICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgKiBiZWxvdywgdGhlbiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgX19EV0NfT1RHX0RCR19IX18KKyNkZWZpbmUgX19EV0NfT1RHX0RCR19IX18KKworLyoqIEBmaWxlCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBkZWJ1ZyBsZXZlbHMuCisgKiBEZWJ1Z2dpbmcgc3VwcG9ydCB2YW5pc2hlcyBpbiBub24tZGVidWcgYnVpbGRzLiAgCisgKi8KKworLyoqCisgKiBUaGUgRGVidWcgTGV2ZWwgYml0LW1hc2sgdmFyaWFibGUuCisgKi8KK2V4dGVybiB1aW50MzJfdCBnX2RiZ19sdmw7CisvKioKKyAqIFNldCB0aGUgRGVidWcgTGV2ZWwgdmFyaWFibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgU0VUX0RFQlVHX0xFVkVMKGNvbnN0IHVpbnQzMl90IG5ldykKK3sKKwl1aW50MzJfdCBvbGQgPSBnX2RiZ19sdmw7CisJZ19kYmdfbHZsID0gbmV3OworCXJldHVybiBvbGQ7Cit9CisKKy8qKiBXaGVuIGRlYnVnIGxldmVsIGhhcyB0aGUgREJHX0NJTCBiaXQgc2V0LCBkaXNwbGF5IENJTCBEZWJ1ZyBtZXNzYWdlcy4gKi8KKyNkZWZpbmUgREJHX0NJTAkJKDB4MikKKy8qKiBXaGVuIGRlYnVnIGxldmVsIGhhcyB0aGUgREJHX0NJTFYgYml0IHNldCwgZGlzcGxheSBDSUwgVmVyYm9zZSBkZWJ1ZworICogbWVzc2FnZXMgKi8KKyNkZWZpbmUgREJHX0NJTFYJKDB4MjApCisvKiogIFdoZW4gZGVidWcgbGV2ZWwgaGFzIHRoZSBEQkdfUENEIGJpdCBzZXQsIGRpc3BsYXkgUENEIChEZXZpY2UpIGRlYnVnCisgKiAgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREJHX1BDRAkJKDB4NCkKKy8qKiBXaGVuIGRlYnVnIGxldmVsIGhhcyB0aGUgREJHX1BDRFYgc2V0LCBkaXNwbGF5IFBDRCAoRGV2aWNlKSBWZXJib3NlIGRlYnVnCisgKiBtZXNzYWdlcyAqLworI2RlZmluZSBEQkdfUENEVgkoMHg0MCkKKy8qKiBXaGVuIGRlYnVnIGxldmVsIGhhcyB0aGUgREJHX0hDRCBiaXQgc2V0LCBkaXNwbGF5IEhvc3QgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREJHX0hDRAkJKDB4OCkKKy8qKiBXaGVuIGRlYnVnIGxldmVsIGhhcyB0aGUgREJHX0hDRFYgYml0IHNldCwgZGlzcGxheSBWZXJib3NlIEhvc3QgZGVidWcKKyAqIG1lc3NhZ2VzICovCisjZGVmaW5lIERCR19IQ0RWCSgweDgwKQorLyoqIFdoZW4gZGVidWcgbGV2ZWwgaGFzIHRoZSBEQkdfSENEX1VSQiBiaXQgc2V0LCBkaXNwbGF5IGVucXVldWVkIFVSQnMgaW4gaG9zdAorICogIG1vZGUuICovCisjZGVmaW5lIERCR19IQ0RfVVJCCSgweDgwMCkKKworLyoqIFdoZW4gZGVidWcgbGV2ZWwgaGFzIGFueSBiaXQgc2V0LCBkaXNwbGF5IGRlYnVnIG1lc3NhZ2VzICovCisjZGVmaW5lIERCR19BTlkJCSgweEZGKQorCisvKiogQWxsIGRlYnVnIG1lc3NhZ2VzIG9mZiAqLworI2RlZmluZSBEQkdfT0ZGCQkwCisKKy8qKiBQcmVmaXggc3RyaW5nIGZvciBEV0NfREVCVUcgcHJpbnQgbWFjcm9zLiAqLworI2RlZmluZSBVU0JfRFdDICJEV0Nfb3RnOiAiCisKKy8qKiAKKyAqIFByaW50IGEgZGVidWcgbWVzc2FnZSB3aGVuIHRoZSBHbG9iYWwgZGVidWcgbGV2ZWwgdmFyaWFibGUgY29udGFpbnMKKyAqIHRoZSBiaXQgZGVmaW5lZCBpbiA8Y29kZT5sdmw8L2NvZGU+LgorICoKKyAqIEBwYXJhbVtpbl0gbHZsIC0gRGVidWcgbGV2ZWwsIHVzZSBvbmUgb2YgdGhlIERCR18gY29uc3RhbnRzIGFib3ZlLgorICogQHBhcmFtW2luXSB4IC0gbGlrZSBwcmludGYKKyAqCisgKiAgICBFeGFtcGxlOjxwPgorICogPGNvZGU+CisgKiAgICAgIERXQ19ERUJVR1BMKCBEQkdfQU5ZLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgX3JlZ19iYXNlX2FkZHIpOworICogPC9jb2RlPgorICogPGJyPgorICogcmVzdWx0cyBpbjo8YnI+IAorICogPGNvZGU+CisgKiB1c2ItRFdDX290ZzogZHdjX290Z19jaWxfaW5pdChjYTg2NzAwMCkKKyAqIDwvY29kZT4KKyAqLworI2lmZGVmIERFQlVHCisKKyMgZGVmaW5lIERXQ19ERUJVR1BMKGx2bCwgeC4uLikgZG97IGlmICgobHZsKSZnX2RiZ19sdmwpX19EV0NfREVCVUcoVVNCX0RXQyB4ICk7IH13aGlsZSgwKQorIyBkZWZpbmUgRFdDX0RFQlVHUCh4Li4uKQlEV0NfREVCVUdQTChEQkdfQU5ZLCB4ICkKKworIyBkZWZpbmUgQ0hLX0RFQlVHX0xFVkVMKGxldmVsKSAoKGxldmVsKSAmIGdfZGJnX2x2bCkKKworI2Vsc2UKKworIyBkZWZpbmUgRFdDX0RFQlVHUEwobHZsLCB4Li4uKSBkb3t9d2hpbGUoMCkKKyMgZGVmaW5lIERXQ19ERUJVR1AoeC4uLikKKworIyBkZWZpbmUgQ0hLX0RFQlVHX0xFVkVMKGxldmVsKSAoMCkKKworI2VuZGlmIC8qREVCVUcqLworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfZHJpdmVyLmMgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmZDFiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19kcml2ZXIuYwpAQCAtMCwwICsxLDE4OTMgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAkRmlsZTogLy9kd2gvdXNiX2lpcC9kZXYvc29mdHdhcmUvb3RnL2xpbnV4L2RyaXZlcnMvZHdjX290Z19kcml2ZXIuYyAkCisgKiAkUmV2aXNpb246ICM5MSAkCisgKiAkRGF0ZTogMjAxMS8xMC8yNCAkCisgKiAkQ2hhbmdlOiAxODcxMTU5ICQKKyAqCisgKiBTeW5vcHN5cyBIUyBPVEcgTGludXggU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIChoZXJlaW5hZnRlciwKKyAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdCB1bmRlcgorICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAorICogd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKKyAqIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLCBkaXNjbG9zZSwgY29weSBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSBvcgorICogYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tCisgKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKKyAqIGJlbG93LCB0aGVuIHlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiogQGZpbGUKKyAqIFRoZSBkd2Nfb3RnX2RyaXZlciBtb2R1bGUgcHJvdmlkZXMgdGhlIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwIGVudHJ5CisgKiBwb2ludHMgZm9yIHRoZSBEV0Nfb3RnIGRyaXZlci4gVGhpcyBtb2R1bGUgd2lsbCBiZSBkeW5hbWljYWxseSBpbnN0YWxsZWQKKyAqIGFmdGVyIExpbnV4IGlzIGJvb3RlZCB1c2luZyB0aGUgaW5zbW9kIGNvbW1hbmQuIFdoZW4gdGhlIG1vZHVsZSBpcworICogaW5zdGFsbGVkLCB0aGUgZHdjX290Z19kcml2ZXJfaW5pdCBmdW5jdGlvbiBpcyBjYWxsZWQuIFdoZW4gdGhlIG1vZHVsZSBpcworICogcmVtb3ZlZCAodXNpbmcgcm1tb2QpLCB0aGUgZHdjX290Z19kcml2ZXJfY2xlYW51cCBmdW5jdGlvbiBpcyBjYWxsZWQuCisgKgorICogVGhpcyBtb2R1bGUgYWxzbyBkZWZpbmVzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBkd2Nfb3RnX2RyaXZlciwgd2hpY2ggaXMKKyAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgc3RhbmRhcmQgQVJNIGxtX2RldmljZSBzdHJ1Y3R1cmUuIFRoZXNlCisgKiBzdHJ1Y3R1cmVzIGFsbG93IHRoZSBPVEcgZHJpdmVyIHRvIGNvbXBseSB3aXRoIHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIKKyAqIG1vZGVsIGluIHdoaWNoIGRldmljZXMgYW5kIGRyaXZlcnMgYXJlIHJlZ2lzdGVyZWQgd2l0aCBhIGJ1cyBkcml2ZXIuIFRoaXMKKyAqIGhhcyB0aGUgYmVuZWZpdCB0aGF0IExpbnV4IGNhbiBleHBvc2UgYXR0cmlidXRlcyBvZiB0aGUgZHJpdmVyIGFuZCBkZXZpY2UKKyAqIGluIGl0cyBzcGVjaWFsIHN5c2ZzIGZpbGUgc3lzdGVtLiBVc2VycyBjYW4gdGhlbiByZWFkIG9yIHdyaXRlIGZpbGVzIGluCisgKiB0aGlzIGZpbGUgc3lzdGVtIHRvIHBlcmZvcm0gZGlhZ25vc3RpY3Mgb24gdGhlIGRyaXZlciBjb21wb25lbnRzIG9yIHRoZQorICogZGV2aWNlLgorICovCisKKyNpbmNsdWRlICJkd2Nfb3RnX29zX2RlcC5oIgorI2luY2x1ZGUgImR3Y19vcy5oIgorI2luY2x1ZGUgImR3Y19vdGdfZGJnLmgiCisjaW5jbHVkZSAiZHdjX290Z19kcml2ZXIuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2F0dHIuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2NvcmVfaWYuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX3BjZF9pZi5oIgorI2luY2x1ZGUgImR3Y19vdGdfaGNkX2lmLmgiCisjaW5jbHVkZSA8bWFjaC9yZXNldC5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPG1hY2gvY29tY2VydG8tMjAwMC9wbS5oPgorCisvKiBVU0IgMy4wIGNsb2NrICovCitzdGF0aWMgc3RydWN0IGNsayAqdXNiMl9jbGs7CisKK2V4dGVybiB2b2lkIGR3Y19vdGdfaG9zdF9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2hvc3RfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCk7CisKKworI2RlZmluZSBEV0NfRFJJVkVSX1ZFUlNJT04JIjIuOTRhIDI3LU9DVC0yMDExIgorI2RlZmluZSBEV0NfRFJJVkVSX0RFU0MJCSJIUyBPVEcgVVNCIENvbnRyb2xsZXIgZHJpdmVyIgorCitzdGF0aWMgY29uc3QgY2hhciBkd2NfZHJpdmVyX25hbWVbXSA9ICJkd2Nfb3RnIjsKKworZXh0ZXJuIGludCBwY2RfaW5pdCgKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwkJCSAgIHN0cnVjdCBsbV9kZXZpY2UgKl9kZXYKKyNlbGlmICBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJCQkgICBzdHJ1Y3QgcGNpX2RldiAqX2RldgorI2Vsc2UKKwkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2CisjZW5kaWYKKyAgICApOworZXh0ZXJuIGludCBoY2RfaW5pdCgKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwkJCSAgIHN0cnVjdCBsbV9kZXZpY2UgKl9kZXYKKyNlbGlmICBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJCQkgICBzdHJ1Y3QgcGNpX2RldiAqX2RldgorI2Vsc2UKKwkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2CisjZW5kaWYKKyAgICApOworCitleHRlcm4gaW50IHBjZF9yZW1vdmUoCisjaWZkZWYgTE1fSU5URVJGQUNFCisJCQkgICAgIHN0cnVjdCBsbV9kZXZpY2UgKl9kZXYKKyNlbGlmICBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJCQkgICAgIHN0cnVjdCBwY2lfZGV2ICpfZGV2CisjZWxzZQorCQkJCSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2CisjZW5kaWYKKyAgICApOworCitleHRlcm4gdm9pZCBoY2RfcmVtb3ZlKAorI2lmZGVmIExNX0lOVEVSRkFDRQorCQkJICAgICAgc3RydWN0IGxtX2RldmljZSAqX2RldgorI2VsaWYgIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpfZGV2CisjZWxzZQorCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2CisjZW5kaWYKKyAgICApOworCitleHRlcm4gdm9pZCBkd2Nfb3RnX2FkcF9zdGFydChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIHVpbnQ4X3QgaXNfaG9zdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmNhcHN1bGF0ZSB0aGUgbW9kdWxlIHBhcmFtZXRlciBzZXR0aW5ncyAqLworCitzdHJ1Y3QgZHdjX290Z19kcml2ZXJfbW9kdWxlX3BhcmFtcyB7CisJaW50MzJfdCBvcHQ7CisJaW50MzJfdCBvdGdfY2FwOworCWludDMyX3QgZG1hX2VuYWJsZTsKKwlpbnQzMl90IGRtYV9kZXNjX2VuYWJsZTsKKwlpbnQzMl90IGRtYV9idXJzdF9zaXplOworCWludDMyX3Qgc3BlZWQ7CisJaW50MzJfdCBob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyOworCWludDMyX3QgaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsazsKKwlpbnQzMl90IGVuYWJsZV9keW5hbWljX2ZpZm87CisJaW50MzJfdCBkYXRhX2ZpZm9fc2l6ZTsKKwlpbnQzMl90IGRldl9yeF9maWZvX3NpemU7CisJaW50MzJfdCBkZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKKwl1aW50MzJfdCBkZXZfcGVyaW9fdHhfZmlmb19zaXplW01BWF9QRVJJT19GSUZPU107CisJaW50MzJfdCBob3N0X3J4X2ZpZm9fc2l6ZTsKKwlpbnQzMl90IGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZTsKKwlpbnQzMl90IGhvc3RfcGVyaW9fdHhfZmlmb19zaXplOworCWludDMyX3QgbWF4X3RyYW5zZmVyX3NpemU7CisJaW50MzJfdCBtYXhfcGFja2V0X2NvdW50OworCWludDMyX3QgaG9zdF9jaGFubmVsczsKKwlpbnQzMl90IGRldl9lbmRwb2ludHM7CisJaW50MzJfdCBwaHlfdHlwZTsKKwlpbnQzMl90IHBoeV91dG1pX3dpZHRoOworCWludDMyX3QgcGh5X3VscGlfZGRyOworCWludDMyX3QgcGh5X3VscGlfZXh0X3ZidXM7CisJaW50MzJfdCBpMmNfZW5hYmxlOworCWludDMyX3QgdWxwaV9mc19sczsKKwlpbnQzMl90IHRzX2RsaW5lOworCWludDMyX3QgZW5fbXVsdGlwbGVfdHhfZmlmbzsKKwl1aW50MzJfdCBkZXZfdHhfZmlmb19zaXplW01BWF9UWF9GSUZPU107CisJdWludDMyX3QgdGhyX2N0bDsKKwl1aW50MzJfdCB0eF90aHJfbGVuZ3RoOworCXVpbnQzMl90IHJ4X3Rocl9sZW5ndGg7CisJaW50MzJfdCBwdGlfZW5hYmxlOworCWludDMyX3QgbXBpX2VuYWJsZTsKKwlpbnQzMl90IGxwbV9lbmFibGU7CisJaW50MzJfdCBpY191c2JfY2FwOworCWludDMyX3QgYWhiX3Rocl9yYXRpbzsKKwlpbnQzMl90IHBvd2VyX2Rvd247CisJaW50MzJfdCByZWxvYWRfY3RsOworCWludDMyX3QgZGV2X291dF9uYWs7CisJaW50MzJfdCBjb250X29uX2JuYTsKKwlpbnQzMl90IGFoYl9zaW5nbGU7CisJaW50MzJfdCBvdGdfdmVyOworCWludDMyX3QgYWRwX2VuYWJsZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHdjX290Z19kcml2ZXJfbW9kdWxlX3BhcmFtcyBkd2Nfb3RnX21vZHVsZV9wYXJhbXMgPSB7CisJLm9wdCA9IC0xLAorCS5vdGdfY2FwID0gLTEsCisJLmRtYV9lbmFibGUgPSAtMSwKKwkuZG1hX2Rlc2NfZW5hYmxlID0gLTEsCisJLmRtYV9idXJzdF9zaXplID0gLTEsCisJLnNwZWVkID0gLTEsCisJLmhvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIgPSAtMSwKKwkuaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsayA9IC0xLAorCS5lbmFibGVfZHluYW1pY19maWZvID0gLTEsCisJLmRhdGFfZmlmb19zaXplID0gLTEsCisJLmRldl9yeF9maWZvX3NpemUgPSAtMSwKKwkuZGV2X25wZXJpb190eF9maWZvX3NpemUgPSAtMSwKKwkuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZSA9IHsKKwkJCQkgICAvKiBkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEgKi8KKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMSwKKwkJCQkgICAtMQorCQkJCSAgIC8qIDE1ICovCisJCQkJICAgfSwKKwkuaG9zdF9yeF9maWZvX3NpemUgPSAtMSwKKwkuaG9zdF9ucGVyaW9fdHhfZmlmb19zaXplID0gLTEsCisJLmhvc3RfcGVyaW9fdHhfZmlmb19zaXplID0gLTEsCisJLm1heF90cmFuc2Zlcl9zaXplID0gLTEsCisJLm1heF9wYWNrZXRfY291bnQgPSAtMSwKKwkuaG9zdF9jaGFubmVscyA9IC0xLAorCS5kZXZfZW5kcG9pbnRzID0gLTEsCisJLnBoeV90eXBlID0gLTEsCisJLnBoeV91dG1pX3dpZHRoID0gLTEsCisJLnBoeV91bHBpX2RkciA9IC0xLAorCS5waHlfdWxwaV9leHRfdmJ1cyA9IC0xLAorCS5pMmNfZW5hYmxlID0gLTEsCisJLnVscGlfZnNfbHMgPSAtMSwKKwkudHNfZGxpbmUgPSAtMSwKKwkuZW5fbXVsdGlwbGVfdHhfZmlmbyA9IC0xLAorCS5kZXZfdHhfZmlmb19zaXplID0geworCQkJICAgICAvKiBkZXZfdHhfZmlmb19zaXplICovCisJCQkgICAgIC0xLAorCQkJICAgICAtMSwKKwkJCSAgICAgLTEsCisJCQkgICAgIC0xLAorCQkJICAgICAtMSwKKwkJCSAgICAgLTEsCisJCQkgICAgIC0xLAorCQkJICAgICAtMSwKKwkJCSAgICAgLTEsCisJCQkgICAgIC0xLAorCQkJICAgICAtMSwKKwkJCSAgICAgLTEsCisJCQkgICAgIC0xLAorCQkJICAgICAtMSwKKwkJCSAgICAgLTEKKwkJCSAgICAgLyogMTUgKi8KKwkJCSAgICAgfSwKKwkudGhyX2N0bCA9IC0xLAorCS50eF90aHJfbGVuZ3RoID0gLTEsCisJLnJ4X3Rocl9sZW5ndGggPSAtMSwKKwkucHRpX2VuYWJsZSA9IC0xLAorCS5tcGlfZW5hYmxlID0gLTEsCisJLmxwbV9lbmFibGUgPSAtMSwKKwkuaWNfdXNiX2NhcCA9IC0xLAorCS5haGJfdGhyX3JhdGlvID0gLTEsCisJLnBvd2VyX2Rvd24gPSAtMSwKKwkucmVsb2FkX2N0bCA9IC0xLAorCS5kZXZfb3V0X25hayA9IC0xLAorCS5jb250X29uX2JuYSA9IC0xLAorCS5haGJfc2luZ2xlID0gLTEsCisJLm90Z192ZXIgPSAtMSwKKwkuYWRwX2VuYWJsZSA9IC0xLAorfTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3dzIHRoZSBEcml2ZXIgVmVyc2lvbi4KKyAqLworc3RhdGljIHNzaXplX3QgdmVyc2lvbl9zaG93KHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBzaXplb2YoRFdDX0RSSVZFUl9WRVJTSU9OKSArIDIsICIlc1xuIiwKKwkJCURXQ19EUklWRVJfVkVSU0lPTik7Cit9CisKK3N0YXRpYyBEUklWRVJfQVRUUih2ZXJzaW9uLCBTX0lSVUdPLCB2ZXJzaW9uX3Nob3csIE5VTEwpOworCisvKioKKyAqIEdsb2JhbCBEZWJ1ZyBMZXZlbCBNYXNrLgorICovCit1aW50MzJfdCBnX2RiZ19sdmwgPSAwOwkJLyogT0ZGICovCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBzaG93cyB0aGUgZHJpdmVyIERlYnVnIExldmVsLgorICovCitzdGF0aWMgc3NpemVfdCBkYmdfbGV2ZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMHhcbiIsIGdfZGJnX2x2bCk7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBzdG9yZXMgdGhlIGRyaXZlciBEZWJ1ZyBMZXZlbC4KKyAqLworc3RhdGljIHNzaXplX3QgZGJnX2xldmVsX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisJZ19kYmdfbHZsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxNik7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgRFJJVkVSX0FUVFIoZGVidWdsZXZlbCwgU19JUlVHTyB8IFNfSVdVU1IsIGRiZ19sZXZlbF9zaG93LAorCQkgICBkYmdfbGV2ZWxfc3RvcmUpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBtb2R1bGUgaW50aWFsaXphdGlvbgorICogdG8gcGFzcyBtb2R1bGUgcGFyYW1ldGVycyB0byB0aGUgRFdDX09URyBDT1JFLgorICovCitzdGF0aWMgaW50IHNldF9wYXJhbWV0ZXJzKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaTsKKworCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3RnX2NhcCAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX290Z19jYXAoY29yZV9pZiwKKwkJCQkJICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLm90Z19jYXApOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRtYV9lbmFibGUgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9kbWFfZW5hYmxlKGNvcmVfaWYsCisJCQkJCQkgZHdjX290Z19tb2R1bGVfcGFyYW1zLgorCQkJCQkJIGRtYV9lbmFibGUpOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRtYV9kZXNjX2VuYWJsZSAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2RtYV9kZXNjX2VuYWJsZShjb3JlX2lmLAorCQkJCQkJICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgorCQkJCQkJICAgICAgZG1hX2Rlc2NfZW5hYmxlKTsKKwl9CisJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vcHQgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9vcHQoY29yZV9pZiwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm9wdCk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2J1cnN0X3NpemUgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9kbWFfYnVyc3Rfc2l6ZShjb3JlX2lmLAorCQkJCQkJICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgICAgIGRtYV9idXJzdF9zaXplKTsKKwl9CisJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1faG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcihjb3JlX2lmLAorCQkJCQkJCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkJCSAgIGhvc3Rfc3VwcG9ydF9mc19sc19sb3dfcG93ZXIpOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmVuYWJsZV9keW5hbWljX2ZpZm8gIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9lbmFibGVfZHluYW1pY19maWZvKGNvcmVfaWYsCisJCQkJCQkJICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkJICBlbmFibGVfZHluYW1pY19maWZvKTsKKwl9CisJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kYXRhX2ZpZm9fc2l6ZSAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2RhdGFfZmlmb19zaXplKGNvcmVfaWYsCisJCQkJCQkgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KKwkJCQkJCSAgICAgZGF0YV9maWZvX3NpemUpOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9yeF9maWZvX3NpemUgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9kZXZfcnhfZmlmb19zaXplKGNvcmVfaWYsCisJCQkJCQkgICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgorCQkJCQkJICAgICAgIGRldl9yeF9maWZvX3NpemUpOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9ucGVyaW9fdHhfZmlmb19zaXplICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZGV2X25wZXJpb190eF9maWZvX3NpemUoY29yZV9pZiwKKwkJCQkJCQkgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkJICAgICAgZGV2X25wZXJpb190eF9maWZvX3NpemUpOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfcnhfZmlmb19zaXplICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1faG9zdF9yeF9maWZvX3NpemUoY29yZV9pZiwKKwkJCQkJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9yeF9maWZvX3NpemUpOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAorCQkJCQkJCSAgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkJICAgICAgIGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9wZXJpb190eF9maWZvX3NpemUgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZShjb3JlX2lmLAorCQkJCQkJCSAgICAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KKwkJCQkJCQkgICAgICBob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMubWF4X3RyYW5zZmVyX3NpemUgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9tYXhfdHJhbnNmZXJfc2l6ZShjb3JlX2lmLAorCQkJCQkJCWR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KKwkJCQkJCQltYXhfdHJhbnNmZXJfc2l6ZSk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMubWF4X3BhY2tldF9jb3VudCAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX21heF9wYWNrZXRfY291bnQoY29yZV9pZiwKKwkJCQkJCSAgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgICAgICAgbWF4X3BhY2tldF9jb3VudCk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9jaGFubmVscyAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2hvc3RfY2hhbm5lbHMoY29yZV9pZiwKKwkJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgICAgaG9zdF9jaGFubmVscyk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X2VuZHBvaW50cyAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9lbmRwb2ludHMoY29yZV9pZiwKKwkJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgICAgZGV2X2VuZHBvaW50cyk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3R5cGUgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9waHlfdHlwZShjb3JlX2lmLAorCQkJCQkgICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV90eXBlKTsKKwl9CisJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5zcGVlZCAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3NwZWVkKGNvcmVfaWYsCisJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuc3BlZWQpOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfbHNfbG93X3Bvd2VyX3BoeV9jbGsgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV9ob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrKGNvcmVfaWYsCisJCQkJCQkJCWR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KKwkJCQkJCQkJaG9zdF9sc19sb3dfcG93ZXJfcGh5X2Nsayk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3VscGlfZGRyICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1fcGh5X3VscGlfZGRyKGNvcmVfaWYsCisJCQkJCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgICBwaHlfdWxwaV9kZHIpOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV91bHBpX2V4dF92YnVzICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1fcGh5X3VscGlfZXh0X3ZidXMoY29yZV9pZiwKKwkJCQkJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkJcGh5X3VscGlfZXh0X3ZidXMpOworCX0KKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV91dG1pX3dpZHRoICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1fcGh5X3V0bWlfd2lkdGgoY29yZV9pZiwKKwkJCQkJCSAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgorCQkJCQkJICAgICBwaHlfdXRtaV93aWR0aCk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMudWxwaV9mc19scyAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3VscGlfZnNfbHMoY29yZV9pZiwKKwkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudWxwaV9mc19scyk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHNfZGxpbmUgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCSAgICBkd2Nfb3RnX3NldF9wYXJhbV90c19kbGluZShjb3JlX2lmLAorCQkJCQkgICAgICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLnRzX2RsaW5lKTsKKwl9CisJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5pMmNfZW5hYmxlICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1faTJjX2VuYWJsZShjb3JlX2lmLAorCQkJCQkJIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy4KKwkJCQkJCSBpMmNfZW5hYmxlKTsKKwl9CisJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5lbl9tdWx0aXBsZV90eF9maWZvICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1fZW5fbXVsdGlwbGVfdHhfZmlmbyhjb3JlX2lmLAorCQkJCQkJCSAgZHdjX290Z19tb2R1bGVfcGFyYW1zLgorCQkJCQkJCSAgZW5fbXVsdGlwbGVfdHhfZmlmbyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCQlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbaV0gIT0gLTEpIHsKKwkJCXJldHZhbCArPQorCQkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2Rldl9wZXJpb190eF9maWZvX3NpemUoY29yZV9pZiwKKwkJCQkJCQkJICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkJCSAgICAgZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZQorCQkJCQkJCQkgICAgIFtpXSwgaSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3R4X2ZpZm9fc2l6ZVtpXSAhPSAtMSkgeworCQkJcmV0dmFsICs9IGR3Y19vdGdfc2V0X3BhcmFtX2Rldl90eF9maWZvX3NpemUoY29yZV9pZiwKKwkJCQkJCQkJICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkJCSAgICAgZGV2X3R4X2ZpZm9fc2l6ZQorCQkJCQkJCQkgICAgIFtpXSwgaSk7CisJCX0KKwl9CisJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50aHJfY3RsICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1fdGhyX2N0bChjb3JlX2lmLAorCQkJCQkgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudGhyX2N0bCk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMubXBpX2VuYWJsZSAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX21waV9lbmFibGUoY29yZV9pZiwKKwkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgbXBpX2VuYWJsZSk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucHRpX2VuYWJsZSAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3B0aV9lbmFibGUoY29yZV9pZiwKKwkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgcHRpX2VuYWJsZSk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMubHBtX2VuYWJsZSAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2xwbV9lbmFibGUoY29yZV9pZiwKKwkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgbHBtX2VuYWJsZSk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaWNfdXNiX2NhcCAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2ljX3VzYl9jYXAoY29yZV9pZiwKKwkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgaWNfdXNiX2NhcCk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHhfdGhyX2xlbmd0aCAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3R4X3Rocl9sZW5ndGgoY29yZV9pZiwKKwkJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHhfdGhyX2xlbmd0aCk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucnhfdGhyX2xlbmd0aCAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3J4X3Rocl9sZW5ndGgoY29yZV9pZiwKKwkJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgICAgcnhfdGhyX2xlbmd0aCk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWhiX3Rocl9yYXRpbyAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2FoYl90aHJfcmF0aW8oY29yZV9pZiwKKwkJCQkJCSAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWhiX3Rocl9yYXRpbyk7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucG93ZXJfZG93biAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3Bvd2VyX2Rvd24oY29yZV9pZiwKKwkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucG93ZXJfZG93bik7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMucmVsb2FkX2N0bCAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX3JlbG9hZF9jdGwoY29yZV9pZiwKKwkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucmVsb2FkX2N0bCk7CisJfQorCisJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfb3V0X25hayAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJCWR3Y19vdGdfc2V0X3BhcmFtX2Rldl9vdXRfbmFrKGNvcmVfaWYsCisJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X291dF9uYWspOworCX0KKworCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuY29udF9vbl9ibmEgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCQlkd2Nfb3RnX3NldF9wYXJhbV9jb250X29uX2JuYShjb3JlX2lmLAorCQkJZHdjX290Z19tb2R1bGVfcGFyYW1zLmNvbnRfb25fYm5hKTsKKwl9CisKKwlpZiAoZHdjX290Z19tb2R1bGVfcGFyYW1zLmFoYl9zaW5nbGUgIT0gLTEpIHsKKwkJcmV0dmFsICs9CisJCQlkd2Nfb3RnX3NldF9wYXJhbV9haGJfc2luZ2xlKGNvcmVfaWYsCisJCQlkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWhiX3NpbmdsZSk7CisJfQorCisJaWYgKGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5vdGdfdmVyICE9IC0xKSB7CisJCXJldHZhbCArPQorCQkgICAgZHdjX290Z19zZXRfcGFyYW1fb3RnX3Zlcihjb3JlX2lmLAorCQkJCQkgICAgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3RnX3Zlcik7CisJfQorCWlmIChkd2Nfb3RnX21vZHVsZV9wYXJhbXMuYWRwX2VuYWJsZSAhPSAtMSkgeworCQlyZXR2YWwgKz0KKwkJICAgIGR3Y19vdGdfc2V0X3BhcmFtX2FkcF9lbmFibGUoY29yZV9pZiwKKwkJCQkJCSBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuCisJCQkJCQkgYWRwX2VuYWJsZSk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKworLyoqCisgKiBQbGF0Zm9ybSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBmb3IgVVNCIDIgUEhZCisgKi8KK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3VzYjJfcGh5X2luaXQodm9pZCkKK3sKKwkJdWludDMyX3QgcmRfZGF0YTsKKworI2RlZmluZSBDT01DRVJUT19VU0IwX1BIWV9DVFJMX1JFRzAgCShDT01DRVJUT19EV0MxX0NGR19CQVNFICsgMHgwMDApCisjZGVmaW5lIENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGIAkJKFVTQjJfUEhZX0JBU0UgKyAweDAzQykKKworCisJCS8qIHRha2UgZGV2aWNlIG91dCBvZiByZXNldCAsIGVuYWJsZSBjbG9jay4gKi8KKwkJLyogUHJvZ3JhbW1pbmcgdGhlIFVTQjAgUEhZIENPTlRST0wgUkVHSVNURVIgKi8KKwkJLyoJQml0WzJdOnVzYjBfdmJ1c3ZsZGV4dHNlbCAtIFRoZSBpbnRlcm5hbCBTZXNzaW9uIFZhbGlkIGNvbXBhcmF0b3IgaXMgdXNlZC4KKwkJICogQml0WzNdOnVzYjBfdmJ1c3ZsZGV4dCAtIFRoZSBWQlVTIHNpZ25hbCBpcyBub3QgdmFsaWQsIGFuZCB0aGUgcHVsbC11cCByZXNpc3RvciBvbiBEKyBpcyBkaXNhYmxlZC4KKwkJICogQml0WzRdOnVzYjBfb3RnZGlzYWJsZSAgLSBUVGhlIE9URyBibG9jayBpcyBwb3dlcmVkIHVwLgorCQkgKiBCaXRbMTc6MTZdOnVzYjBfcmVmY2xrZGl2IC0gUmVmZXJlbmNlIENsb2NrIEZyZXF1ZW5jeSBTZWxlY3QsIDQ4IE1IegorCQkgKiBCaXRbMjE6MjBdOnVzYjBfcmVmY2xrc2VsIC0gVGhlIFhPIGJsb2NrIHVzZXMgYW4gZXh0ZXJuYWwsIDIuNSBWIGNsb2NrIHN1cHBsaWVkIG9uIHRoZSBYTyBwaW4uCisJCSAqLworCQlpZihIQUxfZ2V0X3JlZl9jbGsoKSA9PSBSRUZfQ0xLXzI0TUhaKQorCQkJd3JpdGVsKDB4MDAyMTAwMDAsIENPTUNFUlRPX1VTQjBfUEhZX0NUUkxfUkVHMCk7ICAvLzI0TUh6IHJlZiBjbGsKKwkJZWxzZQorCQkJd3JpdGVsKDB4MDAyMjAwMDAsIENPTUNFUlRPX1VTQjBfUEhZX0NUUkxfUkVHMCk7ICAvLzQ4TUh6IHJlZiBjbGsKKworCQkvKiBQcm9ncmFtbWluZyB0aGUgSURTRUwgdmFsdWVzIHRvIFVTQiAyLjAgQ29udHJvbGxlciBAIERXQ19DRkdfUkVHRiByZWdpc3RlciAqLworCQkvKiBDb25maWd1cmluZyB0aGUgdXNiMiBjb250cm9sbGVyIHRvIHNlbGVjdCB0aGUgSUQgdmFsdWUgZnJvbSByZWdpc3RlciAqLworCQlyZF9kYXRhID0gcmVhZGwoQ09NQ0VSVE9fVVNCMF9EV0NfQ0ZHX1JFR0YpOworCisJCS8qCUJpdFs4XTp1c2IwX2lkX3NlbCAtIFNlbGVjdHMgZnJvbSB0aGUgcmVnaXN0ZXIgYml0CisJCSAqCUJpdFs5XTp1c2IxX2lkX3NlbCAtIFNlbGVjdHMgZnJvbSB0aGUgcmVnaXN0ZXIgYml0CisJCSAqLworCQlyZF9kYXRhID0gKChyZF9kYXRhICYgMHhGRkZGMTFGRil8IDB4MDAwMDExMDApOyAgLy9Gb3IgSG9zdCBtb2RlLgorCQl3cml0ZWwgKHJkX2RhdGEsIENPTUNFUlRPX1VTQjBfRFdDX0NGR19SRUdGKTsKKworCisJCS8qIFByb2dyYW1taW5nIFVTQjIuMCBjb250cm9sbGVyIHdpdGggc2NhbGUgZG93biB2YWx1ZS4gKi8KKwkJLyogQ29uZmlndXJpbmcgdGhlIHVzYjIgY29udHJvbGxlciBpbiBzY2FsZWRvd24gZGlzYWJsZSBtb2RlICovCisJCXJkX2RhdGEgPSByZWFkbChDT01DRVJUT19VU0IwX0RXQ19DRkdfUkVHRik7CisJCXJkX2RhdGEgPSAoKHJkX2RhdGEgJiAweEZGRkZGRkYwKXwgMHgwKTsKKwkJd3JpdGVsIChyZF9kYXRhLCBDT01DRVJUT19VU0IwX0RXQ19DRkdfUkVHRik7Cit9CisKKworCisvKioKKyAqIFBsYXRmb3JtIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciBEd2MgT1RHIENvbnRyb2xsZXIKKyAqLworc3RhdGljIHZvaWQgY29tY2VydG9fc3RhcnRfZHdjX290Zyh2b2lkKQoreworCS8qIEdldCB0aGUgRkFTVC1VQVJUIGNsayBzdHJ1Y3R1cmUgZnJvbSBEVVMgLFRvIGJlIHVzZWQgZm9yIFVBUlQwL1VBUlQxIGluaXRpbGl6YXRpb24gKi8KKwl1c2IyX2NsayA9IGNsa19nZXQoTlVMTCwidXNiMCIpOworCisJLyogRW5hYmxlIHRoZSBDbG9jayAqLworCWlmIChjbGtfZW5hYmxlKHVzYjJfY2xrKSl7CisJCXByX2VycigiY29tY2VydG9fc3RhcnRfZHdjX290ZzpVbmFibGUgdG8gZW5hYmxlIHRoZSB1c2IyIGNsb2NrIFxuIik7CisJfQorCisJLyogVVNCIDIuMCBQSFkgSW5pdGlhbGl6YXRpb24gKi8KKwljb21jZXJ0b191c2IyX3BoeV9pbml0KCk7CisKKwkvKiBDb250aW51aW5nIHJlc2V0cyBvbiB1c2IyIGNvbnRyb2xsZXIrcGh5IGJsb2NrcyAqLworCisJLyogQVBQTFlJTkcgVEhFIFJFU0VUIFRPIFVTQjIgVVRNSSAqLworCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VVE1JX1VTQjAsIDEpOworCisJLyogQVBQTFlJTkcgVEhFIFJFU0VUIFRPIFVTQjIgUEhZICovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VTQjBfUEhZLCAxKTsKKworCS8qIEFQTExZSU5HIFJFU0VUIFRPIFVTQjIgQVhJIFJFU0VUICovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9VU0IwLCAxKTsKKworCS8qIFJlbGVhc2luZyB0aGUgKFBPUikgUG93ZXIgb24gUmVzZXQgdG8gdXNiMiBuYW5vIHBoeSBibG9jayAqLworCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VU0IwX1BIWSwgMCk7CisKKwkvKiBSZWxlYXNpbmcgdGhlIFVUTUkgUmVzZXQgdG8gdXNiMiBjb250cm9sbGVyIGJsb2NrICovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VUTUlfVVNCMCwgMCk7CisKKwkvKiBSZWxlYXNpbmcgdGhlIEFIQiBSZXNldCB0byB1c2IyIGNvbnRyb2xsZXIgYmxvY2sgLS0gQml0WzRdLVVTQjMsQml0WzNdLVVTQjIgKi8KKwljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX1VTQjAsIDApOworfQorCisKKy8qKgorICogUGxhdGZvcm0gc3BlY2lmaWMgU2h1dGRvd24gZm9yIER3YyBPVEcgQ29udHJvbGxlcgorICovCitzdGF0aWMgdm9pZCBjb21jZXJ0b19zdG9wX2R3Y19vdGcodm9pZCkKK3sKKwkvKiBBUFBMWUlORyBUSEUgUkVTRVQgVE8gVVNCMiBVVE1JICovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VUTUlfVVNCMCwgMSk7CisKKwkvKiBBUFBMWUlORyBUSEUgUkVTRVQgVE8gVVNCMiBQSFkgKi8KKwljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfVVNCMF9QSFksIDEpOworCisJLyogQVBMTFlJTkcgUkVTRVQgVE8gVVNCMiBBWEkgUkVTRVQgKi8KKwljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX1VTQjAsIDEpOworCisJLyogRGlzYWJsZSB0aGUgQ2xvY2sgKi8KKwljbGtfZGlzYWJsZSh1c2IyX2Nsayk7CisKKwkvKiBSZWxlYXNlIHRoZSBjbG9jayAqLworCWNsa19wdXQodXNiMl9jbGspOworfQorCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgdG9wIGxldmVsIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGUgQ29tbW9uCisgKiAoRGV2aWNlIGFuZCBob3N0IG1vZGVzKSBpbnRlcnJ1cHRzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZHdjX290Z19jb21tb25faXJxKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlpbnQzMl90IHJldHZhbCA9IElSUV9OT05FOworCisJcmV0dmFsID0gZHdjX290Z19oYW5kbGVfY29tbW9uX2ludHIoZGV2KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJUzNDMjQxMFhfQ0xFQVJfRUlOVFBFTkQoKTsKKwl9CisJcmV0dXJuIElSUV9SRVRWQUwocmV0dmFsKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgbG1fZGV2aWNlIGlzIHVucmVnaXN0ZXJlZCB3aXRoIHRoZQorICogZHdjX290Z19kcml2ZXIuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIHJtbW9kIGNvbW1hbmQgaXMKKyAqIGV4ZWN1dGVkLiBUaGUgZGV2aWNlIG1heSBvciBtYXkgbm90IGJlIGVsZWN0cmljYWxseSBwcmVzZW50LiBJZiBpdCBpcworICogcHJlc2VudCwgdGhlIGRyaXZlciBzdG9wcyBkZXZpY2UgcHJvY2Vzc2luZy4gQW55IHJlc291cmNlcyB1c2VkIG9uIGJlaGFsZgorICogb2YgdGhpcyBkZXZpY2UgYXJlIGZyZWVkLgorICoKKyAqIEBwYXJhbSBfZGV2CisgKi8KK3N0YXRpYyB2b2lkIGR3Y19vdGdfZHJpdmVyX3JlbW92ZSgKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwkJCQkJIHN0cnVjdCBsbV9kZXZpY2UgKl9kZXYKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwkJCQkJIHN0cnVjdCBwY2lfZGV2ICpfZGV2CisjZWxzZQorCQkJCQkgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldgorI2VuZGlmCisgICAgKQoreworI2lmZGVmIExNX0lOVEVSRkFDRQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gcGNpX2dldF9kcnZkYXRhKF9kZXYpOworI2Vsc2UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoX2Rldik7CisjZW5kaWYKKworCURXQ19ERUJVR1BMKERCR19BTlksICIlcyglcClcbiIsIF9fZnVuY19fLCBfZGV2KTsKKworCWlmICghb3RnX2RldikgeworCQkvKiBNZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIGR3Y19vdGdfZGV2aWNlIGZhaWxlZC4gKi8KKwkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzOiBvdGdfZGV2IE5VTEwhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisjaWZuZGVmIERXQ19ERVZJQ0VfT05MWQorCWlmIChvdGdfZGV2LT5oY2QpIHsKKwkJaGNkX3JlbW92ZShfZGV2KTsKKwl9IGVsc2UgeworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXM6IG90Z19kZXYtPmhjZCBOVUxMIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKyNpZm5kZWYgRFdDX0hPU1RfT05MWQorCWlmIChvdGdfZGV2LT5wY2QpIHsKKwkJcGNkX3JlbW92ZShfZGV2KTsKKwl9IGVsc2UgeworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXM6IG90Z19kZXYtPnBjZCBOVUxMIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJLyoKKwkgKiBGcmVlIHRoZSBJUlEKKwkgKi8KKwlpZiAob3RnX2Rldi0+Y29tbW9uX2lycV9pbnN0YWxsZWQpIHsKKwkJZnJlZV9pcnEob3RnX2Rldi0+aXJxLCBvdGdfZGV2KTsKKwl9IGVsc2UgeworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXM6IFRoZXJlIGlzIG5vIGluc3RhbGxlZCBpcnEhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAob3RnX2Rldi0+Y29yZV9pZikgeworCQlkd2Nfb3RnX2NpbF9yZW1vdmUob3RnX2Rldi0+Y29yZV9pZik7CisJfSBlbHNlIHsKKwkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzOiBvdGdfZGV2LT5jb3JlX2lmIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFJlbW92ZSB0aGUgZGV2aWNlIGF0dHJpYnV0ZXMKKwkgKi8KKwlkd2Nfb3RnX2F0dHJfcmVtb3ZlKF9kZXYpOworCisJLyoKKwkgKiBSZXR1cm4gdGhlIG1lbW9yeS4KKwkgKi8KKwlpZiAob3RnX2Rldi0+b3NfZGVwLmJhc2UpIHsKKwkJaW91bm1hcChvdGdfZGV2LT5vc19kZXAuYmFzZSk7CisJfQorCisJLyogRG8gdGhlIFBsYXRmb3JtIHNwZWNpZmljIHNodXRkb3duICovCisJY29tY2VydG9fc3RvcF9kd2Nfb3RnKCk7CisKKwlEV0NfRlJFRShvdGdfZGV2KTsKKworCS8qCisJICogQ2xlYXIgdGhlIGRydmRhdGEgcG9pbnRlci4KKwkgKi8KKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlsbV9zZXRfZHJ2ZGF0YShfZGV2LCAwKTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKyAgICByZWxlYXNlX21lbV9yZWdpb24ob3RnX2Rldi0+b3NfZGVwLnJzcmNfc3RhcnQsIG90Z19kZXYtPm9zX2RlcC5yc3JjX2xlbik7CisJcGNpX3NldF9kcnZkYXRhKF9kZXYsIDApOworI2Vsc2UKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShfZGV2LCAwKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYW4gbG1fZGV2aWNlIGlzIGJvdW5kIHRvIGEKKyAqIGR3Y19vdGdfZHJpdmVyLiBJdCBjcmVhdGVzIHRoZSBkcml2ZXIgY29tcG9uZW50cyByZXF1aXJlZCB0bworICogY29udHJvbCB0aGUgZGV2aWNlIChDSUwsIEhDRCwgYW5kIFBDRCkgYW5kIGl0IGluaXRpYWxpemVzIHRoZQorICogZGV2aWNlLiBUaGUgZHJpdmVyIGNvbXBvbmVudHMgYXJlIHN0b3JlZCBpbiBhIGR3Y19vdGdfZGV2aWNlCisgKiBzdHJ1Y3R1cmUuIEEgcmVmZXJlbmNlIHRvIHRoZSBkd2Nfb3RnX2RldmljZSBpcyBzYXZlZCBpbiB0aGUKKyAqIGxtX2RldmljZS4gVGhpcyBhbGxvd3MgdGhlIGRyaXZlciB0byBhY2Nlc3MgdGhlIGR3Y19vdGdfZGV2aWNlCisgKiBzdHJ1Y3R1cmUgb24gc3Vic2VxdWVudCBjYWxscyB0byBkcml2ZXIgbWV0aG9kcyBmb3IgdGhpcyBkZXZpY2UuCisgKgorICogQHBhcmFtIF9kZXYgQnVzIGRldmljZQorICovCitzdGF0aWMgaW50IGR3Y19vdGdfZHJpdmVyX3Byb2JlKAorI2lmZGVmIExNX0lOVEVSRkFDRQorCQkJCSAgICAgICBzdHJ1Y3QgbG1fZGV2aWNlICpfZGV2CisjZWxpZiBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpfZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQKKyNlbHNlCisJCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfZGV2CisjZW5kaWYKKyAgICApCit7CisJaW50IHJldHZhbCA9IDA7CisJZHdjX290Z19kZXZpY2VfdCAqZHdjX290Z19kZXZpY2U7CisKKwlkZXZfZGJnKCZfZGV2LT5kZXYsICJkd2Nfb3RnX2RyaXZlcl9wcm9iZSglcClcbiIsIF9kZXYpOworI2lmZGVmIExNX0lOVEVSRkFDRQorCWRldl9kYmcoJl9kZXYtPmRldiwgInN0YXJ0PTB4JTA4eFxuIiwgKHVuc2lnbmVkKV9kZXYtPnJlc291cmNlLnN0YXJ0KTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlpZiAoIWlkKSB7CisJCURXQ19FUlJPUigiSW52YWxpZCBwY2lfZGV2aWNlX2lkICVwIiwgaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIV9kZXYgfHwgKHBjaV9lbmFibGVfZGV2aWNlKF9kZXYpIDwgMCkpIHsKKwkJRFdDX0VSUk9SKCJJbnZhbGlkIHBjaV9kZXZpY2UgJXAiLCBfZGV2KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRldl9kYmcoJl9kZXYtPmRldiwgInN0YXJ0PTB4JTA4eFxuIiwgKHVuc2lnbmVkKXBjaV9yZXNvdXJjZV9zdGFydChfZGV2LDApKTsKKwkvKiBvdGhlciBzdHVmZiBuZWVkZWQgYXMgd2VsbD8gKi8KKyNlbHNlCisJZGV2X2RiZygmX2Rldi0+ZGV2LCAic3RhcnQ9MHglMDh4XG4iLCAodW5zaWduZWQpX2Rldi0+cmVzb3VyY2UtPnN0YXJ0KTsKKyNlbmRpZgorCisJZHdjX290Z19kZXZpY2UgPSBEV0NfQUxMT0Moc2l6ZW9mKGR3Y19vdGdfZGV2aWNlX3QpKTsKKworCWlmICghZHdjX290Z19kZXZpY2UpIHsKKwkJZGV2X2VycigmX2Rldi0+ZGV2LCAia21hbGxvYyBvZiBkd2Nfb3RnX2RldmljZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoZHdjX290Z19kZXZpY2UsIDAsIHNpemVvZigqZHdjX290Z19kZXZpY2UpKTsKKwlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJlZ19vZmZzZXQgPSAweEZGRkZGRkZGOworCisJLyogUGxhdGZvcm0gU3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKwljb21jZXJ0b19zdGFydF9kd2Nfb3RnKCk7CisKKwlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnBhcmVudD0gJl9kZXYtPmRldjsKKworCS8qCisJICogTWFwIHRoZSBEV0Nfb3RnIENvcmUgbWVtb3J5IGludG8gdmlydHVhbCBhZGRyZXNzIHNwYWNlLgorCSAqLworI2lmZGVmIExNX0lOVEVSRkFDRQorCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSA9IGlvcmVtYXAoX2Rldi0+cmVzb3VyY2Uuc3RhcnQsIFNaXzI1NkspOworCisJaWYgKCFkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpIHsKKwkJZGV2X2VycigmX2Rldi0+ZGV2LCAiaW9yZW1hcCgpIGZhaWxlZFxuIik7CisJCURXQ19GUkVFKGR3Y19vdGdfZGV2aWNlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRldl9kYmcoJl9kZXYtPmRldiwgImJhc2U9MHglMDh4XG4iLAorCQkodW5zaWduZWQpZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlfZGV2LT5jdXJyZW50X3N0YXRlID0gUENJX0QwOworCV9kZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CisKKwlpZiAoIV9kZXYtPmlycSkgeworCQlEV0NfRVJST1IoIkZvdW5kIEhDIHdpdGggbm8gSVJRLiBDaGVjayBCSU9TL1BDSSAlcyBzZXR1cCEiLAorCQkJICBwY2lfbmFtZShfZGV2KSk7CisJCWlvdW5tYXAoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKKwkJRFdDX0ZSRUUoZHdjX290Z19kZXZpY2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoX2RldiwgMCk7CisJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4oX2RldiwgMCk7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwgIlBDSSByZXNvdXJjZTogc3RhcnQ9JTA4eCwgbGVuPSUwOHhcbiIsCisJCSAgICAodW5zaWduZWQpZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX3N0YXJ0LAorCQkgICAgKHVuc2lnbmVkKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19sZW4pOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uCisJICAgIChkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfc3RhcnQsIGR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19sZW4sCisJICAgICAiZHdjX290ZyIpKSB7CisJCWRldl9kYmcoJl9kZXYtPmRldiwgImVycm9yIHJlcXVlc3RpbmcgbWVtb3J5XG4iKTsKKwkJaW91bm1hcChkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOworCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSA9CisJICAgIGlvcmVtYXBfbm9jYWNoZShkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfc3RhcnQsCisJCQkgICAgZHdjX290Z19kZXZpY2UtPm9zX2RlcC5yc3JjX2xlbik7CisJaWYgKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSA9PSBOVUxMKSB7CisJCWRldl9kYmcoJl9kZXYtPmRldiwgImVycm9yIG1hcHBpbmcgbWVtb3J5XG4iKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwKKwkJCQkgICBkd2Nfb3RnX2RldmljZS0+b3NfZGVwLnJzcmNfbGVuKTsKKwkJaW91bm1hcChkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOworCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkZXZfZGJnKCZfZGV2LT5kZXYsICJiYXNlPTB4JXAgKGJlZm9yZSBhZGp1c3QpIFxuIiwKKwkJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKKwlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UgPSAoY2hhciAqKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZTsKKwlkZXZfZGJnKCZfZGV2LT5kZXYsICJiYXNlPTB4JXAgKGFmdGVyIGFkanVzdCkgXG4iLAorCQlkd2Nfb3RnX2RldmljZS0+b3NfZGVwLmJhc2UpOworCWRldl9kYmcoJl9kZXYtPmRldiwgIiVzOiBtYXBwZWQgUEEgMHgleCB0byBWQSAweCVwXG4iLCBfX2Z1bmNfXywKKwkJKHVuc2lnbmVkKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucnNyY19zdGFydCwKKwkJZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKKworCXBjaV9zZXRfbWFzdGVyKF9kZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShfZGV2LCBkd2Nfb3RnX2RldmljZSk7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSA9IGlvcmVtYXAoX2Rldi0+cmVzb3VyY2UtPnN0YXJ0LCBTWl8yNTZLKTsKKworCWlmICghZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKSB7CisJCWRldl9lcnIoJl9kZXYtPmRldiwgImlvcmVtYXAoKSBmYWlsZWRcbiIpOworCQlEV0NfRlJFRShkd2Nfb3RnX2RldmljZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkZXZfZGJnKCZfZGV2LT5kZXYsICJiYXNlPTB4JTA4eFxuIiwKKwkJKHVuc2lnbmVkKWR3Y19vdGdfZGV2aWNlLT5vc19kZXAuYmFzZSk7CisjZW5kaWYKKworCS8qCisJICogUmV0cmlldmUgdGhlIG1lbW9yeSBhbmQgSVJRIHJlc291cmNlcy4KKwkgKi8KKwkgZHdjX290Z19kZXZpY2UtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEoX2RldiwgMCk7CisJaWYgKGR3Y19vdGdfZGV2aWNlLT5pcnEgPD0gMCkgeworCQlkZXZfZXJyKCZfZGV2LT5kZXYsICJubyBkZXZpY2UgaXJxXG4iKTsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSBkcml2ZXIgZGF0YSB0byBwb2ludCB0byB0aGUgZ2xvYmFsIERXQ19vdGcKKwkgKiBEZXZpY2Ugc3RydWN0dXJlLgorCSAqLworI2lmZGVmIExNX0lOVEVSRkFDRQorCWxtX3NldF9kcnZkYXRhKF9kZXYsIGR3Y19vdGdfZGV2aWNlKTsKKyNlbHNlCisJcGxhdGZvcm1fc2V0X2RydmRhdGEoX2RldiwgZHdjX290Z19kZXZpY2UpOworCV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhID0gKHZvaWQgKikgZHdjX290Z19kZXZpY2U7CisjZW5kaWYKKwlkZXZfZGJnKCZfZGV2LT5kZXYsICJkd2Nfb3RnX2RldmljZT0weCVwXG4iLCBkd2Nfb3RnX2RldmljZSk7CisKKwlkd2Nfb3RnX2RldmljZS0+Y29yZV9pZiA9IGR3Y19vdGdfY2lsX2luaXQoZHdjX290Z19kZXZpY2UtPm9zX2RlcC5iYXNlKTsKKwlpZiAoIWR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSB7CisJCWRldl9lcnIoJl9kZXYtPmRldiwgIkNJTCBpbml0aWFsaXphdGlvbiBmYWlsZWQhXG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCS8qCisJICogQXR0ZW1wdCB0byBlbnN1cmUgdGhpcyBkZXZpY2UgaXMgcmVhbGx5IGEgRFdDX290ZyBDb250cm9sbGVyLgorCSAqIFJlYWQgYW5kIHZlcmlmeSB0aGUgU05QU0lEIHJlZ2lzdGVyIGNvbnRlbnRzLiBUaGUgdmFsdWUgc2hvdWxkIGJlCisJICogMHg0NUY0MlhYWCwgd2hpY2ggY29ycmVzcG9uZHMgdG8gIk9UMiIsIGFzIGluICJPVEcgdmVyc2lvbiAyLlhYIi4KKwkgKi8KKworCWlmICgoZHdjX290Z19nZXRfZ3NucHNpZChkd2Nfb3RnX2RldmljZS0+Y29yZV9pZikgJiAweEZGRkZGMDAwKSAhPQorCSAgICAweDRGNTQyMDAwKSB7CisJCWRldl9lcnIoJl9kZXYtPmRldiwgIkJhZCB2YWx1ZSBmb3IgU05QU0lEOiAweCUwOHhcbiIsCisJCQlkd2Nfb3RnX2dldF9nc25wc2lkKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSk7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIFZhbGlkYXRlIHBhcmFtZXRlciB2YWx1ZXMuCisJICovCisJaWYgKHNldF9wYXJhbWV0ZXJzKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgRGV2aWNlIEF0dHJpYnV0ZXMgaW4gc3lzZnMKKwkgKi8KKwlkd2Nfb3RnX2F0dHJfY3JlYXRlKF9kZXYpOworCisJLyoKKwkgKiBEaXNhYmxlIHRoZSBnbG9iYWwgaW50ZXJydXB0IHVudGlsIGFsbCB0aGUgaW50ZXJydXB0CisJICogaGFuZGxlcnMgYXJlIGluc3RhbGxlZC4KKwkgKi8KKwlkd2Nfb3RnX2Rpc2FibGVfZ2xvYmFsX2ludGVycnVwdHMoZHdjX290Z19kZXZpY2UtPmNvcmVfaWYpOworCisJLyoKKwkgKiBJbnN0YWxsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIGNvbW1vbiBpbnRlcnJ1cHRzIGJlZm9yZQorCSAqIGVuYWJsaW5nIGNvbW1vbiBpbnRlcnJ1cHRzIGluIGNvcmVfaW5pdCBiZWxvdy4KKwkgKi8KKwlEV0NfREVCVUdQTChEQkdfQ0lMLCAicmVnaXN0ZXJpbmcgKGNvbW1vbikgaGFuZGxlciBmb3IgaXJxJWRcbiIsCisJCSAgICBkd2Nfb3RnX2RldmljZS0+aXJxKTsKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShkd2Nfb3RnX2RldmljZS0+aXJxLCBkd2Nfb3RnX2NvbW1vbl9pcnEsCisJCQkgICAgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCB8IElSUV9MRVZFTCwgImR3Y19vdGciLAorCQkJICAgICBkd2Nfb3RnX2RldmljZSk7CisJaWYgKHJldHZhbCkgeworCQlEV0NfRVJST1IoInJlcXVlc3Qgb2YgaXJxJWQgZmFpbGVkXG4iLCBkd2Nfb3RnX2RldmljZS0+aXJxKTsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIGZhaWw7CisJfSBlbHNlIHsKKwkJZHdjX290Z19kZXZpY2UtPmNvbW1vbl9pcnFfaW5zdGFsbGVkID0gMTsKKwl9CisKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzZXRfaXJxX3R5cGUoX2Rldi0+aXJxLCBJUlFUX0xPVyk7CisjZW5kaWYKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIERXQ19vdGcgY29yZS4KKwkgKi8KKwlkd2Nfb3RnX2NvcmVfaW5pdChkd2Nfb3RnX2RldmljZS0+Y29yZV9pZik7CisKKyNpZm5kZWYgRFdDX0hPU1RfT05MWQorCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgUENECisJICovCisJcmV0dmFsID0gcGNkX2luaXQoX2Rldik7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCURXQ19FUlJPUigicGNkX2luaXQgZmFpbGVkXG4iKTsKKwkJZHdjX290Z19kZXZpY2UtPnBjZCA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisjZW5kaWYKKyNpZm5kZWYgRFdDX0RFVklDRV9PTkxZCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBIQ0QKKwkgKi8KKwlyZXR2YWwgPSBoY2RfaW5pdChfZGV2KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJRFdDX0VSUk9SKCJoY2RfaW5pdCBmYWlsZWRcbiIpOworCQlkd2Nfb3RnX2RldmljZS0+aGNkID0gTlVMTDsKKwkJZ290byBmYWlsOworCX0KKyNlbmRpZgorI2lmZGVmIFBDSV9JTlRFUkZBQ0UKKwlwY2lfc2V0X2RydmRhdGEoX2RldiwgZHdjX290Z19kZXZpY2UpOworCWR3Y19vdGdfZGV2aWNlLT5vc19kZXAucGNpZGV2ID0gX2RldjsKKyNlbmRpZgorCisJLyoKKwkgKiBFbmFibGUgdGhlIGdsb2JhbCBpbnRlcnJ1cHQgYWZ0ZXIgYWxsIHRoZSBpbnRlcnJ1cHQKKwkgKiBoYW5kbGVycyBhcmUgaW5zdGFsbGVkIGlmIHRoZXJlIGlzIG5vIEFEUCBzdXBwb3J0IGVsc2UKKwkgKiBwZXJmb3JtIGluaXRpYWwgYWN0aW9ucyByZXF1aXJlZCBmb3IgSW50ZXJuYWwgQURQIGxvZ2ljLgorCSAqLworCWlmICghZHdjX290Z19nZXRfcGFyYW1fYWRwX2VuYWJsZShkd2Nfb3RnX2RldmljZS0+Y29yZV9pZikpCisJCWR3Y19vdGdfZW5hYmxlX2dsb2JhbF9pbnRlcnJ1cHRzKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKTsKKwllbHNlCisJCWR3Y19vdGdfYWRwX3N0YXJ0KGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmLAorCQkJCQkJCWR3Y19vdGdfaXNfaG9zdF9tb2RlKGR3Y19vdGdfZGV2aWNlLT5jb3JlX2lmKSk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlkd2Nfb3RnX2RyaXZlcl9yZW1vdmUoX2Rldik7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2lmIDAKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgbWV0aG9kcyB0byBiZSBjYWxsZWQgYnkgYSBidXMgZHJpdmVyCisgKiBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiBhIGRldmljZSBvbiB0aGF0IGJ1cy4gQm90aCBkcml2ZXJzIGFuZAorICogZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGEgYnVzIGRyaXZlci4gVGhlIGJ1cyBkcml2ZXIgbWF0Y2hlcworICogZGV2aWNlcyB0byBkcml2ZXJzIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIHRoZSBkZXZpY2UgYW5kIGRyaXZlcgorICogc3RydWN0dXJlcy4KKyAqCisgKiBUaGUgcHJvYmUgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGJ1cyBkcml2ZXIgbWF0Y2hlcyBhIGRldmljZQorICogdG8gdGhpcyBkcml2ZXIuIFRoZSByZW1vdmUgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMKKyAqIHVucmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMgZHJpdmVyLgorICovCisjaWZkZWYgTE1fSU5URVJGQUNFCitzdGF0aWMgc3RydWN0IGxtX2RyaXZlciBkd2Nfb3RnX2RyaXZlciA9IHsKKwkuZHJ2ID0gey5uYW1lID0gKGNoYXIgKilkd2NfZHJpdmVyX25hbWUsfSwKKwkucHJvYmUgPSBkd2Nfb3RnX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gZHdjX290Z19kcml2ZXJfcmVtb3ZlLAorfTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfaWRzW10gPSB7IHsKKwkJCQkJCSBQQ0lfREVWSUNFKDB4MTZjMywgMHhhYmNkKSwKKwkJCQkJCSAuZHJpdmVyX2RhdGEgPQorCQkJCQkJICh1bnNpZ25lZCBsb25nKTB4ZGVhZGJlZWYsCisJCQkJCQkgfSwgeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV9pZHMpOworCisvKiBwY2kgZHJpdmVyIGdsdWU7IHRoaXMgaXMgYSAibmV3IHN0eWxlIiBQQ0kgZHJpdmVyIG1vZHVsZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGR3Y19vdGdfZHJpdmVyID0geworCS5uYW1lID0gImR3Y19vdGciLAorCS5pZF90YWJsZSA9IHBjaV9pZHMsCisKKwkucHJvYmUgPSBkd2Nfb3RnX2RyaXZlcl9wcm9iZSwKKwkucmVtb3ZlID0gZHdjX290Z19kcml2ZXJfcmVtb3ZlLAorCisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAoY2hhciAqKWR3Y19kcml2ZXJfbmFtZSwKKwkJICAgfSwKK307CisjZW5kaWYKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBkd2Nfb3RnX2RyaXZlciBpcyBpbnN0YWxsZWQgd2l0aCB0aGUKKyAqIGluc21vZCBjb21tYW5kLiBJdCByZWdpc3RlcnMgdGhlIGR3Y19vdGdfZHJpdmVyIHN0cnVjdHVyZSB3aXRoIHRoZQorICogYXBwcm9wcmlhdGUgYnVzIGRyaXZlci4gVGhpcyB3aWxsIGNhdXNlIHRoZSBkd2Nfb3RnX2RyaXZlcl9wcm9iZSBmdW5jdGlvbgorICogdG8gYmUgY2FsbGVkLiBJbiBhZGRpdGlvbiwgdGhlIGJ1cyBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGV4cG9zZQorICogYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGUgZGV2aWNlIGFuZCBkcml2ZXIgaW4gdGhlIHNwZWNpYWwgc3lzZnMgZmlsZQorICogc3lzdGVtLgorICoKKyAqIEByZXR1cm4KKyAqLworc3RhdGljIGludCBfX2luaXQgZHdjX290Z19kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCByZXR2YWwgPSAwOworCWludCBlcnJvcjsKKwlwcmludGsoS0VSTl9JTkZPICIlczogdmVyc2lvbiAlc1xuIiwgZHdjX2RyaXZlcl9uYW1lLAorCSAgICAgICBEV0NfRFJJVkVSX1ZFUlNJT04pOworI2lmZGVmIExNX0lOVEVSRkFDRQorCXJldHZhbCA9IGxtX2RyaXZlcl9yZWdpc3RlcigmZHdjX290Z19kcml2ZXIpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmR3Y19vdGdfZHJpdmVyKTsKKyNlbmRpZgorCWlmIChyZXR2YWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgcmV0dmFsPSVkXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisjaWZkZWYgTE1fSU5URVJGQUNFCisJZXJyb3IgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRydiwgJmRyaXZlcl9hdHRyX3ZlcnNpb24pOworCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcnYsICZkcml2ZXJfYXR0cl9kZWJ1Z2xldmVsKTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwllcnJvciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CisJZXJyb3IgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2RlYnVnbGV2ZWwpOworI2VuZGlmCisJcmV0dXJuIHJldHZhbDsKK30KKworbW9kdWxlX2luaXQoZHdjX290Z19kcml2ZXJfaW5pdCk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsCisgKiB3aXRoIHRoZSBybW1vZCBjb21tYW5kLiBUaGUgZHJpdmVyIHVucmVnaXN0ZXJzIGl0c2VsZiB3aXRoIGl0cyBidXMKKyAqIGRyaXZlci4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgImR3Y19vdGdfZHJpdmVyX2NsZWFudXAoKVxuIik7CisKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRydiwgJmRyaXZlcl9hdHRyX2RlYnVnbGV2ZWwpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJ2LCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CisJbG1fZHJpdmVyX3VucmVnaXN0ZXIoJmR3Y19vdGdfZHJpdmVyKTsKKyNlbGlmIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2RlYnVnbGV2ZWwpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkd2Nfb3RnX2RyaXZlcik7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0lORk8gIiVzIG1vZHVsZSByZW1vdmVkXG4iLCBkd2NfZHJpdmVyX25hbWUpOworfQorCittb2R1bGVfZXhpdChkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKTsKKyNlbHNlCisKKy8qCisgKiBQbGF0Zm9ybSBTcGVjaWZpYyBDb250cm9sbGVyIFN1c3BlbmQgUm91dGllbmUuCisgKiBJdCBkb2VzIGEgUG9ydCBzdXNwZW5kLCBhbmQgZ2F0ZSB0aGUgY2xvY2sgKFBvd2VyIE9mZiBMMSkuCisgKiBDb250cm9sbGVyIGFuZCBQSFkgcmVzZXQgKFBvd2VyIE9mZiBMMikgZnVuY3Rpb25hbGl0eQorICogaXMgbm90IHN1cHBvcnRlZAorICovCitpbnQgY29tY2VydG9fdXNiMl9idXNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICogcGQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnQgZXJyb3Jfc3RhdHVzID0gMCwgdmFsID0gMDsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gTlVMTDsKKworCS8qIENoZWNrIGZvciB0aGUgQml0IE1hc2sgYml0IGZvciBVU0IyLCBpZiBub3QgZW5hYmxlZAorICAgICAgICAgKiB0aGVuIHdlIGFyZSBub3QgZ29pbmcgc3VzcGVuZCB0aGUgVVNCMiBkZXZpY2UgLCBhcyBieQorICAgICAgICAgKiB0aGlzIGRldmljZSAsIHdlIHdpbGwgd2FrZSBmcm9tIHJlc3VtZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICggIShob3N0X3V0aWxwZV9zaGFyZWRfcG11X2JpdG1hc2sgJiBVU0IycDBfSVJRICkpeworCisgICAgICAgICAgICAgICAgLyogV2Ugd2lsbCByZXR1cm4gaGVyZS4KKyAgICAgICAgICAgICAgICAgKiBOb3QgcHJlcGFyZWQgeWV0IGZvciBzdXNwZW5kICwgc28gdGhhdCBkZXZpY2Ugc3VzcGVuZAorICAgICAgICAgICAgICAgICAqIHdpbGwgbm90IG9jY3VyLgorICAgICAgICAgICAgICAgICovCisJCXJldHVybiBlcnJvcl9zdGF0dXM7CisJfQorCisJaGNkID0gKHN0cnVjdCB1c2JfaGNkICopIHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkKTsKKworCS8qIERvIHRoZSBwb3J0IHN1c3BlbmQgZm9yIFVTQiAyLjAgQ29udHJvbGxlciAqLworCWR3Y19vdGdfaG9zdF9wb3J0X3N1c3BlbmQoaGNkKTsKKworCWZvciAodmFsID0gMCA7IHZhbCA8IDUwIDsgdmFsKyspCisJCXVkZWxheSgxMDAwKTsKKworCS8qIERpc2FibGUgdGhlIENsb2NrICovCisJY2xrX2Rpc2FibGUodXNiMl9jbGspOworCisJLyogUE0gUGVyZm9ybWFuY2UgRW5oYW5jZW1lbnQgOiBVU0IwIFBEICovCisJLyogQ29tbW9uIEJsb2NrIFBvd2VyLURvd24gQ29udHJvbCBhbmQgcG93ZXJpbmcgZG93biBhbGwgYW5hbG9nIGJsb2NrcyAqLworCXdyaXRlbCgweDAxMjIwMDQwLCBDT01DRVJUT19VU0IwX1BIWV9DVFJMX1JFRzApOworCisJcmV0dXJuIGVycm9yX3N0YXR1czsKK30KKworLyoKKyAqIFBsYXRmb3JtIFNwZWNpZmljIENvbnRyb2xsZXIgUmVzdW1lIFJvdXRpZW5lLgorICogSXQgZG9lcyBhIFBvcnQgcmVzdW1lLCBhbmQgZW5hYmxlIHRoZSBjbG9jayAoUG93ZXIgT2ZmIEwxKS4KKyAqIFJlc3VtZSBmcm9tIChQb3dlciBPZmYgTDIpIGlzIG5vdCBzdXBwb3J0ZWQKKyAqLworaW50IGNvbWNlcnRvX3VzYjJfYnVzX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZCkKK3sKKwlpbnQgZXJyb3Jfc3RhdHVzID0gMDsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gTlVMTDsKKworCisJLyogQ2hlY2sgZm9yIHRoZSBCaXQgTWFzayBiaXQgZm9yIFVTQjIsIGlmIG5vdCBlbmFibGVkCisgICAgICAgICAqIHRoZW4gd2UgYXJlIG5vdCBnb2luZyBzdXNwZW5kIHRoZSBVU0IyIGRldmljZSAsIGFzIGJ5CisgICAgICAgICAqIHRoaXMgZGV2aWNlICwgd2Ugd2lsbCB3YWtlIGZyb20gcmVzdW1lLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKCBob3N0X3V0aWxwZV9zaGFyZWRfcG11X2JpdG1hc2sgJiBVU0IycDBfSVJRICl7CisKKyAgICAgICAgICAgICAgICAvKiBXZSB3aWxsIHJldHVybiBoZXJlLgorICAgICAgICAgICAgICAgICAqIE5vdCBwcmVwYXJlZCB5ZXQgZm9yIHN1c3BlbmQgLCBzbyB0aGF0IGRldmljZSBzdXNwZW5kCisgICAgICAgICAgICAgICAgICogd2lsbCBub3Qgb2NjdXIuCisgICAgICAgICAgICAgICAgKi8KKwkJcmV0dXJuIGVycm9yX3N0YXR1czsKKwl9CisKKwkvKiBQTSBQZXJmb3JtYW5jZSBFbmhhbmNlbWVudCA6IFVTQjAgUEQgKi8KKwkvKiBDb21tb24gQmxvY2sgUG93ZXItRG93biBDb250cm9sIGFuZCBwb3dlcmluZyBkb3duIGFsbCBhbmFsb2cgYmxvY2tzICovCisJd3JpdGVsKDB4MDAyMjAwMDAsIENPTUNFUlRPX1VTQjBfUEhZX0NUUkxfUkVHMCk7CisKKwkvKiBFbmFibGUgdGhlIENsb2NrICovCisJaWYgKGNsa19lbmFibGUodXNiMl9jbGspKXsKKwkJcHJfZXJyKCJjb21jZXJ0b191c2IyX2J1c19yZXN1bWVfZHVtbXk6VW5hYmxlIHRvIGVuYWJsZSB0aGUgdXNiMiBjbG9jayBcbiIpOworCX0KKworCWhjZCA9IChzdHJ1Y3QgdXNiX2hjZCAqKSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZCk7CisKKwlkd2Nfb3RnX2hvc3RfcG9ydF9yZXN1bWUoaGNkKTsKKworCXJldHVybiBlcnJvcl9zdGF0dXM7Cit9CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgbWV0aG9kcyB0byBiZSBjYWxsZWQgYnkgYSBidXMgZHJpdmVyCisgKiBkdXJpbmcgdGhlIGxpZmVjeWNsZSBvZiBhIGRldmljZSBvbiB0aGF0IGJ1cy4gQm90aCBkcml2ZXJzIGFuZAorICogZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCB3aXRoIGEgYnVzIGRyaXZlci4gVGhlIGJ1cyBkcml2ZXIgbWF0Y2hlcworICogZGV2aWNlcyB0byBkcml2ZXJzIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluIHRoZSBkZXZpY2UgYW5kIGRyaXZlcgorICogc3RydWN0dXJlcy4KKyAqCisgKiBUaGUgcHJvYmUgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGJ1cyBkcml2ZXIgbWF0Y2hlcyBhIGRldmljZQorICogdG8gdGhpcyBkcml2ZXIuIFRoZSByZW1vdmUgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMKKyAqIHVucmVnaXN0ZXJlZCB3aXRoIHRoZSBidXMgZHJpdmVyLgorICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkd2Nfb3RnX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9IChjaGFyICopZHdjX2RyaXZlcl9uYW1lLAorCX0sCisJLnByb2JlCQk9IGR3Y19vdGdfZHJpdmVyX3Byb2JlLAorCS5yZW1vdmUJCT0gZHdjX290Z19kcml2ZXJfcmVtb3ZlLAorCisJLnN1c3BlbmQgPSBjb21jZXJ0b191c2IyX2J1c19zdXNwZW5kLAorCS5yZXN1bWUgPSBjb21jZXJ0b191c2IyX2J1c19yZXN1bWUsCit9OworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGR3Y19vdGdfZHJpdmVyIGlzIGluc3RhbGxlZCB3aXRoIHRoZQorICogaW5zbW9kIGNvbW1hbmQuIEl0IHJlZ2lzdGVycyB0aGUgZHdjX290Z19kcml2ZXIgc3RydWN0dXJlIHdpdGggdGhlCisgKiBhcHByb3ByaWF0ZSBidXMgZHJpdmVyLiBUaGlzIHdpbGwgY2F1c2UgdGhlIGR3Y19vdGdfZHJpdmVyX3Byb2JlIGZ1bmN0aW9uCisgKiB0byBiZSBjYWxsZWQuIEluIGFkZGl0aW9uLCB0aGUgYnVzIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZXhwb3NlCisgKiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoZSBkZXZpY2UgYW5kIGRyaXZlciBpbiB0aGUgc3BlY2lhbCBzeXNmcyBmaWxlCisgKiBzeXN0ZW0uCisgKgorICogQHJldHVybgorICovCitzdGF0aWMgaW50IF9faW5pdCBkd2Nfb3RnX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IGVycm9yOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHZlcnNpb24gJXNcbiIsIGR3Y19kcml2ZXJfbmFtZSwgRFdDX0RSSVZFUl9WRVJTSU9OKTsKKworCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHdjX290Z19kcml2ZXIpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlcyByZXR2YWw9JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWVycm9yID0gZHJpdmVyX2NyZWF0ZV9maWxlKCZkd2Nfb3RnX2RyaXZlci5kcml2ZXIsICZkcml2ZXJfYXR0cl92ZXJzaW9uKTsKKwllcnJvciA9IGRyaXZlcl9jcmVhdGVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfZGVidWdsZXZlbCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorbW9kdWxlX2luaXQoZHdjX290Z19kcml2ZXJfaW5pdCk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZHJpdmVyIGlzIHJlbW92ZWQgZnJvbSB0aGUga2VybmVsCisgKiB3aXRoIHRoZSBybW1vZCBjb21tYW5kLiBUaGUgZHJpdmVyIHVucmVnaXN0ZXJzIGl0c2VsZiB3aXRoIGl0cyBidXMKKyAqIGRyaXZlci4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgImR3Y19vdGdfZHJpdmVyX2NsZWFudXAoKVxuIik7CisKKwlkcml2ZXJfcmVtb3ZlX2ZpbGUoJmR3Y19vdGdfZHJpdmVyLmRyaXZlciwgJmRyaXZlcl9hdHRyX2RlYnVnbGV2ZWwpOworCWRyaXZlcl9yZW1vdmVfZmlsZSgmZHdjX290Z19kcml2ZXIuZHJpdmVyLCAmZHJpdmVyX2F0dHJfdmVyc2lvbik7CisKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHdjX290Z19kcml2ZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgbW9kdWxlIHJlbW92ZWRcbiIsIGR3Y19kcml2ZXJfbmFtZSk7Cit9Cittb2R1bGVfZXhpdChkd2Nfb3RnX2RyaXZlcl9jbGVhbnVwKTsKKworI2VuZGlmCisKK01PRFVMRV9ERVNDUklQVElPTihEV0NfRFJJVkVSX0RFU0MpOworTU9EVUxFX0FVVEhPUigiU3lub3BzeXMgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfcGFyYW1fbmFtZWQob3RnX2NhcCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm90Z19jYXAsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG90Z19jYXAsICJPVEcgQ2FwYWJpbGl0aWVzIDA9SE5QJlNSUCAxPVNSUCBPbmx5IDI9Tm9uZSIpOworbW9kdWxlX3BhcmFtX25hbWVkKG9wdCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm9wdCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mob3B0LCAiT1BUIE1vZGUiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkbWFfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2VuYWJsZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hX2VuYWJsZSwgIkRNQSBNb2RlIDA9U2xhdmUgMT1ETUEgZW5hYmxlZCIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoZG1hX2Rlc2NfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZG1hX2Rlc2NfZW5hYmxlLCBpbnQsCisJCSAgIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkbWFfZGVzY19lbmFibGUsCisJCSAiRE1BIERlc2MgTW9kZSAwPUFkZHJlc3MgRE1BIDE9RE1BIERlc2NyaXB0b3IgZW5hYmxlZCIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoZG1hX2J1cnN0X3NpemUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kbWFfYnVyc3Rfc2l6ZSwgaW50LAorCQkgICAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hX2J1cnN0X3NpemUsCisJCSAiRE1BIEJ1cnN0IFNpemUgMSwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4LCAyNTYiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChzcGVlZCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnNwZWVkLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhzcGVlZCwgIlNwZWVkIDA9SGlnaCBTcGVlZCAxPUZ1bGwgU3BlZWQiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyLAorCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciwgaW50LAorCQkgICAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlciwKKwkJICJTdXBwb3J0IExvdyBQb3dlciB3L0ZTIG9yIExTIDA9U3VwcG9ydCAxPURvbid0IFN1cHBvcnQiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrLAorCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsaywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsaywKKwkJICJMb3cgU3BlZWQgTG93IFBvd2VyIENsb2NrIDA9NDhNaHogMT02TWh6Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZW5hYmxlX2R5bmFtaWNfZmlmbywKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmVuYWJsZV9keW5hbWljX2ZpZm8sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuYWJsZV9keW5hbWljX2ZpZm8sICIwPWNDIFNldHRpbmcgMT1BbGxvdyBEeW5hbWljIFNpemluZyIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRhdGFfZmlmb19zaXplLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGF0YV9maWZvX3NpemUsIGludCwKKwkJICAgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRhdGFfZmlmb19zaXplLAorCQkgIlRvdGFsIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgZGF0YSBGSUZPIG1lbW9yeSAzMi0zMjc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl9yeF9maWZvX3NpemUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcnhfZmlmb19zaXplLAorCQkgICBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfcnhfZmlmb19zaXplLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBSeCBGSUZPIDE2LTMyNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X25wZXJpb190eF9maWZvX3NpemUsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X25wZXJpb190eF9maWZvX3NpemUsCisJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyAxNi0zMjc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfMSwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMF0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMSwKKwkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzIsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzFdLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzIsCisJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8zLAorCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVsyXSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8zLAorCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfNCwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbM10sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNCwKKwkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzUsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzRdLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzUsCisJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV82LAorCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVs1XSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV82LAorCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfNywKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbNl0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfNywKKwkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzgsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzddLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzgsCisJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV85LAorCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVs4XSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV85LAorCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfMTAsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzldLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEwLAorCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfMTEsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzEwXSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8xMSwKKwkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEyLAorCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVsxMV0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMTIsCisJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8xMywKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9wZXJpb190eF9maWZvX3NpemVbMTJdLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfcGVyaW9fdHhfZmlmb19zaXplXzEzLAorCQkgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgcGVyaW9kaWMgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl9wZXJpb190eF9maWZvX3NpemVfMTQsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfcGVyaW9fdHhfZmlmb19zaXplWzEzXSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZV8xNCwKKwkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIHBlcmlvZGljIFR4IEZJRk8gNC03NjgiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZXZfcGVyaW9fdHhfZmlmb19zaXplXzE1LAorCQkgICBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuZGV2X3BlcmlvX3R4X2ZpZm9fc2l6ZVsxNF0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9wZXJpb190eF9maWZvX3NpemVfMTUsCisJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBwZXJpb2RpYyBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9yeF9maWZvX3NpemUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3J4X2ZpZm9fc2l6ZSwKKwkJICAgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaG9zdF9yeF9maWZvX3NpemUsICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIFJ4IEZJRk8gMTYtMzI3NjgiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChob3N0X25wZXJpb190eF9maWZvX3NpemUsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X25wZXJpb190eF9maWZvX3NpemUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZSwKKwkJICJOdW1iZXIgb2Ygd29yZHMgaW4gdGhlIG5vbi1wZXJpb2RpYyBUeCBGSUZPIDE2LTMyNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9wZXJpb190eF9maWZvX3NpemUsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaG9zdF9wZXJpb190eF9maWZvX3NpemUsCisJCSAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBob3N0IHBlcmlvZGljIFR4IEZJRk8gMTYtMzI3NjgiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChtYXhfdHJhbnNmZXJfc2l6ZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLm1heF90cmFuc2Zlcl9zaXplLAorCQkgICBpbnQsIDA0NDQpOworLyoqIEB0b2RvIFNldCB0aGUgbWF4IHRvIDUxMkssIG1vZGlmeSBjaGVja3MgKi8KK01PRFVMRV9QQVJNX0RFU0MobWF4X3RyYW5zZmVyX3NpemUsCisJCSAiVGhlIG1heGltdW0gdHJhbnNmZXIgc2l6ZSBzdXBwb3J0ZWQgaW4gYnl0ZXMgMjA0Ny02NTUzNSIpOworbW9kdWxlX3BhcmFtX25hbWVkKG1heF9wYWNrZXRfY291bnQsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tYXhfcGFja2V0X2NvdW50LAorCQkgICBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhtYXhfcGFja2V0X2NvdW50LAorCQkgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIGluIGEgdHJhbnNmZXIgMTUtNTExIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoaG9zdF9jaGFubmVscywgZHdjX290Z19tb2R1bGVfcGFyYW1zLmhvc3RfY2hhbm5lbHMsIGludCwKKwkJICAgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGhvc3RfY2hhbm5lbHMsCisJCSAiVGhlIG51bWJlciBvZiBob3N0IGNoYW5uZWwgcmVnaXN0ZXJzIHRvIHVzZSAxLTE2Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X2VuZHBvaW50cywgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl9lbmRwb2ludHMsIGludCwKKwkJICAgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl9lbmRwb2ludHMsCisJCSAiVGhlIG51bWJlciBvZiBlbmRwb2ludHMgaW4gYWRkaXRpb24gdG8gRVAwIGF2YWlsYWJsZSBmb3IgZGV2aWNlIG1vZGUgMS0xNSIpOworbW9kdWxlX3BhcmFtX25hbWVkKHBoeV90eXBlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3R5cGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBoeV90eXBlLCAiMD1SZXNlcnZlZCAxPVVUTUkrIDI9VUxQSSIpOworbW9kdWxlX3BhcmFtX25hbWVkKHBoeV91dG1pX3dpZHRoLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMucGh5X3V0bWlfd2lkdGgsIGludCwKKwkJICAgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBoeV91dG1pX3dpZHRoLCAiU3BlY2lmaWVzIHRoZSBVVE1JKyBEYXRhIFdpZHRoIDggb3IgMTYgYml0cyIpOworbW9kdWxlX3BhcmFtX25hbWVkKHBoeV91bHBpX2RkciwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV91bHBpX2RkciwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocGh5X3VscGlfZGRyLAorCQkgIlVMUEkgYXQgZG91YmxlIG9yIHNpbmdsZSBkYXRhIHJhdGUgMD1TaW5nbGUgMT1Eb3VibGUiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChwaHlfdWxwaV9leHRfdmJ1cywgZHdjX290Z19tb2R1bGVfcGFyYW1zLnBoeV91bHBpX2V4dF92YnVzLAorCQkgICBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwaHlfdWxwaV9leHRfdmJ1cywKKwkJICJVTFBJIFBIWSB1c2luZyBpbnRlcm5hbCBvciBleHRlcm5hbCB2YnVzIDA9SW50ZXJuYWwiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChpMmNfZW5hYmxlLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMuaTJjX2VuYWJsZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaTJjX2VuYWJsZSwgIkZTIFBIWSBJbnRlcmZhY2UiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh1bHBpX2ZzX2xzLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudWxwaV9mc19scywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModWxwaV9mc19scywgIlVMUEkgUEhZIEZTL0xTIG1vZGUgb25seSIpOworbW9kdWxlX3BhcmFtX25hbWVkKHRzX2RsaW5lLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudHNfZGxpbmUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHRzX2RsaW5lLCAiVGVybSBzZWxlY3QgRGxpbmUgcHVsc2luZyBmb3IgYWxsIFBIWXMiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgZ19kYmdfbHZsLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIiIpOworCittb2R1bGVfcGFyYW1fbmFtZWQoZW5fbXVsdGlwbGVfdHhfZmlmbywKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmVuX211bHRpcGxlX3R4X2ZpZm8sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVuX211bHRpcGxlX3R4X2ZpZm8sCisJCSAiRGVkaWNhdGVkIE5vbiBQZXJpb2RpYyBUeCBGSUZPcyAwPWRpc2FibGVkIDE9ZW5hYmxlZCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMSwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbMF0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfMSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMiwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbMV0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfMiwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMywKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbMl0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfMywgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNCwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbM10sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfNCwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNSwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbNF0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfNSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNiwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbNV0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfNiwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfNywKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbNl0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfNywgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfOCwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbN10sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfOCwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfOSwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbOF0sIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRldl90eF9maWZvX3NpemVfOSwgIk51bWJlciBvZiB3b3JkcyBpbiB0aGUgVHggRklGTyA0LTc2OCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGRldl90eF9maWZvX3NpemVfMTAsCisJCSAgIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfdHhfZmlmb19zaXplWzldLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzEwLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMSwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbMTBdLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzExLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMiwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbMTFdLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzEyLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xMywKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbMTJdLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzEzLCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xNCwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbMTNdLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzE0LCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X3R4X2ZpZm9fc2l6ZV8xNSwKKwkJICAgZHdjX290Z19tb2R1bGVfcGFyYW1zLmRldl90eF9maWZvX3NpemVbMTRdLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZXZfdHhfZmlmb19zaXplXzE1LCAiTnVtYmVyIG9mIHdvcmRzIGluIHRoZSBUeCBGSUZPIDQtNzY4Iik7CisKK21vZHVsZV9wYXJhbV9uYW1lZCh0aHJfY3RsLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMudGhyX2N0bCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModGhyX2N0bCwKKwkJICJUaHJlc2hvbGRpbmcgZW5hYmxlIGZsYWcgYml0IDAgLSBub24gSVNPIFR4IHRoci4sIDEgLSBJU08gVHggdGhyLiwgMiAtIFJ4IHRoci4tIGJpdCAwPWRpc2FibGVkIDE9ZW5hYmxlZCIpOworbW9kdWxlX3BhcmFtX25hbWVkKHR4X3Rocl9sZW5ndGgsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy50eF90aHJfbGVuZ3RoLCBpbnQsCisJCSAgIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyh0eF90aHJfbGVuZ3RoLCAiVHggVGhyZXNob2xkIGxlbmd0aCBpbiAzMiBiaXQgRFdPUkRzIik7Cittb2R1bGVfcGFyYW1fbmFtZWQocnhfdGhyX2xlbmd0aCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnJ4X3Rocl9sZW5ndGgsIGludCwKKwkJICAgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X3Rocl9sZW5ndGgsICJSeCBUaHJlc2hvbGQgbGVuZ3RoIGluIDMyIGJpdCBEV09SRHMiKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKHB0aV9lbmFibGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5wdGlfZW5hYmxlLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtX25hbWVkKG1waV9lbmFibGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5tcGlfZW5hYmxlLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtX25hbWVkKGxwbV9lbmFibGUsIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5scG1fZW5hYmxlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhscG1fZW5hYmxlLCAiTFBNIEVuYWJsZSAwPUxQTSBEaXNhYmxlZCAxPUxQTSBFbmFibGVkIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoaWNfdXNiX2NhcCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmljX3VzYl9jYXAsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGljX3VzYl9jYXAsCisJCSAiSUNfVVNCIENhcGFiaWxpdHkgMD1JQ19VU0IgRGlzYWJsZWQgMT1JQ19VU0IgRW5hYmxlZCIpOworbW9kdWxlX3BhcmFtX25hbWVkKGFoYl90aHJfcmF0aW8sIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5haGJfdGhyX3JhdGlvLCBpbnQsCisJCSAgIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhaGJfdGhyX3JhdGlvLCAiQUhCIFRocmVzaG9sZCBSYXRpbyIpOworbW9kdWxlX3BhcmFtX25hbWVkKHBvd2VyX2Rvd24sIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5wb3dlcl9kb3duLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9kb3duLCAiUG93ZXIgRG93biBNb2RlIik7Cittb2R1bGVfcGFyYW1fbmFtZWQocmVsb2FkX2N0bCwgZHdjX290Z19tb2R1bGVfcGFyYW1zLnJlbG9hZF9jdGwsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlbG9hZF9jdGwsICJIRklSIFJlbG9hZCBDb250cm9sIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGV2X291dF9uYWssIGR3Y19vdGdfbW9kdWxlX3BhcmFtcy5kZXZfb3V0X25haywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2X291dF9uYWssICJFbmFibGUgRGV2aWNlIE9VVCBOQUsiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChjb250X29uX2JuYSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmNvbnRfb25fYm5hLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhjb250X29uX2JuYSwgIkVuYWJsZSBFbmFibGUgQ29udGludWUgb24gQk5BIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoYWhiX3NpbmdsZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmFoYl9zaW5nbGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFoYl9zaW5nbGUsICJFbmFibGUgQUhCIFNpbmdsZSBTdXBwb3J0Iik7Cittb2R1bGVfcGFyYW1fbmFtZWQoYWRwX2VuYWJsZSwgZHdjX290Z19tb2R1bGVfcGFyYW1zLmFkcF9lbmFibGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGFkcF9lbmFibGUsICJBRFAgRW5hYmxlIDA9QURQIERpc2FibGVkIDE9QURQIEVuYWJsZWQiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChvdGdfdmVyLCBkd2Nfb3RnX21vZHVsZV9wYXJhbXMub3RnX3ZlciwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mob3RnX3ZlciwgIk9URyByZXZpc2lvbiBzdXBwb3J0ZWQgMD1PVEcgMS4zIDE9T1RHIDIuMCIpOworCisvKiogQHBhZ2UgIk1vZHVsZSBQYXJhbWV0ZXJzIgorICoKKyAqIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBtYXkgYmUgc3BlY2lmaWVkIHdoZW4gc3RhcnRpbmcgdGhlIG1vZHVsZS4KKyAqIFRoZXNlIHBhcmFtZXRlcnMgZGVmaW5lIGhvdyB0aGUgRFdDX290ZyBjb250cm9sbGVyIHNob3VsZCBiZQorICogY29uZmlndXJlZC4gUGFyYW1ldGVyIHZhbHVlcyBhcmUgcGFzc2VkIHRvIHRoZSBDSUwgaW5pdGlhbGl6YXRpb24KKyAqIGZ1bmN0aW9uIGR3Y19vdGdfY2lsX2luaXQKKyAqCisgKiBFeGFtcGxlOiA8Y29kZT5tb2Rwcm9iZSBkd2Nfb3RnIHNwZWVkPTEgb3RnX2NhcD0xPC9jb2RlPgorICoKKworIDx0YWJsZT4KKyA8dHI+PHRkPlBhcmFtZXRlciBOYW1lPC90ZD48dGQ+TWVhbmluZzwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+b3RnX2NhcDwvdGQ+CisgPHRkPlNwZWNpZmllcyB0aGUgT1RHIGNhcGFiaWxpdGllcy4gVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZQorIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZiBub25lIGlzIHNwZWNpZmllZC4KKyAtIDA6IEhOUCBhbmQgU1JQIGNhcGFibGUgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKKyAtIDE6IFNSUCBPbmx5IGNhcGFibGUKKyAtIDI6IE5vIEhOUC9TUlAgY2FwYWJsZQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+ZG1hX2VuYWJsZTwvdGQ+CisgPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIHVzZSBzbGF2ZSBvciBETUEgbW9kZSBmb3IgYWNjZXNzaW5nIHRoZSBkYXRhIEZJRk9zLgorIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKKyBzcGVjaWZpZWQuCisgLSAwOiBTbGF2ZQorIC0gMTogRE1BIChkZWZhdWx0LCBpZiBhdmFpbGFibGUpCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5kbWFfYnVyc3Rfc2l6ZTwvdGQ+CisgPHRkPlRoZSBETUEgQnVyc3Qgc2l6ZSAoYXBwbGljYWJsZSBvbmx5IGZvciBFeHRlcm5hbCBETUEgTW9kZSkuCisgLSBWYWx1ZXM6IDEsIDQsIDggMTYsIDMyLCA2NCwgMTI4LCAyNTYgKGRlZmF1bHQgMzIpCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5zcGVlZDwvdGQ+CisgPHRkPlNwZWNpZmllcyB0aGUgbWF4aW11bSBzcGVlZCBvZiBvcGVyYXRpb24gaW4gaG9zdCBhbmQgZGV2aWNlIG1vZGUuIFRoZQorIGFjdHVhbCBzcGVlZCBkZXBlbmRzIG9uIHRoZSBzcGVlZCBvZiB0aGUgYXR0YWNoZWQgZGV2aWNlIGFuZCB0aGUgdmFsdWUgb2YKKyBwaHlfdHlwZS4KKyAtIDA6IEhpZ2ggU3BlZWQgKGRlZmF1bHQpCisgLSAxOiBGdWxsIFNwZWVkCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5ob3N0X3N1cHBvcnRfZnNfbHNfbG93X3Bvd2VyPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgbG93IHBvd2VyIG1vZGUgaXMgc3VwcG9ydGVkIHdoZW4gYXR0YWNoZWQgdG8gYSBGdWxsCisgU3BlZWQgb3IgTG93IFNwZWVkIGRldmljZSBpbiBob3N0IG1vZGUuCisgLSAwOiBEb24ndCBzdXBwb3J0IGxvdyBwb3dlciBtb2RlIChkZWZhdWx0KQorIC0gMTogU3VwcG9ydCBsb3cgcG93ZXIgbW9kZQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+aG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsazwvdGQ+CisgPHRkPlNwZWNpZmllcyB0aGUgUEhZIGNsb2NrIHJhdGUgaW4gbG93IHBvd2VyIG1vZGUgd2hlbiBjb25uZWN0ZWQgdG8gYSBMb3cKKyBTcGVlZCBkZXZpY2UgaW4gaG9zdCBtb2RlLiBUaGlzIHBhcmFtZXRlciBpcyBhcHBsaWNhYmxlIG9ubHkgaWYKKyBIT1NUX1NVUFBPUlRfRlNfTFNfTE9XX1BPV0VSIGlzIGVuYWJsZWQuCisgLSAwOiA0OCBNSHogKGRlZmF1bHQpCisgLSAxOiA2IE1IegorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+ZW5hYmxlX2R5bmFtaWNfZmlmbzwvdGQ+CisgPHRkPiBTcGVjaWZpZXMgd2hldGhlciBGSUZPcyBtYXkgYmUgcmVzaXplZCBieSB0aGUgZHJpdmVyIHNvZnR3YXJlLgorIC0gMDogVXNlIGNDIEZJRk8gc2l6ZSBwYXJhbWV0ZXJzCisgLSAxOiBBbGxvdyBkeW5hbWljIEZJRk8gc2l6aW5nIChkZWZhdWx0KQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+ZGF0YV9maWZvX3NpemU8L3RkPgorIDx0ZD5Ub3RhbCBudW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBkYXRhIEZJRk8gbWVtb3J5LiBUaGlzIG1lbW9yeQorIGluY2x1ZGVzIHRoZSBSeCBGSUZPLCBub24tcGVyaW9kaWMgVHggRklGTywgYW5kIHBlcmlvZGljIFR4IEZJRk9zLgorIC0gVmFsdWVzOiAzMiB0byAzMjc2OCAoZGVmYXVsdCA4MTkyKQorCisgTm90ZTogVGhlIHRvdGFsIEZJRk8gbWVtb3J5IGRlcHRoIGluIHRoZSBGUEdBIGNvbmZpZ3VyYXRpb24gaXMgODE5Mi4KKyA8L3RkPjwvdHI+CisKKyA8dHI+CisgPHRkPmRldl9yeF9maWZvX3NpemU8L3RkPgorIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBSeCBGSUZPIGluIGRldmljZSBtb2RlIHdoZW4gZHluYW1pYworIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQuCisgLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwNjQpCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5kZXZfbnBlcmlvX3R4X2ZpZm9fc2l6ZTwvdGQ+CisgPHRkPk51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIG5vbi1wZXJpb2RpYyBUeCBGSUZPIGluIGRldmljZSBtb2RlIHdoZW4KKyBkeW5hbWljIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQuCisgLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwMjQpCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5kZXZfcGVyaW9fdHhfZmlmb19zaXplX24gKG4gPSAxIHRvIDE1KTwvdGQ+CisgPHRkPk51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gZWFjaCBvZiB0aGUgcGVyaW9kaWMgVHggRklGT3MgaW4gZGV2aWNlIG1vZGUKKyB3aGVuIGR5bmFtaWMgRklGTyBzaXppbmcgaXMgZW5hYmxlZC4KKyAtIFZhbHVlczogNCB0byA3NjggKGRlZmF1bHQgMjU2KQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+aG9zdF9yeF9maWZvX3NpemU8L3RkPgorIDx0ZD5OdW1iZXIgb2YgNC1ieXRlIHdvcmRzIGluIHRoZSBSeCBGSUZPIGluIGhvc3QgbW9kZSB3aGVuIGR5bmFtaWMgRklGTworIHNpemluZyBpcyBlbmFibGVkLgorIC0gVmFsdWVzOiAxNiB0byAzMjc2OCAoZGVmYXVsdCAxMDI0KQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+aG9zdF9ucGVyaW9fdHhfZmlmb19zaXplPC90ZD4KKyA8dGQ+TnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiB0aGUgbm9uLXBlcmlvZGljIFR4IEZJRk8gaW4gaG9zdCBtb2RlIHdoZW4KKyBkeW5hbWljIEZJRk8gc2l6aW5nIGlzIGVuYWJsZWQgaW4gdGhlIGNvcmUuCisgLSBWYWx1ZXM6IDE2IHRvIDMyNzY4IChkZWZhdWx0IDEwMjQpCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5ob3N0X3BlcmlvX3R4X2ZpZm9fc2l6ZTwvdGQ+CisgPHRkPk51bWJlciBvZiA0LWJ5dGUgd29yZHMgaW4gdGhlIGhvc3QgcGVyaW9kaWMgVHggRklGTyB3aGVuIGR5bmFtaWMgRklGTworIHNpemluZyBpcyBlbmFibGVkLgorIC0gVmFsdWVzOiAxNiB0byAzMjc2OCAoZGVmYXVsdCAxMDI0KQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+bWF4X3RyYW5zZmVyX3NpemU8L3RkPgorIDx0ZD5UaGUgbWF4aW11bSB0cmFuc2ZlciBzaXplIHN1cHBvcnRlZCBpbiBieXRlcy4KKyAtIFZhbHVlczogMjA0NyB0byA2NSw1MzUgKGRlZmF1bHQgNjUsNTM1KQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+bWF4X3BhY2tldF9jb3VudDwvdGQ+CisgPHRkPlRoZSBtYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIGluIGEgdHJhbnNmZXIuCisgLSBWYWx1ZXM6IDE1IHRvIDUxMSAoZGVmYXVsdCA1MTEpCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5ob3N0X2NoYW5uZWxzPC90ZD4KKyA8dGQ+VGhlIG51bWJlciBvZiBob3N0IGNoYW5uZWwgcmVnaXN0ZXJzIHRvIHVzZS4KKyAtIFZhbHVlczogMSB0byAxNiAoZGVmYXVsdCAxMikKKworIE5vdGU6IFRoZSBGUEdBIGNvbmZpZ3VyYXRpb24gc3VwcG9ydHMgYSBtYXhpbXVtIG9mIDEyIGhvc3QgY2hhbm5lbHMuCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5kZXZfZW5kcG9pbnRzPC90ZD4KKyA8dGQ+VGhlIG51bWJlciBvZiBlbmRwb2ludHMgaW4gYWRkaXRpb24gdG8gRVAwIGF2YWlsYWJsZSBmb3IgZGV2aWNlIG1vZGUKKyBvcGVyYXRpb25zLgorIC0gVmFsdWVzOiAxIHRvIDE1IChkZWZhdWx0IDYgSU4gYW5kIE9VVCkKKworIE5vdGU6IFRoZSBGUEdBIGNvbmZpZ3VyYXRpb24gc3VwcG9ydHMgYSBtYXhpbXVtIG9mIDYgSU4gYW5kIE9VVCBlbmRwb2ludHMgaW4KKyBhZGRpdGlvbiB0byBFUDAuCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5waHlfdHlwZTwvdGQ+CisgPHRkPlNwZWNpZmllcyB0aGUgdHlwZSBvZiBQSFkgaW50ZXJmYWNlIHRvIHVzZS4gQnkgZGVmYXVsdCwgdGhlIGRyaXZlciB3aWxsCisgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHBoeV90eXBlLgorIC0gMDogRnVsbCBTcGVlZAorIC0gMTogVVRNSSsgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKKyAtIDI6IFVMUEkKKyA8L3RkPjwvdHI+CisKKyA8dHI+CisgPHRkPnBoeV91dG1pX3dpZHRoPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHRoZSBVVE1JKyBEYXRhIFdpZHRoLiBUaGlzIHBhcmFtZXRlciBpcyBhcHBsaWNhYmxlIGZvciBhCisgcGh5X3R5cGUgb2YgVVRNSSsuIEFsc28sIHRoaXMgcGFyYW1ldGVyIGlzIGFwcGxpY2FibGUgb25seSBpZiB0aGUKKyBPVEdfSFNQSFlfV0lEVEggY0MgcGFyYW1ldGVyIHdhcyBzZXQgdG8gIjggYW5kIDE2IGJpdHMiLCBtZWFuaW5nIHRoYXQgdGhlCisgY29yZSBoYXMgYmVlbiBjb25maWd1cmVkIHRvIHdvcmsgYXQgZWl0aGVyIGRhdGEgcGF0aCB3aWR0aC4KKyAtIFZhbHVlczogOCBvciAxNiBiaXRzIChkZWZhdWx0IDE2KQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+cGh5X3VscGlfZGRyPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdGhlIFVMUEkgb3BlcmF0ZXMgYXQgZG91YmxlIG9yIHNpbmdsZSBkYXRhIHJhdGUuIFRoaXMKKyBwYXJhbWV0ZXIgaXMgb25seSBhcHBsaWNhYmxlIGlmIHBoeV90eXBlIGlzIFVMUEkuCisgLSAwOiBzaW5nbGUgZGF0YSByYXRlIFVMUEkgaW50ZXJmYWNlIHdpdGggOCBiaXQgd2lkZSBkYXRhIGJ1cyAoZGVmYXVsdCkKKyAtIDE6IGRvdWJsZSBkYXRhIHJhdGUgVUxQSSBpbnRlcmZhY2Ugd2l0aCA0IGJpdCB3aWRlIGRhdGEgYnVzCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5pMmNfZW5hYmxlPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gdXNlIHRoZSBJMkMgaW50ZXJmYWNlIGZvciBmdWxsIHNwZWVkIFBIWS4gVGhpcworIHBhcmFtZXRlciBpcyBvbmx5IGFwcGxpY2FibGUgaWYgUEhZX1RZUEUgaXMgRlMuCisgLSAwOiBEaXNhYmxlZCAoZGVmYXVsdCkKKyAtIDE6IEVuYWJsZWQKKyA8L3RkPjwvdHI+CisKKyA8dHI+CisgPHRkPnVscGlfZnNfbHM8L3RkPgorIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byB1c2UgVUxQSSBGUy9MUyBtb2RlIG9ubHkuCisgLSAwOiBEaXNhYmxlZCAoZGVmYXVsdCkKKyAtIDE6IEVuYWJsZWQKKyA8L3RkPjwvdHI+CisKKyA8dHI+CisgPHRkPnRzX2RsaW5lPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdGVybSBzZWxlY3QgRC1MaW5lIHB1bHNpbmcgZm9yIGFsbCBQSFlzIGlzIGVuYWJsZWQuCisgLSAwOiBEaXNhYmxlZCAoZGVmYXVsdCkKKyAtIDE6IEVuYWJsZWQKKyA8L3RkPjwvdHI+CisKKyA8dHI+CisgPHRkPmVuX211bHRpcGxlX3R4X2ZpZm88L3RkPgorIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBkZWRpY2F0ZWR0byB0eCBmaWZvcyBhcmUgZW5hYmxlZCBmb3Igbm9uIHBlcmlvZGljIElOIEVQcy4KKyBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZiBub25lIGlzCisgc3BlY2lmaWVkLgorIC0gMDogRGlzYWJsZWQKKyAtIDE6IEVuYWJsZWQgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKKyA8L3RkPjwvdHI+CisKKyA8dHI+CisgPHRkPmRldl90eF9maWZvX3NpemVfbiAobiA9IDEgdG8gMTUpPC90ZD4KKyA8dGQ+TnVtYmVyIG9mIDQtYnl0ZSB3b3JkcyBpbiBlYWNoIG9mIHRoZSBUeCBGSUZPcyBpbiBkZXZpY2UgbW9kZQorIHdoZW4gZHluYW1pYyBGSUZPIHNpemluZyBpcyBlbmFibGVkLgorIC0gVmFsdWVzOiA0IHRvIDc2OCAoZGVmYXVsdCAyNTYpCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD50eF90aHJfbGVuZ3RoPC90ZD4KKyA8dGQ+VHJhbnNtaXQgVGhyZXNob2xkIGxlbmd0aCBpbiAzMiBiaXQgZG91YmxlIHdvcmRzCisgLSBWYWx1ZXM6IDggdG8gMTI4IChkZWZhdWx0IDY0KQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+cnhfdGhyX2xlbmd0aDwvdGQ+CisgPHRkPlJlY2VpdmUgVGhyZXNob2xkIGxlbmd0aCBpbiAzMiBiaXQgZG91YmxlIHdvcmRzCisgLSBWYWx1ZXM6IDggdG8gMTI4IChkZWZhdWx0IDY0KQorIDwvdGQ+PC90cj4KKworPHRyPgorIDx0ZD50aHJfY3RsPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIFRocmVzaG9sZGluZyBmb3IgRGV2aWNlIG1vZGUuIEJpdHMgMCwgMSwgMiBvZgorIHRoaXMgcGFybWF0ZXIgc3BlY2lmaWVzIGlmIHRocmVzaG9sZGluZyBpcyBlbmFibGVkIGZvciBub24tSXNvIFR4LCBJc28gVHggYW5kCisgUnggdHJhbnNmZXJzIGFjY29yZGluZ2x5LgorIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKKyBzcGVjaWZpZWQuCisgLSBWYWx1ZXM6IDAgdG8gNyAoZGVmYXVsdCAwKQorIEJpdCB2YWx1ZXMgaW5kaWNhdGU6CisgLSAwOiBUaHJlc2hvbGRpbmcgZGlzYWJsZWQKKyAtIDE6IFRocmVzaG9sZGluZyBlbmFibGVkCisgPC90ZD48L3RyPgorCis8dHI+CisgPHRkPmRtYV9kZXNjX2VuYWJsZTwvdGQ+CisgPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBEZXNjcmlwdG9yIERNQSBtb2RlLgorIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKKyBzcGVjaWZpZWQuCisgLSAwOiBEZXNjcmlwdG9yIERNQSBkaXNhYmxlZAorIC0gMTogRGVzY3JpcHRvciBETUEgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKKyA8L3RkPjwvdHI+CisKKzx0cj4KKyA8dGQ+bXBpX2VuYWJsZTwvdGQ+CisgPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGVuYWJsZSBNUEkgZW5oYW5jZW1lbnQgbW9kZS4KKyBUaGUgZHJpdmVyIHdpbGwgYXV0b21hdGljYWxseSBkZXRlY3QgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlciBpZiBub25lIGlzCisgc3BlY2lmaWVkLgorIC0gMDogTVBJIGRpc2FibGVkIChkZWZhdWx0KQorIC0gMTogTVBJIGVuYWJsZQorIDwvdGQ+PC90cj4KKworPHRyPgorIDx0ZD5wdGlfZW5hYmxlPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIFBUSSBlbmhhbmNlbWVudCBzdXBwb3J0LgorIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKKyBzcGVjaWZpZWQuCisgLSAwOiBQVEkgZGlzYWJsZWQgKGRlZmF1bHQpCisgLSAxOiBQVEkgZW5hYmxlCisgPC90ZD48L3RyPgorCis8dHI+CisgPHRkPmxwbV9lbmFibGU8L3RkPgorIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBlbmFibGUgTFBNIHN1cHBvcnQuCisgVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYgbm9uZSBpcworIHNwZWNpZmllZC4KKyAtIDA6IExQTSBkaXNhYmxlZAorIC0gMTogTFBNIGVuYWJsZSAoZGVmYXVsdCwgaWYgYXZhaWxhYmxlKQorIDwvdGQ+PC90cj4KKworPHRyPgorIDx0ZD5pY191c2JfY2FwPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdG8gZW5hYmxlIElDX1VTQiBjYXBhYmlsaXR5LgorIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKKyBzcGVjaWZpZWQuCisgLSAwOiBJQ19VU0IgZGlzYWJsZWQgKGRlZmF1bHQsIGlmIGF2YWlsYWJsZSkKKyAtIDE6IElDX1VTQiBlbmFibGUKKyA8L3RkPjwvdHI+CisKKzx0cj4KKyA8dGQ+YWhiX3Rocl9yYXRpbzwvdGQ+CisgPHRkPlNwZWNpZmllcyBBSEIgVGhyZXNob2xkIHJhdGlvLgorIC0gVmFsdWVzOiAwIHRvIDMgKGRlZmF1bHQgMCkKKyA8L3RkPjwvdHI+CisKKzx0cj4KKyA8dGQ+cG93ZXJfZG93bjwvdGQ+CisgPHRkPlNwZWNpZmllcyBQb3dlciBEb3duKEhpYmVybmF0aW9uKSBNb2RlLgorIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKKyBzcGVjaWZpZWQuCisgLSAwOiBQb3dlciBEb3duIGRpc2FibGVkIChkZWZhdWx0KQorIC0gMjogUG93ZXIgRG93biBlbmFibGVkCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5yZWxvYWRfY3RsPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgZHluYW1pYyByZWxvYWRpbmcgb2YgdGhlIEhGSVIgcmVnaXN0ZXIgaXMgYWxsb3dlZCBkdXJpbmcKKyBydW4gdGltZS4gVGhlIGRyaXZlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHRoZSB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaWYKKyBub25lIGlzIHNwZWNpZmllZC4gSW4gY2FzZSB0aGUgSEZJUiB2YWx1ZSBpcyByZWxvYWRlZCB3aGVuIEhGSVIuUmxkQ3RybCA9PSAxJ2IwCisgdGhlIGNvcmUgbWlnaHQgbWlzYmVoYXZlLgorIC0gMDogUmVsb2FkIENvbnRyb2wgZGlzYWJsZWQgKGRlZmF1bHQpCisgLSAxOiBSZWxvYWQgQ29udHJvbCBlbmFibGVkCisgPC90ZD48L3RyPgorCisgPHRyPgorIDx0ZD5kZXZfb3V0X25hazwvdGQ+CisgPHRkPlNwZWNpZmllcyB3aGV0aGVyICBEZXZpY2UgT1VUIE5BSyBlbmhhbmNlbWVudCBlbmFibGVkIG9yIG5vLgorIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmCisgbm9uZSBpcyBzcGVjaWZpZWQuIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgd2hlbiBPVEdfRU5fREVTQ19ETUEgPT0gMZJiMS4KKyAtIDA6IFRoZSBjb3JlIGRvZXMgbm90IHNldCBOQUsgYWZ0ZXIgQnVsayBPVVQgdHJhbnNmZXIgY29tcGxldGUgKGRlZmF1bHQpCisgLSAxOiBUaGUgY29yZSBzZXRzIE5BSyBhZnRlciBCdWxrIE9VVCB0cmFuc2ZlciBjb21wbGV0ZQorIDwvdGQ+PC90cj4KKworIDx0cj4KKyA8dGQ+Y29udF9vbl9ibmE8L3RkPgorIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBFbmFibGUgQ29udGludWUgb24gQk5BIGVuYWJsZWQgb3Igbm8uCisgQWZ0ZXIgcmVjZWl2aW5nIEJOQSBpbnRlcnJ1cHQgdGhlIGNvcmUgZGlzYWJsZXMgdGhlIGVuZHBvaW50LHdoZW4gdGhlCisgZW5kcG9pbnQgaXMgcmUtZW5hYmxlZCBieSB0aGUgYXBwbGljYXRpb24gdGhlCisgLSAwOiBDb3JlIHN0YXJ0cyBwcm9jZXNzaW5nIGZyb20gdGhlIERPRVBETUEgZGVzY3JpcHRvciAoZGVmYXVsdCkKKyAtIDE6IENvcmUgc3RhcnRzIHByb2Nlc3NpbmcgZnJvbSB0aGUgZGVzY3JpcHRvciB3aGljaCByZWNlaXZlZCB0aGUgQk5BLgorIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgd2hlbiBPVEdfRU5fREVTQ19ETUEgPT0gMZJiMS4KKyA8L3RkPjwvdHI+CisKKyA8dHI+CisgPHRkPmFoYl9zaW5nbGU8L3RkPgorIDx0ZD5UaGlzIGJpdCB3aGVuIHByb2dyYW1tZWQgc3VwcG9ydHMgU0lOR0xFIHRyYW5zZmVycyBmb3IgcmVtYWluZGVyIGRhdGEKKyBpbiBhIHRyYW5zZmVyIGZvciBETUEgbW9kZSBvZiBvcGVyYXRpb24uCisgLSAwOiBUaGUgcmVtYWluZGVyIGRhdGEgd2lsbCBiZSBzZW50IHVzaW5nIElOQ1IgYnVyc3Qgc2l6ZSAoZGVmYXVsdCkKKyAtIDE6IFRoZSByZW1haW5kZXIgZGF0YSB3aWxsIGJlIHNlbnQgdXNpbmcgU0lOR0xFIGJ1cnN0IHNpemUuCisgPC90ZD48L3RyPgorCis8dHI+CisgPHRkPmFkcF9lbmFibGU8L3RkPgorIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBBRFAgZmVhdHVyZSBpcyBlbmFibGVkLgorIFRoZSBkcml2ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdCB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyIGlmIG5vbmUgaXMKKyBzcGVjaWZpZWQuCisgLSAwOiBBRFAgZmVhdHVyZSBkaXNhYmxlZCAoZGVmYXVsdCkKKyAtIDE6IEFEUCBmZWF0dXJlIGVuYWJsZWQKKyA8L3RkPjwvdHI+CisKKyAgPHRyPgorIDx0ZD5vdGdfdmVyPC90ZD4KKyA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgT1RHIGlzIHBlcmZvcm1pbmcgYXMgVVNCIE9URyBSZXZpc2lvbiAyLjAgb3IgUmV2aXNpb24gMS4zCisgVVNCIE9URyBkZXZpY2UuCisgLSAwOiBPVEcgMi4wIHN1cHBvcnQgZGlzYWJsZWQgKGRlZmF1bHQpCisgLSAxOiBPVEcgMi4wIHN1cHBvcnQgZW5hYmxlZAorIDwvdGQ+PC90cj4KKworKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19kcml2ZXIuaCBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19kcml2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTNjZjIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2RyaXZlci5oCkBAIC0wLDAgKzEsODggQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAkRmlsZTogLy9kd2gvdXNiX2lpcC9kZXYvc29mdHdhcmUvb3RnL2xpbnV4L2RyaXZlcnMvZHdjX290Z19kcml2ZXIuaCAkCisgKiAkUmV2aXNpb246ICMxOSAkCisgKiAkRGF0ZTogMjAxMC8xMS8xNSAkCisgKiAkQ2hhbmdlOiAxNjI3NjcxICQKKyAqCisgKiBTeW5vcHN5cyBIUyBPVEcgTGludXggU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIChoZXJlaW5hZnRlciwKKyAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqIAorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKKyAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gdXNlIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgKiBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwgZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IKKyAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQorICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgKiBiZWxvdywgdGhlbiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgX19EV0NfT1RHX0RSSVZFUl9IX18KKyNkZWZpbmUgX19EV0NfT1RHX0RSSVZFUl9IX18KKworLyoqIEBmaWxlCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGludGVyZmFjZSB0byB0aGUgTGludXggZHJpdmVyLgorICovCisjaW5jbHVkZSAiZHdjX290Z19vc19kZXAuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2NvcmVfaWYuaCIKKworLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KK3N0cnVjdCBkd2Nfb3RnX3BjZDsKK3N0cnVjdCBkd2Nfb3RnX2hjZDsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBhIHdyYXBwZXIgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGRyaXZlciBjb21wb25lbnRzIHVzZWQgdG8KKyAqIG1hbmFnZSBhIHNpbmdsZSBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y19vdGdfZGV2aWNlIHsKKwkvKiogU3RydWN0dXJlIGNvbnRhaW5pbmcgT1MtZGVwZW5kZW50IHN0dWZmLiBLRUVQIFRISVMgU1RSVUNUIEFUIFRIRQorCSAqIFZFUlkgQkVHSU5OSU5HIE9GIFRIRSBERVZJQ0UgU1RSVUNULiBPU2VzIHN1Y2ggYXMgRnJlZUJTRCBhbmQgTmV0QlNECisJICogcmVxdWlyZSB0aGlzLiAqLworCXN0cnVjdCBvc19kZXBlbmRlbnQgb3NfZGVwOworCisJLyoqIFBvaW50ZXIgdG8gdGhlIGNvcmUgaW50ZXJmYWNlIHN0cnVjdHVyZS4gKi8KKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZjsKKworCS8qKiBQb2ludGVyIHRvIHRoZSBQQ0Qgc3RydWN0dXJlLiAqLworCXN0cnVjdCBkd2Nfb3RnX3BjZCAqcGNkOworCisJLyoqIFBvaW50ZXIgdG8gdGhlIEhDRCBzdHJ1Y3R1cmUuICovCisJc3RydWN0IGR3Y19vdGdfaGNkICpoY2Q7CisKKwkvKiogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb21tb24gSVJRIGhhbmRsZXIgaXMgaW5zdGFsbGVkLiAqLworCXVpbnQ4X3QgY29tbW9uX2lycV9pbnN0YWxsZWQ7CisKKwkvKiBJbnRlcnJ1cHQgcmVxdWVzdCBudW1iZXIuICovCisJdW5zaWduZWQgaW50IGlycTsKK30gZHdjX290Z19kZXZpY2VfdDsKKworLypXZSBtdXN0IGNsZWFyIFMzQzI0WFhfRUlOVFBFTkQgZXh0ZXJuYWwgaW50ZXJydXB0IHJlZ2lzdGVyIAorICogYmVjYXVzZSBhZnRlciBjbGVhcmluZyBpbiB0aGlzIHJlZ2lzdGVyIHRyaWdlcnJlZCBJUlEgZnJvbSAKKyAqIEgvVyBjb3JlIGluIGtlcm5lbCBpbnRlcnJ1cHQgY2FuIGJlIG9jY3VyZWQgYWdhaW4gYmVmb3JlIE9URworICogaGFuZGxlcnMgY2xlYXIgYWxsIElSUSBzb3VyY2VzIG9mIENvcmUgcmVnaXN0ZXJzIGJlY2F1c2Ugb2YKKyAqIHRpbWluZyBsYXRlbmNpZXMgYW5kIExvdyBMZXZlbCBJUlEgVHlwZS4KKyAqLworI2lmZGVmIENPTkZJR19NQUNIX0lQTUFURQorI2RlZmluZSAgUzNDMjQxMFhfQ0xFQVJfRUlOVFBFTkQoKSAgIFwKK2RvIHsgXAorCV9fcmF3X3dyaXRlbCgxVUwgPDwgMTEsUzNDMjRYWF9FSU5UUEVORCk7IFwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSAgUzNDMjQxMFhfQ0xFQVJfRUlOVFBFTkQoKSAgIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19oY2QuYyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19oY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDlmNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2hjZC5jCkBAIC0wLDAgKzEsMzM0OCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9vdGcvbGludXgvZHJpdmVycy9kd2Nfb3RnX2hjZC5jICQKKyAqICRSZXZpc2lvbjogIzEwNCAkCisgKiAkRGF0ZTogMjAxMS8xMC8yNCAkCisgKiAkQ2hhbmdlOiAxODcxMTU5ICQKKyAqCisgKiBTeW5vcHN5cyBIUyBPVEcgTGludXggU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIChoZXJlaW5hZnRlciwKKyAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdCB1bmRlcgorICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAorICogd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKKyAqIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLCBkaXNjbG9zZSwgY29weSBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSBvcgorICogYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tCisgKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKKyAqIGJlbG93LCB0aGVuIHlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBEV0NfREVWSUNFX09OTFkKKworLyoqIEBmaWxlCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBIQ0QgQ29yZS4gQWxsIGNvZGUgaW4gdGhpcyBmaWxlIGlzIHBvcnRhYmxlIGFuZCBkb2Vzbid0CisgKiB1c2UgYW55IE9TIHNwZWNpZmljIGZ1bmN0aW9ucy4KKyAqIEludGVyZmFjZSBwcm92aWRlZCBieSBIQ0QgQ29yZSBpcyBkZWZpbmVkIGluIDxjb2RlPjxoY2RfaWYuaD48L2NvZGU+CisgKiBoZWFkZXIgZmlsZS4KKyAqLworCisjaW5jbHVkZSAiZHdjX290Z19oY2QuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX3JlZ3MuaCIKKworZHdjX290Z19oY2RfdCAqZHdjX290Z19oY2RfYWxsb2NfaGNkKHZvaWQpCit7CisJcmV0dXJuIERXQ19BTExPQyhzaXplb2YoZHdjX290Z19oY2RfdCkpOworfQorCisvKioKKyAqIENvbm5lY3Rpb24gdGltZW91dCBmdW5jdGlvbi4gIEFuIE9URyBob3N0IGlzIHJlcXVpcmVkIHRvIGRpc3BsYXkgYQorICogbWVzc2FnZSBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IGNvbm5lY3Qgd2l0aGluIDEwIHNlY29uZHMuCisgKi8KK3ZvaWQgZHdjX290Z19oY2RfY29ubmVjdF90aW1lb3V0KHZvaWQgKnB0cikKK3sKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisJRFdDX1BSSU5URigiQ29ubmVjdCBUaW1lb3V0XG4iKTsKKwlfX0RXQ19FUlJPUigiRGV2aWNlIE5vdCBDb25uZWN0ZWQvUmVzcG9uZGluZ1xuIik7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgZHVtcF9jaGFubmVsX2luZm8oZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX290Z19xaF90ICogcWgpCit7CisJaWYgKHFoLT5jaGFubmVsICE9IE5VTEwpIHsKKwkJZHdjX2hjX3QgKmhjID0gcWgtPmNoYW5uZWw7CisJCWR3Y19saXN0X2xpbmtfdCAqaXRlbTsKKwkJZHdjX290Z19xaF90ICpxaF9pdGVtOworCQlpbnQgbnVtX2NoYW5uZWxzID0gaGNkLT5jb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9jaGFubmVsczsKKwkJaW50IGk7CisKKwkJZHdjX290Z19oY19yZWdzX3QgKmhjX3JlZ3M7CisJCWhjY2hhcl9kYXRhX3QgaGNjaGFyOworCQloY3NwbHRfZGF0YV90IGhjc3BsdDsKKwkJaGN0c2l6X2RhdGFfdCBoY3RzaXo7CisJCXVpbnQzMl90IGhjZG1hOworCisJCWhjX3JlZ3MgPSBoY2QtPmNvcmVfaWYtPmhvc3RfaWYtPmhjX3JlZ3NbaGMtPmhjX251bV07CisJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwkJaGNzcGx0LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY3NwbHQpOworCQloY3RzaXouZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjdHNpeik7CisJCWhjZG1hID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjZG1hKTsKKworCQlEV0NfUFJJTlRGKCIgIEFzc2lnbmVkIHRvIGNoYW5uZWwgJXA6XG4iLCBoYyk7CisJCURXQ19QUklOVEYoIiAgICBoY2NoYXIgMHglMDh4LCBoY3NwbHQgMHglMDh4XG4iLCBoY2NoYXIuZDMyLAorCQkJICAgaGNzcGx0LmQzMik7CisJCURXQ19QUklOVEYoIiAgICBoY3RzaXogMHglMDh4LCBoY2RtYSAweCUwOHhcbiIsIGhjdHNpei5kMzIsCisJCQkgICBoY2RtYSk7CisJCURXQ19QUklOVEYoIiAgICBkZXZfYWRkcjogJWQsIGVwX251bTogJWQsIGVwX2lzX2luOiAlZFxuIiwKKwkJCSAgIGhjLT5kZXZfYWRkciwgaGMtPmVwX251bSwgaGMtPmVwX2lzX2luKTsKKwkJRFdDX1BSSU5URigiICAgIGVwX3R5cGU6ICVkXG4iLCBoYy0+ZXBfdHlwZSk7CisJCURXQ19QUklOVEYoIiAgICBtYXhfcGFja2V0OiAlZFxuIiwgaGMtPm1heF9wYWNrZXQpOworCQlEV0NfUFJJTlRGKCIgICAgZGF0YV9waWRfc3RhcnQ6ICVkXG4iLCBoYy0+ZGF0YV9waWRfc3RhcnQpOworCQlEV0NfUFJJTlRGKCIgICAgeGZlcl9zdGFydGVkOiAlZFxuIiwgaGMtPnhmZXJfc3RhcnRlZCk7CisJCURXQ19QUklOVEYoIiAgICBoYWx0X3N0YXR1czogJWRcbiIsIGhjLT5oYWx0X3N0YXR1cyk7CisJCURXQ19QUklOVEYoIiAgICB4ZmVyX2J1ZmY6ICVwXG4iLCBoYy0+eGZlcl9idWZmKTsKKwkJRFdDX1BSSU5URigiICAgIHhmZXJfbGVuOiAlZFxuIiwgaGMtPnhmZXJfbGVuKTsKKwkJRFdDX1BSSU5URigiICAgIHFoOiAlcFxuIiwgaGMtPnFoKTsKKwkJRFdDX1BSSU5URigiICBOUCBpbmFjdGl2ZSBzY2hlZDpcbiIpOworCQlEV0NfTElTVF9GT1JFQUNIKGl0ZW0sICZoY2QtPm5vbl9wZXJpb2RpY19zY2hlZF9pbmFjdGl2ZSkgeworCQkJcWhfaXRlbSA9CisJCQkgICAgRFdDX0xJU1RfRU5UUlkoaXRlbSwgZHdjX290Z19xaF90LCBxaF9saXN0X2VudHJ5KTsKKwkJCURXQ19QUklOVEYoIiAgICAlcFxuIiwgcWhfaXRlbSk7CisJCX0KKwkJRFdDX1BSSU5URigiICBOUCBhY3RpdmUgc2NoZWQ6XG4iKTsKKwkJRFdDX0xJU1RfRk9SRUFDSChpdGVtLCAmaGNkLT5ub25fcGVyaW9kaWNfc2NoZWRfYWN0aXZlKSB7CisJCQlxaF9pdGVtID0KKwkJCSAgICBEV0NfTElTVF9FTlRSWShpdGVtLCBkd2Nfb3RnX3FoX3QsIHFoX2xpc3RfZW50cnkpOworCQkJRFdDX1BSSU5URigiICAgICVwXG4iLCBxaF9pdGVtKTsKKwkJfQorCQlEV0NfUFJJTlRGKCIgIENoYW5uZWxzOiBcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCWR3Y19oY190ICpoYyA9IGhjZC0+aGNfcHRyX2FycmF5W2ldOworCQkJRFdDX1BSSU5URigiICAgICUyZDogJXBcbiIsIGksIGhjKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBERUJVRyAqLworCisvKioKKyAqIFdvcmsgcXVldWUgZnVuY3Rpb24gZm9yIHN0YXJ0aW5nIHRoZSBIQ0Qgd2hlbiBBLUNhYmxlIGlzIGNvbm5lY3RlZC4KKyAqIFRoZSBoY2Rfc3RhcnQoKSBtdXN0IGJlIGNhbGxlZCBpbiBhIHByb2Nlc3MgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgaGNkX3N0YXJ0X2Z1bmModm9pZCAqX3ZwKQoreworCWR3Y19vdGdfaGNkX3QgKmhjZCA9IChkd2Nfb3RnX2hjZF90ICopIF92cDsKKworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiJXMoKSAlcFxuIiwgX19mdW5jX18sIGhjZCk7CisJaWYgKGhjZCkgeworCQloY2QtPmZvcHMtPnN0YXJ0KGhjZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZWxfeGZlcl90aW1lcnMoZHdjX290Z19oY2RfdCAqIGhjZCkKK3sKKyNpZmRlZiBERUJVRworCWludCBpOworCWludCBudW1fY2hhbm5lbHMgPSBoY2QtPmNvcmVfaWYtPmNvcmVfcGFyYW1zLT5ob3N0X2NoYW5uZWxzOworCWZvciAoaSA9IDA7IGkgPCBudW1fY2hhbm5lbHM7IGkrKykgeworCQlEV0NfVElNRVJfQ0FOQ0VMKGhjZC0+Y29yZV9pZi0+aGNfeGZlcl90aW1lcltpXSk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGRlbF90aW1lcnMoZHdjX290Z19oY2RfdCAqIGhjZCkKK3sKKwlkZWxfeGZlcl90aW1lcnMoaGNkKTsKKwlEV0NfVElNRVJfQ0FOQ0VMKGhjZC0+Y29ubl90aW1lcik7Cit9CisKKy8qKgorICogUHJvY2Vzc2VzIGFsbCB0aGUgVVJCcyBpbiBhIHNpbmdsZSBsaXN0IG9mIFFIcy4gQ29tcGxldGVzIHRoZW0gd2l0aAorICogLUVUSU1FRE9VVCBhbmQgZnJlZXMgdGhlIFFURC4KKyAqLworc3RhdGljIHZvaWQga2lsbF91cmJzX2luX3FoX2xpc3QoZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX2xpc3RfbGlua190ICogcWhfbGlzdCkKK3sKKwlkd2NfbGlzdF9saW5rX3QgKnFoX2l0ZW07CisJZHdjX290Z19xaF90ICpxaDsKKwlkd2Nfb3RnX3F0ZF90ICpxdGQsICpxdGRfdG1wOworCisJRFdDX0xJU1RfRk9SRUFDSChxaF9pdGVtLCBxaF9saXN0KSB7CisJCXFoID0gRFdDX0xJU1RfRU5UUlkocWhfaXRlbSwgZHdjX290Z19xaF90LCBxaF9saXN0X2VudHJ5KTsKKwkJRFdDX0NJUkNMRVFfRk9SRUFDSF9TQUZFKHF0ZCwgcXRkX3RtcCwKKwkJCQkJICZxaC0+cXRkX2xpc3QsIHF0ZF9saXN0X2VudHJ5KSB7CisJCQlxdGQgPSBEV0NfQ0lSQ0xFUV9GSVJTVCgmcWgtPnF0ZF9saXN0KTsKKwkJCWlmIChxdGQtPnVyYiAhPSBOVUxMKSB7CisJCQkJaGNkLT5mb3BzLT5jb21wbGV0ZShoY2QsIHF0ZC0+dXJiLT5wcml2LAorCQkJCQkJICAgIHF0ZC0+dXJiLCAtRFdDX0VfVElNRU9VVCk7CisJCQkJZHdjX290Z19oY2RfcXRkX3JlbW92ZV9hbmRfZnJlZShoY2QsIHF0ZCwgcWgpOworCQkJfQorCisJCX0KKwl9Cit9CisKKy8qKgorICogUmVzcG9uZHMgd2l0aCBhbiBlcnJvciBzdGF0dXMgb2YgRVRJTUVET1VUIHRvIGFsbCBVUkJzIGluIHRoZSBub24tcGVyaW9kaWMKKyAqIGFuZCBwZXJpb2RpYyBzY2hlZHVsZXMuIFRoZSBRVEQgYXNzb2NpYXRlZCB3aXRoIGVhY2ggVVJCIGlzIHJlbW92ZWQgZnJvbQorICogdGhlIHNjaGVkdWxlIGFuZCBmcmVlZC4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHdoZW4gYSBkaXNjb25uZWN0IGlzCisgKiBkZXRlY3RlZCBvciB3aGVuIHRoZSBIQ0QgaXMgYmVpbmcgc3RvcHBlZC4KKyAqLworc3RhdGljIHZvaWQga2lsbF9hbGxfdXJicyhkd2Nfb3RnX2hjZF90ICogaGNkKQoreworCWtpbGxfdXJic19pbl9xaF9saXN0KGhjZCwgJmhjZC0+bm9uX3BlcmlvZGljX3NjaGVkX2luYWN0aXZlKTsKKwlraWxsX3VyYnNfaW5fcWhfbGlzdChoY2QsICZoY2QtPm5vbl9wZXJpb2RpY19zY2hlZF9hY3RpdmUpOworCWtpbGxfdXJic19pbl9xaF9saXN0KGhjZCwgJmhjZC0+cGVyaW9kaWNfc2NoZWRfaW5hY3RpdmUpOworCWtpbGxfdXJic19pbl9xaF9saXN0KGhjZCwgJmhjZC0+cGVyaW9kaWNfc2NoZWRfcmVhZHkpOworCWtpbGxfdXJic19pbl9xaF9saXN0KGhjZCwgJmhjZC0+cGVyaW9kaWNfc2NoZWRfYXNzaWduZWQpOworCWtpbGxfdXJic19pbl9xaF9saXN0KGhjZCwgJmhjZC0+cGVyaW9kaWNfc2NoZWRfcXVldWVkKTsKK30KKworLyoqCisgKiBTdGFydCB0aGUgY29ubmVjdGlvbiB0aW1lci4gIEFuIE9URyBob3N0IGlzIHJlcXVpcmVkIHRvIGRpc3BsYXkgYQorICogbWVzc2FnZSBpZiB0aGUgZGV2aWNlIGRvZXMgbm90IGNvbm5lY3Qgd2l0aGluIDEwIHNlY29uZHMuICBUaGUKKyAqIHRpbWVyIGlzIGRlbGV0ZWQgaWYgYSBwb3J0IGNvbm5lY3QgaW50ZXJydXB0IG9jY3VycyBiZWZvcmUgdGhlCisgKiB0aW1lciBleHBpcmVzLgorICovCitzdGF0aWMgdm9pZCBkd2Nfb3RnX2hjZF9zdGFydF9jb25uZWN0X3RpbWVyKGR3Y19vdGdfaGNkX3QgKiBoY2QpCit7CisJRFdDX1RJTUVSX1NDSEVEVUxFKGhjZC0+Y29ubl90aW1lciwgMTAwMDAgLyogMTAgc2VjcyAqLyApOworfQorCisvKioKKyAqIEhDRCBDYWxsYmFjayBmdW5jdGlvbiBmb3IgZGlzY29ubmVjdCBvZiB0aGUgSENELgorICoKKyAqIEBwYXJhbSBwIHZvaWQgcG9pbnRlciB0byB0aGUgPGNvZGU+c3RydWN0IHVzYl9oY2Q8L2NvZGU+CisgKi8KK3N0YXRpYyBpbnQzMl90IGR3Y19vdGdfaGNkX3Nlc3Npb25fc3RhcnRfY2Iodm9pZCAqcCkKK3sKKwlkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZDsKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiVzKCVwKVxuIiwgX19mdW5jX18sIHApOworCWR3Y19vdGdfaGNkID0gcDsKKwlkd2Nfb3RnX2hjZF9zdGFydF9jb25uZWN0X3RpbWVyKGR3Y19vdGdfaGNkKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBIQ0QgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHN0YXJ0aW5nIHRoZSBIQ0Qgd2hlbiBBLUNhYmxlIGlzCisgKiBjb25uZWN0ZWQuCisgKgorICogQHBhcmFtIHAgdm9pZCBwb2ludGVyIHRvIHRoZSA8Y29kZT5zdHJ1Y3QgdXNiX2hjZDwvY29kZT4KKyAqLworc3RhdGljIGludDMyX3QgZHdjX290Z19oY2Rfc3RhcnRfY2Iodm9pZCAqcCkKK3sKKwlkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZCA9IHA7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWY7CisJaHBydDBfZGF0YV90IGhwcnQwOworCisJY29yZV9pZiA9IGR3Y19vdGdfaGNkLT5jb3JlX2lmOworCisJaWYgKGNvcmVfaWYtPm9wX3N0YXRlID09IEJfSE9TVCkgeworCQkvKgorCQkgKiBSZXNldCB0aGUgcG9ydC4gIER1cmluZyBhIEhOUCBtb2RlIHN3aXRjaCB0aGUgcmVzZXQKKwkJICogbmVlZHMgdG8gb2NjdXIgd2l0aGluIDFtcyBhbmQgaGF2ZSBhIGR1cmF0aW9uIG9mIGF0CisJCSAqIGxlYXN0IDUwbXMuCisJCSAqLworCQlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJCWhwcnQwLmIucHJ0cnN0ID0gMTsKKwkJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCBocHJ0MC5kMzIpOworCX0KKwlEV0NfV09SS1FfU0NIRURVTEVfREVMQVlFRChjb3JlX2lmLT53cV9vdGcsCisJCQkJICAgaGNkX3N0YXJ0X2Z1bmMsIGR3Y19vdGdfaGNkLCA1MCwKKwkJCQkgICAic3RhcnQgaGNkIik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBIQ0QgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGRpc2Nvbm5lY3Qgb2YgdGhlIEhDRC4KKyAqCisgKiBAcGFyYW0gcCB2b2lkIHBvaW50ZXIgdG8gdGhlIDxjb2RlPnN0cnVjdCB1c2JfaGNkPC9jb2RlPgorICovCitzdGF0aWMgaW50MzJfdCBkd2Nfb3RnX2hjZF9kaXNjb25uZWN0X2NiKHZvaWQgKnApCit7CisJZ2ludHN0c19kYXRhX3QgaW50cjsKKwlkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZCA9IHA7CisKKwkvKgorCSAqIFNldCBzdGF0dXMgZmxhZ3MgZm9yIHRoZSBodWIgZHJpdmVyLgorCSAqLworCWR3Y19vdGdfaGNkLT5mbGFncy5iLnBvcnRfY29ubmVjdF9zdGF0dXNfY2hhbmdlID0gMTsKKwlkd2Nfb3RnX2hjZC0+ZmxhZ3MuYi5wb3J0X2Nvbm5lY3Rfc3RhdHVzID0gMDsKKworCS8qCisJICogU2h1dGRvd24gYW55IHRyYW5zZmVycyBpbiBwcm9jZXNzIGJ5IGNsZWFyaW5nIHRoZSBUeCBGSUZPIEVtcHR5CisJICogaW50ZXJydXB0IG1hc2sgYW5kIHN0YXR1cyBiaXRzIGFuZCBkaXNhYmxpbmcgc3Vic2VxdWVudCBob3N0CisJICogY2hhbm5lbCBpbnRlcnJ1cHRzLgorCSAqLworCWludHIuZDMyID0gMDsKKwlpbnRyLmIubnB0eGZlbXB0eSA9IDE7CisJaW50ci5iLnB0eGZlbXB0eSA9IDE7CisJaW50ci5iLmhjaW50ciA9IDE7CisJRFdDX01PRElGWV9SRUczMigmZHdjX290Z19oY2QtPmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssCisJCQkgaW50ci5kMzIsIDApOworCURXQ19NT0RJRllfUkVHMzIoJmR3Y19vdGdfaGNkLT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzLAorCQkJIGludHIuZDMyLCAwKTsKKworCWRlbF90aW1lcnMoZHdjX290Z19oY2QpOworCisJLyoKKwkgKiBUdXJuIG9mZiB0aGUgdmJ1cyBwb3dlciBvbmx5IGlmIHRoZSBjb3JlIGhhcyB0cmFuc2l0aW9uZWQgdG8gZGV2aWNlCisJICogbW9kZS4gSWYgc3RpbGwgaW4gaG9zdCBtb2RlLCBuZWVkIHRvIGtlZXAgcG93ZXIgb24gdG8gZGV0ZWN0IGEKKwkgKiByZWNvbm5lY3Rpb24uCisJICovCisJaWYgKGR3Y19vdGdfaXNfZGV2aWNlX21vZGUoZHdjX290Z19oY2QtPmNvcmVfaWYpKSB7CisJCWlmIChkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+b3Bfc3RhdGUgIT0gQV9TVVNQRU5EKSB7CisJCQlocHJ0MF9kYXRhX3QgaHBydDAgPSB7LmQzMiA9IDAgfTsKKwkJCURXQ19QUklOVEYoIkRpc2Nvbm5lY3Q6IFBvcnRQb3dlciBvZmZcbiIpOworCQkJaHBydDAuYi5wcnRwd3IgPSAwOworCQkJRFdDX1dSSVRFX1JFRzMyKGR3Y19vdGdfaGNkLT5jb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwKKwkJCQkJaHBydDAuZDMyKTsKKwkJfQorCisJCWR3Y19vdGdfZGlzYWJsZV9ob3N0X2ludGVycnVwdHMoZHdjX290Z19oY2QtPmNvcmVfaWYpOworCX0KKworCS8qIFJlc3BvbmQgd2l0aCBhbiBlcnJvciBzdGF0dXMgdG8gYWxsIFVSQnMgaW4gdGhlIHNjaGVkdWxlLiAqLworCWtpbGxfYWxsX3VyYnMoZHdjX290Z19oY2QpOworCisJaWYgKGR3Y19vdGdfaXNfaG9zdF9tb2RlKGR3Y19vdGdfaGNkLT5jb3JlX2lmKSkgeworCQkvKiBDbGVhbiB1cCBhbnkgaG9zdCBjaGFubmVscyB0aGF0IHdlcmUgaW4gdXNlLiAqLworCQlpbnQgbnVtX2NoYW5uZWxzOworCQlpbnQgaTsKKwkJZHdjX2hjX3QgKmNoYW5uZWw7CisJCWR3Y19vdGdfaGNfcmVnc190ICpoY19yZWdzOworCQloY2NoYXJfZGF0YV90IGhjY2hhcjsKKworCQludW1fY2hhbm5lbHMgPSBkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+Y29yZV9wYXJhbXMtPmhvc3RfY2hhbm5lbHM7CisKKwkJaWYgKCFkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQkJLyogRmx1c2ggb3V0IGFueSBjaGFubmVsIHJlcXVlc3RzIGluIHNsYXZlIG1vZGUuICovCisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCQljaGFubmVsID0gZHdjX290Z19oY2QtPmhjX3B0cl9hcnJheVtpXTsKKwkJCQlpZiAoRFdDX0NJUkNMRVFfRU1QVFlfRU5UUlkKKwkJCQkgICAgKGNoYW5uZWwsIGhjX2xpc3RfZW50cnkpKSB7CisJCQkJCWhjX3JlZ3MgPQorCQkJCQkgICAgZHdjX290Z19oY2QtPmNvcmVfaWYtPgorCQkJCQkgICAgaG9zdF9pZi0+aGNfcmVnc1tpXTsKKwkJCQkJaGNjaGFyLmQzMiA9CisJCQkJCSAgICBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwkJCQkJaWYgKGhjY2hhci5iLmNoZW4pIHsKKwkJCQkJCWhjY2hhci5iLmNoZW4gPSAwOworCQkJCQkJaGNjaGFyLmIuY2hkaXMgPSAxOworCQkJCQkJaGNjaGFyLmIuZXBkaXIgPSAwOworCQkJCQkJRFdDX1dSSVRFX1JFRzMyCisJCQkJCQkgICAgKCZoY19yZWdzLT5oY2NoYXIsCisJCQkJCQkgICAgIGhjY2hhci5kMzIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9jaGFubmVsczsgaSsrKSB7CisJCQljaGFubmVsID0gZHdjX290Z19oY2QtPmhjX3B0cl9hcnJheVtpXTsKKwkJCWlmIChEV0NfQ0lSQ0xFUV9FTVBUWV9FTlRSWShjaGFubmVsLCBoY19saXN0X2VudHJ5KSkgeworCQkJCWhjX3JlZ3MgPQorCQkJCSAgICBkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aGNfcmVnc1tpXTsKKwkJCQloY2NoYXIuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjY2hhcik7CisJCQkJaWYgKGhjY2hhci5iLmNoZW4pIHsKKwkJCQkJLyogSGFsdCB0aGUgY2hhbm5lbC4gKi8KKwkJCQkJaGNjaGFyLmIuY2hkaXMgPSAxOworCQkJCQlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjY2hhciwKKwkJCQkJCQloY2NoYXIuZDMyKTsKKwkJCQl9CisKKwkJCQlkd2Nfb3RnX2hjX2NsZWFudXAoZHdjX290Z19oY2QtPmNvcmVfaWYsCisJCQkJCQkgICBjaGFubmVsKTsKKwkJCQlEV0NfQ0lSQ0xFUV9JTlNFUlRfVEFJTAorCQkJCSAgICAoJmR3Y19vdGdfaGNkLT5mcmVlX2hjX2xpc3QsIGNoYW5uZWwsCisJCQkJICAgICBoY19saXN0X2VudHJ5KTsKKwkJCQkvKgorCQkJCSAqIEFkZGVkIGZvciBEZXNjcmlwdG9yIERNQSB0byBwcmV2ZW50IGNoYW5uZWwgZG91YmxlIGNsZWFudXAKKwkJCQkgKiBpbiByZWxlYXNlX2NoYW5uZWxfZGRtYSgpLiBXaGljaCBjYWxsZWQgZnJvbSBlcF9kaXNhYmxlCisJCQkJICogd2hlbiBkZXZpY2UgZGlzY29ubmVjdC4KKwkJCQkgKi8KKwkJCQljaGFubmVsLT5xaCA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZHdjX290Z19oY2QtPmZvcHMtPmRpc2Nvbm5lY3QpIHsKKwkJZHdjX290Z19oY2QtPmZvcHMtPmRpc2Nvbm5lY3QoZHdjX290Z19oY2QpOworCX0KKworCXJldHVybiAxOworfQorCisvKioKKyAqIEhDRCBDYWxsYmFjayBmdW5jdGlvbiBmb3Igc3RvcHBpbmcgdGhlIEhDRC4KKyAqCisgKiBAcGFyYW0gcCB2b2lkIHBvaW50ZXIgdG8gdGhlIDxjb2RlPnN0cnVjdCB1c2JfaGNkPC9jb2RlPgorICovCitzdGF0aWMgaW50MzJfdCBkd2Nfb3RnX2hjZF9zdG9wX2NiKHZvaWQgKnApCit7CisJZHdjX290Z19oY2RfdCAqZHdjX290Z19oY2QgPSBwOworCisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIlcyglcClcbiIsIF9fZnVuY19fLCBwKTsKKwlkd2Nfb3RnX2hjZF9zdG9wKGR3Y19vdGdfaGNkKTsKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKy8qKgorICogSENEIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBzbGVlcCBvZiBIQ0QuCisgKgorICogQHBhcmFtIHAgdm9pZCBwb2ludGVyIHRvIHRoZSA8Y29kZT5zdHJ1Y3QgdXNiX2hjZDwvY29kZT4KKyAqLworc3RhdGljIGludCBkd2Nfb3RnX2hjZF9zbGVlcF9jYih2b2lkICpwKQoreworCWR3Y19vdGdfaGNkX3QgKmhjZCA9IHA7CisKKwlkd2Nfb3RnX2hjZF9mcmVlX2hjX2Zyb21fbHBtKGhjZCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKioKKyAqIEhDRCBDYWxsYmFjayBmdW5jdGlvbiBmb3IgUmVtb3RlIFdha2V1cC4KKyAqCisgKiBAcGFyYW0gcCB2b2lkIHBvaW50ZXIgdG8gdGhlIDxjb2RlPnN0cnVjdCB1c2JfaGNkPC9jb2RlPgorICovCitzdGF0aWMgaW50IGR3Y19vdGdfaGNkX3JlbV93YWtldXBfY2Iodm9pZCAqcCkKK3sKKwlkd2Nfb3RnX2hjZF90ICpoY2QgPSBwOworCisJaWYgKGhjZC0+Y29yZV9pZi0+bHhfc3RhdGUgPT0gRFdDX09UR19MMikgeworCQloY2QtPmZsYWdzLmIucG9ydF9zdXNwZW5kX2NoYW5nZSA9IDE7CisJfQorI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwllbHNlIHsKKwkJaGNkLT5mbGFncy5iLnBvcnRfbDFfY2hhbmdlID0gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBIYWx0cyB0aGUgRFdDX290ZyBob3N0IG1vZGUgb3BlcmF0aW9ucyBpbiBhIGNsZWFuIG1hbm5lci4gVVNCIHRyYW5zZmVycyBhcmUKKyAqIHN0b3BwZWQuCisgKi8KK3ZvaWQgZHdjX290Z19oY2Rfc3RvcChkd2Nfb3RnX2hjZF90ICogaGNkKQoreworCWhwcnQwX2RhdGFfdCBocHJ0MCA9IHsuZDMyID0gMCB9OworCisJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkRXQyBPVEcgSENEIFNUT1BcbiIpOworCisJLyoKKwkgKiBUaGUgcm9vdCBodWIgc2hvdWxkIGJlIGRpc2Nvbm5lY3RlZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCisJICogVGhlIGRpc2Nvbm5lY3Qgd2lsbCBjbGVhciB0aGUgUVREIGxpc3RzICh2aWEgLi4uX2hjZF91cmJfZGVxdWV1ZSkKKwkgKiBhbmQgdGhlIFFIIGxpc3RzICh2aWEgLi4uX2hjZF9lbmRwb2ludF9kaXNhYmxlKS4KKwkgKi8KKworCS8qIFR1cm4gb2ZmIGFsbCBob3N0LXNwZWNpZmljIGludGVycnVwdHMuICovCisJZHdjX290Z19kaXNhYmxlX2hvc3RfaW50ZXJydXB0cyhoY2QtPmNvcmVfaWYpOworCisJLyogVHVybiBvZmYgdGhlIHZidXMgcG93ZXIgKi8KKwlEV0NfUFJJTlRGKCJQb3J0UG93ZXIgb2ZmXG4iKTsKKwlocHJ0MC5iLnBydHB3ciA9IDA7CisJRFdDX1dSSVRFX1JFRzMyKGhjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisJZHdjX21kZWxheSgxKTsKK30KKworaW50IGR3Y19vdGdfaGNkX3VyYl9lbnF1ZXVlKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkgICAgZHdjX290Z19oY2RfdXJiX3QgKiBkd2Nfb3RnX3VyYiwgdm9pZCAqKmVwX2hhbmRsZSwKKwkJCSAgICBpbnQgYXRvbWljX2FsbG9jKQoreworCWR3Y19pcnFmbGFnc190IGZsYWdzOworCWludCByZXR2YWwgPSAwOworCWR3Y19vdGdfcXRkX3QgKnF0ZDsKKwlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKworCWlmICghaGNkLT5mbGFncy5iLnBvcnRfY29ubmVjdF9zdGF0dXMpIHsKKwkJLyogTm8gbG9uZ2VyIGNvbm5lY3RlZC4gKi8KKwkJRFdDX0VSUk9SKCJOb3QgY29ubmVjdGVkXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9OT19ERVZJQ0U7CisJfQorCisJcXRkID0gZHdjX290Z19oY2RfcXRkX2NyZWF0ZShkd2Nfb3RnX3VyYiwgYXRvbWljX2FsbG9jKTsKKwlpZiAocXRkID09IE5VTEwpIHsKKwkJRFdDX0VSUk9SKCJEV0MgT1RHIEhDRCBVUkIgRW5xdWV1ZSBmYWlsZWQgY3JlYXRpbmcgUVREXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9OT19NRU1PUlk7CisJfQorCisJcmV0dmFsID0KKwkgICAgZHdjX290Z19oY2RfcXRkX2FkZChxdGQsIGhjZCwgKGR3Y19vdGdfcWhfdCAqKikgZXBfaGFuZGxlLCBhdG9taWNfYWxsb2MpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCURXQ19FUlJPUigiRFdDIE9URyBIQ0QgVVJCIEVucXVldWUgZmFpbGVkIGFkZGluZyBRVEQuICIKKwkJCSAgIkVycm9yIHN0YXR1cyAlZFxuIiwgcmV0dmFsKTsKKwkJZHdjX290Z19oY2RfcXRkX2ZyZWUocXRkKTsKKwl9IGVsc2UgeworCQlxdGQtPnFoID0gKmVwX2hhbmRsZTsKKwl9CisJaW50cl9tYXNrLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY2QtPmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2spOworCWlmICghaW50cl9tYXNrLmIuc29maW50ciAmJiByZXR2YWwgPT0gMCkgeworCQlkd2Nfb3RnX3RyYW5zYWN0aW9uX3R5cGVfZSB0cl90eXBlOworCQlpZiAoKHF0ZC0+cWgtPmVwX3R5cGUgPT0gVUVfQlVMSykKKwkJICAgICYmICEocXRkLT51cmItPmZsYWdzICYgVVJCX0dJVkVCQUNLX0FTQVApKSB7CisJCQkvKiBEbyBub3Qgc2NoZWR1bGUgU0cgdHJhbnNhY3Rpb25zIHVudGlsIHF0ZCBoYXMgVVJCX0dJVkVCQUNLX0FTQVAgc2V0ICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlEV0NfU1BJTkxPQ0tfSVJRU0FWRShoY2QtPmxvY2ssICZmbGFncyk7CisJCXRyX3R5cGUgPSBkd2Nfb3RnX2hjZF9zZWxlY3RfdHJhbnNhY3Rpb25zKGhjZCk7CisJCWlmICh0cl90eXBlICE9IERXQ19PVEdfVFJBTlNBQ1RJT05fTk9ORSkgeworCQkJZHdjX290Z19oY2RfcXVldWVfdHJhbnNhY3Rpb25zKGhjZCwgdHJfdHlwZSk7CisJCX0KKwkJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShoY2QtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgZHdjX290Z19oY2RfdXJiX2RlcXVldWUoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCSAgICBkd2Nfb3RnX2hjZF91cmJfdCAqIGR3Y19vdGdfdXJiKQoreworCWR3Y19vdGdfcWhfdCAqcWg7CisJZHdjX290Z19xdGRfdCAqdXJiX3F0ZDsKKworCXVyYl9xdGQgPSBkd2Nfb3RnX3VyYi0+cXRkOworCXFoID0gdXJiX3F0ZC0+cWg7CisjaWZkZWYgREVCVUcKKwlpZiAoQ0hLX0RFQlVHX0xFVkVMKERCR19IQ0RWIHwgREJHX0hDRF9VUkIpKSB7CisJCWlmICh1cmJfcXRkLT5pbl9wcm9jZXNzKSB7CisJCQlkdW1wX2NoYW5uZWxfaW5mbyhoY2QsIHFoKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmICh1cmJfcXRkLT5pbl9wcm9jZXNzICYmIHFoLT5jaGFubmVsKSB7CisJCS8qIFRoZSBRVEQgaXMgaW4gcHJvY2VzcyAoaXQgaGFzIGJlZW4gYXNzaWduZWQgdG8gYSBjaGFubmVsKS4gKi8KKwkJaWYgKGhjZC0+ZmxhZ3MuYi5wb3J0X2Nvbm5lY3Rfc3RhdHVzKSB7CisJCQkvKgorCQkJICogSWYgc3RpbGwgY29ubmVjdGVkIChpLmUuIGluIGhvc3QgbW9kZSksIGhhbHQgdGhlCisJCQkgKiBjaGFubmVsIHNvIGl0IGNhbiBiZSB1c2VkIGZvciBvdGhlciB0cmFuc2ZlcnMuIElmCisJCQkgKiBubyBsb25nZXIgY29ubmVjdGVkLCB0aGUgaG9zdCByZWdpc3RlcnMgY2FuJ3QgYmUKKwkJCSAqIHdyaXR0ZW4gdG8gaGFsdCB0aGUgY2hhbm5lbCBzaW5jZSB0aGUgY29yZSBpcyBpbgorCQkJICogZGV2aWNlIG1vZGUuCisJCQkgKi8KKwkJCWR3Y19vdGdfaGNfaGFsdChoY2QtPmNvcmVfaWYsIHFoLT5jaGFubmVsLAorCQkJCQlEV0NfT1RHX0hDX1hGRVJfVVJCX0RFUVVFVUUpOworCQl9CisJfQorCisJLyoKKwkgKiBGcmVlIHRoZSBRVEQgYW5kIGNsZWFuIHVwIHRoZSBhc3NvY2lhdGVkIFFILiBMZWF2ZSB0aGUgUUggaW4gdGhlCisJICogc2NoZWR1bGUgaWYgaXQgaGFzIGFueSByZW1haW5pbmcgUVREcy4KKwkgKi8KKworCWlmICghaGNkLT5jb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJdWludDhfdCBiID0gdXJiX3F0ZC0+aW5fcHJvY2VzczsKKwkJZHdjX290Z19oY2RfcXRkX3JlbW92ZV9hbmRfZnJlZShoY2QsIHVyYl9xdGQsIHFoKTsKKwkJaWYgKGIpIHsKKwkJCWR3Y19vdGdfaGNkX3FoX2RlYWN0aXZhdGUoaGNkLCBxaCwgMCk7CisJCQlxaC0+Y2hhbm5lbCA9IE5VTEw7CisJCX0gZWxzZSBpZiAoRFdDX0NJUkNMRVFfRU1QVFkoJnFoLT5xdGRfbGlzdCkpIHsKKwkJCWR3Y19vdGdfaGNkX3FoX3JlbW92ZShoY2QsIHFoKTsKKwkJfQorCX0gZWxzZSB7CisJCWR3Y19vdGdfaGNkX3F0ZF9yZW1vdmVfYW5kX2ZyZWUoaGNkLCB1cmJfcXRkLCBxaCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgZHdjX290Z19oY2RfZW5kcG9pbnRfZGlzYWJsZShkd2Nfb3RnX2hjZF90ICogaGNkLCB2b2lkICplcF9oYW5kbGUsCisJCQkJIGludCByZXRyeSkKK3sKKwlkd2Nfb3RnX3FoX3QgKnFoID0gKGR3Y19vdGdfcWhfdCAqKSBlcF9oYW5kbGU7CisJaW50IHJldHZhbCA9IDA7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisKKwlpZiAocmV0cnkgPCAwKSB7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKCFxaCkgeworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwkJZ290byBkb25lOworCX0KKworCURXQ19TUElOTE9DS19JUlFTQVZFKGhjZC0+bG9jaywgJmZsYWdzKTsKKworCXdoaWxlICghRFdDX0NJUkNMRVFfRU1QVFkoJnFoLT5xdGRfbGlzdCkgJiYgcmV0cnkpIHsKKwkJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShoY2QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0cnktLTsKKwkJZHdjX21zbGVlcCg1KTsKKwkJRFdDX1NQSU5MT0NLX0lSUVNBVkUoaGNkLT5sb2NrLCAmZmxhZ3MpOworCX0KKworCWR3Y19vdGdfaGNkX3FoX3JlbW92ZShoY2QsIHFoKTsKKworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUoaGNkLT5sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBTcGxpdCBkd2Nfb3RnX2hjZF9xaF9yZW1vdmVfYW5kX2ZyZWUoKSBpbnRvIHFoX3JlbW92ZQorCSAqIGFuZCBxaF9mcmVlIHRvIHByZXZlbnQgc3RhY2sgZHVtcCBvbiBEV0NfRE1BX0ZSRUUoKSB3aXRoCisJICogaXJxX2Rpc2FibGVkIChzcGlubG9ja19pcnFzYXZlKSBpbiBkd2Nfb3RnX2hjZF9kZXNjX2xpc3RfZnJlZSgpCisJICogYW5kIGR3Y19vdGdfaGNkX2ZyYW1lX2xpc3RfYWxsb2MoKS4KKwkgKi8KKwlkd2Nfb3RnX2hjZF9xaF9mcmVlKGhjZCwgcWgpOworCitkb25lOgorCXJldHVybiByZXR2YWw7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKQoraW50IGR3Y19vdGdfaGNkX2VuZHBvaW50X3Jlc2V0KGR3Y19vdGdfaGNkX3QgKiBoY2QsIHZvaWQgKmVwX2hhbmRsZSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlkd2Nfb3RnX3FoX3QgKnFoID0gKGR3Y19vdGdfcWhfdCAqKSBlcF9oYW5kbGU7CisJaWYgKCFxaCkKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCisJcWgtPmRhdGFfdG9nZ2xlID0gRFdDX09UR19IQ19QSURfREFUQTA7CisJcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgorCisvKioKKyAqIEhDRCBDYWxsYmFjayBzdHJ1Y3R1cmUgZm9yIGhhbmRsaW5nIG1vZGUgc3dpdGNoaW5nLgorICovCitzdGF0aWMgZHdjX290Z19jaWxfY2FsbGJhY2tzX3QgaGNkX2NpbF9jYWxsYmFja3MgPSB7CisJLnN0YXJ0ID0gZHdjX290Z19oY2Rfc3RhcnRfY2IsCisJLnN0b3AgPSBkd2Nfb3RnX2hjZF9zdG9wX2NiLAorCS5kaXNjb25uZWN0ID0gZHdjX290Z19oY2RfZGlzY29ubmVjdF9jYiwKKwkuc2Vzc2lvbl9zdGFydCA9IGR3Y19vdGdfaGNkX3Nlc3Npb25fc3RhcnRfY2IsCisJLnJlc3VtZV93YWtldXAgPSBkd2Nfb3RnX2hjZF9yZW1fd2FrZXVwX2NiLAorI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwkuc2xlZXAgPSBkd2Nfb3RnX2hjZF9zbGVlcF9jYiwKKyNlbmRpZgorCS5wID0gMCwKK307CisKKy8qKgorICogUmVzZXQgdGFza2xldCBmdW5jdGlvbgorICovCitzdGF0aWMgdm9pZCByZXNldF90YXNrbGV0X2Z1bmModm9pZCAqZGF0YSkKK3sKKwlkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZCA9IChkd2Nfb3RnX2hjZF90ICopIGRhdGE7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBkd2Nfb3RnX2hjZC0+Y29yZV9pZjsKKwlocHJ0MF9kYXRhX3QgaHBydDA7CisKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIlVTQiBSRVNFVCB0YXNrbGV0IGNhbGxlZFxuIik7CisKKwlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJaHBydDAuYi5wcnRyc3QgPSAxOworCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKwlkd2NfbWRlbGF5KDYwKTsKKworCWhwcnQwLmIucHJ0cnN0ID0gMDsKKwlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisJZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9yZXNldF9jaGFuZ2UgPSAxOworfQorCitzdGF0aWMgdm9pZCBxaF9saXN0X2ZyZWUoZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX2xpc3RfbGlua190ICogcWhfbGlzdCkKK3sKKwlkd2NfbGlzdF9saW5rX3QgKml0ZW07CisJZHdjX290Z19xaF90ICpxaDsKKwlkd2NfaXJxZmxhZ3NfdCBmbGFnczsKKworCWlmICghcWhfbGlzdC0+bmV4dCkgeworCQkvKiBUaGUgbGlzdCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuICovCisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBIb2xkIHNwaW5sb2NrIGhlcmUuIE5vdCBuZWVkZWQgaW4gdGhhdCBjYXNlIGlmIGJlbGxvdyAKKwkgKiBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQgZnJvbSBJU1IgCisJICovCisJRFdDX1NQSU5MT0NLX0lSUVNBVkUoaGNkLT5sb2NrLCAmZmxhZ3MpOworCS8qIEVuc3VyZSB0aGVyZSBhcmUgbm8gUVREcyBvciBVUkJzIGxlZnQuICovCisJa2lsbF91cmJzX2luX3FoX2xpc3QoaGNkLCBxaF9saXN0KTsKKwlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKGhjZC0+bG9jaywgZmxhZ3MpOworCisJRFdDX0xJU1RfRk9SRUFDSChpdGVtLCBxaF9saXN0KSB7CisJCXFoID0gRFdDX0xJU1RfRU5UUlkoaXRlbSwgZHdjX290Z19xaF90LCBxaF9saXN0X2VudHJ5KTsKKwkJZHdjX290Z19oY2RfcWhfcmVtb3ZlX2FuZF9mcmVlKGhjZCwgcWgpOworCX0KK30KKworLyoqCisgKiBFeGl0IGZyb20gSGliZXJuYXRpb24gaWYgSG9zdCBkaWQgbm90IGRldGVjdCBTUlAgZnJvbSBjb25uZWN0ZWQgU1JQIGNhcGFibGUKKyAqIERldmljZSBkdXJpbmcgU1JQIHRpbWUgYnkgaG9zdCBwb3dlciB1cC4KKyAqLwordm9pZCBkd2Nfb3RnX2hjZF9wb3dlcl91cCh2b2lkICpwdHIpCit7CisJZ3B3cmRuX2RhdGFfdCBncHdyZG4gPSB7LmQzMiA9IDAgfTsKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IChkd2Nfb3RnX2NvcmVfaWZfdCAqKSBwdHI7CisKKwlEV0NfUFJJTlRGKCIlcyBjYWxsZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIWNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQpIHsKKwkJRFdDX1BSSU5URigiQWxyZWFkeSBleGl0ZWQgZnJvbSBIaWJlcm5hdGlvblxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBTd2l0Y2ggb24gdGhlIHZvbHRhZ2UgdG8gdGhlIGNvcmUgKi8KKwlncHdyZG4uYi5wd3JkbnN3dGNoID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4sIGdwd3Jkbi5kMzIsIDApOworCWR3Y191ZGVsYXkoMTApOworCisJLyogUmVzZXQgdGhlIGNvcmUgKi8KKwlncHdyZG4uZDMyID0gMDsKKwlncHdyZG4uYi5wd3JkbnJzdG4gPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJZHdjX3VkZWxheSgxMCk7CisKKwkvKiBEaXNhYmxlIHBvd2VyIGNsYW1wcyAqLworCWdwd3Jkbi5kMzIgPSAwOworCWdwd3Jkbi5iLnB3cmRuY2xtcCA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKworCS8qIFJlbW92ZSByZXNldCB0aGUgY29yZSBzaWduYWwgKi8KKwlncHdyZG4uZDMyID0gMDsKKwlncHdyZG4uYi5wd3JkbnJzdG4gPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJZHdjX3VkZWxheSgxMCk7CisKKwkvKiBEaXNhYmxlIFBNVSBpbnRlcnJ1cHQgKi8KKwlncHdyZG4uZDMyID0gMDsKKwlncHdyZG4uYi5wbXVpbnRzZWwgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisKKwljb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID0gMDsKKworCS8qIERpc2FibGUgUE1VICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKwlkd2NfdWRlbGF5KDEwKTsKKworCS8qIEVuYWJsZSBWQlVTICovCisJZ3B3cmRuLmQzMiA9IDA7CisJZ3B3cmRuLmIuZGlzX3ZidXMgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisKKwljb3JlX2lmLT5vcF9zdGF0ZSA9IEFfSE9TVDsKKwlkd2Nfb3RnX2NvcmVfaW5pdChjb3JlX2lmKTsKKwlkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhjb3JlX2lmKTsKKwljaWxfaGNkX3N0YXJ0KGNvcmVfaWYpOworfQorCisvKioKKyAqIEZyZWVzIHNlY29uZGFyeSBzdG9yYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZHdjX290Z19oY2Qgc3RydWN0dXJlIGNvbnRhaW5lZAorICogaW4gdGhlIHN0cnVjdCB1c2JfaGNkIGZpZWxkLgorICovCitzdGF0aWMgdm9pZCBkd2Nfb3RnX2hjZF9mcmVlKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCkKK3sKKwlpbnQgaTsKKworCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBGUkVFXG4iKTsKKworCWRlbF90aW1lcnMoZHdjX290Z19oY2QpOworCisJLyogRnJlZSBtZW1vcnkgZm9yIFFIL1FURCBsaXN0cyAqLworCXFoX2xpc3RfZnJlZShkd2Nfb3RnX2hjZCwgJmR3Y19vdGdfaGNkLT5ub25fcGVyaW9kaWNfc2NoZWRfaW5hY3RpdmUpOworCXFoX2xpc3RfZnJlZShkd2Nfb3RnX2hjZCwgJmR3Y19vdGdfaGNkLT5ub25fcGVyaW9kaWNfc2NoZWRfYWN0aXZlKTsKKwlxaF9saXN0X2ZyZWUoZHdjX290Z19oY2QsICZkd2Nfb3RnX2hjZC0+cGVyaW9kaWNfc2NoZWRfaW5hY3RpdmUpOworCXFoX2xpc3RfZnJlZShkd2Nfb3RnX2hjZCwgJmR3Y19vdGdfaGNkLT5wZXJpb2RpY19zY2hlZF9yZWFkeSk7CisJcWhfbGlzdF9mcmVlKGR3Y19vdGdfaGNkLCAmZHdjX290Z19oY2QtPnBlcmlvZGljX3NjaGVkX2Fzc2lnbmVkKTsKKwlxaF9saXN0X2ZyZWUoZHdjX290Z19oY2QsICZkd2Nfb3RnX2hjZC0+cGVyaW9kaWNfc2NoZWRfcXVldWVkKTsKKworCS8qIEZyZWUgbWVtb3J5IGZvciB0aGUgaG9zdCBjaGFubmVscy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0VQU19DSEFOTkVMUzsgaSsrKSB7CisJCWR3Y19oY190ICpoYyA9IGR3Y19vdGdfaGNkLT5oY19wdHJfYXJyYXlbaV07CisKKyNpZmRlZiBERUJVRworCQlpZiAoZHdjX290Z19oY2QtPmNvcmVfaWYtPmhjX3hmZXJfdGltZXJbaV0pIHsKKwkJCURXQ19USU1FUl9GUkVFKGR3Y19vdGdfaGNkLT5jb3JlX2lmLT5oY194ZmVyX3RpbWVyW2ldKTsKKwkJfQorI2VuZGlmCisJCWlmIChoYyAhPSBOVUxMKSB7CisJCQlEV0NfREVCVUdQTChEQkdfSENEViwgIkhDRCBGcmVlIGNoYW5uZWwgIyVpLCBoYz0lcFxuIiwKKwkJCQkgICAgaSwgaGMpOworCQkJRFdDX0ZSRUUoaGMpOworCQl9CisJfQorCisJaWYgKGR3Y19vdGdfaGNkLT5jb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCWlmIChkd2Nfb3RnX2hjZC0+c3RhdHVzX2J1Zl9kbWEpIHsKKwkJCURXQ19ETUFfRlJFRShEV0NfT1RHX0hDRF9TVEFUVVNfQlVGX1NJWkUsCisJCQkJICAgICBkd2Nfb3RnX2hjZC0+c3RhdHVzX2J1ZiwKKwkJCQkgICAgIGR3Y19vdGdfaGNkLT5zdGF0dXNfYnVmX2RtYSk7CisJCX0KKwl9IGVsc2UgaWYgKGR3Y19vdGdfaGNkLT5zdGF0dXNfYnVmICE9IE5VTEwpIHsKKwkJRFdDX0ZSRUUoZHdjX290Z19oY2QtPnN0YXR1c19idWYpOworCX0KKwlEV0NfU1BJTkxPQ0tfRlJFRShkd2Nfb3RnX2hjZC0+bG9jayk7CisJLyogU2V0IGNvcmVfaWYncyBsb2NrIHBvaW50ZXIgdG8gTlVMTCAqLworCWR3Y19vdGdfaGNkLT5jb3JlX2lmLT5sb2NrID0gTlVMTDsKKworCURXQ19USU1FUl9GUkVFKGR3Y19vdGdfaGNkLT5jb25uX3RpbWVyKTsKKwlEV0NfVEFTS19GUkVFKGR3Y19vdGdfaGNkLT5yZXNldF90YXNrbGV0KTsKKworI2lmZGVmIERXQ19ERVZfU1JQQ0FQCisJaWYgKGR3Y19vdGdfaGNkLT5jb3JlX2lmLT5wb3dlcl9kb3duID09IDIgJiYKKwkgICAgZHdjX290Z19oY2QtPmNvcmVfaWYtPnB3cm9uX3RpbWVyKSB7CisJCURXQ19USU1FUl9GUkVFKGR3Y19vdGdfaGNkLT5jb3JlX2lmLT5wd3Jvbl90aW1lcik7CisJfQorI2VuZGlmCisJRFdDX0ZSRUUoZHdjX290Z19oY2QpOworfQorCitpbnQgZHdjX290Z19oY2RfaW5pdChkd2Nfb3RnX2hjZF90ICogaGNkLCBkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJaW50IHJldHZhbCA9IDA7CisJaW50IG51bV9jaGFubmVsczsKKwlpbnQgaTsKKwlkd2NfaGNfdCAqY2hhbm5lbDsKKworCWhjZC0+bG9jayA9IERXQ19TUElOTE9DS19BTExPQygpOworCWlmICghaGNkLT5sb2NrKSB7CisJCURXQ19FUlJPUigiQ291bGQgbm90IGFsbG9jYXRlIGxvY2sgZm9yIHBjZCIpOworCQlEV0NfRlJFRShoY2QpOworCQlyZXR2YWwgPSAtRFdDX0VfTk9fTUVNT1JZOworCQlnb3RvIG91dDsKKwl9CisJaGNkLT5jb3JlX2lmID0gY29yZV9pZjsKKworCS8qIFJlZ2lzdGVyIHRoZSBIQ0QgQ0lMIENhbGxiYWNrcyAqLworCWR3Y19vdGdfY2lsX3JlZ2lzdGVyX2hjZF9jYWxsYmFja3MoaGNkLT5jb3JlX2lmLAorCQkJCQkgICAmaGNkX2NpbF9jYWxsYmFja3MsIGhjZCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBub24tcGVyaW9kaWMgc2NoZWR1bGUuICovCisJRFdDX0xJU1RfSU5JVCgmaGNkLT5ub25fcGVyaW9kaWNfc2NoZWRfaW5hY3RpdmUpOworCURXQ19MSVNUX0lOSVQoJmhjZC0+bm9uX3BlcmlvZGljX3NjaGVkX2FjdGl2ZSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwZXJpb2RpYyBzY2hlZHVsZS4gKi8KKwlEV0NfTElTVF9JTklUKCZoY2QtPnBlcmlvZGljX3NjaGVkX2luYWN0aXZlKTsKKwlEV0NfTElTVF9JTklUKCZoY2QtPnBlcmlvZGljX3NjaGVkX3JlYWR5KTsKKwlEV0NfTElTVF9JTklUKCZoY2QtPnBlcmlvZGljX3NjaGVkX2Fzc2lnbmVkKTsKKwlEV0NfTElTVF9JTklUKCZoY2QtPnBlcmlvZGljX3NjaGVkX3F1ZXVlZCk7CisKKwkvKgorCSAqIENyZWF0ZSBhIGhvc3QgY2hhbm5lbCBkZXNjcmlwdG9yIGZvciBlYWNoIGhvc3QgY2hhbm5lbCBpbXBsZW1lbnRlZAorCSAqIGluIHRoZSBjb250cm9sbGVyLiBJbml0aWFsaXplIHRoZSBjaGFubmVsIGRlc2NyaXB0b3IgYXJyYXkuCisJICovCisJRFdDX0NJUkNMRVFfSU5JVCgmaGNkLT5mcmVlX2hjX2xpc3QpOworCW51bV9jaGFubmVscyA9IGhjZC0+Y29yZV9pZi0+Y29yZV9wYXJhbXMtPmhvc3RfY2hhbm5lbHM7CisJRFdDX01FTVNFVChoY2QtPmhjX3B0cl9hcnJheSwgMCwgc2l6ZW9mKGhjZC0+aGNfcHRyX2FycmF5KSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9jaGFubmVsczsgaSsrKSB7CisJCWNoYW5uZWwgPSBEV0NfQUxMT0Moc2l6ZW9mKGR3Y19oY190KSk7CisJCWlmIChjaGFubmVsID09IE5VTEwpIHsKKwkJCXJldHZhbCA9IC1EV0NfRV9OT19NRU1PUlk7CisJCQlEV0NfRVJST1IoIiVzOiBob3N0IGNoYW5uZWwgYWxsb2NhdGlvbiBmYWlsZWRcbiIsCisJCQkJICBfX2Z1bmNfXyk7CisJCQlkd2Nfb3RnX2hjZF9mcmVlKGhjZCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQljaGFubmVsLT5oY19udW0gPSBpOworCQloY2QtPmhjX3B0cl9hcnJheVtpXSA9IGNoYW5uZWw7CisjaWZkZWYgREVCVUcKKwkJaGNkLT5jb3JlX2lmLT5oY194ZmVyX3RpbWVyW2ldID0KKwkJICAgIERXQ19USU1FUl9BTExPQygiaGMgdGltZXIiLCBoY194ZmVyX3RpbWVvdXQsCisJCQkJICAgICZoY2QtPmNvcmVfaWYtPmhjX3hmZXJfaW5mb1tpXSk7CisjZW5kaWYKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICJIQ0QgQWRkZWQgY2hhbm5lbCAjJWQsIGhjPSVwXG4iLCBpLAorCQkJICAgIGNoYW5uZWwpOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIENvbm5lY3Rpb24gdGltZW91dCB0aW1lci4gKi8KKwloY2QtPmNvbm5fdGltZXIgPSBEV0NfVElNRVJfQUxMT0MoIkNvbm5lY3Rpb24gdGltZXIiLAorCQkJCQkgIGR3Y19vdGdfaGNkX2Nvbm5lY3RfdGltZW91dCwgMCk7CisKKwkvKiBJbml0aWFsaXplIHJlc2V0IHRhc2tsZXQuICovCisJaGNkLT5yZXNldF90YXNrbGV0ID0gRFdDX1RBU0tfQUxMT0MoInJlc2V0X3Rhc2tsZXQiLCByZXNldF90YXNrbGV0X2Z1bmMsIGhjZCk7CisjaWZkZWYgRFdDX0RFVl9TUlBDQVAKKwlpZiAoaGNkLT5jb3JlX2lmLT5wb3dlcl9kb3duID09IDIpIHsKKwkJLyogSW5pdGlhbGl6ZSBQb3dlciBvbiB0aW1lciBmb3IgSG9zdCBwb3dlciB1cCBpbiBjYXNlIGhpYmVybmF0aW9uICovCisJCWhjZC0+Y29yZV9pZi0+cHdyb25fdGltZXIgPSBEV0NfVElNRVJfQUxMT0MoIlBXUk9OIFRJTUVSIiwKKwkJCQkJCQkJCWR3Y19vdGdfaGNkX3Bvd2VyX3VwLCBjb3JlX2lmKTsKKwl9CisjZW5kaWYJCisKKwkvKgorCSAqIEFsbG9jYXRlIHNwYWNlIGZvciBzdG9yaW5nIGRhdGEgb24gc3RhdHVzIHRyYW5zYWN0aW9ucy4gTm9ybWFsbHkgbm8KKwkgKiBkYXRhIGlzIHNlbnQsIGJ1dCB0aGlzIHNwYWNlIGFjdHMgYXMgYSBiaXQgYnVja2V0LiBUaGlzIG11c3QgYmUKKwkgKiBkb25lIGFmdGVyIHVzYl9hZGRfaGNkIHNpbmNlIHRoYXQgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBETUEgYnVmZmVyCisJICogcG9vbC4KKwkgKi8KKwlpZiAoaGNkLT5jb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCWhjZC0+c3RhdHVzX2J1ZiA9CisJCSAgICBEV0NfRE1BX0FMTE9DKERXQ19PVEdfSENEX1NUQVRVU19CVUZfU0laRSwKKwkJCQkgICZoY2QtPnN0YXR1c19idWZfZG1hKTsKKwl9IGVsc2UgeworCQloY2QtPnN0YXR1c19idWYgPSBEV0NfQUxMT0MoRFdDX09UR19IQ0RfU1RBVFVTX0JVRl9TSVpFKTsKKwl9CisJaWYgKCFoY2QtPnN0YXR1c19idWYpIHsKKwkJcmV0dmFsID0gLURXQ19FX05PX01FTU9SWTsKKwkJRFdDX0VSUk9SKCIlczogc3RhdHVzX2J1ZiBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlkd2Nfb3RnX2hjZF9mcmVlKGhjZCk7CisJCWdvdG8gb3V0OworCX0KKworCWhjZC0+b3RnX3BvcnQgPSAxOworCWhjZC0+ZnJhbWVfbGlzdCA9IE5VTEw7CisJaGNkLT5mcmFtZV9saXN0X2RtYSA9IDA7CisJaGNkLT5wZXJpb2RpY19xaF9jb3VudCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBkd2Nfb3RnX2hjZF9yZW1vdmUoZHdjX290Z19oY2RfdCAqIGhjZCkKK3sKKwkvKiBUdXJuIG9mZiBhbGwgaG9zdC1zcGVjaWZpYyBpbnRlcnJ1cHRzLiAqLworCWR3Y19vdGdfZGlzYWJsZV9ob3N0X2ludGVycnVwdHMoaGNkLT5jb3JlX2lmKTsKKworCWR3Y19vdGdfaGNkX2ZyZWUoaGNkKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplcyBkeW5hbWljIHBvcnRpb25zIG9mIHRoZSBEV0Nfb3RnIEhDRCBzdGF0ZS4KKyAqLworc3RhdGljIHZvaWQgZHdjX290Z19oY2RfcmVpbml0KGR3Y19vdGdfaGNkX3QgKiBoY2QpCit7CisJaW50IG51bV9jaGFubmVsczsKKwlpbnQgaTsKKwlkd2NfaGNfdCAqY2hhbm5lbDsKKwlkd2NfaGNfdCAqY2hhbm5lbF90bXA7CisKKwloY2QtPmZsYWdzLmQzMiA9IDA7CisKKwloY2QtPm5vbl9wZXJpb2RpY19xaF9wdHIgPSAmaGNkLT5ub25fcGVyaW9kaWNfc2NoZWRfYWN0aXZlOworCWhjZC0+bm9uX3BlcmlvZGljX2NoYW5uZWxzID0gMDsKKwloY2QtPnBlcmlvZGljX2NoYW5uZWxzID0gMDsKKworCS8qCisJICogUHV0IGFsbCBjaGFubmVscyBpbiB0aGUgZnJlZSBjaGFubmVsIGxpc3QgYW5kIGNsZWFuIHVwIGNoYW5uZWwKKwkgKiBzdGF0ZXMuCisJICovCisJRFdDX0NJUkNMRVFfRk9SRUFDSF9TQUZFKGNoYW5uZWwsIGNoYW5uZWxfdG1wLAorCQkJCSAmaGNkLT5mcmVlX2hjX2xpc3QsIGhjX2xpc3RfZW50cnkpIHsKKwkJRFdDX0NJUkNMRVFfUkVNT1ZFKCZoY2QtPmZyZWVfaGNfbGlzdCwgY2hhbm5lbCwgaGNfbGlzdF9lbnRyeSk7CisJfQorCisJbnVtX2NoYW5uZWxzID0gaGNkLT5jb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9jaGFubmVsczsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJY2hhbm5lbCA9IGhjZC0+aGNfcHRyX2FycmF5W2ldOworCQlEV0NfQ0lSQ0xFUV9JTlNFUlRfVEFJTCgmaGNkLT5mcmVlX2hjX2xpc3QsIGNoYW5uZWwsCisJCQkJCWhjX2xpc3RfZW50cnkpOworCQlkd2Nfb3RnX2hjX2NsZWFudXAoaGNkLT5jb3JlX2lmLCBjaGFubmVsKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRoZSBEV0MgY29yZSBmb3IgaG9zdCBtb2RlIG9wZXJhdGlvbi4gKi8KKwlkd2Nfb3RnX2NvcmVfaG9zdF9pbml0KGhjZC0+Y29yZV9pZik7CisKKwkvKiBTZXQgY29yZV9pZidzIGxvY2sgcG9pbnRlciB0byB0aGUgaGNkLT5sb2NrICovCisJaGNkLT5jb3JlX2lmLT5sb2NrID0gaGNkLT5sb2NrOworfQorCisvKioKKyAqIEFzc2lnbnMgdHJhbnNhY3Rpb25zIGZyb20gYSBRVEQgdG8gYSBmcmVlIGhvc3QgY2hhbm5lbCBhbmQgaW5pdGlhbGl6ZXMgdGhlCisgKiBob3N0IGNoYW5uZWwgdG8gcGVyZm9ybSB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgaG9zdCBjaGFubmVsIGlzIHJlbW92ZWQgZnJvbQorICogdGhlIGZyZWUgbGlzdC4KKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0Qgc3RhdGUgc3RydWN0dXJlLgorICogQHBhcmFtIHFoIFRyYW5zYWN0aW9ucyBmcm9tIHRoZSBmaXJzdCBRVEQgZm9yIHRoaXMgUUggYXJlIHNlbGVjdGVkIGFuZAorICogYXNzaWduZWQgdG8gYSBmcmVlIGhvc3QgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgYXNzaWduX2FuZF9pbml0X2hjKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCWR3Y19oY190ICpoYzsKKwlkd2Nfb3RnX3F0ZF90ICpxdGQ7CisJZHdjX290Z19oY2RfdXJiX3QgKnVyYjsKKwl2b2lkKiBwdHIgPSBOVUxMOworCisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIlcyglcCwlcClcbiIsIF9fZnVuY19fLCBoY2QsIHFoKTsKKworCWhjID0gRFdDX0NJUkNMRVFfRklSU1QoJmhjZC0+ZnJlZV9oY19saXN0KTsKKworCS8qIFJlbW92ZSB0aGUgaG9zdCBjaGFubmVsIGZyb20gdGhlIGZyZWUgbGlzdC4gKi8KKwlEV0NfQ0lSQ0xFUV9SRU1PVkVfSU5JVCgmaGNkLT5mcmVlX2hjX2xpc3QsIGhjLCBoY19saXN0X2VudHJ5KTsKKworCXF0ZCA9IERXQ19DSVJDTEVRX0ZJUlNUKCZxaC0+cXRkX2xpc3QpOworCisJdXJiID0gcXRkLT51cmI7CisJcWgtPmNoYW5uZWwgPSBoYzsKKworCXF0ZC0+aW5fcHJvY2VzcyA9IDE7CisKKwkvKgorCSAqIFVzZSB1c2JfcGlwZWRldmljZSB0byBkZXRlcm1pbmUgZGV2aWNlIGFkZHJlc3MuIFRoaXMgYWRkcmVzcyBpcworCSAqIDAgYmVmb3JlIHRoZSBTRVRfQUREUkVTUyBjb21tYW5kIGFuZCB0aGUgY29ycmVjdCBhZGRyZXNzIGFmdGVyd2FyZC4KKwkgKi8KKwloYy0+ZGV2X2FkZHIgPSBkd2Nfb3RnX2hjZF9nZXRfZGV2X2FkZHIoJnVyYi0+cGlwZV9pbmZvKTsKKwloYy0+ZXBfbnVtID0gZHdjX290Z19oY2RfZ2V0X2VwX251bSgmdXJiLT5waXBlX2luZm8pOworCWhjLT5zcGVlZCA9IHFoLT5kZXZfc3BlZWQ7CisJaGMtPm1heF9wYWNrZXQgPSBkd2NfbWF4X3BhY2tldChxaC0+bWF4cCk7CisKKwloYy0+eGZlcl9zdGFydGVkID0gMDsKKwloYy0+aGFsdF9zdGF0dXMgPSBEV0NfT1RHX0hDX1hGRVJfTk9fSEFMVF9TVEFUVVM7CisJaGMtPmVycm9yX3N0YXRlID0gKHF0ZC0+ZXJyb3JfY291bnQgPiAwKTsKKwloYy0+aGFsdF9vbl9xdWV1ZSA9IDA7CisJaGMtPmhhbHRfcGVuZGluZyA9IDA7CisJaGMtPnJlcXVlc3RzID0gMDsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyB2YWx1ZXMgbWF5IGJlIG1vZGlmaWVkIGluIHRoZSB0cmFuc2ZlciB0eXBlIHNlY3Rpb24KKwkgKiBiZWxvdy4gVGhlIHhmZXJfbGVuIHZhbHVlIG1heSBiZSByZWR1Y2VkIHdoZW4gdGhlIHRyYW5zZmVyIGlzCisJICogc3RhcnRlZCB0byBhY2NvbW1vZGF0ZSB0aGUgbWF4IHdpZHRocyBvZiB0aGUgWGZlclNpemUgYW5kIFBrdENudAorCSAqIGZpZWxkcyBpbiB0aGUgSENUU0labiByZWdpc3Rlci4KKwkgKi8KKworCWhjLT5lcF9pc19pbiA9IChkd2Nfb3RnX2hjZF9pc19waXBlX2luKCZ1cmItPnBpcGVfaW5mbykgIT0gMCk7CisJaWYgKGhjLT5lcF9pc19pbikgeworCQloYy0+ZG9fcGluZyA9IDA7CisJfSBlbHNlIHsKKwkJaGMtPmRvX3BpbmcgPSBxaC0+cGluZ19zdGF0ZTsKKwl9CisKKwloYy0+ZGF0YV9waWRfc3RhcnQgPSBxaC0+ZGF0YV90b2dnbGU7CisJaGMtPm11bHRpX2NvdW50ID0gMTsKKworCWlmIChoY2QtPmNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJaGMtPnhmZXJfYnVmZiA9ICh1aW50OF90ICopIHVyYi0+ZG1hICsgdXJiLT5hY3R1YWxfbGVuZ3RoOworCisJCS8qIEZvciBub24tZHdvcmQgYWxpZ25lZCBjYXNlICovCisJCWlmICgoKHVuc2lnbmVkIGxvbmcpaGMtPnhmZXJfYnVmZiAmIDB4MykKKwkJICAgICYmICFoY2QtPmNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJcHRyID0gKHVpbnQ4X3QgKikgdXJiLT5idWYgKyB1cmItPmFjdHVhbF9sZW5ndGg7CisJCX0KKwl9IGVsc2UgeworCQloYy0+eGZlcl9idWZmID0gKHVpbnQ4X3QgKikgdXJiLT5idWYgKyB1cmItPmFjdHVhbF9sZW5ndGg7CisJfQorCWhjLT54ZmVyX2xlbiA9IHVyYi0+bGVuZ3RoIC0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCWhjLT54ZmVyX2NvdW50ID0gMDsKKworCS8qCisJICogU2V0IHRoZSBzcGxpdCBhdHRyaWJ1dGVzCisJICovCisJaGMtPmRvX3NwbGl0ID0gMDsKKwlpZiAocWgtPmRvX3NwbGl0KSB7CisJCXVpbnQzMl90IGh1Yl9hZGRyLCBwb3J0X2FkZHI7CisJCWhjLT5kb19zcGxpdCA9IDE7CisJCWhjLT54YWN0X3BvcyA9IHF0ZC0+aXNvY19zcGxpdF9wb3M7CisJCWhjLT5jb21wbGV0ZV9zcGxpdCA9IHF0ZC0+Y29tcGxldGVfc3BsaXQ7CisJCWhjZC0+Zm9wcy0+aHViX2luZm8oaGNkLCB1cmItPnByaXYsICZodWJfYWRkciwgJnBvcnRfYWRkcik7CisJCWhjLT5odWJfYWRkciA9ICh1aW50OF90KSBodWJfYWRkcjsKKwkJaGMtPnBvcnRfYWRkciA9ICh1aW50OF90KSBwb3J0X2FkZHI7CisJfQorCisJc3dpdGNoIChkd2Nfb3RnX2hjZF9nZXRfcGlwZV90eXBlKCZ1cmItPnBpcGVfaW5mbykpIHsKKwljYXNlIFVFX0NPTlRST0w6CisJCWhjLT5lcF90eXBlID0gRFdDX09UR19FUF9UWVBFX0NPTlRST0w7CisJCXN3aXRjaCAocXRkLT5jb250cm9sX3BoYXNlKSB7CisJCWNhc2UgRFdDX09UR19DT05UUk9MX1NFVFVQOgorCQkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIgIENvbnRyb2wgc2V0dXAgdHJhbnNhY3Rpb25cbiIpOworCQkJaGMtPmRvX3BpbmcgPSAwOworCQkJaGMtPmVwX2lzX2luID0gMDsKKwkJCWhjLT5kYXRhX3BpZF9zdGFydCA9IERXQ19PVEdfSENfUElEX1NFVFVQOworCQkJaWYgKGhjZC0+Y29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQkJCWhjLT54ZmVyX2J1ZmYgPSAodWludDhfdCAqKSB1cmItPnNldHVwX2RtYTsKKwkJCX0gZWxzZSB7CisJCQkJaGMtPnhmZXJfYnVmZiA9ICh1aW50OF90ICopIHVyYi0+c2V0dXBfcGFja2V0OworCQkJfQorCQkJaGMtPnhmZXJfbGVuID0gODsKKwkJCXB0ciA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBEV0NfT1RHX0NPTlRST0xfREFUQToKKwkJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBDb250cm9sIGRhdGEgdHJhbnNhY3Rpb25cbiIpOworCQkJaGMtPmRhdGFfcGlkX3N0YXJ0ID0gcXRkLT5kYXRhX3RvZ2dsZTsKKwkJCWJyZWFrOworCQljYXNlIERXQ19PVEdfQ09OVFJPTF9TVEFUVVM6CisJCQkvKgorCQkJICogRGlyZWN0aW9uIGlzIG9wcG9zaXRlIG9mIGRhdGEgZGlyZWN0aW9uIG9yIElOIGlmIG5vCisJCQkgKiBkYXRhLgorCQkJICovCisJCQlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgQ29udHJvbCBzdGF0dXMgdHJhbnNhY3Rpb25cbiIpOworCQkJaWYgKHVyYi0+bGVuZ3RoID09IDApIHsKKwkJCQloYy0+ZXBfaXNfaW4gPSAxOworCQkJfSBlbHNlIHsKKwkJCQloYy0+ZXBfaXNfaW4gPQorCQkJCSAgICBkd2Nfb3RnX2hjZF9pc19waXBlX291dCgmdXJiLT5waXBlX2luZm8pOworCQkJfQorCQkJaWYgKGhjLT5lcF9pc19pbikgeworCQkJCWhjLT5kb19waW5nID0gMDsKKwkJCX0KKworCQkJaGMtPmRhdGFfcGlkX3N0YXJ0ID0gRFdDX09UR19IQ19QSURfREFUQTE7CisKKwkJCWhjLT54ZmVyX2xlbiA9IDA7CisJCQlpZiAoaGNkLT5jb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQkJaGMtPnhmZXJfYnVmZiA9ICh1aW50OF90ICopIGhjZC0+c3RhdHVzX2J1Zl9kbWE7CisJCQl9IGVsc2UgeworCQkJCWhjLT54ZmVyX2J1ZmYgPSAodWludDhfdCAqKSBoY2QtPnN0YXR1c19idWY7CisJCQl9CisJCQlwdHIgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVRV9CVUxLOgorCQloYy0+ZXBfdHlwZSA9IERXQ19PVEdfRVBfVFlQRV9CVUxLOworCQlicmVhazsKKwljYXNlIFVFX0lOVEVSUlVQVDoKKwkJaGMtPmVwX3R5cGUgPSBEV0NfT1RHX0VQX1RZUEVfSU5UUjsKKwkJYnJlYWs7CisJY2FzZSBVRV9JU09DSFJPTk9VUzoKKwkJeworCQkJc3RydWN0IGR3Y19vdGdfaGNkX2lzb19wYWNrZXRfZGVzYyAqZnJhbWVfZGVzYzsKKworCQkJaGMtPmVwX3R5cGUgPSBEV0NfT1RHX0VQX1RZUEVfSVNPQzsKKworCQkJaWYgKGhjZC0+Y29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKQorCQkJCWJyZWFrOworCisJCQlmcmFtZV9kZXNjID0gJnVyYi0+aXNvX2Rlc2NzW3F0ZC0+aXNvY19mcmFtZV9pbmRleF07CisKKwkJCWZyYW1lX2Rlc2MtPnN0YXR1cyA9IDA7CisKKwkJCWlmIChoY2QtPmNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJCQloYy0+eGZlcl9idWZmID0gKHVpbnQ4X3QgKikgdXJiLT5kbWE7CisJCQl9IGVsc2UgeworCQkJCWhjLT54ZmVyX2J1ZmYgPSAodWludDhfdCAqKSB1cmItPmJ1ZjsKKwkJCX0KKwkJCWhjLT54ZmVyX2J1ZmYgKz0KKwkJCSAgICBmcmFtZV9kZXNjLT5vZmZzZXQgKyBxdGQtPmlzb2Nfc3BsaXRfb2Zmc2V0OworCQkJaGMtPnhmZXJfbGVuID0KKwkJCSAgICBmcmFtZV9kZXNjLT5sZW5ndGggLSBxdGQtPmlzb2Nfc3BsaXRfb2Zmc2V0OworCisJCQkvKiBGb3Igbm9uLWR3b3JkIGFsaWduZWQgYnVmZmVycyAqLworCQkJaWYgKCgodW5zaWduZWQgbG9uZyloYy0+eGZlcl9idWZmICYgMHgzKQorCQkJICAgICYmIGhjZC0+Y29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQkJCXB0ciA9CisJCQkJICAgICh1aW50OF90ICopIHVyYi0+YnVmICsgZnJhbWVfZGVzYy0+b2Zmc2V0ICsKKwkJCQkgICAgcXRkLT5pc29jX3NwbGl0X29mZnNldDsKKwkJCX0gZWxzZQorCQkJCXB0ciA9IE5VTEw7CisKKwkJCWlmIChoYy0+eGFjdF9wb3MgPT0gRFdDX0hDU1BMSVRfWEFDVFBPU19BTEwpIHsKKwkJCQlpZiAoaGMtPnhmZXJfbGVuIDw9IDE4OCkgeworCQkJCQloYy0+eGFjdF9wb3MgPSBEV0NfSENTUExJVF9YQUNUUE9TX0FMTDsKKwkJCQl9IGVsc2UgeworCQkJCQloYy0+eGFjdF9wb3MgPQorCQkJCQkgICAgRFdDX0hDU1BMSVRfWEFDVFBPU19CRUdJTjsKKwkJCQl9CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCS8qIG5vbiBEV09SRC1hbGlnbmVkIGJ1ZmZlciBjYXNlICovCQorCWlmIChwdHIpIHsKKwkJdWludDMyX3QgYnVmX3NpemU7CisJCWlmIChoYy0+ZXBfdHlwZSAhPSBEV0NfT1RHX0VQX1RZUEVfSVNPQykgeworCQkJYnVmX3NpemUgPSBoY2QtPmNvcmVfaWYtPmNvcmVfcGFyYW1zLT5tYXhfdHJhbnNmZXJfc2l6ZTsKKwkJfSBlbHNlIHsJCQkJCisJCQlidWZfc2l6ZSA9IDQwOTY7CisJCX0KKwkJaWYgKCFxaC0+ZHdfYWxpZ25fYnVmKSB7CisJCQlxaC0+ZHdfYWxpZ25fYnVmID0gRFdDX0RNQV9BTExPQ19BVE9NSUMoYnVmX3NpemUsCisJCQkJCQkJICZxaC0+ZHdfYWxpZ25fYnVmX2RtYSk7CisJCQlpZiAoIXFoLT5kd19hbGlnbl9idWYpIHsKKwkJCQlEV0NfRVJST1IKKwkJCQkgICAgKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBoYW5kbGUgIgorCQkJCSAgICAgIm5vbi1kd29yZCBhbGlnbmVkIGJ1ZmZlciBjYXNlXG4iLAorCQkJCSAgICAgX19mdW5jX18pOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCQlpZiAoIWhjLT5lcF9pc19pbikgeworCQkJZHdjX21lbWNweShxaC0+ZHdfYWxpZ25fYnVmLCBwdHIsIGhjLT54ZmVyX2xlbik7CisJCX0KKwkJaGMtPmFsaWduX2J1ZmYgPSBxaC0+ZHdfYWxpZ25fYnVmX2RtYTsKKwl9IGVsc2UgeworCQloYy0+YWxpZ25fYnVmZiA9IDA7CisJfQorCisJaWYgKGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9JTlRSIHx8CisJICAgIGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCS8qCisJCSAqIFRoaXMgdmFsdWUgbWF5IGJlIG1vZGlmaWVkIHdoZW4gdGhlIHRyYW5zZmVyIGlzIHN0YXJ0ZWQgdG8KKwkJICogcmVmbGVjdCB0aGUgYWN0dWFsIHRyYW5zZmVyIGxlbmd0aC4KKwkJICovCisJCWhjLT5tdWx0aV9jb3VudCA9IGR3Y19oYl9tdWx0KHFoLT5tYXhwKTsKKwl9CisKKwlpZiAoaGNkLT5jb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpCisJCWhjLT5kZXNjX2xpc3RfYWRkciA9IHFoLT5kZXNjX2xpc3RfZG1hOworCisJZHdjX290Z19oY19pbml0KGhjZC0+Y29yZV9pZiwgaGMpOworCWhjLT5xaCA9IHFoOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc2VsZWN0cyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgSENEIHRyYW5zZmVyIHNjaGVkdWxlIGFuZAorICogYXNzaWducyB0aGVtIHRvIGF2YWlsYWJsZSBob3N0IGNoYW5uZWxzLiBJdCBpcyBjYWxsZWQgZnJvbSBIQ0QgaW50ZXJydXB0CisgKiBoYW5kbGVyIGZ1bmN0aW9ucy4KKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0Qgc3RhdGUgc3RydWN0dXJlLgorICoKKyAqIEByZXR1cm4gVGhlIHR5cGVzIG9mIG5ldyB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIGFzc2lnbmVkIHRvIGhvc3QgY2hhbm5lbHMuCisgKi8KK2R3Y19vdGdfdHJhbnNhY3Rpb25fdHlwZV9lIGR3Y19vdGdfaGNkX3NlbGVjdF90cmFuc2FjdGlvbnMoZHdjX290Z19oY2RfdCAqIGhjZCkKK3sKKwlkd2NfbGlzdF9saW5rX3QgKnFoX3B0cjsKKwlkd2Nfb3RnX3FoX3QgKnFoOworCWludCBudW1fY2hhbm5lbHM7CisJZHdjX290Z190cmFuc2FjdGlvbl90eXBlX2UgcmV0X3ZhbCA9IERXQ19PVEdfVFJBTlNBQ1RJT05fTk9ORTsKKworI2lmZGVmIERFQlVHX1NPRgorCURXQ19ERUJVR1BMKERCR19IQ0QsICIgIFNlbGVjdCBUcmFuc2FjdGlvbnNcbiIpOworI2VuZGlmCisKKwkvKiBQcm9jZXNzIGVudHJpZXMgaW4gdGhlIHBlcmlvZGljIHJlYWR5IGxpc3QuICovCisJcWhfcHRyID0gRFdDX0xJU1RfRklSU1QoJmhjZC0+cGVyaW9kaWNfc2NoZWRfcmVhZHkpOworCisJd2hpbGUgKHFoX3B0ciAhPSAmaGNkLT5wZXJpb2RpY19zY2hlZF9yZWFkeSAmJgorCSAgICAgICAhRFdDX0NJUkNMRVFfRU1QVFkoJmhjZC0+ZnJlZV9oY19saXN0KSkgeworCisJCXFoID0gRFdDX0xJU1RfRU5UUlkocWhfcHRyLCBkd2Nfb3RnX3FoX3QsIHFoX2xpc3RfZW50cnkpOworCQlhc3NpZ25fYW5kX2luaXRfaGMoaGNkLCBxaCk7CisKKwkJLyoKKwkJICogTW92ZSB0aGUgUUggZnJvbSB0aGUgcGVyaW9kaWMgcmVhZHkgc2NoZWR1bGUgdG8gdGhlCisJCSAqIHBlcmlvZGljIGFzc2lnbmVkIHNjaGVkdWxlLgorCQkgKi8KKwkJcWhfcHRyID0gRFdDX0xJU1RfTkVYVChxaF9wdHIpOworCQlEV0NfTElTVF9NT1ZFX0hFQUQoJmhjZC0+cGVyaW9kaWNfc2NoZWRfYXNzaWduZWQsCisJCQkJICAgJnFoLT5xaF9saXN0X2VudHJ5KTsKKworCQlyZXRfdmFsID0gRFdDX09UR19UUkFOU0FDVElPTl9QRVJJT0RJQzsKKwl9CisKKwkvKgorCSAqIFByb2Nlc3MgZW50cmllcyBpbiB0aGUgaW5hY3RpdmUgcG9ydGlvbiBvZiB0aGUgbm9uLXBlcmlvZGljCisJICogc2NoZWR1bGUuIFNvbWUgZnJlZSBob3N0IGNoYW5uZWxzIG1heSBub3QgYmUgdXNlZCBpZiB0aGV5IGFyZQorCSAqIHJlc2VydmVkIGZvciBwZXJpb2RpYyB0cmFuc2ZlcnMuCisJICovCisJcWhfcHRyID0gaGNkLT5ub25fcGVyaW9kaWNfc2NoZWRfaW5hY3RpdmUubmV4dDsKKwludW1fY2hhbm5lbHMgPSBoY2QtPmNvcmVfaWYtPmNvcmVfcGFyYW1zLT5ob3N0X2NoYW5uZWxzOworCXdoaWxlIChxaF9wdHIgIT0gJmhjZC0+bm9uX3BlcmlvZGljX3NjaGVkX2luYWN0aXZlICYmCisJICAgICAgIChoY2QtPm5vbl9wZXJpb2RpY19jaGFubmVscyA8CisJCW51bV9jaGFubmVscyAtIGhjZC0+cGVyaW9kaWNfY2hhbm5lbHMpICYmCisJICAgICAgICFEV0NfQ0lSQ0xFUV9FTVBUWSgmaGNkLT5mcmVlX2hjX2xpc3QpKSB7CisKKwkJcWggPSBEV0NfTElTVF9FTlRSWShxaF9wdHIsIGR3Y19vdGdfcWhfdCwgcWhfbGlzdF9lbnRyeSk7CisKKwkJYXNzaWduX2FuZF9pbml0X2hjKGhjZCwgcWgpOworCisJCS8qCisJCSAqIE1vdmUgdGhlIFFIIGZyb20gdGhlIG5vbi1wZXJpb2RpYyBpbmFjdGl2ZSBzY2hlZHVsZSB0byB0aGUKKwkJICogbm9uLXBlcmlvZGljIGFjdGl2ZSBzY2hlZHVsZS4KKwkJICovCisJCXFoX3B0ciA9IERXQ19MSVNUX05FWFQocWhfcHRyKTsKKwkJRFdDX0xJU1RfTU9WRV9IRUFEKCZoY2QtPm5vbl9wZXJpb2RpY19zY2hlZF9hY3RpdmUsCisJCQkJICAgJnFoLT5xaF9saXN0X2VudHJ5KTsKKworCQlpZiAocmV0X3ZhbCA9PSBEV0NfT1RHX1RSQU5TQUNUSU9OX05PTkUpIHsKKwkJCXJldF92YWwgPSBEV0NfT1RHX1RSQU5TQUNUSU9OX05PTl9QRVJJT0RJQzsKKwkJfSBlbHNlIHsKKwkJCXJldF92YWwgPSBEV0NfT1RHX1RSQU5TQUNUSU9OX0FMTDsKKwkJfQorCisJCWhjZC0+bm9uX3BlcmlvZGljX2NoYW5uZWxzKys7CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogQXR0ZW1wdHMgdG8gcXVldWUgYSBzaW5nbGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBmb3IgYSBob3N0IGNoYW5uZWwKKyAqIGFzc29jaWF0ZWQgd2l0aCBlaXRoZXIgYSBwZXJpb2RpYyBvciBub24tcGVyaW9kaWMgdHJhbnNmZXIuIFRoaXMgZnVuY3Rpb24KKyAqIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBzcGFjZSBhdmFpbGFibGUgaW4gdGhlIGFwcHJvcHJpYXRlIHJlcXVlc3QgcXVldWUuIEZvcgorICogYW4gT1VUIHRyYW5zZmVyIG9yIFNFVFVQIHRyYW5zYWN0aW9uIGluIFNsYXZlIG1vZGUsIGl0IGNoZWNrcyB3aGV0aGVyIHNwYWNlCisgKiBpcyBhdmFpbGFibGUgaW4gdGhlIGFwcHJvcHJpYXRlIFR4IEZJRk8uCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENEIHN0YXRlIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBoYyBIb3N0IGNoYW5uZWwgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggZWl0aGVyIGEgcGVyaW9kaWMgb3IKKyAqIG5vbi1wZXJpb2RpYyB0cmFuc2Zlci4KKyAqIEBwYXJhbSBmaWZvX2R3b3Jkc19hdmFpbCBOdW1iZXIgb2YgRFdPUkRzIGF2YWlsYWJsZSBpbiB0aGUgcGVyaW9kaWMgVHgKKyAqIEZJRk8gZm9yIHBlcmlvZGljIHRyYW5zZmVycyBvciB0aGUgbm9uLXBlcmlvZGljIFR4IEZJRk8gZm9yIG5vbi1wZXJpb2RpYworICogdHJhbnNmZXJzLgorICoKKyAqIEByZXR1cm4gMSBpZiBhIHJlcXVlc3QgaXMgcXVldWVkIGFuZCBtb3JlIHJlcXVlc3RzIG1heSBiZSBuZWVkZWQgdG8KKyAqIGNvbXBsZXRlIHRoZSB0cmFuc2ZlciwgMCBpZiBubyBtb3JlIHJlcXVlc3RzIGFyZSByZXF1aXJlZCBmb3IgdGhpcworICogdHJhbnNmZXIsIC0xIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBzcGFjZSBpbiB0aGUgVHggRklGTy4KKyAqLworc3RhdGljIGludCBxdWV1ZV90cmFuc2FjdGlvbihkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkJICAgICBkd2NfaGNfdCAqIGhjLCB1aW50MTZfdCBmaWZvX2R3b3Jkc19hdmFpbCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKGhjZC0+Y29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQlpZiAoaGNkLT5jb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJCWlmICghaGMtPnhmZXJfc3RhcnRlZAorCQkJICAgIHx8IChoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykpIHsKKwkJCQlkd2Nfb3RnX2hjZF9zdGFydF94ZmVyX2RkbWEoaGNkLCBoYy0+cWgpOworCQkJCWhjLT5xaC0+cGluZ19zdGF0ZSA9IDA7CisJCQl9CisJCX0gZWxzZSBpZiAoIWhjLT54ZmVyX3N0YXJ0ZWQpIHsKKwkJCWR3Y19vdGdfaGNfc3RhcnRfdHJhbnNmZXIoaGNkLT5jb3JlX2lmLCBoYyk7CisJCQloYy0+cWgtPnBpbmdfc3RhdGUgPSAwOworCQl9CisJCXJldHZhbCA9IDA7CisJfSBlbHNlIGlmIChoYy0+aGFsdF9wZW5kaW5nKSB7CisJCS8qIERvbid0IHF1ZXVlIGEgcmVxdWVzdCBpZiB0aGUgY2hhbm5lbCBoYXMgYmVlbiBoYWx0ZWQuICovCisJCXJldHZhbCA9IDA7CisJfSBlbHNlIGlmIChoYy0+aGFsdF9vbl9xdWV1ZSkgeworCQlkd2Nfb3RnX2hjX2hhbHQoaGNkLT5jb3JlX2lmLCBoYywgaGMtPmhhbHRfc3RhdHVzKTsKKwkJcmV0dmFsID0gMDsKKwl9IGVsc2UgaWYgKGhjLT5kb19waW5nKSB7CisJCWlmICghaGMtPnhmZXJfc3RhcnRlZCkgeworCQkJZHdjX290Z19oY19zdGFydF90cmFuc2ZlcihoY2QtPmNvcmVfaWYsIGhjKTsKKwkJfQorCQlyZXR2YWwgPSAwOworCX0gZWxzZSBpZiAoIWhjLT5lcF9pc19pbiB8fCBoYy0+ZGF0YV9waWRfc3RhcnQgPT0gRFdDX09UR19IQ19QSURfU0VUVVApIHsKKwkJaWYgKChmaWZvX2R3b3Jkc19hdmFpbCAqIDQpID49IGhjLT5tYXhfcGFja2V0KSB7CisJCQlpZiAoIWhjLT54ZmVyX3N0YXJ0ZWQpIHsKKwkJCQlkd2Nfb3RnX2hjX3N0YXJ0X3RyYW5zZmVyKGhjZC0+Y29yZV9pZiwgaGMpOworCQkJCXJldHZhbCA9IDE7CisJCQl9IGVsc2UgeworCQkJCXJldHZhbCA9CisJCQkJICAgIGR3Y19vdGdfaGNfY29udGludWVfdHJhbnNmZXIoaGNkLT5jb3JlX2lmLAorCQkJCQkJCQkgaGMpOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dmFsID0gLTE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIWhjLT54ZmVyX3N0YXJ0ZWQpIHsKKwkJCWR3Y19vdGdfaGNfc3RhcnRfdHJhbnNmZXIoaGNkLT5jb3JlX2lmLCBoYyk7CisJCQlyZXR2YWwgPSAxOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gZHdjX290Z19oY19jb250aW51ZV90cmFuc2ZlcihoY2QtPmNvcmVfaWYsIGhjKTsKKwkJfQorCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogUHJvY2Vzc2VzIHBlcmlvZGljIGNoYW5uZWxzIGZvciB0aGUgbmV4dCBmcmFtZSBhbmQgcXVldWVzIHRyYW5zYWN0aW9ucyBmb3IKKyAqIHRoZXNlIGNoYW5uZWxzIHRvIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIuIEFmdGVyIHF1ZXVlaW5nIHRyYW5zYWN0aW9ucywgdGhlCisgKiBQZXJpb2RpYyBUeCBGSUZPIEVtcHR5IGludGVycnVwdCBpcyBlbmFibGVkIGlmIHRoZXJlIGFyZSBtb3JlIHRyYW5zYWN0aW9ucworICogdG8gcXVldWUgYXMgUGVyaW9kaWMgVHggRklGTyBvciByZXF1ZXN0IHF1ZXVlIHNwYWNlIGJlY29tZXMgYXZhaWxhYmxlLgorICogT3RoZXJ3aXNlLCB0aGUgUGVyaW9kaWMgVHggRklGTyBFbXB0eSBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfcGVyaW9kaWNfY2hhbm5lbHMoZHdjX290Z19oY2RfdCAqIGhjZCkKK3sKKwlocHR4c3RzX2RhdGFfdCB0eF9zdGF0dXM7CisJZHdjX2xpc3RfbGlua190ICpxaF9wdHI7CisJZHdjX290Z19xaF90ICpxaDsKKwlpbnQgc3RhdHVzOworCWludCBub19xdWV1ZV9zcGFjZSA9IDA7CisJaW50IG5vX2ZpZm9fc3BhY2UgPSAwOworCisJZHdjX290Z19ob3N0X2dsb2JhbF9yZWdzX3QgKmhvc3RfcmVnczsKKwlob3N0X3JlZ3MgPSBoY2QtPmNvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3M7CisKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIlF1ZXVlIHBlcmlvZGljIHRyYW5zYWN0aW9uc1xuIik7CisjaWZkZWYgREVCVUcKKwl0eF9zdGF0dXMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhvc3RfcmVncy0+aHB0eHN0cyk7CisJRFdDX0RFQlVHUEwoREJHX0hDRFYsCisJCSAgICAiICBQIFR4IFJlcSBRdWV1ZSBTcGFjZSBBdmFpbCAoYmVmb3JlIHF1ZXVlKTogJWRcbiIsCisJCSAgICB0eF9zdGF0dXMuYi5wdHhxc3BjYXZhaWwpOworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBQIFR4IEZJRk8gU3BhY2UgQXZhaWwgKGJlZm9yZSBxdWV1ZSk6ICVkXG4iLAorCQkgICAgdHhfc3RhdHVzLmIucHR4ZnNwY2F2YWlsKTsKKyNlbmRpZgorCisJcWhfcHRyID0gaGNkLT5wZXJpb2RpY19zY2hlZF9hc3NpZ25lZC5uZXh0OworCXdoaWxlIChxaF9wdHIgIT0gJmhjZC0+cGVyaW9kaWNfc2NoZWRfYXNzaWduZWQpIHsKKwkJdHhfc3RhdHVzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZob3N0X3JlZ3MtPmhwdHhzdHMpOworCQlpZiAodHhfc3RhdHVzLmIucHR4cXNwY2F2YWlsID09IDApIHsKKwkJCW5vX3F1ZXVlX3NwYWNlID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJcWggPSBEV0NfTElTVF9FTlRSWShxaF9wdHIsIGR3Y19vdGdfcWhfdCwgcWhfbGlzdF9lbnRyeSk7CisKKwkJLyoKKwkJICogU2V0IGEgZmxhZyBpZiB3ZSdyZSBxdWV1aW5nIGhpZ2gtYmFuZHdpZHRoIGluIHNsYXZlIG1vZGUuCisJCSAqIFRoZSBmbGFnIHByZXZlbnRzIGFueSBoYWx0cyB0byBnZXQgaW50byB0aGUgcmVxdWVzdCBxdWV1ZSBpbgorCQkgKiB0aGUgbWlkZGxlIG9mIG11bHRpcGxlIGhpZ2gtYmFuZHdpZHRoIHBhY2tldHMgZ2V0dGluZyBxdWV1ZWQuCisJCSAqLworCQlpZiAoIWhjZC0+Y29yZV9pZi0+ZG1hX2VuYWJsZSAmJiBxaC0+Y2hhbm5lbC0+bXVsdGlfY291bnQgPiAxKSB7CisJCQloY2QtPmNvcmVfaWYtPnF1ZXVpbmdfaGlnaF9iYW5kd2lkdGggPSAxOworCQl9CisJCXN0YXR1cyA9CisJCSAgICBxdWV1ZV90cmFuc2FjdGlvbihoY2QsIHFoLT5jaGFubmVsLAorCQkJCSAgICAgIHR4X3N0YXR1cy5iLnB0eGZzcGNhdmFpbCk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlub19maWZvX3NwYWNlID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogSW4gU2xhdmUgbW9kZSwgc3RheSBvbiB0aGUgY3VycmVudCB0cmFuc2ZlciB1bnRpbCB0aGVyZSBpcworCQkgKiBub3RoaW5nIG1vcmUgdG8gZG8gb3IgdGhlIGhpZ2gtYmFuZHdpZHRoIHJlcXVlc3QgY291bnQgaXMKKwkJICogcmVhY2hlZC4gSW4gRE1BIG1vZGUsIG9ubHkgbmVlZCB0byBxdWV1ZSBvbmUgcmVxdWVzdC4gVGhlCisJCSAqIGNvbnRyb2xsZXIgYXV0b21hdGljYWxseSBoYW5kbGVzIG11bHRpcGxlIHBhY2tldHMgZm9yCisJCSAqIGhpZ2gtYmFuZHdpZHRoIHRyYW5zZmVycy4KKwkJICovCisJCWlmIChoY2QtPmNvcmVfaWYtPmRtYV9lbmFibGUgfHwgc3RhdHVzID09IDAgfHwKKwkJICAgIHFoLT5jaGFubmVsLT5yZXF1ZXN0cyA9PSBxaC0+Y2hhbm5lbC0+bXVsdGlfY291bnQpIHsKKwkJCXFoX3B0ciA9IHFoX3B0ci0+bmV4dDsKKwkJCS8qCisJCQkgKiBNb3ZlIHRoZSBRSCBmcm9tIHRoZSBwZXJpb2RpYyBhc3NpZ25lZCBzY2hlZHVsZSB0bworCQkJICogdGhlIHBlcmlvZGljIHF1ZXVlZCBzY2hlZHVsZS4KKwkJCSAqLworCQkJRFdDX0xJU1RfTU9WRV9IRUFEKCZoY2QtPnBlcmlvZGljX3NjaGVkX3F1ZXVlZCwKKwkJCQkJICAgJnFoLT5xaF9saXN0X2VudHJ5KTsKKworCQkJLyogZG9uZSBxdWV1aW5nIGhpZ2ggYmFuZHdpZHRoICovCisJCQloY2QtPmNvcmVfaWYtPnF1ZXVpbmdfaGlnaF9iYW5kd2lkdGggPSAwOworCQl9CisJfQorCisJaWYgKCFoY2QtPmNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzOworCQlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKworCQlnbG9iYWxfcmVncyA9IGhjZC0+Y29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwkJaW50cl9tYXNrLmIucHR4ZmVtcHR5ID0gMTsKKyNpZmRlZiBERUJVRworCQl0eF9zdGF0dXMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhvc3RfcmVncy0+aHB0eHN0cyk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLAorCQkJICAgICIgIFAgVHggUmVxIFF1ZXVlIFNwYWNlIEF2YWlsIChhZnRlciBxdWV1ZSk6ICVkXG4iLAorCQkJICAgIHR4X3N0YXR1cy5iLnB0eHFzcGNhdmFpbCk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLAorCQkJICAgICIgIFAgVHggRklGTyBTcGFjZSBBdmFpbCAoYWZ0ZXIgcXVldWUpOiAlZFxuIiwKKwkJCSAgICB0eF9zdGF0dXMuYi5wdHhmc3BjYXZhaWwpOworI2VuZGlmCisJCWlmICghRFdDX0xJU1RfRU1QVFkoJmhjZC0+cGVyaW9kaWNfc2NoZWRfYXNzaWduZWQpIHx8CisJCSAgICBub19xdWV1ZV9zcGFjZSB8fCBub19maWZvX3NwYWNlKSB7CisJCQkvKgorCQkJICogTWF5IG5lZWQgdG8gcXVldWUgbW9yZSB0cmFuc2FjdGlvbnMgYXMgdGhlIHJlcXVlc3QKKwkJCSAqIHF1ZXVlIG9yIFR4IEZJRk8gZW1wdGllcy4gRW5hYmxlIHRoZSBwZXJpb2RpYyBUeAorCQkJICogRklGTyBlbXB0eSBpbnRlcnJ1cHQuIChBbHdheXMgdXNlIHRoZSBoYWxmLWVtcHR5CisJCQkgKiBsZXZlbCB0byBlbnN1cmUgdGhhdCBuZXcgcmVxdWVzdHMgYXJlIGxvYWRlZCBhcworCQkJICogc29vbiBhcyBwb3NzaWJsZS4pCisJCQkgKi8KKwkJCURXQ19NT0RJRllfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCAwLAorCQkJCQkgaW50cl9tYXNrLmQzMik7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRGlzYWJsZSB0aGUgVHggRklGTyBlbXB0eSBpbnRlcnJ1cHQgc2luY2UgdGhlcmUgYXJlCisJCQkgKiBubyBtb3JlIHRyYW5zYWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcXVldWVkIHJpZ2h0CisJCQkgKiBub3cuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gaW50ZXJydXB0CisJCQkgKiBoYW5kbGVycyB0byBxdWV1ZSBtb3JlIHRyYW5zYWN0aW9ucyBhcyB0cmFuc2ZlcgorCQkJICogc3RhdGVzIGNoYW5nZS4KKwkJCSAqLworCQkJRFdDX01PRElGWV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIGludHJfbWFzay5kMzIsCisJCQkJCSAwKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBQcm9jZXNzZXMgYWN0aXZlIG5vbi1wZXJpb2RpYyBjaGFubmVscyBhbmQgcXVldWVzIHRyYW5zYWN0aW9ucyBmb3IgdGhlc2UKKyAqIGNoYW5uZWxzIHRvIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIuIEFmdGVyIHF1ZXVlaW5nIHRyYW5zYWN0aW9ucywgdGhlIE5QIFR4CisgKiBGSUZPIEVtcHR5IGludGVycnVwdCBpcyBlbmFibGVkIGlmIHRoZXJlIGFyZSBtb3JlIHRyYW5zYWN0aW9ucyB0byBxdWV1ZSBhcworICogTlAgVHggRklGTyBvciByZXF1ZXN0IHF1ZXVlIHNwYWNlIGJlY29tZXMgYXZhaWxhYmxlLiBPdGhlcndpc2UsIHRoZSBOUCBUeAorICogRklGTyBFbXB0eSBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3Nfbm9uX3BlcmlvZGljX2NoYW5uZWxzKGR3Y19vdGdfaGNkX3QgKiBoY2QpCit7CisJZ25wdHhzdHNfZGF0YV90IHR4X3N0YXR1czsKKwlkd2NfbGlzdF9saW5rX3QgKm9yaWdfcWhfcHRyOworCWR3Y19vdGdfcWhfdCAqcWg7CisJaW50IHN0YXR1czsKKwlpbnQgbm9fcXVldWVfc3BhY2UgPSAwOworCWludCBub19maWZvX3NwYWNlID0gMDsKKwlpbnQgbW9yZV90b19kbyA9IDA7CisKKwlkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqZ2xvYmFsX3JlZ3MgPQorCSAgICBoY2QtPmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3M7CisKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIlF1ZXVlIG5vbi1wZXJpb2RpYyB0cmFuc2FjdGlvbnNcbiIpOworI2lmZGVmIERFQlVHCisJdHhfc3RhdHVzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhzdHMpOworCURXQ19ERUJVR1BMKERCR19IQ0RWLAorCQkgICAgIiAgTlAgVHggUmVxIFF1ZXVlIFNwYWNlIEF2YWlsIChiZWZvcmUgcXVldWUpOiAlZFxuIiwKKwkJICAgIHR4X3N0YXR1cy5iLm5wdHhxc3BjYXZhaWwpOworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBOUCBUeCBGSUZPIFNwYWNlIEF2YWlsIChiZWZvcmUgcXVldWUpOiAlZFxuIiwKKwkJICAgIHR4X3N0YXR1cy5iLm5wdHhmc3BjYXZhaWwpOworI2VuZGlmCisJLyoKKwkgKiBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydGluZyBwb2ludC4gU2tpcCBvdmVyIHRoZSBzdGFydC1vZi1saXN0CisJICogZW50cnkuCisJICovCisJaWYgKGhjZC0+bm9uX3BlcmlvZGljX3FoX3B0ciA9PSAmaGNkLT5ub25fcGVyaW9kaWNfc2NoZWRfYWN0aXZlKSB7CisJCWhjZC0+bm9uX3BlcmlvZGljX3FoX3B0ciA9IGhjZC0+bm9uX3BlcmlvZGljX3FoX3B0ci0+bmV4dDsKKwl9CisJb3JpZ19xaF9wdHIgPSBoY2QtPm5vbl9wZXJpb2RpY19xaF9wdHI7CisKKwkvKgorCSAqIFByb2Nlc3Mgb25jZSB0aHJvdWdoIHRoZSBhY3RpdmUgbGlzdCBvciB1bnRpbCBubyBtb3JlIHNwYWNlIGlzCisJICogYXZhaWxhYmxlIGluIHRoZSByZXF1ZXN0IHF1ZXVlIG9yIHRoZSBUeCBGSUZPLgorCSAqLworCWRvIHsKKwkJdHhfc3RhdHVzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z25wdHhzdHMpOworCQlpZiAoIWhjZC0+Y29yZV9pZi0+ZG1hX2VuYWJsZSAmJiB0eF9zdGF0dXMuYi5ucHR4cXNwY2F2YWlsID09IDApIHsKKwkJCW5vX3F1ZXVlX3NwYWNlID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJcWggPSBEV0NfTElTVF9FTlRSWShoY2QtPm5vbl9wZXJpb2RpY19xaF9wdHIsIGR3Y19vdGdfcWhfdCwKKwkJCQkgICAgcWhfbGlzdF9lbnRyeSk7CisJCXN0YXR1cyA9CisJCSAgICBxdWV1ZV90cmFuc2FjdGlvbihoY2QsIHFoLT5jaGFubmVsLAorCQkJCSAgICAgIHR4X3N0YXR1cy5iLm5wdHhmc3BjYXZhaWwpOworCisJCWlmIChzdGF0dXMgPiAwKSB7CisJCQltb3JlX3RvX2RvID0gMTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgPCAwKSB7CisJCQlub19maWZvX3NwYWNlID0gMTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQWR2YW5jZSB0byBuZXh0IFFILCBza2lwcGluZyBzdGFydC1vZi1saXN0IGVudHJ5LiAqLworCQloY2QtPm5vbl9wZXJpb2RpY19xaF9wdHIgPSBoY2QtPm5vbl9wZXJpb2RpY19xaF9wdHItPm5leHQ7CisJCWlmIChoY2QtPm5vbl9wZXJpb2RpY19xaF9wdHIgPT0gJmhjZC0+bm9uX3BlcmlvZGljX3NjaGVkX2FjdGl2ZSkgeworCQkJaGNkLT5ub25fcGVyaW9kaWNfcWhfcHRyID0KKwkJCSAgICBoY2QtPm5vbl9wZXJpb2RpY19xaF9wdHItPm5leHQ7CisJCX0KKworCX0gd2hpbGUgKGhjZC0+bm9uX3BlcmlvZGljX3FoX3B0ciAhPSBvcmlnX3FoX3B0cik7CisKKwlpZiAoIWhjZC0+Y29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKwkJaW50cl9tYXNrLmIubnB0eGZlbXB0eSA9IDE7CisKKyNpZmRlZiBERUJVRworCQl0eF9zdGF0dXMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nbnB0eHN0cyk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLAorCQkJICAgICIgIE5QIFR4IFJlcSBRdWV1ZSBTcGFjZSBBdmFpbCAoYWZ0ZXIgcXVldWUpOiAlZFxuIiwKKwkJCSAgICB0eF9zdGF0dXMuYi5ucHR4cXNwY2F2YWlsKTsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsCisJCQkgICAgIiAgTlAgVHggRklGTyBTcGFjZSBBdmFpbCAoYWZ0ZXIgcXVldWUpOiAlZFxuIiwKKwkJCSAgICB0eF9zdGF0dXMuYi5ucHR4ZnNwY2F2YWlsKTsKKyNlbmRpZgorCQlpZiAobW9yZV90b19kbyB8fCBub19xdWV1ZV9zcGFjZSB8fCBub19maWZvX3NwYWNlKSB7CisJCQkvKgorCQkJICogTWF5IG5lZWQgdG8gcXVldWUgbW9yZSB0cmFuc2FjdGlvbnMgYXMgdGhlIHJlcXVlc3QKKwkJCSAqIHF1ZXVlIG9yIFR4IEZJRk8gZW1wdGllcy4gRW5hYmxlIHRoZSBub24tcGVyaW9kaWMKKwkJCSAqIFR4IEZJRk8gZW1wdHkgaW50ZXJydXB0LiAoQWx3YXlzIHVzZSB0aGUgaGFsZi1lbXB0eQorCQkJICogbGV2ZWwgdG8gZW5zdXJlIHRoYXQgbmV3IHJlcXVlc3RzIGFyZSBsb2FkZWQgYXMKKwkJCSAqIHNvb24gYXMgcG9zc2libGUuKQorCQkJICovCisJCQlEV0NfTU9ESUZZX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludG1zaywgMCwKKwkJCQkJIGludHJfbWFzay5kMzIpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIERpc2FibGUgdGhlIFR4IEZJRk8gZW1wdHkgaW50ZXJydXB0IHNpbmNlIHRoZXJlIGFyZQorCQkJICogbm8gbW9yZSB0cmFuc2FjdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHF1ZXVlZCByaWdodAorCQkJICogbm93LiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGludGVycnVwdAorCQkJICogaGFuZGxlcnMgdG8gcXVldWUgbW9yZSB0cmFuc2FjdGlvbnMgYXMgdHJhbnNmZXIKKwkJCSAqIHN0YXRlcyBjaGFuZ2UuCisJCQkgKi8KKwkJCURXQ19NT0RJRllfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCBpbnRyX21hc2suZDMyLAorCQkJCQkgMCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGN1cnJlbnRseSBhY3RpdmUgaG9zdCBjaGFubmVscyBhbmQgcXVldWVzCisgKiB0cmFuc2FjdGlvbnMgZm9yIHRoZXNlIGNoYW5uZWxzIHRvIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIuIEl0IGlzIGNhbGxlZAorICogZnJvbSBIQ0QgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb25zLgorICoKKyAqIEBwYXJhbSBoY2QgVGhlIEhDRCBzdGF0ZSBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gdHJfdHlwZSBUaGUgdHlwZShzKSBvZiB0cmFuc2FjdGlvbnMgdG8gcXVldWUgKG5vbi1wZXJpb2RpYywKKyAqIHBlcmlvZGljLCBvciBib3RoKS4KKyAqLwordm9pZCBkd2Nfb3RnX2hjZF9xdWV1ZV90cmFuc2FjdGlvbnMoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkgICAgZHdjX290Z190cmFuc2FjdGlvbl90eXBlX2UgdHJfdHlwZSkKK3sKKyNpZmRlZiBERUJVR19TT0YKKwlEV0NfREVCVUdQTChEQkdfSENELCAiUXVldWUgVHJhbnNhY3Rpb25zXG4iKTsKKyNlbmRpZgorCS8qIFByb2Nlc3MgaG9zdCBjaGFubmVscyBhc3NvY2lhdGVkIHdpdGggcGVyaW9kaWMgdHJhbnNmZXJzLiAqLworCWlmICgodHJfdHlwZSA9PSBEV0NfT1RHX1RSQU5TQUNUSU9OX1BFUklPRElDIHx8CisJICAgICB0cl90eXBlID09IERXQ19PVEdfVFJBTlNBQ1RJT05fQUxMKSAmJgorCSAgICAhRFdDX0xJU1RfRU1QVFkoJmhjZC0+cGVyaW9kaWNfc2NoZWRfYXNzaWduZWQpKSB7CisKKwkJcHJvY2Vzc19wZXJpb2RpY19jaGFubmVscyhoY2QpOworCX0KKworCS8qIFByb2Nlc3MgaG9zdCBjaGFubmVscyBhc3NvY2lhdGVkIHdpdGggbm9uLXBlcmlvZGljIHRyYW5zZmVycy4gKi8KKwlpZiAodHJfdHlwZSA9PSBEV0NfT1RHX1RSQU5TQUNUSU9OX05PTl9QRVJJT0RJQyB8fAorCSAgICB0cl90eXBlID09IERXQ19PVEdfVFJBTlNBQ1RJT05fQUxMKSB7CisJCWlmICghRFdDX0xJU1RfRU1QVFkoJmhjZC0+bm9uX3BlcmlvZGljX3NjaGVkX2FjdGl2ZSkpIHsKKwkJCXByb2Nlc3Nfbm9uX3BlcmlvZGljX2NoYW5uZWxzKGhjZCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRW5zdXJlIE5QIFR4IEZJRk8gZW1wdHkgaW50ZXJydXB0IGlzIGRpc2FibGVkIHdoZW4KKwkJCSAqIHRoZXJlIGFyZSBubyBub24tcGVyaW9kaWMgdHJhbnNmZXJzIHRvIHByb2Nlc3MuCisJCQkgKi8KKwkJCWdpbnRtc2tfZGF0YV90IGdpbnRtc2sgPSB7LmQzMiA9IDAgfTsKKwkJCWdpbnRtc2suYi5ucHR4ZmVtcHR5ID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmhjZC0+Y29yZV9pZi0+CisJCQkJCSBjb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLCBnaW50bXNrLmQzMiwKKwkJCQkJIDApOworCQl9CisJfQorfQorCisjaWZkZWYgRFdDX0hTX0VMRUNUX1RTVAorLyoKKyAqIFF1aWNrIGFuZCBkaXJ0eSBoYWNrIHRvIGltcGxlbWVudCB0aGUgSFMgRWxlY3RyaWNhbCBUZXN0CisgKiBTSU5HTEVfU1RFUF9HRVRfREVWSUNFX0RFU0NSSVBUT1IgZmVhdHVyZS4KKyAqCisgKiBUaGlzIGNvZGUgd2FzIGNvcGllZCBmcm9tIG91ciB1c2Vyc3BhY2UgYXBwICJoc2V0Ii4gSXQgc2VuZHMgYQorICogR2V0IERldmljZSBEZXNjcmlwdG9yIGNvbnRyb2wgc2VxdWVuY2UgaW4gdHdvIHBhcnRzLCBmaXJzdCB0aGUKKyAqIFNldHVwIHBhY2tldCBieSBpdHNlbGYsIGZvbGxvd2VkIHNvbWUgdGltZSBsYXRlciBieSB0aGUgSW4gYW5kCisgKiBBY2sgcGFja2V0cy4gUmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGFkZCB0aGlzCisgKiBmdW5jdGlvbmFsaXR5IHRvIHRoZSBub3JtYWwgZHJpdmVyIGNvZGUsIHdlIGp1c3QgaGlqYWNrIHRoZQorICogaGFyZHdhcmUsIHVzaW5nIHRoZXNlIHR3byBmdW5jdGlvbiB0byBkcml2ZSB0aGUgaGFyZHdhcmUKKyAqIGRpcmVjdGx5LgorICovCisKK3N0YXRpYyBkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqZ2xvYmFsX3JlZ3M7CitzdGF0aWMgZHdjX290Z19ob3N0X2dsb2JhbF9yZWdzX3QgKmhjX2dsb2JhbF9yZWdzOworc3RhdGljIGR3Y19vdGdfaGNfcmVnc190ICpoY19yZWdzOworc3RhdGljIHVpbnQzMl90ICpkYXRhX2ZpZm87CisKK3N0YXRpYyB2b2lkIGRvX3NldHVwKHZvaWQpCit7CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKwloY3RzaXpfZGF0YV90IGhjdHNpejsKKwloY2NoYXJfZGF0YV90IGhjY2hhcjsKKwloYWludF9kYXRhX3QgaGFpbnQ7CisJaGNpbnRfZGF0YV90IGhjaW50OworCisJLyogRW5hYmxlIEhBSU5UcyAqLworCURXQ19XUklURV9SRUczMigmaGNfZ2xvYmFsX3JlZ3MtPmhhaW50bXNrLCAweDAwMDEpOworCisJLyogRW5hYmxlIEhDSU5UcyAqLworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNpbnRtc2ssIDB4MDRhMyk7CisKKwkvKiBSZWFkIEdJTlRTVFMgKi8KKwlnaW50c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cyk7CisKKwkvKiBSZWFkIEhBSU5UICovCisJaGFpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX2dsb2JhbF9yZWdzLT5oYWludCk7CisKKwkvKiBSZWFkIEhDSU5UICovCisJaGNpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjaW50KTsKKworCS8qIFJlYWQgSENDSEFSICovCisJaGNjaGFyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIpOworCisJLyogQ2xlYXIgSENJTlQgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjaW50LCBoY2ludC5kMzIpOworCisJLyogQ2xlYXIgSEFJTlQgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmhjX2dsb2JhbF9yZWdzLT5oYWludCwgaGFpbnQuZDMyKTsKKworCS8qIENsZWFyIEdJTlRTVFMgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzLCBnaW50c3RzLmQzMik7CisKKwkvKiBSZWFkIEdJTlRTVFMgKi8KKwlnaW50c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cyk7CisKKwkvKgorCSAqIFNlbmQgU2V0dXAgcGFja2V0IChHZXQgRGV2aWNlIERlc2NyaXB0b3IpCisJICovCisKKwkvKiBNYWtlIHN1cmUgY2hhbm5lbCBpcyBkaXNhYmxlZCAqLworCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwlpZiAoaGNjaGFyLmIuY2hlbikgeworCQloY2NoYXIuYi5jaGRpcyA9IDE7CisvLyAgICAgICAgICAgICAgaGNjaGFyLmIuY2hlbiA9IDE7CisJCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNjaGFyLCBoY2NoYXIuZDMyKTsKKwkJLy9zbGVlcCgxKTsKKwkJZHdjX21kZWxheSgxMDAwKTsKKworCQkvKiBSZWFkIEdJTlRTVFMgKi8KKwkJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCisJCS8qIFJlYWQgSEFJTlQgKi8KKwkJaGFpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX2dsb2JhbF9yZWdzLT5oYWludCk7CisKKwkJLyogUmVhZCBIQ0lOVCAqLworCQloY2ludC5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNpbnQpOworCisJCS8qIFJlYWQgSENDSEFSICovCisJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKworCQkvKiBDbGVhciBIQ0lOVCAqLworCQlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjaW50LCBoY2ludC5kMzIpOworCisJCS8qIENsZWFyIEhBSU5UICovCisJCURXQ19XUklURV9SRUczMigmaGNfZ2xvYmFsX3JlZ3MtPmhhaW50LCBoYWludC5kMzIpOworCisJCS8qIENsZWFyIEdJTlRTVFMgKi8KKwkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCisJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwl9CisKKwkvKiBTZXQgSENUU0laICovCisJaGN0c2l6LmQzMiA9IDA7CisJaGN0c2l6LmIueGZlcnNpemUgPSA4OworCWhjdHNpei5iLnBrdGNudCA9IDE7CisJaGN0c2l6LmIucGlkID0gRFdDX09UR19IQ19QSURfU0VUVVA7CisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY3RzaXosIGhjdHNpei5kMzIpOworCisJLyogU2V0IEhDQ0hBUiAqLworCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwloY2NoYXIuYi5lcHR5cGUgPSBEV0NfT1RHX0VQX1RZUEVfQ09OVFJPTDsKKwloY2NoYXIuYi5lcGRpciA9IDA7CisJaGNjaGFyLmIuZXBudW0gPSAwOworCWhjY2hhci5iLm1wcyA9IDg7CisJaGNjaGFyLmIuY2hlbiA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIsIGhjY2hhci5kMzIpOworCisJLyogRmlsbCBGSUZPIHdpdGggU2V0dXAgZGF0YSBmb3IgR2V0IERldmljZSBEZXNjcmlwdG9yICovCisJZGF0YV9maWZvID0gKHVpbnQzMl90ICopICgoY2hhciAqKWdsb2JhbF9yZWdzICsgMHgxMDAwKTsKKwlEV0NfV1JJVEVfUkVHMzIoZGF0YV9maWZvKyssIDB4MDEwMDA2ODApOworCURXQ19XUklURV9SRUczMihkYXRhX2ZpZm8rKywgMHgwMDA4MDAwMCk7CisKKwlnaW50c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cyk7CisKKwkvKiBXYWl0IGZvciBob3N0IGNoYW5uZWwgaW50ZXJydXB0ICovCisJZG8geworCQlnaW50c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cyk7CisJfSB3aGlsZSAoZ2ludHN0cy5iLmhjaW50ciA9PSAwKTsKKworCS8qIERpc2FibGUgSENJTlRzICovCisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2ludG1zaywgMHgwMDAwKTsKKworCS8qIERpc2FibGUgSEFJTlRzICovCisJRFdDX1dSSVRFX1JFRzMyKCZoY19nbG9iYWxfcmVncy0+aGFpbnRtc2ssIDB4MDAwMCk7CisKKwkvKiBSZWFkIEhBSU5UICovCisJaGFpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX2dsb2JhbF9yZWdzLT5oYWludCk7CisKKwkvKiBSZWFkIEhDSU5UICovCisJaGNpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjaW50KTsKKworCS8qIFJlYWQgSENDSEFSICovCisJaGNjaGFyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIpOworCisJLyogQ2xlYXIgSENJTlQgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjaW50LCBoY2ludC5kMzIpOworCisJLyogQ2xlYXIgSEFJTlQgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmhjX2dsb2JhbF9yZWdzLT5oYWludCwgaGFpbnQuZDMyKTsKKworCS8qIENsZWFyIEdJTlRTVFMgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzLCBnaW50c3RzLmQzMik7CisKKwkvKiBSZWFkIEdJTlRTVFMgKi8KKwlnaW50c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2luX2Fjayh2b2lkKQoreworCWdpbnRzdHNfZGF0YV90IGdpbnRzdHM7CisJaGN0c2l6X2RhdGFfdCBoY3RzaXo7CisJaGNjaGFyX2RhdGFfdCBoY2NoYXI7CisJaGFpbnRfZGF0YV90IGhhaW50OworCWhjaW50X2RhdGFfdCBoY2ludDsKKwlob3N0X2dyeHN0c19kYXRhX3QgZ3J4c3RzOworCisJLyogRW5hYmxlIEhBSU5UcyAqLworCURXQ19XUklURV9SRUczMigmaGNfZ2xvYmFsX3JlZ3MtPmhhaW50bXNrLCAweDAwMDEpOworCisJLyogRW5hYmxlIEhDSU5UcyAqLworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNpbnRtc2ssIDB4MDRhMyk7CisKKwkvKiBSZWFkIEdJTlRTVFMgKi8KKwlnaW50c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cyk7CisKKwkvKiBSZWFkIEhBSU5UICovCisJaGFpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX2dsb2JhbF9yZWdzLT5oYWludCk7CisKKwkvKiBSZWFkIEhDSU5UICovCisJaGNpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjaW50KTsKKworCS8qIFJlYWQgSENDSEFSICovCisJaGNjaGFyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIpOworCisJLyogQ2xlYXIgSENJTlQgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjaW50LCBoY2ludC5kMzIpOworCisJLyogQ2xlYXIgSEFJTlQgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmhjX2dsb2JhbF9yZWdzLT5oYWludCwgaGFpbnQuZDMyKTsKKworCS8qIENsZWFyIEdJTlRTVFMgKi8KKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzLCBnaW50c3RzLmQzMik7CisKKwkvKiBSZWFkIEdJTlRTVFMgKi8KKwlnaW50c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cyk7CisKKwkvKgorCSAqIFJlY2VpdmUgQ29udHJvbCBJbiBwYWNrZXQKKwkgKi8KKworCS8qIE1ha2Ugc3VyZSBjaGFubmVsIGlzIGRpc2FibGVkICovCisJaGNjaGFyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIpOworCWlmIChoY2NoYXIuYi5jaGVuKSB7CisJCWhjY2hhci5iLmNoZGlzID0gMTsKKwkJaGNjaGFyLmIuY2hlbiA9IDE7CisJCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNjaGFyLCBoY2NoYXIuZDMyKTsKKwkJLy9zbGVlcCgxKTsKKwkJZHdjX21kZWxheSgxMDAwKTsKKworCQkvKiBSZWFkIEdJTlRTVFMgKi8KKwkJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCisJCS8qIFJlYWQgSEFJTlQgKi8KKwkJaGFpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX2dsb2JhbF9yZWdzLT5oYWludCk7CisKKwkJLyogUmVhZCBIQ0lOVCAqLworCQloY2ludC5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNpbnQpOworCisJCS8qIFJlYWQgSENDSEFSICovCisJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKworCQkvKiBDbGVhciBIQ0lOVCAqLworCQlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjaW50LCBoY2ludC5kMzIpOworCisJCS8qIENsZWFyIEhBSU5UICovCisJCURXQ19XUklURV9SRUczMigmaGNfZ2xvYmFsX3JlZ3MtPmhhaW50LCBoYWludC5kMzIpOworCisJCS8qIENsZWFyIEdJTlRTVFMgKi8KKwkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCisJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwl9CisKKwkvKiBTZXQgSENUU0laICovCisJaGN0c2l6LmQzMiA9IDA7CisJaGN0c2l6LmIueGZlcnNpemUgPSA4OworCWhjdHNpei5iLnBrdGNudCA9IDE7CisJaGN0c2l6LmIucGlkID0gRFdDX09UR19IQ19QSURfREFUQTE7CisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY3RzaXosIGhjdHNpei5kMzIpOworCisJLyogU2V0IEhDQ0hBUiAqLworCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwloY2NoYXIuYi5lcHR5cGUgPSBEV0NfT1RHX0VQX1RZUEVfQ09OVFJPTDsKKwloY2NoYXIuYi5lcGRpciA9IDE7CisJaGNjaGFyLmIuZXBudW0gPSAwOworCWhjY2hhci5iLm1wcyA9IDg7CisJaGNjaGFyLmIuY2hlbiA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIsIGhjY2hhci5kMzIpOworCisJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCisJLyogV2FpdCBmb3IgcmVjZWl2ZSBzdGF0dXMgcXVldWUgaW50ZXJydXB0ICovCisJZG8geworCQlnaW50c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cyk7CisJfSB3aGlsZSAoZ2ludHN0cy5iLnJ4c3RzcWx2bCA9PSAwKTsKKworCS8qIFJlYWQgUlhTVFMgKi8KKwlncnhzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5ncnhzdHNwKTsKKworCS8qIENsZWFyIFJYU1RTUUxWTCBpbiBHSU5UU1RTICovCisJZ2ludHN0cy5kMzIgPSAwOworCWdpbnRzdHMuYi5yeHN0c3FsdmwgPSAxOworCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIGdpbnRzdHMuZDMyKTsKKworCXN3aXRjaCAoZ3J4c3RzLmIucGt0c3RzKSB7CisJY2FzZSBEV0NfR1JYU1RTX1BLVFNUU19JTjoKKwkJLyogUmVhZCB0aGUgZGF0YSBpbnRvIHRoZSBob3N0IGJ1ZmZlciAqLworCQlpZiAoZ3J4c3RzLmIuYmNudCA+IDApIHsKKwkJCWludCBpOworCQkJaW50IHdvcmRfY291bnQgPSAoZ3J4c3RzLmIuYmNudCArIDMpIC8gNDsKKworCQkJZGF0YV9maWZvID0gKHVpbnQzMl90ICopICgoY2hhciAqKWdsb2JhbF9yZWdzICsgMHgxMDAwKTsKKworCQkJZm9yIChpID0gMDsgaSA8IHdvcmRfY291bnQ7IGkrKykgeworCQkJCSh2b2lkKURXQ19SRUFEX1JFRzMyKGRhdGFfZmlmbysrKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWdpbnRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzKTsKKworCS8qIFdhaXQgZm9yIHJlY2VpdmUgc3RhdHVzIHF1ZXVlIGludGVycnVwdCAqLworCWRvIHsKKwkJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCX0gd2hpbGUgKGdpbnRzdHMuYi5yeHN0c3FsdmwgPT0gMCk7CisKKwkvKiBSZWFkIFJYU1RTICovCisJZ3J4c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3J4c3RzcCk7CisKKwkvKiBDbGVhciBSWFNUU1FMVkwgaW4gR0lOVFNUUyAqLworCWdpbnRzdHMuZDMyID0gMDsKKwlnaW50c3RzLmIucnhzdHNxbHZsID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzLCBnaW50c3RzLmQzMik7CisKKwlzd2l0Y2ggKGdyeHN0cy5iLnBrdHN0cykgeworCWNhc2UgRFdDX0dSWFNUU19QS1RTVFNfSU5fWEZFUl9DT01QOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWdpbnRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzKTsKKworCS8qIFdhaXQgZm9yIGhvc3QgY2hhbm5lbCBpbnRlcnJ1cHQgKi8KKwlkbyB7CisJCWdpbnRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzKTsKKwl9IHdoaWxlIChnaW50c3RzLmIuaGNpbnRyID09IDApOworCisJLyogUmVhZCBIQUlOVCAqLworCWhhaW50LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19nbG9iYWxfcmVncy0+aGFpbnQpOworCisJLyogUmVhZCBIQ0lOVCAqLworCWhjaW50LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2ludCk7CisKKwkvKiBSZWFkIEhDQ0hBUiAqLworCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKworCS8qIENsZWFyIEhDSU5UICovCisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2ludCwgaGNpbnQuZDMyKTsKKworCS8qIENsZWFyIEhBSU5UICovCisJRFdDX1dSSVRFX1JFRzMyKCZoY19nbG9iYWxfcmVncy0+aGFpbnQsIGhhaW50LmQzMik7CisKKwkvKiBDbGVhciBHSU5UU1RTICovCisJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCisJLyogUmVhZCBHSU5UU1RTICovCisJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCisvLyAgICAgIHVzbGVlcCgxMDAwMDApOworLy8gICAgICBtZGVsYXkoMTAwKTsKKwlkd2NfbWRlbGF5KDEpOworCisJLyoKKwkgKiBTZW5kIGhhbmRzaGFrZSBwYWNrZXQKKwkgKi8KKworCS8qIFJlYWQgSEFJTlQgKi8KKwloYWludC5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfZ2xvYmFsX3JlZ3MtPmhhaW50KTsKKworCS8qIFJlYWQgSENJTlQgKi8KKwloY2ludC5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNpbnQpOworCisJLyogUmVhZCBIQ0NIQVIgKi8KKwloY2NoYXIuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjY2hhcik7CisKKwkvKiBDbGVhciBIQ0lOVCAqLworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNpbnQsIGhjaW50LmQzMik7CisKKwkvKiBDbGVhciBIQUlOVCAqLworCURXQ19XUklURV9SRUczMigmaGNfZ2xvYmFsX3JlZ3MtPmhhaW50LCBoYWludC5kMzIpOworCisJLyogQ2xlYXIgR0lOVFNUUyAqLworCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIGdpbnRzdHMuZDMyKTsKKworCS8qIFJlYWQgR0lOVFNUUyAqLworCWdpbnRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzKTsKKworCS8qIE1ha2Ugc3VyZSBjaGFubmVsIGlzIGRpc2FibGVkICovCisJaGNjaGFyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIpOworCWlmIChoY2NoYXIuYi5jaGVuKSB7CisJCWhjY2hhci5iLmNoZGlzID0gMTsKKwkJaGNjaGFyLmIuY2hlbiA9IDE7CisJCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNjaGFyLCBoY2NoYXIuZDMyKTsKKwkJLy9zbGVlcCgxKTsKKwkJZHdjX21kZWxheSgxMDAwKTsKKworCQkvKiBSZWFkIEdJTlRTVFMgKi8KKwkJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCisJCS8qIFJlYWQgSEFJTlQgKi8KKwkJaGFpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX2dsb2JhbF9yZWdzLT5oYWludCk7CisKKwkJLyogUmVhZCBIQ0lOVCAqLworCQloY2ludC5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNpbnQpOworCisJCS8qIFJlYWQgSENDSEFSICovCisJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKworCQkvKiBDbGVhciBIQ0lOVCAqLworCQlEV0NfV1JJVEVfUkVHMzIoJmhjX3JlZ3MtPmhjaW50LCBoY2ludC5kMzIpOworCisJCS8qIENsZWFyIEhBSU5UICovCisJCURXQ19XUklURV9SRUczMigmaGNfZ2xvYmFsX3JlZ3MtPmhhaW50LCBoYWludC5kMzIpOworCisJCS8qIENsZWFyIEdJTlRTVFMgKi8KKwkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCisJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwl9CisKKwkvKiBTZXQgSENUU0laICovCisJaGN0c2l6LmQzMiA9IDA7CisJaGN0c2l6LmIueGZlcnNpemUgPSAwOworCWhjdHNpei5iLnBrdGNudCA9IDE7CisJaGN0c2l6LmIucGlkID0gRFdDX09UR19IQ19QSURfREFUQTE7CisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY3RzaXosIGhjdHNpei5kMzIpOworCisJLyogU2V0IEhDQ0hBUiAqLworCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwloY2NoYXIuYi5lcHR5cGUgPSBEV0NfT1RHX0VQX1RZUEVfQ09OVFJPTDsKKwloY2NoYXIuYi5lcGRpciA9IDA7CisJaGNjaGFyLmIuZXBudW0gPSAwOworCWhjY2hhci5iLm1wcyA9IDg7CisJaGNjaGFyLmIuY2hlbiA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2NoYXIsIGhjY2hhci5kMzIpOworCisJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCisJLyogV2FpdCBmb3IgaG9zdCBjaGFubmVsIGludGVycnVwdCAqLworCWRvIHsKKwkJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCX0gd2hpbGUgKGdpbnRzdHMuYi5oY2ludHIgPT0gMCk7CisKKwkvKiBEaXNhYmxlIEhDSU5UcyAqLworCURXQ19XUklURV9SRUczMigmaGNfcmVncy0+aGNpbnRtc2ssIDB4MDAwMCk7CisKKwkvKiBEaXNhYmxlIEhBSU5UcyAqLworCURXQ19XUklURV9SRUczMigmaGNfZ2xvYmFsX3JlZ3MtPmhhaW50bXNrLCAweDAwMDApOworCisJLyogUmVhZCBIQUlOVCAqLworCWhhaW50LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19nbG9iYWxfcmVncy0+aGFpbnQpOworCisJLyogUmVhZCBIQ0lOVCAqLworCWhjaW50LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2ludCk7CisKKwkvKiBSZWFkIEhDQ0hBUiAqLworCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKworCS8qIENsZWFyIEhDSU5UICovCisJRFdDX1dSSVRFX1JFRzMyKCZoY19yZWdzLT5oY2ludCwgaGNpbnQuZDMyKTsKKworCS8qIENsZWFyIEhBSU5UICovCisJRFdDX1dSSVRFX1JFRzMyKCZoY19nbG9iYWxfcmVncy0+aGFpbnQsIGhhaW50LmQzMik7CisKKwkvKiBDbGVhciBHSU5UU1RTICovCisJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cywgZ2ludHN0cy5kMzIpOworCisJLyogUmVhZCBHSU5UU1RTICovCisJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworfQorI2VuZGlmCisKKy8qKiBIYW5kbGVzIGh1YiBjbGFzcy1zcGVjaWZpYyByZXF1ZXN0cy4gKi8KK2ludCBkd2Nfb3RnX2hjZF9odWJfY29udHJvbChkd2Nfb3RnX2hjZF90ICogZHdjX290Z19oY2QsCisJCQkgICAgdWludDE2X3QgdHlwZVJlcSwKKwkJCSAgICB1aW50MTZfdCB3VmFsdWUsCisJCQkgICAgdWludDE2X3Qgd0luZGV4LCB1aW50OF90ICogYnVmLCB1aW50MTZfdCB3TGVuZ3RoKQoreworCWludCByZXR2YWwgPSAwOworCisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBkd2Nfb3RnX2hjZC0+Y29yZV9pZjsKKwl1c2JfaHViX2Rlc2NyaXB0b3JfdCAqaHViX2Rlc2M7CisJaHBydDBfZGF0YV90IGhwcnQwID0gey5kMzIgPSAwIH07CisKKwl1aW50MzJfdCBwb3J0X3N0YXR1czsKKworCXN3aXRjaCAodHlwZVJlcSkgeworCWNhc2UgVUNSX0NMRUFSX0hVQl9GRUFUVVJFOgorCQlEV0NfREVCVUdQTChEQkdfSENELCAiRFdDIE9URyBIQ0QgSFVCIENPTlRST0wgLSAiCisJCQkgICAgIkNsZWFySHViRmVhdHVyZSAweCV4XG4iLCB3VmFsdWUpOworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFVIRl9DX0hVQl9MT0NBTF9QT1dFUjoKKwkJY2FzZSBVSEZfQ19IVUJfT1ZFUl9DVVJSRU5UOgorCQkJLyogTm90aGluZyByZXF1aXJlZCBoZXJlICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQkJRFdDX0VSUk9SKCJEV0MgT1RHIEhDRCAtICIKKwkJCQkgICJDbGVhckh1YkZlYXR1cmUgcmVxdWVzdCAleGggdW5rbm93blxuIiwKKwkJCQkgIHdWYWx1ZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVQ1JfQ0xFQVJfUE9SVF9GRUFUVVJFOgorI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwkJaWYgKHdWYWx1ZSAhPSBVSEZfUE9SVF9MMSkKKyNlbmRpZgorCQkJaWYgKCF3SW5kZXggfHwgd0luZGV4ID4gMSkKKwkJCQlnb3RvIGVycm9yOworCisJCXN3aXRjaCAod1ZhbHVlKSB7CisJCWNhc2UgVUhGX1BPUlRfRU5BQkxFOgorCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkRXQyBPVEcgSENEIEhVQiBDT05UUk9MIC0gIgorCQkJCSAgICAiQ2xlYXJQb3J0RmVhdHVyZSBVU0JfUE9SVF9GRUFUX0VOQUJMRVxuIik7CisJCQlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJCQlocHJ0MC5iLnBydGVuYSA9IDE7CisJCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisJCQlicmVhazsKKwkJY2FzZSBVSEZfUE9SVF9TVVNQRU5EOgorCQkJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkRXQyBPVEcgSENEIEhVQiBDT05UUk9MIC0gIgorCQkJCSAgICAiQ2xlYXJQb3J0RmVhdHVyZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkRcbiIpOworCisJCQlpZiAoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKSB7CisJCQkJZHdjX290Z19ob3N0X2hpYmVybmF0aW9uX3Jlc3RvcmUoY29yZV9pZiwgMCwgMCk7CisJCQl9IGVsc2UgeworCQkJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCAwKTsKKwkJCQlkd2NfbWRlbGF5KDUpOworCisJCQkJaHBydDAuZDMyID0gZHdjX290Z19yZWFkX2hwcnQwKGNvcmVfaWYpOworCQkJCWhwcnQwLmIucHJ0cmVzID0gMTsKKwkJCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisJCQkJaHBydDAuYi5wcnRzdXNwID0gMDsKKwkJCQkvKiBDbGVhciBSZXN1bWUgYml0ICovCisJCQkJZHdjX21kZWxheSgxMDApOworCQkJCWhwcnQwLmIucHJ0cmVzID0gMDsKKwkJCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCisJCWNhc2UgVUhGX1BPUlRfTDE6CisJCQl7CisJCQkJcGNnY2N0bF9kYXRhX3QgcGNnY2N0bCA9IHsuZDMyID0gMCB9OworCQkJCWdscG1jZmdfZGF0YV90IGxwbWNmZyA9IHsuZDMyID0gMCB9OworCisJCQkJbHBtY2ZnLmQzMiA9CisJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCSAgIGNvcmVfZ2xvYmFsX3JlZ3MtPmdscG1jZmcpOworCQkJCWxwbWNmZy5iLmVuX3V0bWlfc2xlZXAgPSAwOworCQkJCWxwbWNmZy5iLmhpcmRfdGhyZXMgJj0gKH4oMSA8PCA0KSk7CisJCQkJbHBtY2ZnLmIucHJ0X3NsZWVwX3N0cyA9IDE7CisJCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCWNvcmVfZ2xvYmFsX3JlZ3MtPmdscG1jZmcsCisJCQkJCQlscG1jZmcuZDMyKTsKKworCQkJCS8qIENsZWFyIEVuYmxfTDFHYXRpbmcgYml0LiAqLworCQkJCXBjZ2NjdGwuYi5lbmJsX3NsZWVwX2dhdGluZyA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCBwY2djY3RsLmQzMiwKKwkJCQkJCSAwKTsKKworCQkJCWR3Y19tZGVsYXkoNSk7CisKKwkJCQlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJCQkJaHBydDAuYi5wcnRyZXMgPSAxOworCQkJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwKKwkJCQkJCWhwcnQwLmQzMik7CisJCQkJLyogVGhpcyBiaXQgd2lsbCBiZSBjbGVhcmVkIGluIHdha2V1cCBpbnRlcnJ1cHQgaGFuZGxlICovCisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkJY2FzZSBVSEZfUE9SVF9QT1dFUjoKKwkJCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBIVUIgQ09OVFJPTCAtICIKKwkJCQkgICAgIkNsZWFyUG9ydEZlYXR1cmUgVVNCX1BPUlRfRkVBVF9QT1dFUlxuIik7CisJCQlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJCQlocHJ0MC5iLnBydHB3ciA9IDA7CisJCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisJCQlicmVhazsKKwkJY2FzZSBVSEZfUE9SVF9JTkRJQ0FUT1I6CisJCQlEV0NfREVCVUdQTChEQkdfSENELCAiRFdDIE9URyBIQ0QgSFVCIENPTlRST0wgLSAiCisJCQkJICAgICJDbGVhclBvcnRGZWF0dXJlIFVTQl9QT1JUX0ZFQVRfSU5ESUNBVE9SXG4iKTsKKwkJCS8qIFBvcnQgaW5pZGljYXRvciBub3Qgc3VwcG9ydGVkICovCisJCQlicmVhazsKKwkJY2FzZSBVSEZfQ19QT1JUX0NPTk5FQ1RJT046CisJCQkvKiBDbGVhcnMgZHJpdmVycyBpbnRlcm5hbCBjb25uZWN0IHN0YXR1cyBjaGFuZ2UKKwkJCSAqIGZsYWcgKi8KKwkJCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBIVUIgQ09OVFJPTCAtICIKKwkJCQkgICAgIkNsZWFyUG9ydEZlYXR1cmUgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT05cbiIpOworCQkJZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9jb25uZWN0X3N0YXR1c19jaGFuZ2UgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgVUhGX0NfUE9SVF9SRVNFVDoKKwkJCS8qIENsZWFycyB0aGUgZHJpdmVyJ3MgaW50ZXJuYWwgUG9ydCBSZXNldCBDaGFuZ2UKKwkJCSAqIGZsYWcgKi8KKwkJCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBIVUIgQ09OVFJPTCAtICIKKwkJCQkgICAgIkNsZWFyUG9ydEZlYXR1cmUgVVNCX1BPUlRfRkVBVF9DX1JFU0VUXG4iKTsKKwkJCWR3Y19vdGdfaGNkLT5mbGFncy5iLnBvcnRfcmVzZXRfY2hhbmdlID0gMDsKKwkJCWJyZWFrOworCQljYXNlIFVIRl9DX1BPUlRfRU5BQkxFOgorCQkJLyogQ2xlYXJzIHRoZSBkcml2ZXIncyBpbnRlcm5hbCBQb3J0CisJCQkgKiBFbmFibGUvRGlzYWJsZSBDaGFuZ2UgZmxhZyAqLworCQkJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkRXQyBPVEcgSENEIEhVQiBDT05UUk9MIC0gIgorCQkJCSAgICAiQ2xlYXJQb3J0RmVhdHVyZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFXG4iKTsKKwkJCWR3Y19vdGdfaGNkLT5mbGFncy5iLnBvcnRfZW5hYmxlX2NoYW5nZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBVSEZfQ19QT1JUX1NVU1BFTkQ6CisJCQkvKiBDbGVhcnMgdGhlIGRyaXZlcidzIGludGVybmFsIFBvcnQgU3VzcGVuZAorCQkJICogQ2hhbmdlIGZsYWcsIHdoaWNoIGlzIHNldCB3aGVuIHJlc3VtZSBzaWduYWxpbmcgb24KKwkJCSAqIHRoZSBob3N0IHBvcnQgaXMgY29tcGxldGUgKi8KKwkJCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBIVUIgQ09OVFJPTCAtICIKKwkJCQkgICAgIkNsZWFyUG9ydEZlYXR1cmUgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkRcbiIpOworCQkJZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9zdXNwZW5kX2NoYW5nZSA9IDA7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCisJCWNhc2UgVUhGX0NfUE9SVF9MMToKKwkJCWR3Y19vdGdfaGNkLT5mbGFncy5iLnBvcnRfbDFfY2hhbmdlID0gMDsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgVUhGX0NfUE9SVF9PVkVSX0NVUlJFTlQ6CisJCQlEV0NfREVCVUdQTChEQkdfSENELCAiRFdDIE9URyBIQ0QgSFVCIENPTlRST0wgLSAiCisJCQkJICAgICJDbGVhclBvcnRGZWF0dXJlIFVTQl9QT1JUX0ZFQVRfQ19PVkVSX0NVUlJFTlRcbiIpOworCQkJZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9vdmVyX2N1cnJlbnRfY2hhbmdlID0gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJCQlEV0NfRVJST1IoIkRXQyBPVEcgSENEIC0gIgorCQkJCSAgIkNsZWFyUG9ydEZlYXR1cmUgcmVxdWVzdCAleGggIgorCQkJCSAgInVua25vd24gb3IgdW5zdXBwb3J0ZWRcbiIsIHdWYWx1ZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVQ1JfR0VUX0hVQl9ERVNDUklQVE9SOgorCQlEV0NfREVCVUdQTChEQkdfSENELCAiRFdDIE9URyBIQ0QgSFVCIENPTlRST0wgLSAiCisJCQkgICAgIkdldEh1YkRlc2NyaXB0b3JcbiIpOworCQlodWJfZGVzYyA9ICh1c2JfaHViX2Rlc2NyaXB0b3JfdCAqKSBidWY7CisJCWh1Yl9kZXNjLT5iRGVzY0xlbmd0aCA9IDk7CisJCWh1Yl9kZXNjLT5iRGVzY3JpcHRvclR5cGUgPSAweDI5OworCQlodWJfZGVzYy0+Yk5iclBvcnRzID0gMTsKKwkJVVNFVFcoaHViX2Rlc2MtPndIdWJDaGFyYWN0ZXJpc3RpY3MsIDB4MDgpOworCQlodWJfZGVzYy0+YlB3ck9uMlB3ckdvb2QgPSAxOworCQlodWJfZGVzYy0+Ykh1YkNvbnRyQ3VycmVudCA9IDA7CisJCWh1Yl9kZXNjLT5EZXZpY2VSZW1vdmFibGVbMF0gPSAwOworCQlodWJfZGVzYy0+RGV2aWNlUmVtb3ZhYmxlWzFdID0gMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBVQ1JfR0VUX0hVQl9TVEFUVVM6CisJCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBIVUIgQ09OVFJPTCAtICIKKwkJCSAgICAiR2V0SHViU3RhdHVzXG4iKTsKKwkJRFdDX01FTVNFVChidWYsIDAsIDQpOworCQlicmVhazsKKwljYXNlIFVDUl9HRVRfUE9SVF9TVEFUVVM6CisJCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBIVUIgQ09OVFJPTCAtICIKKwkJCSAgICAiR2V0UG9ydFN0YXR1cyB3SW5kZXggPSAweCUwNHggRkxBR1M9MHglMDh4XG4iLAorCQkJICAgIHdJbmRleCwgZHdjX290Z19oY2QtPmZsYWdzLmQzMik7CisJCWlmICghd0luZGV4IHx8IHdJbmRleCA+IDEpCisJCQlnb3RvIGVycm9yOworCisJCXBvcnRfc3RhdHVzID0gMDsKKworCQlpZiAoZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9jb25uZWN0X3N0YXR1c19jaGFuZ2UpCisJCQlwb3J0X3N0YXR1cyB8PSAoMSA8PCBVSEZfQ19QT1JUX0NPTk5FQ1RJT04pOworCisJCWlmIChkd2Nfb3RnX2hjZC0+ZmxhZ3MuYi5wb3J0X2VuYWJsZV9jaGFuZ2UpCisJCQlwb3J0X3N0YXR1cyB8PSAoMSA8PCBVSEZfQ19QT1JUX0VOQUJMRSk7CisKKwkJaWYgKGR3Y19vdGdfaGNkLT5mbGFncy5iLnBvcnRfc3VzcGVuZF9jaGFuZ2UpCisJCQlwb3J0X3N0YXR1cyB8PSAoMSA8PCBVSEZfQ19QT1JUX1NVU1BFTkQpOworCisJCWlmIChkd2Nfb3RnX2hjZC0+ZmxhZ3MuYi5wb3J0X2wxX2NoYW5nZSkKKwkJCXBvcnRfc3RhdHVzIHw9ICgxIDw8IFVIRl9DX1BPUlRfTDEpOworCisJCWlmIChkd2Nfb3RnX2hjZC0+ZmxhZ3MuYi5wb3J0X3Jlc2V0X2NoYW5nZSkgeworCQkJcG9ydF9zdGF0dXMgfD0gKDEgPDwgVUhGX0NfUE9SVF9SRVNFVCk7CisJCX0KKworCQlpZiAoZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9vdmVyX2N1cnJlbnRfY2hhbmdlKSB7CisJCQlEV0NfV0FSTigiT3ZlcmN1cnJlbnQgY2hhbmdlIGRldGVjdGVkXG4iKTsKKwkJCXBvcnRfc3RhdHVzIHw9ICgxIDw8IFVIRl9DX1BPUlRfT1ZFUl9DVVJSRU5UKTsKKwkJfQorCisJCWlmICghZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9jb25uZWN0X3N0YXR1cykgeworCQkJLyoKKwkJCSAqIFRoZSBwb3J0IGlzIGRpc2Nvbm5lY3RlZCwgd2hpY2ggbWVhbnMgdGhlIGNvcmUgaXMKKwkJCSAqIGVpdGhlciBpbiBkZXZpY2UgbW9kZSBvciBpdCBzb29uIHdpbGwgYmUuIEp1c3QKKwkJCSAqIHJldHVybiAwJ3MgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHBvcnQgc3RhdHVzCisJCQkgKiBzaW5jZSB0aGUgcG9ydCByZWdpc3RlciBjYW4ndCBiZSByZWFkIGlmIHRoZSBjb3JlCisJCQkgKiBpcyBpbiBkZXZpY2UgbW9kZS4KKwkJCSAqLworCQkJKigoX19sZTMyICopIGJ1ZikgPSBkd2NfY3B1X3RvX2xlMzIoJnBvcnRfc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaHBydDAuZDMyID0gRFdDX1JFQURfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDApOworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgSFBSVDA6IDB4JTA4eFxuIiwgaHBydDAuZDMyKTsKKworCQlpZiAoaHBydDAuYi5wcnRjb25uc3RzKQorCQkJcG9ydF9zdGF0dXMgfD0gKDEgPDwgVUhGX1BPUlRfQ09OTkVDVElPTik7CisKKwkJaWYgKGhwcnQwLmIucHJ0ZW5hKQorCQkJcG9ydF9zdGF0dXMgfD0gKDEgPDwgVUhGX1BPUlRfRU5BQkxFKTsKKworCQlpZiAoaHBydDAuYi5wcnRzdXNwKQorCQkJcG9ydF9zdGF0dXMgfD0gKDEgPDwgVUhGX1BPUlRfU1VTUEVORCk7CisKKwkJaWYgKGhwcnQwLmIucHJ0b3ZyY3VycmFjdCkKKwkJCXBvcnRfc3RhdHVzIHw9ICgxIDw8IFVIRl9QT1JUX09WRVJfQ1VSUkVOVCk7CisKKwkJaWYgKGhwcnQwLmIucHJ0cnN0KQorCQkJcG9ydF9zdGF0dXMgfD0gKDEgPDwgVUhGX1BPUlRfUkVTRVQpOworCisJCWlmIChocHJ0MC5iLnBydHB3cikKKwkJCXBvcnRfc3RhdHVzIHw9ICgxIDw8IFVIRl9QT1JUX1BPV0VSKTsKKworCQlpZiAoaHBydDAuYi5wcnRzcGQgPT0gRFdDX0hQUlQwX1BSVFNQRF9ISUdIX1NQRUVEKQorCQkJcG9ydF9zdGF0dXMgfD0gKDEgPDwgVUhGX1BPUlRfSElHSF9TUEVFRCk7CisJCWVsc2UgaWYgKGhwcnQwLmIucHJ0c3BkID09IERXQ19IUFJUMF9QUlRTUERfTE9XX1NQRUVEKQorCQkJcG9ydF9zdGF0dXMgfD0gKDEgPDwgVUhGX1BPUlRfTE9XX1NQRUVEKTsKKworCQlpZiAoaHBydDAuYi5wcnR0c3RjdGwpCisJCQlwb3J0X3N0YXR1cyB8PSAoMSA8PCBVSEZfUE9SVF9URVNUKTsKKwkJaWYgKGR3Y19vdGdfZ2V0X2xwbV9wb3J0c2xlZXBzdGF0dXMoZHdjX290Z19oY2QtPmNvcmVfaWYpKSB7CisJCQlwb3J0X3N0YXR1cyB8PSAoMSA8PCBVSEZfUE9SVF9MMSk7CisJCX0KKwkJLyoKKwkJICAgRm9yIFN5bm9wc3lzIEhXIGVtdWxhdGlvbiBvZiBQb3dlciBkb3duIHdrdXBfY29udHJvbCBhc3NlcnRzIHRoZSAKKwkJICAgaHJlc2V0X24gYW5kIHByc3RfbiBvbiBzdXNwbmVkLiBUaGlzIGNhdXNlcyB0aGUgSFBSVDAgdG8gYmUgemVyby4gCisJCSAgIFdlIGludGVudGlvbmFsbHkgdGVsbCB0aGUgc29mdHdhcmUgdGhhdCBwb3J0IGlzIGluIEwyU3VzcGVuZCBzdGF0ZS4gCisJCSAgIE9ubHkgZm9yIFNURS4KKwkJKi8KKwkJaWYgKChjb3JlX2lmLT5wb3dlcl9kb3duID09IDIpCisJCSAgICAmJiAoY29yZV9pZi0+aGliZXJuYXRpb25fc3VzcGVuZCA9PSAxKSkgeworCQkJcG9ydF9zdGF0dXMgfD0gKDEgPDwgVUhGX1BPUlRfU1VTUEVORCk7CisJCX0KKwkJLyogVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1IgdW5zdXBwb3J0ZWQgYWx3YXlzIDAgKi8KKworCQkqKChfX2xlMzIgKikgYnVmKSA9IGR3Y19jcHVfdG9fbGUzMigmcG9ydF9zdGF0dXMpOworCisJCWJyZWFrOworCWNhc2UgVUNSX1NFVF9IVUJfRkVBVFVSRToKKwkJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkRXQyBPVEcgSENEIEhVQiBDT05UUk9MIC0gIgorCQkJICAgICJTZXRIdWJGZWF0dXJlXG4iKTsKKwkJLyogTm8gSFVCIGZlYXR1cmVzIHN1cHBvcnRlZCAqLworCQlicmVhazsKKwljYXNlIFVDUl9TRVRfUE9SVF9GRUFUVVJFOgorCQlpZiAod1ZhbHVlICE9IFVIRl9QT1JUX1RFU1QgJiYgKCF3SW5kZXggfHwgd0luZGV4ID4gMSkpCisJCQlnb3RvIGVycm9yOworCisJCWlmICghZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9jb25uZWN0X3N0YXR1cykgeworCQkJLyoKKwkJCSAqIFRoZSBwb3J0IGlzIGRpc2Nvbm5lY3RlZCwgd2hpY2ggbWVhbnMgdGhlIGNvcmUgaXMKKwkJCSAqIGVpdGhlciBpbiBkZXZpY2UgbW9kZSBvciBpdCBzb29uIHdpbGwgYmUuIEp1c3QKKwkJCSAqIHJldHVybiB3aXRob3V0IGRvaW5nIGFueXRoaW5nIHNpbmNlIHRoZSBwb3J0CisJCQkgKiByZWdpc3RlciBjYW4ndCBiZSB3cml0dGVuIGlmIHRoZSBjb3JlIGlzIGluIGRldmljZQorCQkJICogbW9kZS4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKHdWYWx1ZSkgeworCQljYXNlIFVIRl9QT1JUX1NVU1BFTkQ6CisJCQlEV0NfREVCVUdQTChEQkdfSENELCAiRFdDIE9URyBIQ0QgSFVCIENPTlRST0wgLSAiCisJCQkJICAgICJTZXRQb3J0RmVhdHVyZSAtIFVTQl9QT1JUX0ZFQVRfU1VTUEVORFxuIik7CisJCQlpZiAoZHdjX290Z19oY2Rfb3RnX3BvcnQoZHdjX290Z19oY2QpICE9IHdJbmRleCkgeworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlpZiAoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKSB7CisJCQkJaW50IHRpbWVvdXQgPSAzMDA7CisJCQkJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisJCQkJcGNnY2N0bF9kYXRhX3QgcGNnY2N0bCA9IHsuZDMyID0gMCB9OworCQkJCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuID0gey5kMzIgPSAwIH07CisJCQkJZ3VzYmNmZ19kYXRhX3QgZ3VzYmNmZyA9IHsuZDMyID0gMCB9OworI2lmZGVmIERXQ19ERVZfU1JQQ0FQCisJCQkJaW50MzJfdCBvdGdfY2FwX3BhcmFtID0gY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z19jYXA7CisjZW5kaWYKKwkJCQlEV0NfUFJJTlRGKCJQcmVwYXJpbmcgZm9yIGNvbXBsZXRlIHBvd2VyLW9mZlxuIik7CisKKwkJCQkvKiBTYXZlIHJlZ2lzdGVycyBiZWZvcmUgaGliZXJuYXRpb24gKi8KKwkJCQlkd2Nfb3RnX3NhdmVfZ2xvYmFsX3JlZ3MoY29yZV9pZik7CisJCQkJZHdjX290Z19zYXZlX2hvc3RfcmVncyhjb3JlX2lmKTsKKworCQkJCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwkJCQlocHJ0MC5iLnBydHN1c3AgPSAxOworCQkJCWhwcnQwLmIucHJ0ZW5hID0gMDsKKwkJCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwLmQzMik7CisJCQkJLyogU3BpbiBocHJ0MC5iLnBydHN1c3AgdG8gYmVjYW1lIDEgKi8KKwkJCQlkbyB7CisJCQkJCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwkJCQkJaWYgKGhwcnQwLmIucHJ0c3VzcCkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZHdjX21kZWxheSgxKTsKKwkJCQl9IHdoaWxlICgtLXRpbWVvdXQpOworCQkJCWlmICghdGltZW91dCkgeworCQkJCQlEV0NfV0FSTigiU3VzcGVuZCB3YXNuJ3QgZ2VuZXJldGVkXG4iKTsKKwkJCQl9CisJCQkJZHdjX3VkZWxheSgxMCk7CisKKwkJCQkvKgorCQkJCSAqIFdlIG5lZWQgdG8gZGlzYWJsZSBpbnRlcnJ1cHRzIHRvIHByZXZlbnQgc2VydmljaW5nIG9mIGFueSBJUlEKKwkJCQkgKiBkdXJpbmcgZ29pbmcgdG8gaGliZXJuYXRpb24KKwkJCQkgKi8KKwkJCQlEV0NfU1BJTkxPQ0tfSVJRU0FWRShkd2Nfb3RnX2hjZC0+bG9jaywgJmZsYWdzKTsKKwkJCQljb3JlX2lmLT5seF9zdGF0ZSA9IERXQ19PVEdfTDI7CisjaWZkZWYgRFdDX0RFVl9TUlBDQVAKKwkJCQlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJCQkJaHBydDAuYi5wcnRwd3IgPSAwOworCQkJCWhwcnQwLmIucHJ0ZW5hID0gMDsKKwkJCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+aG9zdF9pZi0+aHBydDAsCisJCQkJCQlocHJ0MC5kMzIpOworI2VuZGlmCisJCQkJZ3VzYmNmZy5kMzIgPQorCQkJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkgICBndXNiY2ZnKTsKKwkJCQlpZiAoZ3VzYmNmZy5iLnVscGlfdXRtaV9zZWwgPT0gMSkgeworCQkJCQkvKiBVTFBJIGludGVyZmFjZSAqLworCQkJCQkvKiBTdXNwZW5kIHRoZSBQaHkgQ2xvY2sgKi8KKwkJCQkJcGNnY2N0bC5kMzIgPSAwOworCQkJCQlwY2djY3RsLmIuc3RvcHBjbGsgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIDAsCisJCQkJCQkJIHBjZ2NjdGwuZDMyKTsKKwkJCQkJZHdjX3VkZWxheSgxMCk7CisJCQkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgY29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkJIGdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogVVRNSSsgSW50ZXJmYWNlICovCisJCQkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgY29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkJIGdwd3JkbiwgMCwgZ3B3cmRuLmQzMik7CisJCQkJCWR3Y191ZGVsYXkoMTApOworCQkJCQlwY2djY3RsLmIuc3RvcHBjbGsgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIDAsIHBjZ2NjdGwuZDMyKTsKKwkJCQkJZHdjX3VkZWxheSgxMCk7CisJCQkJfQorI2lmZGVmIERXQ19ERVZfU1JQQ0FQCQkJCQorCQkJCWdwd3Jkbi5kMzIgPSAwOworCQkJCWdwd3Jkbi5iLmRpc192YnVzID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBncHdyZG4sIDAsIGdwd3Jkbi5kMzIpOworI2VuZGlmCisJCQkJZ3B3cmRuLmQzMiA9IDA7CisJCQkJZ3B3cmRuLmIucG11aW50c2VsID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBncHdyZG4sIDAsIGdwd3Jkbi5kMzIpOworCQkJCWR3Y191ZGVsYXkoMTApOworCisJCQkJZ3B3cmRuLmQzMiA9IDA7CisjaWZkZWYgRFdDX0RFVl9TUlBDQVAKKwkJCQlncHdyZG4uYi5zcnBfZGV0X21zayA9IDE7CisjZW5kaWYKKwkJCQlncHdyZG4uYi5kaXNjb25uX2RldF9tc2sgPSAxOworCQkJCWdwd3Jkbi5iLmxuc3RjaG5nX21zayA9IDE7CisJCQkJZ3B3cmRuLmIuc3RzX2NobmdpbnRfbXNrID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBncHdyZG4sIDAsIGdwd3Jkbi5kMzIpOworCQkJCWR3Y191ZGVsYXkoMTApOworCisJCQkJLyogRW5hYmxlIFBvd2VyIERvd24gQ2xhbXAgYW5kIGFsbCBpbnRlcnJ1cHRzIGluIEdQV1JETiAqLworCQkJCWdwd3Jkbi5kMzIgPSAwOworCQkJCWdwd3Jkbi5iLnB3cmRuY2xtcCA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkgZ3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwkJCQlkd2NfdWRlbGF5KDEwKTsKKworCQkJCS8qIFN3aXRjaCBvZmYgVkREICovCisJCQkJZ3B3cmRuLmQzMiA9IDA7CisJCQkJZ3B3cmRuLmIucHdyZG5zd3RjaCA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkgZ3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKworI2lmZGVmIERXQ19ERVZfU1JQQ0FQCisJCQkJaWYgKG90Z19jYXBfcGFyYW0gPT0gRFdDX09UR19DQVBfUEFSQU1fSE5QX1NSUF9DQVBBQkxFKQorCQkJCXsKKwkJCQkJY29yZV9pZi0+cHdyb25fdGltZXJfc3RhcnRlZCA9IDE7CisJCQkJCURXQ19USU1FUl9TQ0hFRFVMRShjb3JlX2lmLT5wd3Jvbl90aW1lciwgNjAwMCAvKiA2IHNlY3MgKi8gKTsKKwkJCQl9CisjZW5kaWYKKwkJCQkvKiBTYXZlIGdwd3JkbiByZWdpc3RlciBmb3IgZnVydGhlciB1c2FnZSBpZiBzdHNjaG5nIGludGVycnVwdCAqLworCQkJCWNvcmVfaWYtPmdyX2JhY2t1cC0+Z3B3cmRuX2xvY2FsID0KKwkJCQkJCURXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncHdyZG4pOworCisJCQkJLyogU2V0IGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgaW4gaGliZXJuYXRpb24gKi8KKwkJCQljb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID0gMTsKKwkJCQlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKGR3Y19vdGdfaGNkLT5sb2NrLGZsYWdzKTsKKworCQkJCURXQ19QUklOVEYoIkhvc3QgaGliZXJuYXRpb24gY29tcGxldGVkXG4iKTsKKwkJCQkvLyBFeGl0IGZyb20gY2FzZSBzdGF0ZW1lbnQKKwkJCQlicmVhazsKKworCQkJfQorCQkJaWYgKGR3Y19vdGdfaGNkX290Z19wb3J0KGR3Y19vdGdfaGNkKSA9PSB3SW5kZXggJiYKKwkJCSAgICBkd2Nfb3RnX2hjZC0+Zm9wcy0+Z2V0X2JfaG5wX2VuYWJsZShkd2Nfb3RnX2hjZCkpIHsKKwkJCQlnb3RnY3RsX2RhdGFfdCBnb3RnY3RsID0gey5kMzIgPSAwIH07CisJCQkJZ290Z2N0bC5iLmhzdHNldGhucGVuID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBnb3RnY3RsLCAwLCBnb3RnY3RsLmQzMik7CisJCQkJY29yZV9pZi0+b3Bfc3RhdGUgPSBBX1NVU1BFTkQ7CisJCQl9CisJCQlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJCQlocHJ0MC5iLnBydHN1c3AgPSAxOworCQkJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLCBocHJ0MC5kMzIpOworCQkJeworCQkJCWR3Y19pcnFmbGFnc190IGZsYWdzOworCQkJCS8qIFVwZGF0ZSBseF9zdGF0ZSAqLworCQkJCURXQ19TUElOTE9DS19JUlFTQVZFKGR3Y19vdGdfaGNkLT5sb2NrLCAmZmxhZ3MpOworCQkJCWNvcmVfaWYtPmx4X3N0YXRlID0gRFdDX09UR19MMjsKKwkJCQlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKGR3Y19vdGdfaGNkLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQkvKiBTdXNwZW5kIHRoZSBQaHkgQ2xvY2sgKi8KKwkJCXsKKwkJCQlwY2djY3RsX2RhdGFfdCBwY2djY3RsID0gey5kMzIgPSAwIH07CisJCQkJcGNnY2N0bC5iLnN0b3BwY2xrID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIDAsCisJCQkJCQkgcGNnY2N0bC5kMzIpOworCQkJCWR3Y191ZGVsYXkoMTApOworCQkJfQorCisJCQkvKiBGb3IgSE5QIHRoZSBidXMgbXVzdCBiZSBzdXNwZW5kZWQgZm9yIGF0IGxlYXN0IDIwMG1zLiAqLworCQkJaWYgKGR3Y19vdGdfaGNkLT5mb3BzLT5nZXRfYl9obnBfZW5hYmxlKGR3Y19vdGdfaGNkKSkgeworCQkJCXBjZ2NjdGxfZGF0YV90IHBjZ2NjdGwgPSB7LmQzMiA9IDAgfTsKKwkJCQlwY2djY3RsLmIuc3RvcHBjbGsgPSAxOworICAgICAgICAgICAgICAgIERXQ19NT0RJRllfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCwgcGNnY2N0bC5kMzIsIDApOworCQkJCWR3Y19tZGVsYXkoMjAwKTsKKwkJCX0KKworCQkJLyoqIEB0b2RvIC0gY2hlY2sgaG93IHN3IGNhbiB3YWl0IGZvciAxIHNlYyB0byBjaGVjayBhc2VzdmxkPz8/ICovCisjaWYgMCAvL3ZhaHJhbWEgISEhISEhISEhISEhISEhISEhCisJCQlpZiAoY29yZV9pZi0+YWRwX2VuYWJsZSkgeworCQkJCWdvdGdjdGxfZGF0YV90IGdvdGdjdGwgPSB7LmQzMiA9IDAgfTsKKwkJCQlncHdyZG5fZGF0YV90IGdwd3JkbjsKKworCQkJCXdoaWxlIChnb3RnY3RsLmIuYXNlc3ZsZCA9PSAxKSB7CisJCQkJCWdvdGdjdGwuZDMyID0KKwkJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCQkgICBjb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCQkgICBnb3RnY3RsKTsKKwkJCQkJZHdjX21kZWxheSgxMDApOworCQkJCX0KKworCQkJCS8qIEVuYWJsZSBQb3dlciBEb3duIExvZ2ljICovCisJCQkJZ3B3cmRuLmQzMiA9IDA7CisJCQkJZ3B3cmRuLmIucG11YWN0diA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkgZ3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKworCQkJCS8qIFVubWFzayBTUlAgZGV0ZWN0ZWQgaW50ZXJydXB0IGZyb20gUG93ZXIgRG93biBMb2dpYyAqLworCQkJCWdwd3Jkbi5kMzIgPSAwOworCQkJCWdwd3Jkbi5iLnNycF9kZXRfbXNrID0gMTsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBncHdyZG4sIDAsIGdwd3Jkbi5kMzIpOworCisJCQkJZHdjX290Z19hZHBfcHJvYmVfc3RhcnQoY29yZV9pZik7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIFVIRl9QT1JUX1BPV0VSOgorCQkJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkRXQyBPVEcgSENEIEhVQiBDT05UUk9MIC0gIgorCQkJCSAgICAiU2V0UG9ydEZlYXR1cmUgLSBVU0JfUE9SVF9GRUFUX1BPV0VSXG4iKTsKKwkJCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwkJCWhwcnQwLmIucHJ0cHdyID0gMTsKKwkJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKwkJCWJyZWFrOworCQljYXNlIFVIRl9QT1JUX1JFU0VUOgorCQkJaWYgKChjb3JlX2lmLT5wb3dlcl9kb3duID09IDIpCisJCQkgICAgJiYgKGNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPT0gMSkpIHsKKwkJCQkvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gZXhpdCBmcm9tIEhpYmVybmF0ZWQKKwkJCQkgKiBzdGF0ZSB2aWEgVVNCIFJFU0VULgorCQkJCSAqLworCQkJCWR3Y19vdGdfaG9zdF9oaWJlcm5hdGlvbl9yZXN0b3JlKGNvcmVfaWYsIDAsIDEpOworCQkJfSBlbHNlIHsKKwkJCQlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisKKwkJCQlEV0NfREVCVUdQTChEQkdfSENELAorCQkJCQkgICAgIkRXQyBPVEcgSENEIEhVQiBDT05UUk9MIC0gIgorCQkJCQkgICAgIlNldFBvcnRGZWF0dXJlIC0gVVNCX1BPUlRfRkVBVF9SRVNFVFxuIik7CisJCQkJeworCQkJCQlwY2djY3RsX2RhdGFfdCBwY2djY3RsID0gey5kMzIgPSAwIH07CisJCQkJCXBjZ2NjdGwuYi5lbmJsX3NsZWVwX2dhdGluZyA9IDE7CisJCQkJCXBjZ2NjdGwuYi5zdG9wcGNsayA9IDE7CisJCQkJCURXQ19NT0RJRllfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCwgcGNnY2N0bC5kMzIsIDApOworCQkJCQlEV0NfV1JJVEVfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCwgMCk7CisJCQkJfQorI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwkJCQl7CisJCQkJCWdscG1jZmdfZGF0YV90IGxwbWNmZzsKKwkJCQkJbHBtY2ZnLmQzMiA9CisJCQkJCQlEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJCQkJCWlmIChscG1jZmcuYi5wcnRfc2xlZXBfc3RzKSB7CisJCQkJCQlscG1jZmcuYi5lbl91dG1pX3NsZWVwID0gMDsKKwkJCQkJCWxwbWNmZy5iLmhpcmRfdGhyZXMgJj0gKH4oMSA8PCA0KSk7CisJCQkJCQlEV0NfV1JJVEVfUkVHMzIKKwkJCQkJCSAgICAoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdscG1jZmcsCisJCQkJCQkgICAgIGxwbWNmZy5kMzIpOworCQkJCQkJZHdjX21kZWxheSgxKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJCWhwcnQwLmQzMiA9IGR3Y19vdGdfcmVhZF9ocHJ0MChjb3JlX2lmKTsKKwkJCQkvKiBDbGVhciBzdXNwZW5kIGJpdCBpZiByZXNldHRpbmcgZnJvbSBzdXNwZW5kZWQgc3RhdGUuICovCisJCQkJaHBydDAuYi5wcnRzdXNwID0gMDsKKwkJCQkvKiBXaGVuIEItSG9zdCB0aGUgUG9ydCByZXNldCBiaXQgaXMgc2V0IGluCisJCQkJICogdGhlIFN0YXJ0IEhDRCBDYWxsYmFjayBmdW5jdGlvbiwgc28gdGhhdAorCQkJCSAqIHRoZSByZXNldCBpcyBzdGFydGVkIHdpdGhpbiAxbXMgb2YgdGhlIEhOUAorCQkJCSAqIHN1Y2Nlc3MgaW50ZXJydXB0LiAqLworCQkJCWlmICghZHdjX290Z19oY2RfaXNfYl9ob3N0KGR3Y19vdGdfaGNkKSkgeworCQkJCQlocHJ0MC5iLnBydHB3ciA9IDE7CisJCQkJCWhwcnQwLmIucHJ0cnN0ID0gMTsKKwkJCQkJRFdDX1BSSU5URigiSW5kZWVkIGl0IGlzIGluIGhvc3QgbW9kZSBocHJ0MCA9ICUwOHhcbiIsaHBydDAuZDMyKTsKKwkJCQkJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLAorCQkJCQkJCWhwcnQwLmQzMik7CisJCQkJfQorCQkJCS8qIENsZWFyIHJlc2V0IGJpdCBpbiAxMG1zIChGUy9MUykgb3IgNTBtcyAoSFMpICovCisJCQkJZHdjX21kZWxheSg2MCk7CisJCQkJaHBydDAuYi5wcnRyc3QgPSAwOworCQkJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKwkJCQljb3JlX2lmLT5seF9zdGF0ZSA9IERXQ19PVEdfTDA7CS8qIE5vdyBiYWNrIHRvIHRoZSBvbiBzdGF0ZSAqLworCQkJfQorCQkJYnJlYWs7CisjaWZkZWYgRFdDX0hTX0VMRUNUX1RTVAorCQljYXNlIFVIRl9QT1JUX1RFU1Q6CisJCQl7CisJCQkJdWludDMyX3QgdDsKKwkJCQlnaW50bXNrX2RhdGFfdCBnaW50bXNrOworCisJCQkJdCA9ICh3SW5kZXggPj4gOCk7CS8qIE1TQiB3SW5kZXggVVNCICovCisJCQkJRFdDX0RFQlVHUEwoREJHX0hDRCwKKwkJCQkJICAgICJEV0MgT1RHIEhDRCBIVUIgQ09OVFJPTCAtICIKKwkJCQkJICAgICJTZXRQb3J0RmVhdHVyZSAtIFVTQl9QT1JUX0ZFQVRfVEVTVCAlZFxuIiwKKwkJCQkJICAgIHQpOworCQkJCURXQ19XQVJOKCJVU0JfUE9SVF9GRUFUX1RFU1QgJWRcbiIsIHQpOworCQkJCWlmICh0IDwgNikgeworCQkJCQlocHJ0MC5kMzIgPSBkd2Nfb3RnX3JlYWRfaHBydDAoY29yZV9pZik7CisJCQkJCWhwcnQwLmIucHJ0dHN0Y3RsID0gdDsKKwkJCQkJRFdDX1dSSVRFX1JFRzMyKGNvcmVfaWYtPmhvc3RfaWYtPmhwcnQwLAorCQkJCQkJCWhwcnQwLmQzMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogU2V0dXAgZ2xvYmFsIHZhcnMgd2l0aCByZWcgYWRkcmVzc2VzIChxdWljayBhbmQKKwkJCQkJICogZGlydHkgaGFjaywgc2hvdWxkIGJlIGNsZWFuZWQgdXApCisJCQkJCSAqLworCQkJCQlnbG9iYWxfcmVncyA9IGNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3M7CisJCQkJCWhjX2dsb2JhbF9yZWdzID0KKwkJCQkJICAgIGNvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3M7CisJCQkJCWhjX3JlZ3MgPQorCQkJCQkgICAgKGR3Y19vdGdfaGNfcmVnc190ICopICgoY2hhciAqKQorCQkJCQkJCQkgICBnbG9iYWxfcmVncyArCisJCQkJCQkJCSAgIDB4NTAwKTsKKwkJCQkJZGF0YV9maWZvID0KKwkJCQkJICAgICh1aW50MzJfdCAqKSAoKGNoYXIgKilnbG9iYWxfcmVncyArCisJCQkJCQkJICAweDEwMDApOworCisJCQkJCWlmICh0ID09IDYpIHsJLyogSFNfSE9TVF9QT1JUX1NVU1BFTkRfUkVTVU1FICovCisJCQkJCQkvKiBTYXZlIGN1cnJlbnQgaW50ZXJydXB0IG1hc2sgKi8KKwkJCQkJCWdpbnRtc2suZDMyID0KKwkJCQkJCSAgICBEV0NfUkVBRF9SRUczMgorCQkJCQkJICAgICgmZ2xvYmFsX3JlZ3MtPmdpbnRtc2spOworCisJCQkJCQkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIHdoaWxlIHdlIG11Y2sgd2l0aAorCQkJCQkJICogdGhlIGhhcmR3YXJlIGRpcmVjdGx5CisJCQkJCQkgKi8KKwkJCQkJCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIDApOworCisJCQkJCQkvKiAxNSBzZWNvbmQgZGVsYXkgcGVyIHRoZSB0ZXN0IHNwZWMgKi8KKwkJCQkJCWR3Y19tZGVsYXkoMTUwMDApOworCisJCQkJCQkvKiBEcml2ZSBzdXNwZW5kIG9uIHRoZSByb290IHBvcnQgKi8KKwkJCQkJCWhwcnQwLmQzMiA9CisJCQkJCQkgICAgZHdjX290Z19yZWFkX2hwcnQwKGNvcmVfaWYpOworCQkJCQkJaHBydDAuYi5wcnRzdXNwID0gMTsKKwkJCQkJCWhwcnQwLmIucHJ0cmVzID0gMDsKKwkJCQkJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKworCQkJCQkJLyogMTUgc2Vjb25kIGRlbGF5IHBlciB0aGUgdGVzdCBzcGVjICovCisJCQkJCQlkd2NfbWRlbGF5KDE1MDAwKTsKKworCQkJCQkJLyogRHJpdmUgcmVzdW1lIG9uIHRoZSByb290IHBvcnQgKi8KKwkJCQkJCWhwcnQwLmQzMiA9CisJCQkJCQkgICAgZHdjX290Z19yZWFkX2hwcnQwKGNvcmVfaWYpOworCQkJCQkJaHBydDAuYi5wcnRzdXNwID0gMDsKKwkJCQkJCWhwcnQwLmIucHJ0cmVzID0gMTsKKwkJCQkJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKwkJCQkJCWR3Y19tZGVsYXkoMTAwKTsKKworCQkJCQkJLyogQ2xlYXIgdGhlIHJlc3VtZSBiaXQgKi8KKwkJCQkJCWhwcnQwLmIucHJ0cmVzID0gMDsKKwkJCQkJCURXQ19XUklURV9SRUczMihjb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDAuZDMyKTsKKworCQkJCQkJLyogUmVzdG9yZSBpbnRlcnJ1cHRzICovCisJCQkJCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCBnaW50bXNrLmQzMik7CisJCQkJCX0gZWxzZSBpZiAodCA9PSA3KSB7CS8qIFNJTkdMRV9TVEVQX0dFVF9ERVZJQ0VfREVTQ1JJUFRPUiBzZXR1cCAqLworCQkJCQkJLyogU2F2ZSBjdXJyZW50IGludGVycnVwdCBtYXNrICovCisJCQkJCQlnaW50bXNrLmQzMiA9CisJCQkJCQkgICAgRFdDX1JFQURfUkVHMzIKKwkJCQkJCSAgICAoJmdsb2JhbF9yZWdzLT5naW50bXNrKTsKKworCQkJCQkJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyB3aGlsZSB3ZSBtdWNrIHdpdGgKKwkJCQkJCSAqIHRoZSBoYXJkd2FyZSBkaXJlY3RseQorCQkJCQkJICovCisJCQkJCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCAwKTsKKworCQkJCQkJLyogMTUgc2Vjb25kIGRlbGF5IHBlciB0aGUgdGVzdCBzcGVjICovCisJCQkJCQlkd2NfbWRlbGF5KDE1MDAwKTsKKworCQkJCQkJLyogU2VuZCB0aGUgU2V0dXAgcGFja2V0ICovCisJCQkJCQlkb19zZXR1cCgpOworCisJCQkJCQkvKiAxNSBzZWNvbmQgZGVsYXkgc28gbm90aGluZyBlbHNlIGhhcHBlbnMgZm9yIGF3aGlsZSAqLworCQkJCQkJZHdjX21kZWxheSgxNTAwMCk7CisKKwkJCQkJCS8qIFJlc3RvcmUgaW50ZXJydXB0cyAqLworCQkJCQkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludG1zaywgZ2ludG1zay5kMzIpOworCQkJCQl9IGVsc2UgaWYgKHQgPT0gOCkgewkvKiBTSU5HTEVfU1RFUF9HRVRfREVWSUNFX0RFU0NSSVBUT1IgZXhlY3V0ZSAqLworCQkJCQkJLyogU2F2ZSBjdXJyZW50IGludGVycnVwdCBtYXNrICovCisJCQkJCQlnaW50bXNrLmQzMiA9CisJCQkJCQkgICAgRFdDX1JFQURfUkVHMzIKKwkJCQkJCSAgICAoJmdsb2JhbF9yZWdzLT5naW50bXNrKTsKKworCQkJCQkJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyB3aGlsZSB3ZSBtdWNrIHdpdGgKKwkJCQkJCSAqIHRoZSBoYXJkd2FyZSBkaXJlY3RseQorCQkJCQkJICovCisJCQkJCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCAwKTsKKworCQkJCQkJLyogU2VuZCB0aGUgU2V0dXAgcGFja2V0ICovCisJCQkJCQlkb19zZXR1cCgpOworCisJCQkJCQkvKiAxNSBzZWNvbmQgZGVsYXkgc28gbm90aGluZyBlbHNlIGhhcHBlbnMgZm9yIGF3aGlsZSAqLworCQkJCQkJZHdjX21kZWxheSgxNTAwMCk7CisKKwkJCQkJCS8qIFNlbmQgdGhlIEluIGFuZCBBY2sgcGFja2V0cyAqLworCQkJCQkJZG9faW5fYWNrKCk7CisKKwkJCQkJCS8qIDE1IHNlY29uZCBkZWxheSBzbyBub3RoaW5nIGVsc2UgaGFwcGVucyBmb3IgYXdoaWxlICovCisJCQkJCQlkd2NfbWRlbGF5KDE1MDAwKTsKKworCQkJCQkJLyogUmVzdG9yZSBpbnRlcnJ1cHRzICovCisJCQkJCQlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCBnaW50bXNrLmQzMik7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisjZW5kaWYgLyogRFdDX0hTX0VMRUNUX1RTVCAqLworCisJCWNhc2UgVUhGX1BPUlRfSU5ESUNBVE9SOgorCQkJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkRXQyBPVEcgSENEIEhVQiBDT05UUk9MIC0gIgorCQkJCSAgICAiU2V0UG9ydEZlYXR1cmUgLSBVU0JfUE9SVF9GRUFUX0lORElDQVRPUlxuIik7CisJCQkvKiBOb3Qgc3VwcG9ydGVkICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQkJRFdDX0VSUk9SKCJEV0MgT1RHIEhDRCAtICIKKwkJCQkgICJTZXRQb3J0RmVhdHVyZSByZXF1ZXN0ICV4aCAiCisJCQkJICAidW5rbm93biBvciB1bnN1cHBvcnRlZFxuIiwgd1ZhbHVlKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwljYXNlIFVDUl9TRVRfQU5EX1RFU1RfUE9SVF9GRUFUVVJFOgorCQlpZiAod1ZhbHVlICE9IFVIRl9QT1JUX0wxKSB7CisJCQlnb3RvIGVycm9yOworCQl9CisJCXsKKwkJCWludCBwb3J0bnVtLCBoaXJkLCBkZXZhZGRyLCByZW13YWtlOworCQkJZ2xwbWNmZ19kYXRhX3QgbHBtY2ZnOworCQkJdWludDMyX3QgdGltZV91c2VjczsKKwkJCWdpbnRzdHNfZGF0YV90IGdpbnRzdHM7CisJCQlnaW50bXNrX2RhdGFfdCBnaW50bXNrOworCisJCQlpZiAoIWR3Y19vdGdfZ2V0X3BhcmFtX2xwbV9lbmFibGUoY29yZV9pZikpIHsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJaWYgKHdWYWx1ZSAhPSBVSEZfUE9SVF9MMSB8fCB3TGVuZ3RoICE9IDEpIHsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJLyogQ2hlY2sgaWYgdGhlIHBvcnQgY3VycmVudGx5IGlzIGluIFNMRUVQIHN0YXRlICovCisJCQlscG1jZmcuZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJCQlpZiAobHBtY2ZnLmIucHJ0X3NsZWVwX3N0cykgeworCQkJCURXQ19JTkZPKCJQb3J0IGlzIGFscmVhZHkgaW4gc2xlZXAgbW9kZVxuIik7CisJCQkJYnVmWzBdID0gMDsJLyogUmV0dXJuIHN1Y2Nlc3MgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcG9ydG51bSA9IHdJbmRleCAmIDB4ZjsKKwkJCWhpcmQgPSAod0luZGV4ID4+IDQpICYgMHhmOworCQkJZGV2YWRkciA9ICh3SW5kZXggPj4gOCkgJiAweDdmOworCQkJcmVtd2FrZSA9ICh3SW5kZXggPj4gMTUpOworCisJCQlpZiAocG9ydG51bSAhPSAxKSB7CisJCQkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJCQkJRFdDX1dBUk4KKwkJCQkgICAgKCJXcm9uZyBwb3J0IG51bWJlciglZCkgaW4gU2V0YW5kVGVzdFBvcnRGZWF0dXJlIHJlcXVlc3RcbiIsCisJCQkJICAgICBwb3J0bnVtKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJRFdDX1BSSU5URgorCQkJICAgICgiU2V0YW5kVGVzdFBvcnRGZWF0dXJlIHJlcXVlc3Q6IHBvcnRudW0gPSAlZCwgaGlyZCA9ICVkLCBkZXZhZGRyID0gJWQsIHJld2FrZSA9ICVkXG4iLAorCQkJICAgICBwb3J0bnVtLCBoaXJkLCBkZXZhZGRyLCByZW13YWtlKTsKKwkJCS8qIERpc2FibGUgTFBNIGludGVycnVwdCAqLworCQkJZ2ludG1zay5kMzIgPSAwOworCQkJZ2ludG1zay5iLmxwbXRyYW5yY3ZkID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssCisJCQkJCSBnaW50bXNrLmQzMiwgMCk7CisKKwkJCWlmIChkd2Nfb3RnX2hjZF9zZW5kX2xwbQorCQkJICAgIChkd2Nfb3RnX2hjZCwgZGV2YWRkciwgaGlyZCwgcmVtd2FrZSkpIHsKKwkJCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJdGltZV91c2VjcyA9IDEwICogKGxwbWNmZy5iLnJldHJ5X2NvdW50ICsgMSk7CisJCQkvKiBXZSB3aWxsIGNvbnNpZGVyIHRpbWVvdXQgaWYgdGltZV91c2VjcyBtaWNyb3NlY29uZHMgcGFzcywKKwkJCSAqIGFuZCB3ZSBkb24ndCByZWNlaXZlIExQTSB0cmFuc2FjdGlvbiBzdGF0dXMuCisJCQkgKiBBZnRlciByZWNlaXZpbmcgbm9uLWVycm9yIHJlc3BvbmNlKEFDSy9OWUVUL1NUQUxMKSBmcm9tIGRldmljZSwKKwkJCSAqICBjb3JlIHdpbGwgc2V0IGxwbXRyYW5yY3ZkIGJpdC4KKwkJCSAqLworCQkJZG8geworCQkJCWdpbnRzdHMuZDMyID0KKwkJCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpOworCQkJCWlmIChnaW50c3RzLmIubHBtdHJhbnJjdmQpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWR3Y191ZGVsYXkoMSk7CisJCQl9IHdoaWxlICgtLXRpbWVfdXNlY3MpOworCQkJLyogbHBtX2ludCBiaXQgd2lsbCBiZSBjbGVhcmVkIGluIExQTSBpbnRlcnJ1cHQgaGFuZGxlciAqLworCisJCQkvKiBOb3cgZmlsbCBzdGF0dXMKKwkJCSAqIDB4MDAgLSBTdWNjZXNzCisJCQkgKiAweDEwIC0gTllFVAorCQkJICogMHgxMSAtIFRpbWVvdXQKKwkJCSAqLworCQkJaWYgKCFnaW50c3RzLmIubHBtdHJhbnJjdmQpIHsKKwkJCQlidWZbMF0gPSAweDM7CS8qIENvbXBsZXRpb24gY29kZSBpcyBUaW1lb3V0ICovCisJCQkJZHdjX290Z19oY2RfZnJlZV9oY19mcm9tX2xwbShkd2Nfb3RnX2hjZCk7CisJCQl9IGVsc2UgeworCQkJCWxwbWNmZy5kMzIgPQorCQkJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJCQkJaWYgKGxwbWNmZy5iLmxwbV9yZXNwID09IDB4MykgeworCQkJCQkvKiBBQ0sgcmVzcG9uY2UgZnJvbSB0aGUgZGV2aWNlICovCisJCQkJCWJ1ZlswXSA9IDB4MDA7CS8qIFN1Y2Nlc3MgKi8KKwkJCQl9IGVsc2UgaWYgKGxwbWNmZy5iLmxwbV9yZXNwID09IDB4MikgeworCQkJCQkvKiBOWUVUIHJlc3BvbmNlIGZyb20gdGhlIGRldmljZSAqLworCQkJCQlidWZbMF0gPSAweDI7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogT3RoZXJ3aXNlIHJlc3BvbmNlIHdpdGggVGltZW91dCAqLworCQkJCQlidWZbMF0gPSAweDM7CisJCQkJfQorCQkJfQorCQkJRFdDX1BSSU5URigiRGV2aWNlIHJlc3BvbmNlIHRvIExQTSB0cmFucyBpcyAleFxuIiwKKwkJCQkgICBscG1jZmcuYi5scG1fcmVzcCk7CisJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLCAwLAorCQkJCQkgZ2ludG1zay5kMzIpOworCisJCQlicmVhazsKKwkJfQorI2VuZGlmIC8qIENPTkZJR19VU0JfRFdDX09UR19MUE0gKi8KKwlkZWZhdWx0OgorZXJyb3I6CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQlEV0NfV0FSTigiRFdDIE9URyBIQ0QgLSAiCisJCQkgIlVua25vd24gaHViIGNvbnRyb2wgcmVxdWVzdCB0eXBlIG9yIGludmFsaWQgdHlwZVJlcTogJXhoIHdJbmRleDogJXhoIHdWYWx1ZTogJXhoXG4iLAorCQkJIHR5cGVSZXEsIHdJbmRleCwgd1ZhbHVlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKy8qKiBSZXR1cm5zIGluZGV4IG9mIGhvc3QgY2hhbm5lbCB0byBwZXJmb3JtIExQTSB0cmFuc2FjdGlvbi4gKi8KK2ludCBkd2Nfb3RnX2hjZF9nZXRfaGNfZm9yX2xwbV90cmFuKGR3Y19vdGdfaGNkX3QgKiBoY2QsIHVpbnQ4X3QgZGV2YWRkcikKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IGhjZC0+Y29yZV9pZjsKKwlkd2NfaGNfdCAqaGM7CisJaGNjaGFyX2RhdGFfdCBoY2NoYXI7CisJZ2ludG1za19kYXRhX3QgZ2ludG1zayA9IHsuZDMyID0gMCB9OworCisJaWYgKERXQ19DSVJDTEVRX0VNUFRZKCZoY2QtPmZyZWVfaGNfbGlzdCkpIHsKKwkJRFdDX1BSSU5URigiTm8gZnJlZSBjaGFubmVsIHRvIHNlbGVjdCBmb3IgTFBNIHRyYW5zYWN0aW9uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWhjID0gRFdDX0NJUkNMRVFfRklSU1QoJmhjZC0+ZnJlZV9oY19saXN0KTsKKworCS8qIE1hc2sgaG9zdCBjaGFubmVsIGludGVycnVwdHMuICovCisJZ2ludG1zay5iLmhjaW50ciA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaywgZ2ludG1zay5kMzIsIDApOworCisJLyogRmlsbCBmaWVsZHMgdGhhdCBjb3JlIG5lZWRzIGZvciBMUE0gdHJhbnNhY3Rpb24gKi8KKwloY2NoYXIuYi5kZXZhZGRyID0gZGV2YWRkcjsKKwloY2NoYXIuYi5lcG51bSA9IDA7CisJaGNjaGFyLmIuZXB0eXBlID0gRFdDX09UR19FUF9UWVBFX0NPTlRST0w7CisJaGNjaGFyLmIubXBzID0gNjQ7CisJaGNjaGFyLmIubHNwZGRldiA9IChoYy0+c3BlZWQgPT0gRFdDX09UR19FUF9TUEVFRF9MT1cpOworCWhjY2hhci5iLmVwZGlyID0gMDsJLyogT1VUICovCisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5ob3N0X2lmLT5oY19yZWdzW2hjLT5oY19udW1dLT5oY2NoYXIsCisJCQloY2NoYXIuZDMyKTsKKworCS8qIFJlbW92ZSB0aGUgaG9zdCBjaGFubmVsIGZyb20gdGhlIGZyZWUgbGlzdC4gKi8KKwlEV0NfQ0lSQ0xFUV9SRU1PVkVfSU5JVCgmaGNkLT5mcmVlX2hjX2xpc3QsIGhjLCBoY19saXN0X2VudHJ5KTsKKworCURXQ19QUklOVEYoImhjbnVtID0gJWQgZGV2YWRkciA9ICVkXG4iLCBoYy0+aGNfbnVtLCBkZXZhZGRyKTsKKworCXJldHVybiBoYy0+aGNfbnVtOworfQorCisvKiogUmVsZWFzZSBoYyBhZnRlciBwZXJmb3JtaW5nIExQTSB0cmFuc2FjdGlvbiAqLwordm9pZCBkd2Nfb3RnX2hjZF9mcmVlX2hjX2Zyb21fbHBtKGR3Y19vdGdfaGNkX3QgKiBoY2QpCit7CisJZHdjX2hjX3QgKmhjOworCWdscG1jZmdfZGF0YV90IGxwbWNmZzsKKwl1aW50OF90IGhjX251bTsKKworCWxwbWNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNkLT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbHBtY2ZnKTsKKwloY19udW0gPSBscG1jZmcuYi5scG1fY2hhbl9pbmRleDsKKworCWhjID0gaGNkLT5oY19wdHJfYXJyYXlbaGNfbnVtXTsKKworCURXQ19QUklOVEYoIkZyZWVpbmcgY2hhbm5lbCAlZCBhZnRlciBMUE1cbiIsIGhjX251bSk7CisJLyogUmV0dXJuIGhvc3QgY2hhbm5lbCB0byBmcmVlIGxpc3QgKi8KKwlEV0NfQ0lSQ0xFUV9JTlNFUlRfVEFJTCgmaGNkLT5mcmVlX2hjX2xpc3QsIGhjLCBoY19saXN0X2VudHJ5KTsKK30KKworaW50IGR3Y19vdGdfaGNkX3NlbmRfbHBtKGR3Y19vdGdfaGNkX3QgKiBoY2QsIHVpbnQ4X3QgZGV2YWRkciwgdWludDhfdCBoaXJkLAorCQkJIHVpbnQ4X3QgYlJlbW90ZVdha2UpCit7CisJZ2xwbWNmZ19kYXRhX3QgbHBtY2ZnOworCXBjZ2NjdGxfZGF0YV90IHBjZ2NjdGwgPSB7LmQzMiA9IDAgfTsKKwlpbnQgY2hhbm5lbDsKKworCWNoYW5uZWwgPSBkd2Nfb3RnX2hjZF9nZXRfaGNfZm9yX2xwbV90cmFuKGhjZCwgZGV2YWRkcik7CisJaWYgKGNoYW5uZWwgPCAwKSB7CisJCXJldHVybiBjaGFubmVsOworCX0KKworCXBjZ2NjdGwuYi5lbmJsX3NsZWVwX2dhdGluZyA9IDE7CisJRFdDX01PRElGWV9SRUczMihoY2QtPmNvcmVfaWYtPnBjZ2NjdGwsIDAsIHBjZ2NjdGwuZDMyKTsKKworCS8qIFJlYWQgTFBNIGNvbmZpZyByZWdpc3RlciAqLworCWxwbWNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNkLT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbHBtY2ZnKTsKKworCS8qIFByb2dyYW0gTFBNIHRyYW5zYWN0aW9uIGZpZWxkcyAqLworCWxwbWNmZy5iLnJlbV93a3VwX2VuID0gYlJlbW90ZVdha2U7CisJbHBtY2ZnLmIuaGlyZCA9IGhpcmQ7CisJbHBtY2ZnLmIuaGlyZF90aHJlcyA9IDB4MWM7CisJbHBtY2ZnLmIubHBtX2NoYW5faW5kZXggPSBjaGFubmVsOworCWxwbWNmZy5iLmVuX3V0bWlfc2xlZXAgPSAxOworCS8qIFByb2dyYW0gTFBNIGNvbmZpZyByZWdpc3RlciAqLworCURXQ19XUklURV9SRUczMigmaGNkLT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbHBtY2ZnLCBscG1jZmcuZDMyKTsKKworCS8qIFNlbmQgTFBNIHRyYW5zYWN0aW9uICovCisJbHBtY2ZnLmIuc2VuZF9scG0gPSAxOworCURXQ19XUklURV9SRUczMigmaGNkLT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nbHBtY2ZnLCBscG1jZmcuZDMyKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1VTQl9EV0NfT1RHX0xQTSAqLworCitpbnQgZHdjX290Z19oY2RfaXNfc3RhdHVzX2NoYW5nZWQoZHdjX290Z19oY2RfdCAqIGhjZCwgaW50IHBvcnQpCit7CisJaW50IHJldHZhbDsKKworCWlmIChwb3J0ICE9IDEpIHsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCXJldHZhbCA9IChoY2QtPmZsYWdzLmIucG9ydF9jb25uZWN0X3N0YXR1c19jaGFuZ2UgfHwKKwkJICBoY2QtPmZsYWdzLmIucG9ydF9yZXNldF9jaGFuZ2UgfHwKKwkJICBoY2QtPmZsYWdzLmIucG9ydF9lbmFibGVfY2hhbmdlIHx8CisJCSAgaGNkLT5mbGFncy5iLnBvcnRfc3VzcGVuZF9jaGFuZ2UgfHwKKwkJICBoY2QtPmZsYWdzLmIucG9ydF9vdmVyX2N1cnJlbnRfY2hhbmdlKTsKKyNpZmRlZiBERUJVRworCWlmIChyZXR2YWwpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkRXQyBPVEcgSENEIEhVQiBTVEFUVVMgREFUQToiCisJCQkgICAgIiBSb290IHBvcnQgc3RhdHVzIGNoYW5nZWRcbiIpOworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgcG9ydF9jb25uZWN0X3N0YXR1c19jaGFuZ2U6ICVkXG4iLAorCQkJICAgIGhjZC0+ZmxhZ3MuYi5wb3J0X2Nvbm5lY3Rfc3RhdHVzX2NoYW5nZSk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBwb3J0X3Jlc2V0X2NoYW5nZTogJWRcbiIsCisJCQkgICAgaGNkLT5mbGFncy5iLnBvcnRfcmVzZXRfY2hhbmdlKTsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIgIHBvcnRfZW5hYmxlX2NoYW5nZTogJWRcbiIsCisJCQkgICAgaGNkLT5mbGFncy5iLnBvcnRfZW5hYmxlX2NoYW5nZSk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBwb3J0X3N1c3BlbmRfY2hhbmdlOiAlZFxuIiwKKwkJCSAgICBoY2QtPmZsYWdzLmIucG9ydF9zdXNwZW5kX2NoYW5nZSk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBwb3J0X292ZXJfY3VycmVudF9jaGFuZ2U6ICVkXG4iLAorCQkJICAgIGhjZC0+ZmxhZ3MuYi5wb3J0X292ZXJfY3VycmVudF9jaGFuZ2UpOworCX0KKyNlbmRpZgorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBkd2Nfb3RnX2hjZF9nZXRfZnJhbWVfbnVtYmVyKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCkKK3sKKwloZm51bV9kYXRhX3QgaGZudW07CisJaGZudW0uZDMyID0KKwkgICAgRFdDX1JFQURfUkVHMzIoJmR3Y19vdGdfaGNkLT5jb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT4KKwkJCSAgIGhmbnVtKTsKKworI2lmZGVmIERFQlVHX1NPRgorCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiRFdDIE9URyBIQ0QgR0VUIEZSQU1FIE5VTUJFUiAlZFxuIiwKKwkJICAgIGhmbnVtLmIuZnJudW0pOworI2VuZGlmCisJcmV0dXJuIGhmbnVtLmIuZnJudW07Cit9CisKK2ludCBkd2Nfb3RnX2hjZF9zdGFydChkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkgICAgICBzdHJ1Y3QgZHdjX290Z19oY2RfZnVuY3Rpb25fb3BzICpmb3BzKQoreworCWludCByZXR2YWwgPSAwOworCisJaGNkLT5mb3BzID0gZm9wczsKKwlpZiAoIWR3Y19vdGdfaXNfZGV2aWNlX21vZGUoaGNkLT5jb3JlX2lmKSAmJiAKKwkJKCFoY2QtPmNvcmVfaWYtPmFkcF9lbmFibGUgfHwgaGNkLT5jb3JlX2lmLT5hZHAuYWRwX3N0YXJ0ZWQpKSB7CisJCWR3Y19vdGdfaGNkX3JlaW5pdChoY2QpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IC1EV0NfRV9OT19ERVZJQ0U7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCAqZHdjX290Z19oY2RfZ2V0X3ByaXZfZGF0YShkd2Nfb3RnX2hjZF90ICogaGNkKQoreworCXJldHVybiBoY2QtPnByaXY7Cit9CisKK3ZvaWQgZHdjX290Z19oY2Rfc2V0X3ByaXZfZGF0YShkd2Nfb3RnX2hjZF90ICogaGNkLCB2b2lkICpwcml2X2RhdGEpCit7CisJaGNkLT5wcml2ID0gcHJpdl9kYXRhOworfQorCit1aW50MzJfdCBkd2Nfb3RnX2hjZF9vdGdfcG9ydChkd2Nfb3RnX2hjZF90ICogaGNkKQoreworCXJldHVybiBoY2QtPm90Z19wb3J0OworfQorCit1aW50MzJfdCBkd2Nfb3RnX2hjZF9pc19iX2hvc3QoZHdjX290Z19oY2RfdCAqIGhjZCkKK3sKKwl1aW50MzJfdCBpc19iX2hvc3Q7CisJaWYgKGhjZC0+Y29yZV9pZi0+b3Bfc3RhdGUgPT0gQl9IT1NUKSB7CisJCWlzX2JfaG9zdCA9IDE7CisJfSBlbHNlIHsKKwkJaXNfYl9ob3N0ID0gMDsKKwl9CisKKwlyZXR1cm4gaXNfYl9ob3N0OworfQorCitkd2Nfb3RnX2hjZF91cmJfdCAqZHdjX290Z19oY2RfdXJiX2FsbG9jKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJCSBpbnQgaXNvX2Rlc2NfY291bnQsIGludCBhdG9taWNfYWxsb2MpCit7CisJZHdjX290Z19oY2RfdXJiX3QgKmR3Y19vdGdfdXJiOworCXVpbnQzMl90IHNpemU7CisKKwlzaXplID0KKwkgICAgc2l6ZW9mKCpkd2Nfb3RnX3VyYikgKworCSAgICBpc29fZGVzY19jb3VudCAqIHNpemVvZihzdHJ1Y3QgZHdjX290Z19oY2RfaXNvX3BhY2tldF9kZXNjKTsKKwlpZiAoYXRvbWljX2FsbG9jKQorCQlkd2Nfb3RnX3VyYiA9IERXQ19BTExPQ19BVE9NSUMoc2l6ZSk7CisJZWxzZQorCQlkd2Nfb3RnX3VyYiA9IERXQ19BTExPQyhzaXplKTsKKworCWR3Y19vdGdfdXJiLT5wYWNrZXRfY291bnQgPSBpc29fZGVzY19jb3VudDsKKworCXJldHVybiBkd2Nfb3RnX3VyYjsKK30KKwordm9pZCBkd2Nfb3RnX2hjZF91cmJfc2V0X3BpcGVpbmZvKGR3Y19vdGdfaGNkX3VyYl90ICogZHdjX290Z191cmIsCisJCQkJICB1aW50OF90IGRldl9hZGRyLCB1aW50OF90IGVwX251bSwKKwkJCQkgIHVpbnQ4X3QgZXBfdHlwZSwgdWludDhfdCBlcF9kaXIsIHVpbnQxNl90IG1wcykKK3sKKwlkd2Nfb3RnX2hjZF9maWxsX3BpcGUoJmR3Y19vdGdfdXJiLT5waXBlX2luZm8sIGRldl9hZGRyLCBlcF9udW0sCisJCQkgICAgICBlcF90eXBlLCBlcF9kaXIsIG1wcyk7CisjaWYgMAorCURXQ19QUklOVEYKKwkgICAgKCJhZGRyID0gJWQsIGVwX251bSA9ICVkLCBlcF9kaXIgPSAweCV4LCBlcF90eXBlID0gMHgleCwgbXBzID0gJWRcbiIsCisJICAgICBkZXZfYWRkciwgZXBfbnVtLCBlcF9kaXIsIGVwX3R5cGUsIG1wcyk7CisjZW5kaWYKK30KKwordm9pZCBkd2Nfb3RnX2hjZF91cmJfc2V0X3BhcmFtcyhkd2Nfb3RnX2hjZF91cmJfdCAqIGR3Y19vdGdfdXJiLAorCQkJCXZvaWQgKnVyYl9oYW5kbGUsIHZvaWQgKmJ1ZiwgZHdjX2RtYV90IGRtYSwKKwkJCQl1aW50MzJfdCBidWZsZW4sIHZvaWQgKnNldHVwX3BhY2tldCwKKwkJCQlkd2NfZG1hX3Qgc2V0dXBfZG1hLCB1aW50MzJfdCBmbGFncywKKwkJCQl1aW50MTZfdCBpbnRlcnZhbCkKK3sKKwlkd2Nfb3RnX3VyYi0+cHJpdiA9IHVyYl9oYW5kbGU7CisJZHdjX290Z191cmItPmJ1ZiA9IGJ1ZjsKKwlkd2Nfb3RnX3VyYi0+ZG1hID0gZG1hOworCWR3Y19vdGdfdXJiLT5sZW5ndGggPSBidWZsZW47CisJZHdjX290Z191cmItPnNldHVwX3BhY2tldCA9IHNldHVwX3BhY2tldDsKKwlkd2Nfb3RnX3VyYi0+c2V0dXBfZG1hID0gc2V0dXBfZG1hOworCWR3Y19vdGdfdXJiLT5mbGFncyA9IGZsYWdzOworCWR3Y19vdGdfdXJiLT5pbnRlcnZhbCA9IGludGVydmFsOworCWR3Y19vdGdfdXJiLT5zdGF0dXMgPSAtRFdDX0VfSU5fUFJPR1JFU1M7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfaGNkX3VyYl9nZXRfc3RhdHVzKGR3Y19vdGdfaGNkX3VyYl90ICogZHdjX290Z191cmIpCit7CisJcmV0dXJuIGR3Y19vdGdfdXJiLT5zdGF0dXM7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfaGNkX3VyYl9nZXRfYWN0dWFsX2xlbmd0aChkd2Nfb3RnX2hjZF91cmJfdCAqIGR3Y19vdGdfdXJiKQoreworCXJldHVybiBkd2Nfb3RnX3VyYi0+YWN0dWFsX2xlbmd0aDsKK30KKwordWludDMyX3QgZHdjX290Z19oY2RfdXJiX2dldF9lcnJvcl9jb3VudChkd2Nfb3RnX2hjZF91cmJfdCAqIGR3Y19vdGdfdXJiKQoreworCXJldHVybiBkd2Nfb3RnX3VyYi0+ZXJyb3JfY291bnQ7Cit9CisKK3ZvaWQgZHdjX290Z19oY2RfdXJiX3NldF9pc29fZGVzY19wYXJhbXMoZHdjX290Z19oY2RfdXJiX3QgKiBkd2Nfb3RnX3VyYiwKKwkJCQkJIGludCBkZXNjX251bSwgdWludDMyX3Qgb2Zmc2V0LAorCQkJCQkgdWludDMyX3QgbGVuZ3RoKQoreworCWR3Y19vdGdfdXJiLT5pc29fZGVzY3NbZGVzY19udW1dLm9mZnNldCA9IG9mZnNldDsKKwlkd2Nfb3RnX3VyYi0+aXNvX2Rlc2NzW2Rlc2NfbnVtXS5sZW5ndGggPSBsZW5ndGg7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfaGNkX3VyYl9nZXRfaXNvX2Rlc2Nfc3RhdHVzKGR3Y19vdGdfaGNkX3VyYl90ICogZHdjX290Z191cmIsCisJCQkJCSAgICAgaW50IGRlc2NfbnVtKQoreworCXJldHVybiBkd2Nfb3RnX3VyYi0+aXNvX2Rlc2NzW2Rlc2NfbnVtXS5zdGF0dXM7Cit9CisKK3VpbnQzMl90IGR3Y19vdGdfaGNkX3VyYl9nZXRfaXNvX2Rlc2NfYWN0dWFsX2xlbmd0aChkd2Nfb3RnX2hjZF91cmJfdCAqCisJCQkJCQkgICAgZHdjX290Z191cmIsIGludCBkZXNjX251bSkKK3sKKwlyZXR1cm4gZHdjX290Z191cmItPmlzb19kZXNjc1tkZXNjX251bV0uYWN0dWFsX2xlbmd0aDsKK30KKworaW50IGR3Y19vdGdfaGNkX2lzX2JhbmR3aWR0aF9hbGxvY2F0ZWQoZHdjX290Z19oY2RfdCAqIGhjZCwgdm9pZCAqZXBfaGFuZGxlKQoreworCWludCBhbGxvY2F0ZWQgPSAwOworCWR3Y19vdGdfcWhfdCAqcWggPSAoZHdjX290Z19xaF90ICopIGVwX2hhbmRsZTsKKworCWlmIChxaCkgeworCQlpZiAoIURXQ19MSVNUX0VNUFRZKCZxaC0+cWhfbGlzdF9lbnRyeSkpIHsKKwkJCWFsbG9jYXRlZCA9IDE7CisJCX0KKwl9CisJcmV0dXJuIGFsbG9jYXRlZDsKK30KKworaW50IGR3Y19vdGdfaGNkX2lzX2JhbmR3aWR0aF9mcmVlZChkd2Nfb3RnX2hjZF90ICogaGNkLCB2b2lkICplcF9oYW5kbGUpCit7CisJZHdjX290Z19xaF90ICpxaCA9IChkd2Nfb3RnX3FoX3QgKikgZXBfaGFuZGxlOworCWludCBmcmVlZCA9IDA7CisJRFdDX0FTU0VSVChxaCwgInFoIGlzIG5vdCBhbGxvY2F0ZWRcbiIpOworCisJaWYgKERXQ19MSVNUX0VNUFRZKCZxaC0+cWhfbGlzdF9lbnRyeSkpIHsKKwkJZnJlZWQgPSAxOworCX0KKworCXJldHVybiBmcmVlZDsKK30KKwordWludDhfdCBkd2Nfb3RnX2hjZF9nZXRfZXBfYmFuZHdpZHRoKGR3Y19vdGdfaGNkX3QgKiBoY2QsIHZvaWQgKmVwX2hhbmRsZSkKK3sKKwlkd2Nfb3RnX3FoX3QgKnFoID0gKGR3Y19vdGdfcWhfdCAqKSBlcF9oYW5kbGU7CisJRFdDX0FTU0VSVChxaCwgInFoIGlzIG5vdCBhbGxvY2F0ZWRcbiIpOworCXJldHVybiBxaC0+dXNlY3M7Cit9CisKK3ZvaWQgZHdjX290Z19oY2RfZHVtcF9zdGF0ZShkd2Nfb3RnX2hjZF90ICogaGNkKQoreworI2lmZGVmIERFQlVHCisJaW50IG51bV9jaGFubmVsczsKKwlpbnQgaTsKKwlnbnB0eHN0c19kYXRhX3QgbnBfdHhfc3RhdHVzOworCWhwdHhzdHNfZGF0YV90IHBfdHhfc3RhdHVzOworCisJbnVtX2NoYW5uZWxzID0gaGNkLT5jb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9jaGFubmVsczsKKwlEV0NfUFJJTlRGKCJcbiIpOworCURXQ19QUklOVEYKKwkgICAgKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOworCURXQ19QUklOVEYoIkhDRCBTdGF0ZTpcbiIpOworCURXQ19QUklOVEYoIiAgTnVtIGNoYW5uZWxzOiAlZFxuIiwgbnVtX2NoYW5uZWxzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJZHdjX2hjX3QgKmhjID0gaGNkLT5oY19wdHJfYXJyYXlbaV07CisJCURXQ19QUklOVEYoIiAgQ2hhbm5lbCAlZDpcbiIsIGkpOworCQlEV0NfUFJJTlRGKCIgICAgZGV2X2FkZHI6ICVkLCBlcF9udW06ICVkLCBlcF9pc19pbjogJWRcbiIsCisJCQkgICBoYy0+ZGV2X2FkZHIsIGhjLT5lcF9udW0sIGhjLT5lcF9pc19pbik7CisJCURXQ19QUklOVEYoIiAgICBzcGVlZDogJWRcbiIsIGhjLT5zcGVlZCk7CisJCURXQ19QUklOVEYoIiAgICBlcF90eXBlOiAlZFxuIiwgaGMtPmVwX3R5cGUpOworCQlEV0NfUFJJTlRGKCIgICAgbWF4X3BhY2tldDogJWRcbiIsIGhjLT5tYXhfcGFja2V0KTsKKwkJRFdDX1BSSU5URigiICAgIGRhdGFfcGlkX3N0YXJ0OiAlZFxuIiwgaGMtPmRhdGFfcGlkX3N0YXJ0KTsKKwkJRFdDX1BSSU5URigiICAgIG11bHRpX2NvdW50OiAlZFxuIiwgaGMtPm11bHRpX2NvdW50KTsKKwkJRFdDX1BSSU5URigiICAgIHhmZXJfc3RhcnRlZDogJWRcbiIsIGhjLT54ZmVyX3N0YXJ0ZWQpOworCQlEV0NfUFJJTlRGKCIgICAgeGZlcl9idWZmOiAlcFxuIiwgaGMtPnhmZXJfYnVmZik7CisJCURXQ19QUklOVEYoIiAgICB4ZmVyX2xlbjogJWRcbiIsIGhjLT54ZmVyX2xlbik7CisJCURXQ19QUklOVEYoIiAgICB4ZmVyX2NvdW50OiAlZFxuIiwgaGMtPnhmZXJfY291bnQpOworCQlEV0NfUFJJTlRGKCIgICAgaGFsdF9vbl9xdWV1ZTogJWRcbiIsIGhjLT5oYWx0X29uX3F1ZXVlKTsKKwkJRFdDX1BSSU5URigiICAgIGhhbHRfcGVuZGluZzogJWRcbiIsIGhjLT5oYWx0X3BlbmRpbmcpOworCQlEV0NfUFJJTlRGKCIgICAgaGFsdF9zdGF0dXM6ICVkXG4iLCBoYy0+aGFsdF9zdGF0dXMpOworCQlEV0NfUFJJTlRGKCIgICAgZG9fc3BsaXQ6ICVkXG4iLCBoYy0+ZG9fc3BsaXQpOworCQlEV0NfUFJJTlRGKCIgICAgY29tcGxldGVfc3BsaXQ6ICVkXG4iLCBoYy0+Y29tcGxldGVfc3BsaXQpOworCQlEV0NfUFJJTlRGKCIgICAgaHViX2FkZHI6ICVkXG4iLCBoYy0+aHViX2FkZHIpOworCQlEV0NfUFJJTlRGKCIgICAgcG9ydF9hZGRyOiAlZFxuIiwgaGMtPnBvcnRfYWRkcik7CisJCURXQ19QUklOVEYoIiAgICB4YWN0X3BvczogJWRcbiIsIGhjLT54YWN0X3Bvcyk7CisJCURXQ19QUklOVEYoIiAgICByZXF1ZXN0czogJWRcbiIsIGhjLT5yZXF1ZXN0cyk7CisJCURXQ19QUklOVEYoIiAgICBxaDogJXBcbiIsIGhjLT5xaCk7CisJCWlmIChoYy0+eGZlcl9zdGFydGVkKSB7CisJCQloZm51bV9kYXRhX3QgaGZudW07CisJCQloY2NoYXJfZGF0YV90IGhjY2hhcjsKKwkJCWhjdHNpel9kYXRhX3QgaGN0c2l6OworCQkJaGNpbnRfZGF0YV90IGhjaW50OworCQkJaGNpbnRtc2tfZGF0YV90IGhjaW50bXNrOworCQkJaGZudW0uZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmaGNkLT5jb3JlX2lmLT4KKwkJCQkJICAgaG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGZudW0pOworCQkJaGNjaGFyLmQzMiA9CisJCQkgICAgRFdDX1JFQURfUkVHMzIoJmhjZC0+Y29yZV9pZi0+aG9zdF9pZi0+CisJCQkJCSAgIGhjX3JlZ3NbaV0tPmhjY2hhcik7CisJCQloY3RzaXouZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmaGNkLT5jb3JlX2lmLT5ob3N0X2lmLT4KKwkJCQkJICAgaGNfcmVnc1tpXS0+aGN0c2l6KTsKKwkJCWhjaW50LmQzMiA9CisJCQkgICAgRFdDX1JFQURfUkVHMzIoJmhjZC0+Y29yZV9pZi0+aG9zdF9pZi0+CisJCQkJCSAgIGhjX3JlZ3NbaV0tPmhjaW50KTsKKwkJCWhjaW50bXNrLmQzMiA9CisJCQkgICAgRFdDX1JFQURfUkVHMzIoJmhjZC0+Y29yZV9pZi0+aG9zdF9pZi0+CisJCQkJCSAgIGhjX3JlZ3NbaV0tPmhjaW50bXNrKTsKKwkJCURXQ19QUklOVEYoIiAgICBoZm51bTogMHglMDh4XG4iLCBoZm51bS5kMzIpOworCQkJRFdDX1BSSU5URigiICAgIGhjY2hhcjogMHglMDh4XG4iLCBoY2NoYXIuZDMyKTsKKwkJCURXQ19QUklOVEYoIiAgICBoY3RzaXo6IDB4JTA4eFxuIiwgaGN0c2l6LmQzMik7CisJCQlEV0NfUFJJTlRGKCIgICAgaGNpbnQ6IDB4JTA4eFxuIiwgaGNpbnQuZDMyKTsKKwkJCURXQ19QUklOVEYoIiAgICBoY2ludG1zazogMHglMDh4XG4iLCBoY2ludG1zay5kMzIpOworCQl9CisJCWlmIChoYy0+eGZlcl9zdGFydGVkICYmIGhjLT5xaCkgeworCQkJZHdjX290Z19xdGRfdCAqcXRkOworCQkJZHdjX290Z19oY2RfdXJiX3QgKnVyYjsKKwkJCQorCQkJRFdDX0NJUkNMRVFfRk9SRUFDSChxdGQsICZoYy0+cWgtPnF0ZF9saXN0LCBxdGRfbGlzdF9lbnRyeSkgeworCQkJCWlmICghcXRkLT5pbl9wcm9jZXNzKQorCQkJCQlicmVhazsKKwkJCQkKKwkJCQl1cmIgPSBxdGQtPnVyYjsKKwkJCURXQ19QUklOVEYoIiAgICBVUkIgSW5mbzpcbiIpOworCQkJRFdDX1BSSU5URigiICAgICAgcXRkOiAlcCwgdXJiOiAlcFxuIiwgcXRkLCB1cmIpOworCQkJaWYgKHVyYikgeworCQkJCURXQ19QUklOVEYoIiAgICAgIERldjogJWQsIEVQOiAlZCAlc1xuIiwKKwkJCQkJICAgZHdjX290Z19oY2RfZ2V0X2Rldl9hZGRyKCZ1cmItPgorCQkJCQkJCQkgICAgcGlwZV9pbmZvKSwKKwkJCQkJICAgZHdjX290Z19oY2RfZ2V0X2VwX251bSgmdXJiLT4KKwkJCQkJCQkJICBwaXBlX2luZm8pLAorCQkJCQkgICBkd2Nfb3RnX2hjZF9pc19waXBlX2luKCZ1cmItPgorCQkJCQkJCQkgIHBpcGVfaW5mbykgPworCQkJCQkgICAiSU4iIDogIk9VVCIpOworCQkJCURXQ19QUklOVEYoIiAgICAgIE1heCBwYWNrZXQgc2l6ZTogJWRcbiIsCisJCQkJCSAgIGR3Y19vdGdfaGNkX2dldF9tcHMoJnVyYi0+CisJCQkJCQkJICAgICAgIHBpcGVfaW5mbykpOworCQkJCURXQ19QUklOVEYoIiAgICAgIHRyYW5zZmVyX2J1ZmZlcjogJXBcbiIsCisJCQkJCSAgIHVyYi0+YnVmKTsKKwkJCQlEV0NfUFJJTlRGKCIgICAgICB0cmFuc2Zlcl9kbWE6ICVwXG4iLAorCQkJCQkgICAodm9pZCAqKXVyYi0+ZG1hKTsKKwkJCQlEV0NfUFJJTlRGKCIgICAgICB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOiAlZFxuIiwKKwkJCQkJICAgdXJiLT5sZW5ndGgpOworCQkJCQlEV0NfUFJJTlRGKCIgICAgICBhY3R1YWxfbGVuZ3RoOiAlZFxuIiwKKwkJCQkJCSAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCURXQ19QUklOVEYoIiAgbm9uX3BlcmlvZGljX2NoYW5uZWxzOiAlZFxuIiwgaGNkLT5ub25fcGVyaW9kaWNfY2hhbm5lbHMpOworCURXQ19QUklOVEYoIiAgcGVyaW9kaWNfY2hhbm5lbHM6ICVkXG4iLCBoY2QtPnBlcmlvZGljX2NoYW5uZWxzKTsKKwlEV0NfUFJJTlRGKCIgIHBlcmlvZGljX3VzZWNzOiAlZFxuIiwgaGNkLT5wZXJpb2RpY191c2Vjcyk7CisJbnBfdHhfc3RhdHVzLmQzMiA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZoY2QtPmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmducHR4c3RzKTsKKwlEV0NfUFJJTlRGKCIgIE5QIFR4IFJlcSBRdWV1ZSBTcGFjZSBBdmFpbDogJWRcbiIsCisJCSAgIG5wX3R4X3N0YXR1cy5iLm5wdHhxc3BjYXZhaWwpOworCURXQ19QUklOVEYoIiAgTlAgVHggRklGTyBTcGFjZSBBdmFpbDogJWRcbiIsCisJCSAgIG5wX3R4X3N0YXR1cy5iLm5wdHhmc3BjYXZhaWwpOworCXBfdHhfc3RhdHVzLmQzMiA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZoY2QtPmNvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3MtPmhwdHhzdHMpOworCURXQ19QUklOVEYoIiAgUCBUeCBSZXEgUXVldWUgU3BhY2UgQXZhaWw6ICVkXG4iLAorCQkgICBwX3R4X3N0YXR1cy5iLnB0eHFzcGNhdmFpbCk7CisJRFdDX1BSSU5URigiICBQIFR4IEZJRk8gU3BhY2UgQXZhaWw6ICVkXG4iLCBwX3R4X3N0YXR1cy5iLnB0eGZzcGNhdmFpbCk7CisJZHdjX290Z19oY2RfZHVtcF9mcnJlbShoY2QpOworCWR3Y19vdGdfZHVtcF9nbG9iYWxfcmVnaXN0ZXJzKGhjZC0+Y29yZV9pZik7CisJZHdjX290Z19kdW1wX2hvc3RfcmVnaXN0ZXJzKGhjZC0+Y29yZV9pZik7CisJRFdDX1BSSU5URgorCSAgICAoIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CisJRFdDX1BSSU5URigiXG4iKTsKKyNlbmRpZgorfQorCisjaWZkZWYgREVCVUcKK3ZvaWQgZHdjX3ByaW50X3NldHVwX2RhdGEodWludDhfdCAqIHNldHVwKQoreworCWludCBpOworCWlmIChDSEtfREVCVUdfTEVWRUwoREJHX0hDRCkpIHsKKwkJRFdDX1BSSU5URigiU2V0dXAgRGF0YSA9IE1TQiAiKTsKKwkJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pCisJCQlEV0NfUFJJTlRGKCIlMDJ4ICIsIHNldHVwW2ldKTsKKwkJRFdDX1BSSU5URigiXG4iKTsKKwkJRFdDX1BSSU5URigiICBibVJlcXVlc3RUeXBlIFRyYW5mZXIgPSAlc1xuIiwKKwkJCSAgIChzZXR1cFswXSAmIDB4ODApID8gIkRldmljZS10by1Ib3N0IiA6CisJCQkgICAiSG9zdC10by1EZXZpY2UiKTsKKwkJRFdDX1BSSU5URigiICBibVJlcXVlc3RUeXBlIFR5cGUgPSAiKTsKKwkJc3dpdGNoICgoc2V0dXBbMF0gJiAweDYwKSA+PiA1KSB7CisJCWNhc2UgMDoKKwkJCURXQ19QUklOVEYoIlN0YW5kYXJkXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlEV0NfUFJJTlRGKCJDbGFzc1xuIik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJRFdDX1BSSU5URigiVmVuZG9yXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlEV0NfUFJJTlRGKCJSZXNlcnZlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlEV0NfUFJJTlRGKCIgIGJtUmVxdWVzdFR5cGUgUmVjaXBpZW50ID0gIik7CisJCXN3aXRjaCAoc2V0dXBbMF0gJiAweDFmKSB7CisJCWNhc2UgMDoKKwkJCURXQ19QUklOVEYoIkRldmljZVxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJRFdDX1BSSU5URigiSW50ZXJmYWNlXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlEV0NfUFJJTlRGKCJFbmRwb2ludFxuIik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJRFdDX1BSSU5URigiT3RoZXJcbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEV0NfUFJJTlRGKCJSZXNlcnZlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlEV0NfUFJJTlRGKCIgIGJSZXF1ZXN0ID0gMHglMHhcbiIsIHNldHVwWzFdKTsKKwkJRFdDX1BSSU5URigiICB3VmFsdWUgPSAweCUweFxuIiwgKigodWludDE2X3QgKikgJiBzZXR1cFsyXSkpOworCQlEV0NfUFJJTlRGKCIgIHdJbmRleCA9IDB4JTB4XG4iLCAqKCh1aW50MTZfdCAqKSAmIHNldHVwWzRdKSk7CisJCURXQ19QUklOVEYoIiAgd0xlbmd0aCA9IDB4JTB4XG5cbiIsICooKHVpbnQxNl90ICopICYgc2V0dXBbNl0pKTsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBkd2Nfb3RnX2hjZF9kdW1wX2ZycmVtKGR3Y19vdGdfaGNkX3QgKiBoY2QpCit7CisjaWYgMAorCURXQ19QUklOVEYoIkZyYW1lIHJlbWFpbmluZyBhdCBTT0Y6XG4iKTsKKwlEV0NfUFJJTlRGKCIgIHNhbXBsZXMgJXUsIGFjY3VtICVsbHUsIGF2ZyAlbGx1XG4iLAorCQkgICBoY2QtPmZycmVtX3NhbXBsZXMsIGhjZC0+ZnJyZW1fYWNjdW0sCisJCSAgIChoY2QtPmZycmVtX3NhbXBsZXMgPiAwKSA/CisJCSAgIGhjZC0+ZnJyZW1fYWNjdW0gLyBoY2QtPmZycmVtX3NhbXBsZXMgOiAwKTsKKworCURXQ19QUklOVEYoIlxuIik7CisJRFdDX1BSSU5URigiRnJhbWUgcmVtYWluaW5nIGF0IHN0YXJ0X3RyYW5zZmVyICh1ZnJhbWUgNyk6XG4iKTsKKwlEV0NfUFJJTlRGKCIgIHNhbXBsZXMgJXUsIGFjY3VtICVsbHUsIGF2ZyAlbGx1XG4iLAorCQkgICBoY2QtPmNvcmVfaWYtPmhmbnVtXzdfc2FtcGxlcywKKwkJICAgaGNkLT5jb3JlX2lmLT5oZm51bV83X2ZycmVtX2FjY3VtLAorCQkgICAoaGNkLT5jb3JlX2lmLT5oZm51bV83X3NhbXBsZXMgPgorCQkgICAgMCkgPyBoY2QtPmNvcmVfaWYtPmhmbnVtXzdfZnJyZW1fYWNjdW0gLworCQkgICBoY2QtPmNvcmVfaWYtPmhmbnVtXzdfc2FtcGxlcyA6IDApOworCURXQ19QUklOVEYoIkZyYW1lIHJlbWFpbmluZyBhdCBzdGFydF90cmFuc2ZlciAodWZyYW1lIDApOlxuIik7CisJRFdDX1BSSU5URigiICBzYW1wbGVzICV1LCBhY2N1bSAlbGx1LCBhdmcgJWxsdVxuIiwKKwkJICAgaGNkLT5jb3JlX2lmLT5oZm51bV8wX3NhbXBsZXMsCisJCSAgIGhjZC0+Y29yZV9pZi0+aGZudW1fMF9mcnJlbV9hY2N1bSwKKwkJICAgKGhjZC0+Y29yZV9pZi0+aGZudW1fMF9zYW1wbGVzID4KKwkJICAgIDApID8gaGNkLT5jb3JlX2lmLT5oZm51bV8wX2ZycmVtX2FjY3VtIC8KKwkJICAgaGNkLT5jb3JlX2lmLT5oZm51bV8wX3NhbXBsZXMgOiAwKTsKKwlEV0NfUFJJTlRGKCJGcmFtZSByZW1haW5pbmcgYXQgc3RhcnRfdHJhbnNmZXIgKHVmcmFtZSAxLTYpOlxuIik7CisJRFdDX1BSSU5URigiICBzYW1wbGVzICV1LCBhY2N1bSAlbGx1LCBhdmcgJWxsdVxuIiwKKwkJICAgaGNkLT5jb3JlX2lmLT5oZm51bV9vdGhlcl9zYW1wbGVzLAorCQkgICBoY2QtPmNvcmVfaWYtPmhmbnVtX290aGVyX2ZycmVtX2FjY3VtLAorCQkgICAoaGNkLT5jb3JlX2lmLT5oZm51bV9vdGhlcl9zYW1wbGVzID4KKwkJICAgIDApID8gaGNkLT5jb3JlX2lmLT5oZm51bV9vdGhlcl9mcnJlbV9hY2N1bSAvCisJCSAgIGhjZC0+Y29yZV9pZi0+aGZudW1fb3RoZXJfc2FtcGxlcyA6IDApOworCisJRFdDX1BSSU5URigiXG4iKTsKKwlEV0NfUFJJTlRGKCJGcmFtZSByZW1haW5pbmcgYXQgc2FtcGxlIHBvaW50IEEgKHVmcmFtZSA3KTpcbiIpOworCURXQ19QUklOVEYoIiAgc2FtcGxlcyAldSwgYWNjdW0gJWxsdSwgYXZnICVsbHVcbiIsCisJCSAgIGhjZC0+aGZudW1fN19zYW1wbGVzX2EsIGhjZC0+aGZudW1fN19mcnJlbV9hY2N1bV9hLAorCQkgICAoaGNkLT5oZm51bV83X3NhbXBsZXNfYSA+IDApID8KKwkJICAgaGNkLT5oZm51bV83X2ZycmVtX2FjY3VtX2EgLyBoY2QtPmhmbnVtXzdfc2FtcGxlc19hIDogMCk7CisJRFdDX1BSSU5URigiRnJhbWUgcmVtYWluaW5nIGF0IHNhbXBsZSBwb2ludCBBICh1ZnJhbWUgMCk6XG4iKTsKKwlEV0NfUFJJTlRGKCIgIHNhbXBsZXMgJXUsIGFjY3VtICVsbHUsIGF2ZyAlbGx1XG4iLAorCQkgICBoY2QtPmhmbnVtXzBfc2FtcGxlc19hLCBoY2QtPmhmbnVtXzBfZnJyZW1fYWNjdW1fYSwKKwkJICAgKGhjZC0+aGZudW1fMF9zYW1wbGVzX2EgPiAwKSA/CisJCSAgIGhjZC0+aGZudW1fMF9mcnJlbV9hY2N1bV9hIC8gaGNkLT5oZm51bV8wX3NhbXBsZXNfYSA6IDApOworCURXQ19QUklOVEYoIkZyYW1lIHJlbWFpbmluZyBhdCBzYW1wbGUgcG9pbnQgQSAodWZyYW1lIDEtNik6XG4iKTsKKwlEV0NfUFJJTlRGKCIgIHNhbXBsZXMgJXUsIGFjY3VtICVsbHUsIGF2ZyAlbGx1XG4iLAorCQkgICBoY2QtPmhmbnVtX290aGVyX3NhbXBsZXNfYSwgaGNkLT5oZm51bV9vdGhlcl9mcnJlbV9hY2N1bV9hLAorCQkgICAoaGNkLT5oZm51bV9vdGhlcl9zYW1wbGVzX2EgPiAwKSA/CisJCSAgIGhjZC0+aGZudW1fb3RoZXJfZnJyZW1fYWNjdW1fYSAvCisJCSAgIGhjZC0+aGZudW1fb3RoZXJfc2FtcGxlc19hIDogMCk7CisKKwlEV0NfUFJJTlRGKCJcbiIpOworCURXQ19QUklOVEYoIkZyYW1lIHJlbWFpbmluZyBhdCBzYW1wbGUgcG9pbnQgQiAodWZyYW1lIDcpOlxuIik7CisJRFdDX1BSSU5URigiICBzYW1wbGVzICV1LCBhY2N1bSAlbGx1LCBhdmcgJWxsdVxuIiwKKwkJICAgaGNkLT5oZm51bV83X3NhbXBsZXNfYiwgaGNkLT5oZm51bV83X2ZycmVtX2FjY3VtX2IsCisJCSAgIChoY2QtPmhmbnVtXzdfc2FtcGxlc19iID4gMCkgPworCQkgICBoY2QtPmhmbnVtXzdfZnJyZW1fYWNjdW1fYiAvIGhjZC0+aGZudW1fN19zYW1wbGVzX2IgOiAwKTsKKwlEV0NfUFJJTlRGKCJGcmFtZSByZW1haW5pbmcgYXQgc2FtcGxlIHBvaW50IEIgKHVmcmFtZSAwKTpcbiIpOworCURXQ19QUklOVEYoIiAgc2FtcGxlcyAldSwgYWNjdW0gJWxsdSwgYXZnICVsbHVcbiIsCisJCSAgIGhjZC0+aGZudW1fMF9zYW1wbGVzX2IsIGhjZC0+aGZudW1fMF9mcnJlbV9hY2N1bV9iLAorCQkgICAoaGNkLT5oZm51bV8wX3NhbXBsZXNfYiA+IDApID8KKwkJICAgaGNkLT5oZm51bV8wX2ZycmVtX2FjY3VtX2IgLyBoY2QtPmhmbnVtXzBfc2FtcGxlc19iIDogMCk7CisJRFdDX1BSSU5URigiRnJhbWUgcmVtYWluaW5nIGF0IHNhbXBsZSBwb2ludCBCICh1ZnJhbWUgMS02KTpcbiIpOworCURXQ19QUklOVEYoIiAgc2FtcGxlcyAldSwgYWNjdW0gJWxsdSwgYXZnICVsbHVcbiIsCisJCSAgIGhjZC0+aGZudW1fb3RoZXJfc2FtcGxlc19iLCBoY2QtPmhmbnVtX290aGVyX2ZycmVtX2FjY3VtX2IsCisJCSAgIChoY2QtPmhmbnVtX290aGVyX3NhbXBsZXNfYiA+IDApID8KKwkJICAgaGNkLT5oZm51bV9vdGhlcl9mcnJlbV9hY2N1bV9iIC8KKwkJICAgaGNkLT5oZm51bV9vdGhlcl9zYW1wbGVzX2IgOiAwKTsKKyNlbmRpZgorfQorCisjZW5kaWYgLyogRFdDX0RFVklDRV9PTkxZICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfaGNkLmggYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfaGNkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhMTI5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19oY2QuaApAQCAtMCwwICsxLDgwMyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9vdGcvbGludXgvZHJpdmVycy9kd2Nfb3RnX2hjZC5oICQKKyAqICRSZXZpc2lvbjogIzU4ICQKKyAqICREYXRlOiAyMDExLzA5LzE1ICQKKyAqICRDaGFuZ2U6IDE4NDY2NDcgJAorICoKKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWZuZGVmIERXQ19ERVZJQ0VfT05MWQorI2lmbmRlZiBfX0RXQ19IQ0RfSF9fCisjZGVmaW5lIF9fRFdDX0hDRF9IX18KKworI2luY2x1ZGUgImR3Y19vdGdfb3NfZGVwLmgiCisjaW5jbHVkZSAidXNiLmgiCisjaW5jbHVkZSAiZHdjX290Z19oY2RfaWYuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2NvcmVfaWYuaCIKKyNpbmNsdWRlICJkd2NfbGlzdC5oIgorI2luY2x1ZGUgImR3Y19vdGdfY2lsLmgiCisKKy8qKgorICogQGZpbGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMsIGNvbnN0YW50cywgYW5kIGludGVyZmFjZXMgZm9yCisgKiB0aGUgSG9zdCBDb250b2xsZXIgRHJpdmVyIChIQ0QpLgorICoKKyAqIFRoZSBIb3N0IENvbnRyb2xsZXIgRHJpdmVyIChIQ0QpIGlzIHJlc3BvbnNpYmxlIGZvciB0cmFuc2xhdGluZyByZXF1ZXN0cworICogZnJvbSB0aGUgVVNCIERyaXZlciBpbnRvIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb25zIG9uIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKiBJdCBpc29sYXRlcyB0aGUgVVNCRCBmcm9tIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGNvbnRyb2xsZXIgYnkgcHJvdmlkaW5nIGFuCisgKiBBUEkgdG8gdGhlIFVTQkQuCisgKi8KKworc3RydWN0IGR3Y19vdGdfaGNkX3BpcGVfaW5mbyB7CisJdWludDhfdCBkZXZfYWRkcjsKKwl1aW50OF90IGVwX251bTsKKwl1aW50OF90IHBpcGVfdHlwZTsKKwl1aW50OF90IHBpcGVfZGlyOworCXVpbnQxNl90IG1wczsKK307CisKK3N0cnVjdCBkd2Nfb3RnX2hjZF9pc29fcGFja2V0X2Rlc2MgeworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBsZW5ndGg7CisJdWludDMyX3QgYWN0dWFsX2xlbmd0aDsKKwl1aW50MzJfdCBzdGF0dXM7Cit9OworCitzdHJ1Y3QgZHdjX290Z19xdGQ7CisKK3N0cnVjdCBkd2Nfb3RnX2hjZF91cmIgeworCXZvaWQgKnByaXY7CisJc3RydWN0IGR3Y19vdGdfcXRkICpxdGQ7CisJdm9pZCAqYnVmOworCWR3Y19kbWFfdCBkbWE7CisJdm9pZCAqc2V0dXBfcGFja2V0OworCWR3Y19kbWFfdCBzZXR1cF9kbWE7CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQzMl90IGFjdHVhbF9sZW5ndGg7CisJdWludDMyX3Qgc3RhdHVzOworCXVpbnQzMl90IGVycm9yX2NvdW50OworCXVpbnQzMl90IHBhY2tldF9jb3VudDsKKwl1aW50MzJfdCBmbGFnczsKKwl1aW50MTZfdCBpbnRlcnZhbDsKKwlzdHJ1Y3QgZHdjX290Z19oY2RfcGlwZV9pbmZvIHBpcGVfaW5mbzsKKwlzdHJ1Y3QgZHdjX290Z19oY2RfaXNvX3BhY2tldF9kZXNjIGlzb19kZXNjc1swXTsKK307CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBkd2Nfb3RnX2hjZF9nZXRfZXBfbnVtKHN0cnVjdCBkd2Nfb3RnX2hjZF9waXBlX2luZm8gKnBpcGUpCit7CisJcmV0dXJuIHBpcGUtPmVwX251bTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IGR3Y19vdGdfaGNkX2dldF9waXBlX3R5cGUoc3RydWN0IGR3Y19vdGdfaGNkX3BpcGVfaW5mbworCQkJCQkJKnBpcGUpCit7CisJcmV0dXJuIHBpcGUtPnBpcGVfdHlwZTsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBkd2Nfb3RnX2hjZF9nZXRfbXBzKHN0cnVjdCBkd2Nfb3RnX2hjZF9waXBlX2luZm8gKnBpcGUpCit7CisJcmV0dXJuIHBpcGUtPm1wczsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IGR3Y19vdGdfaGNkX2dldF9kZXZfYWRkcihzdHJ1Y3QgZHdjX290Z19oY2RfcGlwZV9pbmZvCisJCQkJCSAgICAgICAqcGlwZSkKK3sKKwlyZXR1cm4gcGlwZS0+ZGV2X2FkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBkd2Nfb3RnX2hjZF9pc19waXBlX2lzb2Moc3RydWN0IGR3Y19vdGdfaGNkX3BpcGVfaW5mbworCQkJCQkgICAgICAgKnBpcGUpCit7CisJcmV0dXJuIChwaXBlLT5waXBlX3R5cGUgPT0gVUVfSVNPQ0hST05PVVMpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZHdjX290Z19oY2RfaXNfcGlwZV9pbnQoc3RydWN0IGR3Y19vdGdfaGNkX3BpcGVfaW5mbworCQkJCQkgICAgICAqcGlwZSkKK3sKKwlyZXR1cm4gKHBpcGUtPnBpcGVfdHlwZSA9PSBVRV9JTlRFUlJVUFQpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZHdjX290Z19oY2RfaXNfcGlwZV9idWxrKHN0cnVjdCBkd2Nfb3RnX2hjZF9waXBlX2luZm8KKwkJCQkJICAgICAgICpwaXBlKQoreworCXJldHVybiAocGlwZS0+cGlwZV90eXBlID09IFVFX0JVTEspOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZHdjX290Z19oY2RfaXNfcGlwZV9jb250cm9sKHN0cnVjdCBkd2Nfb3RnX2hjZF9waXBlX2luZm8KKwkJCQkJCSAgKnBpcGUpCit7CisJcmV0dXJuIChwaXBlLT5waXBlX3R5cGUgPT0gVUVfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBkd2Nfb3RnX2hjZF9pc19waXBlX2luKHN0cnVjdCBkd2Nfb3RnX2hjZF9waXBlX2luZm8gKnBpcGUpCit7CisJcmV0dXJuIChwaXBlLT5waXBlX2RpciA9PSBVRV9ESVJfSU4pOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZHdjX290Z19oY2RfaXNfcGlwZV9vdXQoc3RydWN0IGR3Y19vdGdfaGNkX3BpcGVfaW5mbworCQkJCQkgICAgICAqcGlwZSkKK3sKKwlyZXR1cm4gKCFkd2Nfb3RnX2hjZF9pc19waXBlX2luKHBpcGUpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR3Y19vdGdfaGNkX2ZpbGxfcGlwZShzdHJ1Y3QgZHdjX290Z19oY2RfcGlwZV9pbmZvICpwaXBlLAorCQkJCQkgdWludDhfdCBkZXZhZGRyLCB1aW50OF90IGVwX251bSwKKwkJCQkJIHVpbnQ4X3QgcGlwZV90eXBlLCB1aW50OF90IHBpcGVfZGlyLAorCQkJCQkgdWludDE2X3QgbXBzKQoreworCXBpcGUtPmRldl9hZGRyID0gZGV2YWRkcjsKKwlwaXBlLT5lcF9udW0gPSBlcF9udW07CisJcGlwZS0+cGlwZV90eXBlID0gcGlwZV90eXBlOworCXBpcGUtPnBpcGVfZGlyID0gcGlwZV9kaXI7CisJcGlwZS0+bXBzID0gbXBzOworfQorCisvKioKKyAqIFBoYXNlcyBmb3IgY29udHJvbCB0cmFuc2ZlcnMuCisgKi8KK3R5cGVkZWYgZW51bSBkd2Nfb3RnX2NvbnRyb2xfcGhhc2UgeworCURXQ19PVEdfQ09OVFJPTF9TRVRVUCwKKwlEV0NfT1RHX0NPTlRST0xfREFUQSwKKwlEV0NfT1RHX0NPTlRST0xfU1RBVFVTCit9IGR3Y19vdGdfY29udHJvbF9waGFzZV9lOworCisvKiogVHJhbnNhY3Rpb24gdHlwZXMuICovCit0eXBlZGVmIGVudW0gZHdjX290Z190cmFuc2FjdGlvbl90eXBlIHsKKwlEV0NfT1RHX1RSQU5TQUNUSU9OX05PTkUsCisJRFdDX09UR19UUkFOU0FDVElPTl9QRVJJT0RJQywKKwlEV0NfT1RHX1RSQU5TQUNUSU9OX05PTl9QRVJJT0RJQywKKwlEV0NfT1RHX1RSQU5TQUNUSU9OX0FMTAorfSBkd2Nfb3RnX3RyYW5zYWN0aW9uX3R5cGVfZTsKKworc3RydWN0IGR3Y19vdGdfcWg7CisKKy8qKgorICogQSBRdWV1ZSBUcmFuc2ZlciBEZXNjcmlwdG9yIChRVEQpIGhvbGRzIHRoZSBzdGF0ZSBvZiBhIGJ1bGssIGNvbnRyb2wsCisgKiBpbnRlcnJ1cHQsIG9yIGlzb2Nocm9ub3VzIHRyYW5zZmVyLiBBIHNpbmdsZSBRVEQgaXMgY3JlYXRlZCBmb3IgZWFjaCBVUkIKKyAqIChvZiBvbmUgb2YgdGhlc2UgdHlwZXMpIHN1Ym1pdHRlZCB0byB0aGUgSENELiBUaGUgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoCisgKiBhIFFURCBtYXkgcmVxdWlyZSBvbmUgb3IgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLgorICoKKyAqIEEgUVREIGlzIGxpbmtlZCB0byBhIFF1ZXVlIEhlYWQsIHdoaWNoIGlzIGVudGVyZWQgaW4gZWl0aGVyIHRoZQorICogbm9uLXBlcmlvZGljIG9yIHBlcmlvZGljIHNjaGVkdWxlIGZvciBleGVjdXRpb24uIFdoZW4gYSBRVEQgaXMgY2hvc2VuIGZvcgorICogZXhlY3V0aW9uLCBzb21lIG9yIGFsbCBvZiBpdHMgdHJhbnNhY3Rpb25zIG1heSBiZSBleGVjdXRlZC4gQWZ0ZXIKKyAqIGV4ZWN1dGlvbiwgdGhlIHN0YXRlIG9mIHRoZSBRVEQgaXMgdXBkYXRlZC4gVGhlIFFURCBtYXkgYmUgcmV0aXJlZCBpZiBhbGwKKyAqIGl0cyB0cmFuc2FjdGlvbnMgYXJlIGNvbXBsZXRlIG9yIGlmIGFuIGVycm9yIG9jY3VycmVkLiBPdGhlcndpc2UsIGl0CisgKiByZW1haW5zIGluIHRoZSBzY2hlZHVsZSBzbyBtb3JlIHRyYW5zYWN0aW9ucyBjYW4gYmUgZXhlY3V0ZWQgbGF0ZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y19vdGdfcXRkIHsKKwkvKioKKwkgKiBEZXRlcm1pbmVzIHRoZSBQSUQgb2YgdGhlIG5leHQgZGF0YSBwYWNrZXQgZm9yIHRoZSBkYXRhIHBoYXNlIG9mCisJICogY29udHJvbCB0cmFuc2ZlcnMuIElnbm9yZWQgZm9yIG90aGVyIHRyYW5zZmVyIHR5cGVzLjxicj4KKwkgKiBPbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisJICoJLSBEV0NfT1RHX0hDX1BJRF9EQVRBMAorCSAqCS0gRFdDX09UR19IQ19QSURfREFUQTEKKwkgKi8KKwl1aW50OF90IGRhdGFfdG9nZ2xlOworCisJLyoqIEN1cnJlbnQgcGhhc2UgZm9yIGNvbnRyb2wgdHJhbnNmZXJzIChTZXR1cCwgRGF0YSwgb3IgU3RhdHVzKS4gKi8KKwlkd2Nfb3RnX2NvbnRyb2xfcGhhc2VfZSBjb250cm9sX3BoYXNlOworCisJLyoqIEtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgc3BsaXQgdHlwZQorCSAqIGZvciBGUy9MUyBlbmRwb2ludHMgb24gYSBIUyBIdWIgKi8KKwl1aW50OF90IGNvbXBsZXRlX3NwbGl0OworCisJLyoqIEhvdyBtYW55IGJ5dGVzIHRyYW5zZmVycmVkIGR1cmluZyBTU1BMSVQgT1VUICovCisJdWludDMyX3Qgc3NwbGl0X291dF94ZmVyX2NvdW50OworCisJLyoqCisJICogSG9sZHMgdGhlIG51bWJlciBvZiBidXMgZXJyb3JzIHRoYXQgaGF2ZSBvY2N1cnJlZCBmb3IgYSB0cmFuc2FjdGlvbgorCSAqIHdpdGhpbiB0aGlzIHRyYW5zZmVyLgorCSAqLworCXVpbnQ4X3QgZXJyb3JfY291bnQ7CisKKwkvKioKKwkgKiBJbmRleCBvZiB0aGUgbmV4dCBmcmFtZSBkZXNjcmlwdG9yIGZvciBhbiBpc29jaHJvbm91cyB0cmFuc2Zlci4gQQorCSAqIGZyYW1lIGRlc2NyaXB0b3IgZGVzY3JpYmVzIHRoZSBidWZmZXIgcG9zaXRpb24gYW5kIGxlbmd0aCBvZiB0aGUKKwkgKiBkYXRhIHRvIGJlIHRyYW5zZmVycmVkIGluIHRoZSBuZXh0IHNjaGVkdWxlZCAobWljcm8pZnJhbWUgb2YgYW4KKwkgKiBpc29jaHJvbm91cyB0cmFuc2Zlci4gSXQgYWxzbyBob2xkcyBzdGF0dXMgZm9yIHRoYXQgdHJhbnNhY3Rpb24uCisJICogVGhlIGZyYW1lIGluZGV4IHN0YXJ0cyBhdCAwLgorCSAqLworCXVpbnQxNl90IGlzb2NfZnJhbWVfaW5kZXg7CisKKwkvKiogUG9zaXRpb24gb2YgdGhlIElTT0Mgc3BsaXQgb24gZnVsbC9sb3cgc3BlZWQgKi8KKwl1aW50OF90IGlzb2Nfc3BsaXRfcG9zOworCisJLyoqIFBvc2l0aW9uIG9mIHRoZSBJU09DIHNwbGl0IGluIHRoZSBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGZyYW1lICovCisJdWludDE2X3QgaXNvY19zcGxpdF9vZmZzZXQ7CisKKwkvKiogVVJCIGZvciB0aGlzIHRyYW5zZmVyICovCisJc3RydWN0IGR3Y19vdGdfaGNkX3VyYiAqdXJiOworCisJc3RydWN0IGR3Y19vdGdfcWggKnFoOworCisJLyoqIFRoaXMgbGlzdCBvZiBRVERzICovCisJIERXQ19DSVJDTEVRX0VOVFJZKGR3Y19vdGdfcXRkKSBxdGRfbGlzdF9lbnRyeTsKKworCS8qKiBJbmRpY2F0ZXMgaWYgdGhpcyBRVEQgaXMgY3VycmVudGx5IHByb2Nlc3NlZCBieSBIVy4gKi8KKwl1aW50OF90IGluX3Byb2Nlc3M7CisKKwkvKiogTnVtYmVyIG9mIERNQSBkZXNjcmlwdG9ycyBmb3IgdGhpcyBRVEQgKi8KKwl1aW50OF90IG5fZGVzYzsKKworCS8qKiAKKwkgKiBMYXN0IGFjdGl2YXRlZCBmcmFtZShwYWNrZXQpIGluZGV4LiAKKwkgKiBVc2VkIGluIERlc2NyaXB0b3IgRE1BIG1vZGUgb25seS4KKwkgKi8KKwl1aW50MTZfdCBpc29jX2ZyYW1lX2luZGV4X2xhc3Q7CisKK30gZHdjX290Z19xdGRfdDsKKworRFdDX0NJUkNMRVFfSEVBRChkd2Nfb3RnX3F0ZF9saXN0LCBkd2Nfb3RnX3F0ZCk7CisKKy8qKgorICogQSBRdWV1ZSBIZWFkIChRSCkgaG9sZHMgdGhlIHN0YXRpYyBjaGFyYWN0ZXJpc3RpY3Mgb2YgYW4gZW5kcG9pbnQgYW5kCisgKiBtYWludGFpbnMgYSBsaXN0IG9mIHRyYW5zZmVycyAoUVREcykgZm9yIHRoYXQgZW5kcG9pbnQuIEEgUUggc3RydWN0dXJlIG1heQorICogYmUgZW50ZXJlZCBpbiBlaXRoZXIgdGhlIG5vbi1wZXJpb2RpYyBvciBwZXJpb2RpYyBzY2hlZHVsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHdjX290Z19xaCB7CisJLyoqCisJICogRW5kcG9pbnQgdHlwZS4KKwkgKiBPbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisJICoJLSBVRV9DT05UUk9MCisJICoJLSBVRV9CVUxLCisJICoJLSBVRV9JTlRFUlJVUFQKKwkgKgktIFVFX0lTT0NIUk9OT1VTCisJICovCisJdWludDhfdCBlcF90eXBlOworCXVpbnQ4X3QgZXBfaXNfaW47CisKKwkvKiogd01heFBhY2tldFNpemUgRmllbGQgb2YgRW5kcG9pbnQgRGVzY3JpcHRvci4gKi8KKwl1aW50MTZfdCBtYXhwOworCisJLyoqCisJICogRGV2aWNlIHNwZWVkLgorCSAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKwkgKgktIERXQ19PVEdfRVBfU1BFRURfTE9XCisJICoJLSBEV0NfT1RHX0VQX1NQRUVEX0ZVTEwKKwkgKgktIERXQ19PVEdfRVBfU1BFRURfSElHSAorCSAqLworCXVpbnQ4X3QgZGV2X3NwZWVkOworCisJLyoqCisJICogRGV0ZXJtaW5lcyB0aGUgUElEIG9mIHRoZSBuZXh0IGRhdGEgcGFja2V0IGZvciBub24tY29udHJvbAorCSAqIHRyYW5zZmVycy4gSWdub3JlZCBmb3IgY29udHJvbCB0cmFuc2ZlcnMuPGJyPgorCSAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKwkgKgktIERXQ19PVEdfSENfUElEX0RBVEEwCisJICoJLSBEV0NfT1RHX0hDX1BJRF9EQVRBMQorCSAqLworCXVpbnQ4X3QgZGF0YV90b2dnbGU7CisKKwkvKiogUGluZyBzdGF0ZSBpZiAxLiAqLworCXVpbnQ4X3QgcGluZ19zdGF0ZTsKKworCS8qKgorCSAqIExpc3Qgb2YgUVREcyBmb3IgdGhpcyBRSC4KKwkgKi8KKwlzdHJ1Y3QgZHdjX290Z19xdGRfbGlzdCBxdGRfbGlzdDsKKworCS8qKiBIb3N0IGNoYW5uZWwgY3VycmVudGx5IHByb2Nlc3NpbmcgdHJhbnNmZXJzIGZvciB0aGlzIFFILiAqLworCXN0cnVjdCBkd2NfaGMgKmNoYW5uZWw7CisKKwkvKiogRnVsbC9sb3cgc3BlZWQgZW5kcG9pbnQgb24gaGlnaC1zcGVlZCBodWIgcmVxdWlyZXMgc3BsaXQuICovCisJdWludDhfdCBkb19zcGxpdDsKKworCS8qKiBAbmFtZSBQZXJpb2RpYyBzY2hlZHVsZSBpbmZvcm1hdGlvbiAqLworCS8qKiBAeyAqLworCisJLyoqIEJhbmR3aWR0aCBpbiBtaWNyb3NlY29uZHMgcGVyIChtaWNybylmcmFtZS4gKi8KKwl1aW50MTZfdCB1c2VjczsKKworCS8qKiBJbnRlcnZhbCBiZXR3ZWVuIHRyYW5zZmVycyBpbiAobWljcm8pZnJhbWVzLiAqLworCXVpbnQxNl90IGludGVydmFsOworCisJLyoqCisJICogKG1pY3JvKWZyYW1lIHRvIGluaXRpYWxpemUgYSBwZXJpb2RpYyB0cmFuc2Zlci4gVGhlIHRyYW5zZmVyCisJICogZXhlY3V0ZXMgaW4gdGhlIGZvbGxvd2luZyAobWljcm8pZnJhbWUuCisJICovCisJdWludDE2X3Qgc2NoZWRfZnJhbWU7CisKKwkvKiogKG1pY3JvKWZyYW1lIGF0IHdoaWNoIGxhc3Qgc3RhcnQgc3BsaXQgd2FzIGluaXRpYWxpemVkLiAqLworCXVpbnQxNl90IHN0YXJ0X3NwbGl0X2ZyYW1lOworCisJLyoqIEB9ICovCisKKwkvKiogCisJICogVXNlZCBpbnN0ZWFkIG9mIG9yaWdpbmFsIGJ1ZmZlciBpZiAKKwkgKiBpdChwaHlzaWNhbCBhZGRyZXNzKSBpcyBub3QgZHdvcmQtYWxpZ25lZC4KKwkgKi8KKwl1aW50OF90ICpkd19hbGlnbl9idWY7CisJZHdjX2RtYV90IGR3X2FsaWduX2J1Zl9kbWE7CisKKwkvKiogRW50cnkgZm9yIFFIIGluIGVpdGhlciB0aGUgcGVyaW9kaWMgb3Igbm9uLXBlcmlvZGljIHNjaGVkdWxlLiAqLworCWR3Y19saXN0X2xpbmtfdCBxaF9saXN0X2VudHJ5OworCisJLyoqIEBuYW1lIERlc2NyaXB0b3IgRE1BIHN1cHBvcnQgKi8KKwkvKiogQHsgKi8KKworCS8qKiBEZXNjcmlwdG9yIExpc3QuICovCisJZHdjX290Z19ob3N0X2RtYV9kZXNjX3QgKmRlc2NfbGlzdDsKKworCS8qKiBEZXNjcmlwdG9yIExpc3QgcGh5c2ljYWwgYWRkcmVzcy4gKi8KKwlkd2NfZG1hX3QgZGVzY19saXN0X2RtYTsKKworCS8qKiAKKwkgKiBYZmVyIEJ5dGVzIGFycmF5LgorCSAqIEVhY2ggZWxlbWVudCBjb3JyZXNwb25kcyB0byBhIGRlc2NyaXB0b3IgYW5kIGluZGljYXRlcyAKKwkgKiBvcmlnaW5hbCBYZmVyU2l6ZSBzaXplIHZhbHVlIGZvciB0aGUgZGVzY3JpcHRvci4KKwkgKi8KKwl1aW50MzJfdCAqbl9ieXRlczsKKworCS8qKiBBY3R1YWwgbnVtYmVyIG9mIHRyYW5zZmVyIGRlc2NyaXB0b3JzIGluIGEgbGlzdC4gKi8KKwl1aW50MTZfdCBudGQ7CisKKwkvKiogRmlyc3QgYWN0aXZhdGVkIGlzb2Nocm9ub3VzIHRyYW5zZmVyIGRlc2NyaXB0b3IgaW5kZXguICovCisJdWludDhfdCB0ZF9maXJzdDsKKwkvKiogTGFzdCBhY3RpdmF0ZWQgaXNvY2hyb25vdXMgdHJhbnNmZXIgZGVzY3JpcHRvciBpbmRleC4gKi8KKwl1aW50OF90IHRkX2xhc3Q7CisKKwkvKiogQH0gKi8KKworfSBkd2Nfb3RnX3FoX3Q7CisKK0RXQ19DSVJDTEVRX0hFQUQoaGNfbGlzdCwgZHdjX2hjKTsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgc3RhdGUgb2YgdGhlIEhDRCwgaW5jbHVkaW5nIHRoZSBub24tcGVyaW9kaWMgYW5kCisgKiBwZXJpb2RpYyBzY2hlZHVsZXMuCisgKi8KK3N0cnVjdCBkd2Nfb3RnX2hjZCB7CisJLyoqIFRoZSBEV0Mgb3RnIGRldmljZSBwb2ludGVyICovCisJc3RydWN0IGR3Y19vdGdfZGV2aWNlICpvdGdfZGV2OworCS8qKiBEV0MgT1RHIENvcmUgSW50ZXJmYWNlIExheWVyICovCisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWY7CisKKwkvKiogRnVuY3Rpb24gSENEIGRyaXZlciBjYWxsYmFja3MgKi8KKwlzdHJ1Y3QgZHdjX290Z19oY2RfZnVuY3Rpb25fb3BzICpmb3BzOworCisJLyoqIEludGVybmFsIERXQyBIQ0QgRmxhZ3MgKi8KKwl2b2xhdGlsZSB1bmlvbiBkd2Nfb3RnX2hjZF9pbnRlcm5hbF9mbGFncyB7CisJCXVpbnQzMl90IGQzMjsKKwkJc3RydWN0IHsKKwkJCXVuc2lnbmVkIHBvcnRfY29ubmVjdF9zdGF0dXNfY2hhbmdlOjE7CisJCQl1bnNpZ25lZCBwb3J0X2Nvbm5lY3Rfc3RhdHVzOjE7CisJCQl1bnNpZ25lZCBwb3J0X3Jlc2V0X2NoYW5nZToxOworCQkJdW5zaWduZWQgcG9ydF9lbmFibGVfY2hhbmdlOjE7CisJCQl1bnNpZ25lZCBwb3J0X3N1c3BlbmRfY2hhbmdlOjE7CisJCQl1bnNpZ25lZCBwb3J0X292ZXJfY3VycmVudF9jaGFuZ2U6MTsKKwkJCXVuc2lnbmVkIHBvcnRfbDFfY2hhbmdlOjE7CisJCQl1bnNpZ25lZCByZXNlcnZlZDoyNjsKKwkJfSBiOworCX0gZmxhZ3M7CisKKwkvKioKKwkgKiBJbmFjdGl2ZSBpdGVtcyBpbiB0aGUgbm9uLXBlcmlvZGljIHNjaGVkdWxlLiBUaGlzIGlzIGEgbGlzdCBvZgorCSAqIFF1ZXVlIEhlYWRzLiBUcmFuc2ZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIFF1ZXVlIEhlYWRzIGFyZSBub3QKKwkgKiBjdXJyZW50bHkgYXNzaWduZWQgdG8gYSBob3N0IGNoYW5uZWwuCisJICovCisJZHdjX2xpc3RfbGlua190IG5vbl9wZXJpb2RpY19zY2hlZF9pbmFjdGl2ZTsKKworCS8qKgorCSAqIEFjdGl2ZSBpdGVtcyBpbiB0aGUgbm9uLXBlcmlvZGljIHNjaGVkdWxlLiBUaGlzIGlzIGEgbGlzdCBvZgorCSAqIFF1ZXVlIEhlYWRzLiBUcmFuc2ZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIFF1ZXVlIEhlYWRzIGFyZQorCSAqIGN1cnJlbnRseSBhc3NpZ25lZCB0byBhIGhvc3QgY2hhbm5lbC4KKwkgKi8KKwlkd2NfbGlzdF9saW5rX3Qgbm9uX3BlcmlvZGljX3NjaGVkX2FjdGl2ZTsKKworCS8qKgorCSAqIFBvaW50ZXIgdG8gdGhlIG5leHQgUXVldWUgSGVhZCB0byBwcm9jZXNzIGluIHRoZSBhY3RpdmUKKwkgKiBub24tcGVyaW9kaWMgc2NoZWR1bGUuCisJICovCisJZHdjX2xpc3RfbGlua190ICpub25fcGVyaW9kaWNfcWhfcHRyOworCisJLyoqCisJICogSW5hY3RpdmUgaXRlbXMgaW4gdGhlIHBlcmlvZGljIHNjaGVkdWxlLiBUaGlzIGlzIGEgbGlzdCBvZiBRSHMgZm9yCisJICogcGVyaW9kaWMgdHJhbnNmZXJzIHRoYXQgYXJlIF9ub3RfIHNjaGVkdWxlZCBmb3IgdGhlIG5leHQgZnJhbWUuCisJICogRWFjaCBRSCBpbiB0aGUgbGlzdCBoYXMgYW4gaW50ZXJ2YWwgY291bnRlciB0aGF0IGRldGVybWluZXMgd2hlbiBpdAorCSAqIG5lZWRzIHRvIGJlIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uLiBUaGlzIHNjaGVkdWxpbmcgbWVjaGFuaXNtCisJICogYWxsb3dzIG9ubHkgYSBzaW1wbGUgY2FsY3VsYXRpb24gZm9yIHBlcmlvZGljIGJhbmR3aWR0aCB1c2VkIChpLmUuCisJICogbXVzdCBhc3N1bWUgdGhhdCBhbGwgcGVyaW9kaWMgdHJhbnNmZXJzIG1heSBuZWVkIHRvIGV4ZWN1dGUgaW4gdGhlCisJICogc2FtZSBmcmFtZSkuIEhvd2V2ZXIsIGl0IGdyZWF0bHkgc2ltcGxpZmllcyBzY2hlZHVsaW5nIGFuZCBzaG91bGQKKwkgKiBiZSBzdWZmaWNpZW50IGZvciB0aGUgdmFzdCBtYWpvcml0eSBvZiBPVEcgaG9zdHMsIHdoaWNoIG5lZWQgdG8KKwkgKiBjb25uZWN0IHRvIGEgc21hbGwgbnVtYmVyIG9mIHBlcmlwaGVyYWxzIGF0IG9uZSB0aW1lLgorCSAqCisJICogSXRlbXMgbW92ZSBmcm9tIHRoaXMgbGlzdCB0byBwZXJpb2RpY19zY2hlZF9yZWFkeSB3aGVuIHRoZSBRSAorCSAqIGludGVydmFsIGNvdW50ZXIgaXMgMCBhdCBTT0YuCisJICovCisJZHdjX2xpc3RfbGlua190IHBlcmlvZGljX3NjaGVkX2luYWN0aXZlOworCisJLyoqCisJICogTGlzdCBvZiBwZXJpb2RpYyBRSHMgdGhhdCBhcmUgcmVhZHkgZm9yIGV4ZWN1dGlvbiBpbiB0aGUgbmV4dAorCSAqIGZyYW1lLCBidXQgaGF2ZSBub3QgeWV0IGJlZW4gYXNzaWduZWQgdG8gaG9zdCBjaGFubmVscy4KKwkgKgorCSAqIEl0ZW1zIG1vdmUgZnJvbSB0aGlzIGxpc3QgdG8gcGVyaW9kaWNfc2NoZWRfYXNzaWduZWQgYXMgaG9zdAorCSAqIGNoYW5uZWxzIGJlY29tZSBhdmFpbGFibGUgZHVyaW5nIHRoZSBjdXJyZW50IGZyYW1lLgorCSAqLworCWR3Y19saXN0X2xpbmtfdCBwZXJpb2RpY19zY2hlZF9yZWFkeTsKKworCS8qKgorCSAqIExpc3Qgb2YgcGVyaW9kaWMgUUhzIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSBuZXh0IGZyYW1lIHRoYXQgYXJlCisJICogYXNzaWduZWQgdG8gaG9zdCBjaGFubmVscy4KKwkgKgorCSAqIEl0ZW1zIG1vdmUgZnJvbSB0aGlzIGxpc3QgdG8gcGVyaW9kaWNfc2NoZWRfcXVldWVkIGFzIHRoZQorCSAqIHRyYW5zYWN0aW9ucyBmb3IgdGhlIFFIIGFyZSBxdWV1ZWQgdG8gdGhlIERXQ19vdGcgY29udHJvbGxlci4KKwkgKi8KKwlkd2NfbGlzdF9saW5rX3QgcGVyaW9kaWNfc2NoZWRfYXNzaWduZWQ7CisKKwkvKioKKwkgKiBMaXN0IG9mIHBlcmlvZGljIFFIcyB0aGF0IGhhdmUgYmVlbiBxdWV1ZWQgZm9yIGV4ZWN1dGlvbi4KKwkgKgorCSAqIEl0ZW1zIG1vdmUgZnJvbSB0aGlzIGxpc3QgdG8gZWl0aGVyIHBlcmlvZGljX3NjaGVkX2luYWN0aXZlIG9yCisJICogcGVyaW9kaWNfc2NoZWRfcmVhZHkgd2hlbiB0aGUgY2hhbm5lbCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zZmVyCisJICogaXMgcmVsZWFzZWQuIElmIHRoZSBpbnRlcnZhbCBmb3IgdGhlIFFIIGlzIDEsIHRoZSBpdGVtIG1vdmVzIHRvCisJICogcGVyaW9kaWNfc2NoZWRfcmVhZHkgYmVjYXVzZSBpdCBtdXN0IGJlIHJlc2NoZWR1bGVkIGZvciB0aGUgbmV4dAorCSAqIGZyYW1lLiBPdGhlcndpc2UsIHRoZSBpdGVtIG1vdmVzIHRvIHBlcmlvZGljX3NjaGVkX2luYWN0aXZlLgorCSAqLworCWR3Y19saXN0X2xpbmtfdCBwZXJpb2RpY19zY2hlZF9xdWV1ZWQ7CisKKwkvKioKKwkgKiBUb3RhbCBiYW5kd2lkdGggY2xhaW1lZCBzbyBmYXIgZm9yIHBlcmlvZGljIHRyYW5zZmVycy4gVGhpcyB2YWx1ZQorCSAqIGlzIGluIG1pY3Jvc2Vjb25kcyBwZXIgKG1pY3JvKWZyYW1lLiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IGFsbAorCSAqIHBlcmlvZGljIHRyYW5zZmVycyBtYXkgb2NjdXIgaW4gdGhlIHNhbWUgKG1pY3JvKWZyYW1lLgorCSAqLworCXVpbnQxNl90IHBlcmlvZGljX3VzZWNzOworCisJLyoqCisJICogRnJhbWUgbnVtYmVyIHJlYWQgZnJvbSB0aGUgY29yZSBhdCBTT0YuIFRoZSB2YWx1ZSByYW5nZXMgZnJvbSAwIHRvCisJICogRFdDX0hGTlVNX01BWF9GUk5VTS4KKwkgKi8KKwl1aW50MTZfdCBmcmFtZV9udW1iZXI7CisKKwkvKioKKwkgKiBDb3VudCBvZiBwZXJpb2RpYyBRSHMsIGlmIHVzaW5nIHNldmVyYWwgZXBzLiBGb3IgU09GIGVuYWJsZS9kaXNhYmxlLgorCSAqLworCXVpbnQxNl90IHBlcmlvZGljX3FoX2NvdW50OworCisJLyoqCisJICogRnJlZSBob3N0IGNoYW5uZWxzIGluIHRoZSBjb250cm9sbGVyLiBUaGlzIGlzIGEgbGlzdCBvZgorCSAqIGR3Y19oY190IGl0ZW1zLgorCSAqLworCXN0cnVjdCBoY19saXN0IGZyZWVfaGNfbGlzdDsKKwkvKioKKwkgKiBOdW1iZXIgb2YgaG9zdCBjaGFubmVscyBhc3NpZ25lZCB0byBwZXJpb2RpYyB0cmFuc2ZlcnMuIEN1cnJlbnRseQorCSAqIGFzc3VtaW5nIHRoYXQgdGhlcmUgaXMgYSBkZWRpY2F0ZWQgaG9zdCBjaGFubmVsIGZvciBlYWNoIHBlcmlvZGljCisJICogdHJhbnNhY3Rpb24gYW5kIGF0IGxlYXN0IG9uZSBob3N0IGNoYW5uZWwgYXZhaWxhYmxlIGZvcgorCSAqIG5vbi1wZXJpb2RpYyB0cmFuc2FjdGlvbnMuCisJICovCisJaW50IHBlcmlvZGljX2NoYW5uZWxzOworCisJLyoqCisJICogTnVtYmVyIG9mIGhvc3QgY2hhbm5lbHMgYXNzaWduZWQgdG8gbm9uLXBlcmlvZGljIHRyYW5zZmVycy4KKwkgKi8KKwlpbnQgbm9uX3BlcmlvZGljX2NoYW5uZWxzOworCisJLyoqCisJICogQXJyYXkgb2YgcG9pbnRlcnMgdG8gdGhlIGhvc3QgY2hhbm5lbCBkZXNjcmlwdG9ycy4gQWxsb3dzIGFjY2Vzc2luZworCSAqIGEgaG9zdCBjaGFubmVsIGRlc2NyaXB0b3IgZ2l2ZW4gdGhlIGhvc3QgY2hhbm5lbCBudW1iZXIuIFRoaXMgaXMKKwkgKiB1c2VmdWwgaW4gaW50ZXJydXB0IGhhbmRsZXJzLgorCSAqLworCXN0cnVjdCBkd2NfaGMgKmhjX3B0cl9hcnJheVtNQVhfRVBTX0NIQU5ORUxTXTsKKworCS8qKgorCSAqIEJ1ZmZlciB0byB1c2UgZm9yIGFueSBkYXRhIHJlY2VpdmVkIGR1cmluZyB0aGUgc3RhdHVzIHBoYXNlIG9mIGEKKwkgKiBjb250cm9sIHRyYW5zZmVyLiBOb3JtYWxseSBubyBkYXRhIGlzIHRyYW5zZmVycmVkIGR1cmluZyB0aGUgc3RhdHVzCisJICogcGhhc2UuIFRoaXMgYnVmZmVyIGlzIHVzZWQgYXMgYSBiaXQgYnVja2V0LgorCSAqLworCXVpbnQ4X3QgKnN0YXR1c19idWY7CisKKwkvKioKKwkgKiBETUEgYWRkcmVzcyBmb3Igc3RhdHVzX2J1Zi4KKwkgKi8KKwlkbWFfYWRkcl90IHN0YXR1c19idWZfZG1hOworI2RlZmluZSBEV0NfT1RHX0hDRF9TVEFUVVNfQlVGX1NJWkUgNjQKKworCS8qKgorCSAqIENvbm5lY3Rpb24gdGltZXIuIEFuIE9URyBob3N0IG11c3QgZGlzcGxheSBhIG1lc3NhZ2UgaWYgdGhlIGRldmljZQorCSAqIGRvZXMgbm90IGNvbm5lY3QuIFN0YXJ0ZWQgd2hlbiB0aGUgVkJ1cyBwb3dlciBpcyB0dXJuZWQgb24gdmlhCisJICogc3lzZnMgYXR0cmlidXRlICJidXNwb3dlciIuCisJICovCisJZHdjX3RpbWVyX3QgKmNvbm5fdGltZXI7CisKKwkvKiBUYXNrZXQgdG8gZG8gYSByZXNldCAqLworCWR3Y190YXNrbGV0X3QgKnJlc2V0X3Rhc2tsZXQ7CisKKwkvKiAgKi8KKwlkd2Nfc3BpbmxvY2tfdCAqbG9jazsKKworCS8qKgorCSAqIFByaXZhdGUgZGF0YSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkgT1Mgd3JhcHBlci4KKwkgKi8KKwl2b2lkICpwcml2OworCisJdWludDhfdCBvdGdfcG9ydDsKKworCS8qKiBGcmFtZSBMaXN0ICovCisJdWludDMyX3QgKmZyYW1lX2xpc3Q7CisKKwkvKiogRnJhbWUgTGlzdCBETUEgYWRkcmVzcyAqLworCWRtYV9hZGRyX3QgZnJhbWVfbGlzdF9kbWE7CisKKyNpZmRlZiBERUJVRworCXVpbnQzMl90IGZycmVtX3NhbXBsZXM7CisJdWludDY0X3QgZnJyZW1fYWNjdW07CisKKwl1aW50MzJfdCBoZm51bV83X3NhbXBsZXNfYTsKKwl1aW50NjRfdCBoZm51bV83X2ZycmVtX2FjY3VtX2E7CisJdWludDMyX3QgaGZudW1fMF9zYW1wbGVzX2E7CisJdWludDY0X3QgaGZudW1fMF9mcnJlbV9hY2N1bV9hOworCXVpbnQzMl90IGhmbnVtX290aGVyX3NhbXBsZXNfYTsKKwl1aW50NjRfdCBoZm51bV9vdGhlcl9mcnJlbV9hY2N1bV9hOworCisJdWludDMyX3QgaGZudW1fN19zYW1wbGVzX2I7CisJdWludDY0X3QgaGZudW1fN19mcnJlbV9hY2N1bV9iOworCXVpbnQzMl90IGhmbnVtXzBfc2FtcGxlc19iOworCXVpbnQ2NF90IGhmbnVtXzBfZnJyZW1fYWNjdW1fYjsKKwl1aW50MzJfdCBoZm51bV9vdGhlcl9zYW1wbGVzX2I7CisJdWludDY0X3QgaGZudW1fb3RoZXJfZnJyZW1fYWNjdW1fYjsKKyNlbmRpZgorfTsKKworLyoqIEBuYW1lIFRyYW5zYWN0aW9uIEV4ZWN1dGlvbiBGdW5jdGlvbnMgKi8KKy8qKiBAeyAqLworZXh0ZXJuIGR3Y19vdGdfdHJhbnNhY3Rpb25fdHlwZV9lIGR3Y19vdGdfaGNkX3NlbGVjdF90cmFuc2FjdGlvbnMoZHdjX290Z19oY2RfdAorCQkJCQkJCQkgICogaGNkKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfaGNkX3F1ZXVlX3RyYW5zYWN0aW9ucyhkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkJCQkgICBkd2Nfb3RnX3RyYW5zYWN0aW9uX3R5cGVfZSB0cl90eXBlKTsKKworLyoqIEB9ICovCisKKy8qKiBAbmFtZSBJbnRlcnJ1cHQgSGFuZGxlciBGdW5jdGlvbnMgKi8KKy8qKiBAeyAqLworZXh0ZXJuIGludDMyX3QgZHdjX290Z19oY2RfaGFuZGxlX2ludHIoZHdjX290Z19oY2RfdCAqIGR3Y19vdGdfaGNkKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9zb2ZfaW50cihkd2Nfb3RnX2hjZF90ICogZHdjX290Z19oY2QpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19oY2RfaGFuZGxlX3J4X3N0YXR1c19xX2xldmVsX2ludHIoZHdjX290Z19oY2RfdCAqCisJCQkJCQkJIGR3Y19vdGdfaGNkKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9ucF90eF9maWZvX2VtcHR5X2ludHIoZHdjX290Z19oY2RfdCAqCisJCQkJCQkJZHdjX290Z19oY2QpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19oY2RfaGFuZGxlX3BlcmlvX3R4X2ZpZm9fZW1wdHlfaW50cihkd2Nfb3RnX2hjZF90ICoKKwkJCQkJCQkgICBkd2Nfb3RnX2hjZCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2hjZF9oYW5kbGVfaW5jb21wbGV0ZV9wZXJpb2RpY19pbnRyKGR3Y19vdGdfaGNkX3QgKgorCQkJCQkJCSAgIGR3Y19vdGdfaGNkKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9wb3J0X2ludHIoZHdjX290Z19oY2RfdCAqIGR3Y19vdGdfaGNkKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9jb25uX2lkX3N0YXR1c19jaGFuZ2VfaW50cihkd2Nfb3RnX2hjZF90ICoKKwkJCQkJCQkgICAgIGR3Y19vdGdfaGNkKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9kaXNjb25uZWN0X2ludHIoZHdjX290Z19oY2RfdCAqIGR3Y19vdGdfaGNkKTsKK2V4dGVybiBpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9oY19pbnRyKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2hjZF9oYW5kbGVfaGNfbl9pbnRyKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCwKKwkJCQkJICAgIHVpbnQzMl90IG51bSk7CitleHRlcm4gaW50MzJfdCBkd2Nfb3RnX2hjZF9oYW5kbGVfc2Vzc2lvbl9yZXFfaW50cihkd2Nfb3RnX2hjZF90ICogZHdjX290Z19oY2QpOworZXh0ZXJuIGludDMyX3QgZHdjX290Z19oY2RfaGFuZGxlX3dha2V1cF9kZXRlY3RlZF9pbnRyKGR3Y19vdGdfaGNkX3QgKgorCQkJCQkJICAgICAgIGR3Y19vdGdfaGNkKTsKKy8qKiBAfSAqLworCisvKiogQG5hbWUgU2NoZWR1bGUgUXVldWUgRnVuY3Rpb25zICovCisvKiogQHsgKi8KKworLyogSW1wbGVtZW50ZWQgaW4gZHdjX290Z19oY2RfcXVldWUuYyAqLworZXh0ZXJuIGR3Y19vdGdfcWhfdCAqZHdjX290Z19oY2RfcWhfY3JlYXRlKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJCSAgIGR3Y19vdGdfaGNkX3VyYl90ICogdXJiLCBpbnQgYXRvbWljX2FsbG9jKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfaGNkX3FoX2ZyZWUoZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX290Z19xaF90ICogcWgpOworZXh0ZXJuIGludCBkd2Nfb3RnX2hjZF9xaF9hZGQoZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX290Z19xaF90ICogcWgpOworZXh0ZXJuIHZvaWQgZHdjX290Z19oY2RfcWhfcmVtb3ZlKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfaGNkX3FoX2RlYWN0aXZhdGUoZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX290Z19xaF90ICogcWgsCisJCQkJICAgICAgaW50IHNjaGVkX2NzcGxpdCk7CisKKy8qKiBSZW1vdmUgYW5kIGZyZWUgYSBRSCAqLworc3RhdGljIGlubGluZSB2b2lkIGR3Y19vdGdfaGNkX3FoX3JlbW92ZV9hbmRfZnJlZShkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkJCQkJICBkd2Nfb3RnX3FoX3QgKiBxaCkKK3sKKwlkd2NfaXJxZmxhZ3NfdCBmbGFnczsKKwlEV0NfU1BJTkxPQ0tfSVJRU0FWRShoY2QtPmxvY2ssICZmbGFncyk7CisJZHdjX290Z19oY2RfcWhfcmVtb3ZlKGhjZCwgcWgpOworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUoaGNkLT5sb2NrLCBmbGFncyk7CisJZHdjX290Z19oY2RfcWhfZnJlZShoY2QsIHFoKTsKK30KKworLyoqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgUUggc3RydWN0dXJlLgorICogQHJldHVybiBSZXR1cm5zIHRoZSBtZW1vcnkgYWxsb2NhdGUgb3IgTlVMTCBvbiBlcnJvci4gKi8KK3N0YXRpYyBpbmxpbmUgZHdjX290Z19xaF90ICpkd2Nfb3RnX2hjZF9xaF9hbGxvYyhpbnQgYXRvbWljX2FsbG9jKQoreworCWlmIChhdG9taWNfYWxsb2MpCisJCXJldHVybiAoZHdjX290Z19xaF90ICopIERXQ19BTExPQ19BVE9NSUMoc2l6ZW9mKGR3Y19vdGdfcWhfdCkpOworCWVsc2UKKwkJcmV0dXJuIChkd2Nfb3RnX3FoX3QgKikgRFdDX0FMTE9DKHNpemVvZihkd2Nfb3RnX3FoX3QpKTsKK30KKworZXh0ZXJuIGR3Y19vdGdfcXRkX3QgKmR3Y19vdGdfaGNkX3F0ZF9jcmVhdGUoZHdjX290Z19oY2RfdXJiX3QgKiB1cmIsCisJCQkJCSAgICAgaW50IGF0b21pY19hbGxvYyk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2hjZF9xdGRfaW5pdChkd2Nfb3RnX3F0ZF90ICogcXRkLCBkd2Nfb3RnX2hjZF91cmJfdCAqIHVyYik7CitleHRlcm4gaW50IGR3Y19vdGdfaGNkX3F0ZF9hZGQoZHdjX290Z19xdGRfdCAqIHF0ZCwgZHdjX290Z19oY2RfdCAqIGR3Y19vdGdfaGNkLAorCQkJICAgICAgIGR3Y19vdGdfcWhfdCAqKiBxaCwgaW50IGF0b21pY19hbGxvYyk7CisKKy8qKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhIFFURCBzdHJ1Y3R1cmUuCisgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1lbW9yeSBhbGxvY2F0ZSBvciBOVUxMIG9uIGVycm9yLiAqLworc3RhdGljIGlubGluZSBkd2Nfb3RnX3F0ZF90ICpkd2Nfb3RnX2hjZF9xdGRfYWxsb2MoaW50IGF0b21pY19hbGxvYykKK3sKKwlpZiAoYXRvbWljX2FsbG9jKQorCQlyZXR1cm4gKGR3Y19vdGdfcXRkX3QgKikgRFdDX0FMTE9DX0FUT01JQyhzaXplb2YoZHdjX290Z19xdGRfdCkpOworCWVsc2UKKwkJcmV0dXJuIChkd2Nfb3RnX3F0ZF90ICopIERXQ19BTExPQyhzaXplb2YoZHdjX290Z19xdGRfdCkpOworfQorCisvKiogRnJlZXMgdGhlIG1lbW9yeSBmb3IgYSBRVEQgc3RydWN0dXJlLiAgUVREIHNob3VsZCBhbHJlYWR5IGJlIHJlbW92ZWQgZnJvbQorICogbGlzdC4KKyAqIEBwYXJhbSBxdGQgUVREIHRvIGZyZWUuKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkd2Nfb3RnX2hjZF9xdGRfZnJlZShkd2Nfb3RnX3F0ZF90ICogcXRkKQoreworCURXQ19GUkVFKHF0ZCk7Cit9CisKKy8qKiBSZW1vdmVzIGEgUVREIGZyb20gbGlzdC4KKyAqIEBwYXJhbSBoY2QgSENEIGluc3RhbmNlLgorICogQHBhcmFtIHF0ZCBRVEQgdG8gcmVtb3ZlIGZyb20gbGlzdC4KKyAqIEBwYXJhbSBxaCBRVEQgYmVsb25ncyB0by4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGR3Y19vdGdfaGNkX3F0ZF9yZW1vdmUoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkJICBkd2Nfb3RnX3F0ZF90ICogcXRkLAorCQkJCQkgIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCURXQ19DSVJDTEVRX1JFTU9WRSgmcWgtPnF0ZF9saXN0LCBxdGQsIHF0ZF9saXN0X2VudHJ5KTsKK30KKworLyoqIFJlbW92ZSBhbmQgZnJlZSBhIFFURCAKKyAgKiBOZWVkIHRvIGRpc2FibGUgSVJRIGFuZCBob2xkIGhjZCBsb2NrIHdoaWxlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBvdXQgb2YgCisgICogaW50ZXJydXB0IHNlcnZpY2luZyBjaGFpbiAqLworc3RhdGljIGlubGluZSB2b2lkIGR3Y19vdGdfaGNkX3F0ZF9yZW1vdmVfYW5kX2ZyZWUoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkJCSAgIGR3Y19vdGdfcXRkX3QgKiBxdGQsCisJCQkJCQkgICBkd2Nfb3RnX3FoX3QgKiBxaCkKK3sKKwlkd2Nfb3RnX2hjZF9xdGRfcmVtb3ZlKGhjZCwgcXRkLCBxaCk7CisJZHdjX290Z19oY2RfcXRkX2ZyZWUocXRkKTsKK30KKworLyoqIEB9ICovCisKKy8qKiBAbmFtZSBEZXNjcmlwdG9yIERNQSBTdXBwb3J0aW5nIEZ1bmN0aW9ucyAqLworLyoqIEB7ICovCisKK2V4dGVybiB2b2lkIGR3Y19vdGdfaGNkX3N0YXJ0X3hmZXJfZGRtYShkd2Nfb3RnX2hjZF90ICogaGNkLCBkd2Nfb3RnX3FoX3QgKiBxaCk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2hjZF9jb21wbGV0ZV94ZmVyX2RkbWEoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkJICAgZHdjX2hjX3QgKiBoYywKKwkJCQkJICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCQkgICBkd2Nfb3RnX2hhbHRfc3RhdHVzX2UgaGFsdF9zdGF0dXMpOworCitleHRlcm4gaW50IGR3Y19vdGdfaGNkX3FoX2luaXRfZGRtYShkd2Nfb3RnX2hjZF90ICogaGNkLCBkd2Nfb3RnX3FoX3QgKiBxaCk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX2hjZF9xaF9mcmVlX2RkbWEoZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX290Z19xaF90ICogcWgpOworCisvKiogQH0gKi8KKworLyoqIEBuYW1lIEludGVybmFsIEZ1bmN0aW9ucyAqLworLyoqIEB7ICovCitkd2Nfb3RnX3FoX3QgKmR3Y191cmJfdG9fcWgoZHdjX290Z19oY2RfdXJiX3QgKiB1cmIpOworLyoqIEB9ICovCisKKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCitleHRlcm4gaW50IGR3Y19vdGdfaGNkX2dldF9oY19mb3JfbHBtX3RyYW4oZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkJICAgdWludDhfdCBkZXZhZGRyKTsKK2V4dGVybiB2b2lkIGR3Y19vdGdfaGNkX2ZyZWVfaGNfZnJvbV9scG0oZHdjX290Z19oY2RfdCAqIGhjZCk7CisjZW5kaWYKKworLyoqIEdldHMgdGhlIFFIIHRoYXQgY29udGFpbnMgdGhlIGxpc3RfaGVhZCAqLworI2RlZmluZSBkd2NfbGlzdF90b19xaChfbGlzdF9oZWFkX3B0cl8pIGNvbnRhaW5lcl9vZihfbGlzdF9oZWFkX3B0cl8sIGR3Y19vdGdfcWhfdCwgcWhfbGlzdF9lbnRyeSkKKworLyoqIEdldHMgdGhlIFFURCB0aGF0IGNvbnRhaW5zIHRoZSBsaXN0X2hlYWQgKi8KKyNkZWZpbmUgZHdjX2xpc3RfdG9fcXRkKF9saXN0X2hlYWRfcHRyXykgY29udGFpbmVyX29mKF9saXN0X2hlYWRfcHRyXywgZHdjX290Z19xdGRfdCwgcXRkX2xpc3RfZW50cnkpCisKKy8qKiBDaGVjayBpZiBRSCBpcyBub24tcGVyaW9kaWMgICovCisjZGVmaW5lIGR3Y19xaF9pc19ub25fcGVyKF9xaF9wdHJfKSAoKF9xaF9wdHJfLT5lcF90eXBlID09IFVFX0JVTEspIHx8IFwKKwkJCQkgICAgIChfcWhfcHRyXy0+ZXBfdHlwZSA9PSBVRV9DT05UUk9MKSkKKworLyoqIEhpZ2ggYmFuZHdpZHRoIG11bHRpcGxpZXIgYXMgZW5jb2RlZCBpbiBoaWdoc3BlZWQgZW5kcG9pbnQgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgZHdjX2hiX211bHQod01heFBhY2tldFNpemUpICgxICsgKCgod01heFBhY2tldFNpemUpID4+IDExKSAmIDB4MDMpKQorCisvKiogUGFja2V0IHNpemUgZm9yIGFueSBraW5kIG9mIGVuZHBvaW50IGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgZHdjX21heF9wYWNrZXQod01heFBhY2tldFNpemUpICgod01heFBhY2tldFNpemUpICYgMHgwN2ZmKQorCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZiBfZnJhbWUxIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBfZnJhbWUyLiBUaGUgY29tcGFyaXNvbiBpcworICogZG9uZSBtb2R1bG8gRFdDX0hGTlVNX01BWF9GUk5VTS4gVGhpcyBhY2NvdW50cyBmb3IgdGhlIHJvbGxvdmVyIG9mIHRoZQorICogZnJhbWUgbnVtYmVyIHdoZW4gdGhlIG1heCBmcmFtZSBudW1iZXIgaXMgcmVhY2hlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZHdjX2ZyYW1lX251bV9sZSh1aW50MTZfdCBmcmFtZTEsIHVpbnQxNl90IGZyYW1lMikKK3sKKwlyZXR1cm4gKChmcmFtZTIgLSBmcmFtZTEpICYgRFdDX0hGTlVNX01BWF9GUk5VTSkgPD0KKwkgICAgKERXQ19IRk5VTV9NQVhfRlJOVU0gPj4gMSk7Cit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIF9mcmFtZTEgaXMgZ3JlYXRlciB0aGFuIF9mcmFtZTIuIFRoZSBjb21wYXJpc29uIGlzIGRvbmUKKyAqIG1vZHVsbyBEV0NfSEZOVU1fTUFYX0ZSTlVNLiBUaGlzIGFjY291bnRzIGZvciB0aGUgcm9sbG92ZXIgb2YgdGhlIGZyYW1lCisgKiBudW1iZXIgd2hlbiB0aGUgbWF4IGZyYW1lIG51bWJlciBpcyByZWFjaGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBkd2NfZnJhbWVfbnVtX2d0KHVpbnQxNl90IGZyYW1lMSwgdWludDE2X3QgZnJhbWUyKQoreworCXJldHVybiAoZnJhbWUxICE9IGZyYW1lMikgJiYKKwkgICAgKCgoZnJhbWUxIC0gZnJhbWUyKSAmIERXQ19IRk5VTV9NQVhfRlJOVU0pIDwKKwkgICAgIChEV0NfSEZOVU1fTUFYX0ZSTlVNID4+IDEpKTsKK30KKworLyoqCisgKiBJbmNyZW1lbnRzIF9mcmFtZSBieSB0aGUgYW1vdW50IHNwZWNpZmllZCBieSBfaW5jLiBUaGUgYWRkaXRpb24gaXMgZG9uZQorICogbW9kdWxvIERXQ19IRk5VTV9NQVhfRlJOVU0uIFJldHVybnMgdGhlIGluY3JlbWVudGVkIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGR3Y19mcmFtZV9udW1faW5jKHVpbnQxNl90IGZyYW1lLCB1aW50MTZfdCBpbmMpCit7CisJcmV0dXJuIChmcmFtZSArIGluYykgJiBEV0NfSEZOVU1fTUFYX0ZSTlVNOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGR3Y19mdWxsX2ZyYW1lX251bSh1aW50MTZfdCBmcmFtZSkKK3sKKwlyZXR1cm4gKGZyYW1lICYgRFdDX0hGTlVNX01BWF9GUk5VTSkgPj4gMzsKK30KKworc3RhdGljIGlubGluZSB1aW50MTZfdCBkd2NfbWljcm9fZnJhbWVfbnVtKHVpbnQxNl90IGZyYW1lKQoreworCXJldHVybiBmcmFtZSAmIDB4NzsKK30KKwordm9pZCBkd2Nfb3RnX2hjZF9zYXZlX2RhdGFfdG9nZ2xlKGR3Y19oY190ICogaGMsCisJCQkJICBkd2Nfb3RnX2hjX3JlZ3NfdCAqIGhjX3JlZ3MsCisJCQkJICBkd2Nfb3RnX3F0ZF90ICogcXRkKTsKKworI2lmZGVmIERFQlVHCisvKioKKyAqIE1hY3JvIHRvIHNhbXBsZSB0aGUgcmVtYWluaW5nIFBIWSBjbG9ja3MgbGVmdCBpbiB0aGUgY3VycmVudCBmcmFtZS4gVGhpcworICogbWF5IGJlIHVzZWQgZHVyaW5nIGRlYnVnZ2luZyB0byBkZXRlcm1pbmUgdGhlIGF2ZXJhZ2UgdGltZSBpdCB0YWtlcyB0bworICogZXhlY3V0ZSBzZWN0aW9ucyBvZiBjb2RlLiBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIHNhbXBsZSBwb2ludHMsICJhIiBhbmQKKyAqICJiIiwgc28gdGhlIF9sZXR0ZXIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdGhlc2UgdmFsdWVzLgorICoKKyAqIFRvIGR1bXAgdGhlIGF2ZXJhZ2Ugc2FtcGxlIHRpbWVzLCByZWFkIHRoZSAiaGNkX2ZycmVtIiBzeXNmcyBhdHRyaWJ1dGUuIEZvcgorICogZXhhbXBsZSwgImNhdCAvc3lzL2RldmljZXMvbG0wL2hjZF9mcnJlbSIuCisgKi8KKyNkZWZpbmUgZHdjX3NhbXBsZV9mcnJlbShfaGNkLCBfcWgsIF9sZXR0ZXIpIFwKK3sgXAorCWhmbnVtX2RhdGFfdCBoZm51bTsgXAorCWR3Y19vdGdfcXRkX3QgKnF0ZDsgXAorCXF0ZCA9IGxpc3RfZW50cnkoX3FoLT5xdGRfbGlzdC5uZXh0LCBkd2Nfb3RnX3F0ZF90LCBxdGRfbGlzdF9lbnRyeSk7IFwKKwlpZiAodXNiX3BpcGVpbnQocXRkLT51cmItPnBpcGUpICYmIF9xaC0+c3RhcnRfc3BsaXRfZnJhbWUgIT0gMCAmJiAhcXRkLT5jb21wbGV0ZV9zcGxpdCkgeyBcCisJCWhmbnVtLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZfaGNkLT5jb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZm51bSk7IFwKKwkJc3dpdGNoIChoZm51bS5iLmZybnVtICYgMHg3KSB7IFwKKwkJY2FzZSA3OiBcCisJCQlfaGNkLT5oZm51bV83X3NhbXBsZXNfIyNfbGV0dGVyKys7IFwKKwkJCV9oY2QtPmhmbnVtXzdfZnJyZW1fYWNjdW1fIyNfbGV0dGVyICs9IGhmbnVtLmIuZnJyZW07IFwKKwkJCWJyZWFrOyBcCisJCWNhc2UgMDogXAorCQkJX2hjZC0+aGZudW1fMF9zYW1wbGVzXyMjX2xldHRlcisrOyBcCisJCQlfaGNkLT5oZm51bV8wX2ZycmVtX2FjY3VtXyMjX2xldHRlciArPSBoZm51bS5iLmZycmVtOyBcCisJCQlicmVhazsgXAorCQlkZWZhdWx0OiBcCisJCQlfaGNkLT5oZm51bV9vdGhlcl9zYW1wbGVzXyMjX2xldHRlcisrOyBcCisJCQlfaGNkLT5oZm51bV9vdGhlcl9mcnJlbV9hY2N1bV8jI19sZXR0ZXIgKz0gaGZudW0uYi5mcnJlbTsgXAorCQkJYnJlYWs7IFwKKwkJfSBcCisJfSBcCit9CisjZWxzZQorI2RlZmluZSBkd2Nfc2FtcGxlX2ZycmVtKF9oY2QsIF9xaCwgX2xldHRlcikKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYgLyogRFdDX0RFVklDRV9PTkxZICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfaGNkX2RkbWEuYyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19oY2RfZGRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTFlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfaGNkX2RkbWEuYwpAQCAtMCwwICsxLDExMjIgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9vdGcvbGludXgvZHJpdmVycy9kd2Nfb3RnX2hjZF9kZG1hLmMgJAorICogJFJldmlzaW9uOiAjMTAgJAorICogJERhdGU6IDIwMTEvMTAvMjAgJAorICogJENoYW5nZTogMTg2OTQ2NCAkCisgKgorICogU3lub3BzeXMgSFMgT1RHIExpbnV4IFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbiAoaGVyZWluYWZ0ZXIsCisgKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcworICogb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgKgorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKKyAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gdXNlIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgKiBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwgZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IKKyAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQorICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgKiBiZWxvdywgdGhlbiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIiBCQVNJUworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgRFdDX0RFVklDRV9PTkxZCisKKy8qKiBAZmlsZQorICogVGhpcyBmaWxlIGNvbnRhaW5zIERlc2NyaXB0b3IgRE1BIHN1cHBvcnQgaW1wbGVtZW50YXRpb24gZm9yIGhvc3QgbW9kZS4KKyAqLworCisjaW5jbHVkZSAiZHdjX290Z19oY2QuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX3JlZ3MuaCIKKworc3RhdGljIGlubGluZSB1aW50OF90IGZyYW1lX2xpc3RfaWR4KHVpbnQxNl90IGZyYW1lKQoreworCXJldHVybiAoZnJhbWUgJiAoTUFYX0ZSTElTVF9FTl9OVU0gLSAxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgZGVzY2xpc3RfaWR4X2luYyh1aW50MTZfdCBpZHgsIHVpbnQxNl90IGluYywgdWludDhfdCBzcGVlZCkKK3sKKwlyZXR1cm4gKGlkeCArIGluYykgJgorCSAgICAoKChzcGVlZCA9PQorCSAgICAgICBEV0NfT1RHX0VQX1NQRUVEX0hJR0gpID8gTUFYX0RNQV9ERVNDX05VTV9IU19JU09DIDoKKwkgICAgICBNQVhfRE1BX0RFU0NfTlVNX0dFTkVSSUMpIC0gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgZGVzY2xpc3RfaWR4X2RlYyh1aW50MTZfdCBpZHgsIHVpbnQxNl90IGluYywgdWludDhfdCBzcGVlZCkKK3sKKwlyZXR1cm4gKGlkeCAtIGluYykgJgorCSAgICAoKChzcGVlZCA9PQorCSAgICAgICBEV0NfT1RHX0VQX1NQRUVEX0hJR0gpID8gTUFYX0RNQV9ERVNDX05VTV9IU19JU09DIDoKKwkgICAgICBNQVhfRE1BX0RFU0NfTlVNX0dFTkVSSUMpIC0gMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgbWF4X2Rlc2NfbnVtKGR3Y19vdGdfcWhfdCAqIHFoKQoreworCXJldHVybiAoKChxaC0+ZXBfdHlwZSA9PSBVRV9JU09DSFJPTk9VUykKKwkJICYmIChxaC0+ZGV2X3NwZWVkID09IERXQ19PVEdfRVBfU1BFRURfSElHSCkpCisJCT8gTUFYX0RNQV9ERVNDX05VTV9IU19JU09DIDogTUFYX0RNQV9ERVNDX05VTV9HRU5FUklDKTsKK30KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgZnJhbWVfaW5jcl92YWwoZHdjX290Z19xaF90ICogcWgpCit7CisJcmV0dXJuICgocWgtPmRldl9zcGVlZCA9PSBEV0NfT1RHX0VQX1NQRUVEX0hJR0gpCisJCT8gKChxaC0+aW50ZXJ2YWwgKyA4IC0gMSkgLyA4KQorCQk6IHFoLT5pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgZGVzY19saXN0X2FsbG9jKGR3Y19vdGdfcWhfdCAqIHFoKQoreworCWludCByZXR2YWwgPSAwOworCisJcWgtPmRlc2NfbGlzdCA9IChkd2Nfb3RnX2hvc3RfZG1hX2Rlc2NfdCAqKQorCSAgICBEV0NfRE1BX0FMTE9DKHNpemVvZihkd2Nfb3RnX2hvc3RfZG1hX2Rlc2NfdCkgKiBtYXhfZGVzY19udW0ocWgpLAorCQkJICAmcWgtPmRlc2NfbGlzdF9kbWEpOworCisJaWYgKCFxaC0+ZGVzY19saXN0KSB7CisJCXJldHZhbCA9IC1EV0NfRV9OT19NRU1PUlk7CisJCURXQ19FUlJPUigiJXM6IERNQSBkZXNjcmlwdG9yIGxpc3QgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCisJfQorCisJZHdjX21lbXNldChxaC0+ZGVzY19saXN0LCAweDAwLAorCQkgICBzaXplb2YoZHdjX290Z19ob3N0X2RtYV9kZXNjX3QpICogbWF4X2Rlc2NfbnVtKHFoKSk7CisKKwlxaC0+bl9ieXRlcyA9CisJICAgICh1aW50MzJfdCAqKSBEV0NfQUxMT0Moc2l6ZW9mKHVpbnQzMl90KSAqIG1heF9kZXNjX251bShxaCkpOworCisJaWYgKCFxaC0+bl9ieXRlcykgeworCQlyZXR2YWwgPSAtRFdDX0VfTk9fTUVNT1JZOworCQlEV0NfRVJST1IKKwkJICAgICgiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBhcnJheSBmb3IgZGVzY3JpcHRvcnMnIHNpemUgYWN0dWFsIHZhbHVlc1xuIiwKKwkJICAgICBfX2Z1bmNfXyk7CisKKwl9CisJcmV0dXJuIHJldHZhbDsKKworfQorCitzdGF0aWMgdm9pZCBkZXNjX2xpc3RfZnJlZShkd2Nfb3RnX3FoX3QgKiBxaCkKK3sKKwlpZiAocWgtPmRlc2NfbGlzdCkgeworCQlEV0NfRE1BX0ZSRUUobWF4X2Rlc2NfbnVtKHFoKSwgcWgtPmRlc2NfbGlzdCwKKwkJCSAgICAgcWgtPmRlc2NfbGlzdF9kbWEpOworCQlxaC0+ZGVzY19saXN0ID0gTlVMTDsKKwl9CisKKwlpZiAocWgtPm5fYnl0ZXMpIHsKKwkJRFdDX0ZSRUUocWgtPm5fYnl0ZXMpOworCQlxaC0+bl9ieXRlcyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGZyYW1lX2xpc3RfYWxsb2MoZHdjX290Z19oY2RfdCAqIGhjZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpZiAoaGNkLT5mcmFtZV9saXN0KQorCQlyZXR1cm4gMDsKKworCWhjZC0+ZnJhbWVfbGlzdCA9IERXQ19ETUFfQUxMT0MoNCAqIE1BWF9GUkxJU1RfRU5fTlVNLAorCQkJCQkmaGNkLT5mcmFtZV9saXN0X2RtYSk7CisJaWYgKCFoY2QtPmZyYW1lX2xpc3QpIHsKKwkJcmV0dmFsID0gLURXQ19FX05PX01FTU9SWTsKKwkJRFdDX0VSUk9SKCIlczogRnJhbWUgTGlzdCBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgX19mdW5jX18pOworCX0KKworCWR3Y19tZW1zZXQoaGNkLT5mcmFtZV9saXN0LCAweDAwLCA0ICogTUFYX0ZSTElTVF9FTl9OVU0pOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZnJhbWVfbGlzdF9mcmVlKGR3Y19vdGdfaGNkX3QgKiBoY2QpCit7CisJaWYgKCFoY2QtPmZyYW1lX2xpc3QpCisJCXJldHVybjsKKwkKKwlEV0NfRE1BX0ZSRUUoNCAqIE1BWF9GUkxJU1RfRU5fTlVNLCBoY2QtPmZyYW1lX2xpc3QsIGhjZC0+ZnJhbWVfbGlzdF9kbWEpOworCWhjZC0+ZnJhbWVfbGlzdCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHBlcl9zY2hlZF9lbmFibGUoZHdjX290Z19oY2RfdCAqIGhjZCwgdWludDE2X3QgZnJfbGlzdF9lbikKK3sKKworCWhjZmdfZGF0YV90IGhjZmc7CisKKwloY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY2QtPmNvcmVfaWYtPmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3MtPmhjZmcpOworCisJaWYgKGhjZmcuYi5wZXJzY2hlZGVuYSkgeworCQkvKiBhbHJlYWR5IGVuYWJsZWQgKi8KKwkJcmV0dXJuOworCX0KKworCURXQ19XUklURV9SRUczMigmaGNkLT5jb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZmxiYWRkciwKKwkJCWhjZC0+ZnJhbWVfbGlzdF9kbWEpOworCisJc3dpdGNoIChmcl9saXN0X2VuKSB7CisJY2FzZSA2NDoKKwkJaGNmZy5iLmZybGlzdGVuID0gMzsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJaGNmZy5iLmZybGlzdGVuID0gMjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJaGNmZy5iLmZybGlzdGVuID0gMTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQloY2ZnLmIuZnJsaXN0ZW4gPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwloY2ZnLmIucGVyc2NoZWRlbmEgPSAxOworCisJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkVuYWJsaW5nIFBlcmlvZGljIHNjaGVkdWxlXG4iKTsKKwlEV0NfV1JJVEVfUkVHMzIoJmhjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGNmZywgaGNmZy5kMzIpOworCit9CisKK3N0YXRpYyB2b2lkIHBlcl9zY2hlZF9kaXNhYmxlKGR3Y19vdGdfaGNkX3QgKiBoY2QpCit7CisJaGNmZ19kYXRhX3QgaGNmZzsKKworCWhjZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGNmZyk7CisJCisJaWYgKCFoY2ZnLmIucGVyc2NoZWRlbmEpIHsKKwkJLyogYWxyZWFkeSBkaXNhYmxlZCAqLworCQlyZXR1cm47CisJfQorCWhjZmcuYi5wZXJzY2hlZGVuYSA9IDA7CisKKwlEV0NfREVCVUdQTChEQkdfSENELCAiRGlzYWJsaW5nIFBlcmlvZGljIHNjaGVkdWxlXG4iKTsKKwlEV0NfV1JJVEVfUkVHMzIoJmhjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGNmZywgaGNmZy5kMzIpOworfQorCisvKiAKKyAqIEFjdGl2YXRlcy9EZWFjdGl2YXRlcyBGcmFtZUxpc3QgZW50cmllcyBmb3IgdGhlIGNoYW5uZWwgCisgKiBiYXNlZCBvbiBlbmRwb2ludCBzZXJ2aWNpbmcgcGVyaW9kLgorICovCit2b2lkIHVwZGF0ZV9mcmFtZV9saXN0KGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoLCB1aW50OF90IGVuYWJsZSkKK3sKKwl1aW50MTZfdCBpLCBqLCBpbmM7CisJZHdjX2hjX3QgKmhjID0gTlVMTDsKKworCWlmICghcWgtPmNoYW5uZWwpIHsKKwkJRFdDX0VSUk9SKCJxaC0+Y2hhbm5lbCA9ICVwIiwgcWgtPmNoYW5uZWwpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFoY2QpIHsKKwkJRFdDX0VSUk9SKCItLS0tLS1oY2QgPSAlcCIsIGhjZCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWhjZC0+ZnJhbWVfbGlzdCkgeworCQlEV0NfRVJST1IoIi0tLS0tLS1oY2QtPmZyYW1lX2xpc3QgPSAlcCIsIGhjZC0+ZnJhbWVfbGlzdCk7CisJCXJldHVybjsKKwl9CisKKwloYyA9IHFoLT5jaGFubmVsOworCWluYyA9IGZyYW1lX2luY3JfdmFsKHFoKTsKKwlpZiAocWgtPmVwX3R5cGUgPT0gVUVfSVNPQ0hST05PVVMpCisJCWkgPSBmcmFtZV9saXN0X2lkeChxaC0+c2NoZWRfZnJhbWUpOworCWVsc2UKKwkJaSA9IDA7CisKKwlqID0gaTsKKwlkbyB7CisJCWlmIChlbmFibGUpCisJCQloY2QtPmZyYW1lX2xpc3Rbal0gfD0gKDEgPDwgaGMtPmhjX251bSk7CisJCWVsc2UKKwkJCWhjZC0+ZnJhbWVfbGlzdFtqXSAmPSB+KDEgPDwgaGMtPmhjX251bSk7CisJCWogPSAoaiArIGluYykgJiAoTUFYX0ZSTElTVF9FTl9OVU0gLSAxKTsKKwl9CisJd2hpbGUgKGogIT0gaSk7CisJaWYgKCFlbmFibGUpCisJCXJldHVybjsKKwloYy0+c2NoaW5mbyA9IDA7CisJaWYgKHFoLT5jaGFubmVsLT5zcGVlZCA9PSBEV0NfT1RHX0VQX1NQRUVEX0hJR0gpIHsKKwkJaiA9IDE7CisJCS8qIFRPRE8gLSBjaGVjayB0aGlzICovCisJCWluYyA9ICg4ICsgcWgtPmludGVydmFsIC0gMSkgLyBxaC0+aW50ZXJ2YWw7CisJCWZvciAoaSA9IDA7IGkgPCBpbmM7IGkrKykgeworCQkJaGMtPnNjaGluZm8gfD0gajsKKwkJCWogPSBqIDw8IHFoLT5pbnRlcnZhbDsKKwkJfQorCX0gZWxzZSB7CisJCWhjLT5zY2hpbmZvID0gMHhmZjsKKwl9Cit9CisKKyNpZiAxCit2b2lkIGR1bXBfZnJhbWVfbGlzdChkd2Nfb3RnX2hjZF90ICogaGNkKQoreworCWludCBpID0gMDsKKwlEV0NfUFJJTlRGKCItLUZSQU1FIExJU1QgKGhleCkgLS1cbiIpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfRlJMSVNUX0VOX05VTTsgaSsrKSB7CisJCURXQ19QUklOVEYoIiV4XHQiLCBoY2QtPmZyYW1lX2xpc3RbaV0pOworCQlpZiAoIShpICUgOCkgJiYgaSkKKwkJCURXQ19QUklOVEYoIlxuIik7CisJfQorCURXQ19QUklOVEYoIlxuLS0tLVxuIik7CisKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCByZWxlYXNlX2NoYW5uZWxfZGRtYShkd2Nfb3RnX2hjZF90ICogaGNkLCBkd2Nfb3RnX3FoX3QgKiBxaCkKK3sKKwlkd2NfaGNfdCAqaGMgPSBxaC0+Y2hhbm5lbDsKKwlpZiAoZHdjX3FoX2lzX25vbl9wZXIocWgpKQorCQloY2QtPm5vbl9wZXJpb2RpY19jaGFubmVscy0tOworCWVsc2UKKwkJdXBkYXRlX2ZyYW1lX2xpc3QoaGNkLCBxaCwgMCk7CisKKwkvKiAKKwkgKiBUaGUgY29uZGl0aW9uIGlzIGFkZGVkIHRvIHByZXZlbnQgZG91YmxlIGNsZWFudXAgdHJ5IGluIGNhc2Ugb2YgZGV2aWNlCisJICogZGlzY29ubmVjdC4gU2VlIGNoYW5uZWwgY2xlYW51cCBpbiBkd2Nfb3RnX2hjZF9kaXNjb25uZWN0X2NiKCkuCisJICovCisJaWYgKGhjLT5xaCkgeworCQlkd2Nfb3RnX2hjX2NsZWFudXAoaGNkLT5jb3JlX2lmLCBoYyk7CisJCURXQ19DSVJDTEVRX0lOU0VSVF9UQUlMKCZoY2QtPmZyZWVfaGNfbGlzdCwgaGMsIGhjX2xpc3RfZW50cnkpOworCQloYy0+cWggPSBOVUxMOworCX0KKworCXFoLT5jaGFubmVsID0gTlVMTDsKKwlxaC0+bnRkID0gMDsKKworCWlmIChxaC0+ZGVzY19saXN0KSB7CisJCWR3Y19tZW1zZXQocWgtPmRlc2NfbGlzdCwgMHgwMCwKKwkJCSAgIHNpemVvZihkd2Nfb3RnX2hvc3RfZG1hX2Rlc2NfdCkgKiBtYXhfZGVzY19udW0ocWgpKTsKKwl9Cit9CisKKy8qKiAKKyAqIEluaXRpYWxpemVzIGEgUUggc3RydWN0dXJlJ3MgRGVzY3JpcHRvciBETUEgcmVsYXRlZCBtZW1iZXJzLgorICogQWxsb2NhdGVzIG1lbW9yeSBmb3IgZGVzY3JpcHRvciBsaXN0LgorICogT24gZmlyc3QgcGVyaW9kaWMgUUgsIGFsbG9jYXRlcyBtZW1vcnkgZm9yIEZyYW1lTGlzdCAKKyAqIGFuZCBlbmFibGVzIHBlcmlvZGljIHNjaGVkdWxpbmcuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENEIHN0YXRlIHN0cnVjdHVyZSBmb3IgdGhlIERXQyBPVEcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBxaCBUaGUgUUggdG8gaW5pdC4KKyAqCisgKiBAcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkd2Nfb3RnX2hjZF9xaF9pbml0X2RkbWEoZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX290Z19xaF90ICogcWgpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAocWgtPmRvX3NwbGl0KSB7CisJCURXQ19FUlJPUigiU1BMSVQgVHJhbnNmZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGluIERlc2NyaXB0b3IgRE1BLlxuIik7CisgICAgCQlyZXR1cm4gLTE7CisgICAgCX0KKworCXJldHZhbCA9IGRlc2NfbGlzdF9hbGxvYyhxaCk7CisKKwlpZiAoKHJldHZhbCA9PSAwKQorCSAgICAmJiAocWgtPmVwX3R5cGUgPT0gVUVfSVNPQ0hST05PVVMgfHwgcWgtPmVwX3R5cGUgPT0gVUVfSU5URVJSVVBUKSkgeworCQlpZiAoIWhjZC0+ZnJhbWVfbGlzdCkgeworCQkJcmV0dmFsID0gZnJhbWVfbGlzdF9hbGxvYyhoY2QpOworCQkJLyogRW5hYmxlIHBlcmlvZGljIHNjaGVkdWxlIG9uIGZpcnN0IHBlcmlvZGljIFFIICovCisJCQlpZiAocmV0dmFsID09IDApCisJCQkJcGVyX3NjaGVkX2VuYWJsZShoY2QsIE1BWF9GUkxJU1RfRU5fTlVNKTsKKwkJfQorCX0KKworCXFoLT5udGQgPSAwOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqIAorICogRnJlZXMgZGVzY3JpcHRvciBsaXN0IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIFFILiAKKyAqIElmIFFIIGlzIHBlcmlvZGljIGFuZCB0aGUgbGFzdCwgZnJlZXMgRnJhbWVMaXN0IG1lbW9yeSAKKyAqIGFuZCBkaXNhYmxlcyBwZXJpb2RpYyBzY2hlZHVsaW5nLiAKKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0Qgc3RhdGUgc3RydWN0dXJlIGZvciB0aGUgRFdDIE9URyBjb250cm9sbGVyLgorICogQHBhcmFtIHFoIFRoZSBRSCB0byBpbml0LgorICovCit2b2lkIGR3Y19vdGdfaGNkX3FoX2ZyZWVfZGRtYShkd2Nfb3RnX2hjZF90ICogaGNkLCBkd2Nfb3RnX3FoX3QgKiBxaCkKK3sKKwlkZXNjX2xpc3RfZnJlZShxaCk7CisKKwkvKiAKKwkgKiBDaGFubmVsIHN0aWxsIGFzc2lnbmVkIGR1ZSB0byBzb21lIHJlYXNvbnMuIAorCSAqIFNlZW4gb24gSXNvYyBVUkIgZGVxdWV1ZS4gQ2hhbm5lbCBoYWx0ZWQgYnV0IG5vIHN1YnNlcXVlbnQKKwkgKiBDaEhhbHRlZCBpbnRlcnJ1cHQgdG8gcmVsZWFzZSB0aGUgY2hhbm5lbC4gQWZ0ZXJ3YXJkcworCSAqIHdoZW4gaXQgY29tZXMgaGVyZSBmcm9tIGVuZHBvaW50IGRpc2FibGUgcm91dGluZQorCSAqIGNoYW5uZWwgcmVtYWlucyBhc3NpZ25lZC4KKwkgKi8KKwlpZiAocWgtPmNoYW5uZWwpCisJCXJlbGVhc2VfY2hhbm5lbF9kZG1hKGhjZCwgcWgpOworCisJaWYgKChxaC0+ZXBfdHlwZSA9PSBVRV9JU09DSFJPTk9VUyB8fCBxaC0+ZXBfdHlwZSA9PSBVRV9JTlRFUlJVUFQpCisJICAgICYmICFoY2QtPnBlcmlvZGljX2NoYW5uZWxzICYmIGhjZC0+ZnJhbWVfbGlzdCkgeworCisJCXBlcl9zY2hlZF9kaXNhYmxlKGhjZCk7CisJCWZyYW1lX2xpc3RfZnJlZShoY2QpOworCX0KK30KKworc3RhdGljIHVpbnQ4X3QgZnJhbWVfdG9fZGVzY19pZHgoZHdjX290Z19xaF90ICogcWgsIHVpbnQxNl90IGZyYW1lX2lkeCkKK3sKKwlpZiAocWgtPmRldl9zcGVlZCA9PSBEV0NfT1RHX0VQX1NQRUVEX0hJR0gpIHsKKwkJLyogCisJCSAqIERlc2NyaXB0b3Igc2V0KDggZGVzY3JpcHRvcnMpIGluZGV4CisJCSAqIHdoaWNoIGlzIDgtYWxpZ25lZC4KKwkJICovCisJCXJldHVybiAoZnJhbWVfaWR4ICYgKChNQVhfRE1BX0RFU0NfTlVNX0hTX0lTT0MgLyA4KSAtIDEpKSAqIDg7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChmcmFtZV9pZHggJiAoTUFYX0RNQV9ERVNDX05VTV9HRU5FUklDIC0gMSkpOworCX0KK30KKworLyogCisgKiBEZXRlcm1pbmUgc3RhcnRpbmcgZnJhbWUgZm9yIElzb2Nocm9ub3VzIHRyYW5zZmVyLiAKKyAqIEZldyBmcmFtZXMgc2tpcHBlZCB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9uIHdpdGggSEMuIAorICovCitzdGF0aWMgdWludDhfdCBjYWxjX3N0YXJ0aW5nX2ZyYW1lKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoLAorCQkJCSAgIHVpbnQ4X3QgKiBza2lwX2ZyYW1lcykKK3sKKwl1aW50MTZfdCBmcmFtZSA9IDA7CisJaGNkLT5mcmFtZV9udW1iZXIgPSBkd2Nfb3RnX2hjZF9nZXRfZnJhbWVfbnVtYmVyKGhjZCk7CisJCisJLyogc2NoZWRfZnJhbWUgaXMgYWx3YXlzIGZyYW1lIG51bWJlcihub3QgdUZyYW1lKSBib3RoIGluIEZTIGFuZCBIUyAhISAqLworCQorCS8qIAorCSAqIHNraXBfZnJhbWVzIGlzIHVzZWQgdG8gbGltaXQgYWN0aXZhdGVkIGRlc2NyaXB0b3JzIG51bWJlcgorCSAqIHRvIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlbiBIQyBzZXJ2aWNlcyB0aGUgbGFzdCBhY3RpdmF0ZWQKKwkgKiBkZXNjcmlwdG9yIGZpcnN0bHkuCisJICogRXhhbXBsZSBmb3IgRlM6CisJICogQ3VycmVudCBmcmFtZSBpcyAxLCBzY2hlZHVsZWQgZnJhbWUgaXMgMy4gU2luY2UgSEMgYWx3YXlzIGZldGNoZXMgdGhlIGRlc2NyaXB0b3IKKwkgKiBjb3JyZXNwb25kaW5nIHRvIGN1cnJfZnJhbWUrMSwgdGhlIGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byBmcmFtZSAyCisJICogd2lsbCBiZSBmZXRjaGVkLiBJZiB0aGUgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGlzIG1heD02NCAob3IgZ3JlYXRoZXIpIHRoZQorCSAqIGxpc3Qgd2lsbCBiZSBmdWxseSBwcm9ncmFtbWVkIHdpdGggQWN0aXZlIGRlc2NyaXB0b3JzIGFuZCBpdCBpcyBwb3NzaWJsZQorCSAqIGNhc2UocmFyZSkgdGhhdCB0aGUgbGF0ZXN0IGRlc2NyaXB0b3IoY29uc2lkZXJpbmcgcm9sbGJhY2spIGNvcnJlc3BvbmRpbmcKKwkgKiB0byBmcmFtZSAyIHdpbGwgYmUgc2VydmljZWQgZmlyc3QuIEhTIGNhc2UgaXMgbW9yZSBwcm9iYWJsZSBiZWNhdXNlLCBpbiBmYWN0LAorCSAqIHVwIHRvIDExIHVmcmFtZXMoMTYgaW4gdGhlIGNvZGUpIG1heSBiZSBza2lwcGVkLgorCSAqLworCWlmIChxaC0+ZGV2X3NwZWVkID09IERXQ19PVEdfRVBfU1BFRURfSElHSCkgeworCQkvKiAKKwkJICogQ29uc2lkZXIgdWZyYW1lIGNvdW50ZXIgYWxzbywgdG8gc3RhcnQgeGZlciBhc2FwLgorCQkgKiBJZiBoYWxmIG9mIHRoZSBmcmFtZSBlbGFwc2VkIHNraXAgMiBmcmFtZXMgb3RoZXJ3aXNlCisJCSAqIGp1c3QgMSBmcmFtZS4gCisJCSAqIFN0YXJ0aW5nIGRlc2NyaXB0b3IgaW5kZXggbXVzdCBiZSA4LWFsaWduZWQsIHNvCisJCSAqIGlmIHRoZSBjdXJyZW50IGZyYW1lIGlzIG5lYXIgdG8gY29tcGxldGUgdGhlIG5leHQgb25lCisJCSAqIGlzIHNraXBwZWQgYXMgd2VsbC4KKwkJICovCisKKwkJaWYgKGR3Y19taWNyb19mcmFtZV9udW0oaGNkLT5mcmFtZV9udW1iZXIpID49IDUpIHsKKwkJCSpza2lwX2ZyYW1lcyA9IDIgKiA4OworCQkgCWZyYW1lID0gZHdjX2ZyYW1lX251bV9pbmMoaGNkLT5mcmFtZV9udW1iZXIsICpza2lwX2ZyYW1lcyk7CisJCX0gZWxzZSB7CisJCQkqc2tpcF9mcmFtZXMgPSAxICogODsKKwkJCWZyYW1lID0gZHdjX2ZyYW1lX251bV9pbmMoaGNkLT5mcmFtZV9udW1iZXIsICpza2lwX2ZyYW1lcyk7CisJCX0KKworCQlmcmFtZSA9IGR3Y19mdWxsX2ZyYW1lX251bShmcmFtZSk7CisJfSBlbHNlIHsKKwkJLyogCisJCSAqIFR3byBmcmFtZXMgYXJlIHNraXBwZWQgZm9yIEZTIC0gdGhlIGN1cnJlbnQgYW5kIHRoZSBuZXh0LgorCQkgKiBCdXQgZm9yIGRlc2NyaXB0b3IgcHJvZ3JhbW1pbmcsIDEgZnJhbWUoZGVzY3JpcHRvcikgaXMgZW5vdWdoLAorCQkgKiBzZWUgZXhhbXBsZSBhYm92ZS4KKwkJICovCisJCSpza2lwX2ZyYW1lcyA9IDE7CisJCWZyYW1lID0gZHdjX2ZyYW1lX251bV9pbmMoaGNkLT5mcmFtZV9udW1iZXIsIDIpOworCX0KKworCXJldHVybiBmcmFtZTsKK30KKworLyogCisgKiBDYWxjdWxhdGUgaW5pdGlhbCBkZXNjcmlwdG9yIGluZGV4IGZvciBpc29jaHJvbm91cyB0cmFuc2ZlcgorICogYmFzZWQgb24gc2NoZWR1bGVkIGZyYW1lLiAKKyAqLworc3RhdGljIHVpbnQ4X3QgcmVjYWxjX2luaXRpYWxfZGVzY19pZHgoZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX290Z19xaF90ICogcWgpCit7CisJdWludDE2X3QgZnJhbWUgPSAwLCBmcl9pZHgsIGZyX2lkeF90bXA7CisJdWludDhfdCBza2lwX2ZyYW1lcyA9IDA7CisJLyogCisJICogV2l0aCBjdXJyZW50IElTT0MgcHJvY2Vzc2luZyBhbGdvcml0aG0gdGhlIGNoYW5uZWwgaXMgYmVpbmcKKwkgKiByZWxlYXNlZCB3aGVuIG5vIG1vcmUgUVREcyBpbiB0aGUgbGlzdChxaC0+bnRkID09IDApLgorCSAqIFRodXMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSB3aGVuIHFoLT5udGQgPT0gMCBhbmQgcWgtPmNoYW5uZWwgPT0gMC4gCisJICoKKwkgKiBTbyBxaC0+Y2hhbm5lbCAhPSBOVUxMIGJyYW5jaCBpcyBub3QgdXNlZCBhbmQganVzdCBub3QgcmVtb3ZlZCBmcm9tIHRoZQorCSAqIHNvdXJjZSBmaWxlLiBJdCBpcyByZXF1aXJlZCBmb3IgYW5vdGhlciBwb3NzaWJsZSBhcHByb2FjaCB3aGljaCBpcywKKwkgKiBkbyBub3QgZGlzYWJsZSBhbmQgcmVsZWFzZSB0aGUgY2hhbm5lbCB3aGVuIElTT0Mgc2Vzc2lvbiBjb21wbGV0ZWQsIAorCSAqIGp1c3QgbW92ZSBRSCB0byBpbmFjdGl2ZSBzY2hlZHVsZSB1bnRpbCBuZXcgUVREIGFycml2ZXMuIAorCSAqIE9uIG5ldyBRVEQsIHRoZSBRSCBtb3ZlZCBiYWNrIHRvICdyZWFkeScgc2NoZWR1bGUsCisJICogc3RhcnRpbmcgZnJhbWUgYW5kIHRoZXJlZm9yZSBzdGFydGluZyBkZXNjX2luZGV4IGFyZSByZWNhbGN1bGF0ZWQuCisJICogSW4gdGhpcyBjYXNlIGNoYW5uZWwgaXMgcmVsZWFzZWQgb25seSBvbiBlcF9kaXNhYmxlLgorCSAqLworCisJLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIGRlc2NyaXB0b3IgaW5kZXguIEZvciBJTlRFUlJVUFQgZW5kcG9pbnQgaXQgaXMgYWx3YXlzIDAuICovCisJaWYgKHFoLT5jaGFubmVsKSB7CisJCWZyYW1lID0gY2FsY19zdGFydGluZ19mcmFtZShoY2QsIHFoLCAmc2tpcF9mcmFtZXMpOworCQkvKiAKKwkJICogQ2FsY3VsYXRlIGluaXRpYWwgZGVzY3JpcHRvciBpbmRleCBiYXNlZCBvbiBGcmFtZUxpc3QgY3VycmVudCBiaXRtYXAKKwkJICogYW5kIHNlcnZpY2luZyBwZXJpb2QuCisJCSAqLworCQlmcl9pZHhfdG1wID0gZnJhbWVfbGlzdF9pZHgoZnJhbWUpOworCQlmcl9pZHggPQorCQkgICAgKE1BWF9GUkxJU1RfRU5fTlVNICsgZnJhbWVfbGlzdF9pZHgocWgtPnNjaGVkX2ZyYW1lKSAtCisJCSAgICAgZnJfaWR4X3RtcCkKKwkJICAgICUgZnJhbWVfaW5jcl92YWwocWgpOworCQlmcl9pZHggPSAoZnJfaWR4ICsgZnJfaWR4X3RtcCkgJSBNQVhfRlJMSVNUX0VOX05VTTsKKwl9IGVsc2UgeworCQlxaC0+c2NoZWRfZnJhbWUgPSBjYWxjX3N0YXJ0aW5nX2ZyYW1lKGhjZCwgcWgsICZza2lwX2ZyYW1lcyk7CisJCWZyX2lkeCA9IGZyYW1lX2xpc3RfaWR4KHFoLT5zY2hlZF9mcmFtZSk7CisJfQorCisJcWgtPnRkX2ZpcnN0ID0gcWgtPnRkX2xhc3QgPSBmcmFtZV90b19kZXNjX2lkeChxaCwgZnJfaWR4KTsKKworCXJldHVybiBza2lwX2ZyYW1lczsKK30KKworI2RlZmluZQlJU09DX1VSQl9HSVZFQkFDS19BU0FQCisKKyNkZWZpbmUgTUFYX0lTT0NfWEZFUl9TSVpFX0ZTIDEwMjMKKyNkZWZpbmUgTUFYX0lTT0NfWEZFUl9TSVpFX0hTIDMwNzIKKyNkZWZpbmUgREVTQ05VTV9USFJFU0hPTEQgNAorCitzdGF0aWMgdm9pZCBpbml0X2lzb2NfZG1hX2Rlc2MoZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX290Z19xaF90ICogcWgsCisJCQkgICAgICAgdWludDhfdCBza2lwX2ZyYW1lcykKK3sKKwlzdHJ1Y3QgZHdjX290Z19oY2RfaXNvX3BhY2tldF9kZXNjICpmcmFtZV9kZXNjOworCWR3Y19vdGdfcXRkX3QgKnF0ZDsKKwlkd2Nfb3RnX2hvc3RfZG1hX2Rlc2NfdCAqZG1hX2Rlc2M7CisJdWludDE2X3QgaWR4LCBpbmMsIG5fZGVzYywgbnRkX21heCwgbWF4X3hmZXJfc2l6ZTsKKworCWlkeCA9IHFoLT50ZF9sYXN0OworCWluYyA9IHFoLT5pbnRlcnZhbDsKKwluX2Rlc2MgPSAwOworCisJbnRkX21heCA9IChtYXhfZGVzY19udW0ocWgpICsgcWgtPmludGVydmFsIC0gMSkgLyBxaC0+aW50ZXJ2YWw7CisJaWYgKHNraXBfZnJhbWVzICYmICFxaC0+Y2hhbm5lbCkKKwkJbnRkX21heCA9IG50ZF9tYXggLSBza2lwX2ZyYW1lcyAvIHFoLT5pbnRlcnZhbDsKKworCW1heF94ZmVyX3NpemUgPQorCSAgICAocWgtPmRldl9zcGVlZCA9PQorCSAgICAgRFdDX09UR19FUF9TUEVFRF9ISUdIKSA/IE1BWF9JU09DX1hGRVJfU0laRV9IUyA6CisJICAgIE1BWF9JU09DX1hGRVJfU0laRV9GUzsKKworCURXQ19DSVJDTEVRX0ZPUkVBQ0gocXRkLCAmcWgtPnF0ZF9saXN0LCBxdGRfbGlzdF9lbnRyeSkgeworCQl3aGlsZSAoKHFoLT5udGQgPCBudGRfbWF4KQorCQkgICAgICAgJiYgKHF0ZC0+aXNvY19mcmFtZV9pbmRleF9sYXN0IDwKKwkJCSAgIHF0ZC0+dXJiLT5wYWNrZXRfY291bnQpKSB7CisKKwkJCWRtYV9kZXNjID0gJnFoLT5kZXNjX2xpc3RbaWR4XTsKKwkJCWR3Y19tZW1zZXQoZG1hX2Rlc2MsIDB4MDAsIHNpemVvZihkd2Nfb3RnX2hvc3RfZG1hX2Rlc2NfdCkpOworCisJCQlmcmFtZV9kZXNjID0gJnF0ZC0+dXJiLT5pc29fZGVzY3NbcXRkLT5pc29jX2ZyYW1lX2luZGV4X2xhc3RdOworCisJCQlpZiAoZnJhbWVfZGVzYy0+bGVuZ3RoID4gbWF4X3hmZXJfc2l6ZSkKKwkJCQlxaC0+bl9ieXRlc1tpZHhdID0gbWF4X3hmZXJfc2l6ZTsKKwkJCWVsc2UKKwkJCQlxaC0+bl9ieXRlc1tpZHhdID0gZnJhbWVfZGVzYy0+bGVuZ3RoOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iX2lzb2Mubl9ieXRlcyA9IHFoLT5uX2J5dGVzW2lkeF07CisJCQlkbWFfZGVzYy0+c3RhdHVzLmJfaXNvYy5hID0gMTsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYl9pc29jLnN0cyA9IDA7CisKKwkJCWRtYV9kZXNjLT5idWYgPSBxdGQtPnVyYi0+ZG1hICsgZnJhbWVfZGVzYy0+b2Zmc2V0OworCisJCQlxaC0+bnRkKys7CisKKwkJCXF0ZC0+aXNvY19mcmFtZV9pbmRleF9sYXN0Kys7CisKKyNpZmRlZglJU09DX1VSQl9HSVZFQkFDS19BU0FQCisJCQkvKiAKKwkJCSAqIFNldCBJT0MgZm9yIGVhY2ggZGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSAKKwkJCSAqIGxhc3QgZnJhbWUgb2YgdGhlIFVSQi4KKwkJCSAqLworCQkJaWYgKHF0ZC0+aXNvY19mcmFtZV9pbmRleF9sYXN0ID09CisJCQkgICAgcXRkLT51cmItPnBhY2tldF9jb3VudCkKKwkJCQlkbWFfZGVzYy0+c3RhdHVzLmJfaXNvYy5pb2MgPSAxOworCisjZW5kaWYKKwkJCWlkeCA9IGRlc2NsaXN0X2lkeF9pbmMoaWR4LCBpbmMsIHFoLT5kZXZfc3BlZWQpOworCQkJbl9kZXNjKys7CisKKwkJfQorCQlxdGQtPmluX3Byb2Nlc3MgPSAxOworCX0KKworCXFoLT50ZF9sYXN0ID0gaWR4OworCisjaWZkZWYJSVNPQ19VUkJfR0lWRUJBQ0tfQVNBUAorCS8qIFNldCBJT0MgZm9yIHRoZSBsYXN0IGRlc2NyaXB0b3IgaWYgZGVzY3JpcHRvciBsaXN0IGlzIGZ1bGwgKi8KKwlpZiAocWgtPm50ZCA9PSBudGRfbWF4KSB7CisJCWlkeCA9IGRlc2NsaXN0X2lkeF9kZWMocWgtPnRkX2xhc3QsIGluYywgcWgtPmRldl9zcGVlZCk7CisJCXFoLT5kZXNjX2xpc3RbaWR4XS5zdGF0dXMuYl9pc29jLmlvYyA9IDE7CisJfQorI2Vsc2UKKwkvKiAKKwkgKiBTZXQgSU9DIGJpdCBvbmx5IGZvciBvbmUgZGVzY3JpcHRvci4gCisJICogQWx3YXlzIHRyeSB0byBiZSBhaGVhZCBvZiBIVyBwcm9jZXNzaW5nLAorCSAqIGkuZS4gb24gSU9DIGdlbmVyYXRpb24gZHJpdmVyIGFjdGl2YXRlcyBuZXh0IGRlc2NyaXB0b3JzIGJ1dAorCSAqIGNvcmUgY29udGludWVzIHRvIHByb2Nlc3MgZGVzY3JpcHRvcnMgZm9sbG93ZWQgdGhlIG9uZSB3aXRoIElPQyBzZXQuCisJICovCisKKwlpZiAobl9kZXNjID4gREVTQ05VTV9USFJFU0hPTEQpIHsKKwkJLyogCisJCSAqIE1vdmUgSU9DICJ1cCIuIFJlcXVpcmVkIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUgUVREIAorCQkgKiBpbiB0aGUgbGlzdCwgY2F1c2UgUVREcyBtaWd0aCBjb250aW51ZSB0byBiZSBxdWV1ZWQsCisJCSAqIGJ1dCBkdXJpbmcgdGhlIGFjdGl2YXRpb24gaXQgd2FzIG9ubHkgb25lIHF1ZXVlZC4KKwkJICogQWN0dWFsbHkgbW9yZSB0aGFuIG9uZSBRVEQgbWlnaHQgYmUgaW4gdGhlIGxpc3QgaWYgdGhpcyBmdW5jdGlvbiBjYWxsZWQgCisJCSAqIGZyb20gWGZlckNvbXBsZXRpb24gLSBRVERzIHdhcyBxdWV1ZWQgZHVyaW5nIEhXIHByb2Nlc3Npbmcgb2YgdGhlIHByZXZpb3VzCisJCSAqIGRlc2NyaXB0b3IgY2h1bmsuCisJCSAqLworCQlpZHggPSBkd2NfZGVzY2xpc3RfaWR4X2RlYyhpZHgsIGluYyAqICgocWgtPm50ZCArIDEpIC8gMiksIHFoLT5kZXZfc3BlZWQpOworCX0gZWxzZSB7CisJCS8qIAorCQkgKiBTZXQgdGhlIElPQyBmb3IgdGhlIGxhdGVzdCBkZXNjcmlwdG9yCisJCSAqIGlmIGVpdGhlciBudW1iZXIgb2YgZGVzY3JpcHRvciBpcyBub3QgZ3JlYXRoZXIgdGhhbiB0aHJlc2hvbGQKKwkJICogb3Igbm8gbW9yZSBuZXcgZGVzY3JpcHRvcnMgYWN0aXZhdGVkLgorCQkgKi8KKwkJaWR4ID0gZHdjX2Rlc2NsaXN0X2lkeF9kZWMocWgtPnRkX2xhc3QsIGluYywgcWgtPmRldl9zcGVlZCk7CisJfQorCisJcWgtPmRlc2NfbGlzdFtpZHhdLnN0YXR1cy5iX2lzb2MuaW9jID0gMTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBpbml0X25vbl9pc29jX2RtYV9kZXNjKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCisJZHdjX2hjX3QgKmhjOworCWR3Y19vdGdfaG9zdF9kbWFfZGVzY190ICpkbWFfZGVzYzsKKwlkd2Nfb3RnX3F0ZF90ICpxdGQ7CisJaW50IG51bV9wYWNrZXRzLCBsZW4sIG5fZGVzYyA9IDA7CisKKwloYyA9IHFoLT5jaGFubmVsOworCisJLyogCisJICogU3RhcnQgd2l0aCBoYy0+eGZlcl9idWZmIGluaXRpYWxpemVkIGluIAorCSAqIGFzc2lnbl9hbmRfaW5pdF9oYygpLCB0aGVuIGlmIFNHIHRyYW5zZmVyIGNvbnNpc3RzIG9mIG11bHRpcGxlIFVSQnMsCisJICogdGhpcyBwb2ludGVyIHJlLWFzc2lnbmVkIHRvIHRoZSBidWZmZXIgb2YgdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgUVRELgorCSAqIEZvciBub24tU0cgcmVxdWVzdCB0aGVyZSBpcyBhbHdheXMgb25lIFFURCBhY3RpdmUuCisJICovCisKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIKHF0ZCwgJnFoLT5xdGRfbGlzdCwgcXRkX2xpc3RfZW50cnkpIHsKKworCQlpZiAobl9kZXNjKSB7CisJCQkvKiBTRyByZXF1ZXN0IC0gbW9yZSB0aGFuIDEgUVREcyAqLworCSAJCWhjLT54ZmVyX2J1ZmYgPSAodWludDhfdCAqKXF0ZC0+dXJiLT5kbWEgKyBxdGQtPnVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJCWhjLT54ZmVyX2xlbiA9IHF0ZC0+dXJiLT5sZW5ndGggLSBxdGQtPnVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJfQorCisJCXF0ZC0+bl9kZXNjID0gMDsKKworCQlkbyB7CisJCQlkbWFfZGVzYyA9ICZxaC0+ZGVzY19saXN0W25fZGVzY107CisJCQlsZW4gPSBoYy0+eGZlcl9sZW47CisKKwkJCWlmIChsZW4gPiBNQVhfRE1BX0RFU0NfU0laRSkKKwkJCQlsZW4gPSBNQVhfRE1BX0RFU0NfU0laRSAtIGhjLT5tYXhfcGFja2V0ICsgMTsKKworCQkJaWYgKGhjLT5lcF9pc19pbikgeworCQkJCWlmIChsZW4gPiAwKSB7CisJCQkJCW51bV9wYWNrZXRzID0gKGxlbiArIGhjLT5tYXhfcGFja2V0IC0gMSkgLyBoYy0+bWF4X3BhY2tldDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBOZWVkIDEgcGFja2V0IGZvciB0cmFuc2ZlciBsZW5ndGggb2YgMC4gKi8KKwkJCQkJbnVtX3BhY2tldHMgPSAxOworCQkJCX0KKwkJCQkvKiBBbHdheXMgcHJvZ3JhbSBhbiBpbnRlZ3JhbCAjIG9mIG1heCBwYWNrZXRzIGZvciBJTiB0cmFuc2ZlcnMuICovCisJCQkJbGVuID0gbnVtX3BhY2tldHMgKiBoYy0+bWF4X3BhY2tldDsKKwkJCX0KKworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLm5fYnl0ZXMgPSBsZW47CisKKwkJCXFoLT5uX2J5dGVzW25fZGVzY10gPSBsZW47CisKKwkJCWlmICgocWgtPmVwX3R5cGUgPT0gVUVfQ09OVFJPTCkKKwkJCSAgICAmJiAocXRkLT5jb250cm9sX3BoYXNlID09IERXQ19PVEdfQ09OVFJPTF9TRVRVUCkpCisJCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLnN1cCA9IDE7CS8qIFNldHVwIFBhY2tldCAqLworCisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuYSA9IDE7CS8qIEFjdGl2ZSBkZXNjcmlwdG9yICovCisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuc3RzID0gMDsKKworCQkJZG1hX2Rlc2MtPmJ1ZiA9CisJCQkgICAgKCh1bnNpZ25lZCBsb25nKWhjLT54ZmVyX2J1ZmYgJiAweGZmZmZmZmZmKTsKKworCQkJLyogCisJCQkgKiBMYXN0IGRlc2NyaXB0b3Iob3Igc2luZ2xlKSBvZiBJTiB0cmFuc2ZlciAKKwkJCSAqIHdpdGggYWN0dWFsIHNpemUgbGVzcyB0aGFuIE1heFBhY2tldC4KKwkJCSAqLworCQkJaWYgKGxlbiA+IGhjLT54ZmVyX2xlbikgeworCQkJCWhjLT54ZmVyX2xlbiA9IDA7CisJCQl9IGVsc2UgeworCQkJCWhjLT54ZmVyX2J1ZmYgKz0gbGVuOworCQkJCWhjLT54ZmVyX2xlbiAtPSBsZW47CisJCQl9CisKKwkJCXF0ZC0+bl9kZXNjKys7CisJCQluX2Rlc2MrKzsKKwkJfQorCQl3aGlsZSAoKGhjLT54ZmVyX2xlbiA+IDApICYmIChuX2Rlc2MgIT0gTUFYX0RNQV9ERVNDX05VTV9HRU5FUklDKSk7CisJCQorCisJCXF0ZC0+aW5fcHJvY2VzcyA9IDE7CisKKwkJaWYgKHFoLT5lcF90eXBlID09IFVFX0NPTlRST0wpCisJCQlicmVhazsKKworCQlpZiAobl9kZXNjID09IE1BWF9ETUFfREVTQ19OVU1fR0VORVJJQykKKwkJCWJyZWFrOworCX0KKworCWlmIChuX2Rlc2MpIHsKKwkJLyogUmVxdWVzdCBUcmFuc2ZlciBDb21wbGV0ZSBpbnRlcnJ1cHQgZm9yIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwkJcWgtPmRlc2NfbGlzdFtuX2Rlc2MgLSAxXS5zdGF0dXMuYi5pb2MgPSAxOworCQkvKiBFbmQgb2YgTGlzdCBpbmRpY2F0b3IgKi8KKwkJcWgtPmRlc2NfbGlzdFtuX2Rlc2MgLSAxXS5zdGF0dXMuYi5lb2wgPSAxOworCisJCWhjLT5udGQgPSBuX2Rlc2M7CisJfQorfQorCisvKiogCisgKiBGb3IgQ29udHJvbCBhbmQgQnVsayBlbmRwb2ludHMgaW5pdGlhbGl6ZXMgZGVzY3JpcHRvciBsaXN0CisgKiBhbmQgc3RhcnRzIHRoZSB0cmFuc2Zlci4KKyAqCisgKiBGb3IgSW50ZXJydXB0IGFuZCBJc29jaHJvbm91cyBlbmRwb2ludHMgaW5pdGlhbGl6ZXMgZGVzY3JpcHRvciBsaXN0CisgKiB0aGVuIHVwZGF0ZXMgRnJhbWVMaXN0LCBtYXJraW5nIGFwcHJvcHJpYXRlIGVudHJpZXMgYXMgYWN0aXZlLgorICogSW4gY2FzZSBvZiBJc29jaHJvbm91cywgdGhlIHN0YXJ0aW5nIGRlc2NyaXB0b3IgaW5kZXggaXMgY2FsY3VsYXRlZCBiYXNlZAorICogb24gdGhlIHNjaGVkdWxlZCBmcmFtZSwgYnV0IG9ubHkgb24gdGhlIGZpcnN0IHRyYW5zZmVyIGRlc2NyaXB0b3Igd2l0aGluIGEgc2Vzc2lvbi4KKyAqIFRoZW4gc3RhcnRzIHRoZSB0cmFuc2ZlciB2aWEgZW5hYmxpbmcgdGhlIGNoYW5uZWwuIAorICogRm9yIElzb2Nocm9ub3VzIGVuZHBvaW50IHRoZSBjaGFubmVsIGlzIG5vdCBoYWx0ZWQgb24gWGZlckNvbXBsZXRlIAorICogaW50ZXJydXB0IHNvIHJlbWFpbnMgYXNzaWduZWQgdG8gdGhlIGVuZHBvaW50KFFIKSB1bnRpbCBzZXNzaW9uIGlzIGRvbmUuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENEIHN0YXRlIHN0cnVjdHVyZSBmb3IgdGhlIERXQyBPVEcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBxaCBUaGUgUUggdG8gaW5pdC4KKyAqCisgKiBAcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3ZvaWQgZHdjX290Z19oY2Rfc3RhcnRfeGZlcl9kZG1hKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCS8qIENoYW5uZWwgaXMgYWxyZWFkeSBhc3NpZ25lZCAqLworCWR3Y19oY190ICpoYyA9IHFoLT5jaGFubmVsOworCXVpbnQ4X3Qgc2tpcF9mcmFtZXMgPSAwOworCisJc3dpdGNoIChoYy0+ZXBfdHlwZSkgeworCWNhc2UgRFdDX09UR19FUF9UWVBFX0NPTlRST0w6CisJY2FzZSBEV0NfT1RHX0VQX1RZUEVfQlVMSzoKKwkJaW5pdF9ub25faXNvY19kbWFfZGVzYyhoY2QsIHFoKTsKKworCQlkd2Nfb3RnX2hjX3N0YXJ0X3RyYW5zZmVyX2RkbWEoaGNkLT5jb3JlX2lmLCBoYyk7CisJCWJyZWFrOworCWNhc2UgRFdDX09UR19FUF9UWVBFX0lOVFI6CisJCWluaXRfbm9uX2lzb2NfZG1hX2Rlc2MoaGNkLCBxaCk7CisKKwkJdXBkYXRlX2ZyYW1lX2xpc3QoaGNkLCBxaCwgMSk7CisKKwkJZHdjX290Z19oY19zdGFydF90cmFuc2Zlcl9kZG1hKGhjZC0+Y29yZV9pZiwgaGMpOworCQlicmVhazsKKwljYXNlIERXQ19PVEdfRVBfVFlQRV9JU09DOgorCisJCWlmICghcWgtPm50ZCkKKwkJCXNraXBfZnJhbWVzID0gcmVjYWxjX2luaXRpYWxfZGVzY19pZHgoaGNkLCBxaCk7CisKKwkJaW5pdF9pc29jX2RtYV9kZXNjKGhjZCwgcWgsIHNraXBfZnJhbWVzKTsKKworCQlpZiAoIWhjLT54ZmVyX3N0YXJ0ZWQpIHsKKworCQkJdXBkYXRlX2ZyYW1lX2xpc3QoaGNkLCBxaCwgMSk7CisKKwkJCS8qIAorCQkJICogQWx3YXlzIHNldCB0byBtYXgsIGluc3RlYWQgb2YgYWN0dWFsIHNpemUuCisJCQkgKiBPdGhlcndpc2UgbnRkIHdpbGwgYmUgY2hhbmdlZCB3aXRoIAorCQkJICogY2hhbm5lbCBiZWluZyBlbmFibGVkLiBOb3QgcmVjb21tZW5kZWQuCisJCQkgKgorCQkJICovCisJCQloYy0+bnRkID0gbWF4X2Rlc2NfbnVtKHFoKTsKKwkJCS8qIEVuYWJsZSBjaGFubmVsIG9ubHkgb25jZSBmb3IgSVNPQyAqLworCQkJZHdjX290Z19oY19zdGFydF90cmFuc2Zlcl9kZG1hKGhjZC0+Y29yZV9pZiwgaGMpOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbXBsZXRlX2lzb2NfeGZlcl9kZG1hKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJICAgIGR3Y19oY190ICogaGMsCisJCQkJICAgIGR3Y19vdGdfaGNfcmVnc190ICogaGNfcmVncywKKwkJCQkgICAgZHdjX290Z19oYWx0X3N0YXR1c19lIGhhbHRfc3RhdHVzKQoreworCXN0cnVjdCBkd2Nfb3RnX2hjZF9pc29fcGFja2V0X2Rlc2MgKmZyYW1lX2Rlc2M7CisJZHdjX290Z19xdGRfdCAqcXRkLCAqcXRkX3RtcDsKKwlkd2Nfb3RnX3FoX3QgKnFoOworCWR3Y19vdGdfaG9zdF9kbWFfZGVzY190ICpkbWFfZGVzYzsKKwl1aW50MTZfdCBpZHgsIHJlbWFpbjsKKwl1aW50OF90IHVyYl9jb21wbDsKKworCXFoID0gaGMtPnFoOworCWlkeCA9IHFoLT50ZF9maXJzdDsKKworCWlmIChoYy0+aGFsdF9zdGF0dXMgPT0gRFdDX09UR19IQ19YRkVSX1VSQl9ERVFVRVVFKSB7CisJCURXQ19DSVJDTEVRX0ZPUkVBQ0hfU0FGRShxdGQsIHF0ZF90bXAsICZoYy0+cWgtPnF0ZF9saXN0LCBxdGRfbGlzdF9lbnRyeSkKKwkJICAgIHF0ZC0+aW5fcHJvY2VzcyA9IDA7CisJCXJldHVybjsKKwl9IGVsc2UgaWYgKChoYWx0X3N0YXR1cyA9PSBEV0NfT1RHX0hDX1hGRVJfQUhCX0VSUikgfHwKKwkJICAgKGhhbHRfc3RhdHVzID09IERXQ19PVEdfSENfWEZFUl9CQUJCTEVfRVJSKSkgeworCQkvKiAKKwkJICogQ2hhbm5lbCBpcyBoYWx0ZWQgaW4gdGhlc2UgZXJyb3IgY2FzZXMuCisJCSAqIENvbnNpZGVyZWQgYXMgc2VyaW91cyBpc3N1ZXMuCisJCSAqIENvbXBsZXRlIGFsbCBVUkJzIG1hcmtpbmcgYWxsIGZyYW1lcyBhcyBmYWlsZWQsIAorCQkgKiBpcnJlc3BlY3RpdmUgd2hldGhlciBzb21lIG9mIHRoZSBkZXNjcmlwdG9ycyhmcmFtZXMpIHN1Y2NlZWRlZCBvciBuby4KKwkJICogUGFzcyBlcnJvciBjb2RlIHRvIGNvbXBsZXRpb24gcm91dGluZSBhcyB3ZWxsLCB0bworCQkgKiB1cGRhdGUgdXJiLT5zdGF0dXMsIHNvbWUgb2YgY2xhc3MgZHJpdmVycyBtaWdodCB1c2UgaXQgdG8gc3RvcAorCQkgKiBxdWVpbmcgdHJhbnNmZXIgcmVxdWVzdHMuCisJCSAqLworCQlpbnQgZXJyID0gKGhhbHRfc3RhdHVzID09IERXQ19PVEdfSENfWEZFUl9BSEJfRVJSKQorCQkgICAgPyAoLURXQ19FX0lPKQorCQkgICAgOiAoLURXQ19FX09WRVJGTE9XKTsKKwkJCQkJCQorCQlEV0NfQ0lSQ0xFUV9GT1JFQUNIX1NBRkUocXRkLCBxdGRfdG1wLCAmaGMtPnFoLT5xdGRfbGlzdCwgcXRkX2xpc3RfZW50cnkpIHsKKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgcXRkLT51cmItPnBhY2tldF9jb3VudDsgaWR4KyspIHsKKwkJCQlmcmFtZV9kZXNjID0gJnF0ZC0+dXJiLT5pc29fZGVzY3NbaWR4XTsKKwkJCQlmcmFtZV9kZXNjLT5zdGF0dXMgPSBlcnI7CisJCQl9CisJCQloY2QtPmZvcHMtPmNvbXBsZXRlKGhjZCwgcXRkLT51cmItPnByaXYsIHF0ZC0+dXJiLCBlcnIpOworCQkJZHdjX290Z19oY2RfcXRkX3JlbW92ZV9hbmRfZnJlZShoY2QsIHF0ZCwgcWgpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIX1NBRkUocXRkLCBxdGRfdG1wLCAmaGMtPnFoLT5xdGRfbGlzdCwgcXRkX2xpc3RfZW50cnkpIHsKKworCQlpZiAoIXF0ZC0+aW5fcHJvY2VzcykKKwkJCWJyZWFrOworCisJCXVyYl9jb21wbCA9IDA7CisKKwkJZG8geworCisJCQlkbWFfZGVzYyA9ICZxaC0+ZGVzY19saXN0W2lkeF07CisJCQkKKwkJCWZyYW1lX2Rlc2MgPSAmcXRkLT51cmItPmlzb19kZXNjc1txdGQtPmlzb2NfZnJhbWVfaW5kZXhdOworCQkJcmVtYWluID0gaGMtPmVwX2lzX2luID8gZG1hX2Rlc2MtPnN0YXR1cy5iX2lzb2Mubl9ieXRlcyA6IDA7CisKKwkJCWlmIChkbWFfZGVzYy0+c3RhdHVzLmJfaXNvYy5zdHMgPT0gRE1BX0RFU0NfU1RTX1BLVEVSUikgeworCQkJCS8qIAorCQkJCSAqIFhhY3RFcnJvciBvciwgdW5hYmxlIHRvIGNvbXBsZXRlIGFsbCB0aGUgdHJhbnNhY3Rpb25zIAorCQkJCSAqIGluIHRoZSBzY2hlZHVsZWQgbWljcm8tZnJhbWUvZnJhbWUsIAorCQkJCSAqIGJvdGggaW5kaWNhdGVkIGJ5IERNQV9ERVNDX1NUU19QS1RFUlIuCisJCQkJICovCisJCQkJcXRkLT51cmItPmVycm9yX2NvdW50Kys7CisJCQkJZnJhbWVfZGVzYy0+YWN0dWFsX2xlbmd0aCA9IHFoLT5uX2J5dGVzW2lkeF0gLSByZW1haW47CisJCQkJZnJhbWVfZGVzYy0+c3RhdHVzID0gLURXQ19FX1BST1RPQ09MOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTdWNjZXNzICovCisJCQkJCQkJCQorCQkJCWZyYW1lX2Rlc2MtPmFjdHVhbF9sZW5ndGggPSBxaC0+bl9ieXRlc1tpZHhdIC0gcmVtYWluOworCQkJCWZyYW1lX2Rlc2MtPnN0YXR1cyA9IDA7CisJCQl9CisKKwkJCWlmICgrK3F0ZC0+aXNvY19mcmFtZV9pbmRleCA9PSBxdGQtPnVyYi0+cGFja2V0X2NvdW50KSB7CisJCQkJLyoKKwkJCQkgKiB1cmItPnN0YXR1cyBpcyBub3QgdXNlZCBmb3IgaXNvYyB0cmFuc2ZlcnMgaGVyZS4KKwkJCQkgKiBUaGUgaW5kaXZpZHVhbCBmcmFtZV9kZXNjIHN0YXR1cyBhcmUgdXNlZCBpbnN0ZWFkLgorCQkJCSAqLworCisJCQkJaGNkLT5mb3BzLT5jb21wbGV0ZShoY2QsIHF0ZC0+dXJiLT5wcml2LCBxdGQtPnVyYiwgMCk7CisJCQkJZHdjX290Z19oY2RfcXRkX3JlbW92ZV9hbmRfZnJlZShoY2QsIHF0ZCwgcWgpOworCisJCQkJLyogCisJCQkJICogVGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgYmVjYXVzZSB1cmJfZGVxdWV1ZSBjYW4gYmUgY2FsbGVkIAorCQkJCSAqIGZyb20gdXJiIGNvbXBsZXRlIGNhbGxiYWNrKHNvdW5kIGRyaXZlciBleGFtcGxlKS4KKwkJCQkgKiBBbGwgcGVuZGluZyBVUkJzIGFyZSBkZXF1ZXVlZCB0aGVyZSwgc28gbm8gbmVlZCBmb3IKKwkJCQkgKiBmdXJ0aGVyIHByb2Nlc3NpbmcuCisJCQkJICovCisJCQkJaWYgKGhjLT5oYWx0X3N0YXR1cyA9PSBEV0NfT1RHX0hDX1hGRVJfVVJCX0RFUVVFVUUpIHsJCisJCQkJCXJldHVybjsKKwkJCQl9CisKKwkJCQl1cmJfY29tcGwgPSAxOworCisJCQl9CisKKwkJCXFoLT5udGQtLTsKKworCQkJLyogU3RvcCBpZiBJT0MgcmVxdWVzdGVkIGRlc2NyaXB0b3IgcmVhY2hlZCAqLworCQkJaWYgKGRtYV9kZXNjLT5zdGF0dXMuYl9pc29jLmlvYykgeworCQkJCWlkeCA9IGRlc2NsaXN0X2lkeF9pbmMoaWR4LCBxaC0+aW50ZXJ2YWwsIGhjLT5zcGVlZCk7CQorCQkJCWdvdG8gc3RvcF9zY2FuOworCQkJfQorCisJCQlpZHggPSBkZXNjbGlzdF9pZHhfaW5jKGlkeCwgcWgtPmludGVydmFsLCBoYy0+c3BlZWQpOworCisJCQlpZiAodXJiX2NvbXBsKQorCQkJCWJyZWFrOworCQl9CisJCXdoaWxlIChpZHggIT0gcWgtPnRkX2ZpcnN0KTsKKwl9CitzdG9wX3NjYW46CisJcWgtPnRkX2ZpcnN0ID0gaWR4OworfQorCit1aW50OF90IHVwZGF0ZV9ub25faXNvY191cmJfc3RhdGVfZGRtYShkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkJCSAgICAgICBkd2NfaGNfdCAqIGhjLAorCQkJCSAgICAgICBkd2Nfb3RnX3F0ZF90ICogcXRkLAorCQkJCSAgICAgICBkd2Nfb3RnX2hvc3RfZG1hX2Rlc2NfdCAqIGRtYV9kZXNjLAorCQkJCSAgICAgICBkd2Nfb3RnX2hhbHRfc3RhdHVzX2UgaGFsdF9zdGF0dXMsCisJCQkJICAgICAgIHVpbnQzMl90IG5fYnl0ZXMsIHVpbnQ4X3QgKiB4ZmVyX2RvbmUpCit7CisKKwl1aW50MTZfdCByZW1haW4gPSBoYy0+ZXBfaXNfaW4gPyBkbWFfZGVzYy0+c3RhdHVzLmIubl9ieXRlcyA6IDA7CisJZHdjX290Z19oY2RfdXJiX3QgKnVyYiA9IHF0ZC0+dXJiOworCisJaWYgKGhhbHRfc3RhdHVzID09IERXQ19PVEdfSENfWEZFUl9BSEJfRVJSKSB7CisJCXVyYi0+c3RhdHVzID0gLURXQ19FX0lPOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGRtYV9kZXNjLT5zdGF0dXMuYi5zdHMgPT0gRE1BX0RFU0NfU1RTX1BLVEVSUikgeworCQlzd2l0Y2ggKGhhbHRfc3RhdHVzKSB7CisJCWNhc2UgRFdDX09UR19IQ19YRkVSX1NUQUxMOgorCQkJdXJiLT5zdGF0dXMgPSAtRFdDX0VfUElQRTsKKwkJCWJyZWFrOworCQljYXNlIERXQ19PVEdfSENfWEZFUl9CQUJCTEVfRVJSOgorCQkJdXJiLT5zdGF0dXMgPSAtRFdDX0VfT1ZFUkZMT1c7CisJCQlicmVhazsKKwkJY2FzZSBEV0NfT1RHX0hDX1hGRVJfWEFDVF9FUlI6CisJCQl1cmItPnN0YXR1cyA9IC1EV0NfRV9QUk9UT0NPTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkKKwkJCURXQ19FUlJPUigiJXM6IFVuaGFuZGxlZCBkZXNjcmlwdG9yIGVycm9yIHN0YXR1cyAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJCSAgCSAgaGFsdF9zdGF0dXMpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRtYV9kZXNjLT5zdGF0dXMuYi5hID09IDEpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsCisJCQkgICAgIkFjdGl2ZSBkZXNjcmlwdG9yIGVuY291bnRlcmVkIG9uIGNoYW5uZWwgJWRcbiIsCisJCQkgICAgaGMtPmhjX251bSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfQ09OVFJPTCkgeworCQlpZiAocXRkLT5jb250cm9sX3BoYXNlID09IERXQ19PVEdfQ09OVFJPTF9EQVRBKSB7CisJCQl1cmItPmFjdHVhbF9sZW5ndGggKz0gbl9ieXRlcyAtIHJlbWFpbjsKKwkJCWlmIChyZW1haW4gfHwgdXJiLT5hY3R1YWxfbGVuZ3RoID09IHVyYi0+bGVuZ3RoKSB7CisJCQkJLyogCisJCQkJICogRm9yIENvbnRyb2wgRGF0YSBzdGFnZSBkbyBub3Qgc2V0IHVyYi0+c3RhdHVzPTAgdG8gcHJldmVudAorCQkJCSAqIFVSQiBjYWxsYmFjay4gU2V0IGl0IHdoZW4gU3RhdHVzIHBoYXNlIGRvbmUuIFNlZSBiZWxvdy4KKwkJCQkgKi8KKwkJCQkqeGZlcl9kb25lID0gMTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKHF0ZC0+Y29udHJvbF9waGFzZSA9PSBEV0NfT1RHX0NPTlRST0xfU1RBVFVTKSB7CisJCQl1cmItPnN0YXR1cyA9IDA7CisJCQkqeGZlcl9kb25lID0gMTsKKwkJfQorCQkvKiBObyBoYW5kbGluZyBmb3IgU0VUVVAgc3RhZ2UgKi8KKwl9IGVsc2UgeworCQkvKiBCVUxLIGFuZCBJTlRSICovCisJCXVyYi0+YWN0dWFsX2xlbmd0aCArPSBuX2J5dGVzIC0gcmVtYWluOworCQlpZiAocmVtYWluIHx8IHVyYi0+YWN0dWFsX2xlbmd0aCA9PSB1cmItPmxlbmd0aCkgeworCQkJdXJiLT5zdGF0dXMgPSAwOworCQkJKnhmZXJfZG9uZSA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY29tcGxldGVfbm9uX2lzb2NfeGZlcl9kZG1hKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJCWR3Y19oY190ICogaGMsCisJCQkJCWR3Y19vdGdfaGNfcmVnc190ICogaGNfcmVncywKKwkJCQkJZHdjX290Z19oYWx0X3N0YXR1c19lIGhhbHRfc3RhdHVzKQoreworCWR3Y19vdGdfaGNkX3VyYl90ICp1cmIgPSBOVUxMOworCWR3Y19vdGdfcXRkX3QgKnF0ZCwgKnF0ZF90bXA7CisJZHdjX290Z19xaF90ICpxaDsKKwlkd2Nfb3RnX2hvc3RfZG1hX2Rlc2NfdCAqZG1hX2Rlc2M7CisJdWludDMyX3Qgbl9ieXRlcywgbl9kZXNjLCBpOworCXVpbnQ4X3QgZmFpbGVkID0gMCwgeGZlcl9kb25lOworCisJbl9kZXNjID0gMDsKKworCXFoID0gaGMtPnFoOworCisJaWYgKGhjLT5oYWx0X3N0YXR1cyA9PSBEV0NfT1RHX0hDX1hGRVJfVVJCX0RFUVVFVUUpIHsKKwkJRFdDX0NJUkNMRVFfRk9SRUFDSF9TQUZFKHF0ZCwgcXRkX3RtcCwgJmhjLT5xaC0+cXRkX2xpc3QsIHF0ZF9saXN0X2VudHJ5KSB7CisJCQlxdGQtPmluX3Byb2Nlc3MgPSAwOworCQl9CisJCXJldHVybjsKKwl9CisKKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIX1NBRkUocXRkLCBxdGRfdG1wLCAmcWgtPnF0ZF9saXN0LCBxdGRfbGlzdF9lbnRyeSkgeworCisJCXVyYiA9IHF0ZC0+dXJiOworCisJCW5fYnl0ZXMgPSAwOworCQl4ZmVyX2RvbmUgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBxdGQtPm5fZGVzYzsgaSsrKSB7CisJCQlkbWFfZGVzYyA9ICZxaC0+ZGVzY19saXN0W25fZGVzY107CisKKwkJCW5fYnl0ZXMgPSBxaC0+bl9ieXRlc1tuX2Rlc2NdOworCisJCQlmYWlsZWQgPQorCQkJICAgIHVwZGF0ZV9ub25faXNvY191cmJfc3RhdGVfZGRtYShoY2QsIGhjLCBxdGQsCisJCQkJCQkJICAgZG1hX2Rlc2MsCisJCQkJCQkJICAgaGFsdF9zdGF0dXMsIG5fYnl0ZXMsCisJCQkJCQkJICAgJnhmZXJfZG9uZSk7CisKKwkJCWlmIChmYWlsZWQKKwkJCSAgICB8fCAoeGZlcl9kb25lCisJCQkJJiYgKHVyYi0+c3RhdHVzICE9IC1EV0NfRV9JTl9QUk9HUkVTUykpKSB7CisKKwkJCQloY2QtPmZvcHMtPmNvbXBsZXRlKGhjZCwgdXJiLT5wcml2LCB1cmIsCisJCQkJCQkgICAgdXJiLT5zdGF0dXMpOworCQkJCWR3Y19vdGdfaGNkX3F0ZF9yZW1vdmVfYW5kX2ZyZWUoaGNkLCBxdGQsIHFoKTsKKworCQkJCWlmIChmYWlsZWQpCisJCQkJCWdvdG8gc3RvcF9zY2FuOworCQkJfSBlbHNlIGlmIChxaC0+ZXBfdHlwZSA9PSBVRV9DT05UUk9MKSB7CisJCQkJaWYgKHF0ZC0+Y29udHJvbF9waGFzZSA9PSBEV0NfT1RHX0NPTlRST0xfU0VUVVApIHsKKwkJCQkJaWYgKHVyYi0+bGVuZ3RoID4gMCkgeworCQkJCQkJcXRkLT5jb250cm9sX3BoYXNlID0gRFdDX09UR19DT05UUk9MX0RBVEE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlxdGQtPmNvbnRyb2xfcGhhc2UgPSBEV0NfT1RHX0NPTlRST0xfU1RBVFVTOworCQkJCQl9CisJCQkJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBDb250cm9sIHNldHVwIHRyYW5zYWN0aW9uIGRvbmVcbiIpOworCQkJCX0gZWxzZSBpZiAocXRkLT5jb250cm9sX3BoYXNlID09IERXQ19PVEdfQ09OVFJPTF9EQVRBKSB7CisJCQkJCWlmICh4ZmVyX2RvbmUpIHsKKwkJCQkJCXF0ZC0+Y29udHJvbF9waGFzZSA9IERXQ19PVEdfQ09OVFJPTF9TVEFUVVM7CisJCQkJCQlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgQ29udHJvbCBkYXRhIHRyYW5zZmVyIGRvbmVcbiIpOworCQkJCQl9IGVsc2UgaWYgKGkgKyAxID09IHF0ZC0+bl9kZXNjKSB7CisJCQkJCQkvKiAKKwkJCQkJCSAqIExhc3QgZGVzY3JpcHRvciBmb3IgQ29udHJvbCBkYXRhIHN0YWdlIHdoaWNoIGlzCisJCQkJCQkgKiBub3QgY29tcGxldGVkIHlldC4KKwkJCQkJCSAqLworCQkJCQkJZHdjX290Z19oY2Rfc2F2ZV9kYXRhX3RvZ2dsZShoYywgaGNfcmVncywgcXRkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJbl9kZXNjKys7CisJCX0KKworCX0KKworc3RvcF9zY2FuOgorCisJaWYgKHFoLT5lcF90eXBlICE9IFVFX0NPTlRST0wpIHsKKwkJLyogCisJCSAqIFJlc2V0dGluZyB0aGUgZGF0YSB0b2dnbGUgZm9yIGJ1bGsKKwkJICogYW5kIGludGVycnVwdCBlbmRwb2ludHMgaW4gY2FzZSBvZiBzdGFsbC4gU2VlIGhhbmRsZV9oY19zdGFsbF9pbnRyKCkgCisJCSAqLworCQlpZiAoaGFsdF9zdGF0dXMgPT0gRFdDX09UR19IQ19YRkVSX1NUQUxMKQorCQkJcWgtPmRhdGFfdG9nZ2xlID0gRFdDX09UR19IQ19QSURfREFUQTA7CisJCWVsc2UKKwkJCWR3Y19vdGdfaGNkX3NhdmVfZGF0YV90b2dnbGUoaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfQorCisJaWYgKGhhbHRfc3RhdHVzID09IERXQ19PVEdfSENfWEZFUl9DT01QTEVURSkgeworCQloY2ludF9kYXRhX3QgaGNpbnQ7CisJCWhjaW50LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2ludCk7CisJCWlmIChoY2ludC5iLm55ZXQpIHsKKwkJCS8qCisJCQkgKiBHb3QgYSBOWUVUIG9uIHRoZSBsYXN0IHRyYW5zYWN0aW9uIG9mIHRoZSB0cmFuc2Zlci4gSXQKKwkJCSAqIG1lYW5zIHRoYXQgdGhlIGVuZHBvaW50IHNob3VsZCBiZSBpbiB0aGUgUElORyBzdGF0ZSBhdCB0aGUKKwkJCSAqIGJlZ2lubmluZyBvZiB0aGUgbmV4dCB0cmFuc2Zlci4KKwkJCSAqLworCQkJcWgtPnBpbmdfc3RhdGUgPSAxOworCQkJY2xlYXJfaGNfaW50KGhjX3JlZ3MsIG55ZXQpOworCQl9CisKKwl9CisKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGludGVycnVwdCBoYW5kbGVycy4KKyAqIFNjYW5zIHRoZSBkZXNjcmlwdG9yIGxpc3QsIHVwZGF0ZXMgVVJCJ3Mgc3RhdHVzIGFuZAorICogY2FsbHMgY29tcGxldGlvbiByb3V0aW5lIGZvciB0aGUgVVJCIGlmIGl0J3MgZG9uZS4KKyAqIFJlbGVhc2VzIHRoZSBjaGFubmVsIHRvIGJlIHVzZWQgYnkgb3RoZXIgdHJhbnNmZXJzLgorICogSW4gY2FzZSBvZiBJc29jaHJvbm91cyBlbmRwb2ludCB0aGUgY2hhbm5lbCBpcyBub3QgaGFsdGVkIHVudGlsIAorICogdGhlIGVuZCBvZiB0aGUgc2Vzc2lvbiwgaS5lLiBRVEQgbGlzdCBpcyBlbXB0eS4KKyAqIElmIHBlcmlvZGljIGNoYW5uZWwgcmVsZWFzZWQgdGhlIEZyYW1lTGlzdCBpcyB1cGRhdGVkIGFjY29yZGluZ2x5LgorICoKKyAqIENhbGxzIHRyYW5zYWN0aW9uIHNlbGVjdGlvbiByb3V0aW5lcyB0byBhY3RpdmF0ZSBwZW5kaW5nIHRyYW5zZmVycy4KKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0Qgc3RhdGUgc3RydWN0dXJlIGZvciB0aGUgRFdDIE9URyBjb250cm9sbGVyLgorICogQHBhcmFtIGhjIEhvc3QgY2hhbm5lbCwgdGhlIHRyYW5zZmVyIGlzIGNvbXBsZXRlZCBvbi4KKyAqIEBwYXJhbSBoY19yZWdzIEhvc3QgY2hhbm5lbCByZWdpc3RlcnMuCisgKiBAcGFyYW0gaGFsdF9zdGF0dXMgUmVhc29uIHRoZSBjaGFubmVsIGlzIGJlaW5nIGhhbHRlZCwgCisgKgkJICAgICAgb3IganVzdCBYZmVyQ29tcGxldGUgZm9yIGlzb2Nocm9ub3VzIHRyYW5zZmVyCisgKi8KK3ZvaWQgZHdjX290Z19oY2RfY29tcGxldGVfeGZlcl9kZG1hKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJICAgIGR3Y19oY190ICogaGMsCisJCQkJICAgIGR3Y19vdGdfaGNfcmVnc190ICogaGNfcmVncywKKwkJCQkgICAgZHdjX290Z19oYWx0X3N0YXR1c19lIGhhbHRfc3RhdHVzKQoreworCXVpbnQ4X3QgY29udGludWVfaXNvY194ZmVyID0gMDsKKwlkd2Nfb3RnX3RyYW5zYWN0aW9uX3R5cGVfZSB0cl90eXBlOworCWR3Y19vdGdfcWhfdCAqcWggPSBoYy0+cWg7CisKKwlpZiAoaGMtPmVwX3R5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKworCQljb21wbGV0ZV9pc29jX3hmZXJfZGRtYShoY2QsIGhjLCBoY19yZWdzLCBoYWx0X3N0YXR1cyk7CisKKwkJLyogUmVsZWFzZSB0aGUgY2hhbm5lbCBpZiBoYWx0ZWQgb3Igc2Vzc2lvbiBjb21wbGV0ZWQgKi8KKwkJaWYgKGhhbHRfc3RhdHVzICE9IERXQ19PVEdfSENfWEZFUl9DT01QTEVURSB8fAorCQkgICAgRFdDX0NJUkNMRVFfRU1QVFkoJnFoLT5xdGRfbGlzdCkpIHsKKworCQkJLyogSGFsdCB0aGUgY2hhbm5lbCBpZiBzZXNzaW9uIGNvbXBsZXRlZCAqLworCQkJaWYgKGhhbHRfc3RhdHVzID09IERXQ19PVEdfSENfWEZFUl9DT01QTEVURSkgeworCQkJCWR3Y19vdGdfaGNfaGFsdChoY2QtPmNvcmVfaWYsIGhjLCBoYWx0X3N0YXR1cyk7CisJCQl9CisKKwkJCXJlbGVhc2VfY2hhbm5lbF9kZG1hKGhjZCwgcWgpOworCQkJZHdjX290Z19oY2RfcWhfcmVtb3ZlKGhjZCwgcWgpOworCQl9IGVsc2UgeworCQkJLyogS2VlcCBpbiBhc3NpZ25lZCBzY2hlZHVsZSB0byBjb250aW51ZSB0cmFuc2ZlciAqLworCQkJRFdDX0xJU1RfTU9WRV9IRUFEKCZoY2QtPnBlcmlvZGljX3NjaGVkX2Fzc2lnbmVkLAorCQkJCQkgICAmcWgtPnFoX2xpc3RfZW50cnkpOworCQkJY29udGludWVfaXNvY194ZmVyID0gMTsKKworCQl9CisJCS8qKiBAdG9kbyBDb25zaWRlciB0aGUgY2FzZSB3aGVuIHBlcmlvZCBleGNlZWRzIEZyYW1lTGlzdCBzaXplLgorCQkgKiAgRnJhbWUgUm9sbG92ZXIgaW50ZXJydXB0IHNob3VsZCBiZSB1c2VkLiAKKwkJICovCisJfSBlbHNlIHsKKwkJLyogU2NhbiBkZXNjcmlwdG9yIGxpc3QgdG8gY29tcGxldGUgdGhlIFVSQihzKSwgdGhlbiByZWxlYXNlIHRoZSBjaGFubmVsICovCisJCWNvbXBsZXRlX25vbl9pc29jX3hmZXJfZGRtYShoY2QsIGhjLCBoY19yZWdzLCBoYWx0X3N0YXR1cyk7CisKKwkJcmVsZWFzZV9jaGFubmVsX2RkbWEoaGNkLCBxaCk7CisJCWR3Y19vdGdfaGNkX3FoX3JlbW92ZShoY2QsIHFoKTsKKworCQlpZiAoIURXQ19DSVJDTEVRX0VNUFRZKCZxaC0+cXRkX2xpc3QpKSB7CisJCQkvKiBBZGQgYmFjayB0byBpbmFjdGl2ZSBub24tcGVyaW9kaWMgc2NoZWR1bGUgb24gbm9ybWFsIGNvbXBsZXRpb24gKi8KKwkJCWR3Y19vdGdfaGNkX3FoX2FkZChoY2QsIHFoKTsKKwkJfQorCisJfQorCXRyX3R5cGUgPSBkd2Nfb3RnX2hjZF9zZWxlY3RfdHJhbnNhY3Rpb25zKGhjZCk7CisJaWYgKHRyX3R5cGUgIT0gRFdDX09UR19UUkFOU0FDVElPTl9OT05FIHx8IGNvbnRpbnVlX2lzb2NfeGZlcikgeworCQlpZiAoY29udGludWVfaXNvY194ZmVyKSB7CisJCQlpZiAodHJfdHlwZSA9PSBEV0NfT1RHX1RSQU5TQUNUSU9OX05PTkUpIHsKKwkJCQl0cl90eXBlID0gRFdDX09UR19UUkFOU0FDVElPTl9QRVJJT0RJQzsKKwkJCX0gZWxzZSBpZiAodHJfdHlwZSA9PSBEV0NfT1RHX1RSQU5TQUNUSU9OX05PTl9QRVJJT0RJQykgeworCQkJCXRyX3R5cGUgPSBEV0NfT1RHX1RSQU5TQUNUSU9OX0FMTDsKKwkJCX0KKwkJfQorCQlkd2Nfb3RnX2hjZF9xdWV1ZV90cmFuc2FjdGlvbnMoaGNkLCB0cl90eXBlKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBEV0NfREVWSUNFX09OTFkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19oY2RfaWYuaCBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19oY2RfaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2RjODA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2hjZF9pZi5oCkBAIC0wLDAgKzEsNDEyIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfaGNkX2lmLmggJAorICogJFJldmlzaW9uOiAjMTIgJAorICogJERhdGU6IDIwMTEvMTAvMjYgJAorICogJENoYW5nZTogMTg3MzAyOCAkCisgKgorICogU3lub3BzeXMgSFMgT1RHIExpbnV4IFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbiAoaGVyZWluYWZ0ZXIsCisgKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcworICogb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgKgorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKKyAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gdXNlIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgKiBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwgZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IKKyAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQorICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgKiBiZWxvdywgdGhlbiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIiBCQVNJUworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgRFdDX0RFVklDRV9PTkxZCisjaWZuZGVmIF9fRFdDX0hDRF9JRl9IX18KKyNkZWZpbmUgX19EV0NfSENEX0lGX0hfXworCisjaW5jbHVkZSAiZHdjX290Z19jb3JlX2lmLmgiCisKKy8qKiBAZmlsZQorICogVGhpcyBmaWxlIGRlZmluZXMgRFdDX09URyBIQ0QgQ29yZSBBUEkuCisgKi8KKworc3RydWN0IGR3Y19vdGdfaGNkOwordHlwZWRlZiBzdHJ1Y3QgZHdjX290Z19oY2QgZHdjX290Z19oY2RfdDsKKworc3RydWN0IGR3Y19vdGdfaGNkX3VyYjsKK3R5cGVkZWYgc3RydWN0IGR3Y19vdGdfaGNkX3VyYiBkd2Nfb3RnX2hjZF91cmJfdDsKKworLyoqIEBuYW1lIEhDRCBGdW5jdGlvbiBEcml2ZXIgQ2FsbGJhY2tzICovCisvKiogQHsgKi8KKworLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGNvcmUgc3dpdGNoZXMgdG8gaG9zdCBtb2RlLiAqLwordHlwZWRlZiBpbnQgKCpkd2Nfb3RnX2hjZF9zdGFydF9jYl90KSAoZHdjX290Z19oY2RfdCAqIGhjZCk7CisKKy8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRldmljZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQgKi8KK3R5cGVkZWYgaW50ICgqZHdjX290Z19oY2RfZGlzY29ubmVjdF9jYl90KSAoZHdjX290Z19oY2RfdCAqIGhjZCk7CisKKy8qKiBXcmFwcGVyIHByb3ZpZGVzIHRoaXMgZnVuY3Rpb24gdG8gSENEIHRvIGNvcmUsIHNvIGl0IGNhbiBnZXQgaHViIGluZm9ybWF0aW9uIHRvIHdoaWNoIGRldmljZSBpcyBjb25uZWN0ZWQgKi8KK3R5cGVkZWYgaW50ICgqZHdjX290Z19oY2RfaHViX2luZm9fZnJvbV91cmJfY2JfdCkgKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJCQkgICB2b2lkICp1cmJfaGFuZGxlLAorCQkJCQkJICAgdWludDMyX3QgKiBodWJfYWRkciwKKwkJCQkJCSAgIHVpbnQzMl90ICogcG9ydF9hZGRyKTsKKy8qKiBWaWEgdGhpcyBmdW5jdGlvbiBIQ0QgY29yZSBnZXRzIGRldmljZSBzcGVlZCAqLwordHlwZWRlZiBpbnQgKCpkd2Nfb3RnX2hjZF9zcGVlZF9mcm9tX3VyYl9jYl90KSAoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkJCXZvaWQgKnVyYl9oYW5kbGUpOworCisvKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB1cmIgaXMgY29tcGxldGVkICovCit0eXBlZGVmIGludCAoKmR3Y19vdGdfaGNkX2NvbXBsZXRlX3VyYl9jYl90KSAoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkJICAgICAgdm9pZCAqdXJiX2hhbmRsZSwKKwkJCQkJICAgICAgZHdjX290Z19oY2RfdXJiX3QgKiBkd2Nfb3RnX3VyYiwKKwkJCQkJICAgICAgaW50MzJfdCBzdGF0dXMpOworCisvKiogVmlhIHRoaXMgZnVuY3Rpb24gSENEIGNvcmUgZ2V0cyBiX2hucF9lbmFibGUgcGFyYW1ldGVyICovCit0eXBlZGVmIGludCAoKmR3Y19vdGdfaGNkX2dldF9iX2hucF9lbmFibGUpIChkd2Nfb3RnX2hjZF90ICogaGNkKTsKKworc3RydWN0IGR3Y19vdGdfaGNkX2Z1bmN0aW9uX29wcyB7CisJZHdjX290Z19oY2Rfc3RhcnRfY2JfdCBzdGFydDsKKwlkd2Nfb3RnX2hjZF9kaXNjb25uZWN0X2NiX3QgZGlzY29ubmVjdDsKKwlkd2Nfb3RnX2hjZF9odWJfaW5mb19mcm9tX3VyYl9jYl90IGh1Yl9pbmZvOworCWR3Y19vdGdfaGNkX3NwZWVkX2Zyb21fdXJiX2NiX3Qgc3BlZWQ7CisJZHdjX290Z19oY2RfY29tcGxldGVfdXJiX2NiX3QgY29tcGxldGU7CisJZHdjX290Z19oY2RfZ2V0X2JfaG5wX2VuYWJsZSBnZXRfYl9obnBfZW5hYmxlOworfTsKKy8qKiBAfSAqLworCisvKiogQG5hbWUgSENEIENvcmUgQVBJICovCisvKiogQHsgKi8KKy8qKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBkd2Nfb3RnX2hjZCBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgcG9pbnRlciBvbiBpdC4gKi8KK2V4dGVybiBkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZF9hbGxvY19oY2Qodm9pZCk7CisKKy8qKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgdG8gaW5pdGlhdGUgSENEIENvcmUuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKiBAcGFyYW0gY29yZV9pZiBUaGUgRFdDX09URyBDb3JlCisgKgorICogUmV0dXJucyAtRFdDX0VfTk9fTUVNT1JZIGlmIG5vIGVub3VnaCBtZW1vcnkuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyAgCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19oY2RfaW5pdChkd2Nfb3RnX2hjZF90ICogaGNkLCBkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworCisvKiogRnJlZXMgSENECisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfaGNkX3JlbW92ZShkd2Nfb3RnX2hjZF90ICogaGNkKTsKKworLyoqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbiBldmVyeSBoYXJkd2FyZSBpbnRlcnJ1cHQuCisgKgorICogQHBhcmFtIGR3Y19vdGdfaGNkIFRoZSBIQ0QKKyAqCisgKiBSZXR1cm5zIG5vbiB6ZXJvIGlmIGludGVycnVwdCBpcyBoYW5kbGVkCisgKiBSZXR1cm4gMCBpZiBpbnRlcnJ1cHQgaXMgbm90IGhhbmRsZWQKKyAqLworZXh0ZXJuIGludDMyX3QgZHdjX290Z19oY2RfaGFuZGxlX2ludHIoZHdjX290Z19oY2RfdCAqIGR3Y19vdGdfaGNkKTsKKworLyoqCisgKiBSZXR1cm5zIHByaXZhdGUgZGF0YSBzZXQgYnkKKyAqIGR3Y19vdGdfaGNkX3NldF9wcml2X2RhdGEgZnVuY3Rpb24uCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKi8KK2V4dGVybiB2b2lkICpkd2Nfb3RnX2hjZF9nZXRfcHJpdl9kYXRhKGR3Y19vdGdfaGNkX3QgKiBoY2QpOworCisvKioKKyAqIFNldCBwcml2YXRlIGRhdGEuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKiBAcGFyYW0gcHJpdl9kYXRhIHBvaW50ZXIgdG8gYmUgc3RvcmVkIGluIHByaXZhdGUgZGF0YQorICovCitleHRlcm4gdm9pZCBkd2Nfb3RnX2hjZF9zZXRfcHJpdl9kYXRhKGR3Y19vdGdfaGNkX3QgKiBoY2QsIHZvaWQgKnByaXZfZGF0YSk7CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgSENEIENvcmUuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKiBAcGFyYW0gZm9wcyBUaGUgRnVuY3Rpb24gRHJpdmVyIE9wZXJhdGlvbnMgZGF0YSBzdHJ1Y3R1cmUgY29udGFpbmluZyBwb2ludGVycyB0byBhbGwgY2FsbGJhY2tzLgorICoKKyAqIFJldHVybnMgLURXQ19FX05PX0RFVklDRSBpZiBDb3JlIGlzIGN1cnJlbnRseSBpcyBpbiBkZXZpY2UgbW9kZS4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19oY2Rfc3RhcnQoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCSAgICAgc3RydWN0IGR3Y19vdGdfaGNkX2Z1bmN0aW9uX29wcyAqZm9wcyk7CisKKy8qKgorICogSGFsdHMgdGhlIERXQ19vdGcgaG9zdCBtb2RlIG9wZXJhdGlvbnMgaW4gYSBjbGVhbiBtYW5uZXIuIFVTQiB0cmFuc2ZlcnMgYXJlCisgKiBzdG9wcGVkLiAKKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0QKKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19oY2Rfc3RvcChkd2Nfb3RnX2hjZF90ICogaGNkKTsKKworLyoqCisgKiBIYW5kbGVzIGh1YiBjbGFzcy1zcGVjaWZpYyByZXF1ZXN0cy4KKyAqCisgKiBAcGFyYW0gZHdjX290Z19oY2QgVGhlIEhDRAorICogQHBhcmFtIHR5cGVSZXEgUmVxdWVzdCBUeXBlCisgKiBAcGFyYW0gd1ZhbHVlIHdWYWx1ZSBmcm9tIGNvbnRyb2wgcmVxdWVzdAorICogQHBhcmFtIHdJbmRleCB3SW5kZXggZnJvbSBjb250cm9sIHJlcXVlc3QKKyAqIEBwYXJhbSBidWYgZGF0YSBidWZmZXIgCisgKiBAcGFyYW0gd0xlbmd0aCBkYXRhIGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBSZXR1cm5zIC1EV0NfRV9JTlZBTElEIGlmIGludmFsaWQgYXJndW1lbnQgaXMgcGFzc2VkCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcworICovCitleHRlcm4gaW50IGR3Y19vdGdfaGNkX2h1Yl9jb250cm9sKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCwKKwkJCQkgICB1aW50MTZfdCB0eXBlUmVxLCB1aW50MTZfdCB3VmFsdWUsCisJCQkJICAgdWludDE2X3Qgd0luZGV4LCB1aW50OF90ICogYnVmLAorCQkJCSAgIHVpbnQxNl90IHdMZW5ndGgpOworCisvKioKKyAqIFJldHVybnMgb3RnIHBvcnQgbnVtYmVyLgorICoKKyAqIEBwYXJhbSBoY2QgVGhlIEhDRAorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19oY2Rfb3RnX3BvcnQoZHdjX290Z19oY2RfdCAqIGhjZCk7CisKKy8qKgorICogUmV0dXJucyBPVEcgdmVyc2lvbiAtIGVpdGhlciAxLjMgb3IgMi4wLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFRoZSBjb3JlX2lmIHN0cnVjdHVyZSBwb2ludGVyCisgKi8KK2V4dGVybiB1aW50MTZfdCBkd2Nfb3RnX2dldF9vdGdfdmVyc2lvbihkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpOworCisvKioKKyAqIFJldHVybnMgMSBpZiBjdXJyZW50bHkgY29yZSBpcyBhY3RpbmcgYXMgQiBob3N0LCBhbmQgMCBvdGhlcndpc2UuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX2hjZF9pc19iX2hvc3QoZHdjX290Z19oY2RfdCAqIGhjZCk7CisKKy8qKgorICogUmV0dXJucyBjdXJyZW50IGZyYW1lIG51bWJlci4KKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0QKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX2hjZF9nZXRfZnJhbWVfbnVtYmVyKGR3Y19vdGdfaGNkX3QgKiBoY2QpOworCisvKioKKyAqIER1bXBzIGhjZCBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0QKKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19oY2RfZHVtcF9zdGF0ZShkd2Nfb3RnX2hjZF90ICogaGNkKTsKKworLyoqCisgKiBEdW1wIHRoZSBhdmVyYWdlIGZyYW1lIHJlbWFpbmluZyBhdCBTT0YuIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAqIGRldGVybWluZSBhdmVyYWdlIGludGVycnVwdCBsYXRlbmN5LiBGcmFtZSByZW1haW5pbmcgaXMgYWxzbyBzaG93biBmb3IKKyAqIHN0YXJ0IHRyYW5zZmVyIGFuZCB0d28gYWRkaXRpb25hbCBzYW1wbGUgcG9pbnRzLgorICogQ3VycmVudGx5IHRoaXMgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkLgorICoKKyAqIEBwYXJhbSBoY2QgVGhlIEhDRAorICovCitleHRlcm4gdm9pZCBkd2Nfb3RnX2hjZF9kdW1wX2ZycmVtKGR3Y19vdGdfaGNkX3QgKiBoY2QpOworCisvKioKKyAqIFNlbmRzIExQTSB0cmFuc2FjdGlvbiB0byB0aGUgbG9jYWwgZGV2aWNlLgorICoKKyAqIEBwYXJhbSBoY2QgVGhlIEhDRAorICogQHBhcmFtIGRldmFkZHIgRGV2aWNlIEFkZHJlc3MKKyAqIEBwYXJhbSBoaXJkIEhvc3QgaW5pdGlhdGVkIHJlc3VtZSBkdXJhdGlvbgorICogQHBhcmFtIGJSZW1vdGVXYWtlIFZhbHVlIG9mIGJSZW1vdGVXYWtlIGZpZWxkIGluIExQTSB0cmFuc2FjdGlvbgorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgdmFsdWUgaWYgc2VuZGluZyBMUE0gdHJhbnNhY3Rpb24gd2FzIG5vdCBzdWNjZWVkZWQuCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX2hjZF9zZW5kX2xwbShkd2Nfb3RnX2hjZF90ICogaGNkLCB1aW50OF90IGRldmFkZHIsCisJCQkJdWludDhfdCBoaXJkLCB1aW50OF90IGJSZW1vdGVXYWtlKTsKKworLyogVVJCIGludGVyZmFjZSAqLworCisvKioKKyAqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGR3Y19vdGdfaGNkX3VyYiBzdHJ1Y3R1cmUuCisgKiBBbGxvY2F0ZWQgbWVtb3J5IHNob3VsZCBiZSBmcmVlZCBieSBjYWxsIG9mIERXQ19GUkVFLgorICoKKyAqIEBwYXJhbSBoY2QgVGhlIEhDRAorICogQHBhcmFtIGlzb19kZXNjX2NvdW50IENvdW50IG9mIElTT0MgZGVzY3JpcHRvcnMKKyAqIEBwYXJhbSBhdG9taWNfYWxsb2MgU3BlY2VmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhdG9taWMgYWxsb2NhdGlvbi4KKyAqLworZXh0ZXJuIGR3Y19vdGdfaGNkX3VyYl90ICpkd2Nfb3RnX2hjZF91cmJfYWxsb2MoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkJCWludCBpc29fZGVzY19jb3VudCwKKwkJCQkJCWludCBhdG9taWNfYWxsb2MpOworCisvKioKKyAqIFNldCBwaXBlIGluZm9ybWF0aW9uIGluIFVSQi4KKyAqCisgKiBAcGFyYW0gaGNkX3VyYiBEV0NfT1RHIFVSQgorICogQHBhcmFtIGRldmFkZHIgRGV2aWNlIEFkZHJlc3MKKyAqIEBwYXJhbSBlcF9udW0gRW5kcG9pbnQgTnVtYmVyCisgKiBAcGFyYW0gZXBfdHlwZSBFbmRwb2ludCBUeXBlCisgKiBAcGFyYW0gZXBfZGlyIEVuZHBvaW50IERpcmVjdGlvbgorICogQHBhcmFtIG1wcyBNYXggUGFja2V0IFNpemUKKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19oY2RfdXJiX3NldF9waXBlaW5mbyhkd2Nfb3RnX2hjZF91cmJfdCAqIGhjZF91cmIsCisJCQkJCSB1aW50OF90IGRldmFkZHIsIHVpbnQ4X3QgZXBfbnVtLAorCQkJCQkgdWludDhfdCBlcF90eXBlLCB1aW50OF90IGVwX2RpciwKKwkJCQkJIHVpbnQxNl90IG1wcyk7CisKKy8qIFRyYW5zZmVyIGZsYWdzICovCisjZGVmaW5lIFVSQl9HSVZFQkFDS19BU0FQIDB4MQorI2RlZmluZSBVUkJfU0VORF9aRVJPX1BBQ0tFVCAweDIKKworLyoqCisgKiBTZXRzIGR3Y19vdGdfaGNkX3VyYiBwYXJhbWV0ZXJzLgorICoKKyAqIEBwYXJhbSB1cmIgRFdDX09URyBVUkIgYWxsb2NhdGVkIGJ5IGR3Y19vdGdfaGNkX3VyYl9hbGxvYyBmdW5jdGlvbi4KKyAqIEBwYXJhbSB1cmJfaGFuZGxlIFVuaXF1ZSBoYW5kbGUgZm9yIHJlcXVlc3QsIHRoaXMgd2lsbCBiZSBwYXNzZWQgYmFjaworICogdG8gZnVuY3Rpb24gZHJpdmVyIGluIGNvbXBsZXRpb24gY2FsbGJhY2suCisgKiBAcGFyYW0gYnVmIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhCisgKiBAcGFyYW0gZG1hIFRoZSBETUEgYnVmZmVyIGZvciB0aGUgZGF0YQorICogQHBhcmFtIGJ1ZmxlbiBUcmFuc2ZlciBsZW5ndGgKKyAqIEBwYXJhbSBzcCBCdWZmZXIgZm9yIHNldHVwIGRhdGEKKyAqIEBwYXJhbSBzcF9kbWEgRE1BIGFkZHJlc3Mgb2Ygc2V0dXAgZGF0YSBidWZmZXIKKyAqIEBwYXJhbSBmbGFncyBUcmFuc2ZlciBmbGFncworICogQHBhcmFtIGludGVydmFsIFBvbGxpbmcgaW50ZXJ2YWwgZm9yIGludGVycnVwdCBvciBpc29jaHJvbm91cyB0cmFuc2ZlcnMuCisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfaGNkX3VyYl9zZXRfcGFyYW1zKGR3Y19vdGdfaGNkX3VyYl90ICogdXJiLAorCQkJCSAgICAgICB2b2lkICp1cmJfaGFuZGxlLCB2b2lkICpidWYsCisJCQkJICAgICAgIGR3Y19kbWFfdCBkbWEsIHVpbnQzMl90IGJ1Zmxlbiwgdm9pZCAqc3AsCisJCQkJICAgICAgIGR3Y19kbWFfdCBzcF9kbWEsIHVpbnQzMl90IGZsYWdzLAorCQkJCSAgICAgICB1aW50MTZfdCBpbnRlcnZhbCk7CisKKy8qKiBHZXRzIHN0YXR1cyBmcm9tIGR3Y19vdGdfaGNkX3VyYgorICoKKyAqIEBwYXJhbSBkd2Nfb3RnX3VyYiBEV0NfT1RHIFVSQgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19oY2RfdXJiX2dldF9zdGF0dXMoZHdjX290Z19oY2RfdXJiX3QgKiBkd2Nfb3RnX3VyYik7CisKKy8qKiBHZXRzIGFjdHVhbCBsZW5ndGggZnJvbSBkd2Nfb3RnX2hjZF91cmIKKyAqCisgKiBAcGFyYW0gZHdjX290Z191cmIgRFdDX09URyBVUkIKKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfaGNkX3VyYl9nZXRfYWN0dWFsX2xlbmd0aChkd2Nfb3RnX2hjZF91cmJfdCAqCisJCQkJCQkgIGR3Y19vdGdfdXJiKTsKKworLyoqIEdldHMgZXJyb3IgY291bnQgZnJvbSBkd2Nfb3RnX2hjZF91cmIuIE9ubHkgZm9yIElTT0MgVVJCcworICoKKyAqIEBwYXJhbSBkd2Nfb3RnX3VyYiBEV0NfT1RHIFVSQgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19oY2RfdXJiX2dldF9lcnJvcl9jb3VudChkd2Nfb3RnX2hjZF91cmJfdCAqCisJCQkJCQlkd2Nfb3RnX3VyYik7CisKKy8qKiBTZXQgSVNPQyBkZXNjcmlwdG9yIG9mZnNldCBhbmQgbGVuZ3RoCisgKgorICogQHBhcmFtIGR3Y19vdGdfdXJiIERXQ19PVEcgVVJCCisgKiBAcGFyYW0gZGVzY19udW0gSVNPQyBkZXNjcmlwdG9yIG51bWJlcgorICogQHBhcmFtIG9mZnNldCBPZmZzZXQgZnJvbSBiZWdpbmlnIG9mIGJ1ZmZlci4KKyAqIEBwYXJhbSBsZW5ndGggVHJhbnNhY3Rpb24gbGVuZ3RoCisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfaGNkX3VyYl9zZXRfaXNvX2Rlc2NfcGFyYW1zKGR3Y19vdGdfaGNkX3VyYl90ICogZHdjX290Z191cmIsCisJCQkJCQlpbnQgZGVzY19udW0sIHVpbnQzMl90IG9mZnNldCwKKwkJCQkJCXVpbnQzMl90IGxlbmd0aCk7CisKKy8qKiBHZXQgc3RhdHVzIG9mIElTT0MgZGVzY3JpcHRvciwgc3BlY2lmaWVkIGJ5IGRlc2NfbnVtCisgKgorICogQHBhcmFtIGR3Y19vdGdfdXJiIERXQ19PVEcgVVJCCisgKiBAcGFyYW0gZGVzY19udW0gSVNPQyBkZXNjcmlwdG9yIG51bWJlciAKKyAqLworZXh0ZXJuIHVpbnQzMl90IGR3Y19vdGdfaGNkX3VyYl9nZXRfaXNvX2Rlc2Nfc3RhdHVzKGR3Y19vdGdfaGNkX3VyYl90ICoKKwkJCQkJCSAgICBkd2Nfb3RnX3VyYiwgaW50IGRlc2NfbnVtKTsKKworLyoqIEdldCBhY3R1YWwgbGVuZ3RoIG9mIElTT0MgZGVzY3JpcHRvciwgc3BlY2lmaWVkIGJ5IGRlc2NfbnVtCisgKgorICogQHBhcmFtIGR3Y19vdGdfdXJiIERXQ19PVEcgVVJCCisgKiBAcGFyYW0gZGVzY19udW0gSVNPQyBkZXNjcmlwdG9yIG51bWJlcgorICovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19oY2RfdXJiX2dldF9pc29fZGVzY19hY3R1YWxfbGVuZ3RoKGR3Y19vdGdfaGNkX3VyYl90ICoKKwkJCQkJCQkgICBkd2Nfb3RnX3VyYiwKKwkJCQkJCQkgICBpbnQgZGVzY19udW0pOworCisvKiogUXVldWUgVVJCLiBBZnRlciB0cmFuc2ZlciBpcyBjb21wbGV0ZXMsIHRoZSBjb21wbGV0ZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBVUkIgc3RhdHVzCisgKgorICogQHBhcmFtIGR3Y19vdGdfaGNkIFRoZSBIQ0QKKyAqIEBwYXJhbSBkd2Nfb3RnX3VyYiBEV0NfT1RHIFVSQgorICogQHBhcmFtIGVwX2hhbmRsZSBPdXQgcGFyYW1ldGVyIGZvciByZXR1cm5pbmcgZW5kcG9pbnQgaGFuZGxlCisgKiBAcGFyYW0gYXRvbWljX2FsbG9jIEZsYWcgdG8gZG8gYXRvbWljIGFsbG9jYXRpb24gaWYgbmVlZGVkCisgKgorICogUmV0dXJucyAtRFdDX0VfTk9fREVWSUNFIGlmIG5vIGRldmljZSBpcyBjb25uZWN0ZWQuCisgKiBSZXR1cm5zIC1EV0NfRV9OT19NRU1PUlkgaWYgdGhlcmUgaXMgbm8gZW5vdWdoIG1lbW9yeS4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitleHRlcm4gaW50IGR3Y19vdGdfaGNkX3VyYl9lbnF1ZXVlKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCwKKwkJCQkgICBkd2Nfb3RnX2hjZF91cmJfdCAqIGR3Y19vdGdfdXJiLAorCQkJCSAgIHZvaWQgKiplcF9oYW5kbGUsIGludCBhdG9taWNfYWxsb2MpOworCisvKiogRGUtcXVldWUgdGhlIHNwZWNpZmllZCBVUkIKKyAqCisgKiBAcGFyYW0gZHdjX290Z19oY2QgVGhlIEhDRAorICogQHBhcmFtIGR3Y19vdGdfdXJiIERXQ19PVEcgVVJCCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19oY2RfdXJiX2RlcXVldWUoZHdjX290Z19oY2RfdCAqIGR3Y19vdGdfaGNkLAorCQkJCSAgIGR3Y19vdGdfaGNkX3VyYl90ICogZHdjX290Z191cmIpOworCisvKiogRnJlZXMgcmVzb3VyY2VzIGluIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgcmVsYXRlZCB0byBhIGdpdmVuIGVuZHBvaW50LgorICogQW55IFVSQnMgZm9yIHRoZSBlbmRwb2ludCBtdXN0IGFscmVhZHkgYmUgZGVxdWV1ZWQuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKiBAcGFyYW0gZXBfaGFuZGxlIEVuZHBvaW50IGhhbmRsZSwgcmV0dXJuZWQgYnkgZHdjX290Z19oY2RfdXJiX2VucXVldWUgZnVuY3Rpb24KKyAqIEBwYXJhbSByZXRyeSBOdW1iZXIgb2YgcmV0cmllcyBpZiB0aGVyZSBhcmUgcXVldWVkIHRyYW5zZmVycy4KKyAqCisgKiBSZXR1cm5zIC1EV0NfRV9JTlZBTElEIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcworICovCitleHRlcm4gaW50IGR3Y19vdGdfaGNkX2VuZHBvaW50X2Rpc2FibGUoZHdjX290Z19oY2RfdCAqIGhjZCwgdm9pZCAqZXBfaGFuZGxlLAorCQkJCQlpbnQgcmV0cnkpOworCisvKiBSZXNldHMgdGhlIGRhdGEgdG9nZ2xlIGluIHFoIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20KKyAqIHVzYl9jbGVhcl9oYWx0IHJvdXRpbmUuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKiBAcGFyYW0gZXBfaGFuZGxlIEVuZHBvaW50IGhhbmRsZSwgcmV0dXJuZWQgYnkgZHdjX290Z19oY2RfdXJiX2VucXVldWUgZnVuY3Rpb24KKyAqCisgKiBSZXR1cm5zIC1EV0NfRV9JTlZBTElEIGlmIGludmFsaWQgYXJndW1lbnRzIGFyZSBwYXNzZWQuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcworICovCitleHRlcm4gaW50IGR3Y19vdGdfaGNkX2VuZHBvaW50X3Jlc2V0KGR3Y19vdGdfaGNkX3QgKiBoY2QsIHZvaWQgKmVwX2hhbmRsZSk7CisKKy8qKiBSZXR1cm5zIDEgaWYgc3RhdHVzIG9mIHNwZWNpZmllZCBwb3J0IGlzIGNoYW5nZWQgYW5kIDAgb3RoZXJ3aXNlLgorICoKKyAqIEBwYXJhbSBoY2QgVGhlIEhDRAorICogQHBhcmFtIHBvcnQgUG9ydCBudW1iZXIKKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX2hjZF9pc19zdGF0dXNfY2hhbmdlZChkd2Nfb3RnX2hjZF90ICogaGNkLCBpbnQgcG9ydCk7CisKKy8qKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYmFuZHdpZHRoIHdhcyBhbGxvY2F0ZWQgZm9yIHNwZWNpZmllZCBlbmRwb2ludC4KKyAqIE9ubHkgZm9yIElTT0MgYW5kIElOVEVSUlVQVCBlbmRwb2ludHMuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKiBAcGFyYW0gZXBfaGFuZGxlIEVuZHBvaW50IGhhbmRsZQorICovCitleHRlcm4gaW50IGR3Y19vdGdfaGNkX2lzX2JhbmR3aWR0aF9hbGxvY2F0ZWQoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkJICAgICAgdm9pZCAqZXBfaGFuZGxlKTsKKworLyoqIENhbGwgdGhpcyBmdW5jdGlvbiB0byBjaGVjayBpZiBiYW5kd2lkdGggd2FzIGZyZWVkIGZvciBzcGVjaWZpZWQgZW5kcG9pbnQuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENECisgKiBAcGFyYW0gZXBfaGFuZGxlIEVuZHBvaW50IGhhbmRsZQorICovCitleHRlcm4gaW50IGR3Y19vdGdfaGNkX2lzX2JhbmR3aWR0aF9mcmVlZChkd2Nfb3RnX2hjZF90ICogaGNkLCB2b2lkICplcF9oYW5kbGUpOworCisvKiogUmV0dXJucyBiYW5kd2lkdGggYWxsb2NhdGVkIGZvciBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gbWljcm9zZWNvbmRzLgorICogT25seSBmb3IgSVNPQyBhbmQgSU5URVJSVVBUIGVuZHBvaW50cy4KKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0QKKyAqIEBwYXJhbSBlcF9oYW5kbGUgRW5kcG9pbnQgaGFuZGxlCisgKi8KK2V4dGVybiB1aW50OF90IGR3Y19vdGdfaGNkX2dldF9lcF9iYW5kd2lkdGgoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkJICAgIHZvaWQgKmVwX2hhbmRsZSk7CisKKy8qKiBAfSAqLworCisjZW5kaWYgLyogX19EV0NfSENEX0lGX0hfXyAqLworI2VuZGlmIC8qIERXQ19ERVZJQ0VfT05MWSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2hjZF9pbnRyLmMgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfaGNkX2ludHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmIzNjAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2hjZF9pbnRyLmMKQEAgLTAsMCArMSwyMTAxIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfaGNkX2ludHIuYyAkCisgKiAkUmV2aXNpb246ICM4OSAkCisgKiAkRGF0ZTogMjAxMS8xMC8yMCAkCisgKiAkQ2hhbmdlOiAxODY5NDg3ICQKKyAqCisgKiBTeW5vcHN5cyBIUyBPVEcgTGludXggU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIChoZXJlaW5hZnRlciwKKyAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdCB1bmRlcgorICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAorICogd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKKyAqIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLCBkaXNjbG9zZSwgY29weSBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSBvcgorICogYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tCisgKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKKyAqIGJlbG93LCB0aGVuIHlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBEV0NfREVWSUNFX09OTFkKKworI2luY2x1ZGUgImR3Y19vdGdfaGNkLmgiCisjaW5jbHVkZSAiZHdjX290Z19yZWdzLmgiCisKKy8qKiBAZmlsZQorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSENEIEludGVycnVwdCBoYW5kbGVycy4KKyAqLworCisvKiogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGludGVycnVwdHMgZm9yIHRoZSBIQ0QuICovCitpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9pbnRyKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gZHdjX290Z19oY2QtPmNvcmVfaWY7CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKyNpZmRlZiBERUJVRworCWR3Y19vdGdfY29yZV9nbG9iYWxfcmVnc190ICpnbG9iYWxfcmVncyA9IGNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3M7CisjZW5kaWYKKworCS8qIEV4aXQgZnJvbSBJU1IgaWYgY29yZSBpcyBoaWJlcm5hdGVkICovCisJaWYgKGNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPT0gMSkgeworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlEV0NfU1BJTkxPQ0soZHdjX290Z19oY2QtPmxvY2spOworCS8qIENoZWNrIGlmIEhPU1QgTW9kZSAqLworCWlmIChkd2Nfb3RnX2lzX2hvc3RfbW9kZShjb3JlX2lmKSkgeworCQlnaW50c3RzLmQzMiA9IGR3Y19vdGdfcmVhZF9jb3JlX2ludHIoY29yZV9pZik7CisJCWlmICghZ2ludHN0cy5kMzIpIHsKKwkJCURXQ19TUElOVU5MT0NLKGR3Y19vdGdfaGNkLT5sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisjaWZkZWYgREVCVUcKKwkJLyogRG9uJ3QgcHJpbnQgZGVidWcgbWVzc2FnZSBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgb24gU09GICovCisjaWZuZGVmIERFQlVHX1NPRgorCQlpZiAoZ2ludHN0cy5kMzIgIT0gRFdDX1NPRl9JTlRSX01BU0spCisjZW5kaWYKKwkJCURXQ19ERUJVR1BMKERCR19IQ0QsICJcbiIpOworI2VuZGlmCisKKyNpZmRlZiBERUJVRworI2lmbmRlZiBERUJVR19TT0YKKwkJaWYgKGdpbnRzdHMuZDMyICE9IERXQ19TT0ZfSU5UUl9NQVNLKQorI2VuZGlmCisJCQlEV0NfREVCVUdQTChEQkdfSENELAorCQkJCSAgICAiRFdDIE9URyBIQ0QgSW50ZXJydXB0IERldGVjdGVkIGdpbnRzdHMmZ2ludG1zaz0weCUwOHhcbiIsCisJCQkJICAgIGdpbnRzdHMuZDMyKTsKKyNlbmRpZgorCisJCWlmIChnaW50c3RzLmIuc29maW50cikgeworCQkJcmV0dmFsIHw9IGR3Y19vdGdfaGNkX2hhbmRsZV9zb2ZfaW50cihkd2Nfb3RnX2hjZCk7CisJCX0KKwkJaWYgKGdpbnRzdHMuYi5yeHN0c3FsdmwpIHsKKwkJCXJldHZhbCB8PQorCQkJICAgIGR3Y19vdGdfaGNkX2hhbmRsZV9yeF9zdGF0dXNfcV9sZXZlbF9pbnRyCisJCQkgICAgKGR3Y19vdGdfaGNkKTsKKwkJfQorCQlpZiAoZ2ludHN0cy5iLm5wdHhmZW1wdHkpIHsKKwkJCXJldHZhbCB8PQorCQkJICAgIGR3Y19vdGdfaGNkX2hhbmRsZV9ucF90eF9maWZvX2VtcHR5X2ludHIKKwkJCSAgICAoZHdjX290Z19oY2QpOworCQl9CisJCWlmIChnaW50c3RzLmIuaTJjaW50cikgeworCQkJLyoqIEB0b2RvIEltcGxlbWVudCBpMmNpbnRyIGhhbmRsZXIuICovCisJCX0KKwkJaWYgKGdpbnRzdHMuYi5wb3J0aW50cikgeworCQkJcmV0dmFsIHw9IGR3Y19vdGdfaGNkX2hhbmRsZV9wb3J0X2ludHIoZHdjX290Z19oY2QpOworCQl9CisJCWlmIChnaW50c3RzLmIuaGNpbnRyKSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19oY2RfaGFuZGxlX2hjX2ludHIoZHdjX290Z19oY2QpOworCQl9CisJCWlmIChnaW50c3RzLmIucHR4ZmVtcHR5KSB7CisJCQlyZXR2YWwgfD0KKwkJCSAgICBkd2Nfb3RnX2hjZF9oYW5kbGVfcGVyaW9fdHhfZmlmb19lbXB0eV9pbnRyCisJCQkgICAgKGR3Y19vdGdfaGNkKTsKKwkJfQorI2lmZGVmIERFQlVHCisjaWZuZGVmIERFQlVHX1NPRgorCQlpZiAoZ2ludHN0cy5kMzIgIT0gRFdDX1NPRl9JTlRSX01BU0spCisjZW5kaWYKKwkJeworCQkJRFdDX0RFQlVHUEwoREJHX0hDRCwKKwkJCQkgICAgIkRXQyBPVEcgSENEIEZpbmlzaGVkIFNlcnZpY2luZyBJbnRlcnJ1cHRzXG4iKTsKKwkJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiRFdDIE9URyBIQ0QgZ2ludHN0cz0weCUwOHhcbiIsCisJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cykpOworCQkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICJEV0MgT1RHIEhDRCBnaW50bXNrPTB4JTA4eFxuIiwKKwkJCQkgICAgRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrKSk7CisJCX0KKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyNpZm5kZWYgREVCVUdfU09GCisJCWlmIChnaW50c3RzLmQzMiAhPSBEV0NfU09GX0lOVFJfTUFTSykKKyNlbmRpZgorCQkJRFdDX0RFQlVHUEwoREJHX0hDRCwgIlxuIik7CisjZW5kaWYKKworCX0KKwlEV0NfU1BJTlVOTE9DSyhkd2Nfb3RnX2hjZC0+bG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2lmZGVmIERXQ19UUkFDS19NSVNTRURfU09GUworI3dhcm5pbmcgQ29tcGlsaW5nIGNvZGUgdG8gdHJhY2sgbWlzc2VkIFNPRnMKKyNkZWZpbmUgRlJBTUVfTlVNX0FSUkFZX1NJWkUgMTAwMAorLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBkZWJ1ZyBvbmx5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhY2tfbWlzc2VkX3NvZnModWludDE2X3QgY3Vycl9mcmFtZV9udW1iZXIpCit7CisJc3RhdGljIHVpbnQxNl90IGZyYW1lX251bV9hcnJheVtGUkFNRV9OVU1fQVJSQVlfU0laRV07CisJc3RhdGljIHVpbnQxNl90IGxhc3RfZnJhbWVfbnVtX2FycmF5W0ZSQU1FX05VTV9BUlJBWV9TSVpFXTsKKwlzdGF0aWMgaW50IGZyYW1lX251bV9pZHggPSAwOworCXN0YXRpYyB1aW50MTZfdCBsYXN0X2ZyYW1lX251bSA9IERXQ19IRk5VTV9NQVhfRlJOVU07CisJc3RhdGljIGludCBkdW1wZWRfZnJhbWVfbnVtX2FycmF5ID0gMDsKKworCWlmIChmcmFtZV9udW1faWR4IDwgRlJBTUVfTlVNX0FSUkFZX1NJWkUpIHsKKwkJaWYgKCgobGFzdF9mcmFtZV9udW0gKyAxKSAmIERXQ19IRk5VTV9NQVhfRlJOVU0pICE9CisJCSAgICBjdXJyX2ZyYW1lX251bWJlcikgeworCQkJZnJhbWVfbnVtX2FycmF5W2ZyYW1lX251bV9pZHhdID0gY3Vycl9mcmFtZV9udW1iZXI7CisJCQlsYXN0X2ZyYW1lX251bV9hcnJheVtmcmFtZV9udW1faWR4KytdID0gbGFzdF9mcmFtZV9udW07CisJCX0KKwl9IGVsc2UgaWYgKCFkdW1wZWRfZnJhbWVfbnVtX2FycmF5KSB7CisJCWludCBpOworCQlEV0NfUFJJTlRGKCJGcmFtZSAgICAgTGFzdCBGcmFtZVxuIik7CisJCURXQ19QUklOVEYoIi0tLS0tICAgICAtLS0tLS0tLS0tXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEZSQU1FX05VTV9BUlJBWV9TSVpFOyBpKyspIHsKKwkJCURXQ19QUklOVEYoIjB4JTA0eCAgICAweCUwNHhcbiIsCisJCQkJICAgZnJhbWVfbnVtX2FycmF5W2ldLCBsYXN0X2ZyYW1lX251bV9hcnJheVtpXSk7CisJCX0KKwkJZHVtcGVkX2ZyYW1lX251bV9hcnJheSA9IDE7CisJfQorCWxhc3RfZnJhbWVfbnVtID0gY3Vycl9mcmFtZV9udW1iZXI7Cit9CisjZW5kaWYKKworLyoqCisgKiBIYW5kbGVzIHRoZSBzdGFydC1vZi1mcmFtZSBpbnRlcnJ1cHQgaW4gaG9zdCBtb2RlLiBOb24tcGVyaW9kaWMKKyAqIHRyYW5zYWN0aW9ucyBtYXkgYmUgcXVldWVkIHRvIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgZm9yIHRoZSBjdXJyZW50CisgKiAobWljcm8pZnJhbWUuIFBlcmlvZGljIHRyYW5zYWN0aW9ucyBtYXkgYmUgcXVldWVkIHRvIHRoZSBjb250cm9sbGVyIGZvciB0aGUKKyAqIG5leHQgKG1pY3JvKWZyYW1lLgorICovCitpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9zb2ZfaW50cihkd2Nfb3RnX2hjZF90ICogaGNkKQoreworCWhmbnVtX2RhdGFfdCBoZm51bTsKKwlkd2NfbGlzdF9saW5rX3QgKnFoX2VudHJ5OworCWR3Y19vdGdfcWhfdCAqcWg7CisJZHdjX290Z190cmFuc2FjdGlvbl90eXBlX2UgdHJfdHlwZTsKKwlnaW50c3RzX2RhdGFfdCBnaW50c3RzID0gey5kMzIgPSAwIH07CisKKwloZm51bS5kMzIgPQorCSAgICBEV0NfUkVBRF9SRUczMigmaGNkLT5jb3JlX2lmLT5ob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZm51bSk7CisKKyNpZmRlZiBERUJVR19TT0YKKwlEV0NfREVCVUdQTChEQkdfSENELCAiLS1TdGFydCBvZiBGcmFtZSBJbnRlcnJ1cHQtLVxuIik7CisjZW5kaWYKKwloY2QtPmZyYW1lX251bWJlciA9IGhmbnVtLmIuZnJudW07CisKKyNpZmRlZiBERUJVRworCWhjZC0+ZnJyZW1fYWNjdW0gKz0gaGZudW0uYi5mcnJlbTsKKwloY2QtPmZycmVtX3NhbXBsZXMrKzsKKyNlbmRpZgorCisjaWZkZWYgRFdDX1RSQUNLX01JU1NFRF9TT0ZTCisJdHJhY2tfbWlzc2VkX3NvZnMoaGNkLT5mcmFtZV9udW1iZXIpOworI2VuZGlmCisJLyogRGV0ZXJtaW5lIHdoZXRoZXIgYW55IHBlcmlvZGljIFFIcyBzaG91bGQgYmUgZXhlY3V0ZWQuICovCisJcWhfZW50cnkgPSBEV0NfTElTVF9GSVJTVCgmaGNkLT5wZXJpb2RpY19zY2hlZF9pbmFjdGl2ZSk7CisJd2hpbGUgKHFoX2VudHJ5ICE9ICZoY2QtPnBlcmlvZGljX3NjaGVkX2luYWN0aXZlKSB7CisJCXFoID0gRFdDX0xJU1RfRU5UUlkocWhfZW50cnksIGR3Y19vdGdfcWhfdCwgcWhfbGlzdF9lbnRyeSk7CisJCXFoX2VudHJ5ID0gcWhfZW50cnktPm5leHQ7CisJCWlmIChkd2NfZnJhbWVfbnVtX2xlKHFoLT5zY2hlZF9mcmFtZSwgaGNkLT5mcmFtZV9udW1iZXIpKSB7CisJCQkvKgorCQkJICogTW92ZSBRSCB0byB0aGUgcmVhZHkgbGlzdCB0byBiZSBleGVjdXRlZCBuZXh0CisJCQkgKiAobWljcm8pZnJhbWUuCisJCQkgKi8KKwkJCURXQ19MSVNUX01PVkVfSEVBRCgmaGNkLT5wZXJpb2RpY19zY2hlZF9yZWFkeSwKKwkJCQkJICAgJnFoLT5xaF9saXN0X2VudHJ5KTsKKwkJfQorCX0KKwl0cl90eXBlID0gZHdjX290Z19oY2Rfc2VsZWN0X3RyYW5zYWN0aW9ucyhoY2QpOworCWlmICh0cl90eXBlICE9IERXQ19PVEdfVFJBTlNBQ1RJT05fTk9ORSkgeworCQlkd2Nfb3RnX2hjZF9xdWV1ZV90cmFuc2FjdGlvbnMoaGNkLCB0cl90eXBlKTsKKwl9CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwlnaW50c3RzLmIuc29maW50ciA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZoY2QtPmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIGdpbnRzdHMuZDMyKTsKKworCXJldHVybiAxOworfQorCisvKiogSGFuZGxlcyB0aGUgUnggU3RhdHVzIFF1ZXVlIExldmVsIEludGVycnVwdCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgYXQKKyAqIGxlYXN0IG9uZSBwYWNrZXQgaW4gdGhlIFJ4IEZJRk8uICBUaGUgcGFja2V0cyBhcmUgbW92ZWQgZnJvbSB0aGUgRklGTyB0bworICogbWVtb3J5IGlmIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgaXMgb3BlcmF0aW5nIGluIFNsYXZlIG1vZGUuICovCitpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9yeF9zdGF0dXNfcV9sZXZlbF9pbnRyKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCkKK3sKKwlob3N0X2dyeHN0c19kYXRhX3QgZ3J4c3RzOworCWR3Y19oY190ICpoYyA9IE5VTEw7CisKKwlEV0NfREVCVUdQTChEQkdfSENELCAiLS1SeFN0c1EgTGV2ZWwgSW50ZXJydXB0LS1cbiIpOworCisJZ3J4c3RzLmQzMiA9CisJICAgIERXQ19SRUFEX1JFRzMyKCZkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3J4c3RzcCk7CisKKwloYyA9IGR3Y19vdGdfaGNkLT5oY19wdHJfYXJyYXlbZ3J4c3RzLmIuY2hudW1dOworCWlmICghaGMpIHsKKwkJRFdDX0VSUk9SKCJVbmFibGUgdG8gZ2V0IGNvcnJlc3BvbmRpbmcgY2hhbm5lbFxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFBhY2tldCBTdGF0dXMgKi8KKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgICBDaCBudW0gPSAlZFxuIiwgZ3J4c3RzLmIuY2hudW0pOworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICAgIENvdW50ID0gJWRcbiIsIGdyeHN0cy5iLmJjbnQpOworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICAgIERQSUQgPSAlZCwgaGMuZHBpZCA9ICVkXG4iLCBncnhzdHMuYi5kcGlkLAorCQkgICAgaGMtPmRhdGFfcGlkX3N0YXJ0KTsKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgICBQU3RhdHVzID0gJWRcbiIsIGdyeHN0cy5iLnBrdHN0cyk7CisKKwlzd2l0Y2ggKGdyeHN0cy5iLnBrdHN0cykgeworCWNhc2UgRFdDX0dSWFNUU19QS1RTVFNfSU46CisJCS8qIFJlYWQgdGhlIGRhdGEgaW50byB0aGUgaG9zdCBidWZmZXIuICovCisJCWlmIChncnhzdHMuYi5iY250ID4gMCkgeworCQkJZHdjX290Z19yZWFkX3BhY2tldChkd2Nfb3RnX2hjZC0+Y29yZV9pZiwKKwkJCQkJICAgIGhjLT54ZmVyX2J1ZmYsIGdyeHN0cy5iLmJjbnQpOworCisJCQkvKiBVcGRhdGUgdGhlIEhDIGZpZWxkcyBmb3IgdGhlIG5leHQgcGFja2V0IHJlY2VpdmVkLiAqLworCQkJaGMtPnhmZXJfY291bnQgKz0gZ3J4c3RzLmIuYmNudDsKKwkJCWhjLT54ZmVyX2J1ZmYgKz0gZ3J4c3RzLmIuYmNudDsKKwkJfQorCisJY2FzZSBEV0NfR1JYU1RTX1BLVFNUU19JTl9YRkVSX0NPTVA6CisJY2FzZSBEV0NfR1JYU1RTX1BLVFNUU19EQVRBX1RPR0dMRV9FUlI6CisJY2FzZSBEV0NfR1JYU1RTX1BLVFNUU19DSF9IQUxURUQ6CisJCS8qIEhhbmRsZWQgaW4gaW50ZXJydXB0LCBqdXN0IGlnbm9yZSBkYXRhICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURXQ19FUlJPUigiUlhfU1RTX1EgSW50ZXJydXB0OiBVbmtub3duIHN0YXR1cyAlZFxuIiwKKwkJCSAgZ3J4c3RzLmIucGt0c3RzKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKiBUaGlzIGludGVycnVwdCBvY2N1cnMgd2hlbiB0aGUgbm9uLXBlcmlvZGljIFR4IEZJRk8gaXMgaGFsZi1lbXB0eS4gTW9yZQorICogZGF0YSBwYWNrZXRzIG1heSBiZSB3cml0dGVuIHRvIHRoZSBGSUZPIGZvciBPVVQgdHJhbnNmZXJzLiBNb3JlIHJlcXVlc3RzCisgKiBtYXkgYmUgd3JpdHRlbiB0byB0aGUgbm9uLXBlcmlvZGljIHJlcXVlc3QgcXVldWUgZm9yIElOIHRyYW5zZmVycy4gVGhpcworICogaW50ZXJydXB0IGlzIGVuYWJsZWQgb25seSBpbiBTbGF2ZSBtb2RlLiAqLworaW50MzJfdCBkd2Nfb3RnX2hjZF9oYW5kbGVfbnBfdHhfZmlmb19lbXB0eV9pbnRyKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCkKK3sKKwlEV0NfREVCVUdQTChEQkdfSENELCAiLS1Ob24tUGVyaW9kaWMgVHhGSUZPIEVtcHR5IEludGVycnVwdC0tXG4iKTsKKwlkd2Nfb3RnX2hjZF9xdWV1ZV90cmFuc2FjdGlvbnMoZHdjX290Z19oY2QsCisJCQkJICAgICAgIERXQ19PVEdfVFJBTlNBQ1RJT05fTk9OX1BFUklPRElDKTsKKwlyZXR1cm4gMTsKK30KKworLyoqIFRoaXMgaW50ZXJydXB0IG9jY3VycyB3aGVuIHRoZSBwZXJpb2RpYyBUeCBGSUZPIGlzIGhhbGYtZW1wdHkuIE1vcmUgZGF0YQorICogcGFja2V0cyBtYXkgYmUgd3JpdHRlbiB0byB0aGUgRklGTyBmb3IgT1VUIHRyYW5zZmVycy4gTW9yZSByZXF1ZXN0cyBtYXkgYmUKKyAqIHdyaXR0ZW4gdG8gdGhlIHBlcmlvZGljIHJlcXVlc3QgcXVldWUgZm9yIElOIHRyYW5zZmVycy4gVGhpcyBpbnRlcnJ1cHQgaXMKKyAqIGVuYWJsZWQgb25seSBpbiBTbGF2ZSBtb2RlLiAqLworaW50MzJfdCBkd2Nfb3RnX2hjZF9oYW5kbGVfcGVyaW9fdHhfZmlmb19lbXB0eV9pbnRyKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCkKK3sKKwlEV0NfREVCVUdQTChEQkdfSENELCAiLS1QZXJpb2RpYyBUeEZJRk8gRW1wdHkgSW50ZXJydXB0LS1cbiIpOworCWR3Y19vdGdfaGNkX3F1ZXVlX3RyYW5zYWN0aW9ucyhkd2Nfb3RnX2hjZCwKKwkJCQkgICAgICAgRFdDX09UR19UUkFOU0FDVElPTl9QRVJJT0RJQyk7CisJcmV0dXJuIDE7Cit9CisKKy8qKiBUaGVyZSBhcmUgbXVsdGlwbGUgY29uZGl0aW9ucyB0aGF0IGNhbiBjYXVzZSBhIHBvcnQgaW50ZXJydXB0LiBUaGlzIGZ1bmN0aW9uCisgKiBkZXRlcm1pbmVzIHdoaWNoIGludGVycnVwdCBjb25kaXRpb25zIGhhdmUgb2NjdXJyZWQgYW5kIGhhbmRsZXMgdGhlbQorICogYXBwcm9wcmlhdGVseS4gKi8KK2ludDMyX3QgZHdjX290Z19oY2RfaGFuZGxlX3BvcnRfaW50cihkd2Nfb3RnX2hjZF90ICogZHdjX290Z19oY2QpCit7CisJaW50IHJldHZhbCA9IDA7CisJaHBydDBfZGF0YV90IGhwcnQwOworCWhwcnQwX2RhdGFfdCBocHJ0MF9tb2RpZnk7CisKKwlocHJ0MC5kMzIgPSBEV0NfUkVBRF9SRUczMihkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aHBydDApOworCWhwcnQwX21vZGlmeS5kMzIgPSBEV0NfUkVBRF9SRUczMihkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aHBydDApOworCisJLyogQ2xlYXIgYXBwcm9wcmlhdGUgYml0cyBpbiBIUFJUMCB0byBjbGVhciB0aGUgaW50ZXJydXB0IGJpdCBpbgorCSAqIEdJTlRTVFMgKi8KKworCWhwcnQwX21vZGlmeS5iLnBydGVuYSA9IDA7CisJaHBydDBfbW9kaWZ5LmIucHJ0Y29ubmRldCA9IDA7CisJaHBydDBfbW9kaWZ5LmIucHJ0ZW5jaG5nID0gMDsKKwlocHJ0MF9tb2RpZnkuYi5wcnRvdnJjdXJyY2huZyA9IDA7CisKKwkvKiBQb3J0IENvbm5lY3QgRGV0ZWN0ZWQKKwkgKiBTZXQgZmxhZyBhbmQgY2xlYXIgaWYgZGV0ZWN0ZWQgKi8KKwlpZiAoZHdjX290Z19oY2QtPmNvcmVfaWYtPmhpYmVybmF0aW9uX3N1c3BlbmQgPT0gMSkgeworCQkvLyBEb250IG1vZGlmeSBwb3J0IHN0YXR1cyBpZiB3ZSBhcmUgaW4gaGliZXJuYXRpb24gc3RhdGUKKwkJaHBydDBfbW9kaWZ5LmIucHJ0Y29ubmRldCA9IDE7CisJCWhwcnQwX21vZGlmeS5iLnBydGVuY2huZyA9IDE7CisJCURXQ19XUklURV9SRUczMihkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aHBydDAsIGhwcnQwX21vZGlmeS5kMzIpOworCQlocHJ0MC5kMzIgPSBEV0NfUkVBRF9SRUczMihkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aHBydDApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWlmIChocHJ0MC5iLnBydGNvbm5kZXQpIHsKKwkJLyoqIEB0b2RvIC0gY2hlY2sgaWYgc3RlcHMgcGVyZm9ybWVkIGluICdlbHNlJyBibG9jayBzaG91bGQgYmUgcGVyZnJvbWVkIHJlZ2FyZGxlcyBhZHAgKi8KKwkJaWYgKGR3Y19vdGdfaGNkLT5jb3JlX2lmLT5hZHBfZW5hYmxlICYmCisJCQkJZHdjX290Z19oY2QtPmNvcmVfaWYtPmFkcC52YnVzb25fdGltZXJfc3RhcnRlZCA9PSAxKSB7CisJCQlEV0NfUFJJTlRGKCJQT1JUIENPTk5FQ1QgREVURUNURUQgLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCQlEV0NfVElNRVJfQ0FOQ0VMKGR3Y19vdGdfaGNkLT5jb3JlX2lmLT5hZHAudmJ1c29uX3RpbWVyKTsKKwkJCWR3Y19vdGdfaGNkLT5jb3JlX2lmLT5hZHAudmJ1c29uX3RpbWVyX3N0YXJ0ZWQgPSAwOworCQkJLyogVE9ETyAtIGNoZWNrIGlmIHRoaXMgaXMgcmVxdWlyZWQsIGFzCisJCQkgKiBob3N0IGluaXRpYWxpemF0aW9uIHdhcyBhbHJlYWR5IHBlcmZvcm1lZAorCQkJICogYWZ0ZXIgaW5pdGlhbCBBRFAgcHJvYmluZworCQkJICovCisJCQkvKmR3Y19vdGdfaGNkLT5jb3JlX2lmLT5hZHAudmJ1c29uX3RpbWVyX3N0YXJ0ZWQgPSAwOworCQkJZHdjX290Z19jb3JlX2luaXQoZHdjX290Z19oY2QtPmNvcmVfaWYpOworCQkJZHdjX290Z19lbmFibGVfZ2xvYmFsX2ludGVycnVwdHMoZHdjX290Z19oY2QtPmNvcmVfaWYpOworCQkJY2lsX2hjZF9zdGFydChkd2Nfb3RnX2hjZC0+Y29yZV9pZik7Ki8KKwkJfSBlbHNlIHsKKworCQkJRFdDX0RFQlVHUEwoREJHX0hDRCwgIi0tUG9ydCBJbnRlcnJ1cHQgSFBSVDA9MHglMDh4ICIKKwkJCQkgICAgIlBvcnQgQ29ubmVjdCBEZXRlY3RlZC0tXG4iLCBocHJ0MC5kMzIpOworCQkJZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9jb25uZWN0X3N0YXR1c19jaGFuZ2UgPSAxOworCQkJZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9jb25uZWN0X3N0YXR1cyA9IDE7CisJCQlocHJ0MF9tb2RpZnkuYi5wcnRjb25uZGV0ID0gMTsKKworCQkJLyogQi1EZXZpY2UgaGFzIGNvbm5lY3RlZCwgRGVsZXRlIHRoZSBjb25uZWN0aW9uIHRpbWVyLiAqLworCQkJRFdDX1RJTUVSX0NBTkNFTChkd2Nfb3RnX2hjZC0+Y29ubl90aW1lcik7CisJCX0KKwkJLyogVGhlIEh1YiBkcml2ZXIgYXNzZXJ0cyBhIHJlc2V0IHdoZW4gaXQgc2VlcyBwb3J0IGNvbm5lY3QKKwkJICogc3RhdHVzIGNoYW5nZSBmbGFnICovCisJCXJldHZhbCB8PSAxOworCX0KKworCS8qIFBvcnQgRW5hYmxlIENoYW5nZWQKKwkgKiBDbGVhciBpZiBkZXRlY3RlZCAtIFNldCBpbnRlcm5hbCBmbGFnIGlmIGRpc2FibGVkICovCisJaWYgKGhwcnQwLmIucHJ0ZW5jaG5nKSB7CisJCURXQ19ERUJVR1BMKERCR19IQ0QsICIgIC0tUG9ydCBJbnRlcnJ1cHQgSFBSVDA9MHglMDh4ICIKKwkJCSAgICAiUG9ydCBFbmFibGUgQ2hhbmdlZC0tXG4iLCBocHJ0MC5kMzIpOworCQlocHJ0MF9tb2RpZnkuYi5wcnRlbmNobmcgPSAxOworCQlpZiAoaHBydDAuYi5wcnRlbmEgPT0gMSkgeworCQkJaGZpcl9kYXRhX3QgaGZpcjsKKwkJCWludCBkb19yZXNldCA9IDA7CisJCQlkd2Nfb3RnX2NvcmVfcGFyYW1zX3QgKnBhcmFtcyA9CisJCQkgICAgZHdjX290Z19oY2QtPmNvcmVfaWYtPmNvcmVfcGFyYW1zOworCQkJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzID0KKwkJCSAgICBkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwkJCWR3Y19vdGdfaG9zdF9pZl90ICpob3N0X2lmID0KKwkJCSAgICBkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+aG9zdF9pZjsKKworCQkJLyogRXZlcnkgdGltZSB3aGVuIHBvcnQgZW5hYmxlcyBjYWxjdWxhdGUKKwkJCSAqIEhGSVIuRnJJbnRlcnZhbAorCQkJICovCisJCQloZmlyLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZmlyKTsKKwkJCWhmaXIuYi5mcmludCA9IGNhbGNfZnJhbWVfaW50ZXJ2YWwoZHdjX290Z19oY2QtPmNvcmVfaWYpOworCQkJRFdDX1dSSVRFX1JFRzMyKCZob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oZmlyLCBoZmlyLmQzMik7CisKKwkJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBQSFkgY2xvY2sgc3BlZWQgZm9yCisJCQkgKiBsb3cgcG93ZXIgYW5kIGFkanVzdCBpdCAqLworCQkJaWYgKHBhcmFtcy0+aG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcikgeworCQkJCWd1c2JjZmdfZGF0YV90IHVzYmNmZzsKKworCQkJCXVzYmNmZy5kMzIgPQorCQkJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmd1c2JjZmcpOworCisJCQkJaWYgKGhwcnQwLmIucHJ0c3BkID09IERXQ19IUFJUMF9QUlRTUERfTE9XX1NQRUVECisJCQkJICAgIHx8IGhwcnQwLmIucHJ0c3BkID09CisJCQkJICAgIERXQ19IUFJUMF9QUlRTUERfRlVMTF9TUEVFRCkgeworCQkJCQkvKgorCQkJCQkgKiBMb3cgcG93ZXIKKwkJCQkJICovCisJCQkJCWhjZmdfZGF0YV90IGhjZmc7CisJCQkJCWlmICh1c2JjZmcuYi5waHlscHdyY2xrc2VsID09IDApIHsKKwkJCQkJCS8qIFNldCBQSFkgbG93IHBvd2VyIGNsb2NrIHNlbGVjdCBmb3IgRlMvTFMgZGV2aWNlcyAqLworCQkJCQkJdXNiY2ZnLmIucGh5bHB3cmNsa3NlbCA9IDE7CisJCQkJCQlEV0NfV1JJVEVfUkVHMzIKKwkJCQkJCSAgICAoJmdsb2JhbF9yZWdzLT5ndXNiY2ZnLAorCQkJCQkJICAgICB1c2JjZmcuZDMyKTsKKwkJCQkJCWRvX3Jlc2V0ID0gMTsKKwkJCQkJfQorCisJCQkJCWhjZmcuZDMyID0KKwkJCQkJICAgIERXQ19SRUFEX1JFRzMyCisJCQkJCSAgICAoJmhvc3RfaWYtPmhvc3RfZ2xvYmFsX3JlZ3MtPmhjZmcpOworCisJCQkJCWlmIChocHJ0MC5iLnBydHNwZCA9PQorCQkJCQkgICAgRFdDX0hQUlQwX1BSVFNQRF9MT1dfU1BFRUQKKwkJCQkJICAgICYmIHBhcmFtcy0+aG9zdF9sc19sb3dfcG93ZXJfcGh5X2NsaworCQkJCQkgICAgPT0KKwkJCQkJICAgIERXQ19IT1NUX0xTX0xPV19QT1dFUl9QSFlfQ0xLX1BBUkFNXzZNSFopCisJCQkJCXsKKwkJCQkJCS8qIDYgTUhaICovCisJCQkJCQlEV0NfREVCVUdQTChEQkdfQ0lMLAorCQkJCQkJCSAgICAiRlNfUEhZIHByb2dyYW1taW5nIEhDRkcgdG8gNiBNSHogKExvdyBQb3dlcilcbiIpOworCQkJCQkJaWYgKGhjZmcuYi5mc2xzcGNsa3NlbCAhPQorCQkJCQkJICAgIERXQ19IQ0ZHXzZfTUhaKSB7CisJCQkJCQkJaGNmZy5iLmZzbHNwY2xrc2VsID0KKwkJCQkJCQkgICAgRFdDX0hDRkdfNl9NSFo7CisJCQkJCQkJRFdDX1dSSVRFX1JFRzMyCisJCQkJCQkJICAgICgmaG9zdF9pZi0+aG9zdF9nbG9iYWxfcmVncy0+aGNmZywKKwkJCQkJCQkgICAgIGhjZmcuZDMyKTsKKwkJCQkJCQlkb19yZXNldCA9IDE7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiA0OCBNSFogKi8KKwkJCQkJCURXQ19ERUJVR1BMKERCR19DSUwsCisJCQkJCQkJICAgICJGU19QSFkgcHJvZ3JhbW1pbmcgSENGRyB0byA0OCBNSHogKClcbiIpOworCQkJCQkJaWYgKGhjZmcuYi5mc2xzcGNsa3NlbCAhPQorCQkJCQkJICAgIERXQ19IQ0ZHXzQ4X01IWikgeworCQkJCQkJCWhjZmcuYi5mc2xzcGNsa3NlbCA9CisJCQkJCQkJICAgIERXQ19IQ0ZHXzQ4X01IWjsKKwkJCQkJCQlEV0NfV1JJVEVfUkVHMzIKKwkJCQkJCQkgICAgKCZob3N0X2lmLT5ob3N0X2dsb2JhbF9yZWdzLT5oY2ZnLAorCQkJCQkJCSAgICAgaGNmZy5kMzIpOworCQkJCQkJCWRvX3Jlc2V0ID0gMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIE5vdCBsb3cgcG93ZXIKKwkJCQkJICovCisJCQkJCWlmICh1c2JjZmcuYi5waHlscHdyY2xrc2VsID09IDEpIHsKKwkJCQkJCXVzYmNmZy5iLnBoeWxwd3JjbGtzZWwgPSAwOworCQkJCQkJRFdDX1dSSVRFX1JFRzMyCisJCQkJCQkgICAgKCZnbG9iYWxfcmVncy0+Z3VzYmNmZywKKwkJCQkJCSAgICAgdXNiY2ZnLmQzMik7CisJCQkJCQlkb19yZXNldCA9IDE7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoZG9fcmVzZXQpIHsKKwkJCQkJRFdDX1RBU0tfU0NIRURVTEUoZHdjX290Z19oY2QtPnJlc2V0X3Rhc2tsZXQpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCFkb19yZXNldCkgeworCQkJCS8qIFBvcnQgaGFzIGJlZW4gZW5hYmxlZCBzZXQgdGhlIHJlc2V0IGNoYW5nZSBmbGFnICovCisJCQkJZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9yZXNldF9jaGFuZ2UgPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJZHdjX290Z19oY2QtPmZsYWdzLmIucG9ydF9lbmFibGVfY2hhbmdlID0gMTsKKwkJfQorCQlyZXR2YWwgfD0gMTsKKwl9CisKKwkvKiogT3ZlcmN1cnJlbnQgQ2hhbmdlIEludGVycnVwdCAqLworCWlmIChocHJ0MC5iLnBydG92cmN1cnJjaG5nKSB7CisJCURXQ19ERUJVR1BMKERCR19IQ0QsICIgIC0tUG9ydCBJbnRlcnJ1cHQgSFBSVDA9MHglMDh4ICIKKwkJCSAgICAiUG9ydCBPdmVyY3VycmVudCBDaGFuZ2VkLS1cbiIsIGhwcnQwLmQzMik7CisJCWR3Y19vdGdfaGNkLT5mbGFncy5iLnBvcnRfb3Zlcl9jdXJyZW50X2NoYW5nZSA9IDE7CisJCWhwcnQwX21vZGlmeS5iLnBydG92cmN1cnJjaG5nID0gMTsKKwkJcmV0dmFsIHw9IDE7CisJfQorCisJLyogQ2xlYXIgUG9ydCBJbnRlcnJ1cHRzICovCisJRFdDX1dSSVRFX1JFRzMyKGR3Y19vdGdfaGNkLT5jb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCwgaHBydDBfbW9kaWZ5LmQzMik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiogVGhpcyBpbnRlcnJ1cHQgaW5kaWNhdGVzIHRoYXQgb25lIG9yIG1vcmUgaG9zdCBjaGFubmVscyBoYXMgYSBwZW5kaW5nCisgKiBpbnRlcnJ1cHQuIFRoZXJlIGFyZSBtdWx0aXBsZSBjb25kaXRpb25zIHRoYXQgY2FuIGNhdXNlIGVhY2ggaG9zdCBjaGFubmVsCisgKiBpbnRlcnJ1cHQuIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGljaCBjb25kaXRpb25zIGhhdmUgb2NjdXJyZWQgZm9yIGVhY2gKKyAqIGhvc3QgY2hhbm5lbCBpbnRlcnJ1cHQgYW5kIGhhbmRsZXMgdGhlbSBhcHByb3ByaWF0ZWx5LiAqLworaW50MzJfdCBkd2Nfb3RnX2hjZF9oYW5kbGVfaGNfaW50cihkd2Nfb3RnX2hjZF90ICogZHdjX290Z19oY2QpCit7CisJaW50IGk7CisJaW50IHJldHZhbCA9IDA7CisJaGFpbnRfZGF0YV90IGhhaW50OworCisJLyogQ2xlYXIgYXBwcm9wcmlhdGUgYml0cyBpbiBIQ0lOVG4gdG8gY2xlYXIgdGhlIGludGVycnVwdCBiaXQgaW4KKwkgKiBHSU5UU1RTICovCisKKwloYWludC5kMzIgPSBkd2Nfb3RnX3JlYWRfaG9zdF9hbGxfY2hhbm5lbHNfaW50cihkd2Nfb3RnX2hjZC0+Y29yZV9pZik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZHdjX290Z19oY2QtPmNvcmVfaWYtPmNvcmVfcGFyYW1zLT5ob3N0X2NoYW5uZWxzOyBpKyspIHsKKwkJaWYgKGhhaW50LmIyLmNoaW50ICYgKDEgPDwgaSkpIHsKKwkJCXJldHZhbCB8PSBkd2Nfb3RnX2hjZF9oYW5kbGVfaGNfbl9pbnRyKGR3Y19vdGdfaGNkLCBpKTsKKwkJfQorCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogR2V0cyB0aGUgYWN0dWFsIGxlbmd0aCBvZiBhIHRyYW5zZmVyIGFmdGVyIHRoZSB0cmFuc2ZlciBoYWx0cy4gX2hhbHRfc3RhdHVzCisgKiBob2xkcyB0aGUgcmVhc29uIGZvciB0aGUgaGFsdC4KKyAqCisgKiBGb3IgSU4gdHJhbnNmZXJzIHdoZXJlIGhhbHRfc3RhdHVzIGlzIERXQ19PVEdfSENfWEZFUl9DT01QTEVURSwKKyAqICpzaG9ydF9yZWFkIGlzIHNldCB0byAxIHVwb24gcmV0dXJuIGlmIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkCisgKiBudW1iZXIgb2YgYnl0ZXMgd2VyZSB0cmFuc2ZlcnJlZC4gT3RoZXJ3aXNlLCAqc2hvcnRfcmVhZCBpcyBzZXQgdG8gMCB1cG9uCisgKiByZXR1cm4uIHNob3J0X3JlYWQgbWF5IGFsc28gYmUgTlVMTCBvbiBlbnRyeSwgaW4gd2hpY2ggY2FzZSBpdCByZW1haW5zCisgKiB1bmNoYW5nZWQuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBnZXRfYWN0dWFsX3hmZXJfbGVuZ3RoKGR3Y19oY190ICogaGMsCisJCQkJICAgICAgIGR3Y19vdGdfaGNfcmVnc190ICogaGNfcmVncywKKwkJCQkgICAgICAgZHdjX290Z19xdGRfdCAqIHF0ZCwKKwkJCQkgICAgICAgZHdjX290Z19oYWx0X3N0YXR1c19lIGhhbHRfc3RhdHVzLAorCQkJCSAgICAgICBpbnQgKnNob3J0X3JlYWQpCit7CisJaGN0c2l6X2RhdGFfdCBoY3RzaXo7CisJdWludDMyX3QgbGVuZ3RoOworCisJaWYgKHNob3J0X3JlYWQgIT0gTlVMTCkgeworCQkqc2hvcnRfcmVhZCA9IDA7CisJfQorCWhjdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGN0c2l6KTsKKworCWlmIChoYWx0X3N0YXR1cyA9PSBEV0NfT1RHX0hDX1hGRVJfQ09NUExFVEUpIHsKKwkJaWYgKGhjLT5lcF9pc19pbikgeworCQkJbGVuZ3RoID0gaGMtPnhmZXJfbGVuIC0gaGN0c2l6LmIueGZlcnNpemU7CisJCQlpZiAoc2hvcnRfcmVhZCAhPSBOVUxMKSB7CisJCQkJKnNob3J0X3JlYWQgPSAoaGN0c2l6LmIueGZlcnNpemUgIT0gMCk7CisJCQl9CisJCX0gZWxzZSBpZiAoaGMtPnFoLT5kb19zcGxpdCkgeworCQkJbGVuZ3RoID0gcXRkLT5zc3BsaXRfb3V0X3hmZXJfY291bnQ7CisJCX0gZWxzZSB7CisJCQlsZW5ndGggPSBoYy0+eGZlcl9sZW47CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBNdXN0IHVzZSB0aGUgaGN0c2l6LnBrdGNudCBmaWVsZCB0byBkZXRlcm1pbmUgaG93IG11Y2ggZGF0YQorCQkgKiBoYXMgYmVlbiB0cmFuc2ZlcnJlZC4gVGhpcyBmaWVsZCByZWZsZWN0cyB0aGUgbnVtYmVyIG9mCisJCSAqIHBhY2tldHMgdGhhdCBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgdmlhIHRoZSBVU0IuIFRoaXMgaXMKKwkJICogYWx3YXlzIGFuIGludGVncmFsIG51bWJlciBvZiBwYWNrZXRzIGlmIHRoZSB0cmFuc2ZlciB3YXMKKwkJICogaGFsdGVkIGJlZm9yZSBpdHMgbm9ybWFsIGNvbXBsZXRpb24uIChDYW4ndCB1c2UgdGhlCisJCSAqIGhjdHNpei54ZmVyc2l6ZSBmaWVsZCBiZWNhdXNlIHRoYXQgcmVmbGVjdHMgdGhlIG51bWJlciBvZgorCQkgKiBieXRlcyB0cmFuc2ZlcnJlZCB2aWEgdGhlIEFIQiwgbm90IHRoZSBVU0IpLgorCQkgKi8KKwkJbGVuZ3RoID0KKwkJICAgIChoYy0+c3RhcnRfcGt0X2NvdW50IC0gaGN0c2l6LmIucGt0Y250KSAqIGhjLT5tYXhfcGFja2V0OworCX0KKworCXJldHVybiBsZW5ndGg7Cit9CisKKy8qKgorICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIFVSQiBhZnRlciBhIFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdCBvbiB0aGUKKyAqIGhvc3QgY2hhbm5lbC4gVXBkYXRlcyB0aGUgYWN0dWFsX2xlbmd0aCBmaWVsZCBvZiB0aGUgVVJCIGJhc2VkIG9uIHRoZQorICogbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHZpYSB0aGUgaG9zdCBjaGFubmVsLiBTZXRzIHRoZSBVUkIgc3RhdHVzCisgKiBpZiB0aGUgZGF0YSB0cmFuc2ZlciBpcyBmaW5pc2hlZC4KKyAqCisgKiBAcmV0dXJuIDEgaWYgdGhlIGRhdGEgdHJhbnNmZXIgc3BlY2lmaWVkIGJ5IHRoZSBVUkIgaXMgY29tcGxldGVseSBmaW5pc2hlZCwKKyAqIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHVwZGF0ZV91cmJfc3RhdGVfeGZlcl9jb21wKGR3Y19oY190ICogaGMsCisJCQkJICAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCSAgICAgIGR3Y19vdGdfaGNkX3VyYl90ICogdXJiLAorCQkJCSAgICAgIGR3Y19vdGdfcXRkX3QgKiBxdGQpCit7CisJaW50IHhmZXJfZG9uZSA9IDA7CisJaW50IHNob3J0X3JlYWQgPSAwOworCisJaW50IHhmZXJfbGVuZ3RoOworCisJeGZlcl9sZW5ndGggPSBnZXRfYWN0dWFsX3hmZXJfbGVuZ3RoKGhjLCBoY19yZWdzLCBxdGQsCisJCQkJCSAgICAgRFdDX09UR19IQ19YRkVSX0NPTVBMRVRFLAorCQkJCQkgICAgICZzaG9ydF9yZWFkKTsKKworCisJLyogbm9uIERXT1JELWFsaWduZWQgYnVmZmVyIGNhc2UgaGFuZGxpbmcuICovCisJaWYgKGhjLT5hbGlnbl9idWZmICYmIHhmZXJfbGVuZ3RoICYmIGhjLT5lcF9pc19pbikgeworCQlkd2NfbWVtY3B5KHVyYi0+YnVmICsgdXJiLT5hY3R1YWxfbGVuZ3RoLCBoYy0+cWgtPmR3X2FsaWduX2J1ZiwKKwkJCSAgIHhmZXJfbGVuZ3RoKTsKKwl9CisKKwl1cmItPmFjdHVhbF9sZW5ndGggKz0geGZlcl9sZW5ndGg7CisKKwlpZiAoeGZlcl9sZW5ndGggJiYgKGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9CVUxLKSAmJgorCSAgICAodXJiLT5mbGFncyAmIFVSQl9TRU5EX1pFUk9fUEFDS0VUKQorCSAgICAmJiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IHVyYi0+bGVuZ3RoKQorCSAgICAmJiAhKHVyYi0+bGVuZ3RoICUgaGMtPm1heF9wYWNrZXQpKSB7CisJCXhmZXJfZG9uZSA9IDA7CisJfSBlbHNlIGlmIChzaG9ydF9yZWFkIHx8IHVyYi0+YWN0dWFsX2xlbmd0aCA9PSB1cmItPmxlbmd0aCkgeworCQl4ZmVyX2RvbmUgPSAxOworCQl1cmItPnN0YXR1cyA9IDA7CisJfQorCisjaWZkZWYgREVCVUcKKwl7CisJCWhjdHNpel9kYXRhX3QgaGN0c2l6OworCQloY3RzaXouZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjdHNpeik7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiRFdDX290ZzogJXM6ICVzLCBjaGFubmVsICVkXG4iLAorCQkJICAgIF9fZnVuY19fLCAoaGMtPmVwX2lzX2luID8gIklOIiA6ICJPVVQiKSwKKwkJCSAgICBoYy0+aGNfbnVtKTsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIgIGhjLT54ZmVyX2xlbiAlZFxuIiwgaGMtPnhmZXJfbGVuKTsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIgIGhjdHNpei54ZmVyc2l6ZSAlZFxuIiwKKwkJCSAgICBoY3RzaXouYi54ZmVyc2l6ZSk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJWRcbiIsCisJCQkgICAgdXJiLT5sZW5ndGgpOworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgdXJiLT5hY3R1YWxfbGVuZ3RoICVkXG4iLAorCQkJICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBzaG9ydF9yZWFkICVkLCB4ZmVyX2RvbmUgJWRcbiIsCisJCQkgICAgc2hvcnRfcmVhZCwgeGZlcl9kb25lKTsKKwl9CisjZW5kaWYKKworCXJldHVybiB4ZmVyX2RvbmU7Cit9CisKKy8qCisgKiBTYXZlIHRoZSBzdGFydGluZyBkYXRhIHRvZ2dsZSBmb3IgdGhlIG5leHQgdHJhbnNmZXIuIFRoZSBkYXRhIHRvZ2dsZSBpcworICogc2F2ZWQgaW4gdGhlIFFIIGZvciBub24tY29udHJvbCB0cmFuc2ZlcnMgYW5kIGl0J3Mgc2F2ZWQgaW4gdGhlIFFURCBmb3IKKyAqIGNvbnRyb2wgdHJhbnNmZXJzLgorICovCit2b2lkIGR3Y19vdGdfaGNkX3NhdmVfZGF0YV90b2dnbGUoZHdjX2hjX3QgKiBoYywKKwkJCSAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLCBkd2Nfb3RnX3F0ZF90ICogcXRkKQoreworCWhjdHNpel9kYXRhX3QgaGN0c2l6OworCWhjdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGN0c2l6KTsKKworCWlmIChoYy0+ZXBfdHlwZSAhPSBEV0NfT1RHX0VQX1RZUEVfQ09OVFJPTCkgeworCQlkd2Nfb3RnX3FoX3QgKnFoID0gaGMtPnFoOworCQlpZiAoaGN0c2l6LmIucGlkID09IERXQ19IQ1RTSVpfREFUQTApIHsKKwkJCXFoLT5kYXRhX3RvZ2dsZSA9IERXQ19PVEdfSENfUElEX0RBVEEwOworCQl9IGVsc2UgeworCQkJcWgtPmRhdGFfdG9nZ2xlID0gRFdDX09UR19IQ19QSURfREFUQTE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoaGN0c2l6LmIucGlkID09IERXQ19IQ1RTSVpfREFUQTApIHsKKwkJCXF0ZC0+ZGF0YV90b2dnbGUgPSBEV0NfT1RHX0hDX1BJRF9EQVRBMDsKKwkJfSBlbHNlIHsKKwkJCXF0ZC0+ZGF0YV90b2dnbGUgPSBEV0NfT1RHX0hDX1BJRF9EQVRBMTsKKwkJfQorCX0KK30KKworLyoqCisgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiBhbiBJc29jaHJvbm91cyBVUkIgd2hlbiB0aGUgdHJhbnNmZXIgaXMgc3RvcHBlZCBmb3IKKyAqIGFueSByZWFzb24uIFRoZSBmaWVsZHMgb2YgdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlIGZyYW1lIGRlc2NyaXB0b3IgYXJyYXkKKyAqIGFyZSBzZXQgYmFzZWQgb24gdGhlIHRyYW5zZmVyIHN0YXRlIGFuZCB0aGUgaW5wdXQgX2hhbHRfc3RhdHVzLiBDb21wbGV0ZXMKKyAqIHRoZSBJc29jaHJvbm91cyBVUkIgaWYgYWxsIHRoZSBVUkIgZnJhbWVzIGhhdmUgYmVlbiBjb21wbGV0ZWQuCisgKgorICogQHJldHVybiBEV0NfT1RHX0hDX1hGRVJfQ09NUExFVEUgaWYgdGhlcmUgYXJlIG1vcmUgZnJhbWVzIHJlbWFpbmluZyB0byBiZQorICogdHJhbnNmZXJyZWQgaW4gdGhlIFVSQi4gT3RoZXJ3aXNlIHJldHVybiBEV0NfT1RHX0hDX1hGRVJfVVJCX0NPTVBMRVRFLgorICovCitzdGF0aWMgZHdjX290Z19oYWx0X3N0YXR1c19lCit1cGRhdGVfaXNvY191cmJfc3RhdGUoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJICAgICAgZHdjX2hjX3QgKiBoYywKKwkJICAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkgICAgICBkd2Nfb3RnX3F0ZF90ICogcXRkLCBkd2Nfb3RnX2hhbHRfc3RhdHVzX2UgaGFsdF9zdGF0dXMpCit7CisJZHdjX290Z19oY2RfdXJiX3QgKnVyYiA9IHF0ZC0+dXJiOworCWR3Y19vdGdfaGFsdF9zdGF0dXNfZSByZXRfdmFsID0gaGFsdF9zdGF0dXM7CisJc3RydWN0IGR3Y19vdGdfaGNkX2lzb19wYWNrZXRfZGVzYyAqZnJhbWVfZGVzYzsKKworCWZyYW1lX2Rlc2MgPSAmdXJiLT5pc29fZGVzY3NbcXRkLT5pc29jX2ZyYW1lX2luZGV4XTsKKwlzd2l0Y2ggKGhhbHRfc3RhdHVzKSB7CisJY2FzZSBEV0NfT1RHX0hDX1hGRVJfQ09NUExFVEU6CisJCWZyYW1lX2Rlc2MtPnN0YXR1cyA9IDA7CisJCWZyYW1lX2Rlc2MtPmFjdHVhbF9sZW5ndGggPQorCQkgICAgZ2V0X2FjdHVhbF94ZmVyX2xlbmd0aChoYywgaGNfcmVncywgcXRkLCBoYWx0X3N0YXR1cywgTlVMTCk7CisKKwkJLyogbm9uIERXT1JELWFsaWduZWQgYnVmZmVyIGNhc2UgaGFuZGxpbmcuICovCisJCWlmIChoYy0+YWxpZ25fYnVmZiAmJiBmcmFtZV9kZXNjLT5hY3R1YWxfbGVuZ3RoICYmIGhjLT5lcF9pc19pbikgeworCQkJZHdjX21lbWNweSh1cmItPmJ1ZiArIGZyYW1lX2Rlc2MtPm9mZnNldCArIHF0ZC0+aXNvY19zcGxpdF9vZmZzZXQsCisJCQkJICAgaGMtPnFoLT5kd19hbGlnbl9idWYsIGZyYW1lX2Rlc2MtPmFjdHVhbF9sZW5ndGgpOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBEV0NfT1RHX0hDX1hGRVJfRlJBTUVfT1ZFUlJVTjoKKwkJdXJiLT5lcnJvcl9jb3VudCsrOworCQlpZiAoaGMtPmVwX2lzX2luKSB7CisJCQlmcmFtZV9kZXNjLT5zdGF0dXMgPSAtRFdDX0VfTk9fU1RSRUFNX1JFUzsKKwkJfSBlbHNlIHsKKwkJCWZyYW1lX2Rlc2MtPnN0YXR1cyA9IC1EV0NfRV9DT01NVU5JQ0FUSU9OOworCQl9CisJCWZyYW1lX2Rlc2MtPmFjdHVhbF9sZW5ndGggPSAwOworCQlicmVhazsKKwljYXNlIERXQ19PVEdfSENfWEZFUl9CQUJCTEVfRVJSOgorCQl1cmItPmVycm9yX2NvdW50Kys7CisJCWZyYW1lX2Rlc2MtPnN0YXR1cyA9IC1EV0NfRV9PVkVSRkxPVzsKKwkJLyogRG9uJ3QgbmVlZCB0byB1cGRhdGUgYWN0dWFsX2xlbmd0aCBpbiB0aGlzIGNhc2UuICovCisJCWJyZWFrOworCWNhc2UgRFdDX09UR19IQ19YRkVSX1hBQ1RfRVJSOgorCQl1cmItPmVycm9yX2NvdW50Kys7CisJCWZyYW1lX2Rlc2MtPnN0YXR1cyA9IC1EV0NfRV9QUk9UT0NPTDsKKwkJZnJhbWVfZGVzYy0+YWN0dWFsX2xlbmd0aCA9CisJCSAgICBnZXRfYWN0dWFsX3hmZXJfbGVuZ3RoKGhjLCBoY19yZWdzLCBxdGQsIGhhbHRfc3RhdHVzLCBOVUxMKTsKKworCQkvKiBub24gRFdPUkQtYWxpZ25lZCBidWZmZXIgY2FzZSBoYW5kbGluZy4gKi8KKwkJaWYgKGhjLT5hbGlnbl9idWZmICYmIGZyYW1lX2Rlc2MtPmFjdHVhbF9sZW5ndGggJiYgaGMtPmVwX2lzX2luKSB7CisJCQlkd2NfbWVtY3B5KHVyYi0+YnVmICsgZnJhbWVfZGVzYy0+b2Zmc2V0ICsgcXRkLT5pc29jX3NwbGl0X29mZnNldCwKKwkJCQkgICBoYy0+cWgtPmR3X2FsaWduX2J1ZiwgZnJhbWVfZGVzYy0+YWN0dWFsX2xlbmd0aCk7CisJCX0KKwkJLyogU2tpcCB3aG9sZSBmcmFtZSAqLworCQlpZiAoaGMtPnFoLT5kb19zcGxpdCAmJiAoaGMtPmVwX3R5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpICYmCisJCSAgICBoYy0+ZXBfaXNfaW4gJiYgaGNkLT5jb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQlxdGQtPmNvbXBsZXRlX3NwbGl0ID0gMDsKKwkJCXF0ZC0+aXNvY19zcGxpdF9vZmZzZXQgPSAwOworCQl9CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFdDX0FTU0VSVCgxLCAiVW5oYW5kbGVkIF9oYWx0X3N0YXR1cyAoJWQpXG4iLCBoYWx0X3N0YXR1cyk7CisJCWJyZWFrOworCX0KKwlpZiAoKytxdGQtPmlzb2NfZnJhbWVfaW5kZXggPT0gdXJiLT5wYWNrZXRfY291bnQpIHsKKwkJLyoKKwkJICogdXJiLT5zdGF0dXMgaXMgbm90IHVzZWQgZm9yIGlzb2MgdHJhbnNmZXJzLgorCQkgKiBUaGUgaW5kaXZpZHVhbCBmcmFtZV9kZXNjIHN0YXR1c2VzIGFyZSB1c2VkIGluc3RlYWQuCisJCSAqLworCQloY2QtPmZvcHMtPmNvbXBsZXRlKGhjZCwgdXJiLT5wcml2LCB1cmIsIDApOworCQlyZXRfdmFsID0gRFdDX09UR19IQ19YRkVSX1VSQl9DT01QTEVURTsKKwl9IGVsc2UgeworCQlyZXRfdmFsID0gRFdDX09UR19IQ19YRkVSX0NPTVBMRVRFOworCX0KKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCisgKiBGcmVlcyB0aGUgZmlyc3QgUVREIGluIHRoZSBRSCdzIGxpc3QgaWYgZnJlZV9xdGQgaXMgMS4gRm9yIG5vbi1wZXJpb2RpYworICogUUhzLCByZW1vdmVzIHRoZSBRSCBmcm9tIHRoZSBhY3RpdmUgbm9uLXBlcmlvZGljIHNjaGVkdWxlLiBJZiBhbnkgUVREcyBhcmUKKyAqIHN0aWxsIGxpbmtlZCB0byB0aGUgUUgsIHRoZSBRSCBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBpbmFjdGl2ZQorICogbm9uLXBlcmlvZGljIHNjaGVkdWxlLiBGb3IgcGVyaW9kaWMgUUhzLCByZW1vdmVzIHRoZSBRSCBmcm9tIHRoZSBwZXJpb2RpYworICogc2NoZWR1bGUgaWYgbm8gbW9yZSBRVERzIGFyZSBsaW5rZWQgdG8gdGhlIFFILgorICovCitzdGF0aWMgdm9pZCBkZWFjdGl2YXRlX3FoKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoLCBpbnQgZnJlZV9xdGQpCit7CisJaW50IGNvbnRpbnVlX3NwbGl0ID0gMDsKKwlkd2Nfb3RnX3F0ZF90ICpxdGQ7CisKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgJXMoJXAsJXAsJWQpXG4iLCBfX2Z1bmNfXywgaGNkLCBxaCwgZnJlZV9xdGQpOworCisJcXRkID0gRFdDX0NJUkNMRVFfRklSU1QoJnFoLT5xdGRfbGlzdCk7CisKKwlpZiAocXRkLT5jb21wbGV0ZV9zcGxpdCkgeworCQljb250aW51ZV9zcGxpdCA9IDE7CisJfSBlbHNlIGlmIChxdGQtPmlzb2Nfc3BsaXRfcG9zID09IERXQ19IQ1NQTElUX1hBQ1RQT1NfTUlEIHx8CisJCSAgIHF0ZC0+aXNvY19zcGxpdF9wb3MgPT0gRFdDX0hDU1BMSVRfWEFDVFBPU19FTkQpIHsKKwkJY29udGludWVfc3BsaXQgPSAxOworCX0KKworCWlmIChmcmVlX3F0ZCkgeworCQlkd2Nfb3RnX2hjZF9xdGRfcmVtb3ZlX2FuZF9mcmVlKGhjZCwgcXRkLCBxaCk7CisJCWNvbnRpbnVlX3NwbGl0ID0gMDsKKwl9CisKKwlxaC0+Y2hhbm5lbCA9IE5VTEw7CisJZHdjX290Z19oY2RfcWhfZGVhY3RpdmF0ZShoY2QsIHFoLCBjb250aW51ZV9zcGxpdCk7Cit9CisKKy8qKgorICogUmVsZWFzZXMgYSBob3N0IGNoYW5uZWwgZm9yIHVzZSBieSBvdGhlciB0cmFuc2ZlcnMuIEF0dGVtcHRzIHRvIHNlbGVjdCBhbmQKKyAqIHF1ZXVlIG1vcmUgdHJhbnNhY3Rpb25zIHNpbmNlIGF0IGxlYXN0IG9uZSBob3N0IGNoYW5uZWwgaXMgYXZhaWxhYmxlLgorICoKKyAqIEBwYXJhbSBoY2QgVGhlIEhDRCBzdGF0ZSBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gaGMgVGhlIGhvc3QgY2hhbm5lbCB0byByZWxlYXNlLgorICogQHBhcmFtIHF0ZCBUaGUgUVREIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9zdCBjaGFubmVsLiBUaGlzIFFURCBtYXkgYmUgZnJlZWQKKyAqIGlmIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBvciBhbiBlcnJvciBoYXMgb2NjdXJyZWQuCisgKiBAcGFyYW0gaGFsdF9zdGF0dXMgUmVhc29uIHRoZSBjaGFubmVsIGlzIGJlaW5nIHJlbGVhc2VkLiBUaGlzIHN0YXR1cworICogZGV0ZXJtaW5lcyB0aGUgYWN0aW9ucyB0YWtlbiBieSB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCByZWxlYXNlX2NoYW5uZWwoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCSAgICBkd2NfaGNfdCAqIGhjLAorCQkJICAgIGR3Y19vdGdfcXRkX3QgKiBxdGQsCisJCQkgICAgZHdjX290Z19oYWx0X3N0YXR1c19lIGhhbHRfc3RhdHVzKQoreworCWR3Y19vdGdfdHJhbnNhY3Rpb25fdHlwZV9lIHRyX3R5cGU7CisJaW50IGZyZWVfcXRkOworICAgIGdpbnRtc2tfZGF0YV90IGludHJfbWFzayA9IHsuZDMyID0gMCB9OworCisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIgICVzOiBjaGFubmVsICVkLCBoYWx0X3N0YXR1cyAlZFxuIiwKKwkJICAgIF9fZnVuY19fLCBoYy0+aGNfbnVtLCBoYWx0X3N0YXR1cyk7CisKKwlzd2l0Y2ggKGhhbHRfc3RhdHVzKSB7CisJY2FzZSBEV0NfT1RHX0hDX1hGRVJfVVJCX0NPTVBMRVRFOgorCQlmcmVlX3F0ZCA9IDE7CisJCWJyZWFrOworCWNhc2UgRFdDX09UR19IQ19YRkVSX0FIQl9FUlI6CisJY2FzZSBEV0NfT1RHX0hDX1hGRVJfU1RBTEw6CisJY2FzZSBEV0NfT1RHX0hDX1hGRVJfQkFCQkxFX0VSUjoKKwkJZnJlZV9xdGQgPSAxOworCQlicmVhazsKKwljYXNlIERXQ19PVEdfSENfWEZFUl9YQUNUX0VSUjoKKwkJaWYgKHF0ZC0+ZXJyb3JfY291bnQgPj0gMykgeworCQkJRFdDX0RFQlVHUEwoREJHX0hDRFYsCisJCQkJICAgICIgIENvbXBsZXRlIFVSQiB3aXRoIHRyYW5zYWN0aW9uIGVycm9yXG4iKTsKKwkJCWZyZWVfcXRkID0gMTsKKwkJCXF0ZC0+dXJiLT5zdGF0dXMgPSAtRFdDX0VfUFJPVE9DT0w7CisJCQloY2QtPmZvcHMtPmNvbXBsZXRlKGhjZCwgcXRkLT51cmItPnByaXYsCisJCQkJCSAgICBxdGQtPnVyYiwgLURXQ19FX1BST1RPQ09MKTsKKwkJfSBlbHNlIHsKKwkJCWZyZWVfcXRkID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIERXQ19PVEdfSENfWEZFUl9VUkJfREVRVUVVRToKKwkJLyoKKwkJICogVGhlIFFURCBoYXMgYWxyZWFkeSBiZWVuIHJlbW92ZWQgYW5kIHRoZSBRSCBoYXMgYmVlbgorCQkgKiBkZWFjdGl2YXRlZC4gRG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBleGNlcHQgcmVsZWFzZSB0aGUKKwkJICogaG9zdCBjaGFubmVsIGFuZCB0cnkgdG8gcXVldWUgbW9yZSB0cmFuc2ZlcnMuCisJCSAqLworCQlnb3RvIGNsZWFudXA7CisJY2FzZSBEV0NfT1RHX0hDX1hGRVJfTk9fSEFMVF9TVEFUVVM6CisJCWZyZWVfcXRkID0gMDsKKwkJYnJlYWs7CisJY2FzZSBEV0NfT1RHX0hDX1hGRVJfUEVSSU9ESUNfSU5DT01QTEVURToKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsCisJCQkiICBDb21wbGV0ZSBVUkIgd2l0aCBJL08gZXJyb3JcbiIpOworCQlmcmVlX3F0ZCA9IDE7CisJCXF0ZC0+dXJiLT5zdGF0dXMgPSAtRFdDX0VfSU87CisJCWhjZC0+Zm9wcy0+Y29tcGxldGUoaGNkLCBxdGQtPnVyYi0+cHJpdiwKKwkJCXF0ZC0+dXJiLCAtRFdDX0VfSU8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcmVlX3F0ZCA9IDA7CisJCWJyZWFrOworCX0KKworCWRlYWN0aXZhdGVfcWgoaGNkLCBoYy0+cWgsIGZyZWVfcXRkKTsKKworY2xlYW51cDoKKwkvKgorCSAqIFJlbGVhc2UgdGhlIGhvc3QgY2hhbm5lbCBmb3IgdXNlIGJ5IG90aGVyIHRyYW5zZmVycy4gVGhlIGNsZWFudXAKKwkgKiBmdW5jdGlvbiBjbGVhcnMgdGhlIGNoYW5uZWwgaW50ZXJydXB0IGVuYWJsZXMgYW5kIGNvbmRpdGlvbnMsIHNvCisJICogdGhlcmUncyBubyBuZWVkIHRvIGNsZWFyIHRoZSBDaGFubmVsIEhhbHRlZCBpbnRlcnJ1cHQgc2VwYXJhdGVseS4KKwkgKi8KKwlkd2Nfb3RnX2hjX2NsZWFudXAoaGNkLT5jb3JlX2lmLCBoYyk7CisJRFdDX0NJUkNMRVFfSU5TRVJUX1RBSUwoJmhjZC0+ZnJlZV9oY19saXN0LCBoYywgaGNfbGlzdF9lbnRyeSk7CisKKwlzd2l0Y2ggKGhjLT5lcF90eXBlKSB7CisJY2FzZSBEV0NfT1RHX0VQX1RZUEVfQ09OVFJPTDoKKwljYXNlIERXQ19PVEdfRVBfVFlQRV9CVUxLOgorCQloY2QtPm5vbl9wZXJpb2RpY19jaGFubmVscy0tOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qCisJCSAqIERvbid0IHJlbGVhc2UgcmVzZXJ2YXRpb25zIGZvciBwZXJpb2RpYyBjaGFubmVscyBoZXJlLgorCQkgKiBUaGF0J3MgZG9uZSB3aGVuIGEgcGVyaW9kaWMgdHJhbnNmZXIgaXMgZGVzY2hlZHVsZWQgKGkuZS4KKwkJICogd2hlbiB0aGUgUUggaXMgcmVtb3ZlZCBmcm9tIHRoZSBwZXJpb2RpYyBzY2hlZHVsZSkuCisJCSAqLworCQlicmVhazsKKwl9CisKKwkvKiBUcnkgdG8gcXVldWUgbW9yZSB0cmFuc2ZlcnMgbm93IHRoYXQgdGhlcmUncyBhIGZyZWUgY2hhbm5lbC4gKi8KKyAgICBpbnRyX21hc2suZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjZC0+Y29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zayk7CisgICAgaWYgKCFpbnRyX21hc2suYi5zb2ZpbnRyKSB7CisgICAgICAgIHRyX3R5cGUgPSBkd2Nfb3RnX2hjZF9zZWxlY3RfdHJhbnNhY3Rpb25zKGhjZCk7CisgICAgICAgIGlmICh0cl90eXBlICE9IERXQ19PVEdfVFJBTlNBQ1RJT05fTk9ORSkgeworICAgICAgICAgICAgZHdjX290Z19oY2RfcXVldWVfdHJhbnNhY3Rpb25zKGhjZCwgdHJfdHlwZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogSGFsdHMgYSBob3N0IGNoYW5uZWwuIElmIHRoZSBjaGFubmVsIGNhbm5vdCBiZSBoYWx0ZWQgaW1tZWRpYXRlbHkgYmVjYXVzZQorICogdGhlIHJlcXVlc3QgcXVldWUgaXMgZnVsbCwgdGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgdGhlIEZJRk8gZW1wdHkKKyAqIGludGVycnVwdCBmb3IgdGhlIGFwcHJvcHJpYXRlIHF1ZXVlIGlzIGVuYWJsZWQgc28gdGhhdCB0aGUgaGFsdCByZXF1ZXN0IGNhbgorICogYmUgcXVldWVkIHdoZW4gdGhlcmUgaXMgc3BhY2UgaW4gdGhlIHJlcXVlc3QgcXVldWUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgYWxzbyBiZSBjYWxsZWQgaW4gRE1BIG1vZGUuIEluIHRoYXQgY2FzZSwgdGhlIGNoYW5uZWwgaXMKKyAqIHNpbXBseSByZWxlYXNlZCBzaW5jZSB0aGUgY29yZSBhbHdheXMgaGFsdHMgdGhlIGNoYW5uZWwgYXV0b21hdGljYWxseSBpbgorICogRE1BIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGhhbHRfY2hhbm5lbChkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkJIGR3Y19oY190ICogaGMsCisJCQkgZHdjX290Z19xdGRfdCAqIHF0ZCwgZHdjX290Z19oYWx0X3N0YXR1c19lIGhhbHRfc3RhdHVzKQoreworCWlmIChoY2QtPmNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJcmVsZWFzZV9jaGFubmVsKGhjZCwgaGMsIHF0ZCwgaGFsdF9zdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJLyogU2xhdmUgbW9kZSBwcm9jZXNzaW5nLi4uICovCisJZHdjX290Z19oY19oYWx0KGhjZC0+Y29yZV9pZiwgaGMsIGhhbHRfc3RhdHVzKTsKKworCWlmIChoYy0+aGFsdF9vbl9xdWV1ZSkgeworCQlnaW50bXNrX2RhdGFfdCBnaW50bXNrID0gey5kMzIgPSAwIH07CisJCWR3Y19vdGdfY29yZV9nbG9iYWxfcmVnc190ICpnbG9iYWxfcmVnczsKKwkJZ2xvYmFsX3JlZ3MgPSBoY2QtPmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3M7CisKKwkJaWYgKGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9DT05UUk9MIHx8CisJCSAgICBoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfQlVMSykgeworCQkJLyoKKwkJCSAqIE1ha2Ugc3VyZSB0aGUgTm9uLXBlcmlvZGljIFR4IEZJRk8gZW1wdHkgaW50ZXJydXB0CisJCQkgKiBpcyBlbmFibGVkIHNvIHRoYXQgdGhlIG5vbi1wZXJpb2RpYyBzY2hlZHVsZSB3aWxsCisJCQkgKiBiZSBwcm9jZXNzZWQuCisJCQkgKi8KKwkJCWdpbnRtc2suYi5ucHR4ZmVtcHR5ID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCAwLCBnaW50bXNrLmQzMik7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTW92ZSB0aGUgUUggZnJvbSB0aGUgcGVyaW9kaWMgcXVldWVkIHNjaGVkdWxlIHRvCisJCQkgKiB0aGUgcGVyaW9kaWMgYXNzaWduZWQgc2NoZWR1bGUuIFRoaXMgYWxsb3dzIHRoZQorCQkJICogaGFsdCB0byBiZSBxdWV1ZWQgd2hlbiB0aGUgcGVyaW9kaWMgc2NoZWR1bGUgaXMKKwkJCSAqIHByb2Nlc3NlZC4KKwkJCSAqLworCQkJRFdDX0xJU1RfTU9WRV9IRUFEKCZoY2QtPnBlcmlvZGljX3NjaGVkX2Fzc2lnbmVkLAorCQkJCQkgICAmaGMtPnFoLT5xaF9saXN0X2VudHJ5KTsKKworCQkJLyoKKwkJCSAqIE1ha2Ugc3VyZSB0aGUgUGVyaW9kaWMgVHggRklGTyBFbXB0eSBpbnRlcnJ1cHQgaXMKKwkJCSAqIGVuYWJsZWQgc28gdGhhdCB0aGUgcGVyaW9kaWMgc2NoZWR1bGUgd2lsbCBiZQorCQkJICogcHJvY2Vzc2VkLgorCQkJICovCisJCQlnaW50bXNrLmIucHR4ZmVtcHR5ID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCAwLCBnaW50bXNrLmQzMik7CisJCX0KKwl9Cit9CisKKy8qKgorICogUGVyZm9ybXMgY29tbW9uIGNsZWFudXAgZm9yIG5vbi1wZXJpb2RpYyB0cmFuc2ZlcnMgYWZ0ZXIgYSBUcmFuc2ZlcgorICogQ29tcGxldGUgaW50ZXJydXB0LiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYW55IGVuZHBvaW50IHR5cGUKKyAqIHNwZWNpZmljIGhhbmRsaW5nIGlzIGZpbmlzaGVkIHRvIHJlbGVhc2UgdGhlIGhvc3QgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgY29tcGxldGVfbm9uX3BlcmlvZGljX3hmZXIoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkgICAgICAgZHdjX2hjX3QgKiBoYywKKwkJCQkgICAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCSAgICAgICBkd2Nfb3RnX3F0ZF90ICogcXRkLAorCQkJCSAgICAgICBkd2Nfb3RnX2hhbHRfc3RhdHVzX2UgaGFsdF9zdGF0dXMpCit7CisJaGNpbnRfZGF0YV90IGhjaW50OworCisJcXRkLT5lcnJvcl9jb3VudCA9IDA7CisKKwloY2ludC5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNpbnQpOworCWlmIChoY2ludC5iLm55ZXQpIHsKKwkJLyoKKwkJICogR290IGEgTllFVCBvbiB0aGUgbGFzdCB0cmFuc2FjdGlvbiBvZiB0aGUgdHJhbnNmZXIuIFRoaXMKKwkJICogbWVhbnMgdGhhdCB0aGUgZW5kcG9pbnQgc2hvdWxkIGJlIGluIHRoZSBQSU5HIHN0YXRlIGF0IHRoZQorCQkgKiBiZWdpbm5pbmcgb2YgdGhlIG5leHQgdHJhbnNmZXIuCisJCSAqLworCQloYy0+cWgtPnBpbmdfc3RhdGUgPSAxOworCQljbGVhcl9oY19pbnQoaGNfcmVncywgbnlldCk7CisJfQorCisJLyoKKwkgKiBBbHdheXMgaGFsdCBhbmQgcmVsZWFzZSB0aGUgaG9zdCBjaGFubmVsIHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvcgorCSAqIG1vcmUgdHJhbnNmZXJzLiBUaGVyZSBtYXkgc3RpbGwgYmUgbW9yZSBwaGFzZXMgZm9yIGEgY29udHJvbAorCSAqIHRyYW5zZmVyIG9yIG1vcmUgZGF0YSBwYWNrZXRzIGZvciBhIGJ1bGsgdHJhbnNmZXIgYXQgdGhpcyBwb2ludCwKKwkgKiBidXQgdGhlIGhvc3QgY2hhbm5lbCBpcyBzdGlsbCBoYWx0ZWQuIEEgY2hhbm5lbCB3aWxsIGJlIHJlYXNzaWduZWQKKwkgKiB0byB0aGUgdHJhbnNmZXIgd2hlbiB0aGUgbm9uLXBlcmlvZGljIHNjaGVkdWxlIGlzIHByb2Nlc3NlZCBhZnRlcgorCSAqIHRoZSBjaGFubmVsIGlzIHJlbGVhc2VkLiBUaGlzIGFsbG93cyB0cmFuc2FjdGlvbnMgdG8gYmUgcXVldWVkCisJICogcHJvcGVybHkgdmlhIGR3Y19vdGdfaGNkX3F1ZXVlX3RyYW5zYWN0aW9ucywgd2hpY2ggYWxzbyBlbmFibGVzIHRoZQorCSAqIFR4IEZJRk8gRW1wdHkgaW50ZXJydXB0IGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAoaGMtPmVwX2lzX2luKSB7CisJCS8qCisJCSAqIElOIHRyYW5zZmVycyBpbiBTbGF2ZSBtb2RlIHJlcXVpcmUgYW4gZXhwbGljaXQgZGlzYWJsZSB0bworCQkgKiBoYWx0IHRoZSBjaGFubmVsLiAoSW4gRE1BIG1vZGUsIHRoaXMgY2FsbCBzaW1wbHkgcmVsZWFzZXMKKwkJICogdGhlIGNoYW5uZWwuKQorCQkgKi8KKwkJaGFsdF9jaGFubmVsKGhjZCwgaGMsIHF0ZCwgaGFsdF9zdGF0dXMpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBjaGFubmVsIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgYnkgdGhlIGNvcmUgZm9yIE9VVAorCQkgKiB0cmFuc2ZlcnMgaW4gU2xhdmUgbW9kZS4KKwkJICovCisJCXJlbGVhc2VfY2hhbm5lbChoY2QsIGhjLCBxdGQsIGhhbHRfc3RhdHVzKTsKKwl9Cit9CisKKy8qKgorICogUGVyZm9ybXMgY29tbW9uIGNsZWFudXAgZm9yIHBlcmlvZGljIHRyYW5zZmVycyBhZnRlciBhIFRyYW5zZmVyIENvbXBsZXRlCisgKiBpbnRlcnJ1cHQuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhbnkgZW5kcG9pbnQgdHlwZSBzcGVjaWZpYworICogaGFuZGxpbmcgaXMgZmluaXNoZWQgdG8gcmVsZWFzZSB0aGUgaG9zdCBjaGFubmVsLgorICovCitzdGF0aWMgdm9pZCBjb21wbGV0ZV9wZXJpb2RpY194ZmVyKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJICAgZHdjX2hjX3QgKiBoYywKKwkJCQkgICBkd2Nfb3RnX2hjX3JlZ3NfdCAqIGhjX3JlZ3MsCisJCQkJICAgZHdjX290Z19xdGRfdCAqIHF0ZCwKKwkJCQkgICBkd2Nfb3RnX2hhbHRfc3RhdHVzX2UgaGFsdF9zdGF0dXMpCit7CisJaGN0c2l6X2RhdGFfdCBoY3RzaXo7CisJcXRkLT5lcnJvcl9jb3VudCA9IDA7CisKKwloY3RzaXouZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjdHNpeik7CisJaWYgKCFoYy0+ZXBfaXNfaW4gfHwgaGN0c2l6LmIucGt0Y250ID09IDApIHsKKwkJLyogQ29yZSBoYWx0cyBjaGFubmVsIGluIHRoZXNlIGNhc2VzLiAqLworCQlyZWxlYXNlX2NoYW5uZWwoaGNkLCBoYywgcXRkLCBoYWx0X3N0YXR1cyk7CisJfSBlbHNlIHsKKwkJLyogRmx1c2ggYW55IG91dHN0YW5kaW5nIHJlcXVlc3RzIGZyb20gdGhlIFR4IHF1ZXVlLiAqLworCQloYWx0X2NoYW5uZWwoaGNkLCBoYywgcXRkLCBoYWx0X3N0YXR1cyk7CisJfQorfQorCitzdGF0aWMgaW50MzJfdCBoYW5kbGVfeGZlcmNvbXBfaXNvY19zcGxpdF9pbihkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkJCQkgICAgIGR3Y19oY190ICogaGMsCisJCQkJCSAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCQkgICAgIGR3Y19vdGdfcXRkX3QgKiBxdGQpCit7CisJdWludDMyX3QgbGVuOworCXN0cnVjdCBkd2Nfb3RnX2hjZF9pc29fcGFja2V0X2Rlc2MgKmZyYW1lX2Rlc2M7CisJZnJhbWVfZGVzYyA9ICZxdGQtPnVyYi0+aXNvX2Rlc2NzW3F0ZC0+aXNvY19mcmFtZV9pbmRleF07CisKKwlsZW4gPSBnZXRfYWN0dWFsX3hmZXJfbGVuZ3RoKGhjLCBoY19yZWdzLCBxdGQsCisJCQkJICAgICBEV0NfT1RHX0hDX1hGRVJfQ09NUExFVEUsIE5VTEwpOworCisJaWYgKCFsZW4pIHsKKwkJcXRkLT5jb21wbGV0ZV9zcGxpdCA9IDA7CisJCXF0ZC0+aXNvY19zcGxpdF9vZmZzZXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJZnJhbWVfZGVzYy0+YWN0dWFsX2xlbmd0aCArPSBsZW47CisKKwlpZiAoaGMtPmFsaWduX2J1ZmYgJiYgbGVuKQorCQlkd2NfbWVtY3B5KHF0ZC0+dXJiLT5idWYgKyBmcmFtZV9kZXNjLT5vZmZzZXQgKworCQkJICAgcXRkLT5pc29jX3NwbGl0X29mZnNldCwgaGMtPnFoLT5kd19hbGlnbl9idWYsIGxlbik7CisJcXRkLT5pc29jX3NwbGl0X29mZnNldCArPSBsZW47CisKKwlpZiAoZnJhbWVfZGVzYy0+bGVuZ3RoID09IGZyYW1lX2Rlc2MtPmFjdHVhbF9sZW5ndGgpIHsKKwkJZnJhbWVfZGVzYy0+c3RhdHVzID0gMDsKKwkJcXRkLT5pc29jX2ZyYW1lX2luZGV4Kys7CisJCXF0ZC0+Y29tcGxldGVfc3BsaXQgPSAwOworCQlxdGQtPmlzb2Nfc3BsaXRfb2Zmc2V0ID0gMDsKKwl9CisKKwlpZiAocXRkLT5pc29jX2ZyYW1lX2luZGV4ID09IHF0ZC0+dXJiLT5wYWNrZXRfY291bnQpIHsKKwkJaGNkLT5mb3BzLT5jb21wbGV0ZShoY2QsIHF0ZC0+dXJiLT5wcml2LCBxdGQtPnVyYiwgMCk7CisJCXJlbGVhc2VfY2hhbm5lbChoY2QsIGhjLCBxdGQsIERXQ19PVEdfSENfWEZFUl9VUkJfQ09NUExFVEUpOworCX0gZWxzZSB7CisJCXJlbGVhc2VfY2hhbm5lbChoY2QsIGhjLCBxdGQsIERXQ19PVEdfSENfWEZFUl9OT19IQUxUX1NUQVRVUyk7CisJfQorCisJcmV0dXJuIDE7CQkvKiBJbmRpY2F0ZXMgdGhhdCBjaGFubmVsIHJlbGVhc2VkICovCit9CisKKy8qKgorICogSGFuZGxlcyBhIGhvc3QgY2hhbm5lbCBUcmFuc2ZlciBDb21wbGV0ZSBpbnRlcnJ1cHQuIFRoaXMgaGFuZGxlciBtYXkgYmUKKyAqIGNhbGxlZCBpbiBlaXRoZXIgRE1BIG1vZGUgb3IgU2xhdmUgbW9kZS4KKyAqLworc3RhdGljIGludDMyX3QgaGFuZGxlX2hjX3hmZXJjb21wX2ludHIoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkgICAgICAgZHdjX2hjX3QgKiBoYywKKwkJCQkgICAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCSAgICAgICBkd2Nfb3RnX3F0ZF90ICogcXRkKQoreworCWludCB1cmJfeGZlcl9kb25lOworCWR3Y19vdGdfaGFsdF9zdGF0dXNfZSBoYWx0X3N0YXR1cyA9IERXQ19PVEdfSENfWEZFUl9DT01QTEVURTsKKwlkd2Nfb3RnX2hjZF91cmJfdCAqdXJiID0gcXRkLT51cmI7CisJaW50IHBpcGVfdHlwZSA9IGR3Y19vdGdfaGNkX2dldF9waXBlX3R5cGUoJnVyYi0+cGlwZV9pbmZvKTsKKworCURXQ19ERUJVR1BMKERCR19IQ0QsICItLUhvc3QgQ2hhbm5lbCAlZCBJbnRlcnJ1cHQ6ICIKKwkJICAgICJUcmFuc2ZlciBDb21wbGV0ZS0tXG4iLCBoYy0+aGNfbnVtKTsKKworCWlmIChoY2QtPmNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQlkd2Nfb3RnX2hjZF9jb21wbGV0ZV94ZmVyX2RkbWEoaGNkLCBoYywgaGNfcmVncywgaGFsdF9zdGF0dXMpOworCQlpZiAocGlwZV90eXBlID09IFVFX0lTT0NIUk9OT1VTKSB7CisJCQkvKiBEbyBub3QgZGlzYWJsZSB0aGUgaW50ZXJydXB0LCBqdXN0IGNsZWFyIGl0ICovCisJCQljbGVhcl9oY19pbnQoaGNfcmVncywgeGZlcmNvbXApOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZ290byBoYW5kbGVfeGZlcmNvbXBfZG9uZTsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSB4ZmVyIGNvbXBsZXRlIG9uIENTUExJVC4KKwkgKi8KKworCWlmIChoYy0+cWgtPmRvX3NwbGl0KSB7CisJCWlmICgoaGMtPmVwX3R5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpICYmIGhjLT5lcF9pc19pbgorCQkgICAgJiYgaGNkLT5jb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQlpZiAocXRkLT5jb21wbGV0ZV9zcGxpdAorCQkJICAgICYmIGhhbmRsZV94ZmVyY29tcF9pc29jX3NwbGl0X2luKGhjZCwgaGMsIGhjX3JlZ3MsCisJCQkJCQkJICAgICBxdGQpKQorCQkJCWdvdG8gaGFuZGxlX3hmZXJjb21wX2RvbmU7CisJCX0gZWxzZSB7CisJCQlxdGQtPmNvbXBsZXRlX3NwbGl0ID0gMDsKKwkJfQorCX0KKworCS8qIFVwZGF0ZSB0aGUgUVREIGFuZCBVUkIgc3RhdGVzLiAqLworCXN3aXRjaCAocGlwZV90eXBlKSB7CisJY2FzZSBVRV9DT05UUk9MOgorCQlzd2l0Y2ggKHF0ZC0+Y29udHJvbF9waGFzZSkgeworCQljYXNlIERXQ19PVEdfQ09OVFJPTF9TRVRVUDoKKwkJCWlmICh1cmItPmxlbmd0aCA+IDApIHsKKwkJCQlxdGQtPmNvbnRyb2xfcGhhc2UgPSBEV0NfT1RHX0NPTlRST0xfREFUQTsKKwkJCX0gZWxzZSB7CisJCQkJcXRkLT5jb250cm9sX3BoYXNlID0gRFdDX09UR19DT05UUk9MX1NUQVRVUzsKKwkJCX0KKwkJCURXQ19ERUJVR1BMKERCR19IQ0RWLAorCQkJCSAgICAiICBDb250cm9sIHNldHVwIHRyYW5zYWN0aW9uIGRvbmVcbiIpOworCQkJaGFsdF9zdGF0dXMgPSBEV0NfT1RHX0hDX1hGRVJfQ09NUExFVEU7CisJCQlicmVhazsKKwkJY2FzZSBEV0NfT1RHX0NPTlRST0xfREFUQTp7CisJCQkJdXJiX3hmZXJfZG9uZSA9CisJCQkJICAgIHVwZGF0ZV91cmJfc3RhdGVfeGZlcl9jb21wKGhjLCBoY19yZWdzLCB1cmIsCisJCQkJCQkJICAgICAgIHF0ZCk7CisJCQkJaWYgKHVyYl94ZmVyX2RvbmUpIHsKKwkJCQkJcXRkLT5jb250cm9sX3BoYXNlID0KKwkJCQkJICAgIERXQ19PVEdfQ09OVFJPTF9TVEFUVVM7CisJCQkJCURXQ19ERUJVR1BMKERCR19IQ0RWLAorCQkJCQkJICAgICIgIENvbnRyb2wgZGF0YSB0cmFuc2ZlciBkb25lXG4iKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkd2Nfb3RnX2hjZF9zYXZlX2RhdGFfdG9nZ2xlKGhjLCBoY19yZWdzLCBxdGQpOworCQkJCX0KKwkJCQloYWx0X3N0YXR1cyA9IERXQ19PVEdfSENfWEZFUl9DT01QTEVURTsKKwkJCQlicmVhazsKKwkJCX0KKwkJY2FzZSBEV0NfT1RHX0NPTlRST0xfU1RBVFVTOgorCQkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIgIENvbnRyb2wgdHJhbnNmZXIgY29tcGxldGVcbiIpOworCQkJaWYgKHVyYi0+c3RhdHVzID09IC1EV0NfRV9JTl9QUk9HUkVTUykgeworCQkJCXVyYi0+c3RhdHVzID0gMDsKKwkJCX0KKwkJCWhjZC0+Zm9wcy0+Y29tcGxldGUoaGNkLCB1cmItPnByaXYsIHVyYiwgdXJiLT5zdGF0dXMpOworCQkJaGFsdF9zdGF0dXMgPSBEV0NfT1RHX0hDX1hGRVJfVVJCX0NPTVBMRVRFOworCQkJYnJlYWs7CisJCX0KKworCQljb21wbGV0ZV9ub25fcGVyaW9kaWNfeGZlcihoY2QsIGhjLCBoY19yZWdzLCBxdGQsIGhhbHRfc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBVRV9CVUxLOgorCQlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgQnVsayB0cmFuc2ZlciBjb21wbGV0ZVxuIik7CisJCXVyYl94ZmVyX2RvbmUgPQorCQkgICAgdXBkYXRlX3VyYl9zdGF0ZV94ZmVyX2NvbXAoaGMsIGhjX3JlZ3MsIHVyYiwgcXRkKTsKKwkJaWYgKHVyYl94ZmVyX2RvbmUpIHsKKwkJCWhjZC0+Zm9wcy0+Y29tcGxldGUoaGNkLCB1cmItPnByaXYsIHVyYiwgdXJiLT5zdGF0dXMpOworCQkJaGFsdF9zdGF0dXMgPSBEV0NfT1RHX0hDX1hGRVJfVVJCX0NPTVBMRVRFOworCQl9IGVsc2UgeworCQkJaGFsdF9zdGF0dXMgPSBEV0NfT1RHX0hDX1hGRVJfQ09NUExFVEU7CisJCX0KKworCQlkd2Nfb3RnX2hjZF9zYXZlX2RhdGFfdG9nZ2xlKGhjLCBoY19yZWdzLCBxdGQpOworCQljb21wbGV0ZV9ub25fcGVyaW9kaWNfeGZlcihoY2QsIGhjLCBoY19yZWdzLCBxdGQsIGhhbHRfc3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBVRV9JTlRFUlJVUFQ6CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBJbnRlcnJ1cHQgdHJhbnNmZXIgY29tcGxldGVcbiIpOworCQl1cmJfeGZlcl9kb25lID0KKwkJCXVwZGF0ZV91cmJfc3RhdGVfeGZlcl9jb21wKGhjLCBoY19yZWdzLCB1cmIsIHF0ZCk7CisKKwkJLyoKKwkJICogSW50ZXJydXB0IFVSQiBpcyBkb25lIG9uIHRoZSBmaXJzdCB0cmFuc2ZlciBjb21wbGV0ZQorCQkgKiBpbnRlcnJ1cHQuCisJCSAqLworCQlpZiAodXJiX3hmZXJfZG9uZSkgeworCQkJCWhjZC0+Zm9wcy0+Y29tcGxldGUoaGNkLCB1cmItPnByaXYsIHVyYiwgdXJiLT5zdGF0dXMpOworCQkJCWhhbHRfc3RhdHVzID0gRFdDX09UR19IQ19YRkVSX1VSQl9DT01QTEVURTsKKwkJfSBlbHNlIHsKKwkJCQloYWx0X3N0YXR1cyA9IERXQ19PVEdfSENfWEZFUl9DT01QTEVURTsKKwkJfQorCisJCWR3Y19vdGdfaGNkX3NhdmVfZGF0YV90b2dnbGUoaGMsIGhjX3JlZ3MsIHF0ZCk7CisJCWNvbXBsZXRlX3BlcmlvZGljX3hmZXIoaGNkLCBoYywgaGNfcmVncywgcXRkLCBoYWx0X3N0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgVUVfSVNPQ0hST05PVVM6CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBJc29jaHJvbm91cyB0cmFuc2ZlciBjb21wbGV0ZVxuIik7CisJCWlmIChxdGQtPmlzb2Nfc3BsaXRfcG9zID09IERXQ19IQ1NQTElUX1hBQ1RQT1NfQUxMKSB7CisJCQloYWx0X3N0YXR1cyA9CisJCQkgICAgdXBkYXRlX2lzb2NfdXJiX3N0YXRlKGhjZCwgaGMsIGhjX3JlZ3MsIHF0ZCwKKwkJCQkJCSAgRFdDX09UR19IQ19YRkVSX0NPTVBMRVRFKTsKKwkJfQorCQljb21wbGV0ZV9wZXJpb2RpY194ZmVyKGhjZCwgaGMsIGhjX3JlZ3MsIHF0ZCwgaGFsdF9zdGF0dXMpOworCQlicmVhazsKKwl9CisKK2hhbmRsZV94ZmVyY29tcF9kb25lOgorCWRpc2FibGVfaGNfaW50KGhjX3JlZ3MsIHhmZXJjb21wbCk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBIYW5kbGVzIGEgaG9zdCBjaGFubmVsIFNUQUxMIGludGVycnVwdC4gVGhpcyBoYW5kbGVyIG1heSBiZSBjYWxsZWQgaW4KKyAqIGVpdGhlciBETUEgbW9kZSBvciBTbGF2ZSBtb2RlLgorICovCitzdGF0aWMgaW50MzJfdCBoYW5kbGVfaGNfc3RhbGxfaW50cihkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkJCSAgICBkd2NfaGNfdCAqIGhjLAorCQkJCSAgICBkd2Nfb3RnX2hjX3JlZ3NfdCAqIGhjX3JlZ3MsCisJCQkJICAgIGR3Y19vdGdfcXRkX3QgKiBxdGQpCit7CisJZHdjX290Z19oY2RfdXJiX3QgKnVyYiA9IHF0ZC0+dXJiOworCWludCBwaXBlX3R5cGUgPSBkd2Nfb3RnX2hjZF9nZXRfcGlwZV90eXBlKCZ1cmItPnBpcGVfaW5mbyk7CisKKwlEV0NfREVCVUdQTChEQkdfSENELCAiLS1Ib3N0IENoYW5uZWwgJWQgSW50ZXJydXB0OiAiCisJCSAgICAiU1RBTEwgUmVjZWl2ZWQtLVxuIiwgaGMtPmhjX251bSk7CisKKwlpZiAoaGNkLT5jb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJZHdjX290Z19oY2RfY29tcGxldGVfeGZlcl9kZG1hKGhjZCwgaGMsIGhjX3JlZ3MsIERXQ19PVEdfSENfWEZFUl9TVEFMTCk7CisJCWdvdG8gaGFuZGxlX3N0YWxsX2RvbmU7CisJfQorCisJaWYgKHBpcGVfdHlwZSA9PSBVRV9DT05UUk9MKSB7CisJCWhjZC0+Zm9wcy0+Y29tcGxldGUoaGNkLCB1cmItPnByaXYsIHVyYiwgLURXQ19FX1BJUEUpOworCX0KKworCWlmIChwaXBlX3R5cGUgPT0gVUVfQlVMSyB8fCBwaXBlX3R5cGUgPT0gVUVfSU5URVJSVVBUKSB7CisJCWhjZC0+Zm9wcy0+Y29tcGxldGUoaGNkLCB1cmItPnByaXYsIHVyYiwgLURXQ19FX1BJUEUpOworCQkvKgorCQkgKiBVU0IgcHJvdG9jb2wgcmVxdWlyZXMgcmVzZXR0aW5nIHRoZSBkYXRhIHRvZ2dsZSBmb3IgYnVsaworCQkgKiBhbmQgaW50ZXJydXB0IGVuZHBvaW50cyB3aGVuIGEgQ0xFQVJfRkVBVFVSRShFTkRQT0lOVF9IQUxUKQorCQkgKiBzZXR1cCBjb21tYW5kIGlzIGlzc3VlZCB0byB0aGUgZW5kcG9pbnQuIEFudGljaXBhdGUgdGhlCisJCSAqIENMRUFSX0ZFQVRVUkUgY29tbWFuZCBzaW5jZSBhIFNUQUxMIGhhcyBvY2N1cnJlZCBhbmQgcmVzZXQKKwkJICogdGhlIGRhdGEgdG9nZ2xlIG5vdy4KKwkJICovCisJCWhjLT5xaC0+ZGF0YV90b2dnbGUgPSAwOworCX0KKworCWhhbHRfY2hhbm5lbChoY2QsIGhjLCBxdGQsIERXQ19PVEdfSENfWEZFUl9TVEFMTCk7CisKK2hhbmRsZV9zdGFsbF9kb25lOgorCWRpc2FibGVfaGNfaW50KGhjX3JlZ3MsIHN0YWxsKTsKKworCXJldHVybiAxOworfQorCisvKgorICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIFVSQiB3aGVuIGEgdHJhbnNmZXIgaGFzIGJlZW4gc3RvcHBlZCBkdWUgdG8gYW4KKyAqIGFibm9ybWFsIGNvbmRpdGlvbiBiZWZvcmUgdGhlIHRyYW5zZmVyIGNvbXBsZXRlcy4gTW9kaWZpZXMgdGhlCisgKiBhY3R1YWxfbGVuZ3RoIGZpZWxkIG9mIHRoZSBVUkIgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZQorICogYWN0dWFsbHkgYmVlbiB0cmFuc2ZlcnJlZCB2aWEgdGhlIGhvc3QgY2hhbm5lbC4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3VyYl9zdGF0ZV94ZmVyX2ludHIoZHdjX2hjX3QgKiBoYywKKwkJCQkgICAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCSAgICAgICBkd2Nfb3RnX2hjZF91cmJfdCAqIHVyYiwKKwkJCQkgICAgICAgZHdjX290Z19xdGRfdCAqIHF0ZCwKKwkJCQkgICAgICAgZHdjX290Z19oYWx0X3N0YXR1c19lIGhhbHRfc3RhdHVzKQoreworCXVpbnQzMl90IGJ5dGVzX3RyYW5zZmVycmVkID0gZ2V0X2FjdHVhbF94ZmVyX2xlbmd0aChoYywgaGNfcmVncywgcXRkLAorCQkJCQkJCSAgICBoYWx0X3N0YXR1cywgTlVMTCk7CisJLyogbm9uIERXT1JELWFsaWduZWQgYnVmZmVyIGNhc2UgaGFuZGxpbmcuICovCisJaWYgKGhjLT5hbGlnbl9idWZmICYmIGJ5dGVzX3RyYW5zZmVycmVkICYmIGhjLT5lcF9pc19pbikgeworCQlkd2NfbWVtY3B5KHVyYi0+YnVmICsgdXJiLT5hY3R1YWxfbGVuZ3RoLCBoYy0+cWgtPmR3X2FsaWduX2J1ZiwKKwkJCSAgIGJ5dGVzX3RyYW5zZmVycmVkKTsKKwl9CisKKwl1cmItPmFjdHVhbF9sZW5ndGggKz0gYnl0ZXNfdHJhbnNmZXJyZWQ7CisKKyNpZmRlZiBERUJVRworCXsKKwkJaGN0c2l6X2RhdGFfdCBoY3RzaXo7CisJCWhjdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGN0c2l6KTsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICJEV0Nfb3RnOiAlczogJXMsIGNoYW5uZWwgJWRcbiIsCisJCQkgICAgX19mdW5jX18sIChoYy0+ZXBfaXNfaW4gPyAiSU4iIDogIk9VVCIpLAorCQkJICAgIGhjLT5oY19udW0pOworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgaGMtPnN0YXJ0X3BrdF9jb3VudCAlZFxuIiwKKwkJCSAgICBoYy0+c3RhcnRfcGt0X2NvdW50KTsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRFYsICIgIGhjdHNpei5wa3RjbnQgJWRcbiIsIGhjdHNpei5iLnBrdGNudCk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICBoYy0+bWF4X3BhY2tldCAlZFxuIiwgaGMtPm1heF9wYWNrZXQpOworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgYnl0ZXNfdHJhbnNmZXJyZWQgJWRcbiIsCisJCQkgICAgYnl0ZXNfdHJhbnNmZXJyZWQpOworCQlEV0NfREVCVUdQTChEQkdfSENEViwgIiAgdXJiLT5hY3R1YWxfbGVuZ3RoICVkXG4iLAorCQkJICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggJWRcbiIsCisJCQkgICAgdXJiLT5sZW5ndGgpOworCX0KKyNlbmRpZgorfQorCisvKioKKyAqIEhhbmRsZXMgYSBob3N0IGNoYW5uZWwgTkFLIGludGVycnVwdC4gVGhpcyBoYW5kbGVyIG1heSBiZSBjYWxsZWQgaW4gZWl0aGVyCisgKiBETUEgbW9kZSBvciBTbGF2ZSBtb2RlLgorICovCitzdGF0aWMgaW50MzJfdCBoYW5kbGVfaGNfbmFrX2ludHIoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkgIGR3Y19oY190ICogaGMsCisJCQkJICBkd2Nfb3RnX2hjX3JlZ3NfdCAqIGhjX3JlZ3MsCisJCQkJICBkd2Nfb3RnX3F0ZF90ICogcXRkKQoreworCURXQ19ERUJVR1BMKERCR19IQ0QsICItLUhvc3QgQ2hhbm5lbCAlZCBJbnRlcnJ1cHQ6ICIKKwkJICAgICJOQUsgUmVjZWl2ZWQtLVxuIiwgaGMtPmhjX251bSk7CisKKwkvKgorCSAqIEhhbmRsZSBOQUsgZm9yIElOL09VVCBTU1BMSVQvQ1NQTElUIHRyYW5zZmVycywgYnVsaywgY29udHJvbCwgYW5kCisJICogaW50ZXJydXB0LiAgUmUtc3RhcnQgdGhlIFNTUExJVCB0cmFuc2Zlci4KKwkgKi8KKwlpZiAoaGMtPmRvX3NwbGl0KSB7CisJCWlmIChoYy0+Y29tcGxldGVfc3BsaXQpIHsKKwkJCXF0ZC0+ZXJyb3JfY291bnQgPSAwOworCQl9CisJCXF0ZC0+Y29tcGxldGVfc3BsaXQgPSAwOworCQloYWx0X2NoYW5uZWwoaGNkLCBoYywgcXRkLCBEV0NfT1RHX0hDX1hGRVJfTkFLKTsKKwkJZ290byBoYW5kbGVfbmFrX2RvbmU7CisJfQorCisJc3dpdGNoIChkd2Nfb3RnX2hjZF9nZXRfcGlwZV90eXBlKCZxdGQtPnVyYi0+cGlwZV9pbmZvKSkgeworCWNhc2UgVUVfQ09OVFJPTDoKKwljYXNlIFVFX0JVTEs6CisJCWlmIChoY2QtPmNvcmVfaWYtPmRtYV9lbmFibGUgJiYgaGMtPmVwX2lzX2luKSB7CisJCQkvKgorCQkJICogTkFLIGludGVycnVwdHMgYXJlIGVuYWJsZWQgb24gYnVsay9jb250cm9sIElOCisJCQkgKiB0cmFuc2ZlcnMgaW4gRE1BIG1vZGUgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YKKwkJCSAqIHJlc2V0dGluZyB0aGUgZXJyb3IgY291bnQgYWZ0ZXIgYSB0cmFuc2FjdGlvbiBlcnJvcgorCQkJICogb2NjdXJzLiBUaGUgY29yZSB3aWxsIGNvbnRpbnVlIHRyYW5zZmVycmluZyBkYXRhLgorCQkJICovCisJCQlxdGQtPmVycm9yX2NvdW50ID0gMDsKKwkJCWdvdG8gaGFuZGxlX25ha19kb25lOworCQl9CisKKwkJLyoKKwkJICogTkFLIGludGVycnVwdHMgbm9ybWFsbHkgb2NjdXIgZHVyaW5nIE9VVCB0cmFuc2ZlcnMgaW4gRE1BCisJCSAqIG9yIFNsYXZlIG1vZGUuIEZvciBJTiB0cmFuc2ZlcnMsIG1vcmUgcmVxdWVzdHMgd2lsbCBiZQorCQkgKiBxdWV1ZWQgYXMgcmVxdWVzdCBxdWV1ZSBzcGFjZSBpcyBhdmFpbGFibGUuCisJCSAqLworCQlxdGQtPmVycm9yX2NvdW50ID0gMDsKKworCQlpZiAoIWhjLT5xaC0+cGluZ19zdGF0ZSkgeworCQkJdXBkYXRlX3VyYl9zdGF0ZV94ZmVyX2ludHIoaGMsIGhjX3JlZ3MsCisJCQkJCQkgICBxdGQtPnVyYiwgcXRkLAorCQkJCQkJICAgRFdDX09UR19IQ19YRkVSX05BSyk7CisJCQlkd2Nfb3RnX2hjZF9zYXZlX2RhdGFfdG9nZ2xlKGhjLCBoY19yZWdzLCBxdGQpOworCisJCQlpZiAoaGMtPnNwZWVkID09IERXQ19PVEdfRVBfU1BFRURfSElHSCkKKwkJCQloYy0+cWgtPnBpbmdfc3RhdGUgPSAxOworCQl9CisKKwkJLyoKKwkJICogSGFsdCB0aGUgY2hhbm5lbCBzbyB0aGUgdHJhbnNmZXIgY2FuIGJlIHJlLXN0YXJ0ZWQgZnJvbQorCQkgKiB0aGUgYXBwcm9wcmlhdGUgcG9pbnQgb3IgdGhlIFBJTkcgcHJvdG9jb2wgd2lsbAorCQkgKiBzdGFydC9jb250aW51ZS4KKwkJICovCisJCWhhbHRfY2hhbm5lbChoY2QsIGhjLCBxdGQsIERXQ19PVEdfSENfWEZFUl9OQUspOworCQlicmVhazsKKwljYXNlIFVFX0lOVEVSUlVQVDoKKwkJcXRkLT5lcnJvcl9jb3VudCA9IDA7CisJCWhhbHRfY2hhbm5lbChoY2QsIGhjLCBxdGQsIERXQ19PVEdfSENfWEZFUl9OQUspOworCQlicmVhazsKKwljYXNlIFVFX0lTT0NIUk9OT1VTOgorCQkvKiBTaG91bGQgbmV2ZXIgZ2V0IGNhbGxlZCBmb3IgaXNvY2hyb25vdXMgdHJhbnNmZXJzLiAqLworCQlEV0NfQVNTRVJUKDEsICJOQUNLIGludGVycnVwdCBmb3IgSVNPQyB0cmFuc2ZlclxuIik7CisJCWJyZWFrOworCX0KKworaGFuZGxlX25ha19kb25lOgorCWRpc2FibGVfaGNfaW50KGhjX3JlZ3MsIG5hayk7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBIYW5kbGVzIGEgaG9zdCBjaGFubmVsIEFDSyBpbnRlcnJ1cHQuIFRoaXMgaW50ZXJydXB0IGlzIGVuYWJsZWQgd2hlbgorICogcGVyZm9ybWluZyB0aGUgUElORyBwcm90b2NvbCBpbiBTbGF2ZSBtb2RlLCB3aGVuIGVycm9ycyBvY2N1ciBkdXJpbmcKKyAqIGVpdGhlciBTbGF2ZSBtb2RlIG9yIERNQSBtb2RlLCBhbmQgZHVyaW5nIFN0YXJ0IFNwbGl0IHRyYW5zYWN0aW9ucy4KKyAqLworc3RhdGljIGludDMyX3QgaGFuZGxlX2hjX2Fja19pbnRyKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJICBkd2NfaGNfdCAqIGhjLAorCQkJCSAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCSAgZHdjX290Z19xdGRfdCAqIHF0ZCkKK3sKKwlEV0NfREVCVUdQTChEQkdfSENELCAiLS1Ib3N0IENoYW5uZWwgJWQgSW50ZXJydXB0OiAiCisJCSAgICAiQUNLIFJlY2VpdmVkLS1cbiIsIGhjLT5oY19udW0pOworCisJaWYgKGhjLT5kb19zcGxpdCkgeworCQkvKgorCQkgKiBIYW5kbGUgQUNLIG9uIFNTUExJVC4KKwkJICogQUNLIHNob3VsZCBub3Qgb2NjdXIgaW4gQ1NQTElULgorCQkgKi8KKwkJaWYgKCFoYy0+ZXBfaXNfaW4gJiYgaGMtPmRhdGFfcGlkX3N0YXJ0ICE9IERXQ19PVEdfSENfUElEX1NFVFVQKSB7CisJCQlxdGQtPnNzcGxpdF9vdXRfeGZlcl9jb3VudCA9IGhjLT54ZmVyX2xlbjsKKwkJfQorCQlpZiAoIShoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQyAmJiAhaGMtPmVwX2lzX2luKSkgeworCQkJLyogRG9uJ3QgbmVlZCBjb21wbGV0ZSBmb3IgaXNvY2hyb25vdXMgb3V0IHRyYW5zZmVycy4gKi8KKwkJCXF0ZC0+Y29tcGxldGVfc3BsaXQgPSAxOworCQl9CisKKwkJLyogSVNPQyBPVVQgKi8KKwkJaWYgKGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DICYmICFoYy0+ZXBfaXNfaW4pIHsKKwkJCXN3aXRjaCAoaGMtPnhhY3RfcG9zKSB7CisJCQljYXNlIERXQ19IQ1NQTElUX1hBQ1RQT1NfQUxMOgorCQkJCWJyZWFrOworCQkJY2FzZSBEV0NfSENTUExJVF9YQUNUUE9TX0VORDoKKwkJCQlxdGQtPmlzb2Nfc3BsaXRfcG9zID0gRFdDX0hDU1BMSVRfWEFDVFBPU19BTEw7CisJCQkJcXRkLT5pc29jX3NwbGl0X29mZnNldCA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIERXQ19IQ1NQTElUX1hBQ1RQT1NfQkVHSU46CisJCQljYXNlIERXQ19IQ1NQTElUX1hBQ1RQT1NfTUlEOgorCQkJCS8qCisJCQkJICogRm9yIEJFR0lOIG9yIE1JRCwgY2FsY3VsYXRlIHRoZSBsZW5ndGggZm9yCisJCQkJICogdGhlIG5leHQgbWljcm9mcmFtZSB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QKKwkJCQkgKiBTU1BMSVQgdG9rZW4sIGVpdGhlciBNSUQgb3IgRU5ELgorCQkJCSAqLworCQkJCXsKKwkJCQkJc3RydWN0IGR3Y19vdGdfaGNkX2lzb19wYWNrZXRfZGVzYworCQkJCQkqZnJhbWVfZGVzYzsKKworCQkJCQlmcmFtZV9kZXNjID0KKwkJCQkJICAgICZxdGQtPnVyYi0+CisJCQkJCSAgICBpc29fZGVzY3NbcXRkLT5pc29jX2ZyYW1lX2luZGV4XTsKKwkJCQkJcXRkLT5pc29jX3NwbGl0X29mZnNldCArPSAxODg7CisKKwkJCQkJaWYgKChmcmFtZV9kZXNjLT5sZW5ndGggLQorCQkJCQkgICAgIHF0ZC0+aXNvY19zcGxpdF9vZmZzZXQpIDw9IDE4OCkgeworCQkJCQkJcXRkLT5pc29jX3NwbGl0X3BvcyA9CisJCQkJCQkgICAgRFdDX0hDU1BMSVRfWEFDVFBPU19FTkQ7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlxdGQtPmlzb2Nfc3BsaXRfcG9zID0KKwkJCQkJCSAgICBEV0NfSENTUExJVF9YQUNUUE9TX01JRDsKKwkJCQkJfQorCisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaGFsdF9jaGFubmVsKGhjZCwgaGMsIHF0ZCwgRFdDX09UR19IQ19YRkVSX0FDSyk7CisJCX0KKwl9IGVsc2UgeworCQlxdGQtPmVycm9yX2NvdW50ID0gMDsKKworCQlpZiAoaGMtPnFoLT5waW5nX3N0YXRlKSB7CisJCQloYy0+cWgtPnBpbmdfc3RhdGUgPSAwOworCQkJLyoKKwkJCSAqIEhhbHQgdGhlIGNoYW5uZWwgc28gdGhlIHRyYW5zZmVyIGNhbiBiZSByZS1zdGFydGVkCisJCQkgKiBmcm9tIHRoZSBhcHByb3ByaWF0ZSBwb2ludC4gVGhpcyBvbmx5IGhhcHBlbnMgaW4KKwkJCSAqIFNsYXZlIG1vZGUuIEluIERNQSBtb2RlLCB0aGUgcGluZ19zdGF0ZSBpcyBjbGVhcmVkCisJCQkgKiB3aGVuIHRoZSB0cmFuc2ZlciBpcyBzdGFydGVkIGJlY2F1c2UgdGhlIGNvcmUKKwkJCSAqIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZXMgdGhlIFBJTkcsIHRoZW4gdGhlIHRyYW5zZmVyLgorCQkJICovCisJCQloYWx0X2NoYW5uZWwoaGNkLCBoYywgcXRkLCBEV0NfT1RHX0hDX1hGRVJfQUNLKTsKKwkJfQorCX0KKworCS8qCisJICogSWYgdGhlIEFDSyBvY2N1cnJlZCB3aGVuIF9ub3RfIGluIHRoZSBQSU5HIHN0YXRlLCBsZXQgdGhlIGNoYW5uZWwKKwkgKiBjb250aW51ZSB0cmFuc2ZlcnJpbmcgZGF0YSBhZnRlciBjbGVhcmluZyB0aGUgZXJyb3IgY291bnQuCisJICovCisKKwlkaXNhYmxlX2hjX2ludChoY19yZWdzLCBhY2spOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogSGFuZGxlcyBhIGhvc3QgY2hhbm5lbCBOWUVUIGludGVycnVwdC4gVGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG9ubHkgb2NjdXIgb24KKyAqIEJ1bGsgYW5kIENvbnRyb2wgT1VUIGVuZHBvaW50cyBhbmQgZm9yIGNvbXBsZXRlIHNwbGl0IHRyYW5zYWN0aW9ucy4gSWYgYQorICogTllFVCBvY2N1cnMgYXQgdGhlIHNhbWUgdGltZSBhcyBhIFRyYW5zZmVyIENvbXBsZXRlIGludGVycnVwdCwgaXQgaXMKKyAqIGhhbmRsZWQgaW4gdGhlIHhmZXJjb21wIGludGVycnVwdCBoYW5kbGVyLCBub3QgaGVyZS4gVGhpcyBoYW5kbGVyIG1heSBiZQorICogY2FsbGVkIGluIGVpdGhlciBETUEgbW9kZSBvciBTbGF2ZSBtb2RlLgorICovCitzdGF0aWMgaW50MzJfdCBoYW5kbGVfaGNfbnlldF9pbnRyKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJICAgZHdjX2hjX3QgKiBoYywKKwkJCQkgICBkd2Nfb3RnX2hjX3JlZ3NfdCAqIGhjX3JlZ3MsCisJCQkJICAgZHdjX290Z19xdGRfdCAqIHF0ZCkKK3sKKwlEV0NfREVCVUdQTChEQkdfSENELCAiLS1Ib3N0IENoYW5uZWwgJWQgSW50ZXJydXB0OiAiCisJCSAgICAiTllFVCBSZWNlaXZlZC0tXG4iLCBoYy0+aGNfbnVtKTsKKworCS8qCisJICogTllFVCBvbiBDU1BMSVQKKwkgKiByZS1kbyB0aGUgQ1NQTElUIGltbWVkaWF0ZWx5IG9uIG5vbi1wZXJpb2RpYworCSAqLworCWlmIChoYy0+ZG9fc3BsaXQgJiYgaGMtPmNvbXBsZXRlX3NwbGl0KSB7CisJCWlmIChoYy0+ZXBfaXNfaW4gJiYgKGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKQorCQkgICAgJiYgaGNkLT5jb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQlxdGQtPmNvbXBsZXRlX3NwbGl0ID0gMDsKKwkJCXF0ZC0+aXNvY19zcGxpdF9vZmZzZXQgPSAwOworCQkJaWYgKCsrcXRkLT5pc29jX2ZyYW1lX2luZGV4ID09IHF0ZC0+dXJiLT5wYWNrZXRfY291bnQpIHsKKwkJCQloY2QtPmZvcHMtPmNvbXBsZXRlKGhjZCwgcXRkLT51cmItPnByaXYsIHF0ZC0+dXJiLCAwKTsKKwkJCQlyZWxlYXNlX2NoYW5uZWwoaGNkLCBoYywgcXRkLCBEV0NfT1RHX0hDX1hGRVJfVVJCX0NPTVBMRVRFKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlyZWxlYXNlX2NoYW5uZWwoaGNkLCBoYywgcXRkLCBEV0NfT1RHX0hDX1hGRVJfTk9fSEFMVF9TVEFUVVMpOworCQkJZ290byBoYW5kbGVfbnlldF9kb25lOworCQl9CisKKwkJaWYgKGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9JTlRSIHx8CisJCSAgICBoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykgeworCQkJaW50IGZybnVtID0gZHdjX290Z19oY2RfZ2V0X2ZyYW1lX251bWJlcihoY2QpOworCisJCQlpZiAoZHdjX2Z1bGxfZnJhbWVfbnVtKGZybnVtKSAhPQorCQkJICAgIGR3Y19mdWxsX2ZyYW1lX251bShoYy0+cWgtPnNjaGVkX2ZyYW1lKSkgeworCQkJCS8qCisJCQkJICogTm8gbG9uZ2VyIGluIHRoZSBzYW1lIGZ1bGwgc3BlZWQgZnJhbWUuCisJCQkJICogVHJlYXQgdGhpcyBhcyBhIHRyYW5zYWN0aW9uIGVycm9yLgorCQkJCSAqLworI2lmIDAKKwkJCQkvKiogQHRvZG8gRml4IHN5c3RlbSBwZXJmb3JtYW5jZSBzbyB0aGlzIGNhbgorCQkJCSAqIGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuIFJpZ2h0IG5vdyBjb21wbGV0ZQorCQkJCSAqIHNwbGl0cyBjYW5ub3QgYmUgc2NoZWR1bGVkIHByZWNpc2VseSBlbm91Z2gKKwkJCQkgKiBkdWUgdG8gb3RoZXIgc3lzdGVtIGFjdGl2aXR5LCBzbyB0aGlzIGVycm9yCisJCQkJICogb2NjdXJzIHJlZ3VsYXJseSBpbiBTbGF2ZSBtb2RlLgorCQkJCSAqLworCQkJCXF0ZC0+ZXJyb3JfY291bnQrKzsKKyNlbmRpZgorCQkJCXF0ZC0+Y29tcGxldGVfc3BsaXQgPSAwOworCQkJCWhhbHRfY2hhbm5lbChoY2QsIGhjLCBxdGQsCisJCQkJCSAgICAgRFdDX09UR19IQ19YRkVSX1hBQ1RfRVJSKTsKKwkJCQkvKiogQHRvZG8gYWRkIHN1cHBvcnQgZm9yIGlzb2MgcmVsZWFzZSAqLworCQkJCWdvdG8gaGFuZGxlX255ZXRfZG9uZTsKKwkJCX0KKwkJfQorCisJCWhhbHRfY2hhbm5lbChoY2QsIGhjLCBxdGQsIERXQ19PVEdfSENfWEZFUl9OWUVUKTsKKwkJZ290byBoYW5kbGVfbnlldF9kb25lOworCX0KKworCWhjLT5xaC0+cGluZ19zdGF0ZSA9IDE7CisJcXRkLT5lcnJvcl9jb3VudCA9IDA7CisKKwl1cGRhdGVfdXJiX3N0YXRlX3hmZXJfaW50cihoYywgaGNfcmVncywgcXRkLT51cmIsIHF0ZCwKKwkJCQkgICBEV0NfT1RHX0hDX1hGRVJfTllFVCk7CisJZHdjX290Z19oY2Rfc2F2ZV9kYXRhX3RvZ2dsZShoYywgaGNfcmVncywgcXRkKTsKKworCS8qCisJICogSGFsdCB0aGUgY2hhbm5lbCBhbmQgcmUtc3RhcnQgdGhlIHRyYW5zZmVyIHNvIHRoZSBQSU5HCisJICogcHJvdG9jb2wgd2lsbCBzdGFydC4KKwkgKi8KKwloYWx0X2NoYW5uZWwoaGNkLCBoYywgcXRkLCBEV0NfT1RHX0hDX1hGRVJfTllFVCk7CisKK2hhbmRsZV9ueWV0X2RvbmU6CisJZGlzYWJsZV9oY19pbnQoaGNfcmVncywgbnlldCk7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogSGFuZGxlcyBhIGhvc3QgY2hhbm5lbCBiYWJibGUgaW50ZXJydXB0LiBUaGlzIGhhbmRsZXIgbWF5IGJlIGNhbGxlZCBpbgorICogZWl0aGVyIERNQSBtb2RlIG9yIFNsYXZlIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQzMl90IGhhbmRsZV9oY19iYWJibGVfaW50cihkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkJCSAgICAgZHdjX2hjX3QgKiBoYywKKwkJCQkgICAgIGR3Y19vdGdfaGNfcmVnc190ICogaGNfcmVncywKKwkJCQkgICAgIGR3Y19vdGdfcXRkX3QgKiBxdGQpCit7CisJRFdDX0RFQlVHUEwoREJHX0hDRCwgIi0tSG9zdCBDaGFubmVsICVkIEludGVycnVwdDogIgorCQkgICAgIkJhYmJsZSBFcnJvci0tXG4iLCBoYy0+aGNfbnVtKTsKKworCWlmIChoY2QtPmNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQlkd2Nfb3RnX2hjZF9jb21wbGV0ZV94ZmVyX2RkbWEoaGNkLCBoYywgaGNfcmVncywKKwkJCQkJICAgICAgIERXQ19PVEdfSENfWEZFUl9CQUJCTEVfRVJSKTsKKwkJZ290byBoYW5kbGVfYmFiYmxlX2RvbmU7CisJfQorCisJaWYgKGhjLT5lcF90eXBlICE9IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCWhjZC0+Zm9wcy0+Y29tcGxldGUoaGNkLCBxdGQtPnVyYi0+cHJpdiwKKwkJCQkgICAgcXRkLT51cmIsIC1EV0NfRV9PVkVSRkxPVyk7CisJCWhhbHRfY2hhbm5lbChoY2QsIGhjLCBxdGQsIERXQ19PVEdfSENfWEZFUl9CQUJCTEVfRVJSKTsKKwl9IGVsc2UgeworCQlkd2Nfb3RnX2hhbHRfc3RhdHVzX2UgaGFsdF9zdGF0dXM7CisJCWhhbHRfc3RhdHVzID0gdXBkYXRlX2lzb2NfdXJiX3N0YXRlKGhjZCwgaGMsIGhjX3JlZ3MsIHF0ZCwKKwkJCQkJCSAgICBEV0NfT1RHX0hDX1hGRVJfQkFCQkxFX0VSUik7CisJCWhhbHRfY2hhbm5lbChoY2QsIGhjLCBxdGQsIGhhbHRfc3RhdHVzKTsKKwl9CisKK2hhbmRsZV9iYWJibGVfZG9uZToKKwlkaXNhYmxlX2hjX2ludChoY19yZWdzLCBiYmxlcnIpOworCXJldHVybiAxOworfQorCisvKioKKyAqIEhhbmRsZXMgYSBob3N0IGNoYW5uZWwgQUhCIGVycm9yIGludGVycnVwdC4gVGhpcyBoYW5kbGVyIGlzIG9ubHkgY2FsbGVkIGluCisgKiBETUEgbW9kZS4KKyAqLworc3RhdGljIGludDMyX3QgaGFuZGxlX2hjX2FoYmVycl9pbnRyKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJICAgICBkd2NfaGNfdCAqIGhjLAorCQkJCSAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCSAgICAgZHdjX290Z19xdGRfdCAqIHF0ZCkKK3sKKwloY2NoYXJfZGF0YV90IGhjY2hhcjsKKwloY3NwbHRfZGF0YV90IGhjc3BsdDsKKwloY3RzaXpfZGF0YV90IGhjdHNpejsKKwl1aW50MzJfdCBoY2RtYTsKKwljaGFyICpwaXBldHlwZSwgKnNwZWVkOworCisJZHdjX290Z19oY2RfdXJiX3QgKnVyYiA9IHF0ZC0+dXJiOworCisJRFdDX0RFQlVHUEwoREJHX0hDRCwgIi0tSG9zdCBDaGFubmVsICVkIEludGVycnVwdDogIgorCQkgICAgIkFIQiBFcnJvci0tXG4iLCBoYy0+aGNfbnVtKTsKKworCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwloY3NwbHQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjc3BsdCk7CisJaGN0c2l6LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY3RzaXopOworCWhjZG1hID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjZG1hKTsKKworCURXQ19FUlJPUigiQUhCIEVSUk9SLCBDaGFubmVsICVkXG4iLCBoYy0+aGNfbnVtKTsKKwlEV0NfRVJST1IoIiAgaGNjaGFyIDB4JTA4eCwgaGNzcGx0IDB4JTA4eFxuIiwgaGNjaGFyLmQzMiwgaGNzcGx0LmQzMik7CisJRFdDX0VSUk9SKCIgIGhjdHNpeiAweCUwOHgsIGhjZG1hIDB4JTA4eFxuIiwgaGN0c2l6LmQzMiwgaGNkbWEpOworCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBVUkIgRW5xdWV1ZVxuIik7CisJRFdDX0VSUk9SKCIgIERldmljZSBhZGRyZXNzOiAlZFxuIiwKKwkJICBkd2Nfb3RnX2hjZF9nZXRfZGV2X2FkZHIoJnVyYi0+cGlwZV9pbmZvKSk7CisJRFdDX0VSUk9SKCIgIEVuZHBvaW50OiAlZCwgJXNcbiIsCisJCSAgZHdjX290Z19oY2RfZ2V0X2VwX251bSgmdXJiLT5waXBlX2luZm8pLAorCQkgIChkd2Nfb3RnX2hjZF9pc19waXBlX2luKCZ1cmItPnBpcGVfaW5mbykgPyAiSU4iIDogIk9VVCIpKTsKKworCXN3aXRjaCAoZHdjX290Z19oY2RfZ2V0X3BpcGVfdHlwZSgmdXJiLT5waXBlX2luZm8pKSB7CisJY2FzZSBVRV9DT05UUk9MOgorCQlwaXBldHlwZSA9ICJDT05UUk9MIjsKKwkJYnJlYWs7CisJY2FzZSBVRV9CVUxLOgorCQlwaXBldHlwZSA9ICJCVUxLIjsKKwkJYnJlYWs7CisJY2FzZSBVRV9JTlRFUlJVUFQ6CisJCXBpcGV0eXBlID0gIklOVEVSUlVQVCI7CisJCWJyZWFrOworCWNhc2UgVUVfSVNPQ0hST05PVVM6CisJCXBpcGV0eXBlID0gIklTT0NIUk9OT1VTIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGlwZXR5cGUgPSAiVU5LTk9XTiI7CisJCWJyZWFrOworCX0KKworCURXQ19FUlJPUigiICBFbmRwb2ludCB0eXBlOiAlc1xuIiwgcGlwZXR5cGUpOworCisJc3dpdGNoIChoYy0+c3BlZWQpIHsKKwljYXNlIERXQ19PVEdfRVBfU1BFRURfSElHSDoKKwkJc3BlZWQgPSAiSElHSCI7CisJCWJyZWFrOworCWNhc2UgRFdDX09UR19FUF9TUEVFRF9GVUxMOgorCQlzcGVlZCA9ICJGVUxMIjsKKwkJYnJlYWs7CisJY2FzZSBEV0NfT1RHX0VQX1NQRUVEX0xPVzoKKwkJc3BlZWQgPSAiTE9XIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3BlZWQgPSAiVU5LTk9XTiI7CisJCWJyZWFrOworCX07CisKKwlEV0NfRVJST1IoIiAgU3BlZWQ6ICVzXG4iLCBzcGVlZCk7CisKKwlEV0NfRVJST1IoIiAgTWF4IHBhY2tldCBzaXplOiAlZFxuIiwKKwkJICBkd2Nfb3RnX2hjZF9nZXRfbXBzKCZ1cmItPnBpcGVfaW5mbykpOworCURXQ19FUlJPUigiICBEYXRhIGJ1ZmZlciBsZW5ndGg6ICVkXG4iLCB1cmItPmxlbmd0aCk7CisJRFdDX0VSUk9SKCIgIFRyYW5zZmVyIGJ1ZmZlcjogJXAsIFRyYW5zZmVyIERNQTogJXBcbiIsCisJCSAgdXJiLT5idWYsICh2b2lkICopdXJiLT5kbWEpOworCURXQ19FUlJPUigiICBTZXR1cCBidWZmZXI6ICVwLCBTZXR1cCBETUE6ICVwXG4iLAorCQkgIHVyYi0+c2V0dXBfcGFja2V0LCAodm9pZCAqKXVyYi0+c2V0dXBfZG1hKTsKKwlEV0NfRVJST1IoIiAgSW50ZXJ2YWw6ICVkXG4iLCB1cmItPmludGVydmFsKTsKKworCS8qIENvcmUgaGFsdGVzIHRoZSBjaGFubmVsIGZvciBEZXNjcmlwdG9yIERNQSBtb2RlICovCisJaWYgKGhjZC0+Y29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCWR3Y19vdGdfaGNkX2NvbXBsZXRlX3hmZXJfZGRtYShoY2QsIGhjLCBoY19yZWdzLAorCQkJCQkgICAgICAgRFdDX09UR19IQ19YRkVSX0FIQl9FUlIpOworCQlnb3RvIGhhbmRsZV9haGJlcnJfZG9uZTsKKwl9CisKKwloY2QtPmZvcHMtPmNvbXBsZXRlKGhjZCwgdXJiLT5wcml2LCB1cmIsIC1EV0NfRV9JTyk7CisKKwkvKgorCSAqIEZvcmNlIGEgY2hhbm5lbCBoYWx0LiBEb24ndCBjYWxsIGhhbHRfY2hhbm5lbCBiZWNhdXNlIHRoYXQgd29uJ3QKKwkgKiB3cml0ZSB0byB0aGUgSENDSEFSbiByZWdpc3RlciBpbiBETUEgbW9kZSB0byBmb3JjZSB0aGUgaGFsdC4KKwkgKi8KKwlkd2Nfb3RnX2hjX2hhbHQoaGNkLT5jb3JlX2lmLCBoYywgRFdDX09UR19IQ19YRkVSX0FIQl9FUlIpOworaGFuZGxlX2FoYmVycl9kb25lOgorCWRpc2FibGVfaGNfaW50KGhjX3JlZ3MsIGFoYmVycik7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogSGFuZGxlcyBhIGhvc3QgY2hhbm5lbCB0cmFuc2FjdGlvbiBlcnJvciBpbnRlcnJ1cHQuIFRoaXMgaGFuZGxlciBtYXkgYmUKKyAqIGNhbGxlZCBpbiBlaXRoZXIgRE1BIG1vZGUgb3IgU2xhdmUgbW9kZS4KKyAqLworc3RhdGljIGludDMyX3QgaGFuZGxlX2hjX3hhY3RlcnJfaW50cihkd2Nfb3RnX2hjZF90ICogaGNkLAorCQkJCSAgICAgIGR3Y19oY190ICogaGMsCisJCQkJICAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCSAgICAgIGR3Y19vdGdfcXRkX3QgKiBxdGQpCit7CisJRFdDX0RFQlVHUEwoREJHX0hDRCwgIi0tSG9zdCBDaGFubmVsICVkIEludGVycnVwdDogIgorCQkgICAgIlRyYW5zYWN0aW9uIEVycm9yLS1cbiIsIGhjLT5oY19udW0pOworCisJaWYgKGhjZC0+Y29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCWR3Y19vdGdfaGNkX2NvbXBsZXRlX3hmZXJfZGRtYShoY2QsIGhjLCBoY19yZWdzLAorCQkJCQkgICAgICAgRFdDX09UR19IQ19YRkVSX1hBQ1RfRVJSKTsKKwkJZ290byBoYW5kbGVfeGFjdGVycl9kb25lOworCX0KKworCWlmIChxdGQgPT0gTlVMTCkKKwkJZ290byBoYW5kbGVfeGFjdGVycl9kb25lOworCisJaWYocXRkLT51cmIgPT0gTlVMTCkKKwkJZ290byBoYW5kbGVfeGFjdGVycl9kb25lOworCisJaWYgKCZxdGQtPnVyYi0+cGlwZV9pbmZvID09IE5VTEwpCisJCWdvdG8gaGFuZGxlX3hhY3RlcnJfZG9uZTsKKworCXN3aXRjaCAoZHdjX290Z19oY2RfZ2V0X3BpcGVfdHlwZSgmcXRkLT51cmItPnBpcGVfaW5mbykpIHsKKwljYXNlIFVFX0NPTlRST0w6CisJY2FzZSBVRV9CVUxLOgorCQlxdGQtPmVycm9yX2NvdW50Kys7CisJCWlmICghaGMtPnFoLT5waW5nX3N0YXRlKSB7CisKKwkJCXVwZGF0ZV91cmJfc3RhdGVfeGZlcl9pbnRyKGhjLCBoY19yZWdzLAorCQkJCQkJICAgcXRkLT51cmIsIHF0ZCwKKwkJCQkJCSAgIERXQ19PVEdfSENfWEZFUl9YQUNUX0VSUik7CisJCQlkd2Nfb3RnX2hjZF9zYXZlX2RhdGFfdG9nZ2xlKGhjLCBoY19yZWdzLCBxdGQpOworCQkJaWYgKCFoYy0+ZXBfaXNfaW4gJiYgaGMtPnNwZWVkID09IERXQ19PVEdfRVBfU1BFRURfSElHSCkgeworCQkJCWhjLT5xaC0+cGluZ19zdGF0ZSA9IDE7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBIYWx0IHRoZSBjaGFubmVsIHNvIHRoZSB0cmFuc2ZlciBjYW4gYmUgcmUtc3RhcnRlZCBmcm9tCisJCSAqIHRoZSBhcHByb3ByaWF0ZSBwb2ludCBvciB0aGUgUElORyBwcm90b2NvbCB3aWxsIHN0YXJ0LgorCQkgKi8KKwkJaGFsdF9jaGFubmVsKGhjZCwgaGMsIHF0ZCwgRFdDX09UR19IQ19YRkVSX1hBQ1RfRVJSKTsKKwkJYnJlYWs7CisJY2FzZSBVRV9JTlRFUlJVUFQ6CisJCXF0ZC0+ZXJyb3JfY291bnQrKzsKKwkJaWYgKGhjLT5kb19zcGxpdCAmJiBoYy0+Y29tcGxldGVfc3BsaXQpIHsKKwkJCXF0ZC0+Y29tcGxldGVfc3BsaXQgPSAwOworCQl9CisJCWhhbHRfY2hhbm5lbChoY2QsIGhjLCBxdGQsIERXQ19PVEdfSENfWEZFUl9YQUNUX0VSUik7CisJCWJyZWFrOworCWNhc2UgVUVfSVNPQ0hST05PVVM6CisJCXsKKwkJCWR3Y19vdGdfaGFsdF9zdGF0dXNfZSBoYWx0X3N0YXR1czsKKwkJCWhhbHRfc3RhdHVzID0KKwkJCSAgICB1cGRhdGVfaXNvY191cmJfc3RhdGUoaGNkLCBoYywgaGNfcmVncywgcXRkLAorCQkJCQkJICBEV0NfT1RHX0hDX1hGRVJfWEFDVF9FUlIpOworCisJCQloYWx0X2NoYW5uZWwoaGNkLCBoYywgcXRkLCBoYWx0X3N0YXR1cyk7CisJCX0KKwkJYnJlYWs7CisJfQoraGFuZGxlX3hhY3RlcnJfZG9uZToKKwlkaXNhYmxlX2hjX2ludChoY19yZWdzLCB4YWN0ZXJyKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIEhhbmRsZXMgYSBob3N0IGNoYW5uZWwgZnJhbWUgb3ZlcnJ1biBpbnRlcnJ1cHQuIFRoaXMgaGFuZGxlciBtYXkgYmUgY2FsbGVkCisgKiBpbiBlaXRoZXIgRE1BIG1vZGUgb3IgU2xhdmUgbW9kZS4KKyAqLworc3RhdGljIGludDMyX3QgaGFuZGxlX2hjX2ZybW92cnVuX2ludHIoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkgICAgICAgZHdjX2hjX3QgKiBoYywKKwkJCQkgICAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCSAgICAgICBkd2Nfb3RnX3F0ZF90ICogcXRkKQoreworCURXQ19ERUJVR1BMKERCR19IQ0QsICItLUhvc3QgQ2hhbm5lbCAlZCBJbnRlcnJ1cHQ6ICIKKwkJICAgICJGcmFtZSBPdmVycnVuLS1cbiIsIGhjLT5oY19udW0pOworCisJc3dpdGNoIChkd2Nfb3RnX2hjZF9nZXRfcGlwZV90eXBlKCZxdGQtPnVyYi0+cGlwZV9pbmZvKSkgeworCWNhc2UgVUVfQ09OVFJPTDoKKwljYXNlIFVFX0JVTEs6CisJCWJyZWFrOworCWNhc2UgVUVfSU5URVJSVVBUOgorCQloYWx0X2NoYW5uZWwoaGNkLCBoYywgcXRkLCBEV0NfT1RHX0hDX1hGRVJfRlJBTUVfT1ZFUlJVTik7CisJCWJyZWFrOworCWNhc2UgVUVfSVNPQ0hST05PVVM6CisJCXsKKwkJCWR3Y19vdGdfaGFsdF9zdGF0dXNfZSBoYWx0X3N0YXR1czsKKwkJCWhhbHRfc3RhdHVzID0KKwkJCSAgICB1cGRhdGVfaXNvY191cmJfc3RhdGUoaGNkLCBoYywgaGNfcmVncywgcXRkLAorCQkJCQkJICBEV0NfT1RHX0hDX1hGRVJfRlJBTUVfT1ZFUlJVTik7CisKKwkJCWhhbHRfY2hhbm5lbChoY2QsIGhjLCBxdGQsIGhhbHRfc3RhdHVzKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlkaXNhYmxlX2hjX2ludChoY19yZWdzLCBmcm1vdnJ1bik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBIYW5kbGVzIGEgaG9zdCBjaGFubmVsIGRhdGEgdG9nZ2xlIGVycm9yIGludGVycnVwdC4gVGhpcyBoYW5kbGVyIG1heSBiZQorICogY2FsbGVkIGluIGVpdGhlciBETUEgbW9kZSBvciBTbGF2ZSBtb2RlLgorICovCitzdGF0aWMgaW50MzJfdCBoYW5kbGVfaGNfZGF0YXRnbGVycl9pbnRyKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJCSBkd2NfaGNfdCAqIGhjLAorCQkJCQkgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCQkgZHdjX290Z19xdGRfdCAqIHF0ZCkKK3sKKwlEV0NfREVCVUdQTChEQkdfSENELCAiLS1Ib3N0IENoYW5uZWwgJWQgSW50ZXJydXB0OiAiCisJCSAgICAiRGF0YSBUb2dnbGUgRXJyb3ItLVxuIiwgaGMtPmhjX251bSk7CisKKwlpZiAoaGMtPmVwX2lzX2luKSB7CisJCXF0ZC0+ZXJyb3JfY291bnQgPSAwOworCX0gZWxzZSB7CisJCURXQ19FUlJPUigiRGF0YSBUb2dnbGUgRXJyb3Igb24gT1VUIHRyYW5zZmVyLCIKKwkJCSAgImNoYW5uZWwgJWRcbiIsIGhjLT5oY19udW0pOworCX0KKworCWRpc2FibGVfaGNfaW50KGhjX3JlZ3MsIGRhdGF0Z2xlcnIpOworCisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBERUJVRworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBkZWJ1ZyBvbmx5LiBJdCBjaGVja3MgdGhhdCBhIHZhbGlkIGhhbHQgc3RhdHVzIGlzIHNldAorICogYW5kIHRoYXQgSENDSEFSbi5jaGRpcyBpcyBjbGVhci4gSWYgdGhlcmUncyBhIHByb2JsZW0sIGNvcnJlY3RpdmUgYWN0aW9uIGlzCisgKiB0YWtlbiBhbmQgYSB3YXJuaW5nIGlzIGlzc3VlZC4KKyAqIEByZXR1cm4gMSBpZiBoYWx0IHN0YXR1cyBpcyBvaywgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhhbHRfc3RhdHVzX29rKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJIGR3Y19oY190ICogaGMsCisJCQkJIGR3Y19vdGdfaGNfcmVnc190ICogaGNfcmVncywKKwkJCQkgZHdjX290Z19xdGRfdCAqIHF0ZCkKK3sKKwloY2NoYXJfZGF0YV90IGhjY2hhcjsKKwloY3RzaXpfZGF0YV90IGhjdHNpejsKKwloY2ludF9kYXRhX3QgaGNpbnQ7CisJaGNpbnRtc2tfZGF0YV90IGhjaW50bXNrOworCWhjc3BsdF9kYXRhX3QgaGNzcGx0OworCisJaWYgKGhjLT5oYWx0X3N0YXR1cyA9PSBEV0NfT1RHX0hDX1hGRVJfTk9fSEFMVF9TVEFUVVMpIHsKKwkJLyoKKwkJICogVGhpcyBjb2RlIGlzIGhlcmUgb25seSBhcyBhIGNoZWNrLiBUaGlzIGNvbmRpdGlvbiBzaG91bGQKKwkJICogbmV2ZXIgaGFwcGVuLiBJZ25vcmUgdGhlIGhhbHQgaWYgaXQgZG9lcyBvY2N1ci4KKwkJICovCisJCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwkJaGN0c2l6LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY3RzaXopOworCQloY2ludC5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNpbnQpOworCQloY2ludG1zay5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNpbnRtc2spOworCQloY3NwbHQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjc3BsdCk7CisJCURXQ19XQVJOCisJCSAgICAoIiVzOiBoYy0+aGFsdF9zdGF0dXMgPT0gRFdDX09UR19IQ19YRkVSX05PX0hBTFRfU1RBVFVTLCAiCisJCSAgICAgImNoYW5uZWwgJWQsIGhjY2hhciAweCUwOHgsIGhjdHNpeiAweCUwOHgsICIKKwkJICAgICAiaGNpbnQgMHglMDh4LCBoY2ludG1zayAweCUwOHgsICIKKwkJICAgICAiaGNzcGx0IDB4JTA4eCwgcXRkLT5jb21wbGV0ZV9zcGxpdCAlZFxuIiwgX19mdW5jX18sCisJCSAgICAgaGMtPmhjX251bSwgaGNjaGFyLmQzMiwgaGN0c2l6LmQzMiwgaGNpbnQuZDMyLAorCQkgICAgIGhjaW50bXNrLmQzMiwgaGNzcGx0LmQzMiwgcXRkLT5jb21wbGV0ZV9zcGxpdCk7CisKKwkJRFdDX1dBUk4oIiVzOiBubyBoYWx0IHN0YXR1cywgY2hhbm5lbCAlZCwgaWdub3JpbmcgaW50ZXJydXB0XG4iLAorCQkJIF9fZnVuY19fLCBoYy0+aGNfbnVtKTsKKwkJRFdDX1dBUk4oIlxuIik7CisJCWNsZWFyX2hjX2ludChoY19yZWdzLCBjaGhsdGQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFRoaXMgY29kZSBpcyBoZXJlIG9ubHkgYXMgYSBjaGVjay4gaGNjaGFyLmNoZGlzIHNob3VsZAorCSAqIG5ldmVyIGJlIHNldCB3aGVuIHRoZSBoYWx0IGludGVycnVwdCBvY2N1cnMuIEhhbHQgdGhlCisJICogY2hhbm5lbCBhZ2FpbiBpZiBpdCBkb2VzIG9jY3VyLgorCSAqLworCWhjY2hhci5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNjaGFyKTsKKwlpZiAoaGNjaGFyLmIuY2hkaXMpIHsKKwkJRFdDX1dBUk4oIiVzOiBoY2NoYXIuY2hkaXMgc2V0IHVuZXhwZWN0ZWRseSwgIgorCQkJICJoY2NoYXIgMHglMDh4LCB0cnlpbmcgdG8gaGFsdCBhZ2FpblxuIiwKKwkJCSBfX2Z1bmNfXywgaGNjaGFyLmQzMik7CisJCWNsZWFyX2hjX2ludChoY19yZWdzLCBjaGhsdGQpOworCQloYy0+aGFsdF9wZW5kaW5nID0gMDsKKwkJaGFsdF9jaGFubmVsKGhjZCwgaGMsIHF0ZCwgaGMtPmhhbHRfc3RhdHVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoqCisgKiBIYW5kbGVzIGEgaG9zdCBDaGFubmVsIEhhbHRlZCBpbnRlcnJ1cHQgaW4gRE1BIG1vZGUuIFRoaXMgaGFuZGxlcgorICogZGV0ZXJtaW5lcyB0aGUgcmVhc29uIHRoZSBjaGFubmVsIGhhbHRlZCBhbmQgcHJvY2VlZHMgYWNjb3JkaW5nbHkuCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9oY19jaGhsdGRfaW50cl9kbWEoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkgICAgICBkd2NfaGNfdCAqIGhjLAorCQkJCSAgICAgIGR3Y19vdGdfaGNfcmVnc190ICogaGNfcmVncywKKwkJCQkgICAgICBkd2Nfb3RnX3F0ZF90ICogcXRkKQoreworCWhjaW50X2RhdGFfdCBoY2ludDsKKwloY2ludG1za19kYXRhX3QgaGNpbnRtc2s7CisJaW50IG91dF9uYWtfZW5oID0gMDsKKworCS8qIEZvciBjb3JlIHdpdGggT1VUIE5BSyBlbmhhbmNlbWVudCwgdGhlIGZsb3cgZm9yIGhpZ2gtCisJICogc3BlZWQgQ09OVFJPTC9CVUxLIE9VVCBpcyBoYW5kbGVkIGEgbGl0dGxlIGRpZmZlcmVudGx5LgorCSAqLworCWlmIChoY2QtPmNvcmVfaWYtPnNucHNpZCA+PSBPVEdfQ09SRV9SRVZfMl83MWEpIHsKKwkJaWYgKGhjLT5zcGVlZCA9PSBEV0NfT1RHX0VQX1NQRUVEX0hJR0ggJiYgIWhjLT5lcF9pc19pbiAmJgorCQkgICAgKGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9DT05UUk9MIHx8CisJCSAgICAgaGMtPmVwX3R5cGUgPT0gRFdDX09UR19FUF9UWVBFX0JVTEspKSB7CisJCQlvdXRfbmFrX2VuaCA9IDE7CisJCX0KKwl9CisKKwlpZiAoaGMtPmhhbHRfc3RhdHVzID09IERXQ19PVEdfSENfWEZFUl9VUkJfREVRVUVVRSB8fAorCSAgICAoaGMtPmhhbHRfc3RhdHVzID09IERXQ19PVEdfSENfWEZFUl9BSEJfRVJSCisJICAgICAmJiAhaGNkLT5jb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpKSB7CisJCS8qCisJCSAqIEp1c3QgcmVsZWFzZSB0aGUgY2hhbm5lbC4gQSBkZXF1ZXVlIGNhbiBoYXBwZW4gb24gYQorCQkgKiB0cmFuc2ZlciB0aW1lb3V0LiBJbiB0aGUgY2FzZSBvZiBhbiBBSEIgRXJyb3IsIHRoZSBjaGFubmVsCisJCSAqIHdhcyBmb3JjZWQgdG8gaGFsdCBiZWNhdXNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGdyYWNlZnVsbHkKKwkJICogcmVjb3Zlci4KKwkJICovCisJCWlmIChoY2QtPmNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkKKwkJCWR3Y19vdGdfaGNkX2NvbXBsZXRlX3hmZXJfZGRtYShoY2QsIGhjLCBoY19yZWdzLAorCQkJCQkJICAgICAgIGhjLT5oYWx0X3N0YXR1cyk7CisJCWVsc2UKKwkJCXJlbGVhc2VfY2hhbm5lbChoY2QsIGhjLCBxdGQsIGhjLT5oYWx0X3N0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZWFkIHRoZSBIQ0lOVG4gcmVnaXN0ZXIgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZSBmb3IgdGhlIGhhbHQuICovCisJaGNpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjaW50KTsKKwloY2ludG1zay5kMzIgPSBEV0NfUkVBRF9SRUczMigmaGNfcmVncy0+aGNpbnRtc2spOworCisJaWYgKGhjaW50LmIueGZlcmNvbXApIHsKKwkJLyoqIEB0b2RvIFRoaXMgaXMgaGVyZSBiZWNhdXNlIG9mIGEgcG9zc2libGUgaGFyZHdhcmUgYnVnLiAgU3BlYworCQkgKiBzYXlzIHRoYXQgb24gU1BMSVQtSVNPQyBPVVQgdHJhbnNmZXJzIGluIERNQSBtb2RlIHRoYXQgYSBIQUxUCisJCSAqIGludGVycnVwdCB3L0FDSyBiaXQgc2V0IHNob3VsZCBvY2N1ciwgYnV0IEkgb25seSBzZWUgdGhlCisJCSAqIFhGRVJDT01QIGJpdCwgZXZlbiB3aXRoIGl0IG1hc2tlZCBvdXQuICBUaGlzIGlzIGEgd29ya2Fyb3VuZAorCQkgKiBmb3IgdGhhdCBiZWhhdmlvci4gIFNob3VsZCBmaXggdGhpcyB3aGVuIGhhcmR3YXJlIGlzIGZpeGVkLgorCQkgKi8KKwkJaWYgKGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DICYmICFoYy0+ZXBfaXNfaW4pIHsKKwkJCWhhbmRsZV9oY19hY2tfaW50cihoY2QsIGhjLCBoY19yZWdzLCBxdGQpOworCQl9CisJCWhhbmRsZV9oY194ZmVyY29tcF9pbnRyKGhjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfSBlbHNlIGlmIChoY2ludC5iLnN0YWxsKSB7CisJCWhhbmRsZV9oY19zdGFsbF9pbnRyKGhjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfSBlbHNlIGlmIChoY2ludC5iLnhhY3RlcnIgJiYgIWhjZC0+Y29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCWlmIChvdXRfbmFrX2VuaCkgeworCQkJaWYgKGhjaW50LmIubnlldCB8fCBoY2ludC5iLm5hayB8fCBoY2ludC5iLmFjaykgeworCQkJCURXQ19ERUJVRygiWGFjdEVyciB3aXRoIE5ZRVQvTkFLL0FDS1xuIik7CisJCQkJcXRkLT5lcnJvcl9jb3VudCA9IDA7CisJCQl9IGVsc2UgeworCQkJCURXQ19ERUJVRygiWGFjdEVyciB3aXRob3V0IE5ZRVQvTkFLL0FDS1xuIik7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBNdXN0IGhhbmRsZSB4YWN0ZXJyIGJlZm9yZSBuYWsgb3IgYWNrLiBDb3VsZCBnZXQgYSB4YWN0ZXJyCisJCSAqIGF0IHRoZSBzYW1lIHRpbWUgYXMgZWl0aGVyIG9mIHRoZXNlIG9uIGEgQlVMSy9DT05UUk9MIE9VVAorCQkgKiB0aGF0IHN0YXJ0ZWQgd2l0aCBhIFBJTkcuIFRoZSB4YWN0ZXJyIHRha2VzIHByZWNlZGVuY2UuCisJCSAqLworCQloYW5kbGVfaGNfeGFjdGVycl9pbnRyKGhjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfSBlbHNlIGlmIChoY2ludC5iLnhjc194YWN0ICYmIGhjZC0+Y29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCWhhbmRsZV9oY194YWN0ZXJyX2ludHIoaGNkLCBoYywgaGNfcmVncywgcXRkKTsKKwl9IGVsc2UgaWYgKGhjaW50LmIuYWhiZXJyICYmIGhjZC0+Y29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCWhhbmRsZV9oY19haGJlcnJfaW50cihoY2QsIGhjLCBoY19yZWdzLCBxdGQpOworCX0gZWxzZSBpZiAoaGNpbnQuYi5iYmxlcnIpIHsKKwkJaGFuZGxlX2hjX2JhYmJsZV9pbnRyKGhjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfSBlbHNlIGlmIChoY2ludC5iLmZybW92cnVuKSB7CisJCWhhbmRsZV9oY19mcm1vdnJ1bl9pbnRyKGhjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfSBlbHNlIGlmICghb3V0X25ha19lbmgpIHsKKwkJaWYgKGhjaW50LmIubnlldCkgeworCQkJLyoKKwkJCSAqIE11c3QgaGFuZGxlIG55ZXQgYmVmb3JlIG5hayBvciBhY2suIENvdWxkIGdldCBhIG55ZXQgYXQgdGhlCisJCQkgKiBzYW1lIHRpbWUgYXMgZWl0aGVyIG9mIHRob3NlIG9uIGEgQlVMSy9DT05UUk9MIE9VVCB0aGF0CisJCQkgKiBzdGFydGVkIHdpdGggYSBQSU5HLiBUaGUgbnlldCB0YWtlcyBwcmVjZWRlbmNlLgorCQkJICovCisJCQloYW5kbGVfaGNfbnlldF9pbnRyKGhjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJCX0gZWxzZSBpZiAoaGNpbnQuYi5uYWsgJiYgIWhjaW50bXNrLmIubmFrKSB7CisJCQkvKgorCQkJICogSWYgbmFrIGlzIG5vdCBtYXNrZWQsIGl0J3MgYmVjYXVzZSBhIG5vbi1zcGxpdCBJTiB0cmFuc2ZlcgorCQkJICogaXMgaW4gYW4gZXJyb3Igc3RhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5hayBpcyBoYW5kbGVkIGJ5CisJCQkgKiB0aGUgbmFrIGludGVycnVwdCBoYW5kbGVyLCBub3QgaGVyZS4gSGFuZGxlIG5hayBoZXJlIGZvcgorCQkJICogQlVMSy9DT05UUk9MIE9VVCB0cmFuc2ZlcnMsIHdoaWNoIGhhbHQgb24gYSBOQUsgdG8gYWxsb3cKKwkJCSAqIHJld2luZGluZyB0aGUgYnVmZmVyIHBvaW50ZXIuCisJCQkgKi8KKwkJCWhhbmRsZV9oY19uYWtfaW50cihoY2QsIGhjLCBoY19yZWdzLCBxdGQpOworCQl9IGVsc2UgaWYgKGhjaW50LmIuYWNrICYmICFoY2ludG1zay5iLmFjaykgeworCQkJLyoKKwkJCSAqIElmIGFjayBpcyBub3QgbWFza2VkLCBpdCdzIGJlY2F1c2UgYSBub24tc3BsaXQgSU4gdHJhbnNmZXIKKwkJCSAqIGlzIGluIGFuIGVycm9yIHN0YXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBhY2sgaXMgaGFuZGxlZCBieQorCQkJICogdGhlIGFjayBpbnRlcnJ1cHQgaGFuZGxlciwgbm90IGhlcmUuIEhhbmRsZSBhY2sgaGVyZSBmb3IKKwkJCSAqIHNwbGl0IHRyYW5zZmVycy4gU3RhcnQgc3BsaXRzIGhhbHQgb24gQUNLLgorCQkJICovCisJCQloYW5kbGVfaGNfYWNrX2ludHIoaGNkLCBoYywgaGNfcmVncywgcXRkKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChoYy0+ZXBfdHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSU5UUiB8fAorCQkJICAgIGhjLT5lcF90eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCQkJLyoKKwkJCQkgKiBBIHBlcmlvZGljIHRyYW5zZmVyIGhhbHRlZCB3aXRoIG5vIG90aGVyIGNoYW5uZWwKKwkJCQkgKiBpbnRlcnJ1cHRzIHNldC4gQXNzdW1lIGl0IHdhcyBoYWx0ZWQgYnkgdGhlIGNvcmUKKwkJCQkgKiBiZWNhdXNlIGl0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgaW4gaXRzIHNjaGVkdWxlZAorCQkJCSAqIChtaWNybylmcmFtZS4KKwkJCQkgKi8KKyNpZmRlZiBERUJVRworCQkJCURXQ19QUklOVEYKKwkJCQkgICAgKCIlczogSGFsdCBjaGFubmVsICVkIChhc3N1bWUgaW5jb21wbGV0ZSBwZXJpb2RpYyB0cmFuc2ZlcilcbiIsCisJCQkJICAgICBfX2Z1bmNfXywgaGMtPmhjX251bSk7CisjZW5kaWYKKwkJCQloYWx0X2NoYW5uZWwoaGNkLCBoYywgcXRkLAorCQkJCQkgICAgIERXQ19PVEdfSENfWEZFUl9QRVJJT0RJQ19JTkNPTVBMRVRFKTsKKwkJCX0gZWxzZSB7CisJCQkJRFdDX0VSUk9SCisJCQkJICAgICgiJXM6IENoYW5uZWwgJWQsIERNQSBNb2RlIC0tIENoSGx0ZCBzZXQsIGJ1dCByZWFzb24gIgorCQkJCSAgICAgImZvciBoYWx0aW5nIGlzIHVua25vd24sIGhjaW50IDB4JTA4eCwgaW50c3RzIDB4JTA4eFxuIiwKKwkJCQkgICAgIF9fZnVuY19fLCBoYy0+aGNfbnVtLCBoY2ludC5kMzIsCisJCQkJICAgICBEV0NfUkVBRF9SRUczMigmaGNkLT4KKwkJCQkJCSAgICBjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJCSAgICBnaW50c3RzKSk7CisJCQkJaGFsdF9jaGFubmVsKGhjZCwgaGMsIHF0ZCwKKwkJCQkJICAgICBEV0NfT1RHX0hDX1hGRVJfUEVSSU9ESUNfSU5DT01QTEVURSk7CisJCQl9CisKKwkJfQorCX0gZWxzZSB7CisJCURXQ19QUklOVEYoIk5ZRVQvTkFLL0FDSy9vdGhlciBpbiBub24tZXJyb3IgY2FzZSwgMHglMDh4XG4iLAorCQkJICAgaGNpbnQuZDMyKTsKKwl9Cit9CisKKy8qKgorICogSGFuZGxlcyBhIGhvc3QgY2hhbm5lbCBDaGFubmVsIEhhbHRlZCBpbnRlcnJ1cHQuCisgKgorICogSW4gc2xhdmUgbW9kZSwgdGhpcyBoYW5kbGVyIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGRyaXZlciBzcGVjaWZpY2FsbHkKKyAqIHJlcXVlc3RzIGEgaGFsdC4gVGhpcyBvY2N1cnMgZHVyaW5nIGhhbmRsaW5nIG90aGVyIGhvc3QgY2hhbm5lbCBpbnRlcnJ1cHRzCisgKiAoZS5nLiBuYWssIHhhY3RlcnIsIHN0YWxsLCBueWV0LCBldGMuKS4KKyAqCisgKiBJbiBETUEgbW9kZSwgdGhpcyBpcyB0aGUgaW50ZXJydXB0IHRoYXQgb2NjdXJzIHdoZW4gdGhlIGNvcmUgaGFzIGZpbmlzaGVkCisgKiBwcm9jZXNzaW5nIGEgdHJhbnNmZXIgb24gYSBjaGFubmVsLiBPdGhlciBob3N0IGNoYW5uZWwgaW50ZXJydXB0cyAoZXhjZXB0CisgKiBhaGJlcnIpIGFyZSBkaXNhYmxlZCBpbiBETUEgbW9kZS4KKyAqLworc3RhdGljIGludDMyX3QgaGFuZGxlX2hjX2NoaGx0ZF9pbnRyKGR3Y19vdGdfaGNkX3QgKiBoY2QsCisJCQkJICAgICBkd2NfaGNfdCAqIGhjLAorCQkJCSAgICAgZHdjX290Z19oY19yZWdzX3QgKiBoY19yZWdzLAorCQkJCSAgICAgZHdjX290Z19xdGRfdCAqIHF0ZCkKK3sKKwlEV0NfREVCVUdQTChEQkdfSENELCAiLS1Ib3N0IENoYW5uZWwgJWQgSW50ZXJydXB0OiAiCisJCSAgICAiQ2hhbm5lbCBIYWx0ZWQtLVxuIiwgaGMtPmhjX251bSk7CisKKwlpZiAoaGNkLT5jb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCWhhbmRsZV9oY19jaGhsdGRfaW50cl9kbWEoaGNkLCBoYywgaGNfcmVncywgcXRkKTsKKwl9IGVsc2UgeworI2lmZGVmIERFQlVHCisJCWlmICghaGFsdF9zdGF0dXNfb2soaGNkLCBoYywgaGNfcmVncywgcXRkKSkgeworCQkJcmV0dXJuIDE7CisJCX0KKyNlbmRpZgorCQlyZWxlYXNlX2NoYW5uZWwoaGNkLCBoYywgcXRkLCBoYy0+aGFsdF9zdGF0dXMpOworCX0KKworCXJldHVybiAxOworfQorCisvKiogSGFuZGxlcyBpbnRlcnJ1cHQgZm9yIGEgc3BlY2lmaWMgSG9zdCBDaGFubmVsICovCitpbnQzMl90IGR3Y19vdGdfaGNkX2hhbmRsZV9oY19uX2ludHIoZHdjX290Z19oY2RfdCAqIGR3Y19vdGdfaGNkLCB1aW50MzJfdCBudW0pCit7CisJaW50IHJldHZhbCA9IDA7CisJaGNpbnRfZGF0YV90IGhjaW50OworCWhjaW50bXNrX2RhdGFfdCBoY2ludG1zazsKKwlkd2NfaGNfdCAqaGM7CisJZHdjX290Z19oY19yZWdzX3QgKmhjX3JlZ3M7CisJZHdjX290Z19xdGRfdCAqcXRkOworCisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICItLUhvc3QgQ2hhbm5lbCBJbnRlcnJ1cHQtLSwgQ2hhbm5lbCAlZFxuIiwgbnVtKTsKKworCWhjID0gZHdjX290Z19oY2QtPmhjX3B0cl9hcnJheVtudW1dOworCWhjX3JlZ3MgPSBkd2Nfb3RnX2hjZC0+Y29yZV9pZi0+aG9zdF9pZi0+aGNfcmVnc1tudW1dOworCXF0ZCA9IERXQ19DSVJDTEVRX0ZJUlNUKCZoYy0+cWgtPnF0ZF9saXN0KTsKKworCWhjaW50LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZoY19yZWdzLT5oY2ludCk7CisJaGNpbnRtc2suZDMyID0gRFdDX1JFQURfUkVHMzIoJmhjX3JlZ3MtPmhjaW50bXNrKTsKKwlEV0NfREVCVUdQTChEQkdfSENEViwKKwkJICAgICIgIGhjaW50IDB4JTA4eCwgaGNpbnRtc2sgMHglMDh4LCBoY2ludCZoY2ludG1zayAweCUwOHhcbiIsCisJCSAgICBoY2ludC5kMzIsIGhjaW50bXNrLmQzMiwgKGhjaW50LmQzMiAmIGhjaW50bXNrLmQzMikpOworCWhjaW50LmQzMiA9IGhjaW50LmQzMiAmIGhjaW50bXNrLmQzMjsKKworCWlmICghZHdjX290Z19oY2QtPmNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJaWYgKGhjaW50LmIuY2hobHRkICYmIGhjaW50LmQzMiAhPSAweDIpIHsKKwkJCWhjaW50LmIuY2hobHRkID0gMDsKKwkJfQorCX0KKworCWlmIChoY2ludC5iLnhmZXJjb21wKSB7CisJCXJldHZhbCB8PQorCQkgICAgaGFuZGxlX2hjX3hmZXJjb21wX2ludHIoZHdjX290Z19oY2QsIGhjLCBoY19yZWdzLCBxdGQpOworCQkvKgorCQkgKiBJZiBOWUVUIG9jY3VycmVkIGF0IHNhbWUgdGltZSBhcyBYZmVyIENvbXBsZXRlLCB0aGUgTllFVCBpcworCQkgKiBoYW5kbGVkIGJ5IHRoZSBYZmVyIENvbXBsZXRlIGludGVycnVwdCBoYW5kbGVyLiBEb24ndCB3YW50CisJCSAqIHRvIGNhbGwgdGhlIE5ZRVQgaW50ZXJydXB0IGhhbmRsZXIgaW4gdGhpcyBjYXNlLgorCQkgKi8KKwkJaGNpbnQuYi5ueWV0ID0gMDsKKwl9CisJaWYgKGhjaW50LmIuY2hobHRkKSB7CisJCXJldHZhbCB8PSBoYW5kbGVfaGNfY2hobHRkX2ludHIoZHdjX290Z19oY2QsIGhjLCBoY19yZWdzLCBxdGQpOworCX0KKwlpZiAoaGNpbnQuYi5haGJlcnIpIHsKKwkJcmV0dmFsIHw9IGhhbmRsZV9oY19haGJlcnJfaW50cihkd2Nfb3RnX2hjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfQorCWlmIChoY2ludC5iLnN0YWxsKSB7CisJCXJldHZhbCB8PSBoYW5kbGVfaGNfc3RhbGxfaW50cihkd2Nfb3RnX2hjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfQorCWlmIChoY2ludC5iLm5haykgeworCQlyZXR2YWwgfD0gaGFuZGxlX2hjX25ha19pbnRyKGR3Y19vdGdfaGNkLCBoYywgaGNfcmVncywgcXRkKTsKKwl9CisJaWYgKGhjaW50LmIuYWNrKSB7CisJCXJldHZhbCB8PSBoYW5kbGVfaGNfYWNrX2ludHIoZHdjX290Z19oY2QsIGhjLCBoY19yZWdzLCBxdGQpOworCX0KKwlpZiAoaGNpbnQuYi5ueWV0KSB7CisJCXJldHZhbCB8PSBoYW5kbGVfaGNfbnlldF9pbnRyKGR3Y19vdGdfaGNkLCBoYywgaGNfcmVncywgcXRkKTsKKwl9CisJaWYgKGhjaW50LmIueGFjdGVycikgeworCQlyZXR2YWwgfD0gaGFuZGxlX2hjX3hhY3RlcnJfaW50cihkd2Nfb3RnX2hjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfQorCWlmIChoY2ludC5iLmJibGVycikgeworCQlyZXR2YWwgfD0gaGFuZGxlX2hjX2JhYmJsZV9pbnRyKGR3Y19vdGdfaGNkLCBoYywgaGNfcmVncywgcXRkKTsKKwl9CisJaWYgKGhjaW50LmIuZnJtb3ZydW4pIHsKKwkJcmV0dmFsIHw9CisJCSAgICBoYW5kbGVfaGNfZnJtb3ZydW5faW50cihkd2Nfb3RnX2hjZCwgaGMsIGhjX3JlZ3MsIHF0ZCk7CisJfQorCWlmIChoY2ludC5iLmRhdGF0Z2xlcnIpIHsKKwkJcmV0dmFsIHw9CisJCSAgICBoYW5kbGVfaGNfZGF0YXRnbGVycl9pbnRyKGR3Y19vdGdfaGNkLCBoYywgaGNfcmVncywgcXRkKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYgLyogRFdDX0RFVklDRV9PTkxZICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfaGNkX2xpbnV4LmMgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfaGNkX2xpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwOWFmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19oY2RfbGludXguYwpAQCAtMCwwICsxLDg4OCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9vdGcvbGludXgvZHJpdmVycy9kd2Nfb3RnX2hjZF9saW51eC5jICQKKyAqICRSZXZpc2lvbjogIzIwICQKKyAqICREYXRlOiAyMDExLzEwLzI2ICQKKyAqICRDaGFuZ2U6IDE4NzI5ODEgJAorICoKKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWZuZGVmIERXQ19ERVZJQ0VfT05MWQorCisvKioKKyAqIEBmaWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSENELiBJbiBMaW51eCwgdGhlIEhDRAorICogaW1wbGVtZW50cyB0aGUgaGNfZHJpdmVyIEFQSS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwzNSkKKyNpbmNsdWRlIDwuLi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImR3Y19vdGdfaGNkX2lmLmgiCisjaW5jbHVkZSAiZHdjX290Z19kYmcuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2RyaXZlci5oIgorI2luY2x1ZGUgImR3Y19vdGdfaGNkLmgiCisvKioKKyAqIEdldHMgdGhlIGVuZHBvaW50IG51bWJlciBmcm9tIGEgX2JFbmRwb2ludEFkZHJlc3MgYXJndW1lbnQuIFRoZSBlbmRwb2ludCBpcworICogcXVhbGlmaWVkIHdpdGggaXRzIGRpcmVjdGlvbiAocG9zc2libGUgMzIgZW5kcG9pbnRzIHBlciBkZXZpY2UpLgorICovCisjZGVmaW5lIGR3Y19lcF9hZGRyX3RvX2VuZHBvaW50KF9iRW5kcG9pbnRBZGRyZXNzXykgKChfYkVuZHBvaW50QWRkcmVzc18gJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spIHwgXAorCQkJCQkJICAgICAoKF9iRW5kcG9pbnRBZGRyZXNzXyAmIFVTQl9ESVJfSU4pICE9IDApIDw8IDQpCisKK3N0YXRpYyBjb25zdCBjaGFyIGR3Y19vdGdfaGNkX25hbWVbXSA9ICJkd2Nfb3RnIjsKKworLyoqIEBuYW1lIExpbnV4IEhDIERyaXZlciBBUEkgRnVuY3Rpb25zICovCisvKiogQHsgKi8KK3N0YXRpYyBpbnQgdXJiX2VucXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjgpCisJCSAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwLAorI2VuZGlmCisJCSAgICAgICBzdHJ1Y3QgdXJiICp1cmIsIGdmcF90IG1lbV9mbGFncyk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQorc3RhdGljIGludCB1cmJfZGVxdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIpOworI2Vsc2UKK3N0YXRpYyBpbnQgdXJiX2RlcXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBlbmRwb2ludF9kaXNhYmxlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXApOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMzApCitzdGF0aWMgdm9pZCBlbmRwb2ludF9yZXNldChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKTsKKyNlbmRpZgorc3RhdGljIGlycXJldHVybl90IGR3Y19vdGdfaGNkX2lycShzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKK2V4dGVybiBpbnQgaGNkX3N0YXJ0KHN0cnVjdCB1c2JfaGNkICpoY2QpOworZXh0ZXJuIHZvaWQgaGNkX3N0b3Aoc3RydWN0IHVzYl9oY2QgKmhjZCk7CitzdGF0aWMgaW50IGdldF9mcmFtZV9udW1iZXIoc3RydWN0IHVzYl9oY2QgKmhjZCk7CitleHRlcm4gaW50IGh1Yl9zdGF0dXNfZGF0YShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBjaGFyICpidWYpOworZXh0ZXJuIGludCBodWJfY29udHJvbChzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkgICAgICAgdTE2IHR5cGVSZXEsCisJCSAgICAgICB1MTYgd1ZhbHVlLCB1MTYgd0luZGV4LCBjaGFyICpidWYsIHUxNiB3TGVuZ3RoKTsKKworc3RydWN0IHdyYXBwZXJfcHJpdl9kYXRhIHsKKwlkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZDsKK307CisKKy8qKiBAfSAqLworCitpbnQgY29tY2VydG9fZHdjX2R1bW15X2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJcHJpbnRrKCJcbiBjb21jZXJ0b19kd2NfZHVtbXlfYnVzX3N1c3BlbmQuLi4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbWNlcnRvX2R3Y19kdW1teV9idXNfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJcHJpbnRrKCJcbiBjb21jZXJ0b19kd2NfZHVtbXlfYnVzX3Jlc3VtZS4uLiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaGNfZHJpdmVyIGR3Y19vdGdfaGNfZHJpdmVyID0geworCisJLmRlc2NyaXB0aW9uID0gZHdjX290Z19oY2RfbmFtZSwKKwkucHJvZHVjdF9kZXNjID0gIkRXQyBPVEcgQ29udHJvbGxlciIsCisJLmhjZF9wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IHdyYXBwZXJfcHJpdl9kYXRhKSwKKworCS5pcnEgPSBkd2Nfb3RnX2hjZF9pcnEsCisKKwkuZmxhZ3MgPSBIQ0RfTUVNT1JZIHwgSENEX1VTQjIsCisKKwkvLy5yZXNldCA9CisJLnN0YXJ0ID0gaGNkX3N0YXJ0LAorCS8vLnN1c3BlbmQgPQorCS8vLnJlc3VtZSA9CisJLnN0b3AgPSBoY2Rfc3RvcCwKKworCS51cmJfZW5xdWV1ZSA9IHVyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1ZSA9IHVyYl9kZXF1ZXVlLAorCS5lbmRwb2ludF9kaXNhYmxlID0gZW5kcG9pbnRfZGlzYWJsZSwKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKQorCS5lbmRwb2ludF9yZXNldCA9IGVuZHBvaW50X3Jlc2V0LAorI2VuZGlmCisJLmdldF9mcmFtZV9udW1iZXIgPSBnZXRfZnJhbWVfbnVtYmVyLAorCisJLmh1Yl9zdGF0dXNfZGF0YSA9IGh1Yl9zdGF0dXNfZGF0YSwKKwkuaHViX2NvbnRyb2wgPSBodWJfY29udHJvbCwKKwkuYnVzX3N1c3BlbmQgPSBjb21jZXJ0b19kd2NfZHVtbXlfYnVzX3N1c3BlbmQsCisJLmJ1c19yZXN1bWUgPSBjb21jZXJ0b19kd2NfZHVtbXlfYnVzX3Jlc3VtZSwKK307CisKKy8qKiBHZXRzIHRoZSBkd2Nfb3RnX2hjZCBmcm9tIGEgc3RydWN0IHVzYl9oY2QgKi8KK3N0YXRpYyBpbmxpbmUgZHdjX290Z19oY2RfdCAqaGNkX3RvX2R3Y19vdGdfaGNkKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJc3RydWN0IHdyYXBwZXJfcHJpdl9kYXRhICpwOworCXAgPSAoc3RydWN0IHdyYXBwZXJfcHJpdl9kYXRhICopKGhjZC0+aGNkX3ByaXYpOworCXJldHVybiBwLT5kd2Nfb3RnX2hjZDsKK30KKworLyoqIEdldHMgdGhlIHN0cnVjdCB1c2JfaGNkIHRoYXQgY29udGFpbnMgYSBkd2Nfb3RnX2hjZF90LiAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX2hjZCAqZHdjX290Z19oY2RfdG9faGNkKGR3Y19vdGdfaGNkX3QgKiBkd2Nfb3RnX2hjZCkKK3sKKwlyZXR1cm4gZHdjX290Z19oY2RfZ2V0X3ByaXZfZGF0YShkd2Nfb3RnX2hjZCk7Cit9CisKKy8qKiBHZXRzIHRoZSB1c2JfaG9zdF9lbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggYW4gVVJCLiAqLworaW5saW5lIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZHdjX3VyYl90b19lbmRwb2ludChzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHVyYi0+ZGV2OworCWludCBlcF9udW0gPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7CisKKwlpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKQorCQlyZXR1cm4gZGV2LT5lcF9pbltlcF9udW1dOworCWVsc2UKKwkJcmV0dXJuIGRldi0+ZXBfb3V0W2VwX251bV07Cit9CisKK3N0YXRpYyBpbnQgX2Rpc2Nvbm5lY3QoZHdjX290Z19oY2RfdCAqIGhjZCkKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqdXNiX2hjZCA9IGR3Y19vdGdfaGNkX3RvX2hjZChoY2QpOworCisJdXNiX2hjZC0+c2VsZi5pc19iX2hvc3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zdGFydChkd2Nfb3RnX2hjZF90ICogaGNkKQoreworCXN0cnVjdCB1c2JfaGNkICp1c2JfaGNkID0gZHdjX290Z19oY2RfdG9faGNkKGhjZCk7CisKKwl1c2JfaGNkLT5zZWxmLmlzX2JfaG9zdCA9IGR3Y19vdGdfaGNkX2lzX2JfaG9zdChoY2QpOworCWhjZF9zdGFydCh1c2JfaGNkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9odWJfaW5mbyhkd2Nfb3RnX2hjZF90ICogaGNkLCB2b2lkICp1cmJfaGFuZGxlLCB1aW50MzJfdCAqIGh1Yl9hZGRyLAorCQkgICAgIHVpbnQzMl90ICogcG9ydF9hZGRyKQoreworCXN0cnVjdCB1cmIgKnVyYiA9IChzdHJ1Y3QgdXJiICopdXJiX2hhbmRsZTsKKwlpZiAodXJiLT5kZXYtPnR0KSB7CisJCSpodWJfYWRkciA9IHVyYi0+ZGV2LT50dC0+aHViLT5kZXZudW07CisJfSBlbHNlIHsKKwkJKmh1Yl9hZGRyID0gMDsKKwl9CisJKnBvcnRfYWRkciA9IHVyYi0+ZGV2LT50dHBvcnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3NwZWVkKGR3Y19vdGdfaGNkX3QgKiBoY2QsIHZvaWQgKnVyYl9oYW5kbGUpCit7CisJc3RydWN0IHVyYiAqdXJiID0gKHN0cnVjdCB1cmIgKil1cmJfaGFuZGxlOworCXJldHVybiB1cmItPmRldi0+c3BlZWQ7Cit9CisKK3N0YXRpYyBpbnQgX2dldF9iX2hucF9lbmFibGUoZHdjX290Z19oY2RfdCAqIGhjZCkKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqdXNiX2hjZCA9IGR3Y19vdGdfaGNkX3RvX2hjZChoY2QpOworCXJldHVybiB1c2JfaGNkLT5zZWxmLmJfaG5wX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgYWxsb2NhdGVfYnVzX2JhbmR3aWR0aChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCB1aW50MzJfdCBidywKKwkJCQkgICBzdHJ1Y3QgdXJiICp1cmIpCit7CisJaGNkX3RvX2J1cyhoY2QpLT5iYW5kd2lkdGhfYWxsb2NhdGVkICs9IGJ3IC8gdXJiLT5pbnRlcnZhbDsKKwlpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9JU09DSFJPTk9VUykgeworCQloY2RfdG9fYnVzKGhjZCktPmJhbmR3aWR0aF9pc29jX3JlcXMrKzsKKwl9IGVsc2UgeworCQloY2RfdG9fYnVzKGhjZCktPmJhbmR3aWR0aF9pbnRfcmVxcysrOworCX0KK30KKworc3RhdGljIHZvaWQgZnJlZV9idXNfYmFuZHdpZHRoKHN0cnVjdCB1c2JfaGNkICpoY2QsIHVpbnQzMl90IGJ3LAorCQkJICAgICAgIHN0cnVjdCB1cmIgKnVyYikKK3sKKwloY2RfdG9fYnVzKGhjZCktPmJhbmR3aWR0aF9hbGxvY2F0ZWQgLT0gYncgLyB1cmItPmludGVydmFsOworCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7CisJCWhjZF90b19idXMoaGNkKS0+YmFuZHdpZHRoX2lzb2NfcmVxcy0tOworCX0gZWxzZSB7CisJCWhjZF90b19idXMoaGNkKS0+YmFuZHdpZHRoX2ludF9yZXFzLS07CisJfQorfQorCisvKioKKyAqIFNldHMgdGhlIGZpbmFsIHN0YXR1cyBvZiBhbiBVUkIgYW5kIHJldHVybnMgaXQgdG8gdGhlIGRldmljZSBkcml2ZXIuIEFueQorICogcmVxdWlyZWQgY2xlYW51cCBvZiB0aGUgVVJCIGlzIHBlcmZvcm1lZC4KKyAqLworc3RhdGljIGludCBfY29tcGxldGUoZHdjX290Z19oY2RfdCAqIGhjZCwgdm9pZCAqdXJiX2hhbmRsZSwKKwkJICAgICBkd2Nfb3RnX2hjZF91cmJfdCAqIGR3Y19vdGdfdXJiLCBpbnQzMl90IHN0YXR1cykKK3sKKwlzdHJ1Y3QgdXJiICp1cmIgPSAoc3RydWN0IHVyYiAqKXVyYl9oYW5kbGU7CisjaWZkZWYgREVCVUcKKwlpZiAoQ0hLX0RFQlVHX0xFVkVMKERCR19IQ0RWIHwgREJHX0hDRF9VUkIpKSB7CisJCURXQ19QUklOVEYoIiVzOiB1cmIgJXAsIGRldmljZSAlZCwgZXAgJWQgJXMsIHN0YXR1cz0lZFxuIiwKKwkJCSAgIF9fZnVuY19fLCB1cmIsIHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSksCisJCQkgICB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCisJCQkgICB1c2JfcGlwZWluKHVyYi0+cGlwZSkgPyAiSU4iIDogIk9VVCIsIHN0YXR1cyk7CisJCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyBpKyspIHsKKwkJCQlEV0NfUFJJTlRGKCIgIElTTyBEZXNjICVkIHN0YXR1czogJWRcbiIsCisJCQkJCSAgIGksIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJdXJiLT5hY3R1YWxfbGVuZ3RoID0gZHdjX290Z19oY2RfdXJiX2dldF9hY3R1YWxfbGVuZ3RoKGR3Y19vdGdfdXJiKTsKKwkvKiBDb252ZXJ0IHN0YXR1cyB2YWx1ZS4gKi8KKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgLURXQ19FX1BST1RPQ09MOgorCQlzdGF0dXMgPSAtRVBST1RPOworCQlicmVhazsKKwljYXNlIC1EV0NfRV9JTl9QUk9HUkVTUzoKKwkJc3RhdHVzID0gLUVJTlBST0dSRVNTOworCQlicmVhazsKKwljYXNlIC1EV0NfRV9QSVBFOgorCQlzdGF0dXMgPSAtRVBJUEU7CisJCWJyZWFrOworCWNhc2UgLURXQ19FX0lPOgorCQlzdGF0dXMgPSAtRUlPOworCQlicmVhazsKKwljYXNlIC1EV0NfRV9USU1FT1VUOgorCQlzdGF0dXMgPSAtRVRJTUVET1VUOworCQlicmVhazsKKwljYXNlIC1EV0NfRV9PVkVSRkxPVzoKKwkJc3RhdHVzID0gLUVPVkVSRkxPVzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKHN0YXR1cykgeworCQkJRFdDX1BSSU5URigiVWtub3duIHVyYiBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisKKwkJfQorCX0KKworCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7CisJCWludCBpOworCisJCXVyYi0+ZXJyb3JfY291bnQgPSBkd2Nfb3RnX2hjZF91cmJfZ2V0X2Vycm9yX2NvdW50KGR3Y19vdGdfdXJiKTsKKwkJZm9yIChpID0gMDsgaSA8IHVyYi0+bnVtYmVyX29mX3BhY2tldHM7ICsraSkgeworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5hY3R1YWxfbGVuZ3RoID0KKwkJCSAgICBkd2Nfb3RnX2hjZF91cmJfZ2V0X2lzb19kZXNjX2FjdHVhbF9sZW5ndGgKKwkJCSAgICAoZHdjX290Z191cmIsIGkpOworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5zdGF0dXMgPQorCQkJICAgIGR3Y19vdGdfaGNkX3VyYl9nZXRfaXNvX2Rlc2Nfc3RhdHVzKGR3Y19vdGdfdXJiLCBpKTsKKwkJfQorCX0KKworCXVyYi0+c3RhdHVzID0gc3RhdHVzOworCXVyYi0+aGNwcml2ID0gTlVMTDsKKwlpZiAoIXN0YXR1cykgeworCQlpZiAoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfU0hPUlRfTk9UX09LKSAmJgorCQkgICAgKHVyYi0+YWN0dWFsX2xlbmd0aCA8IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkpIHsKKwkJCXVyYi0+c3RhdHVzID0gLUVSRU1PVEVJTzsKKwkJfQorCX0KKworCWlmICgodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9JU09DSFJPTk9VUykgfHwKKwkgICAgKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSU5URVJSVVBUKSkgeworCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwID0gZHdjX3VyYl90b19lbmRwb2ludCh1cmIpOworCQlpZiAoZXApIHsKKwkJCWZyZWVfYnVzX2JhbmR3aWR0aChkd2Nfb3RnX2hjZF90b19oY2QoaGNkKSwKKwkJCQkJICAgZHdjX290Z19oY2RfZ2V0X2VwX2JhbmR3aWR0aChoY2QsCisJCQkJCQkJCQllcC0+aGNwcml2KSwKKwkJCQkJICAgdXJiKTsKKwkJfQorCX0KKworCURXQ19GUkVFKGR3Y19vdGdfdXJiKTsKKworCURXQ19TUElOVU5MT0NLKGhjZC0+bG9jayk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQorCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGR3Y19vdGdfaGNkX3RvX2hjZChoY2QpLCB1cmIpOworI2Vsc2UKKwl1c2JfaGNkX2dpdmViYWNrX3VyYihkd2Nfb3RnX2hjZF90b19oY2QoaGNkKSwgdXJiLCBzdGF0dXMpOworI2VuZGlmCisJRFdDX1NQSU5MT0NLKGhjZC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkd2Nfb3RnX2hjZF9mdW5jdGlvbl9vcHMgaGNkX2ZvcHMgPSB7CisJLnN0YXJ0ID0gX3N0YXJ0LAorCS5kaXNjb25uZWN0ID0gX2Rpc2Nvbm5lY3QsCisJLmh1Yl9pbmZvID0gX2h1Yl9pbmZvLAorCS5zcGVlZCA9IF9zcGVlZCwKKwkuY29tcGxldGUgPSBfY29tcGxldGUsCisJLmdldF9iX2hucF9lbmFibGUgPSBfZ2V0X2JfaG5wX2VuYWJsZSwKK307CisKKworLyoKKyAqIENvbnRyb2xsZXIgUG9ydCBTdXNwZW5kIFJvdXRpZW5lLgorICovCit2b2lkIGR3Y19vdGdfaG9zdF9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlkd2Nfb3RnX2hvc3RfaWZfdCBob3N0X2lmOworCWhwcnQwX2RhdGFfdCBocHJ0OworCisJaG9zdF9pZi5ocHJ0MCA9IGhjZC0+cmVncyArIERXQ19PVEdfSE9TVF9QT1JUX1JFR1NfT0ZGU0VUOworCisJaHBydC5kMzI9IERXQ19SRUFEX1JFRzMyKGhvc3RfaWYuaHBydDApOworCWhwcnQuYi5wcnRzdXNwID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoaG9zdF9pZi5ocHJ0MCwgaHBydC5kMzIpOworfQorCisKKy8qCisgKiBDb250cm9sbGVyIFBvcnQgUmVzdW1lIFJvdXRpZW5lLgorICovCit2b2lkIGR3Y19vdGdfaG9zdF9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCWR3Y19vdGdfaG9zdF9pZl90IGhvc3RfaWY7CisJaHBydDBfZGF0YV90IGhwcnQ7CisKKwlob3N0X2lmLmhwcnQwID0gaGNkLT5yZWdzICsgRFdDX09UR19IT1NUX1BPUlRfUkVHU19PRkZTRVQ7CisKKwlocHJ0LmQzMj0gRFdDX1JFQURfUkVHMzIoaG9zdF9pZi5ocHJ0MCk7CisJaHBydC5iLnBydHN1c3AgPSAwOworCURXQ19XUklURV9SRUczMihob3N0X2lmLmhwcnQwLCBocHJ0LmQzMik7Cit9CisKKworLyoqCisgKiBJbml0aWFsaXplcyB0aGUgSENELiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yIGFuZCBpbml0aWFsaXplcyB0aGUKKyAqIHN0YXRpYyBwYXJ0cyBvZiB0aGUgdXNiX2hjZCBhbmQgZHdjX290Z19oY2Qgc3RydWN0dXJlcy4gSXQgYWxzbyByZWdpc3RlcnMgdGhlCisgKiBVU0IgYnVzIHdpdGggdGhlIGNvcmUgYW5kIGNhbGxzIHRoZSBoY19kcml2ZXItPnN0YXJ0KCkgZnVuY3Rpb24uIEl0IHJldHVybnMKKyAqIGEgbmVnYXRpdmUgZXJyb3Igb24gZmFpbHVyZS4KKyAqLworaW50IGhjZF9pbml0KAorI2lmZGVmIExNX0lOVEVSRkFDRQorCQkgICAgc3RydWN0IGxtX2RldmljZSAqX2RldgorI2VsaWYgIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwkJICAgIHN0cnVjdCBwY2lfZGV2ICpfZGV2CisjZWxzZQorCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX2RldgorI2VuZGlmCisgICAgKQoreworCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBOVUxMOworCWR3Y19vdGdfaGNkX3QgKmR3Y19vdGdfaGNkID0gTlVMTDsKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEoX2Rldik7CisjZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBwY2lfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJaW50IHJldHZhbCA9IDA7CisKKwlEV0NfREVCVUdQTChEQkdfSENELCAiRFdDIE9URyBIQ0QgSU5JVFxuIik7CisKKwkvKiBTZXQgZGV2aWNlIGZsYWdzIGluZGljYXRpbmcgd2hldGhlciB0aGUgSENEIHN1cHBvcnRzIERNQS4gKi8KKwlpZiAoZHdjX290Z19pc19kbWFfZW5hYmxlKG90Z19kZXYtPmNvcmVfaWYpKSB7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJCV9kZXYtPmRldi5kbWFfbWFzayA9ICh2b2lkICopfjA7CisJCV9kZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IH4wOworI2VsaWYgIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwkJcGNpX3NldF9kbWFfbWFzayhfZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhfZGV2LCBETUFfMzJCSVRfTUFTSyk7CisjZW5kaWYKKworCX0gZWxzZSB7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJCV9kZXYtPmRldi5kbWFfbWFzayA9ICh2b2lkICopMDsKKwkJX2Rldi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrID0gMDsKKyNlbGlmICBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJCXBjaV9zZXRfZG1hX21hc2soX2RldiwgMCk7CisJCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhfZGV2LCAwKTsKKyNlbmRpZgorCX0KKworCS8qCisJICogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYmFzZSBIQ0QgcGx1cyB0aGUgRFdDIE9URyBIQ0QuCisJICogSW5pdGlhbGl6ZSB0aGUgYmFzZSBIQ0QuCisJICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDMwKQorCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZkd2Nfb3RnX2hjX2RyaXZlciwgJl9kZXYtPmRldiwgX2Rldi0+ZGV2LmJ1c19pZCk7CisjZWxzZQorCWhjZCA9IHVzYl9jcmVhdGVfaGNkKCZkd2Nfb3RnX2hjX2RyaXZlciwgJl9kZXYtPmRldiwgZGV2X25hbWUoJl9kZXYtPmRldikpOworCWhjZC0+aGFzX3R0ID0gMTsKKy8vICAgICAgaGNkLT51c2VzX25ld19wb2xsaW5nID0gMTsKKy8vICAgICAgaGNkLT5wb2xsX3JoID0gMDsKKyNlbmRpZgorCWlmICghaGNkKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3IxOworCX0KKworCWhjZC0+cmVncyA9IG90Z19kZXYtPm9zX2RlcC5iYXNlOworCisJLyogSW5pdGlhbGl6ZSB0aGUgRFdDIE9URyBIQ0QuICovCisJZHdjX290Z19oY2QgPSBkd2Nfb3RnX2hjZF9hbGxvY19oY2QoKTsKKwlpZiAoIWR3Y19vdGdfaGNkKSB7CisJCWdvdG8gZXJyb3IyOworCX0KKwkoKHN0cnVjdCB3cmFwcGVyX3ByaXZfZGF0YSAqKShoY2QtPmhjZF9wcml2KSktPmR3Y19vdGdfaGNkID0KKwkgICAgZHdjX290Z19oY2Q7CisJb3RnX2Rldi0+aGNkID0gZHdjX290Z19oY2Q7CisKKwlpZiAoZHdjX290Z19oY2RfaW5pdChkd2Nfb3RnX2hjZCwgb3RnX2Rldi0+Y29yZV9pZikpIHsKKwkJZ290byBlcnJvcjI7CisJfQorCisJb3RnX2Rldi0+aGNkLT5vdGdfZGV2ID0gb3RnX2RldjsKKwloY2QtPnNlbGYub3RnX3BvcnQgPSBkd2Nfb3RnX2hjZF9vdGdfcG9ydChkd2Nfb3RnX2hjZCk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwzMykgLy9kb24ndCBzdXBwb3J0IGZvciBMTSh3aXRoIDIuNi4yMC4xIGtlcm5lbCkKKwkvKiBEb24ndCBzdXBwb3J0IFNHIGxpc3QgYXQgdGhpcyBwb2ludCAqLworCWhjZC0+c2VsZi5zZ190YWJsZXNpemUgPSAwOworI2VuZGlmCisJLyoKKwkgKiBGaW5pc2ggZ2VuZXJpYyBIQ0QgaW5pdGlhbGl6YXRpb24gYW5kIHN0YXJ0IHRoZSBIQ0QuIFRoaXMgZnVuY3Rpb24KKwkgKiBhbGxvY2F0ZXMgdGhlIERNQSBidWZmZXIgcG9vbCwgcmVnaXN0ZXJzIHRoZSBVU0IgYnVzLCByZXF1ZXN0cyB0aGUKKwkgKiBJUlEgbGluZSwgYW5kIGNhbGxzIGhjZF9zdGFydCBtZXRob2QuCisJICovCisJcmV0dmFsID0gdXNiX2FkZF9oY2QoaGNkLCBvdGdfZGV2LT5pcnEsIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZ290byBlcnJvcjI7CisJfQorCisJZHdjX290Z19oY2Rfc2V0X3ByaXZfZGF0YShkd2Nfb3RnX2hjZCwgaGNkKTsKKwlyZXR1cm4gMDsKKworZXJyb3IyOgorCXVzYl9wdXRfaGNkKGhjZCk7CitlcnJvcjE6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBSZW1vdmVzIHRoZSBIQ0QuCisgKiBGcmVlcyBtZW1vcnkgYW5kIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIEhDRCBhbmQgZGVyZWdpc3RlcnMgdGhlIGJ1cy4KKyAqLwordm9pZCBoY2RfcmVtb3ZlKAorI2lmZGVmIExNX0lOVEVSRkFDRQorCQkgICAgICAgc3RydWN0IGxtX2RldmljZSAqX2RldgorI2VsaWYgIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpfZGV2CisjZWxzZQorCQkJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKKyNlbmRpZgorICAgICkKK3sKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEoX2Rldik7CisjZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBwY2lfZ2V0X2RydmRhdGEoX2Rldik7CisjZWxzZQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbmRpZgorCisJZHdjX290Z19oY2RfdCAqZHdjX290Z19oY2Q7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKworCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBSRU1PVkVcbiIpOworCisJaWYgKCFvdGdfZGV2KSB7CisJCURXQ19ERUJVR1BMKERCR19BTlksICIlczogb3RnX2RldiBOVUxMIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJZHdjX290Z19oY2QgPSBvdGdfZGV2LT5oY2Q7CisKKwlpZiAoIWR3Y19vdGdfaGNkKSB7CisJCURXQ19ERUJVR1BMKERCR19BTlksICIlczogb3RnX2Rldi0+aGNkIE5VTEwhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwloY2QgPSBkd2Nfb3RnX2hjZF90b19oY2QoZHdjX290Z19oY2QpOworCisJaWYgKCFoY2QpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0FOWSwKKwkJCSAgICAiJXM6IGR3Y19vdGdfaGNkX3RvX2hjZChkd2Nfb3RnX2hjZCkgTlVMTCFcbiIsCisJCQkgICAgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXVzYl9yZW1vdmVfaGNkKGhjZCk7CisJZHdjX290Z19oY2Rfc2V0X3ByaXZfZGF0YShkd2Nfb3RnX2hjZCwgTlVMTCk7CisJZHdjX290Z19oY2RfcmVtb3ZlKGR3Y19vdGdfaGNkKTsKKwl1c2JfcHV0X2hjZChoY2QpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgTGludXggSEMgRHJpdmVyIEZ1bmN0aW9ucworICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiogSW5pdGlhbGl6ZXMgdGhlIERXQ19vdGcgY29udHJvbGxlciBhbmQgaXRzIHJvb3QgaHViIGFuZCBwcmVwYXJlcyBpdCBmb3IgaG9zdAorICogbW9kZSBvcGVyYXRpb24uIEFjdGl2YXRlcyB0aGUgcm9vdCBwb3J0LiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZQorICogZXJyb3IgY29kZSBvbiBmYWlsdXJlLiAqLworaW50IGhjZF9zdGFydChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCWR3Y19vdGdfaGNkX3QgKmR3Y19vdGdfaGNkID0gaGNkX3RvX2R3Y19vdGdfaGNkKGhjZCk7CisJc3RydWN0IHVzYl9idXMgKmJ1czsKKworCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBTVEFSVFxuIik7CisJYnVzID0gaGNkX3RvX2J1cyhoY2QpOworCisJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisJaWYgKGR3Y19vdGdfaGNkX3N0YXJ0KGR3Y19vdGdfaGNkLCAmaGNkX2ZvcHMpKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIEluaXRpYWxpemUgYW5kIGNvbm5lY3Qgcm9vdCBodWIgaWYgb25lIGlzIG5vdCBhbHJlYWR5IGF0dGFjaGVkICovCisJaWYgKGJ1cy0+cm9vdF9odWIpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkRXQyBPVEcgSENEIEhhcyBSb290IEh1YlxuIik7CisJCS8qIEluZm9ybSB0aGUgSFVCIGRyaXZlciB0byByZXN1bWUuICovCisJCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKGhjZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogSGFsdHMgdGhlIERXQ19vdGcgaG9zdCBtb2RlIG9wZXJhdGlvbnMgaW4gYSBjbGVhbiBtYW5uZXIuIFVTQiB0cmFuc2ZlcnMgYXJlCisgKiBzdG9wcGVkLgorICovCit2b2lkIGhjZF9zdG9wKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJZHdjX290Z19oY2RfdCAqZHdjX290Z19oY2QgPSBoY2RfdG9fZHdjX290Z19oY2QoaGNkKTsKKworCWR3Y19vdGdfaGNkX3N0b3AoZHdjX290Z19oY2QpOworfQorCisvKiogUmV0dXJucyB0aGUgY3VycmVudCBmcmFtZSBudW1iZXIuICovCitzdGF0aWMgaW50IGdldF9mcmFtZV9udW1iZXIoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZCA9IGhjZF90b19kd2Nfb3RnX2hjZChoY2QpOworCisJcmV0dXJuIGR3Y19vdGdfaGNkX2dldF9mcmFtZV9udW1iZXIoZHdjX290Z19oY2QpOworfQorCisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIGR1bXBfdXJiX2luZm8oc3RydWN0IHVyYiAqdXJiLCBjaGFyICpmbl9uYW1lKQoreworCURXQ19QUklOVEYoIiVzLCB1cmIgJXBcbiIsIGZuX25hbWUsIHVyYik7CisJRFdDX1BSSU5URigiICBEZXZpY2UgYWRkcmVzczogJWRcbiIsIHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSkpOworCURXQ19QUklOVEYoIiAgRW5kcG9pbnQ6ICVkLCAlc1xuIiwgdXNiX3BpcGVlbmRwb2ludCh1cmItPnBpcGUpLAorCQkgICAodXNiX3BpcGVpbih1cmItPnBpcGUpID8gIklOIiA6ICJPVVQiKSk7CisJRFdDX1BSSU5URigiICBFbmRwb2ludCB0eXBlOiAlc1xuIiwgKCB7CisJCQkJCSAgICAgY2hhciAqcGlwZXR5cGU7CisJCQkJCSAgICAgc3dpdGNoICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSkgeworY2FzZSBQSVBFX0NPTlRST0w6CitwaXBldHlwZSA9ICJDT05UUk9MIjsgYnJlYWs7IGNhc2UgUElQRV9CVUxLOgorcGlwZXR5cGUgPSAiQlVMSyI7IGJyZWFrOyBjYXNlIFBJUEVfSU5URVJSVVBUOgorcGlwZXR5cGUgPSAiSU5URVJSVVBUIjsgYnJlYWs7IGNhc2UgUElQRV9JU09DSFJPTk9VUzoKK3BpcGV0eXBlID0gIklTT0NIUk9OT1VTIjsgYnJlYWs7IGRlZmF1bHQ6CisJCQkJCSAgICAgcGlwZXR5cGUgPSAiVU5LTk9XTiI7IGJyZWFrO307CisJCQkJCSAgICAgcGlwZXR5cGU7fQorCQkgICApKSA7CisJRFdDX1BSSU5URigiICBTcGVlZDogJXNcbiIsICggeworCQkJCSAgICAgY2hhciAqc3BlZWQ7IHN3aXRjaCAodXJiLT5kZXYtPnNwZWVkKSB7CitjYXNlIFVTQl9TUEVFRF9ISUdIOgorc3BlZWQgPSAiSElHSCI7IGJyZWFrOyBjYXNlIFVTQl9TUEVFRF9GVUxMOgorc3BlZWQgPSAiRlVMTCI7IGJyZWFrOyBjYXNlIFVTQl9TUEVFRF9MT1c6CitzcGVlZCA9ICJMT1ciOyBicmVhazsgZGVmYXVsdDoKKwkJCQkgICAgIHNwZWVkID0gIlVOS05PV04iOyBicmVhazt9OworCQkJCSAgICAgc3BlZWQ7fQorCQkgICApKSA7CisJRFdDX1BSSU5URigiICBNYXggcGFja2V0IHNpemU6ICVkXG4iLAorCQkgICB1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsIHVzYl9waXBlb3V0KHVyYi0+cGlwZSkpKTsKKwlEV0NfUFJJTlRGKCIgIERhdGEgYnVmZmVyIGxlbmd0aDogJWRcbiIsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCk7CisJRFdDX1BSSU5URigiICBUcmFuc2ZlciBidWZmZXI6ICVwLCBUcmFuc2ZlciBETUE6ICVwXG4iLAorCQkgICB1cmItPnRyYW5zZmVyX2J1ZmZlciwgKHZvaWQgKil1cmItPnRyYW5zZmVyX2RtYSk7CisJRFdDX1BSSU5URigiICBTZXR1cCBidWZmZXI6ICVwLCBTZXR1cCBETUE6ICVwXG4iLAorCQkgICB1cmItPnNldHVwX3BhY2tldCwgKHZvaWQgKil1cmItPnNldHVwX2RtYSk7CisJRFdDX1BSSU5URigiICBJbnRlcnZhbDogJWRcbiIsIHVyYi0+aW50ZXJ2YWwpOworCWlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lTT0NIUk9OT1VTKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCQlEV0NfUFJJTlRGKCIgIElTTyBEZXNjICVkOlxuIiwgaSk7CisJCQlEV0NfUFJJTlRGKCIgICAgb2Zmc2V0OiAlZCwgbGVuZ3RoICVkXG4iLAorCQkJCSAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ub2Zmc2V0LAorCQkJCSAgIHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0ubGVuZ3RoKTsKKwkJfQorCX0KK30KKworI2VuZGlmCisKKy8qKiBTdGFydHMgcHJvY2Vzc2luZyBhIFVTQiB0cmFuc2ZlciByZXF1ZXN0IHNwZWNpZmllZCBieSBhIFVTQiBSZXF1ZXN0IEJsb2NrCisgKiAoVVJCKS4gbWVtX2ZsYWdzIGluZGljYXRlcyB0aGUgdHlwZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiB0byB1c2Ugd2hpbGUKKyAqIHByb2Nlc3NpbmcgdGhpcyBVUkIuICovCitzdGF0aWMgaW50IHVyYl9lbnF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQorCQkgICAgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKKyNlbmRpZgorCQkgICAgICAgc3RydWN0IHVyYiAqdXJiLCBnZnBfdCBtZW1fZmxhZ3MpCit7CisJaW50IHJldHZhbCA9IDA7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyOCkKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwID0gdXJiLT5lcDsKKyNlbmRpZgorCWR3Y19vdGdfaGNkX3QgKmR3Y19vdGdfaGNkID0gaGNkX3RvX2R3Y19vdGdfaGNkKGhjZCk7CisJZHdjX290Z19oY2RfdXJiX3QgKmR3Y19vdGdfdXJiOworCWludCBpOworCWludCBhbGxvY19iYW5kd2lkdGggPSAwOworCXVpbnQ4X3QgZXBfdHlwZSA9IDA7CisJdWludDMyX3QgZmxhZ3MgPSAwOworCXZvaWQgKmJ1ZjsKKworI2lmZGVmIERFQlVHCisJaWYgKENIS19ERUJVR19MRVZFTChEQkdfSENEViB8IERCR19IQ0RfVVJCKSkgeworCQlkdW1wX3VyYl9pbmZvKHVyYiwgInVyYl9lbnF1ZXVlIik7CisJfQorI2VuZGlmCisKKwlpZiAoKHVzYl9waXBldHlwZSh1cmItPnBpcGUpID09IFBJUEVfSVNPQ0hST05PVVMpCisJICAgIHx8ICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lOVEVSUlVQVCkpIHsKKwkJaWYgKCFkd2Nfb3RnX2hjZF9pc19iYW5kd2lkdGhfYWxsb2NhdGVkCisJCSAgICAoZHdjX290Z19oY2QsICZlcC0+aGNwcml2KSkgeworCQkJYWxsb2NfYmFuZHdpZHRoID0gMTsKKwkJfQorCX0KKworCXN3aXRjaCAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkpIHsKKwljYXNlIFBJUEVfQ09OVFJPTDoKKwkJZXBfdHlwZSA9IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0w7CisJCWJyZWFrOworCWNhc2UgUElQRV9JU09DSFJPTk9VUzoKKwkJZXBfdHlwZSA9IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M7CisJCWJyZWFrOworCWNhc2UgUElQRV9CVUxLOgorCQllcF90eXBlID0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSzsKKwkJYnJlYWs7CisJY2FzZSBQSVBFX0lOVEVSUlVQVDoKKwkJZXBfdHlwZSA9IFVTQl9FTkRQT0lOVF9YRkVSX0lOVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFdDX1dBUk4oIldyb25nIGVwIHR5cGVcbiIpOworCX0KKworCWR3Y19vdGdfdXJiID0gZHdjX290Z19oY2RfdXJiX2FsbG9jKGR3Y19vdGdfaGNkLAorCQkJCQkgICAgdXJiLT5udW1iZXJfb2ZfcGFja2V0cywKKwkJCQkJICAgIG1lbV9mbGFncyA9PSBHRlBfQVRPTUlDID8gMSA6IDApOworCisJZHdjX290Z19oY2RfdXJiX3NldF9waXBlaW5mbyhkd2Nfb3RnX3VyYiwgdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKSwKKwkJCQkgICAgIHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKSwgZXBfdHlwZSwKKwkJCQkgICAgIHVzYl9waXBlaW4odXJiLT5waXBlKSwKKwkJCQkgICAgIHVzYl9tYXhwYWNrZXQodXJiLT5kZXYsIHVyYi0+cGlwZSwKKwkJCQkJCSAgICEodXNiX3BpcGVpbih1cmItPnBpcGUpKSkpOworCisJYnVmID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJaWYgKGhjZC0+c2VsZi51c2VzX2RtYSkgeworCQkvKgorCQkgKiBDYWxjdWxhdGUgdmlydHVhbCBhZGRyZXNzIGZyb20gcGh5c2ljYWwgYWRkcmVzcywKKwkJICogYmVjYXVzZSBzb21lIGNsYXNzIGRyaXZlciBtYXkgbm90IGZpbGwgdHJhbnNmZXJfYnVmZmVyLgorCQkgKiBJbiBCdWZmZXIgRE1BIG1vZGUgdmlydWFsIGFkZHJlc3MgaXMgdXNlZCwKKwkJICogd2hlbiBoYW5kbGluZyBub24gRFdPUkQgYWxpZ25lZCBidWZmZXJzLgorCQkgKi8KKwkJYnVmID0gcGh5c190b192aXJ0KHVyYi0+dHJhbnNmZXJfZG1hKTsKKwl9CisKKwlpZiAoISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX0lOVEVSUlVQVCkpCisJCWZsYWdzIHw9IFVSQl9HSVZFQkFDS19BU0FQOworCWlmICh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1pFUk9fUEFDS0VUKQorCQlmbGFncyB8PSBVUkJfU0VORF9aRVJPX1BBQ0tFVDsKKworCWR3Y19vdGdfaGNkX3VyYl9zZXRfcGFyYW1zKGR3Y19vdGdfdXJiLCB1cmIsIGJ1ZiwKKwkJCQkgICB1cmItPnRyYW5zZmVyX2RtYSwKKwkJCQkgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJICAgdXJiLT5zZXR1cF9wYWNrZXQsCisJCQkJICAgdXJiLT5zZXR1cF9kbWEsIGZsYWdzLCB1cmItPmludGVydmFsKTsKKworCWZvciAoaSA9IDA7IGkgPCB1cmItPm51bWJlcl9vZl9wYWNrZXRzOyArK2kpIHsKKwkJZHdjX290Z19oY2RfdXJiX3NldF9pc29fZGVzY19wYXJhbXMoZHdjX290Z191cmIsIGksCisJCQkJCQkgICAgdXJiLT4KKwkJCQkJCSAgICBpc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQsCisJCQkJCQkgICAgdXJiLT4KKwkJCQkJCSAgICBpc29fZnJhbWVfZGVzY1tpXS5sZW5ndGgpOworCX0KKworCXVyYi0+aGNwcml2ID0gZHdjX290Z191cmI7CisJcmV0dmFsID0gZHdjX290Z19oY2RfdXJiX2VucXVldWUoZHdjX290Z19oY2QsIGR3Y19vdGdfdXJiLCAmZXAtPmhjcHJpdiwKKwkJCQkJIG1lbV9mbGFncyA9PSBHRlBfQVRPTUlDID8gMSA6IDApOworCWlmICghcmV0dmFsKSB7CisJCWlmIChhbGxvY19iYW5kd2lkdGgpIHsKKwkJCWFsbG9jYXRlX2J1c19iYW5kd2lkdGgoaGNkLAorCQkJCQkgICAgICAgZHdjX290Z19oY2RfZ2V0X2VwX2JhbmR3aWR0aAorCQkJCQkgICAgICAgKGR3Y19vdGdfaGNkLCBlcC0+aGNwcml2KSwgdXJiKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChyZXR2YWwgPT0gLURXQ19FX05PX0RFVklDRSkgeworCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJfQorCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKiBBYm9ydHMvY2FuY2VscyBhIFVTQiB0cmFuc2ZlciByZXF1ZXN0LiBBbHdheXMgcmV0dXJucyAwIHRvIGluZGljYXRlCisgKiBzdWNjZXNzLiAgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjgpCitzdGF0aWMgaW50IHVyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYikKKyNlbHNlCitzdGF0aWMgaW50IHVyYl9kZXF1ZXVlKHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKKyNlbmRpZgoreworCWR3Y19pcnFmbGFnc190IGZsYWdzOworCWR3Y19vdGdfaGNkX3QgKmR3Y19vdGdfaGNkOworCURXQ19ERUJVR1BMKERCR19IQ0QsICJEV0MgT1RHIEhDRCBVUkIgRGVxdWV1ZVxuIik7CisKKwlkd2Nfb3RnX2hjZCA9IGhjZF90b19kd2Nfb3RnX2hjZChoY2QpOworCisjaWZkZWYgREVCVUcKKwlpZiAoQ0hLX0RFQlVHX0xFVkVMKERCR19IQ0RWIHwgREJHX0hDRF9VUkIpKSB7CisJCWR1bXBfdXJiX2luZm8odXJiLCAidXJiX2RlcXVldWUiKTsKKwl9CisjZW5kaWYKKworCURXQ19TUElOTE9DS19JUlFTQVZFKGR3Y19vdGdfaGNkLT5sb2NrLCAmZmxhZ3MpOworCisJZHdjX290Z19oY2RfdXJiX2RlcXVldWUoZHdjX290Z19oY2QsIHVyYi0+aGNwcml2KTsKKworCURXQ19GUkVFKHVyYi0+aGNwcml2KTsKKwl1cmItPmhjcHJpdiA9IE5VTEw7CisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShkd2Nfb3RnX2hjZC0+bG9jaywgZmxhZ3MpOworCisJLyogSGlnaGVyIGxheWVyIHNvZnR3YXJlIHNldHMgVVJCIHN0YXR1cy4gKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjgpCisJdXNiX2hjZF9naXZlYmFja191cmIoaGNkLCB1cmIpOworI2Vsc2UKKwl1c2JfaGNkX2dpdmViYWNrX3VyYihoY2QsIHVyYiwgc3RhdHVzKTsKKyNlbmRpZgorCWlmIChDSEtfREVCVUdfTEVWRUwoREJHX0hDRFYgfCBEQkdfSENEX1VSQikpIHsKKwkJRFdDX1BSSU5URigiQ2FsbGVkIHVzYl9oY2RfZ2l2ZWJhY2tfdXJiKClcbiIpOworCQlEV0NfUFJJTlRGKCIgIHVyYi0+c3RhdHVzID0gJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogRnJlZXMgcmVzb3VyY2VzIGluIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgcmVsYXRlZCB0byBhIGdpdmVuIGVuZHBvaW50LiBBbHNvCisgKiBjbGVhcnMgc3RhdGUgaW4gdGhlIEhDRCByZWxhdGVkIHRvIHRoZSBlbmRwb2ludC4gQW55IFVSQnMgZm9yIHRoZSBlbmRwb2ludAorICogbXVzdCBhbHJlYWR5IGJlIGRlcXVldWVkLiAqLworc3RhdGljIHZvaWQgZW5kcG9pbnRfZGlzYWJsZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKQoreworCWR3Y19vdGdfaGNkX3QgKmR3Y19vdGdfaGNkID0gaGNkX3RvX2R3Y19vdGdfaGNkKGhjZCk7CisKKwlEV0NfREVCVUdQTChEQkdfSENELAorCQkgICAgIkRXQyBPVEcgSENEIEVQIERJU0FCTEU6IF9iRW5kcG9pbnRBZGRyZXNzPTB4JTAyeCwgIgorCQkgICAgImVuZHBvaW50PSVkXG4iLCBlcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzLAorCQkgICAgZHdjX2VwX2FkZHJfdG9fZW5kcG9pbnQoZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcykpOworCWR3Y19vdGdfaGNkX2VuZHBvaW50X2Rpc2FibGUoZHdjX290Z19oY2QsIGVwLT5oY3ByaXYsIDI1MCk7CisJZXAtPmhjcHJpdiA9IE5VTEw7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDMwKQorLyogUmVzZXRzIGVuZHBvaW50IHNwZWNpZmljIHBhcmFtZXRlciB2YWx1ZXMsIGluIGN1cnJlbnQgdmVyc2lvbiB1c2VkIHRvIHJlc2V0CisgKiB0aGUgZGF0YSB0b2dnbGUoYXMgYSBXQSkuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBmcm9tIHVzYl9jbGVhcl9oYWx0IHJvdXRpbmUgKi8KK3N0YXRpYyB2b2lkIGVuZHBvaW50X3Jlc2V0KHN0cnVjdCB1c2JfaGNkICpoY2QsIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXApCit7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBOVUxMOworCWludCBlcG51bSA9IHVzYl9lbmRwb2ludF9udW0oJmVwLT5kZXNjKTsKKwlpbnQgaXNfb3V0ID0gdXNiX2VuZHBvaW50X2Rpcl9vdXQoJmVwLT5kZXNjKTsKKwlpbnQgaXNfY29udHJvbCA9IHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woJmVwLT5kZXNjKTsKKwlkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZCA9IGhjZF90b19kd2Nfb3RnX2hjZChoY2QpOworI2lmZGVmIExNX0lOVEVSRkFDRQorCXN0cnVjdCBsbV9kZXZpY2UgKl9kZXYgPSBkd2Nfb3RnX2hjZC0+b3RnX2Rldi0+b3NfZGVwLmxtZGV2OworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCXN0cnVjdCBwY2lfZGV2ICpfZGV2ID0gZHdjX290Z19oY2QtPm90Z19kZXYtPm9zX2RlcC5wY2lkZXY7CisjZWxzZQorCXN0cnVjdCBkZXZpY2UgKl9kZXYgPSBkd2Nfb3RnX2hjZC0+b3RnX2Rldi0+b3NfZGVwLnBhcmVudDsKKyNlbmRpZgorCisJaWYgKF9kZXYpCisJCXVkZXYgPSB0b191c2JfZGV2aWNlKF9kZXYpOworCWVsc2UKKwkJcmV0dXJuOworCisJRFdDX0RFQlVHUEwoREJHX0hDRCwgIkRXQyBPVEcgSENEIEVQIFJFU0VUOiBFbmRwb2ludCBOdW09MHglMDJkXG4iLCBlcG51bSk7CisKKwlEV0NfU1BJTkxPQ0tfSVJRU0FWRShkd2Nfb3RnX2hjZC0+bG9jaywgJmZsYWdzKTsKKwl1c2Jfc2V0dG9nZ2xlKHVkZXYsIGVwbnVtLCBpc19vdXQsIDApOworCWlmIChpc19jb250cm9sKQorCQl1c2Jfc2V0dG9nZ2xlKHVkZXYsIGVwbnVtLCAhaXNfb3V0LCAwKTsKKworCWlmIChlcC0+aGNwcml2KSB7CisJCWR3Y19vdGdfaGNkX2VuZHBvaW50X3Jlc2V0KGR3Y19vdGdfaGNkLCBlcC0+aGNwcml2KTsKKwl9CisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShkd2Nfb3RnX2hjZC0+bG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKKy8qKiBIYW5kbGVzIGhvc3QgbW9kZSBpbnRlcnJ1cHRzIGZvciB0aGUgRFdDX290ZyBjb250cm9sbGVyLiBSZXR1cm5zIElSUV9OT05FIGlmCisgKiB0aGVyZSB3YXMgbm8gaW50ZXJydXB0IHRvIGhhbmRsZS4gUmV0dXJucyBJUlFfSEFORExFRCBpZiB0aGVyZSB3YXMgYSB2YWxpZAorICogaW50ZXJydXB0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBVU0IgY29yZSB3aGVuIGFuIGludGVycnVwdCBvY2N1cnMgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBkd2Nfb3RnX2hjZF9pcnEoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZCA9IGhjZF90b19kd2Nfb3RnX2hjZChoY2QpOworCWludDMyX3QgcmV0dmFsID0gZHdjX290Z19oY2RfaGFuZGxlX2ludHIoZHdjX290Z19oY2QpOworCWlmIChyZXR2YWwgIT0gMCkgeworCQlTM0MyNDEwWF9DTEVBUl9FSU5UUEVORCgpOworCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChyZXR2YWwpOworfQorCisvKiogQ3JlYXRlcyBTdGF0dXMgQ2hhbmdlIGJpdG1hcCBmb3IgdGhlIHJvb3QgaHViIGFuZCByb290IHBvcnQuIFRoZSBiaXRtYXAgaXMKKyAqIHJldHVybmVkIGluIGJ1Zi4gQml0IDAgaXMgdGhlIHN0YXR1cyBjaGFuZ2UgaW5kaWNhdG9yIGZvciB0aGUgcm9vdCBodWIuIEJpdCAxCisgKiBpcyB0aGUgc3RhdHVzIGNoYW5nZSBpbmRpY2F0b3IgZm9yIHRoZSBzaW5nbGUgcm9vdCBwb3J0LiBSZXR1cm5zIDEgaWYgZWl0aGVyCisgKiBjaGFuZ2UgaW5kaWNhdG9yIGlzIDEsIG90aGVyd2lzZSByZXR1cm5zIDAuICovCitpbnQgaHViX3N0YXR1c19kYXRhKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1ZikKK3sKKwlkd2Nfb3RnX2hjZF90ICpkd2Nfb3RnX2hjZCA9IGhjZF90b19kd2Nfb3RnX2hjZChoY2QpOworCisJYnVmWzBdID0gMDsKKwlidWZbMF0gfD0gKGR3Y19vdGdfaGNkX2lzX3N0YXR1c19jaGFuZ2VkKGR3Y19vdGdfaGNkLCAxKSkgPDwgMTsKKworCXJldHVybiAoYnVmWzBdICE9IDApOworfQorCisvKiogSGFuZGxlcyBodWIgY2xhc3Mtc3BlY2lmaWMgcmVxdWVzdHMuICovCitpbnQgaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwKKwkJdTE2IHR5cGVSZXEsIHUxNiB3VmFsdWUsIHUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGR3Y19vdGdfaGNkX2h1Yl9jb250cm9sKGhjZF90b19kd2Nfb3RnX2hjZChoY2QpLAorCQkJCQkgdHlwZVJlcSwgd1ZhbHVlLCB3SW5kZXgsIGJ1Ziwgd0xlbmd0aCk7CisKKwlzd2l0Y2ggKHJldHZhbCkgeworCWNhc2UgLURXQ19FX0lOVkFMSUQ6CisJCXJldHZhbCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBEV0NfREVWSUNFX09OTFkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19oY2RfcXVldWUuYyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19oY2RfcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDNhOTAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX2hjZF9xdWV1ZS5jCkBAIC0wLDAgKzEsNzI2IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfaGNkX3F1ZXVlLmMgJAorICogJFJldmlzaW9uOiAjNDQgJAorICogJERhdGU6IDIwMTEvMTAvMjYgJAorICogJENoYW5nZTogMTg3MzAyOCAkCisgKgorICogU3lub3BzeXMgSFMgT1RHIExpbnV4IFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbiAoaGVyZWluYWZ0ZXIsCisgKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcworICogb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgKiAKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBEV0NfREVWSUNFX09OTFkKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZnVuY3Rpb25zIHRvIG1hbmFnZSBRdWV1ZSBIZWFkcyBhbmQgUXVldWUKKyAqIFRyYW5zZmVyIERlc2NyaXB0b3JzLgorICovCisKKyNpbmNsdWRlICJkd2Nfb3RnX2hjZC5oIgorI2luY2x1ZGUgImR3Y19vdGdfcmVncy5oIgorCisvKiogCisgKiBGcmVlIGVhY2ggUVREIGluIHRoZSBRSCdzIFFURC1saXN0IHRoZW4gZnJlZSB0aGUgUUguICBRSCBzaG91bGQgYWxyZWFkeSBiZQorICogcmVtb3ZlZCBmcm9tIGEgbGlzdC4gIFFURCBsaXN0IHNob3VsZCBhbHJlYWR5IGJlIGVtcHR5IGlmIGNhbGxlZCBmcm9tIFVSQgorICogRGVxdWV1ZS4KKyAqCisgKiBAcGFyYW0gaGNkIEhDRCBpbnN0YW5jZS4KKyAqIEBwYXJhbSBxaCBUaGUgUUggdG8gZnJlZS4KKyAqLwordm9pZCBkd2Nfb3RnX2hjZF9xaF9mcmVlKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCWR3Y19vdGdfcXRkX3QgKnF0ZCwgKnF0ZF90bXA7CisKKwkvKiBGcmVlIGVhY2ggUVREIGluIHRoZSBRVEQgbGlzdCAqLworCURXQ19TUElOTE9DSyhoY2QtPmxvY2spOworCURXQ19DSVJDTEVRX0ZPUkVBQ0hfU0FGRShxdGQsIHF0ZF90bXAsICZxaC0+cXRkX2xpc3QsIHF0ZF9saXN0X2VudHJ5KSB7CisJCURXQ19DSVJDTEVRX1JFTU9WRSgmcWgtPnF0ZF9saXN0LCBxdGQsIHF0ZF9saXN0X2VudHJ5KTsKKwkJZHdjX290Z19oY2RfcXRkX2ZyZWUocXRkKTsKKwl9CisKKwlpZiAoaGNkLT5jb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJZHdjX290Z19oY2RfcWhfZnJlZV9kZG1hKGhjZCwgcWgpOworCX0gZWxzZSBpZiAocWgtPmR3X2FsaWduX2J1ZikgeworCQl1aW50MzJfdCBidWZfc2l6ZTsKKwkJaWYgKHFoLT5lcF90eXBlID09IFVFX0lTT0NIUk9OT1VTKSB7CisJCQlidWZfc2l6ZSA9IDQwOTY7CisJCX0gZWxzZSB7CisJCQlidWZfc2l6ZSA9IGhjZC0+Y29yZV9pZi0+Y29yZV9wYXJhbXMtPm1heF90cmFuc2Zlcl9zaXplOworCQl9CisJCURXQ19ETUFfRlJFRShidWZfc2l6ZSwgcWgtPmR3X2FsaWduX2J1ZiwgcWgtPmR3X2FsaWduX2J1Zl9kbWEpOworCX0KKworCURXQ19GUkVFKHFoKTsKKwlEV0NfU1BJTlVOTE9DSyhoY2QtPmxvY2spOworCXJldHVybjsKK30KKworI2RlZmluZSBCaXRTdHVmZlRpbWUoYnl0ZWNvdW50KSAgKCg4ICogNyogYnl0ZWNvdW50KSAvIDYpCisjZGVmaW5lIEhTX0hPU1RfREVMQVkJCTUJLyogbmFub3NlY29uZHMgKi8KKyNkZWZpbmUgRlNfTFNfSE9TVF9ERUxBWQkxMDAwCS8qIG5hbm9zZWNvbmRzICovCisjZGVmaW5lIEhVQl9MU19TRVRVUAkJMzMzCS8qIG5hbm9zZWNvbmRzICovCisjZGVmaW5lIE5TX1RPX1VTKG5zKQkJKChucyArIDUwMCkgLyAxMDAwKQorCQkJCS8qIGNvbnZlcnQgJiByb3VuZCBuYW5vc2Vjb25kcyB0byBtaWNyb3NlY29uZHMgKi8KKworc3RhdGljIHVpbnQzMl90IGNhbGNfYnVzX3RpbWUoaW50IHNwZWVkLCBpbnQgaXNfaW4sIGludCBpc19pc29jLCBpbnQgYnl0ZWNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgcmV0dmFsOworCisJc3dpdGNoIChzcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX0hJR0g6CisJCWlmIChpc19pc29jKSB7CisJCQlyZXR2YWwgPQorCQkJICAgICgoMzggKiA4ICogMjA4MykgKworCQkJICAgICAoMjA4MyAqICgzICsgQml0U3R1ZmZUaW1lKGJ5dGVjb3VudCkpKSkgLyAxMDAwICsKKwkJCSAgICBIU19IT1NUX0RFTEFZOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0KKwkJCSAgICAoKDU1ICogOCAqIDIwODMpICsKKwkJCSAgICAgKDIwODMgKiAoMyArIEJpdFN0dWZmVGltZShieXRlY291bnQpKSkpIC8gMTAwMCArCisJCQkgICAgSFNfSE9TVF9ERUxBWTsKKwkJfQorCQlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQlpZiAoaXNfaXNvYykgeworCQkJcmV0dmFsID0KKwkJCSAgICAoODM1NCAqICgzMSArIDEwICogQml0U3R1ZmZUaW1lKGJ5dGVjb3VudCkpKSAvIDEwMDA7CisJCQlpZiAoaXNfaW4pIHsKKwkJCQlyZXR2YWwgPSA3MjY4ICsgRlNfTFNfSE9TVF9ERUxBWSArIHJldHZhbDsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dmFsID0gNjI2NSArIEZTX0xTX0hPU1RfREVMQVkgKyByZXR2YWw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR2YWwgPQorCQkJICAgICg4MzU0ICogKDMxICsgMTAgKiBCaXRTdHVmZlRpbWUoYnl0ZWNvdW50KSkpIC8gMTAwMDsKKwkJCXJldHZhbCA9IDkxMDcgKyBGU19MU19IT1NUX0RFTEFZICsgcmV0dmFsOworCQl9CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX0xPVzoKKwkJaWYgKGlzX2luKSB7CisJCQlyZXR2YWwgPQorCQkJICAgICg2NzY2NyAqICgzMSArIDEwICogQml0U3R1ZmZUaW1lKGJ5dGVjb3VudCkpKSAvCisJCQkgICAgMTAwMDsKKwkJCXJldHZhbCA9CisJCQkgICAgNjQwNjAgKyAoMiAqIEhVQl9MU19TRVRVUCkgKyBGU19MU19IT1NUX0RFTEFZICsKKwkJCSAgICByZXR2YWw7CisJCX0gZWxzZSB7CisJCQlyZXR2YWwgPQorCQkJICAgICg2NjcwMCAqICgzMSArIDEwICogQml0U3R1ZmZUaW1lKGJ5dGVjb3VudCkpKSAvCisJCQkgICAgMTAwMDsKKwkJCXJldHZhbCA9CisJCQkgICAgNjQxMDcgKyAoMiAqIEhVQl9MU19TRVRVUCkgKyBGU19MU19IT1NUX0RFTEFZICsKKwkJCSAgICByZXR2YWw7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRFdDX1dBUk4oIlVua25vd24gZGV2aWNlIHNwZWVkXG4iKTsKKwkJcmV0dmFsID0gLTE7CisJfQorCisJcmV0dXJuIE5TX1RPX1VTKHJldHZhbCk7Cit9CisKKy8qKiAKKyAqIEluaXRpYWxpemVzIGEgUUggc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBoY2QgVGhlIEhDRCBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIHRoZSBEV0MgT1RHIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gcWggIFRoZSBRSCB0byBpbml0LgorICogQHBhcmFtIHVyYiBIb2xkcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZS9lbmRwb2ludCB0aGF0IHdlIG5lZWQKKyAqIAkgICAgICB0byBpbml0aWFsaXplIHRoZSBRSC4gCisgKi8KKyNkZWZpbmUgU0NIRURVTEVfU0xPUCAxMAordm9pZCBxaF9pbml0KGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoLCBkd2Nfb3RnX2hjZF91cmJfdCAqIHVyYikKK3sKKwljaGFyICpzcGVlZCwgKnR5cGU7CisJaW50IGRldl9zcGVlZDsKKwl1aW50MzJfdCBodWJfYWRkciwgaHViX3BvcnQ7CisKKwlkd2NfbWVtc2V0KHFoLCAwLCBzaXplb2YoZHdjX290Z19xaF90KSk7CisKKwkvKiBJbml0aWFsaXplIFFIICovCisJcWgtPmVwX3R5cGUgPSBkd2Nfb3RnX2hjZF9nZXRfcGlwZV90eXBlKCZ1cmItPnBpcGVfaW5mbyk7CisJcWgtPmVwX2lzX2luID0gZHdjX290Z19oY2RfaXNfcGlwZV9pbigmdXJiLT5waXBlX2luZm8pID8gMSA6IDA7CisKKwlxaC0+ZGF0YV90b2dnbGUgPSBEV0NfT1RHX0hDX1BJRF9EQVRBMDsKKwlxaC0+bWF4cCA9IGR3Y19vdGdfaGNkX2dldF9tcHMoJnVyYi0+cGlwZV9pbmZvKTsKKwlEV0NfQ0lSQ0xFUV9JTklUKCZxaC0+cXRkX2xpc3QpOworCURXQ19MSVNUX0lOSVQoJnFoLT5xaF9saXN0X2VudHJ5KTsKKwlxaC0+Y2hhbm5lbCA9IE5VTEw7CisKKwkvKiBGUy9MUyBFbnBvaW50IG9uIEhTIEh1YiAKKwkgKiBOT1QgdmlydHVhbCByb290IGh1YiAqLworCWRldl9zcGVlZCA9IGhjZC0+Zm9wcy0+c3BlZWQoaGNkLCB1cmItPnByaXYpOworCisJaGNkLT5mb3BzLT5odWJfaW5mbyhoY2QsIHVyYi0+cHJpdiwgJmh1Yl9hZGRyLCAmaHViX3BvcnQpOworCXFoLT5kb19zcGxpdCA9IDA7CisKKwlpZiAoKChkZXZfc3BlZWQgPT0gVVNCX1NQRUVEX0xPVykgfHwKKwkgICAgIChkZXZfc3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwpKSAmJgorCSAgICAoaHViX2FkZHIgIT0gMCAmJiBodWJfYWRkciAhPSAxKSkgeworCQlEV0NfREVCVUdQTChEQkdfSENELAorCQkJICAgICJRSCBpbml0OiBFUCAlZDogVFQgZm91bmQgYXQgaHViIGFkZHIgJWQsIGZvciBwb3J0ICVkXG4iLAorCQkJICAgIGR3Y19vdGdfaGNkX2dldF9lcF9udW0oJnVyYi0+cGlwZV9pbmZvKSwgaHViX2FkZHIsCisJCQkgICAgaHViX3BvcnQpOworCQlxaC0+ZG9fc3BsaXQgPSAxOworCX0KKworCWlmIChxaC0+ZXBfdHlwZSA9PSBVRV9JTlRFUlJVUFQgfHwgcWgtPmVwX3R5cGUgPT0gVUVfSVNPQ0hST05PVVMpIHsKKwkJLyogQ29tcHV0ZSBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgb25jZSBhbmQgc2F2ZSB0aGVtLiAqLworCQlocHJ0MF9kYXRhX3QgaHBydDsKKworCQkvKiogQHRvZG8gQWNjb3VudCBmb3Igc3BsaXQgdHJhbnNmZXJzIGluIHRoZSBidXMgdGltZS4gKi8KKwkJaW50IGJ5dGVjb3VudCA9CisJCSAgICBkd2NfaGJfbXVsdChxaC0+bWF4cCkgKiBkd2NfbWF4X3BhY2tldChxaC0+bWF4cCk7CisKKwkJcWgtPnVzZWNzID0KKwkJICAgIGNhbGNfYnVzX3RpbWUoKHFoLT5kb19zcGxpdCA/IFVTQl9TUEVFRF9ISUdIIDogZGV2X3NwZWVkKSwKKwkJCQkgIHFoLT5lcF9pc19pbiwgKHFoLT5lcF90eXBlID09IFVFX0lTT0NIUk9OT1VTKSwKKwkJCQkgIGJ5dGVjb3VudCk7CisJCS8qIFN0YXJ0IGluIGEgc2xpZ2h0bHkgZnV0dXJlIChtaWNybylmcmFtZS4gKi8KKwkJcWgtPnNjaGVkX2ZyYW1lID0gZHdjX2ZyYW1lX251bV9pbmMoaGNkLT5mcmFtZV9udW1iZXIsCisJCQkJCQkgICAgU0NIRURVTEVfU0xPUCk7CisJCXFoLT5pbnRlcnZhbCA9IHVyYi0+aW50ZXJ2YWw7CisKKyNpZiAwCisJCS8qIEluY3JlYXNlIGludGVycnVwdCBwb2xsaW5nIHJhdGUgZm9yIGRlYnVnZ2luZy4gKi8KKwkJaWYgKHFoLT5lcF90eXBlID09IFVFX0lOVEVSUlVQVCkgeworCQkJcWgtPmludGVydmFsID0gODsKKwkJfQorI2VuZGlmCisJCWhwcnQuZDMyID0gRFdDX1JFQURfUkVHMzIoaGNkLT5jb3JlX2lmLT5ob3N0X2lmLT5ocHJ0MCk7CisJCWlmICgoaHBydC5iLnBydHNwZCA9PSBEV0NfSFBSVDBfUFJUU1BEX0hJR0hfU1BFRUQpICYmCisJCSAgICAoKGRldl9zcGVlZCA9PSBVU0JfU1BFRURfTE9XKSB8fAorCQkgICAgIChkZXZfc3BlZWQgPT0gVVNCX1NQRUVEX0ZVTEwpKSkgeworCQkJcWgtPmludGVydmFsICo9IDg7CisJCQlxaC0+c2NoZWRfZnJhbWUgfD0gMHg3OworCQkJcWgtPnN0YXJ0X3NwbGl0X2ZyYW1lID0gcWgtPnNjaGVkX2ZyYW1lOworCQl9CisKKwl9CisKKwlEV0NfREVCVUdQTChEQkdfSENELCAiRFdDIE9URyBIQ0QgUUggSW5pdGlhbGl6ZWRcbiIpOworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiRFdDIE9URyBIQ0QgUUggIC0gcWggPSAlcFxuIiwgcWgpOworCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiRFdDIE9URyBIQ0QgUUggIC0gRGV2aWNlIEFkZHJlc3MgPSAlZFxuIiwKKwkJICAgIGR3Y19vdGdfaGNkX2dldF9kZXZfYWRkcigmdXJiLT5waXBlX2luZm8pKTsKKwlEV0NfREVCVUdQTChEQkdfSENEViwgIkRXQyBPVEcgSENEIFFIICAtIEVuZHBvaW50ICVkLCAlc1xuIiwKKwkJICAgIGR3Y19vdGdfaGNkX2dldF9lcF9udW0oJnVyYi0+cGlwZV9pbmZvKSwKKwkJICAgIGR3Y19vdGdfaGNkX2lzX3BpcGVfaW4oJnVyYi0+cGlwZV9pbmZvKSA/ICJJTiIgOiAiT1VUIik7CisJc3dpdGNoIChkZXZfc3BlZWQpIHsKKwljYXNlIFVTQl9TUEVFRF9MT1c6CisJCXFoLT5kZXZfc3BlZWQgPSBEV0NfT1RHX0VQX1NQRUVEX0xPVzsKKwkJc3BlZWQgPSAibG93IjsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1BFRURfRlVMTDoKKwkJcWgtPmRldl9zcGVlZCA9IERXQ19PVEdfRVBfU1BFRURfRlVMTDsKKwkJc3BlZWQgPSAiZnVsbCI7CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX0hJR0g6CisJCXFoLT5kZXZfc3BlZWQgPSBEV0NfT1RHX0VQX1NQRUVEX0hJR0g7CisJCXNwZWVkID0gImhpZ2giOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzcGVlZCA9ICI/IjsKKwkJYnJlYWs7CisJfQorCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiRFdDIE9URyBIQ0QgUUggIC0gU3BlZWQgPSAlc1xuIiwgc3BlZWQpOworCisJc3dpdGNoIChxaC0+ZXBfdHlwZSkgeworCWNhc2UgVUVfSVNPQ0hST05PVVM6CisJCXR5cGUgPSAiaXNvY2hyb25vdXMiOworCQlicmVhazsKKwljYXNlIFVFX0lOVEVSUlVQVDoKKwkJdHlwZSA9ICJpbnRlcnJ1cHQiOworCQlicmVhazsKKwljYXNlIFVFX0NPTlRST0w6CisJCXR5cGUgPSAiY29udHJvbCI7CisJCWJyZWFrOworCWNhc2UgVUVfQlVMSzoKKwkJdHlwZSA9ICJidWxrIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHlwZSA9ICI/IjsKKwkJYnJlYWs7CisJfQorCisJRFdDX0RFQlVHUEwoREJHX0hDRFYsICJEV0MgT1RHIEhDRCBRSCAgLSBUeXBlID0gJXNcbiIsIHR5cGUpOworCisjaWZkZWYgREVCVUcKKwlpZiAocWgtPmVwX3R5cGUgPT0gVUVfSU5URVJSVVBUKSB7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiRFdDIE9URyBIQ0QgUUggLSB1c2VjcyA9ICVkXG4iLAorCQkJICAgIHFoLT51c2Vjcyk7CisJCURXQ19ERUJVR1BMKERCR19IQ0RWLCAiRFdDIE9URyBIQ0QgUUggLSBpbnRlcnZhbCA9ICVkXG4iLAorCQkJICAgIHFoLT5pbnRlcnZhbCk7CisJfQorI2VuZGlmCisKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBRSC4KKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0Qgc3RhdGUgc3RydWN0dXJlIGZvciB0aGUgRFdDIE9URyBjb250cm9sbGVyLgorICogQHBhcmFtIHVyYiBIb2xkcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZS9lbmRwb2ludCB0aGF0IHdlIG5lZWQKKyAqIAkgICAgICB0byBpbml0aWFsaXplIHRoZSBRSC4KKyAqIEBwYXJhbSBhdG9taWNfYWxsb2MgRmxhZyB0byBkbyBhdG9taWMgYWxsb2NhdGlvbiBpZiBuZWVkZWQKKyAqCisgKiBAcmV0dXJuIFJldHVybnMgcG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIFFILCBvciBOVUxMIG9uIGVycm9yLiAqLworZHdjX290Z19xaF90ICpkd2Nfb3RnX2hjZF9xaF9jcmVhdGUoZHdjX290Z19oY2RfdCAqIGhjZCwKKwkJCQkgICAgZHdjX290Z19oY2RfdXJiX3QgKiB1cmIsIGludCBhdG9taWNfYWxsb2MpCit7CisJZHdjX290Z19xaF90ICpxaDsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSAqLworCS8qKiBAdG9kbyBhZGQgbWVtZmxhZ3MgYXJndW1lbnQgKi8KKwlxaCA9IGR3Y19vdGdfaGNkX3FoX2FsbG9jKGF0b21pY19hbGxvYyk7CisJaWYgKHFoID09IE5VTEwpIHsKKwkJRFdDX0VSUk9SKCJxaCBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlxaF9pbml0KGhjZCwgcWgsIHVyYik7CisKKwlpZiAoaGNkLT5jb3JlX2lmLT5kbWFfZGVzY19lbmFibGUKKwkgICAgJiYgKGR3Y19vdGdfaGNkX3FoX2luaXRfZGRtYShoY2QsIHFoKSA8IDApKSB7CisJCWR3Y19vdGdfaGNkX3FoX2ZyZWUoaGNkLCBxaCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBxaDsKK30KKworLyoqCisgKiBDaGVja3MgdGhhdCBhIGNoYW5uZWwgaXMgYXZhaWxhYmxlIGZvciBhIHBlcmlvZGljIHRyYW5zZmVyLgorICoKKyAqIEByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyaXNlLgorICovCitzdGF0aWMgaW50IHBlcmlvZGljX2NoYW5uZWxfYXZhaWxhYmxlKGR3Y19vdGdfaGNkX3QgKiBoY2QpCit7CisJLyoKKwkgKiBDdXJyZW50bHkgYXNzdW1pbmcgdGhhdCB0aGVyZSBpcyBhIGRlZGljYXRlZCBob3N0IGNoYW5ubmVsIGZvciBlYWNoCisJICogcGVyaW9kaWMgdHJhbnNhY3Rpb24gcGx1cyBhdCBsZWFzdCBvbmUgaG9zdCBjaGFubmVsIGZvcgorCSAqIG5vbi1wZXJpb2RpYyB0cmFuc2FjdGlvbnMuCisJICovCisJaW50IHN0YXR1czsKKwlpbnQgbnVtX2NoYW5uZWxzOworCisJbnVtX2NoYW5uZWxzID0gaGNkLT5jb3JlX2lmLT5jb3JlX3BhcmFtcy0+aG9zdF9jaGFubmVsczsKKwlpZiAoKGhjZC0+cGVyaW9kaWNfY2hhbm5lbHMgKyBoY2QtPm5vbl9wZXJpb2RpY19jaGFubmVscyA8IG51bV9jaGFubmVscykKKwkgICAgJiYgKGhjZC0+cGVyaW9kaWNfY2hhbm5lbHMgPCBudW1fY2hhbm5lbHMgLSAxKSkgeworCQlzdGF0dXMgPSAwOworCX0gZWxzZSB7CisJCURXQ19JTkZPKCIlczogVG90YWwgY2hhbm5lbHM6ICVkLCBQZXJpb2RpYzogJWQsIE5vbi1wZXJpb2RpYzogJWRcbiIsCisJCQlfX2Z1bmNfXywgbnVtX2NoYW5uZWxzLCBoY2QtPnBlcmlvZGljX2NoYW5uZWxzLCBoY2QtPm5vbl9wZXJpb2RpY19jaGFubmVscyk7CS8vTk9USUNFCisJCXN0YXR1cyA9IC1EV0NfRV9OT19TUEFDRTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgYmFuZHdpZHRoIGZvciB0aGUgc3BlY2lmaWVkIFFIIGluIHRoZQorICogcGVyaW9kaWMgc2NoZWR1bGUuIEZvciBzaW1wbGljaXR5LCB0aGlzIGNhbGN1bGF0aW9uIGFzc3VtZXMgdGhhdCBhbGwgdGhlCisgKiB0cmFuc2ZlcnMgaW4gdGhlIHBlcmlvZGljIHNjaGVkdWxlIG1heSBvY2N1ciBpbiB0aGUgc2FtZSAobWljcm8pZnJhbWUuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENEIHN0YXRlIHN0cnVjdHVyZSBmb3IgdGhlIERXQyBPVEcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBxaCBRSCBjb250YWluaW5nIHBlcmlvZGljIGJhbmR3aWR0aCByZXF1aXJlZC4KKyAqCisgKiBAcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfcGVyaW9kaWNfYmFuZHdpZHRoKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCWludCBzdGF0dXM7CisJaW50MTZfdCBtYXhfY2xhaW1lZF91c2VjczsKKworCXN0YXR1cyA9IDA7CisKKwlpZiAoKHFoLT5kZXZfc3BlZWQgPT0gRFdDX09UR19FUF9TUEVFRF9ISUdIKSB8fCBxaC0+ZG9fc3BsaXQpIHsKKwkJLyoKKwkJICogSGlnaCBzcGVlZCBtb2RlLgorCQkgKiBNYXggcGVyaW9kaWMgdXNlY3MgaXMgODAlIHggMTI1IHVzZWMgPSAxMDAgdXNlYy4KKwkJICovCisKKwkJbWF4X2NsYWltZWRfdXNlY3MgPSAxMDAgLSBxaC0+dXNlY3M7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRnVsbCBzcGVlZCBtb2RlLgorCQkgKiBNYXggcGVyaW9kaWMgdXNlY3MgaXMgOTAlIHggMTAwMCB1c2VjID0gOTAwIHVzZWMuCisJCSAqLworCQltYXhfY2xhaW1lZF91c2VjcyA9IDkwMCAtIHFoLT51c2VjczsKKwl9CisKKwlpZiAoaGNkLT5wZXJpb2RpY191c2VjcyA+IG1heF9jbGFpbWVkX3VzZWNzKSB7CisJCURXQ19JTkZPKCIlczogYWxyZWFkeSBjbGFpbWVkIHVzZWNzICVkLCByZXF1aXJlZCB1c2VjcyAlZFxuIiwgX19mdW5jX18sIGhjZC0+cGVyaW9kaWNfdXNlY3MsIHFoLT51c2Vjcyk7CS8vTk9USUNFCisJCXN0YXR1cyA9IC1EV0NfRV9OT19TUEFDRTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIENoZWNrcyB0aGF0IHRoZSBtYXggdHJhbnNmZXIgc2l6ZSBhbGxvd2VkIGluIGEgaG9zdCBjaGFubmVsIGlzIGxhcmdlIGVub3VnaAorICogdG8gaGFuZGxlIHRoZSBtYXhpbXVtIGRhdGEgdHJhbnNmZXIgaW4gYSBzaW5nbGUgKG1pY3JvKWZyYW1lIGZvciBhIHBlcmlvZGljCisgKiB0cmFuc2Zlci4KKyAqCisgKiBAcGFyYW0gaGNkIFRoZSBIQ0Qgc3RhdGUgc3RydWN0dXJlIGZvciB0aGUgRFdDIE9URyBjb250cm9sbGVyLgorICogQHBhcmFtIHFoIFFIIGZvciBhIHBlcmlvZGljIGVuZHBvaW50LgorICoKKyAqIEByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBjaGVja19tYXhfeGZlcl9zaXplKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCWludCBzdGF0dXM7CisJdWludDMyX3QgbWF4X3hmZXJfc2l6ZTsKKwl1aW50MzJfdCBtYXhfY2hhbm5lbF94ZmVyX3NpemU7CisKKwlzdGF0dXMgPSAwOworCisJbWF4X3hmZXJfc2l6ZSA9IGR3Y19tYXhfcGFja2V0KHFoLT5tYXhwKSAqIGR3Y19oYl9tdWx0KHFoLT5tYXhwKTsKKwltYXhfY2hhbm5lbF94ZmVyX3NpemUgPSBoY2QtPmNvcmVfaWYtPmNvcmVfcGFyYW1zLT5tYXhfdHJhbnNmZXJfc2l6ZTsKKworCWlmIChtYXhfeGZlcl9zaXplID4gbWF4X2NoYW5uZWxfeGZlcl9zaXplKSB7CisJCURXQ19JTkZPKCIlczogUGVyaW9kaWMgeGZlciBsZW5ndGggJWQgPiAiICJtYXggeGZlciBsZW5ndGggZm9yIGNoYW5uZWwgJWRcbiIsCisJCQkJX19mdW5jX18sIG1heF94ZmVyX3NpemUsIG1heF9jaGFubmVsX3hmZXJfc2l6ZSk7CS8vTk9USUNFCisJCXN0YXR1cyA9IC1EV0NfRV9OT19TUEFDRTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFNjaGVkdWxlcyBhbiBpbnRlcnJ1cHQgb3IgaXNvY2hyb25vdXMgdHJhbnNmZXIgaW4gdGhlIHBlcmlvZGljIHNjaGVkdWxlLgorICoKKyAqIEBwYXJhbSBoY2QgVGhlIEhDRCBzdGF0ZSBzdHJ1Y3R1cmUgZm9yIHRoZSBEV0MgT1RHIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gcWggUUggZm9yIHRoZSBwZXJpb2RpYyB0cmFuc2Zlci4gVGhlIFFIIHNob3VsZCBhbHJlYWR5IGNvbnRhaW4gdGhlCisgKiBzY2hlZHVsaW5nIGluZm9ybWF0aW9uLgorICoKKyAqIEByZXR1cm4gMCBpZiBzdWNjZXNzZnVsLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBzY2hlZHVsZV9wZXJpb2RpYyhkd2Nfb3RnX2hjZF90ICogaGNkLCBkd2Nfb3RnX3FoX3QgKiBxaCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCXN0YXR1cyA9IHBlcmlvZGljX2NoYW5uZWxfYXZhaWxhYmxlKGhjZCk7CisJaWYgKHN0YXR1cykgeworCQlEV0NfSU5GTygiJXM6IE5vIGhvc3QgY2hhbm5lbCBhdmFpbGFibGUgZm9yIHBlcmlvZGljICIgInRyYW5zZmVyLlxuIiwgX19mdW5jX18pOwkvL05PVElDRQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGNoZWNrX3BlcmlvZGljX2JhbmR3aWR0aChoY2QsIHFoKTsKKwlpZiAoc3RhdHVzKSB7CisJCURXQ19JTkZPKCIlczogSW5zdWZmaWNpZW50IHBlcmlvZGljIGJhbmR3aWR0aCBmb3IgIiAicGVyaW9kaWMgdHJhbnNmZXIuXG4iLCBfX2Z1bmNfXyk7CS8vTk9USUNFCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJc3RhdHVzID0gY2hlY2tfbWF4X3hmZXJfc2l6ZShoY2QsIHFoKTsKKwlpZiAoc3RhdHVzKSB7CisJCURXQ19JTkZPKCIlczogQ2hhbm5lbCBtYXggdHJhbnNmZXIgc2l6ZSB0b28gc21hbGwgIiAiZm9yIHBlcmlvZGljIHRyYW5zZmVyLlxuIiwgX19mdW5jX18pOwkvL05PVElDRQorCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWlmIChoY2QtPmNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkvKiBEb24ndCByZWx5IG9uIFNPRiBhbmQgc3RhcnQgaW4gcmVhZHkgc2NoZWR1bGUgKi8KKwkJRFdDX0xJU1RfSU5TRVJUX1RBSUwoJmhjZC0+cGVyaW9kaWNfc2NoZWRfcmVhZHksICZxaC0+cWhfbGlzdF9lbnRyeSk7CisJfQorCWVsc2UgeworCS8qIEFsd2F5cyBzdGFydCBpbiB0aGUgaW5hY3RpdmUgc2NoZWR1bGUuICovCisJRFdDX0xJU1RfSU5TRVJUX1RBSUwoJmhjZC0+cGVyaW9kaWNfc2NoZWRfaW5hY3RpdmUsICZxaC0+cWhfbGlzdF9lbnRyeSk7CisJfQorCisJLyogUmVzZXJ2ZSB0aGUgcGVyaW9kaWMgY2hhbm5lbC4gKi8KKwloY2QtPnBlcmlvZGljX2NoYW5uZWxzKys7CisKKwkvKiBVcGRhdGUgY2xhaW1lZCB1c2VjcyBwZXIgKG1pY3JvKWZyYW1lLiAqLworCWhjZC0+cGVyaW9kaWNfdXNlY3MgKz0gcWgtPnVzZWNzOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBRSCB0byBlaXRoZXIgdGhlIG5vbiBwZXJpb2RpYyBvciBwZXJpb2RpYyBzY2hlZHVsZSBpZgorICogaXQgaXMgbm90IGFscmVhZHkgaW4gdGhlIHNjaGVkdWxlLiBJZiB0aGUgUUggaXMgYWxyZWFkeSBpbiB0aGUgc2NoZWR1bGUsIG5vCisgKiBhY3Rpb24gaXMgdGFrZW4uCisgKgorICogQHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHdjX290Z19oY2RfcWhfYWRkKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCWludCBzdGF0dXMgPSAwOworCWdpbnRtc2tfZGF0YV90IGludHJfbWFzayA9IHsuZDMyID0gMCB9OworCisJaWYgKCFEV0NfTElTVF9FTVBUWSgmcWgtPnFoX2xpc3RfZW50cnkpKSB7CisJCS8qIFFIIGFscmVhZHkgaW4gYSBzY2hlZHVsZS4gKi8KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBBZGQgdGhlIG5ldyBRSCB0byB0aGUgYXBwcm9wcmlhdGUgc2NoZWR1bGUgKi8KKwlpZiAoZHdjX3FoX2lzX25vbl9wZXIocWgpKSB7CisJCS8qIEFsd2F5cyBzdGFydCBpbiB0aGUgaW5hY3RpdmUgc2NoZWR1bGUuICovCisJCURXQ19MSVNUX0lOU0VSVF9UQUlMKCZoY2QtPm5vbl9wZXJpb2RpY19zY2hlZF9pbmFjdGl2ZSwKKwkJCQkgICAgICZxaC0+cWhfbGlzdF9lbnRyeSk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gc2NoZWR1bGVfcGVyaW9kaWMoaGNkLCBxaCk7CisJCWlmICggIWhjZC0+cGVyaW9kaWNfcWhfY291bnQgKSB7CisJCQlpbnRyX21hc2suYi5zb2ZpbnRyID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmhjZC0+Y29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaywKKwkJCQkJCQkJaW50cl9tYXNrLmQzMiwgaW50cl9tYXNrLmQzMik7CisJCX0KKwkJaGNkLT5wZXJpb2RpY19xaF9jb3VudCsrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhbiBpbnRlcnJ1cHQgb3IgaXNvY2hyb25vdXMgdHJhbnNmZXIgZnJvbSB0aGUgcGVyaW9kaWMgc2NoZWR1bGUuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENEIHN0YXRlIHN0cnVjdHVyZSBmb3IgdGhlIERXQyBPVEcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBxaCBRSCBmb3IgdGhlIHBlcmlvZGljIHRyYW5zZmVyLgorICovCitzdGF0aWMgdm9pZCBkZXNjaGVkdWxlX3BlcmlvZGljKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCURXQ19MSVNUX1JFTU9WRV9JTklUKCZxaC0+cWhfbGlzdF9lbnRyeSk7CisKKwkvKiBSZWxlYXNlIHRoZSBwZXJpb2RpYyBjaGFubmVsIHJlc2VydmF0aW9uLiAqLworCWhjZC0+cGVyaW9kaWNfY2hhbm5lbHMtLTsKKworCS8qIFVwZGF0ZSBjbGFpbWVkIHVzZWNzIHBlciAobWljcm8pZnJhbWUuICovCisJaGNkLT5wZXJpb2RpY191c2VjcyAtPSBxaC0+dXNlY3M7Cit9CisKKy8qKiAKKyAqIFJlbW92ZXMgYSBRSCBmcm9tIGVpdGhlciB0aGUgbm9uLXBlcmlvZGljIG9yIHBlcmlvZGljIHNjaGVkdWxlLiAgTWVtb3J5IGlzCisgKiBub3QgZnJlZWQuCisgKgorICogQHBhcmFtIGhjZCBUaGUgSENEIHN0YXRlIHN0cnVjdHVyZS4KKyAqIEBwYXJhbSBxaCBRSCB0byByZW1vdmUgZnJvbSBzY2hlZHVsZS4gKi8KK3ZvaWQgZHdjX290Z19oY2RfcWhfcmVtb3ZlKGR3Y19vdGdfaGNkX3QgKiBoY2QsIGR3Y19vdGdfcWhfdCAqIHFoKQoreworCWdpbnRtc2tfZGF0YV90IGludHJfbWFzayA9IHsuZDMyID0gMCB9OworCisJaWYgKERXQ19MSVNUX0VNUFRZKCZxaC0+cWhfbGlzdF9lbnRyeSkpIHsKKwkJLyogUUggaXMgbm90IGluIGEgc2NoZWR1bGUuICovCisJCXJldHVybjsKKwl9CisKKwlpZiAoZHdjX3FoX2lzX25vbl9wZXIocWgpKSB7CisJCWlmIChoY2QtPm5vbl9wZXJpb2RpY19xaF9wdHIgPT0gJnFoLT5xaF9saXN0X2VudHJ5KSB7CisJCQloY2QtPm5vbl9wZXJpb2RpY19xaF9wdHIgPQorCQkJICAgIGhjZC0+bm9uX3BlcmlvZGljX3FoX3B0ci0+bmV4dDsKKwkJfQorCQlEV0NfTElTVF9SRU1PVkVfSU5JVCgmcWgtPnFoX2xpc3RfZW50cnkpOworCX0gZWxzZSB7CisJCWRlc2NoZWR1bGVfcGVyaW9kaWMoaGNkLCBxaCk7CisJCWhjZC0+cGVyaW9kaWNfcWhfY291bnQtLTsKKwkJaWYoICFoY2QtPnBlcmlvZGljX3FoX2NvdW50ICkgeworCQkJaW50cl9tYXNrLmIuc29maW50ciA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmaGNkLT5jb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLAorCQkJCQkJCQkJaW50cl9tYXNrLmQzMiwgMCk7CisJCX0KKwl9Cit9CisKKy8qKgorICogRGVhY3RpdmF0ZXMgYSBRSC4gRm9yIG5vbi1wZXJpb2RpYyBRSHMsIHJlbW92ZXMgdGhlIFFIIGZyb20gdGhlIGFjdGl2ZQorICogbm9uLXBlcmlvZGljIHNjaGVkdWxlLiBUaGUgUUggaXMgYWRkZWQgdG8gdGhlIGluYWN0aXZlIG5vbi1wZXJpb2RpYworICogc2NoZWR1bGUgaWYgYW55IFFURHMgYXJlIHN0aWxsIGF0dGFjaGVkIHRvIHRoZSBRSC4KKyAqCisgKiBGb3IgcGVyaW9kaWMgUUhzLCB0aGUgUUggaXMgcmVtb3ZlZCBmcm9tIHRoZSBwZXJpb2RpYyBxdWV1ZWQgc2NoZWR1bGUuIElmCisgKiB0aGVyZSBhcmUgYW55IFFURHMgc3RpbGwgYXR0YWNoZWQgdG8gdGhlIFFILCB0aGUgUUggaXMgYWRkZWQgdG8gZWl0aGVyIHRoZQorICogcGVyaW9kaWMgaW5hY3RpdmUgc2NoZWR1bGUgb3IgdGhlIHBlcmlvZGljIHJlYWR5IHNjaGVkdWxlIGFuZCBpdHMgbmV4dAorICogc2NoZWR1bGVkIGZyYW1lIGlzIGNhbGN1bGF0ZWQuIFRoZSBRSCBpcyBwbGFjZWQgaW4gdGhlIHJlYWR5IHNjaGVkdWxlIGlmCisgKiB0aGUgc2NoZWR1bGVkIGZyYW1lIGhhcyBiZWVuIHJlYWNoZWQgYWxyZWFkeS4gT3RoZXJ3aXNlIGl0J3MgcGxhY2VkIGluIHRoZQorICogaW5hY3RpdmUgc2NoZWR1bGUuIElmIHRoZXJlIGFyZSBubyBRVERzIGF0dGFjaGVkIHRvIHRoZSBRSCwgdGhlIFFIIGlzCisgKiBjb21wbGV0ZWx5IHJlbW92ZWQgZnJvbSB0aGUgcGVyaW9kaWMgc2NoZWR1bGUuCisgKi8KK3ZvaWQgZHdjX290Z19oY2RfcWhfZGVhY3RpdmF0ZShkd2Nfb3RnX2hjZF90ICogaGNkLCBkd2Nfb3RnX3FoX3QgKiBxaCwKKwkJCSAgICAgICBpbnQgc2NoZWRfbmV4dF9wZXJpb2RpY19zcGxpdCkKK3sJCisJaWYgKGR3Y19xaF9pc19ub25fcGVyKHFoKSkgeworCQlkd2Nfb3RnX2hjZF9xaF9yZW1vdmUoaGNkLCBxaCk7CisJCWlmICghRFdDX0NJUkNMRVFfRU1QVFkoJnFoLT5xdGRfbGlzdCkpIHsKKwkJCS8qIEFkZCBiYWNrIHRvIGluYWN0aXZlIG5vbi1wZXJpb2RpYyBzY2hlZHVsZS4gKi8KKwkJCWR3Y19vdGdfaGNkX3FoX2FkZChoY2QsIHFoKTsKKwkJfQorCX0gZWxzZSB7CisJCXVpbnQxNl90IGZyYW1lX251bWJlciA9IGR3Y19vdGdfaGNkX2dldF9mcmFtZV9udW1iZXIoaGNkKTsKKworCQlpZiAocWgtPmRvX3NwbGl0KSB7CisJCQkvKiBTY2hlZHVsZSB0aGUgbmV4dCBjb250aW51aW5nIHBlcmlvZGljIHNwbGl0IHRyYW5zZmVyICovCisJCQlpZiAoc2NoZWRfbmV4dF9wZXJpb2RpY19zcGxpdCkgeworCisJCQkJcWgtPnNjaGVkX2ZyYW1lID0gZnJhbWVfbnVtYmVyOworCQkJCWlmIChkd2NfZnJhbWVfbnVtX2xlKGZyYW1lX251bWJlciwKKwkJCQkJCSAgICAgZHdjX2ZyYW1lX251bV9pbmMKKwkJCQkJCSAgICAgKHFoLT5zdGFydF9zcGxpdF9mcmFtZSwKKwkJCQkJCSAgICAgIDEpKSkgeworCQkJCQkvKgorCQkJCQkgKiBBbGxvdyBvbmUgZnJhbWUgdG8gZWxhcHNlIGFmdGVyIHN0YXJ0CisJCQkJCSAqIHNwbGl0IG1pY3JvZnJhbWUgYmVmb3JlIHNjaGVkdWxpbmcKKwkJCQkJICogY29tcGxldGUgc3BsaXQsIGJ1dCBET05UIGlmIHdlIGFyZQorCQkJCQkgKiBkb2luZyB0aGUgbmV4dCBzdGFydCBzcGxpdCBpbiB0aGUKKwkJCQkJICogc2FtZSBmcmFtZSBmb3IgYW4gSVNPQyBvdXQuCisJCQkJCSAqLworCQkJCQlpZiAoKHFoLT5lcF90eXBlICE9IFVFX0lTT0NIUk9OT1VTKSB8fAorCQkJCQkgICAgKHFoLT5lcF9pc19pbiAhPSAwKSkgeworCQkJCQkJcWgtPnNjaGVkX2ZyYW1lID0KKwkJCQkJCSAgICBkd2NfZnJhbWVfbnVtX2luYyhxaC0+c2NoZWRfZnJhbWUsIDEpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlxaC0+c2NoZWRfZnJhbWUgPQorCQkJCSAgICBkd2NfZnJhbWVfbnVtX2luYyhxaC0+c3RhcnRfc3BsaXRfZnJhbWUsCisJCQkJCQkgICAgICBxaC0+aW50ZXJ2YWwpOworCQkJCWlmIChkd2NfZnJhbWVfbnVtX2xlCisJCQkJICAgIChxaC0+c2NoZWRfZnJhbWUsIGZyYW1lX251bWJlcikpIHsKKwkJCQkJcWgtPnNjaGVkX2ZyYW1lID0gZnJhbWVfbnVtYmVyOworCQkJCX0KKwkJCQlxaC0+c2NoZWRfZnJhbWUgfD0gMHg3OworCQkJCXFoLT5zdGFydF9zcGxpdF9mcmFtZSA9IHFoLT5zY2hlZF9mcmFtZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXFoLT5zY2hlZF9mcmFtZSA9CisJCQkgICAgZHdjX2ZyYW1lX251bV9pbmMocWgtPnNjaGVkX2ZyYW1lLCBxaC0+aW50ZXJ2YWwpOworCQkJaWYgKGR3Y19mcmFtZV9udW1fbGUocWgtPnNjaGVkX2ZyYW1lLCBmcmFtZV9udW1iZXIpKSB7CisJCQkJcWgtPnNjaGVkX2ZyYW1lID0gZnJhbWVfbnVtYmVyOworCQkJfQorCQl9CisKKwkJaWYgKERXQ19DSVJDTEVRX0VNUFRZKCZxaC0+cXRkX2xpc3QpKSB7CisJCQlkd2Nfb3RnX2hjZF9xaF9yZW1vdmUoaGNkLCBxaCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUmVtb3ZlIGZyb20gcGVyaW9kaWNfc2NoZWRfcXVldWVkIGFuZCBtb3ZlIHRvCisJCQkgKiBhcHByb3ByaWF0ZSBxdWV1ZS4KKwkJCSAqLworCQkJaWYgKHFoLT5zY2hlZF9mcmFtZSA9PSBmcmFtZV9udW1iZXIpIHsKKwkJCQlEV0NfTElTVF9NT1ZFX0hFQUQoJmhjZC0+cGVyaW9kaWNfc2NoZWRfcmVhZHksCisJCQkJCQkgICAmcWgtPnFoX2xpc3RfZW50cnkpOworCQkJfSBlbHNlIHsKKwkJCQlEV0NfTElTVF9NT1ZFX0hFQUQKKwkJCQkgICAgKCZoY2QtPnBlcmlvZGljX3NjaGVkX2luYWN0aXZlLAorCQkJCSAgICAgJnFoLT5xaF9saXN0X2VudHJ5KTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqIAorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGEgUVRELiAKKyAqCisgKiBAcGFyYW0gdXJiIFRoZSBVUkIgdG8gY3JlYXRlIGEgUVREIGZyb20uICBFYWNoIFVSQi1RVEQgcGFpciB3aWxsIGVuZCB1cAorICogCSAgICAgIHBvaW50aW5nIHRvIGVhY2ggb3RoZXIgc28gZWFjaCBwYWlyIHNob3VsZCBoYXZlIGEgdW5pcXVlIGNvcnJlbGF0aW9uLgorICogQHBhcmFtIGF0b21pY19hbGxvYyBGbGFnIHRvIGRvIGF0b21pYyBhbGxvYyBpZiBuZWVkZWQKKyAqCisgKiBAcmV0dXJuIFJldHVybnMgcG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIFFURCwgb3IgTlVMTCBvbiBlcnJvci4gKi8KK2R3Y19vdGdfcXRkX3QgKmR3Y19vdGdfaGNkX3F0ZF9jcmVhdGUoZHdjX290Z19oY2RfdXJiX3QgKiB1cmIsIGludCBhdG9taWNfYWxsb2MpCit7CisJZHdjX290Z19xdGRfdCAqcXRkOworCisJcXRkID0gZHdjX290Z19oY2RfcXRkX2FsbG9jKGF0b21pY19hbGxvYyk7CisJaWYgKHF0ZCA9PSBOVUxMKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWR3Y19vdGdfaGNkX3F0ZF9pbml0KHF0ZCwgdXJiKTsKKwlyZXR1cm4gcXRkOworfQorCisvKiogCisgKiBJbml0aWFsaXplcyBhIFFURCBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIHF0ZCBUaGUgUVREIHRvIGluaXRpYWxpemUuCisgKiBAcGFyYW0gdXJiIFRoZSBVUkIgdG8gdXNlIGZvciBpbml0aWFsaXphdGlvbi4gICovCit2b2lkIGR3Y19vdGdfaGNkX3F0ZF9pbml0KGR3Y19vdGdfcXRkX3QgKiBxdGQsIGR3Y19vdGdfaGNkX3VyYl90ICogdXJiKQoreworCWR3Y19tZW1zZXQocXRkLCAwLCBzaXplb2YoZHdjX290Z19xdGRfdCkpOworCXF0ZC0+dXJiID0gdXJiOworCWlmIChkd2Nfb3RnX2hjZF9nZXRfcGlwZV90eXBlKCZ1cmItPnBpcGVfaW5mbykgPT0gVUVfQ09OVFJPTCkgeworCQkvKgorCQkgKiBUaGUgb25seSB0aW1lIHRoZSBRVEQgZGF0YSB0b2dnbGUgaXMgdXNlZCBpcyBvbiB0aGUgZGF0YQorCQkgKiBwaGFzZSBvZiBjb250cm9sIHRyYW5zZmVycy4gVGhpcyBwaGFzZSBhbHdheXMgc3RhcnRzIHdpdGgKKwkJICogREFUQTEuCisJCSAqLworCQlxdGQtPmRhdGFfdG9nZ2xlID0gRFdDX09UR19IQ19QSURfREFUQTE7CisJCXF0ZC0+Y29udHJvbF9waGFzZSA9IERXQ19PVEdfQ09OVFJPTF9TRVRVUDsKKwl9CisKKwkvKiBzdGFydCBzcGxpdCAqLworCXF0ZC0+Y29tcGxldGVfc3BsaXQgPSAwOworCXF0ZC0+aXNvY19zcGxpdF9wb3MgPSBEV0NfSENTUExJVF9YQUNUUE9TX0FMTDsKKwlxdGQtPmlzb2Nfc3BsaXRfb2Zmc2V0ID0gMDsKKwlxdGQtPmluX3Byb2Nlc3MgPSAwOworCisJLyogU3RvcmUgdGhlIHF0ZCBwdHIgaW4gdGhlIHVyYiB0byByZWZlcmVuY2Ugd2hhdCBRVEQuICovCisJdXJiLT5xdGQgPSBxdGQ7CisJcmV0dXJuOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYWRkcyBhIFFURCB0byB0aGUgUVRELWxpc3Qgb2YgYSBRSC4gIEl0IHdpbGwgZmluZCB0aGUgY29ycmVjdAorICogUUggdG8gcGxhY2UgdGhlIFFURCBpbnRvLiAgSWYgaXQgZG9lcyBub3QgZmluZCBhIFFILCB0aGVuIGl0IHdpbGwgY3JlYXRlIGEKKyAqIG5ldyBRSC4gSWYgdGhlIFFIIHRvIHdoaWNoIHRoZSBRVEQgaXMgYWRkZWQgaXMgbm90IGN1cnJlbnRseSBzY2hlZHVsZWQsIGl0CisgKiBpcyBwbGFjZWQgaW50byB0aGUgcHJvcGVyIHNjaGVkdWxlIGJhc2VkIG9uIGl0cyBFUCB0eXBlLgorICoKKyAqIEBwYXJhbVtpbl0gcXRkIFRoZSBRVEQgdG8gYWRkCisgKiBAcGFyYW1baW5dIGhjZCBUaGUgRFdDIEhDRCBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtvdXRdIHFoIG91dCBwYXJhbWV0ZXIgdG8gcmV0dXJuIHF1ZXVlIGhlYWQKKyAqIEBwYXJhbSBhdG9taWNfYWxsb2MgRmxhZyB0byBkbyBhdG9taWMgYWxsb2MgaWYgbmVlZGVkCisgKgorICogQHJldHVybiAwIGlmIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHdjX290Z19oY2RfcXRkX2FkZChkd2Nfb3RnX3F0ZF90ICogcXRkLAorCQkJZHdjX290Z19oY2RfdCAqIGhjZCwgZHdjX290Z19xaF90ICoqIHFoLCBpbnQgYXRvbWljX2FsbG9jKQoreworCWludCByZXR2YWwgPSAwOworCWR3Y19pcnFmbGFnc190IGZsYWdzOworCisJZHdjX290Z19oY2RfdXJiX3QgKnVyYiA9IHF0ZC0+dXJiOworCisJLyoKKwkgKiBHZXQgdGhlIFFIIHdoaWNoIGhvbGRzIHRoZSBRVEQtbGlzdCB0byBpbnNlcnQgdG8uIENyZWF0ZSBRSCBpZiBpdAorCSAqIGRvZXNuJ3QgZXhpc3QuCisJICovCisJaWYgKCpxaCA9PSBOVUxMKSB7CisJCSpxaCA9IGR3Y19vdGdfaGNkX3FoX2NyZWF0ZShoY2QsIHVyYiwgYXRvbWljX2FsbG9jKTsKKwkJaWYgKCpxaCA9PSBOVUxMKSB7CisJCQlyZXR2YWwgPSAtMTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKwlEV0NfU1BJTkxPQ0tfSVJRU0FWRShoY2QtPmxvY2ssICZmbGFncyk7CisJcmV0dmFsID0gZHdjX290Z19oY2RfcWhfYWRkKGhjZCwgKnFoKTsKKwlpZiAocmV0dmFsID09IDApIHsKKwkJRFdDX0NJUkNMRVFfSU5TRVJUX1RBSUwoJigoKnFoKS0+cXRkX2xpc3QpLCBxdGQsCisJCQkJCXF0ZF9saXN0X2VudHJ5KTsKKwl9CisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShoY2QtPmxvY2ssIGZsYWdzKTsKKworZG9uZToKKworCXJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBEV0NfREVWSUNFX09OTFkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19vc19kZXAuaCBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19vc19kZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjhkYjczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX29zX2RlcC5oCkBAIC0wLDAgKzEsMTExIEBACisjaWZuZGVmIF9EV0NfT1NfREVQX0hfCisjZGVmaW5lIF9EV0NfT1NfREVQX0hfCisKKy8qKgorICogQGZpbGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgT1MgZGVwZW5kZW50IHN0cnVjdHVyZXMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDIwKQorIyBpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwyMSkKKyMgaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8bGludXgvdXNiX2NoOS5oPgorI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQorIyBpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjZWxzZQorIyBpbmNsdWRlIDxsaW51eC91c2JfZ2FkZ2V0Lmg+CisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyMCkKKyMgaW5jbHVkZSA8YXNtL2lycS5oPgorI2VuZGlmCisKKyNpZmRlZiBQQ0lfSU5URVJGQUNFCisjIGluY2x1ZGUgPGFzbS9pby5oPgorI2VuZGlmCisKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKyMgaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorIyBpbmNsdWRlIDxhc20vc2l6ZXMuaD4KKyMgaW5jbHVkZSA8YXNtL3BhcmFtLmg+CisjIGluY2x1ZGUgPGFzbS9pby5oPgorIyBpbmNsdWRlIDxhc20vYXJjaC9sbS5oPgorIyBpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CisjIGluY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtaXJxLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjIGluY2x1ZGUgPGFzbS9zaXplcy5oPgorIyBpbmNsdWRlIDxhc20vcGFyYW0uaD4KKyMgaW5jbHVkZSA8YXNtL2lvLmg+CisjIGluY2x1ZGUgPG1hY2gvaXJxcy5oPgorI2VuZGlmCisKKy8qKiBUaGUgT1MgcGFnZSBzaXplICovCisjZGVmaW5lIERXQ19PU19QQUdFX1NJWkUJUEFHRV9TSVpFCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMTQpCit0eXBlZGVmIGludCBnZnBfdDsKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDE4KQorIyBkZWZpbmUgSVJRRl9TSEFSRUQgU0FfU0hJUlEKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBvc19kZXBlbmRlbnQgeworCS8qKiBCYXNlIGFkZHJlc3MgcmV0dXJuZWQgZnJvbSBpb3JlbWFwKCkgKi8KKwl2b2lkICpiYXNlOworCisJLyoqIFJlZ2lzdGVyIG9mZnNldCBmb3IgRGlhZ25vc3RpYyBBUEkgKi8KKwl1aW50MzJfdCByZWdfb2Zmc2V0OworCisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqbG1kZXY7CisjZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisKKwkvKiogU3RhcnQgYWRkcmVzcyBvZiBhIFBDSSByZWdpb24gKi8KKwlyZXNvdXJjZV9zaXplX3QgcnNyY19zdGFydDsKKwkKKwkvKiogTGVuZ3RoIGFkZHJlc3Mgb2YgYSBQQ0kgcmVnaW9uICovCisJcmVzb3VyY2Vfc2l6ZV90IHJzcmNfbGVuOworI2Vsc2UKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CQorI2VuZGlmCit9IG9zX2RlcGVuZGVudF90OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0RXQ19PU19ERVBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19wY2QuYyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19wY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjc5MmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX3BjZC5jCkBAIC0wLDAgKzEsMjYzNCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9vdGcvbGludXgvZHJpdmVycy9kd2Nfb3RnX3BjZC5jICQKKyAqICRSZXZpc2lvbjogIzk5ICQKKyAqICREYXRlOiAyMDExLzEwLzI0ICQKKyAqICRDaGFuZ2U6IDE4NzExNjAgJAorICoKKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWZuZGVmIERXQ19IT1NUX09OTFkKKworLyoqIEBmaWxlCisgKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBQQ0QgQ29yZS4gQWxsIGNvZGUgaW4gdGhpcyBmaWxlIGlzIHBvcnRhYmxlIGFuZCBkb2Vzbid0CisgKiB1c2UgYW55IE9TIHNwZWNpZmljIGZ1bmN0aW9ucy4KKyAqIFBDRCBDb3JlIHByb3ZpZGVzIEludGVyZmFjZSwgZGVmaW5lZCBpbiA8Y29kZT48ZHdjX290Z19wY2RfaWYuaD48L2NvZGU+CisgKiBoZWFkZXIgZmlsZSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IE9TIHNwZWNpZmljIFBDRCBpbnRlcmZhY2UuCisgKgorICogQW4gaW1wb3J0YW50IGZ1bmN0aW9uIG9mIHRoZSBQQ0QgaXMgbWFuYWdpbmcgaW50ZXJydXB0cyBnZW5lcmF0ZWQKKyAqIGJ5IHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRFdDX290ZyBkZXZpY2UKKyAqIG1vZGUgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMgaXMgaW4gZHdjX290Z19wY2RfaW50ci5jLgorICoKKyAqIEB0b2RvIEFkZCBEZXZpY2UgTW9kZSB0ZXN0IG1vZGVzIChUZXN0IEogbW9kZSwgVGVzdCBLIG1vZGUsIGV0YykuCisgKiBAdG9kbyBEb2VzIGl0IHdvcmsgd2hlbiB0aGUgcmVxdWVzdCBzaXplIGlzIGdyZWF0ZXIgdGhhbiBERVBUU0laCisgKiB0cmFuc2ZlciBzaXplCisgKgorICovCisKKyNpbmNsdWRlICJkd2Nfb3RnX3BjZC5oIgorCisjaWZkZWYgRFdDX1VURV9DRkkKKyNpbmNsdWRlICJkd2Nfb3RnX2NmaS5oIgorCitleHRlcm4gaW50IGluaXRfY2ZpKGNmaW9iamVjdF90ICogY2Zpb2JqKTsKKyNlbmRpZgorCisvKioKKyAqIENob29zZSBlbmRwb2ludCBmcm9tIGVwIGFycmF5cyB1c2luZyB1c2JfZXAgc3RydWN0dXJlLgorICovCitzdGF0aWMgZHdjX290Z19wY2RfZXBfdCAqZ2V0X2VwX2Zyb21faGFuZGxlKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKmhhbmRsZSkKK3sKKwlpbnQgaTsKKwlpZiAocGNkLT5lcDAucHJpdiA9PSBoYW5kbGUpIHsKKwkJcmV0dXJuICZwY2QtPmVwMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9FUFNfQ0hBTk5FTFMgLSAxOyBpKyspIHsKKwkJaWYgKHBjZC0+aW5fZXBbaV0ucHJpdiA9PSBoYW5kbGUpCisJCQlyZXR1cm4gJnBjZC0+aW5fZXBbaV07CisJCWlmIChwY2QtPm91dF9lcFtpXS5wcml2ID09IGhhbmRsZSkKKwkJCXJldHVybiAmcGNkLT5vdXRfZXBbaV07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjb21wbGV0ZXMgYSByZXF1ZXN0LiAgSXQgY2FsbCdzIHRoZSByZXF1ZXN0IGNhbGwgYmFjay4KKyAqLwordm9pZCBkd2Nfb3RnX3JlcXVlc3RfZG9uZShkd2Nfb3RnX3BjZF9lcF90ICogZXAsIGR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqIHJlcSwKKwkJCSAgaW50MzJfdCBzdGF0dXMpCit7CisJdW5zaWduZWQgc3RvcHBlZCA9IGVwLT5zdG9wcGVkOworCQorCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiJXMoZXAgJXAgcmVxICVwKVxuIiwgX19mdW5jX18sIGVwLCByZXEpOworCURXQ19DSVJDTEVRX1JFTU9WRV9JTklUKCZlcC0+cXVldWUsIHJlcSwgcXVldWVfZW50cnkpOworCisJLyogZG9uJ3QgbW9kaWZ5IHF1ZXVlIGhlYWRzIGR1cmluZyBjb21wbGV0aW9uIGNhbGxiYWNrICovCisJZXAtPnN0b3BwZWQgPSAxOworCS8qIHNwaW5fdW5sb2NrL3NwaW5fbG9jayBub3cgZG9uZSBpbiBmb3BzLT5jb21wbGV0ZSgpICovCisJZXAtPnBjZC0+Zm9wcy0+Y29tcGxldGUoZXAtPnBjZCwgZXAtPnByaXYsIHJlcS0+cHJpdiwgc3RhdHVzLAorCQkJCXJlcS0+YWN0dWFsKTsKKworCWlmIChlcC0+cGNkLT5yZXF1ZXN0X3BlbmRpbmcgPiAwKSB7CisJCS0tZXAtPnBjZC0+cmVxdWVzdF9wZW5kaW5nOworCX0KKworCWVwLT5zdG9wcGVkID0gc3RvcHBlZDsKKwlEV0NfRlJFRShyZXEpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyBhbGwgdGhlIHJlcXVzdHMgaW4gdGhlIEVQIHJlcXVlc3QgcXVldWUuCisgKi8KK3ZvaWQgZHdjX290Z19yZXF1ZXN0X251a2UoZHdjX290Z19wY2RfZXBfdCAqIGVwKQoreworCWR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqcmVxOworCisJZXAtPnN0b3BwZWQgPSAxOworCisJLyogY2FsbGVkIHdpdGggaXJxcyBibG9ja2VkPz8gKi8KKwl3aGlsZSAoIURXQ19DSVJDTEVRX0VNUFRZKCZlcC0+cXVldWUpKSB7CisJCXJlcSA9IERXQ19DSVJDTEVRX0ZJUlNUKCZlcC0+cXVldWUpOworCQlkd2Nfb3RnX3JlcXVlc3RfZG9uZShlcCwgcmVxLCAtRFdDX0VfU0hVVERPV04pOworCX0KK30KKwordm9pZCBkd2Nfb3RnX3BjZF9zdGFydChkd2Nfb3RnX3BjZF90ICogcGNkLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGR3Y19vdGdfcGNkX2Z1bmN0aW9uX29wcyAqZm9wcykKK3sKKwlwY2QtPmZvcHMgPSBmb3BzOworfQorCisvKioKKyAqIFBDRCBDYWxsYmFjayBmdW5jdGlvbiBmb3IgaW5pdGlhbGl6aW5nIHRoZSBQQ0Qgd2hlbiBzd2l0Y2hpbmcgdG8KKyAqIGRldmljZSBtb2RlLgorICoKKyAqIEBwYXJhbSBwIHZvaWQgcG9pbnRlciB0byB0aGUgPGNvZGU+ZHdjX290Z19wY2RfdDwvY29kZT4KKyAqLworc3RhdGljIGludDMyX3QgZHdjX290Z19wY2Rfc3RhcnRfY2Iodm9pZCAqcCkKK3sKKwlkd2Nfb3RnX3BjZF90ICpwY2QgPSAoZHdjX290Z19wY2RfdCAqKSBwOworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKworCS8qCisJICogSW5pdGlhbGl6ZWQgdGhlIENvcmUgZm9yIERldmljZSBtb2RlLgorCSAqLworCWlmIChkd2Nfb3RnX2lzX2RldmljZV9tb2RlKGNvcmVfaWYpKSB7CisJCWR3Y19vdGdfY29yZV9kZXZfaW5pdChjb3JlX2lmKTsKKwkJLyogU2V0IGNvcmVfaWYncyBsb2NrIHBvaW50ZXIgdG8gdGhlIHBjZC0+bG9jayAqLworCQljb3JlX2lmLT5sb2NrID0gcGNkLT5sb2NrOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoqIENGSS1zcGVjaWZpYyBidWZmZXIgYWxsb2NhdGlvbiBmdW5jdGlvbiBmb3IgRVAgKi8KKyNpZmRlZiBEV0NfVVRFX0NGSQordWludDhfdCAqY2Zpd19lcF9hbGxvY19idWZmZXIoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqcGVwLCBkd2NfZG1hX3QgKiBhZGRyLAorCQkJICAgICAgc2l6ZV90IGJ1ZmxlbiwgaW50IGZsYWdzKQoreworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCWVwID0gZ2V0X2VwX2Zyb21faGFuZGxlKHBjZCwgcGVwKTsKKwlpZiAoIWVwKSB7CisJCURXQ19XQVJOKCJiYWQgZXBcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJcmV0dXJuIHBjZC0+Y2ZpLT5vcHMuZXBfYWxsb2NfYnVmKHBjZC0+Y2ZpLCBwY2QsIGVwLCBhZGRyLCBidWZsZW4sCisJCQkJCSAgZmxhZ3MpOworfQorI2Vsc2UKK3VpbnQ4X3QgKmNmaXdfZXBfYWxsb2NfYnVmZmVyKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKnBlcCwgZHdjX2RtYV90ICogYWRkciwKKwkJCSAgICAgIHNpemVfdCBidWZsZW4sIGludCBmbGFncyk7CisjZW5kaWYKKworLyoqCisgKiBQQ0QgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIG5vdGlmeWluZyB0aGUgUENEIHdoZW4gcmVzdW1pbmcgZnJvbQorICogc3VzcGVuZC4KKyAqCisgKiBAcGFyYW0gcCB2b2lkIHBvaW50ZXIgdG8gdGhlIDxjb2RlPmR3Y19vdGdfcGNkX3Q8L2NvZGU+CisgKi8KK3N0YXRpYyBpbnQzMl90IGR3Y19vdGdfcGNkX3Jlc3VtZV9jYih2b2lkICpwKQoreworCWR3Y19vdGdfcGNkX3QgKnBjZCA9IChkd2Nfb3RnX3BjZF90ICopIHA7CisKKwlpZiAocGNkLT5mb3BzLT5yZXN1bWUpIHsKKwkJcGNkLT5mb3BzLT5yZXN1bWUocGNkKTsKKwl9CisKKwkvKiBTdG9wIHRoZSBTUlAgdGltZW91dCB0aW1lci4gKi8KKwlpZiAoKEdFVF9DT1JFX0lGKHBjZCktPmNvcmVfcGFyYW1zLT5waHlfdHlwZSAhPSBEV0NfUEhZX1RZUEVfUEFSQU1fRlMpCisJICAgIHx8ICghR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9wYXJhbXMtPmkyY19lbmFibGUpKSB7CisJCWlmIChHRVRfQ09SRV9JRihwY2QpLT5zcnBfdGltZXJfc3RhcnRlZCkgeworCQkJR0VUX0NPUkVfSUYocGNkKS0+c3JwX3RpbWVyX3N0YXJ0ZWQgPSAwOworCQkJRFdDX1RJTUVSX0NBTkNFTChHRVRfQ09SRV9JRihwY2QpLT5zcnBfdGltZXIpOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKioKKyAqIFBDRCBDYWxsYmFjayBmdW5jdGlvbiBmb3Igbm90aWZ5aW5nIHRoZSBQQ0QgZGV2aWNlIGlzIHN1c3BlbmRlZC4KKyAqCisgKiBAcGFyYW0gcCB2b2lkIHBvaW50ZXIgdG8gdGhlIDxjb2RlPmR3Y19vdGdfcGNkX3Q8L2NvZGU+CisgKi8KK3N0YXRpYyBpbnQzMl90IGR3Y19vdGdfcGNkX3N1c3BlbmRfY2Iodm9pZCAqcCkKK3sKKwlkd2Nfb3RnX3BjZF90ICpwY2QgPSAoZHdjX290Z19wY2RfdCAqKSBwOworCisJaWYgKHBjZC0+Zm9wcy0+c3VzcGVuZCkgeworCQlEV0NfU1BJTlVOTE9DSyhwY2QtPmxvY2spOworCQlwY2QtPmZvcHMtPnN1c3BlbmQocGNkKTsKKwkJRFdDX1NQSU5MT0NLKHBjZC0+bG9jayk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogUENEIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBzdG9wcGluZyB0aGUgUENEIHdoZW4gc3dpdGNoaW5nIHRvIEhvc3QKKyAqIG1vZGUuCisgKgorICogQHBhcmFtIHAgdm9pZCBwb2ludGVyIHRvIHRoZSA8Y29kZT5kd2Nfb3RnX3BjZF90PC9jb2RlPgorICovCitzdGF0aWMgaW50MzJfdCBkd2Nfb3RnX3BjZF9zdG9wX2NiKHZvaWQgKnApCit7CisJZHdjX290Z19wY2RfdCAqcGNkID0gKGR3Y19vdGdfcGNkX3QgKikgcDsKKwlleHRlcm4gdm9pZCBkd2Nfb3RnX3BjZF9zdG9wKGR3Y19vdGdfcGNkX3QgKiBfcGNkKTsKKworCWR3Y19vdGdfcGNkX3N0b3AocGNkKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBQQ0QgQ2FsbGJhY2sgc3RydWN0dXJlIGZvciBoYW5kbGluZyBtb2RlIHN3aXRjaGluZy4KKyAqLworc3RhdGljIGR3Y19vdGdfY2lsX2NhbGxiYWNrc190IHBjZF9jYWxsYmFja3MgPSB7CisJLnN0YXJ0ID0gZHdjX290Z19wY2Rfc3RhcnRfY2IsCisJLnN0b3AgPSBkd2Nfb3RnX3BjZF9zdG9wX2NiLAorCS5zdXNwZW5kID0gZHdjX290Z19wY2Rfc3VzcGVuZF9jYiwKKwkucmVzdW1lX3dha2V1cCA9IGR3Y19vdGdfcGNkX3Jlc3VtZV9jYiwKKwkucCA9IDAsCQkJLyogU2V0IGF0IHJlZ2lzdHJhdGlvbiAqLworfTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIERNQSBEZXNjcmlwdG9yIGNoYWluIGZvciB0aGUgRW5kcG9pbnQKKyAqIGJ1ZmZlciB0byBiZSB1c2VkIGZvciBhIHRyYW5zZmVyIHRvL2Zyb20gdGhlIHNwZWNpZmllZCBlbmRwb2ludC4KKyAqLworZHdjX290Z19kZXZfZG1hX2Rlc2NfdCAqZHdjX290Z19lcF9hbGxvY19kZXNjX2NoYWluKGR3Y19kbWFfdCAqIGRtYV9kZXNjX2FkZHIsCisJCQkJCQkgICAgdWludDMyX3QgY291bnQpCit7CisJcmV0dXJuIERXQ19ETUFfQUxMT0NfQVRPTUlDKGNvdW50ICogc2l6ZW9mKGR3Y19vdGdfZGV2X2RtYV9kZXNjX3QpLCAKKwkJCQkJCQlkbWFfZGVzY19hZGRyKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGEgRE1BIERlc2NyaXB0b3IgY2hhaW4gdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IGVwX2FsbG9jX2Rlc2MuCisgKi8KK3ZvaWQgZHdjX290Z19lcF9mcmVlX2Rlc2NfY2hhaW4oZHdjX290Z19kZXZfZG1hX2Rlc2NfdCAqIGRlc2NfYWRkciwKKwkJCQl1aW50MzJfdCBkbWFfZGVzY19hZGRyLCB1aW50MzJfdCBjb3VudCkKK3sKKwlEV0NfRE1BX0ZSRUUoY291bnQgKiBzaXplb2YoZHdjX290Z19kZXZfZG1hX2Rlc2NfdCksIGRlc2NfYWRkciwKKwkJICAgICBkbWFfZGVzY19hZGRyKTsKK30KKworI2lmZGVmIERXQ19FTl9JU09DCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhIGRlc2NyaXB0b3IgY2hhaW4gZm9yIElzb2Nocm9ub3VzIHRyYW5zZmVyCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZHdjX2VwIFRoZSBFUCB0byBzdGFydCB0aGUgdHJhbnNmZXIgb24uCisgKgorICovCit2b2lkIGR3Y19vdGdfaXNvX2VwX3N0YXJ0X2RkbWFfdHJhbnNmZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQlkd2NfZXBfdCAqIGR3Y19lcCkKK3sKKworCWRzdHNfZGF0YV90IGRzdHMgPSB7LmQzMiA9IDAgfTsKKwlkZXBjdGxfZGF0YV90IGRlcGN0bCA9IHsuZDMyID0gMCB9OworCXZvbGF0aWxlIHVpbnQzMl90ICphZGRyOworCWludCBpLCBqOworCXVpbnQzMl90IGxlbjsKKworCWlmIChkd2NfZXAtPmlzX2luKQorCQlkd2NfZXAtPmRlc2NfY250ID0gZHdjX2VwLT5idWZfcHJvY19pbnRydmwgLyBkd2NfZXAtPmJJbnRlcnZhbDsKKwllbHNlCisJCWR3Y19lcC0+ZGVzY19jbnQgPQorCQkgICAgZHdjX2VwLT5idWZfcHJvY19pbnRydmwgKiBkd2NfZXAtPnBrdF9wZXJfZnJtIC8KKwkJICAgIGR3Y19lcC0+YkludGVydmFsOworCisJLyoqIEFsbG9jYXRlIGRlc2NyaXB0b3JzIGZvciBkb3VibGUgYnVmZmVyaW5nICovCisJZHdjX2VwLT5pc29fZGVzY19hZGRyID0KKwkgICAgZHdjX290Z19lcF9hbGxvY19kZXNjX2NoYWluKCZkd2NfZXAtPmlzb19kbWFfZGVzY19hZGRyLAorCQkJCQlkd2NfZXAtPmRlc2NfY250ICogMik7CisJaWYgKGR3Y19lcC0+ZGVzY19hZGRyKSB7CisJCURXQ19XQVJOKCIlcywgY2FuJ3QgYWxsb2NhdGUgRE1BIGRlc2NyaXB0b3IgY2hhaW5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kc3RzKTsKKworCS8qKiBJU08gT1VUIEVQICovCisJaWYgKGR3Y19lcC0+aXNfaW4gPT0gMCkgeworCQlkZXZfZG1hX2Rlc2Nfc3RzX3Qgc3RzID0gey5kMzIgPSAwIH07CisJCWR3Y19vdGdfZGV2X2RtYV9kZXNjX3QgKmRtYV9kZXNjID0gZHdjX2VwLT5pc29fZGVzY19hZGRyOworCQlkbWFfYWRkcl90IGRtYV9hZDsKKwkJdWludDMyX3QgZGF0YV9wZXJfZGVzYzsKKwkJZHdjX290Z19kZXZfb3V0X2VwX3JlZ3NfdCAqb3V0X3JlZ3MgPQorCQkgICAgY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tkd2NfZXAtPm51bV07CisJCWludCBvZmZzZXQ7CisKKwkJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2R3Y19lcC0+bnVtXS0+ZG9lcGN0bDsKKwkJZG1hX2FkID0gKGRtYV9hZGRyX3QpIERXQ19SRUFEX1JFRzMyKCYob3V0X3JlZ3MtPmRvZXBkbWEpKTsKKworCQkvKiogQnVmZmVyIDAgZGVzY3JpcHRvcnMgc2V0dXAgKi8KKwkJZG1hX2FkID0gZHdjX2VwLT5kbWFfYWRkcjA7CisKKwkJc3RzLmJfaXNvX291dC5icyA9IEJTX0hPU1RfUkVBRFk7CisJCXN0cy5iX2lzb19vdXQucnhzdHMgPSAwOworCQlzdHMuYl9pc29fb3V0LmwgPSAwOworCQlzdHMuYl9pc29fb3V0LnNwID0gMDsKKwkJc3RzLmJfaXNvX291dC5pb2MgPSAwOworCQlzdHMuYl9pc29fb3V0LnBpZCA9IDA7CisJCXN0cy5iX2lzb19vdXQuZnJhbWVudW0gPSAwOworCisJCW9mZnNldCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBkd2NfZXAtPmRlc2NfY250IC0gZHdjX2VwLT5wa3RfcGVyX2ZybTsKKwkJICAgICBpICs9IGR3Y19lcC0+cGt0X3Blcl9mcm0pIHsKKworCQkJZm9yIChqID0gMDsgaiA8IGR3Y19lcC0+cGt0X3Blcl9mcm07ICsraikgeworCQkJCXVpbnQzMl90IGxlbiA9IChqICsgMSkgKiBkd2NfZXAtPm1heHBhY2tldDsKKwkJCQlpZiAobGVuID4gZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSkKKwkJCQkJZGF0YV9wZXJfZGVzYyA9CisJCQkJCSAgICBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lIC0KKwkJCQkJICAgIGogKiBkd2NfZXAtPm1heHBhY2tldDsKKwkJCQllbHNlCisJCQkJCWRhdGFfcGVyX2Rlc2MgPSBkd2NfZXAtPm1heHBhY2tldDsKKwkJCQlsZW4gPSBkYXRhX3Blcl9kZXNjICUgNDsKKwkJCQlpZiAobGVuKQorCQkJCQlkYXRhX3Blcl9kZXNjICs9IDQgLSBsZW47CisKKwkJCQlzdHMuYl9pc29fb3V0LnJ4Ynl0ZXMgPSBkYXRhX3Blcl9kZXNjOworCQkJCWRtYV9kZXNjLT5idWYgPSBkbWFfYWQ7CisJCQkJZG1hX2Rlc2MtPnN0YXR1cy5kMzIgPSBzdHMuZDMyOworCisJCQkJb2Zmc2V0ICs9IGRhdGFfcGVyX2Rlc2M7CisJCQkJZG1hX2Rlc2MrKzsKKwkJCQlkbWFfYWQgKz0gZGF0YV9wZXJfZGVzYzsKKwkJCX0KKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBkd2NfZXAtPnBrdF9wZXJfZnJtIC0gMTsgKytqKSB7CisJCQl1aW50MzJfdCBsZW4gPSAoaiArIDEpICogZHdjX2VwLT5tYXhwYWNrZXQ7CisJCQlpZiAobGVuID4gZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSkKKwkJCQlkYXRhX3Blcl9kZXNjID0KKwkJCQkgICAgZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSAtCisJCQkJICAgIGogKiBkd2NfZXAtPm1heHBhY2tldDsKKwkJCWVsc2UKKwkJCQlkYXRhX3Blcl9kZXNjID0gZHdjX2VwLT5tYXhwYWNrZXQ7CisJCQlsZW4gPSBkYXRhX3Blcl9kZXNjICUgNDsKKwkJCWlmIChsZW4pCisJCQkJZGF0YV9wZXJfZGVzYyArPSA0IC0gbGVuOworCQkJc3RzLmJfaXNvX291dC5yeGJ5dGVzID0gZGF0YV9wZXJfZGVzYzsKKwkJCWRtYV9kZXNjLT5idWYgPSBkbWFfYWQ7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmQzMiA9IHN0cy5kMzI7CisKKwkJCW9mZnNldCArPSBkYXRhX3Blcl9kZXNjOworCQkJZG1hX2Rlc2MrKzsKKwkJCWRtYV9hZCArPSBkYXRhX3Blcl9kZXNjOworCQl9CisKKwkJc3RzLmJfaXNvX291dC5pb2MgPSAxOworCQlsZW4gPSAoaiArIDEpICogZHdjX2VwLT5tYXhwYWNrZXQ7CisJCWlmIChsZW4gPiBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lKQorCQkJZGF0YV9wZXJfZGVzYyA9CisJCQkgICAgZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSAtIGogKiBkd2NfZXAtPm1heHBhY2tldDsKKwkJZWxzZQorCQkJZGF0YV9wZXJfZGVzYyA9IGR3Y19lcC0+bWF4cGFja2V0OworCQlsZW4gPSBkYXRhX3Blcl9kZXNjICUgNDsKKwkJaWYgKGxlbikKKwkJCWRhdGFfcGVyX2Rlc2MgKz0gNCAtIGxlbjsKKwkJc3RzLmJfaXNvX291dC5yeGJ5dGVzID0gZGF0YV9wZXJfZGVzYzsKKworCQlkbWFfZGVzYy0+YnVmID0gZG1hX2FkOworCQlkbWFfZGVzYy0+c3RhdHVzLmQzMiA9IHN0cy5kMzI7CisJCWRtYV9kZXNjKys7CisKKwkJLyoqIEJ1ZmZlciAxIGRlc2NyaXB0b3JzIHNldHVwICovCisJCXN0cy5iX2lzb19vdXQuaW9jID0gMDsKKwkJZG1hX2FkID0gZHdjX2VwLT5kbWFfYWRkcjE7CisKKwkJb2Zmc2V0ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGR3Y19lcC0+ZGVzY19jbnQgLSBkd2NfZXAtPnBrdF9wZXJfZnJtOworCQkgICAgIGkgKz0gZHdjX2VwLT5wa3RfcGVyX2ZybSkgeworCQkJZm9yIChqID0gMDsgaiA8IGR3Y19lcC0+cGt0X3Blcl9mcm07ICsraikgeworCQkJCXVpbnQzMl90IGxlbiA9IChqICsgMSkgKiBkd2NfZXAtPm1heHBhY2tldDsKKwkJCQlpZiAobGVuID4gZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSkKKwkJCQkJZGF0YV9wZXJfZGVzYyA9CisJCQkJCSAgICBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lIC0KKwkJCQkJICAgIGogKiBkd2NfZXAtPm1heHBhY2tldDsKKwkJCQllbHNlCisJCQkJCWRhdGFfcGVyX2Rlc2MgPSBkd2NfZXAtPm1heHBhY2tldDsKKwkJCQlsZW4gPSBkYXRhX3Blcl9kZXNjICUgNDsKKwkJCQlpZiAobGVuKQorCQkJCQlkYXRhX3Blcl9kZXNjICs9IDQgLSBsZW47CisKKwkJCQlkYXRhX3Blcl9kZXNjID0KKwkJCQkgICAgc3RzLmJfaXNvX291dC5yeGJ5dGVzID0gZGF0YV9wZXJfZGVzYzsKKwkJCQlkbWFfZGVzYy0+YnVmID0gZG1hX2FkOworCQkJCWRtYV9kZXNjLT5zdGF0dXMuZDMyID0gc3RzLmQzMjsKKworCQkJCW9mZnNldCArPSBkYXRhX3Blcl9kZXNjOworCQkJCWRtYV9kZXNjKys7CisJCQkJZG1hX2FkICs9IGRhdGFfcGVyX2Rlc2M7CisJCQl9CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IGR3Y19lcC0+cGt0X3Blcl9mcm0gLSAxOyArK2opIHsKKwkJCWRhdGFfcGVyX2Rlc2MgPQorCQkJICAgICgoaiArIDEpICogZHdjX2VwLT5tYXhwYWNrZXQgPgorCQkJICAgICBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lKSA/IGR3Y19lcC0+ZGF0YV9wZXJfZnJhbWUgLQorCQkJICAgIGogKiBkd2NfZXAtPm1heHBhY2tldCA6IGR3Y19lcC0+bWF4cGFja2V0OworCQkJZGF0YV9wZXJfZGVzYyArPQorCQkJICAgIChkYXRhX3Blcl9kZXNjICUgNCkgPyAoNCAtIGRhdGFfcGVyX2Rlc2MgJSA0KSA6IDA7CisJCQlzdHMuYl9pc29fb3V0LnJ4Ynl0ZXMgPSBkYXRhX3Blcl9kZXNjOworCQkJZG1hX2Rlc2MtPmJ1ZiA9IGRtYV9hZDsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuZDMyID0gc3RzLmQzMjsKKworCQkJb2Zmc2V0ICs9IGRhdGFfcGVyX2Rlc2M7CisJCQlkbWFfZGVzYysrOworCQkJZG1hX2FkICs9IGRhdGFfcGVyX2Rlc2M7CisJCX0KKworCQlzdHMuYl9pc29fb3V0LmlvYyA9IDE7CisJCXN0cy5iX2lzb19vdXQubCA9IDE7CisJCWRhdGFfcGVyX2Rlc2MgPQorCQkgICAgKChqICsgMSkgKiBkd2NfZXAtPm1heHBhY2tldCA+CisJCSAgICAgZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSkgPyBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lIC0KKwkJICAgIGogKiBkd2NfZXAtPm1heHBhY2tldCA6IGR3Y19lcC0+bWF4cGFja2V0OworCQlkYXRhX3Blcl9kZXNjICs9CisJCSAgICAoZGF0YV9wZXJfZGVzYyAlIDQpID8gKDQgLSBkYXRhX3Blcl9kZXNjICUgNCkgOiAwOworCQlzdHMuYl9pc29fb3V0LnJ4Ynl0ZXMgPSBkYXRhX3Blcl9kZXNjOworCisJCWRtYV9kZXNjLT5idWYgPSBkbWFfYWQ7CisJCWRtYV9kZXNjLT5zdGF0dXMuZDMyID0gc3RzLmQzMjsKKworCQlkd2NfZXAtPm5leHRfZnJhbWUgPSAwOworCisJCS8qKiBXcml0ZSBkbWFfYWQgaW50byBET0VQRE1BIHJlZ2lzdGVyICovCisJCURXQ19XUklURV9SRUczMigmKG91dF9yZWdzLT5kb2VwZG1hKSwKKwkJCQkodWludDMyX3QpIGR3Y19lcC0+aXNvX2RtYV9kZXNjX2FkZHIpOworCisJfQorCS8qKiBJU08gSU4gRVAgKi8KKwllbHNlIHsKKwkJZGV2X2RtYV9kZXNjX3N0c190IHN0cyA9IHsuZDMyID0gMCB9OworCQlkd2Nfb3RnX2Rldl9kbWFfZGVzY190ICpkbWFfZGVzYyA9IGR3Y19lcC0+aXNvX2Rlc2NfYWRkcjsKKwkJZG1hX2FkZHJfdCBkbWFfYWQ7CisJCWR3Y19vdGdfZGV2X2luX2VwX3JlZ3NfdCAqaW5fcmVncyA9CisJCSAgICBjb3JlX2lmLT5kZXZfaWYtPmluX2VwX3JlZ3NbZHdjX2VwLT5udW1dOworCQl1bnNpZ25lZCBpbnQgZnJtbnVtYmVyOworCQlmaWZvc2l6ZV9kYXRhX3QgdHhmaWZvc2l6ZSwgcnhmaWZvc2l6ZTsKKworCQl0eGZpZm9zaXplLmQzMiA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQkgICBpbl9lcF9yZWdzW2R3Y19lcC0+bnVtXS0+ZHR4ZnN0cyk7CisJCXJ4Zmlmb3NpemUuZDMyID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnhmc2l6KTsKKworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tkd2NfZXAtPm51bV0tPmRpZXBjdGw7CisKKwkJZG1hX2FkID0gZHdjX2VwLT5kbWFfYWRkcjA7CisKKwkJZHN0cy5kMzIgPQorCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kc3RzKTsKKworCQlzdHMuYl9pc29faW4uYnMgPSBCU19IT1NUX1JFQURZOworCQlzdHMuYl9pc29faW4udHhzdHMgPSAwOworCQlzdHMuYl9pc29faW4uc3AgPQorCQkgICAgKGR3Y19lcC0+ZGF0YV9wZXJfZnJhbWUgJSBkd2NfZXAtPm1heHBhY2tldCkgPyAxIDogMDsKKwkJc3RzLmJfaXNvX2luLmlvYyA9IDA7CisJCXN0cy5iX2lzb19pbi5waWQgPSBkd2NfZXAtPnBrdF9wZXJfZnJtOworCisJCWZybW51bWJlciA9IGR3Y19lcC0+bmV4dF9mcmFtZTsKKworCQlzdHMuYl9pc29faW4uZnJhbWVudW0gPSBmcm1udW1iZXI7CisJCXN0cy5iX2lzb19pbi50eGJ5dGVzID0gZHdjX2VwLT5kYXRhX3Blcl9mcmFtZTsKKwkJc3RzLmJfaXNvX2luLmwgPSAwOworCisJCS8qKiBCdWZmZXIgMCBkZXNjcmlwdG9ycyBzZXR1cCAqLworCQlmb3IgKGkgPSAwOyBpIDwgZHdjX2VwLT5kZXNjX2NudCAtIDE7IGkrKykgeworCQkJZG1hX2Rlc2MtPmJ1ZiA9IGRtYV9hZDsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuZDMyID0gc3RzLmQzMjsKKwkJCWRtYV9kZXNjKys7CisKKwkJCWRtYV9hZCArPSBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lOworCQkJc3RzLmJfaXNvX2luLmZyYW1lbnVtICs9IGR3Y19lcC0+YkludGVydmFsOworCQl9CisKKwkJc3RzLmJfaXNvX2luLmlvYyA9IDE7CisJCWRtYV9kZXNjLT5idWYgPSBkbWFfYWQ7CisJCWRtYV9kZXNjLT5zdGF0dXMuZDMyID0gc3RzLmQzMjsKKwkJKytkbWFfZGVzYzsKKworCQkvKiogQnVmZmVyIDEgZGVzY3JpcHRvcnMgc2V0dXAgKi8KKwkJc3RzLmJfaXNvX2luLmlvYyA9IDA7CisJCWRtYV9hZCA9IGR3Y19lcC0+ZG1hX2FkZHIxOworCisJCWZvciAoaSA9IDA7IGkgPCBkd2NfZXAtPmRlc2NfY250IC0gZHdjX2VwLT5wa3RfcGVyX2ZybTsKKwkJICAgICBpICs9IGR3Y19lcC0+cGt0X3Blcl9mcm0pIHsKKwkJCWRtYV9kZXNjLT5idWYgPSBkbWFfYWQ7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmQzMiA9IHN0cy5kMzI7CisJCQlkbWFfZGVzYysrOworCisJCQlkbWFfYWQgKz0gZHdjX2VwLT5kYXRhX3Blcl9mcmFtZTsKKwkJCXN0cy5iX2lzb19pbi5mcmFtZW51bSArPSBkd2NfZXAtPmJJbnRlcnZhbDsKKworCQkJc3RzLmJfaXNvX2luLmlvYyA9IDA7CisJCX0KKwkJc3RzLmJfaXNvX2luLmlvYyA9IDE7CisJCXN0cy5iX2lzb19pbi5sID0gMTsKKworCQlkbWFfZGVzYy0+YnVmID0gZG1hX2FkOworCQlkbWFfZGVzYy0+c3RhdHVzLmQzMiA9IHN0cy5kMzI7CisKKwkJZHdjX2VwLT5uZXh0X2ZyYW1lID0gc3RzLmJfaXNvX2luLmZyYW1lbnVtICsgZHdjX2VwLT5iSW50ZXJ2YWw7CisKKwkJLyoqIFdyaXRlIGRtYV9hZCBpbnRvIGRpZXBkbWEgcmVnaXN0ZXIgKi8KKwkJRFdDX1dSSVRFX1JFRzMyKCYoaW5fcmVncy0+ZGllcGRtYSksCisJCQkJKHVpbnQzMl90KSBkd2NfZXAtPmlzb19kbWFfZGVzY19hZGRyKTsKKwl9CisJLyoqIEVuYWJsZSBlbmRwb2ludCwgY2xlYXIgbmFrICAqLworCWRlcGN0bC5kMzIgPSAwOworCWRlcGN0bC5iLmVwZW5hID0gMTsKKwlkZXBjdGwuYi51c2JhY3RlcCA9IDE7CisJZGVwY3RsLmIuY25hayA9IDE7CisKKwlEV0NfTU9ESUZZX1JFRzMyKGFkZHIsIGRlcGN0bC5kMzIsIGRlcGN0bC5kMzIpOworCWRlcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMihhZGRyKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIGEgZGVzY3JpcHRvciBjaGFpbiBmb3IgSXNvY2hyb25vdXMgdHJhbnNmZXIKKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBlcCBUaGUgRVAgdG8gc3RhcnQgdGhlIHRyYW5zZmVyIG9uLgorICoKKyAqLwordm9pZCBkd2Nfb3RnX2lzb19lcF9zdGFydF9idWZfdHJhbnNmZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCSAgICAgICBkd2NfZXBfdCAqIGVwKQoreworCWRlcGN0bF9kYXRhX3QgZGVwY3RsID0gey5kMzIgPSAwIH07CisJdm9sYXRpbGUgdWludDMyX3QgKmFkZHI7CisKKwlpZiAoZXAtPmlzX2luKSB7CisJCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2VwLT5udW1dLT5kaWVwY3RsOworCX0gZWxzZSB7CisJCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tlcC0+bnVtXS0+ZG9lcGN0bDsKKwl9CisKKwlpZiAoY29yZV9pZi0+ZG1hX2VuYWJsZSA9PSAwIHx8IGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSAhPSAwKSB7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlkZXB0c2l6X2RhdGFfdCBkZXB0c2l6ID0gey5kMzIgPSAwIH07CisKKwkJZXAtPnhmZXJfbGVuID0KKwkJICAgIGVwLT5kYXRhX3Blcl9mcmFtZSAqIGVwLT5idWZfcHJvY19pbnRydmwgLyBlcC0+YkludGVydmFsOworCQllcC0+cGt0X2NudCA9CisJCSAgICAoZXAtPnhmZXJfbGVuIC0gMSArIGVwLT5tYXhwYWNrZXQpIC8gZXAtPm1heHBhY2tldDsKKwkJZXAtPnhmZXJfY291bnQgPSAwOworCQllcC0+eGZlcl9idWZmID0KKwkJICAgIChlcC0+cHJvY19idWZfbnVtKSA/IGVwLT54ZmVyX2J1ZmYxIDogZXAtPnhmZXJfYnVmZjA7CisJCWVwLT5kbWFfYWRkciA9CisJCSAgICAoZXAtPnByb2NfYnVmX251bSkgPyBlcC0+ZG1hX2FkZHIxIDogZXAtPmRtYV9hZGRyMDsKKworCQlpZiAoZXAtPmlzX2luKSB7CisJCQkvKiBQcm9ncmFtIHRoZSB0cmFuc2ZlciBzaXplIGFuZCBwYWNrZXQgY291bnQKKwkJCSAqICAgICAgYXMgZm9sbG93czogeGZlcnNpemUgPSBOICogbWF4cGFja2V0ICsKKwkJCSAqICAgICAgc2hvcnRfcGFja2V0IHBrdGNudCA9IE4gKyAoc2hvcnRfcGFja2V0CisJCQkgKiAgICAgIGV4aXN0ID8gMSA6IDApIAorCQkJICovCisJCQlkZXB0c2l6LmIubWMgPSBlcC0+cGt0X3Blcl9mcm07CisJCQlkZXB0c2l6LmIueGZlcnNpemUgPSBlcC0+eGZlcl9sZW47CisJCQlkZXB0c2l6LmIucGt0Y250ID0KKwkJCSAgICAoZXAtPnhmZXJfbGVuIC0gMSArIGVwLT5tYXhwYWNrZXQpIC8gZXAtPm1heHBhY2tldDsKKwkJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQkJaW5fZXBfcmVnc1tlcC0+bnVtXS0+ZGllcHRzaXosCisJCQkJCWRlcHRzaXouZDMyKTsKKworCQkJLyogV3JpdGUgdGhlIERNQSByZWdpc3RlciAqLworCQkJRFdDX1dSSVRFX1JFRzMyKCYKKwkJCQkJKGNvcmVfaWYtPmRldl9pZi0+CisJCQkJCSBpbl9lcF9yZWdzW2VwLT5udW1dLT5kaWVwZG1hKSwKKwkJCQkJKHVpbnQzMl90KSBlcC0+ZG1hX2FkZHIpOworCisJCX0gZWxzZSB7CisJCQlkZXB0c2l6LmIucGt0Y250ID0KKwkJCSAgICAoZXAtPnhmZXJfbGVuICsgKGVwLT5tYXhwYWNrZXQgLSAxKSkgLworCQkJICAgIGVwLT5tYXhwYWNrZXQ7CisJCQlkZXB0c2l6LmIueGZlcnNpemUgPSBkZXB0c2l6LmIucGt0Y250ICogZXAtPm1heHBhY2tldDsKKworCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPgorCQkJCQlvdXRfZXBfcmVnc1tlcC0+bnVtXS0+ZG9lcHRzaXosCisJCQkJCWRlcHRzaXouZDMyKTsKKworCQkJLyogV3JpdGUgdGhlIERNQSByZWdpc3RlciAqLworCQkJRFdDX1dSSVRFX1JFRzMyKCYKKwkJCQkJKGNvcmVfaWYtPmRldl9pZi0+CisJCQkJCSBvdXRfZXBfcmVnc1tlcC0+bnVtXS0+ZG9lcGRtYSksCisJCQkJCSh1aW50MzJfdCkgZXAtPmRtYV9hZGRyKTsKKworCQl9CisJCS8qKiBFbmFibGUgZW5kcG9pbnQsIGNsZWFyIG5hayAgKi8KKwkJZGVwY3RsLmQzMiA9IDA7CisJCWRlcGN0bC5iLmVwZW5hID0gMTsKKwkJZGVwY3RsLmIuY25hayA9IDE7CisKKwkJRFdDX01PRElGWV9SRUczMihhZGRyLCBkZXBjdGwuZDMyLCBkZXBjdGwuZDMyKTsKKwl9Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzZXR1cCBmb3IgYSBkYXRhIHRyYW5zZmVyIGZvciBhbiBFUCBhbmQKKyAqIHN0YXJ0cyB0aGUgdHJhbnNmZXIuIEZvciBhbiBJTiB0cmFuc2ZlciwgdGhlIHBhY2tldHMgd2lsbCBiZQorICogbG9hZGVkIGludG8gdGhlIGFwcHJvcHJpYXRlIFR4IEZJRk8gaW4gdGhlIElTUi4gRm9yIE9VVCB0cmFuc2ZlcnMsCisgKiB0aGUgcGFja2V0cyBhcmUgdW5sb2FkZWQgZnJvbSB0aGUgUnggRklGTyBpbiB0aGUgSVNSLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGVwIFRoZSBFUCB0byBzdGFydCB0aGUgdHJhbnNmZXIgb24uCisgKi8KKworc3RhdGljIHZvaWQgZHdjX290Z19pc29fZXBfc3RhcnRfdHJhbnNmZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgIGR3Y19lcF90ICogZXApCit7CisJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJaWYgKGVwLT5pc19pbikgeworCQkJCWVwLT5kZXNjX2NudCA9IGVwLT5wa3RfY250IC8gZXAtPnBrdF9wZXJfZnJtOworCQkJfSBlbHNlIHsKKwkJCQllcC0+ZGVzY19jbnQgPSBlcC0+cGt0X2NudDsKKwkJCX0KKwkJCWR3Y19vdGdfaXNvX2VwX3N0YXJ0X2RkbWFfdHJhbnNmZXIoY29yZV9pZiwgZXApOworCQl9IGVsc2UgeworCQkJaWYgKGNvcmVfaWYtPnB0aV9lbmhfZW5hYmxlKSB7CisJCQkJZHdjX290Z19pc29fZXBfc3RhcnRfYnVmX3RyYW5zZmVyKGNvcmVfaWYsIGVwKTsKKwkJCX0gZWxzZSB7CisJCQkJZXAtPmN1cl9wa3RfYWRkciA9CisJCQkJICAgIChlcC0+cHJvY19idWZfbnVtKSA/IGVwLT4KKwkJCQkgICAgeGZlcl9idWZmMSA6IGVwLT54ZmVyX2J1ZmYwOworCQkJCWVwLT5jdXJfcGt0X2RtYV9hZGRyID0KKwkJCQkgICAgKGVwLT5wcm9jX2J1Zl9udW0pID8gZXAtPgorCQkJCSAgICBkbWFfYWRkcjEgOiBlcC0+ZG1hX2FkZHIwOworCQkJCWR3Y19vdGdfaXNvX2VwX3N0YXJ0X2ZybV90cmFuc2Zlcihjb3JlX2lmLCBlcCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQllcC0+Y3VyX3BrdF9hZGRyID0KKwkJICAgIChlcC0+cHJvY19idWZfbnVtKSA/IGVwLT54ZmVyX2J1ZmYxIDogZXAtPnhmZXJfYnVmZjA7CisJCWVwLT5jdXJfcGt0X2RtYV9hZGRyID0KKwkJICAgIChlcC0+cHJvY19idWZfbnVtKSA/IGVwLT5kbWFfYWRkcjEgOiBlcC0+ZG1hX2FkZHIwOworCQlkd2Nfb3RnX2lzb19lcF9zdGFydF9mcm1fdHJhbnNmZXIoY29yZV9pZiwgZXApOworCX0KK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHN0b3BzIHRyYW5zZmVyIGZvciBhbiBFUCBhbmQKKyAqIHJlc2V0cyB0aGUgZXAncyB2YXJpYWJsZXMuIAorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGVwIFRoZSBFUCB0byBzdGFydCB0aGUgdHJhbnNmZXIgb24uCisgKi8KKwordm9pZCBkd2Nfb3RnX2lzb19lcF9zdG9wX3RyYW5zZmVyKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgZHdjX2VwX3QgKiBlcCkKK3sKKwlkZXBjdGxfZGF0YV90IGRlcGN0bCA9IHsuZDMyID0gMCB9OworCXZvbGF0aWxlIHVpbnQzMl90ICphZGRyOworCisJaWYgKGVwLT5pc19pbiA9PSAxKSB7CisJCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2VwLT5udW1dLT5kaWVwY3RsOworCX0gZWxzZSB7CisJCWFkZHIgPSAmY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tlcC0+bnVtXS0+ZG9lcGN0bDsKKwl9CisKKwkvKiBkaXNhYmxlIHRoZSBlcCAqLworCWRlcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMihhZGRyKTsKKworCWRlcGN0bC5iLmVwZGlzID0gMTsKKwlkZXBjdGwuYi5zbmFrID0gMTsKKworCURXQ19XUklURV9SRUczMihhZGRyLCBkZXBjdGwuZDMyKTsKKworCWlmIChjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUgJiYKKwkgICAgZXAtPmlzb19kZXNjX2FkZHIgJiYgZXAtPmlzb19kbWFfZGVzY19hZGRyKSB7CisJCWR3Y19vdGdfZXBfZnJlZV9kZXNjX2NoYWluKGVwLT5pc29fZGVzY19hZGRyLAorCQkJCQkgICBlcC0+aXNvX2RtYV9kZXNjX2FkZHIsCisJCQkJCSAgIGVwLT5kZXNjX2NudCAqIDIpOworCX0KKworCS8qIHJlc2V0IHZhcmliYWxlcyAqLworCWVwLT5kbWFfYWRkcjAgPSAwOworCWVwLT5kbWFfYWRkcjEgPSAwOworCWVwLT54ZmVyX2J1ZmYwID0gMDsKKwllcC0+eGZlcl9idWZmMSA9IDA7CisJZXAtPmRhdGFfcGVyX2ZyYW1lID0gMDsKKwllcC0+ZGF0YV9wYXR0ZXJuX2ZyYW1lID0gMDsKKwllcC0+c3luY19mcmFtZSA9IDA7CisJZXAtPmJ1Zl9wcm9jX2ludHJ2bCA9IDA7CisJZXAtPmJJbnRlcnZhbCA9IDA7CisJZXAtPnByb2NfYnVmX251bSA9IDA7CisJZXAtPnBrdF9wZXJfZnJtID0gMDsKKwllcC0+cGt0X3Blcl9mcm0gPSAwOworCWVwLT5kZXNjX2NudCA9IDA7CisJZXAtPmlzb19kZXNjX2FkZHIgPSAwOworCWVwLT5pc29fZG1hX2Rlc2NfYWRkciA9IDA7Cit9CisKK2ludCBkd2Nfb3RnX3BjZF9pc29fZXBfc3RhcnQoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlLAorCQkJICAgICB1aW50OF90ICogYnVmMCwgdWludDhfdCAqIGJ1ZjEsIGR3Y19kbWFfdCBkbWEwLAorCQkJICAgICBkd2NfZG1hX3QgZG1hMSwgaW50IHN5bmNfZnJhbWUsIGludCBkcF9mcmFtZSwKKwkJCSAgICAgaW50IGRhdGFfcGVyX2ZyYW1lLCBpbnQgc3RhcnRfZnJhbWUsCisJCQkgICAgIGludCBidWZfcHJvY19pbnRydmwsIHZvaWQgKnJlcV9oYW5kbGUsCisJCQkgICAgIGludCBhdG9taWNfYWxsb2MpCit7CisJZHdjX290Z19wY2RfZXBfdCAqZXA7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3MgPSAwOworCWR3Y19lcF90ICpkd2NfZXA7CisJaW50MzJfdCBmcm1fZGF0YTsKKwlkc3RzX2RhdGFfdCBkc3RzOworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmOworCisJZXAgPSBnZXRfZXBfZnJvbV9oYW5kbGUocGNkLCBlcF9oYW5kbGUpOworCisJaWYgKCFlcCB8fCAhZXAtPmRlc2MgfHwgZXAtPmR3Y19lcC5udW0gPT0gMCkgeworCQlEV0NfV0FSTigiYmFkIGVwXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCURXQ19TUElOTE9DS19JUlFTQVZFKHBjZC0+bG9jaywgJmZsYWdzKTsKKwljb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKwlkd2NfZXAgPSAmZXAtPmR3Y19lcDsKKworCWlmIChlcC0+aXNvX3JlcV9oYW5kbGUpIHsKKwkJRFdDX1dBUk4oIklTTyByZXF1ZXN0IGluIHByb2dyZXNzXG4iKTsKKwl9CisKKwlkd2NfZXAtPmRtYV9hZGRyMCA9IGRtYTA7CisJZHdjX2VwLT5kbWFfYWRkcjEgPSBkbWExOworCisJZHdjX2VwLT54ZmVyX2J1ZmYwID0gYnVmMDsKKwlkd2NfZXAtPnhmZXJfYnVmZjEgPSBidWYxOworCisJZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSA9IGRhdGFfcGVyX2ZyYW1lOworCisJLyoqIEB0b2RvIC0gcGF0dGVybiBkYXRhIHN1cHBvcnQgaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIGZ1dHVyZSAqLworCWR3Y19lcC0+ZGF0YV9wYXR0ZXJuX2ZyYW1lID0gZHBfZnJhbWU7CisJZHdjX2VwLT5zeW5jX2ZyYW1lID0gc3luY19mcmFtZTsKKworCWR3Y19lcC0+YnVmX3Byb2NfaW50cnZsID0gYnVmX3Byb2NfaW50cnZsOworCisJZHdjX2VwLT5iSW50ZXJ2YWwgPSAxIDw8IChlcC0+ZGVzYy0+YkludGVydmFsIC0gMSk7CisKKwlkd2NfZXAtPnByb2NfYnVmX251bSA9IDA7CisKKwlkd2NfZXAtPnBrdF9wZXJfZnJtID0gMDsKKwlmcm1fZGF0YSA9IGVwLT5kd2NfZXAuZGF0YV9wZXJfZnJhbWU7CisJd2hpbGUgKGZybV9kYXRhID4gMCkgeworCQlkd2NfZXAtPnBrdF9wZXJfZnJtKys7CisJCWZybV9kYXRhIC09IGVwLT5kd2NfZXAubWF4cGFja2V0OworCX0KKworCWRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kc3RzKTsKKworCWlmIChzdGFydF9mcmFtZSA9PSAtMSkgeworCQlkd2NfZXAtPm5leHRfZnJhbWUgPSBkc3RzLmIuc29mZm4gKyAxOworCQlpZiAoZHdjX2VwLT5iSW50ZXJ2YWwgIT0gMSkgeworCQkJZHdjX2VwLT5uZXh0X2ZyYW1lID0KKwkJCSAgICBkd2NfZXAtPm5leHRfZnJhbWUgKyAoZHdjX2VwLT5iSW50ZXJ2YWwgLSAxIC0KKwkJCQkJCSAgZHdjX2VwLT5uZXh0X2ZyYW1lICUKKwkJCQkJCSAgZHdjX2VwLT5iSW50ZXJ2YWwpOworCQl9CisJfSBlbHNlIHsKKwkJZHdjX2VwLT5uZXh0X2ZyYW1lID0gc3RhcnRfZnJhbWU7CisJfQorCisJaWYgKCFjb3JlX2lmLT5wdGlfZW5oX2VuYWJsZSkgeworCQlkd2NfZXAtPnBrdF9jbnQgPQorCQkgICAgZHdjX2VwLT5idWZfcHJvY19pbnRydmwgKiBkd2NfZXAtPnBrdF9wZXJfZnJtIC8KKwkJICAgIGR3Y19lcC0+YkludGVydmFsOworCX0gZWxzZSB7CisJCWR3Y19lcC0+cGt0X2NudCA9CisJCSAgICAoZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSAqCisJCSAgICAgKGR3Y19lcC0+YnVmX3Byb2NfaW50cnZsIC8gZHdjX2VwLT5iSW50ZXJ2YWwpCisJCSAgICAgLSAxICsgZHdjX2VwLT5tYXhwYWNrZXQpIC8gZHdjX2VwLT5tYXhwYWNrZXQ7CisJfQorCisJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQlkd2NfZXAtPmRlc2NfY250ID0KKwkJICAgIGR3Y19lcC0+YnVmX3Byb2NfaW50cnZsICogZHdjX2VwLT5wa3RfcGVyX2ZybSAvCisJCSAgICBkd2NfZXAtPmJJbnRlcnZhbDsKKwl9CisKKwlpZiAoYXRvbWljX2FsbG9jKSB7CisJCWR3Y19lcC0+cGt0X2luZm8gPQorCQkgICAgRFdDX0FMTE9DX0FUT01JQyhzaXplb2YoaXNvX3BrdF9pbmZvX3QpICogZHdjX2VwLT5wa3RfY250KTsKKwl9IGVsc2UgeworCQlkd2NfZXAtPnBrdF9pbmZvID0KKwkJICAgIERXQ19BTExPQyhzaXplb2YoaXNvX3BrdF9pbmZvX3QpICogZHdjX2VwLT5wa3RfY250KTsKKwl9CisJaWYgKCFkd2NfZXAtPnBrdF9pbmZvKSB7CisJCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUocGNkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCX0KKwlpZiAoY29yZV9pZi0+cHRpX2VuaF9lbmFibGUpIHsKKwkJZHdjX21lbXNldChkd2NfZXAtPnBrdF9pbmZvLCAwLAorCQkJICAgc2l6ZW9mKGlzb19wa3RfaW5mb190KSAqIGR3Y19lcC0+cGt0X2NudCk7CisJfQorCisJZHdjX2VwLT5jdXJfcGt0ID0gMDsKKwllcC0+aXNvX3JlcV9oYW5kbGUgPSByZXFfaGFuZGxlOworCisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShwY2QtPmxvY2ssIGZsYWdzKTsKKwlkd2Nfb3RnX2lzb19lcF9zdGFydF90cmFuc2Zlcihjb3JlX2lmLCBkd2NfZXApOworCXJldHVybiAwOworfQorCitpbnQgZHdjX290Z19wY2RfaXNvX2VwX3N0b3AoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlLAorCQkJICAgIHZvaWQgKnJlcV9oYW5kbGUpCit7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3MgPSAwOworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCWR3Y19lcF90ICpkd2NfZXA7CisKKwllcCA9IGdldF9lcF9mcm9tX2hhbmRsZShwY2QsIGVwX2hhbmRsZSk7CisJaWYgKCFlcCB8fCAhZXAtPmRlc2MgfHwgZXAtPmR3Y19lcC5udW0gPT0gMCkgeworCQlEV0NfV0FSTigiYmFkIGVwXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKwlkd2NfZXAgPSAmZXAtPmR3Y19lcDsKKworCWR3Y19vdGdfaXNvX2VwX3N0b3BfdHJhbnNmZXIoR0VUX0NPUkVfSUYocGNkKSwgZHdjX2VwKTsKKworCURXQ19GUkVFKGR3Y19lcC0+cGt0X2luZm8pOworCURXQ19TUElOTE9DS19JUlFTQVZFKHBjZC0+bG9jaywgJmZsYWdzKTsKKwlpZiAoZXAtPmlzb19yZXFfaGFuZGxlICE9IHJlcV9oYW5kbGUpIHsKKwkJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShwY2QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUocGNkLT5sb2NrLCBmbGFncyk7CisKKwllcC0+aXNvX3JlcV9oYW5kbGUgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcGVyb2RpY2FsIGRhdGEgZXhjaG5hZ2UgYmV0d2VlbiBQQ0QgYW5kIGdhZGdldCBkcml2ZXJzLgorICogZm9yIElzb2Nocm9ub3VzIEVQcworICoKKyAqCS0gRXZlcnkgdGltZSBhIHN5bmMgcGVyaW9kIGNvbXBsZXRlcyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0bworICoJICBwZXJmb3JtIGRhdGEgZXhjaGFuZ2UgYmV0d2VlbiBQQ0QgYW5kIGdhZGdldAorICovCit2b2lkIGR3Y19vdGdfaXNvX2J1ZmZlcl9kb25lKGR3Y19vdGdfcGNkX3QgKiBwY2QsIGR3Y19vdGdfcGNkX2VwX3QgKiBlcCwKKwkJCSAgICAgdm9pZCAqcmVxX2hhbmRsZSkKK3sKKwlpbnQgaTsKKwlkd2NfZXBfdCAqZHdjX2VwOworCisJZHdjX2VwID0gJmVwLT5kd2NfZXA7CisKKwlEV0NfU1BJTlVOTE9DSyhlcC0+cGNkLT5sb2NrKTsKKwlwY2QtPmZvcHMtPmlzb2NfY29tcGxldGUocGNkLCBlcC0+cHJpdiwgZXAtPmlzb19yZXFfaGFuZGxlLAorCQkJCSBkd2NfZXAtPnByb2NfYnVmX251bSBeIDB4MSk7CisJRFdDX1NQSU5MT0NLKGVwLT5wY2QtPmxvY2spOworCisJZm9yIChpID0gMDsgaSA8IGR3Y19lcC0+cGt0X2NudDsgKytpKSB7CisJCWR3Y19lcC0+cGt0X2luZm9baV0uc3RhdHVzID0gMDsKKwkJZHdjX2VwLT5wa3RfaW5mb1tpXS5vZmZzZXQgPSAwOworCQlkd2NfZXAtPnBrdF9pbmZvW2ldLmxlbmd0aCA9IDA7CisJfQorfQorCitpbnQgZHdjX290Z19wY2RfZ2V0X2lzb19wYWNrZXRfY291bnQoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlLAorCQkJCSAgICAgdm9pZCAqaXNvX3JlcV9oYW5kbGUpCit7CisJZHdjX290Z19wY2RfZXBfdCAqZXA7CisJZHdjX2VwX3QgKmR3Y19lcDsKKworCWVwID0gZ2V0X2VwX2Zyb21faGFuZGxlKHBjZCwgZXBfaGFuZGxlKTsKKwlpZiAoIWVwLT5kZXNjIHx8IGVwLT5kd2NfZXAubnVtID09IDApIHsKKwkJRFdDX1dBUk4oImJhZCBlcFxuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisJZHdjX2VwID0gJmVwLT5kd2NfZXA7CisKKwlyZXR1cm4gZHdjX2VwLT5wa3RfY250OworfQorCit2b2lkIGR3Y19vdGdfcGNkX2dldF9pc29fcGFja2V0X3BhcmFtcyhkd2Nfb3RnX3BjZF90ICogcGNkLCB2b2lkICplcF9oYW5kbGUsCisJCQkJICAgICAgIHZvaWQgKmlzb19yZXFfaGFuZGxlLCBpbnQgcGFja2V0LAorCQkJCSAgICAgICBpbnQgKnN0YXR1cywgaW50ICphY3R1YWwsIGludCAqb2Zmc2V0KQoreworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCWR3Y19lcF90ICpkd2NfZXA7CisKKwllcCA9IGdldF9lcF9mcm9tX2hhbmRsZShwY2QsIGVwX2hhbmRsZSk7CisJaWYgKCFlcCkKKwkJRFdDX1dBUk4oImJhZCBlcFxuIik7CisKKwlkd2NfZXAgPSAmZXAtPmR3Y19lcDsKKworCSpzdGF0dXMgPSBkd2NfZXAtPnBrdF9pbmZvW3BhY2tldF0uc3RhdHVzOworCSphY3R1YWwgPSBkd2NfZXAtPnBrdF9pbmZvW3BhY2tldF0ubGVuZ3RoOworCSpvZmZzZXQgPSBkd2NfZXAtPnBrdF9pbmZvW3BhY2tldF0ub2Zmc2V0OworfQorCisjZW5kaWYgLyogRFdDX0VOX0lTT0MgKi8KKworc3RhdGljIHZvaWQgZHdjX290Z19wY2RfaW5pdF9lcChkd2Nfb3RnX3BjZF90ICogcGNkLCBkd2Nfb3RnX3BjZF9lcF90ICogcGNkX2VwLAorCQkJCXVpbnQzMl90IGlzX2luLCB1aW50MzJfdCBlcF9udW0pCit7CisJLyogSW5pdCBFUCBzdHJ1Y3R1cmUgKi8KKwlwY2RfZXAtPmRlc2MgPSAwOworCXBjZF9lcC0+cGNkID0gcGNkOworCXBjZF9lcC0+c3RvcHBlZCA9IDE7CisJcGNkX2VwLT5xdWV1ZV9zb2YgPSAwOworCisJLyogSW5pdCBEV0MgZXAgc3RydWN0dXJlICovCisJcGNkX2VwLT5kd2NfZXAuaXNfaW4gPSBpc19pbjsKKwlwY2RfZXAtPmR3Y19lcC5udW0gPSBlcF9udW07CisJcGNkX2VwLT5kd2NfZXAuYWN0aXZlID0gMDsKKwlwY2RfZXAtPmR3Y19lcC50eF9maWZvX251bSA9IDA7CisJLyogQ29udHJvbCB1bnRpbCBlcCBpcyBhY3R2YXRlZCAqLworCXBjZF9lcC0+ZHdjX2VwLnR5cGUgPSBEV0NfT1RHX0VQX1RZUEVfQ09OVFJPTDsKKwlwY2RfZXAtPmR3Y19lcC5tYXhwYWNrZXQgPSBNQVhfUEFDS0VUX1NJWkU7CisJcGNkX2VwLT5kd2NfZXAuZG1hX2FkZHIgPSAwOworCXBjZF9lcC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9IDA7CisJcGNkX2VwLT5kd2NfZXAueGZlcl9idWZmID0gMDsKKwlwY2RfZXAtPmR3Y19lcC54ZmVyX2xlbiA9IDA7CisJcGNkX2VwLT5kd2NfZXAueGZlcl9jb3VudCA9IDA7CisJcGNkX2VwLT5kd2NfZXAuc2VudF96bHAgPSAwOworCXBjZF9lcC0+ZHdjX2VwLnRvdGFsX2xlbiA9IDA7CisJcGNkX2VwLT5kd2NfZXAuZGVzY19hZGRyID0gMDsKKwlwY2RfZXAtPmR3Y19lcC5kbWFfZGVzY19hZGRyID0gMDsKKwlEV0NfQ0lSQ0xFUV9JTklUKCZwY2RfZXAtPnF1ZXVlKTsKK30KKworLyoqCisgKiBJbml0aWFsaXplIGVwJ3MKKyAqLworc3RhdGljIHZvaWQgZHdjX290Z19wY2RfcmVpbml0KGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJaW50IGk7CisJdWludDMyX3QgaHdjZmcxOworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCWludCBpbl9lcF9jbnRyLCBvdXRfZXBfY250cjsKKwl1aW50MzJfdCBudW1faW5fZXBzID0gKEdFVF9DT1JFX0lGKHBjZCkpLT5kZXZfaWYtPm51bV9pbl9lcHM7CisJdWludDMyX3QgbnVtX291dF9lcHMgPSAoR0VUX0NPUkVfSUYocGNkKSktPmRldl9pZi0+bnVtX291dF9lcHM7CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBFUDAgc3RydWN0dXJlLgorCSAqLworCWVwID0gJnBjZC0+ZXAwOworCWR3Y19vdGdfcGNkX2luaXRfZXAocGNkLCBlcCwgMCwgMCk7CisKKwlpbl9lcF9jbnRyID0gMDsKKwlod2NmZzEgPSAoR0VUX0NPUkVfSUYocGNkKSktPmh3Y2ZnMS5kMzIgPj4gMzsKKwlmb3IgKGkgPSAxOyBpbl9lcF9jbnRyIDwgbnVtX2luX2VwczsgaSsrKSB7CisJCWlmICgoaHdjZmcxICYgMHgxKSA9PSAwKSB7CisJCQlkd2Nfb3RnX3BjZF9lcF90ICplcCA9ICZwY2QtPmluX2VwW2luX2VwX2NudHJdOworCQkJaW5fZXBfY250cisrOworCQkJLyoqCisJCQkgKiBAdG9kbyBOR1M6IEFkZCBkaXJlY3Rpb24gdG8gRVAsIGJhc2VkIG9uIGNvbnRlbnRzCisJCQkgKiBvZiBIV0NGRzEuICBOZWVkIGEgY29weSBvZiBIV0NGRzEgaW4gcGNkIHN0cnVjdHVyZT8KKwkJCSAqIHNwcmludGYoIjtyCisJCQkgKi8KKwkJCWR3Y19vdGdfcGNkX2luaXRfZXAocGNkLCBlcCwgMSAvKiBJTiAqLyAsIGkpOworCisJCQlEV0NfQ0lSQ0xFUV9JTklUKCZlcC0+cXVldWUpOworCQl9CisJCWh3Y2ZnMSA+Pj0gMjsKKwl9CisKKwlvdXRfZXBfY250ciA9IDA7CisJaHdjZmcxID0gKEdFVF9DT1JFX0lGKHBjZCkpLT5od2NmZzEuZDMyID4+IDI7CisJZm9yIChpID0gMTsgb3V0X2VwX2NudHIgPCBudW1fb3V0X2VwczsgaSsrKSB7CisJCWlmICgoaHdjZmcxICYgMHgxKSA9PSAwKSB7CisJCQlkd2Nfb3RnX3BjZF9lcF90ICplcCA9ICZwY2QtPm91dF9lcFtvdXRfZXBfY250cl07CisJCQlvdXRfZXBfY250cisrOworCQkJLyoqCisJCQkgKiBAdG9kbyBOR1M6IEFkZCBkaXJlY3Rpb24gdG8gRVAsIGJhc2VkIG9uIGNvbnRlbnRzCisJCQkgKiBvZiBIV0NGRzEuICBOZWVkIGEgY29weSBvZiBIV0NGRzEgaW4gcGNkIHN0cnVjdHVyZT8KKwkJCSAqIHNwcmludGYoIjtyCisJCQkgKi8KKwkJCWR3Y19vdGdfcGNkX2luaXRfZXAocGNkLCBlcCwgMCAvKiBPVVQgKi8gLCBpKTsKKwkJCURXQ19DSVJDTEVRX0lOSVQoJmVwLT5xdWV1ZSk7CisJCX0KKwkJaHdjZmcxID4+PSAyOworCX0KKworCXBjZC0+ZXAwc3RhdGUgPSBFUDBfRElTQ09OTkVDVDsKKwlwY2QtPmVwMC5kd2NfZXAubWF4cGFja2V0ID0gTUFYX0VQMF9TSVpFOworCXBjZC0+ZXAwLmR3Y19lcC50eXBlID0gRFdDX09UR19FUF9UWVBFX0NPTlRST0w7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgU1JQIHRpbWVyIGV4cGlyZXMuIFRoZSBTUlAgc2hvdWxkCisgKiBjb21wbGV0ZSB3aXRoaW4gNiBzZWNvbmRzLgorICovCitzdGF0aWMgdm9pZCBzcnBfdGltZW91dCh2b2lkICpwdHIpCit7CisJZ290Z2N0bF9kYXRhX3QgZ290Z2N0bDsKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IChkd2Nfb3RnX2NvcmVfaWZfdCAqKSBwdHI7CisJdm9sYXRpbGUgdWludDMyX3QgKmFkZHIgPSAmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z290Z2N0bDsKKworCWdvdGdjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoYWRkcik7CisKKwljb3JlX2lmLT5zcnBfdGltZXJfc3RhcnRlZCA9IDA7CisJCisJaWYgKGNvcmVfaWYtPmFkcF9lbmFibGUpIHsKKwkJaWYgKGdvdGdjdGwuYi5ic2VzdmxkID09IDApIHsKKwkJCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuID0gey5kMzIgPSAwIH07CisJCQlEV0NfUFJJTlRGKCJTUlAgVGltZW91dCBCU0VTU1ZMRCA9IDBcbiIpOworCQkJLyogUG93ZXIgb2ZmIHRoZSBjb3JlICovCisJCQlpZiAoY29yZV9pZi0+cG93ZXJfZG93biA9PSAyKSB7CisJCQkJZ3B3cmRuLmIucHdyZG5zd3RjaCA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCWdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisJCQl9CisKKwkJCWdwd3Jkbi5kMzIgPSAwOworCQkJZ3B3cmRuLmIucG11aW50c2VsID0gMTsKKwkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3B3cmRuLCAwLCBncHdyZG4uZDMyKTsKKwkJCWR3Y19vdGdfYWRwX3Byb2JlX3N0YXJ0KGNvcmVfaWYpOworCQl9IGVsc2UgeworCQkJRFdDX1BSSU5URigiU1JQIFRpbWVvdXQgQlNFU1NWTEQgPSAxXG4iKTsKKwkJCWNvcmVfaWYtPm9wX3N0YXRlID0gQl9QRVJJUEhFUkFMOworCQkJZHdjX290Z19jb3JlX2luaXQoY29yZV9pZik7CisJCQlkd2Nfb3RnX2VuYWJsZV9nbG9iYWxfaW50ZXJydXB0cyhjb3JlX2lmKTsKKwkJCWNpbF9wY2Rfc3RhcnQoY29yZV9pZik7CisJCX0KKwl9CisKKwlpZiAoKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5waHlfdHlwZSA9PSBEV0NfUEhZX1RZUEVfUEFSQU1fRlMpICYmCisJICAgIChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+aTJjX2VuYWJsZSkpIHsKKwkJRFdDX1BSSU5URigiU1JQIFRpbWVvdXRcbiIpOworCisJCWlmICgoY29yZV9pZi0+c3JwX3N1Y2Nlc3MpICYmIChnb3RnY3RsLmIuYnNlc3ZsZCkpIHsKKwkJCWlmIChjb3JlX2lmLT5wY2RfY2IgJiYgY29yZV9pZi0+cGNkX2NiLT5yZXN1bWVfd2FrZXVwKSB7CisJCQkJY29yZV9pZi0+cGNkX2NiLT5yZXN1bWVfd2FrZXVwKGNvcmVfaWYtPnBjZF9jYi0+cCk7CisJCQl9CisKKwkJCS8qIENsZWFyIFNlc3Npb24gUmVxdWVzdCAqLworCQkJZ290Z2N0bC5kMzIgPSAwOworCQkJZ290Z2N0bC5iLnNlc3JlcSA9IDE7CisJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5nb3RnY3RsLAorCQkJCQkgZ290Z2N0bC5kMzIsIDApOworCisJCQljb3JlX2lmLT5zcnBfc3VjY2VzcyA9IDA7CisJCX0gZWxzZSB7CisJCQlfX0RXQ19FUlJPUigiRGV2aWNlIG5vdCBjb25uZWN0ZWQvcmVzcG9uZGluZ1xuIik7CisJCQlnb3RnY3RsLmIuc2VzcmVxID0gMDsKKwkJCURXQ19XUklURV9SRUczMihhZGRyLCBnb3RnY3RsLmQzMik7CisJCX0KKwl9IGVsc2UgaWYgKGdvdGdjdGwuYi5zZXNyZXEpIHsKKwkJRFdDX1BSSU5URigiU1JQIFRpbWVvdXRcbiIpOworCisJCV9fRFdDX0VSUk9SKCJEZXZpY2Ugbm90IGNvbm5lY3RlZC9yZXNwb25kaW5nXG4iKTsKKwkJZ290Z2N0bC5iLnNlc3JlcSA9IDA7CisJCURXQ19XUklURV9SRUczMihhZGRyLCBnb3RnY3RsLmQzMik7CisJfSBlbHNlIHsKKwkJRFdDX1BSSU5URigiIFNSUCBHT1RHQ1RMPSUweFxuIiwgZ290Z2N0bC5kMzIpOworCX0KK30KKworLyoqCisgKiBUYXNrbGV0CisgKgorICovCitleHRlcm4gdm9pZCBzdGFydF9uZXh0X3JlcXVlc3QoZHdjX290Z19wY2RfZXBfdCAqIGVwKTsKKworc3RhdGljIHZvaWQgc3RhcnRfeGZlcl90YXNrbGV0X2Z1bmModm9pZCAqZGF0YSkKK3sKKwlkd2Nfb3RnX3BjZF90ICpwY2QgPSAoZHdjX290Z19wY2RfdCAqKSBkYXRhOworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKworCWludCBpOworCWRlcGN0bF9kYXRhX3QgZGllcGN0bDsKKworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiU3RhcnQgeGZlciB0YXNrbGV0XG4iKTsKKworCWRpZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1swXS0+ZGllcGN0bCk7CisKKwlpZiAocGNkLT5lcDAucXVldWVfc29mKSB7CisJCXBjZC0+ZXAwLnF1ZXVlX3NvZiA9IDA7CisJCXN0YXJ0X25leHRfcmVxdWVzdCgmcGNkLT5lcDApOworCQkvLyBicmVhazsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY29yZV9pZi0+ZGV2X2lmLT5udW1faW5fZXBzOyBpKyspIHsKKwkJZGVwY3RsX2RhdGFfdCBkaWVwY3RsOworCQlkaWVwY3RsLmQzMiA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwY3RsKTsKKworCQlpZiAocGNkLT5pbl9lcFtpXS5xdWV1ZV9zb2YpIHsKKwkJCXBjZC0+aW5fZXBbaV0ucXVldWVfc29mID0gMDsKKwkJCXN0YXJ0X25leHRfcmVxdWVzdCgmcGNkLT5pbl9lcFtpXSk7CisJCQkvLyBicmVhazsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVkIHRoZSBQQ0QgcG9ydGlvbiBvZiB0aGUgZHJpdmVyLgorICoKKyAqLworZHdjX290Z19wY2RfdCAqZHdjX290Z19wY2RfaW5pdChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZHdjX290Z19wY2RfdCAqcGNkID0gTlVMTDsKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWY7CisJaW50IGk7CisKKwkvKgorCSAqIEFsbG9jYXRlIFBDRCBzdHJ1Y3R1cmUKKwkgKi8KKwlwY2QgPSBEV0NfQUxMT0Moc2l6ZW9mKGR3Y19vdGdfcGNkX3QpKTsKKworCWlmIChwY2QgPT0gTlVMTCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwY2QtPmxvY2sgPSBEV0NfU1BJTkxPQ0tfQUxMT0MoKTsKKwlpZiAoIXBjZC0+bG9jaykgeworCQlEV0NfRVJST1IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBsb2NrIGZvciBwY2QiKTsKKwkJRFdDX0ZSRUUocGNkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qIFNldCBjb3JlX2lmJ3MgbG9jayBwb2ludGVyIHRvIGhjZC0+bG9jayAqLworCWNvcmVfaWYtPmxvY2sgPSBwY2QtPmxvY2s7CisJcGNkLT5jb3JlX2lmID0gY29yZV9pZjsKKworCWRldl9pZiA9IGNvcmVfaWYtPmRldl9pZjsKKwlkZXZfaWYtPmlzb2NfZXAgPSBOVUxMOworCisJaWYgKGNvcmVfaWYtPmh3Y2ZnNC5iLmRlZF9maWZvX2VuKSB7CisJCURXQ19QUklOVEYoIkRlZGljYXRlZCBUeCBGSUZPcyBtb2RlXG4iKTsKKwl9IGVsc2UgeworCQlEV0NfUFJJTlRGKCJTaGFyZWQgVHggRklGTyBtb2RlXG4iKTsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemVkIHRoZSBDb3JlIGZvciBEZXZpY2UgbW9kZSBoZXJlIGlmIHRoZXJlIGlzIG5vZCBBRFAgc3VwcG9ydC4gCisJICogT3RoZXJ3aXNlIGl0IHdpbGwgYmUgZG9uZSBsYXRlciBpbiBkd2Nfb3RnX2FkcF9zdGFydCByb3V0aW5lLgorCSAqLwkJCQkJCQkJCQkJCQkJCQkJCQkJIAorCWlmIChkd2Nfb3RnX2lzX2RldmljZV9tb2RlKGNvcmVfaWYpIC8qJiYgIWNvcmVfaWYtPmFkcF9lbmFibGUqLykgeworCQlkd2Nfb3RnX2NvcmVfZGV2X2luaXQoY29yZV9pZik7CisJfQorCisJLyoKKwkgKiBSZWdpc3RlciB0aGUgUENEIENhbGxiYWNrcy4KKwkgKi8KKwlkd2Nfb3RnX2NpbF9yZWdpc3Rlcl9wY2RfY2FsbGJhY2tzKGNvcmVfaWYsICZwY2RfY2FsbGJhY2tzLCBwY2QpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBETUEgYnVmZmVyIGZvciBTRVRVUCBwYWNrZXRzCisJICovCisJaWYgKEdFVF9DT1JFX0lGKHBjZCktPmRtYV9lbmFibGUpIHsKKwkJcGNkLT5zZXR1cF9wa3QgPQorCQkgICAgRFdDX0RNQV9BTExPQyhzaXplb2YoKnBjZC0+c2V0dXBfcGt0KSAqIDUsCisJCQkJICAmcGNkLT5zZXR1cF9wa3RfZG1hX2hhbmRsZSk7CisJCWlmIChwY2QtPnNldHVwX3BrdCA9PSBOVUxMKSB7CisJCQlEV0NfRlJFRShwY2QpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlwY2QtPnN0YXR1c19idWYgPQorCQkgICAgRFdDX0RNQV9BTExPQyhzaXplb2YodWludDE2X3QpLAorCQkJCSAgJnBjZC0+c3RhdHVzX2J1Zl9kbWFfaGFuZGxlKTsKKwkJaWYgKHBjZC0+c3RhdHVzX2J1ZiA9PSBOVUxMKSB7CisJCQlEV0NfRE1BX0ZSRUUoc2l6ZW9mKCpwY2QtPnNldHVwX3BrdCkgKiA1LAorCQkJCSAgICAgcGNkLT5zZXR1cF9wa3QsIHBjZC0+c2V0dXBfcGt0X2RtYV9oYW5kbGUpOworCQkJRFdDX0ZSRUUocGNkKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKEdFVF9DT1JFX0lGKHBjZCktPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJZGV2X2lmLT5zZXR1cF9kZXNjX2FkZHJbMF0gPQorCQkJICAgIGR3Y19vdGdfZXBfYWxsb2NfZGVzY19jaGFpbigmZGV2X2lmLT4KKwkJCQkJCQlkbWFfc2V0dXBfZGVzY19hZGRyWzBdLAorCQkJCQkJCTEpOworCQkJZGV2X2lmLT5zZXR1cF9kZXNjX2FkZHJbMV0gPQorCQkJICAgIGR3Y19vdGdfZXBfYWxsb2NfZGVzY19jaGFpbigmZGV2X2lmLT4KKwkJCQkJCQlkbWFfc2V0dXBfZGVzY19hZGRyWzFdLAorCQkJCQkJCTEpOworCQkJZGV2X2lmLT5pbl9kZXNjX2FkZHIgPQorCQkJICAgIGR3Y19vdGdfZXBfYWxsb2NfZGVzY19jaGFpbigmZGV2X2lmLT4KKwkJCQkJCQlkbWFfaW5fZGVzY19hZGRyLCAxKTsKKwkJCWRldl9pZi0+b3V0X2Rlc2NfYWRkciA9CisJCQkgICAgZHdjX290Z19lcF9hbGxvY19kZXNjX2NoYWluKCZkZXZfaWYtPgorCQkJCQkJCWRtYV9vdXRfZGVzY19hZGRyLCAxKTsKKworCQkJaWYgKGRldl9pZi0+c2V0dXBfZGVzY19hZGRyWzBdID09IDAKKwkJCSAgICB8fCBkZXZfaWYtPnNldHVwX2Rlc2NfYWRkclsxXSA9PSAwCisJCQkgICAgfHwgZGV2X2lmLT5pbl9kZXNjX2FkZHIgPT0gMAorCQkJICAgIHx8IGRldl9pZi0+b3V0X2Rlc2NfYWRkciA9PSAwKSB7CisKKwkJCQlpZiAoZGV2X2lmLT5vdXRfZGVzY19hZGRyKQorCQkJCQlkd2Nfb3RnX2VwX2ZyZWVfZGVzY19jaGFpbihkZXZfaWYtPgorCQkJCQkJCQkgICBvdXRfZGVzY19hZGRyLAorCQkJCQkJCQkgICBkZXZfaWYtPgorCQkJCQkJCQkgICBkbWFfb3V0X2Rlc2NfYWRkciwKKwkJCQkJCQkJICAgMSk7CisJCQkJaWYgKGRldl9pZi0+aW5fZGVzY19hZGRyKQorCQkJCQlkd2Nfb3RnX2VwX2ZyZWVfZGVzY19jaGFpbihkZXZfaWYtPgorCQkJCQkJCQkgICBpbl9kZXNjX2FkZHIsCisJCQkJCQkJCSAgIGRldl9pZi0+CisJCQkJCQkJCSAgIGRtYV9pbl9kZXNjX2FkZHIsCisJCQkJCQkJCSAgIDEpOworCQkJCWlmIChkZXZfaWYtPnNldHVwX2Rlc2NfYWRkclsxXSkKKwkJCQkJZHdjX290Z19lcF9mcmVlX2Rlc2NfY2hhaW4oZGV2X2lmLT4KKwkJCQkJCQkJICAgc2V0dXBfZGVzY19hZGRyCisJCQkJCQkJCSAgIFsxXSwKKwkJCQkJCQkJICAgZGV2X2lmLT4KKwkJCQkJCQkJICAgZG1hX3NldHVwX2Rlc2NfYWRkcgorCQkJCQkJCQkgICBbMV0sIDEpOworCQkJCWlmIChkZXZfaWYtPnNldHVwX2Rlc2NfYWRkclswXSkKKwkJCQkJZHdjX290Z19lcF9mcmVlX2Rlc2NfY2hhaW4oZGV2X2lmLT4KKwkJCQkJCQkJICAgc2V0dXBfZGVzY19hZGRyCisJCQkJCQkJCSAgIFswXSwKKwkJCQkJCQkJICAgZGV2X2lmLT4KKwkJCQkJCQkJICAgZG1hX3NldHVwX2Rlc2NfYWRkcgorCQkJCQkJCQkgICBbMF0sIDEpOworCisJCQkJRFdDX0RNQV9GUkVFKHNpemVvZigqcGNkLT5zZXR1cF9wa3QpICogNSwKKwkJCQkJICAgICBwY2QtPnNldHVwX3BrdCwKKwkJCQkJICAgICBwY2QtPnNldHVwX3BrdF9kbWFfaGFuZGxlKTsKKwkJCQlEV0NfRE1BX0ZSRUUoc2l6ZW9mKCpwY2QtPnN0YXR1c19idWYpLAorCQkJCQkgICAgIHBjZC0+c3RhdHVzX2J1ZiwKKwkJCQkJICAgICBwY2QtPnN0YXR1c19idWZfZG1hX2hhbmRsZSk7CisKKwkJCQlEV0NfRlJFRShwY2QpOworCisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlwY2QtPnNldHVwX3BrdCA9IERXQ19BTExPQyhzaXplb2YoKnBjZC0+c2V0dXBfcGt0KSAqIDUpOworCQlpZiAocGNkLT5zZXR1cF9wa3QgPT0gTlVMTCkgeworCQkJRFdDX0ZSRUUocGNkKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJcGNkLT5zdGF0dXNfYnVmID0gRFdDX0FMTE9DKHNpemVvZih1aW50MTZfdCkpOworCQlpZiAocGNkLT5zdGF0dXNfYnVmID09IE5VTEwpIHsKKwkJCURXQ19GUkVFKHBjZC0+c2V0dXBfcGt0KTsKKwkJCURXQ19GUkVFKHBjZCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWR3Y19vdGdfcGNkX3JlaW5pdChwY2QpOworCisJLyogQWxsb2NhdGUgdGhlIGNmaSBvYmplY3QgZm9yIHRoZSBQQ0QgKi8KKyNpZmRlZiBEV0NfVVRFX0NGSQorCXBjZC0+Y2ZpID0gRFdDX0FMTE9DKHNpemVvZihjZmlvYmplY3RfdCkpOworCWlmIChOVUxMID09IHBjZC0+Y2ZpKQorCQlnb3RvIGZhaWw7CisJaWYgKGluaXRfY2ZpKHBjZC0+Y2ZpKSkgeworCQlDRklfSU5GTygiJXM6IEZhaWxlZCB0byBpbml0IHRoZSBDRkkgb2JqZWN0XG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbDsKKwl9CisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgdGFza2xldHMgKi8KKwlwY2QtPnN0YXJ0X3hmZXJfdGFza2xldCA9IERXQ19UQVNLX0FMTE9DKCJ4ZmVyX3Rhc2tsZXQiLAorCQkJCQkJIHN0YXJ0X3hmZXJfdGFza2xldF9mdW5jLCBwY2QpOworCXBjZC0+dGVzdF9tb2RlX3Rhc2tsZXQgPSBEV0NfVEFTS19BTExPQygidGVzdF9tb2RlX3Rhc2tsZXQiLAorCQkJCQkJZG9fdGVzdF9tb2RlLCBwY2QpOworCisJLyogSW5pdGlhbGl6ZSBTUlAgdGltZXIgKi8KKwljb3JlX2lmLT5zcnBfdGltZXIgPSBEV0NfVElNRVJfQUxMT0MoIlNSUCBUSU1FUiIsIHNycF90aW1lb3V0LCBjb3JlX2lmKTsKKwkKKwlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRldl9vdXRfbmFrKSB7CisJCS8qKiAKKwkJKiBJbml0aWFsaXplIHhmZXIgdGltZW91dCB0aW1lci4gSW1wbGVtZW50ZWQgZm9yCisJCSogMi45M2EgZmVhdHVyZSAiRGV2aWNlIERETUEgT1VUIE5BSyBFbmhhbmNlbWVudCIKKwkJKi8KKwkJZm9yKGkgPSAwOyBpIDwgTUFYX0VQU19DSEFOTkVMUzsgaSsrKSB7CisJCQlwY2QtPmNvcmVfaWYtPmVwX3hmZXJfdGltZXJbaV0gPQorCQkJCURXQ19USU1FUl9BTExPQygiZXAgdGltZXIiLCBlcF94ZmVyX3RpbWVvdXQsCisJCQkJJnBjZC0+Y29yZV9pZi0+ZXBfeGZlcl9pbmZvW2ldKTsKKwkJfQorCX0KKwkKKwlyZXR1cm4gcGNkOworI2lmZGVmIERXQ19VVEVfQ0ZJCitmYWlsOgorI2VuZGlmCisJaWYgKHBjZC0+c2V0dXBfcGt0KQorCQlEV0NfRlJFRShwY2QtPnNldHVwX3BrdCk7CisJaWYgKHBjZC0+c3RhdHVzX2J1ZikKKwkJRFdDX0ZSRUUocGNkLT5zdGF0dXNfYnVmKTsKKyNpZmRlZiBEV0NfVVRFX0NGSQorCWlmIChwY2QtPmNmaSkKKwkJRFdDX0ZSRUUocGNkLT5jZmkpOworI2VuZGlmCisJaWYgKHBjZCkKKwkJRFdDX0ZSRUUocGNkKTsKKwlyZXR1cm4gTlVMTDsKKworfQorCisvKioKKyAqIFJlbW92ZSBQQ0Qgc3BlY2lmaWMgZGF0YQorICovCit2b2lkIGR3Y19vdGdfcGNkX3JlbW92ZShkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCWR3Y19vdGdfZGV2X2lmX3QgKmRldl9pZiA9IEdFVF9DT1JFX0lGKHBjZCktPmRldl9pZjsKKwlpbnQgaTsKKwlpZiAocGNkLT5jb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZGV2X291dF9uYWspIHsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9FUFNfQ0hBTk5FTFM7IGkrKykgeworCQkJRFdDX1RJTUVSX0NBTkNFTChwY2QtPmNvcmVfaWYtPmVwX3hmZXJfdGltZXJbaV0pOworCQkJcGNkLT5jb3JlX2lmLT5lcF94ZmVyX2luZm9baV0uc3RhdGUgPSAwOworCQl9CisJfQorCisJaWYgKEdFVF9DT1JFX0lGKHBjZCktPmRtYV9lbmFibGUpIHsKKwkJRFdDX0RNQV9GUkVFKHNpemVvZigqcGNkLT5zZXR1cF9wa3QpICogNSwgcGNkLT5zZXR1cF9wa3QsCisJCQkgICAgIHBjZC0+c2V0dXBfcGt0X2RtYV9oYW5kbGUpOworCQlEV0NfRE1BX0ZSRUUoc2l6ZW9mKHVpbnQxNl90KSwgcGNkLT5zdGF0dXNfYnVmLAorCQkJICAgICBwY2QtPnN0YXR1c19idWZfZG1hX2hhbmRsZSk7CisJCWlmIChHRVRfQ09SRV9JRihwY2QpLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJCWR3Y19vdGdfZXBfZnJlZV9kZXNjX2NoYWluKGRldl9pZi0+c2V0dXBfZGVzY19hZGRyWzBdLAorCQkJCQkJICAgZGV2X2lmLT5kbWFfc2V0dXBfZGVzY19hZGRyCisJCQkJCQkgICBbMF0sIDEpOworCQkJZHdjX290Z19lcF9mcmVlX2Rlc2NfY2hhaW4oZGV2X2lmLT5zZXR1cF9kZXNjX2FkZHJbMV0sCisJCQkJCQkgICBkZXZfaWYtPmRtYV9zZXR1cF9kZXNjX2FkZHIKKwkJCQkJCSAgIFsxXSwgMSk7CisJCQlkd2Nfb3RnX2VwX2ZyZWVfZGVzY19jaGFpbihkZXZfaWYtPmluX2Rlc2NfYWRkciwKKwkJCQkJCSAgIGRldl9pZi0+ZG1hX2luX2Rlc2NfYWRkciwgMSk7CisJCQlkd2Nfb3RnX2VwX2ZyZWVfZGVzY19jaGFpbihkZXZfaWYtPm91dF9kZXNjX2FkZHIsCisJCQkJCQkgICBkZXZfaWYtPmRtYV9vdXRfZGVzY19hZGRyLAorCQkJCQkJICAgMSk7CisJCX0KKwl9IGVsc2UgeworCQlEV0NfRlJFRShwY2QtPnNldHVwX3BrdCk7CisJCURXQ19GUkVFKHBjZC0+c3RhdHVzX2J1Zik7CisJfQorCURXQ19TUElOTE9DS19GUkVFKHBjZC0+bG9jayk7CisJLyogU2V0IGNvcmVfaWYncyBsb2NrIHBvaW50ZXIgdG8gTlVMTCAqLworCXBjZC0+Y29yZV9pZi0+bG9jayA9IE5VTEw7CisKKwlEV0NfVEFTS19GUkVFKHBjZC0+c3RhcnRfeGZlcl90YXNrbGV0KTsKKwlEV0NfVEFTS19GUkVFKHBjZC0+dGVzdF9tb2RlX3Rhc2tsZXQpOworCWlmIChwY2QtPmNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfb3V0X25haykgeworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0VQU19DSEFOTkVMUzsgaSsrKSB7CisJCQlpZiAocGNkLT5jb3JlX2lmLT5lcF94ZmVyX3RpbWVyW2ldKSB7CisJCQkJCURXQ19USU1FUl9GUkVFKHBjZC0+Y29yZV9pZi0+ZXBfeGZlcl90aW1lcltpXSk7CisJCQl9CisJCX0KKwl9CisKKy8qIFJlbGVhc2UgdGhlIENGSSBvYmplY3QncyBkeW5hbWljIG1lbW9yeSAqLworI2lmZGVmIERXQ19VVEVfQ0ZJCisJaWYgKHBjZC0+Y2ZpLT5vcHMucmVsZWFzZSkgeworCQlwY2QtPmNmaS0+b3BzLnJlbGVhc2UocGNkLT5jZmkpOworCX0KKyNlbmRpZgorCisJRFdDX0ZSRUUocGNkKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHdoZXRoZXIgcmVnaXN0ZXJlZCBwY2QgaXMgZHVhbCBzcGVlZCBvciBub3QKKyAqLwordWludDMyX3QgZHdjX290Z19wY2RfaXNfZHVhbHNwZWVkKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCisJaWYgKChjb3JlX2lmLT5jb3JlX3BhcmFtcy0+c3BlZWQgPT0gRFdDX1NQRUVEX1BBUkFNX0ZVTEwpIHx8CisJICAgICgoY29yZV9pZi0+aHdjZmcyLmIuaHNfcGh5X3R5cGUgPT0gMikgJiYKKwkgICAgIChjb3JlX2lmLT5od2NmZzIuYi5mc19waHlfdHlwZSA9PSAxKSAmJgorCSAgICAgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT51bHBpX2ZzX2xzKSkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogUmV0dXJucyB3aGV0aGVyIHJlZ2lzdGVyZWQgcGNkIGlzIE9URyBjYXBhYmxlIG9yIG5vdAorICovCit1aW50MzJfdCBkd2Nfb3RnX3BjZF9pc19vdGcoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJZ3VzYmNmZ19kYXRhX3QgdXNiY2ZnID0gey5kMzIgPSAwIH07CisKKwl1c2JjZmcuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmd1c2JjZmcpOworCWlmICghdXNiY2ZnLmIuc3JwY2FwIHx8ICF1c2JjZmcuYi5obnBjYXApIHsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBhc3NpZ25zIHBlcmlvZGljIFR4IEZJRk8gdG8gYW4gcGVyaW9kaWMgRVAKKyAqIGluIHNoYXJlZCBUeCBGSUZPIG1vZGUKKyAqLworc3RhdGljIHVpbnQzMl90IGFzc2lnbl90eF9maWZvKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwl1aW50MzJfdCBUeE1zayA9IDE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29yZV9pZi0+aHdjZmc0LmIubnVtX2luX2VwczsgKytpKSB7CisJCWlmICgoVHhNc2sgJiBjb3JlX2lmLT50eF9tc2spID09IDApIHsKKwkJCWNvcmVfaWYtPnR4X21zayB8PSBUeE1zazsKKwkJCXJldHVybiBpICsgMTsKKwkJfQorCQlUeE1zayA8PD0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBhc3NpZ25zIHBlcmlvZGljIFR4IEZJRk8gdG8gYW4gcGVyaW9kaWMgRVAKKyAqIGluIHNoYXJlZCBUeCBGSUZPIG1vZGUKKyAqLworc3RhdGljIHVpbnQzMl90IGFzc2lnbl9wZXJpb190eF9maWZvKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwl1aW50MzJfdCBQZXJUeE1zayA9IDE7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGNvcmVfaWYtPmh3Y2ZnNC5iLm51bV9kZXZfcGVyaW9faW5fZXA7ICsraSkgeworCQlpZiAoKFBlclR4TXNrICYgY29yZV9pZi0+cF90eF9tc2spID09IDApIHsKKwkJCWNvcmVfaWYtPnBfdHhfbXNrIHw9IFBlclR4TXNrOworCQkJcmV0dXJuIGkgKyAxOworCQl9CisJCVBlclR4TXNrIDw8PSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIHBlcmlvZGljIFR4IEZJRk8KKyAqIGluIHNoYXJlZCBUeCBGSUZPIG1vZGUKKyAqLworc3RhdGljIHZvaWQgcmVsZWFzZV9wZXJpb190eF9maWZvKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwKKwkJCQkgIHVpbnQzMl90IGZpZm9fbnVtKQoreworCWNvcmVfaWYtPnBfdHhfbXNrID0KKwkgICAgKGNvcmVfaWYtPnBfdHhfbXNrICYgKDEgPDwgKGZpZm9fbnVtIC0gMSkpKSBeIGNvcmVfaWYtPnBfdHhfbXNrOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgcGVyaW9kaWMgVHggRklGTworICogaW4gc2hhcmVkIFR4IEZJRk8gbW9kZQorICovCitzdGF0aWMgdm9pZCByZWxlYXNlX3R4X2ZpZm8oZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCB1aW50MzJfdCBmaWZvX251bSkKK3sKKwljb3JlX2lmLT50eF9tc2sgPQorCSAgICAoY29yZV9pZi0+dHhfbXNrICYgKDEgPDwgKGZpZm9fbnVtIC0gMSkpKSBeIGNvcmVfaWYtPnR4X21zazsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCBmcm9tIGdhZGdldCAKKyAqIHRvIGVuYWJsZSBQQ0QgZW5kcG9pbnQuCisgKi8KK2ludCBkd2Nfb3RnX3BjZF9lcF9lbmFibGUoZHdjX290Z19wY2RfdCAqIHBjZCwKKwkJCSAgY29uc3QgdWludDhfdCAqIGVwX2Rlc2MsIHZvaWQgKnVzYl9lcCkKK3sKKwlpbnQgbnVtLCBkaXI7CisJZHdjX290Z19wY2RfZXBfdCAqZXAgPSBOVUxMOworCWNvbnN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX3QgKmRlc2M7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisJZmlmb3NpemVfZGF0YV90IGRwdHhmc2l6ID0gey5kMzIgPSAwIH07CisJZ2RmaWZvY2ZnX2RhdGFfdCBnZGZpZm9jZmcgPSB7LmQzMiA9IDAgfTsKKwlnZGZpZm9jZmdfZGF0YV90IGdkZmlmb2NmZ2Jhc2UgPSB7LmQzMiA9IDAgfTsKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgaSwgZXBjb3VudDsKKworCWRlc2MgPSAoY29uc3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3JfdCAqKWVwX2Rlc2M7CisKKwlpZiAoIWRlc2MpIHsKKwkJcGNkLT5lcDAucHJpdiA9IHVzYl9lcDsKKwkJZXAgPSAmcGNkLT5lcDA7CisJCXJldHZhbCA9IC1EV0NfRV9JTlZBTElEOworCQlnb3RvIG91dDsKKwl9CisKKwludW0gPSBVRV9HRVRfQUREUihkZXNjLT5iRW5kcG9pbnRBZGRyZXNzKTsKKwlkaXIgPSBVRV9HRVRfRElSKGRlc2MtPmJFbmRwb2ludEFkZHJlc3MpOworCisJaWYgKCFkZXNjLT53TWF4UGFja2V0U2l6ZSkgeworCQlEV0NfV0FSTigiYmFkIG1heHBhY2tldHNpemVcbiIpOworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGRpciA9PSBVRV9ESVJfSU4pIHsKKwkJZXBjb3VudCA9IHBjZC0+Y29yZV9pZi0+ZGV2X2lmLT5udW1faW5fZXBzOworCQlmb3IgKGkgPSAwOyBpIDwgZXBjb3VudDsgaSsrKSB7CisJCQlpZiAobnVtID09IHBjZC0+aW5fZXBbaV0uZHdjX2VwLm51bSkgeworCQkJCWVwID0gJnBjZC0+aW5fZXBbaV07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQllcGNvdW50ID0gcGNkLT5jb3JlX2lmLT5kZXZfaWYtPm51bV9vdXRfZXBzOworCQlmb3IgKGkgPSAwOyBpIDwgZXBjb3VudDsgaSsrKSB7CisJCQlpZiAobnVtID09IHBjZC0+b3V0X2VwW2ldLmR3Y19lcC5udW0pIHsKKwkJCQllcCA9ICZwY2QtPm91dF9lcFtpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghZXApIHsKKwkJRFdDX1dBUk4oImJhZCBhZGRyZXNzXG4iKTsKKwkJcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJCWdvdG8gb3V0OworCX0KKworCURXQ19TUElOTE9DS19JUlFTQVZFKHBjZC0+bG9jaywgJmZsYWdzKTsKKworCWVwLT5kZXNjID0gZGVzYzsKKwllcC0+cHJpdiA9IHVzYl9lcDsKKworCS8qCisJICogQWN0aXZhdGUgdGhlIEVQCisJICovCisJZXAtPnN0b3BwZWQgPSAwOworCisJZXAtPmR3Y19lcC5pc19pbiA9IChkaXIgPT0gVUVfRElSX0lOKTsKKwllcC0+ZHdjX2VwLm1heHBhY2tldCA9IFVHRVRXKGRlc2MtPndNYXhQYWNrZXRTaXplKTsKKworCWVwLT5kd2NfZXAudHlwZSA9IGRlc2MtPmJtQXR0cmlidXRlcyAmIFVFX1hGRVJUWVBFOworCisJaWYgKGVwLT5kd2NfZXAuaXNfaW4pIHsKKwkJaWYgKCFHRVRfQ09SRV9JRihwY2QpLT5lbl9tdWx0aXBsZV90eF9maWZvKSB7CisJCQllcC0+ZHdjX2VwLnR4X2ZpZm9fbnVtID0gMDsKKworCQkJaWYgKGVwLT5kd2NfZXAudHlwZSA9PSBVRV9JU09DSFJPTk9VUykgeworCQkJCS8qCisJCQkJICogaWYgSVNPQyBFUCB0aGVuIGFzc2lnbiBhIFBlcmlvZGljIFR4IEZJRk8uCisJCQkJICovCisJCQkJZXAtPmR3Y19lcC50eF9maWZvX251bSA9CisJCQkJICAgIGFzc2lnbl9wZXJpb190eF9maWZvKEdFVF9DT1JFX0lGKHBjZCkpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGlmIERlZGljYXRlZCBGSUZPcyBtb2RlIGlzIG9uIHRoZW4gYXNzaWduIGEgVHggRklGTy4KKwkJCSAqLworCQkJZXAtPmR3Y19lcC50eF9maWZvX251bSA9CisJCQkgICAgYXNzaWduX3R4X2ZpZm8oR0VUX0NPUkVfSUYocGNkKSk7CisJCX0KKworCQkvKiBDYWxjdWxhdGluZyBFUCBpbmZvIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovCisJCWlmIChlcC0+ZHdjX2VwLnR4X2ZpZm9fbnVtICYmIEdFVF9DT1JFX0lGKHBjZCktPmVuX211bHRpcGxlX3R4X2ZpZm8pIHsKKwkJCWdkZmlmb2NmZy5kMzIgPQorCQkJICAgIERXQ19SRUFEX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJICAgZ2RmaWZvY2ZnKTsKKwkJCWdkZmlmb2NmZ2Jhc2UuZDMyID0gZ2RmaWZvY2ZnLmQzMiA+PiAxNjsKKwkJCWRwdHhmc2l6LmQzMiA9CisJCQkgICAgKERXQ19SRUFEX1JFRzMyCisJCQkgICAgICgmR0VUX0NPUkVfSUYocGNkKS0+CisJCQkgICAgICBjb3JlX2dsb2JhbF9yZWdzLT5kdHhmc2l6W2VwLT5kd2NfZXAuCisJCQkJCQkJdHhfZmlmb19udW0tMV0pID4+IDE2KTsKKwkJCWdkZmlmb2NmZy5iLmVwaW5mb2Jhc2UgPQorCQkJICAgIGdkZmlmb2NmZ2Jhc2UuZDMyICsgZHB0eGZzaXouZDMyOworCQkJRFdDX1dSSVRFX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJZ2RmaWZvY2ZnLCBnZGZpZm9jZmcuZDMyKTsKKwkJfQorCX0KKwkvKiBTZXQgaW5pdGlhbCBkYXRhIFBJRC4gKi8KKwlpZiAoZXAtPmR3Y19lcC50eXBlID09IFVFX0JVTEspIHsKKwkJZXAtPmR3Y19lcC5kYXRhX3BpZF9zdGFydCA9IDA7CisJfQorCisJLyogQWxsb2MgRE1BIERlc2NyaXB0b3JzICovCisJaWYgKEdFVF9DT1JFX0lGKHBjZCktPmRtYV9kZXNjX2VuYWJsZSkgeworI2lmbmRlZiBEV0NfVVRFX1BFUl9JTworCQlpZiAoZXAtPmR3Y19lcC50eXBlICE9IFVFX0lTT0NIUk9OT1VTKSB7CisjZW5kaWYKKwkJCWVwLT5kd2NfZXAuZGVzY19hZGRyID0KKwkJCSAgICBkd2Nfb3RnX2VwX2FsbG9jX2Rlc2NfY2hhaW4oJmVwLT4KKwkJCQkJCQlkd2NfZXAuZG1hX2Rlc2NfYWRkciwKKwkJCQkJCQlNQVhfRE1BX0RFU0NfQ05UKTsKKwkJCWlmICghZXAtPmR3Y19lcC5kZXNjX2FkZHIpIHsKKwkJCQlEV0NfV0FSTigiJXMsIGNhbid0IGFsbG9jYXRlIERNQSBkZXNjcmlwdG9yXG4iLAorCQkJCQkgX19mdW5jX18pOworCQkJCXJldHZhbCA9IC1EV0NfRV9TSFVURE9XTjsKKwkJCQlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKHBjZC0+bG9jaywgZmxhZ3MpOworCQkJCWdvdG8gb3V0OworCQkJfQorI2lmbmRlZiBEV0NfVVRFX1BFUl9JTworCQl9CisjZW5kaWYKKwl9CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAiQWN0aXZhdGUgJXM6IHR5cGU9JWQsIG1wcz0lZCBkZXNjPSVwXG4iLAorCQkgICAgKGVwLT5kd2NfZXAuaXNfaW4gPyAiSU4iIDogIk9VVCIpLAorCQkgICAgZXAtPmR3Y19lcC50eXBlLCBlcC0+ZHdjX2VwLm1heHBhY2tldCwgZXAtPmRlc2MpOworI2lmZGVmIERXQ19VVEVfUEVSX0lPCisJZXAtPmR3Y19lcC54aXNvX2JJbnRlcnZhbCA9IDEgPDwgKGVwLT5kZXNjLT5iSW50ZXJ2YWwgLSAxKTsKKyNlbmRpZgorCWlmIChlcC0+ZHdjX2VwLnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJZXAtPmR3Y19lcC5iSW50ZXJ2YWwgPSAxIDw8IChlcC0+ZGVzYy0+YkludGVydmFsIC0gMSk7CisJCWVwLT5kd2NfZXAuZnJhbWVfbnVtID0gMHhGRkZGRkZGRjsKKwl9CSAJCisKKwlkd2Nfb3RnX2VwX2FjdGl2YXRlKEdFVF9DT1JFX0lGKHBjZCksICZlcC0+ZHdjX2VwKTsKKworI2lmZGVmIERXQ19VVEVfQ0ZJCisJaWYgKHBjZC0+Y2ZpLT5vcHMuZXBfZW5hYmxlKSB7CisJCXBjZC0+Y2ZpLT5vcHMuZXBfZW5hYmxlKHBjZC0+Y2ZpLCBwY2QsIGVwKTsKKwl9CisjZW5kaWYKKworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUocGNkLT5sb2NrLCBmbGFncyk7CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgY2FsbGVkIGZyb20gZ2FkZ2V0IAorICogdG8gZGlzYWJsZSBQQ0QgZW5kcG9pbnQuCisgKi8KK2ludCBkd2Nfb3RnX3BjZF9lcF9kaXNhYmxlKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKmVwX2hhbmRsZSkKK3sKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDsKKwlkd2NfaXJxZmxhZ3NfdCBmbGFnczsKKwlkd2Nfb3RnX2Rldl9kbWFfZGVzY190ICpkZXNjX2FkZHI7CisJZHdjX2RtYV90IGRtYV9kZXNjX2FkZHI7CisJZ2RmaWZvY2ZnX2RhdGFfdCBnZGZpZm9jZmdiYXNlID0gey5kMzIgPSAwIH07CisJZ2RmaWZvY2ZnX2RhdGFfdCBnZGZpZm9jZmcgPSB7LmQzMiA9IDAgfTsKKwlmaWZvc2l6ZV9kYXRhX3QgZHB0eGZzaXogPSB7LmQzMiA9IDAgfTsKKworCWVwID0gZ2V0X2VwX2Zyb21faGFuZGxlKHBjZCwgZXBfaGFuZGxlKTsKKworCWlmICghZXAgfHwgIWVwLT5kZXNjKSB7CisJCURXQ19ERUJVR1BMKERCR19QQ0QsICJiYWQgZXAgYWRkcmVzc1xuIik7CisJCXJldHVybiAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlEV0NfU1BJTkxPQ0tfSVJRU0FWRShwY2QtPmxvY2ssICZmbGFncyk7CisKKwlkd2Nfb3RnX3JlcXVlc3RfbnVrZShlcCk7CisKKwlkd2Nfb3RnX2VwX2RlYWN0aXZhdGUoR0VUX0NPUkVfSUYocGNkKSwgJmVwLT5kd2NfZXApOworCWlmIChwY2QtPmNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfb3V0X25haykKKwl7CisJCURXQ19USU1FUl9DQU5DRUwocGNkLT5jb3JlX2lmLT5lcF94ZmVyX3RpbWVyW2VwLT5kd2NfZXAubnVtXSk7CisJCXBjZC0+Y29yZV9pZi0+ZXBfeGZlcl9pbmZvW2VwLT5kd2NfZXAubnVtXS5zdGF0ZSA9IDA7CisJfQorCWVwLT5kZXNjID0gTlVMTDsKKwllcC0+c3RvcHBlZCA9IDE7CisKKwlnZGZpZm9jZmcuZDMyID0KKwkgICAgRFdDX1JFQURfUkVHMzIoJkdFVF9DT1JFX0lGKHBjZCktPmNvcmVfZ2xvYmFsX3JlZ3MtPmdkZmlmb2NmZyk7CisJZ2RmaWZvY2ZnYmFzZS5kMzIgPSBnZGZpZm9jZmcuZDMyID4+IDE2OworCisJaWYgKGVwLT5kd2NfZXAuaXNfaW4pIHsKKwkJaWYgKEdFVF9DT1JFX0lGKHBjZCktPmVuX211bHRpcGxlX3R4X2ZpZm8pIHsKKwkJCS8qIEZsdXNoIHRoZSBUeCBGSUZPICovCisJCQlkd2Nfb3RnX2ZsdXNoX3R4X2ZpZm8oR0VUX0NPUkVfSUYocGNkKSwgZXAtPmR3Y19lcC50eF9maWZvX251bSk7CisJCX0KKwkJcmVsZWFzZV9wZXJpb190eF9maWZvKEdFVF9DT1JFX0lGKHBjZCksIGVwLT5kd2NfZXAudHhfZmlmb19udW0pOworCQlyZWxlYXNlX3R4X2ZpZm8oR0VUX0NPUkVfSUYocGNkKSwgZXAtPmR3Y19lcC50eF9maWZvX251bSk7CisJCWlmIChHRVRfQ09SRV9JRihwY2QpLT5lbl9tdWx0aXBsZV90eF9maWZvKSB7CisJCQkvKiBEZWNyZWFzaW5nIEVQaW5mbyBCYXNlIEFkZHIgKi8KKwkJCWRwdHhmc2l6LmQzMiA9CisJCQkgICAgKERXQ19SRUFEX1JFRzMyCisJCQkgICAgICgmR0VUX0NPUkVfSUYocGNkKS0+CisJCSAgICAgIAkJY29yZV9nbG9iYWxfcmVncy0+ZHR4ZnNpeltlcC0+ZHdjX2VwLnR4X2ZpZm9fbnVtLTFdKSA+PiAxNik7CisJCQlnZGZpZm9jZmcuYi5lcGluZm9iYXNlID0gZ2RmaWZvY2ZnYmFzZS5kMzIgLSBkcHR4ZnNpei5kMzI7CisJCQlEV0NfV1JJVEVfUkVHMzIoJkdFVF9DT1JFX0lGKHBjZCktPmNvcmVfZ2xvYmFsX3JlZ3MtPmdkZmlmb2NmZywKKwkJCQkJZ2RmaWZvY2ZnLmQzMik7CisJCX0KKwl9CisKKwkvKiBGcmVlIERNQSBEZXNjcmlwdG9ycyAqLworCWlmIChHRVRfQ09SRV9JRihwY2QpLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJaWYgKGVwLT5kd2NfZXAudHlwZSAhPSBVRV9JU09DSFJPTk9VUykgeworCQkJZGVzY19hZGRyID0gZXAtPmR3Y19lcC5kZXNjX2FkZHI7CisJCQlkbWFfZGVzY19hZGRyID0gZXAtPmR3Y19lcC5kbWFfZGVzY19hZGRyOworCisJCQkvKiBDYW5ub3QgY2FsbCBkbWFfZnJlZV9jb2hlcmVudCgpIHdpdGggSVJRcyBkaXNhYmxlZCAqLworCQkJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShwY2QtPmxvY2ssIGZsYWdzKTsKKwkJCWR3Y19vdGdfZXBfZnJlZV9kZXNjX2NoYWluKGRlc2NfYWRkciwgZG1hX2Rlc2NfYWRkciwKKwkJCQkJCSAgIE1BWF9ETUFfREVTQ19DTlQpOworCisJCQlnb3RvIG91dF91bmxvY2tlZDsKKwkJfQorCX0KKwlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKHBjZC0+bG9jaywgZmxhZ3MpOworCitvdXRfdW5sb2NrZWQ6CisJRFdDX0RFQlVHUEwoREJHX1BDRCwgIiVkICVzIGRpc2FibGVkXG4iLCBlcC0+ZHdjX2VwLm51bSwKKwkJICAgIGVwLT5kd2NfZXAuaXNfaW4gPyAiSU4iIDogIk9VVCIpOworCXJldHVybiAwOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgRFdDX1VURV9QRVJfSU8KKworLyoqCisgKiBGcmVlIHRoZSByZXF1ZXN0IGFuZCBpdHMgZXh0ZW5kZWQgcGFydHMKKyAqCisgKi8KK3ZvaWQgZHdjX3BjZF94aXNvX2VyZXFfZnJlZShkd2Nfb3RnX3BjZF9lcF90ICogZXAsIGR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqIHJlcSkKK3sKKwlEV0NfRlJFRShyZXEtPmV4dF9yZXEucGVyX2lvX2ZyYW1lX2Rlc2NzKTsKKwlEV0NfRlJFRShyZXEpOworfQorCisvKioKKyAqIFN0YXJ0IHRoZSBuZXh0IHJlcXVlc3QgaW4gdGhlIGVuZHBvaW50J3MgcXVldWUuCisgKgorICovCitpbnQgZHdjX290Z19wY2RfeGlzb19zdGFydF9uZXh0X3JlcXVlc3QoZHdjX290Z19wY2RfdCAqIHBjZCwKKwkJCQkJZHdjX290Z19wY2RfZXBfdCAqIGVwKQoreworCWludCBpOworCWR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqcmVxID0gTlVMTDsKKwlkd2NfZXBfdCAqZHdjZXAgPSBOVUxMOworCXN0cnVjdCBkd2NfaXNvX3hyZXFfcG9ydCAqZXJlcSA9IE5VTEw7CisJc3RydWN0IGR3Y19pc29fcGt0X2Rlc2NfcG9ydCAqZGRlc2NfaXNvOworCXVpbnQxNl90IG5hdDsKKwlkZXBjdGxfZGF0YV90IGRpZXBjdGw7CisKKwlkd2NlcCA9ICZlcC0+ZHdjX2VwOworCisJaWYgKGR3Y2VwLT54aXNvX2FjdGl2ZV94ZmVycyA+IDApIHsKKyNpZiAwCS8vRGlzYWJsZSB0aGlzIHRvIGRlY3JlYXNlIHMvdyBvdmVyaGVhZCB0aGF0IGlzIGNydWNpYWwgZm9yIElzb2MgdHJhbnNmZXJzCisJCURXQ19XQVJOKCJUaGVyZSBhcmUgY3VycmVudGx5IGFjdGl2ZSB0cmFuc2ZlcnMgZm9yIEVQJWQgXAorCQkJCShhY3RpdmU9JWQ7IHF1ZXVlZD0lZCkiLCBkd2NlcC0+bnVtLCBkd2NlcC0+eGlzb19hY3RpdmVfeGZlcnMsIAorCQkJCWR3Y2VwLT54aXNvX3F1ZXVlZF94ZmVycyk7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJfQorCisJbmF0ID0gVUdFVFcoZXAtPmRlc2MtPndNYXhQYWNrZXRTaXplKTsKKwluYXQgPSAobmF0ID4+IDExKSAmIDB4MDM7CisKKwlpZiAoIURXQ19DSVJDTEVRX0VNUFRZKCZlcC0+cXVldWUpKSB7CisJCXJlcSA9IERXQ19DSVJDTEVRX0ZJUlNUKCZlcC0+cXVldWUpOworCQllcmVxID0gJnJlcS0+ZXh0X3JlcTsKKwkJZXAtPnN0b3BwZWQgPSAwOworCisJCS8qIEdldCB0aGUgZnJhbWUgbnVtYmVyICovCisJCWR3Y2VwLT54aXNvX2ZyYW1lX251bSA9CisJCSAgICBkd2Nfb3RnX2dldF9mcmFtZV9udW1iZXIoR0VUX0NPUkVfSUYocGNkKSk7CisJCURXQ19ERUJVRygiRlJNX05VTT0lZCIsIGR3Y2VwLT54aXNvX2ZyYW1lX251bSk7CisKKwkJZGRlc2NfaXNvID0gZXJlcS0+cGVyX2lvX2ZyYW1lX2Rlc2NzOworCisJCWlmIChkd2NlcC0+aXNfaW4pIHsKKwkJCS8qIFNldHVwIERNQSBEZXNjcmlwdG9yIGNoYWluIGZvciBJTiBJc29jIHJlcXVlc3QgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBlcmVxLT5waW9fcGt0X2NvdW50OyBpKyspIHsKKwkJCQkvL2lmICgoaSAlIChuYXQgKyAxKSkgPT0gMCkKKwkJCQlpZiAoIGkgPiAwICkKKwkJCQkJZHdjZXAtPnhpc29fZnJhbWVfbnVtID0gKGR3Y2VwLT54aXNvX2JJbnRlcnZhbCArCisJCQkJCQkJCQkJZHdjZXAtPnhpc29fZnJhbWVfbnVtKSAmIDB4M0ZGRjsKKwkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLmJ1ZiA9CisJCQkJICAgIHJlcS0+ZG1hICsgZGRlc2NfaXNvW2ldLm9mZnNldDsKKwkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLnN0YXR1cy5iX2lzb19pbi50eGJ5dGVzID0KKwkJCQkgICAgZGRlc2NfaXNvW2ldLmxlbmd0aDsKKwkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLnN0YXR1cy5iX2lzb19pbi5mcmFtZW51bSA9CisJCQkJICAgIGR3Y2VwLT54aXNvX2ZyYW1lX251bTsKKwkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLnN0YXR1cy5iX2lzb19pbi5icyA9CisJCQkJICAgIEJTX0hPU1RfUkVBRFk7CisJCQkJZHdjZXAtPmRlc2NfYWRkcltpXS5zdGF0dXMuYl9pc29faW4udHhzdHMgPSAwOworCQkJCWR3Y2VwLT5kZXNjX2FkZHJbaV0uc3RhdHVzLmJfaXNvX2luLnNwID0KKwkJCQkgICAgKGRkZXNjX2lzb1tpXS5sZW5ndGggJQorCQkJCSAgICAgZHdjZXAtPm1heHBhY2tldCkgPyAxIDogMDsKKwkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLnN0YXR1cy5iX2lzb19pbi5pb2MgPSAwOworCQkJCWR3Y2VwLT5kZXNjX2FkZHJbaV0uc3RhdHVzLmJfaXNvX2luLnBpZCA9IG5hdCArIDE7CisJCQkJZHdjZXAtPmRlc2NfYWRkcltpXS5zdGF0dXMuYl9pc29faW4ubCA9IDA7CisKKwkJCQkvKiBQcm9jZXNzIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwkJCQlpZiAoaSA9PSBlcmVxLT5waW9fcGt0X2NvdW50IC0gMSkgeworCQkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLnN0YXR1cy5iX2lzb19pbi5pb2MgPSAxOworCQkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLnN0YXR1cy5iX2lzb19pbi5sID0gMTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFNldHVwIGFuZCBzdGFydCB0aGUgdHJhbnNmZXIgZm9yIHRoaXMgZW5kcG9pbnQgKi8KKwkJCWR3Y2VwLT54aXNvX2FjdGl2ZV94ZmVycysrOworCQkJRFdDX1dSSVRFX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWYtPgorCQkJCQlpbl9lcF9yZWdzW2R3Y2VwLT5udW1dLT5kaWVwZG1hLAorCQkJCQlkd2NlcC0+ZG1hX2Rlc2NfYWRkcik7CisJCQlkaWVwY3RsLmQzMiA9IDA7CisJCQlkaWVwY3RsLmIuZXBlbmEgPSAxOworCQkJZGllcGN0bC5iLmNuYWsgPSAxOworCQkJRFdDX01PRElGWV9SRUczMigmR0VUX0NPUkVfSUYocGNkKS0+ZGV2X2lmLT4KKwkJCQkJIGluX2VwX3JlZ3NbZHdjZXAtPm51bV0tPmRpZXBjdGwsIDAsCisJCQkJCSBkaWVwY3RsLmQzMik7CisJCX0gZWxzZSB7CisJCQkvKiBTZXR1cCBETUEgRGVzY3JpcHRvciBjaGFpbiBmb3IgT1VUIElzb2MgcmVxdWVzdCAqLworCQkJZm9yIChpID0gMDsgaSA8IGVyZXEtPnBpb19wa3RfY291bnQ7IGkrKykgeworCQkJCS8vaWYgKChpICUgKG5hdCArIDEpKSA9PSAwKQorCQkJCWR3Y2VwLT54aXNvX2ZyYW1lX251bSA9IChkd2NlcC0+eGlzb19iSW50ZXJ2YWwgKyAKKwkJCQkJCQkJCQlkd2NlcC0+eGlzb19mcmFtZV9udW0pICYgMHgzRkZGOworCQkJCWR3Y2VwLT5kZXNjX2FkZHJbaV0uYnVmID0KKwkJCQkgICAgcmVxLT5kbWEgKyBkZGVzY19pc29baV0ub2Zmc2V0OworCQkJCWR3Y2VwLT5kZXNjX2FkZHJbaV0uc3RhdHVzLmJfaXNvX291dC5yeGJ5dGVzID0KKwkJCQkgICAgZGRlc2NfaXNvW2ldLmxlbmd0aDsKKwkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLnN0YXR1cy5iX2lzb19vdXQuZnJhbWVudW0gPQorCQkJCSAgICBkd2NlcC0+eGlzb19mcmFtZV9udW07CisJCQkJZHdjZXAtPmRlc2NfYWRkcltpXS5zdGF0dXMuYl9pc29fb3V0LmJzID0KKwkJCQkgICAgQlNfSE9TVF9SRUFEWTsKKwkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLnN0YXR1cy5iX2lzb19vdXQucnhzdHMgPSAwOworCQkJCWR3Y2VwLT5kZXNjX2FkZHJbaV0uc3RhdHVzLmJfaXNvX291dC5zcCA9CisJCQkJICAgIChkZGVzY19pc29baV0ubGVuZ3RoICUKKwkJCQkgICAgIGR3Y2VwLT5tYXhwYWNrZXQpID8gMSA6IDA7CisJCQkJZHdjZXAtPmRlc2NfYWRkcltpXS5zdGF0dXMuYl9pc29fb3V0LmlvYyA9IDA7CisJCQkJZHdjZXAtPmRlc2NfYWRkcltpXS5zdGF0dXMuYl9pc29fb3V0LnBpZCA9IG5hdCArIDE7CisJCQkJZHdjZXAtPmRlc2NfYWRkcltpXS5zdGF0dXMuYl9pc29fb3V0LmwgPSAwOworCQkJCQorCQkJCS8qIFByb2Nlc3MgdGhlIGxhc3QgZGVzY3JpcHRvciAqLworCQkJCWlmIChpID09IGVyZXEtPnBpb19wa3RfY291bnQgLSAxKSB7CisJCQkJCWR3Y2VwLT5kZXNjX2FkZHJbaV0uc3RhdHVzLmJfaXNvX291dC5pb2MgPSAxOworCQkJCQlkd2NlcC0+ZGVzY19hZGRyW2ldLnN0YXR1cy5iX2lzb19vdXQubCA9IDE7CisJCQkJfQkJCQorCQkJfQorCQkJCisJCQkvKiBTZXR1cCBhbmQgc3RhcnQgdGhlIHRyYW5zZmVyIGZvciB0aGlzIGVuZHBvaW50ICovCisJCQlkd2NlcC0+eGlzb19hY3RpdmVfeGZlcnMrKzsKKwkJCURXQ19XUklURV9SRUczMigmR0VUX0NPUkVfSUYocGNkKS0+ZGV2X2lmLT4KKwkJCQkJb3V0X2VwX3JlZ3NbZHdjZXAtPm51bV0tPmRvZXBkbWEsCisJCQkJCWR3Y2VwLT5kbWFfZGVzY19hZGRyKTsKKwkJCWRpZXBjdGwuZDMyID0gMDsKKwkJCWRpZXBjdGwuYi5lcGVuYSA9IDE7CisJCQlkaWVwY3RsLmIuY25hayA9IDE7CisJCQlEV0NfTU9ESUZZX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWYtPgorCQkJCQkgb3V0X2VwX3JlZ3NbZHdjZXAtPm51bV0tPmRvZXBjdGwsIDAsCisJCQkJCSBkaWVwY3RsLmQzMik7CisJCX0KKworCX0gZWxzZSB7CisJCWVwLT5zdG9wcGVkID0gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgktIFJlbW92ZSB0aGUgcmVxdWVzdCBmcm9tIHRoZSBxdWV1ZQorICovCit2b2lkIGNvbXBsZXRlX3hpc29fZXAoZHdjX290Z19wY2RfZXBfdCAqIGVwKQoreworCWR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqcmVxID0gTlVMTDsKKwlzdHJ1Y3QgZHdjX2lzb194cmVxX3BvcnQgKmVyZXEgPSBOVUxMOworCXN0cnVjdCBkd2NfaXNvX3BrdF9kZXNjX3BvcnQgKmRkZXNjX2lzbyA9IE5VTEw7CisJZHdjX2VwX3QgKmR3Y2VwID0gTlVMTDsKKwlpbnQgaTsKKworCS8vRFdDX0RFQlVHKCk7CisJZHdjZXAgPSAmZXAtPmR3Y19lcDsKKworCS8qIEdldCB0aGUgZmlyc3QgcGVuZGluZyByZXF1ZXN0IGZyb20gdGhlIHF1ZXVlICovCisJaWYgKCFEV0NfQ0lSQ0xFUV9FTVBUWSgmZXAtPnF1ZXVlKSkgeworCQlyZXEgPSBEV0NfQ0lSQ0xFUV9GSVJTVCgmZXAtPnF1ZXVlKTsKKwkJaWYgKCFyZXEpIHsKKwkJCURXQ19QUklOVEYoImNvbXBsZXRlX2VwIDB4JXAsIHJlcSA9IE5VTEwhXG4iLCBlcCk7CisJCQlyZXR1cm47CisJCX0KKwkJZHdjZXAtPnhpc29fYWN0aXZlX3hmZXJzLS07CisJCWR3Y2VwLT54aXNvX3F1ZXVlZF94ZmVycy0tOworCQkvKiBSZW1vdmUgdGhpcyByZXF1ZXN0IGZyb20gdGhlIHF1ZXVlICovCisJCURXQ19DSVJDTEVRX1JFTU9WRV9JTklUKCZlcC0+cXVldWUsIHJlcSwgcXVldWVfZW50cnkpOworCX0gZWxzZSB7CisJCURXQ19QUklOVEYoImNvbXBsZXRlX2VwIDB4JXAsIGVwLT5xdWV1ZSBlbXB0eSFcbiIsIGVwKTsKKwkJcmV0dXJuOworCX0KKworCWVwLT5zdG9wcGVkID0gMTsKKwllcmVxID0gJnJlcS0+ZXh0X3JlcTsKKwlkZGVzY19pc28gPSBlcmVxLT5wZXJfaW9fZnJhbWVfZGVzY3M7CisKKwlpZiAoZHdjZXAtPnhpc29fYWN0aXZlX3hmZXJzIDwgMCkgeworCQlEV0NfV0FSTigiRVAjJWQgKHhpc29fYWN0aXZlX3hmZXJzPSVkKSIsIGR3Y2VwLT5udW0sCisJCQkgZHdjZXAtPnhpc29fYWN0aXZlX3hmZXJzKTsKKwl9CisKKwkvKiBGaWxsIHRoZSBJc29jIGRlc2NzIG9mIHBvcnRhYmxlIGV4dGVuZGVkIHJlcSBmcm9tIGRtYSBkZXNjcmlwdG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBlcmVxLT5waW9fcGt0X2NvdW50OyBpKyspIHsKKwkJaWYgKGR3Y2VwLT5pc19pbikgewkvKiBJTiBlbmRwb2ludHMgKi8KKwkJCWRkZXNjX2lzb1tpXS5hY3R1YWxfbGVuZ3RoID0gZGRlc2NfaXNvW2ldLmxlbmd0aCAtCisJCQkgICAgZHdjZXAtPmRlc2NfYWRkcltpXS5zdGF0dXMuYl9pc29faW4udHhieXRlczsKKwkJCWRkZXNjX2lzb1tpXS5zdGF0dXMgPQorCQkJICAgIGR3Y2VwLT5kZXNjX2FkZHJbaV0uc3RhdHVzLmJfaXNvX2luLnR4c3RzOworCQl9IGVsc2UgewkvKiBPVVQgZW5kcG9pbnRzICovCisJCQlkZGVzY19pc29baV0uYWN0dWFsX2xlbmd0aCA9IGRkZXNjX2lzb1tpXS5sZW5ndGggLQorCQkJICAgIGR3Y2VwLT5kZXNjX2FkZHJbaV0uc3RhdHVzLmJfaXNvX291dC5yeGJ5dGVzOworCQkJZGRlc2NfaXNvW2ldLnN0YXR1cyA9CisJCQkgICAgZHdjZXAtPmRlc2NfYWRkcltpXS5zdGF0dXMuYl9pc29fb3V0LnJ4c3RzOworCQl9CisJfQorCisJRFdDX1NQSU5VTkxPQ0soZXAtPnBjZC0+bG9jayk7CisKKwkvKiBDYWxsIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uIGluIHRoZSBub24tcG9ydGFibGUgbG9naWMgKi8KKwllcC0+cGNkLT5mb3BzLT54aXNvY19jb21wbGV0ZShlcC0+cGNkLCBlcC0+cHJpdiwgcmVxLT5wcml2LCAwLAorCQkJCSAgICAgICZyZXEtPmV4dF9yZXEpOworCisJRFdDX1NQSU5MT0NLKGVwLT5wY2QtPmxvY2spOworCisJLyogRnJlZSB0aGUgcmVxdWVzdCAtIHNwZWNpZmljIGZyZWVpbmcgbmVlZGVkIGZvciBleHRlbmRlZCByZXF1ZXN0IG9iamVjdCAqLworCWR3Y19wY2RfeGlzb19lcmVxX2ZyZWUoZXAsIHJlcSk7CisKKwkvKiBTdGFydCB0aGUgbmV4dCByZXF1ZXN0ICovCisJZHdjX290Z19wY2RfeGlzb19zdGFydF9uZXh0X3JlcXVlc3QoZXAtPnBjZCwgZXApOworCisJcmV0dXJuOworfQorCisvKioKKyAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgSXNvYyBwa3QgZGVzY3JpcHRvcnMgb2YgdGhlIGV4dGVuZGVkIHJlcXVlc3QuCisgKgorICovCitzdGF0aWMgaW50IGR3Y19vdGdfcGNkX3hpc29fY3JlYXRlX3BrdF9kZXNjcyhkd2Nfb3RnX3BjZF9yZXF1ZXN0X3QgKiByZXEsCisJCQkJCSAgICAgdm9pZCAqZXJlcV9ub25wb3J0LAorCQkJCQkgICAgIGludCBhdG9taWNfYWxsb2MpCit7CisJc3RydWN0IGR3Y19pc29feHJlcV9wb3J0ICplcmVxID0gTlVMTDsKKwlzdHJ1Y3QgZHdjX2lzb194cmVxX3BvcnQgKnJlcV9tYXBwZWQgPSBOVUxMOworCXN0cnVjdCBkd2NfaXNvX3BrdF9kZXNjX3BvcnQgKmlwZHMgPSBOVUxMOwkvKiBUbyBiZSBjcmVhdGVkIGluIHRoaXMgZnVuY3Rpb24gKi8KKwl1aW50MzJfdCBwa3RfY291bnQ7CisJaW50IGk7CisKKwllcmVxID0gJnJlcS0+ZXh0X3JlcTsKKwlyZXFfbWFwcGVkID0gKHN0cnVjdCBkd2NfaXNvX3hyZXFfcG9ydCAqKWVyZXFfbm9ucG9ydDsKKwlwa3RfY291bnQgPSByZXFfbWFwcGVkLT5waW9fcGt0X2NvdW50OworCisJLyogQ3JlYXRlIHRoZSBpc29jIGRlc2NzICovCisJaWYgKGF0b21pY19hbGxvYykgeworCQlpcGRzID0gRFdDX0FMTE9DX0FUT01JQyhzaXplb2YoKmlwZHMpICogcGt0X2NvdW50KTsKKwl9IGVsc2UgeworCQlpcGRzID0gRFdDX0FMTE9DKHNpemVvZigqaXBkcykgKiBwa3RfY291bnQpOworCX0KKworCWlmICghaXBkcykgeworCQlEV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBpc29jIGRlc2NyaXB0b3JzIik7CisJCXJldHVybiAtRFdDX0VfTk9fTUVNT1JZOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGV4dGVuZGVkIHJlcXVlc3QgZmllbGRzICovCisJZXJlcS0+cGVyX2lvX2ZyYW1lX2Rlc2NzID0gaXBkczsKKwllcmVxLT5lcnJvcl9jb3VudCA9IDA7CisJZXJlcS0+cGlvX2FsbG9jX3BrdF9jb3VudCA9IHBrdF9jb3VudDsKKwllcmVxLT5waW9fcGt0X2NvdW50ID0gcGt0X2NvdW50OworCWVyZXEtPnRyX3N1Yl9mbGFncyA9IHJlcV9tYXBwZWQtPnRyX3N1Yl9mbGFnczsKKworCS8qIEluaXQgdGhlIElzb2MgZGVzY3JpcHRvcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGt0X2NvdW50OyBpKyspIHsKKwkJaXBkc1tpXS5sZW5ndGggPSByZXFfbWFwcGVkLT5wZXJfaW9fZnJhbWVfZGVzY3NbaV0ubGVuZ3RoOworCQlpcGRzW2ldLm9mZnNldCA9IHJlcV9tYXBwZWQtPnBlcl9pb19mcmFtZV9kZXNjc1tpXS5vZmZzZXQ7CisJCWlwZHNbaV0uc3RhdHVzID0gcmVxX21hcHBlZC0+cGVyX2lvX2ZyYW1lX2Rlc2NzW2ldLnN0YXR1czsJLyogMCAqLworCQlpcGRzW2ldLmFjdHVhbF9sZW5ndGggPQorCQkgICAgcmVxX21hcHBlZC0+cGVyX2lvX2ZyYW1lX2Rlc2NzW2ldLmFjdHVhbF9sZW5ndGg7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBybl9leHRfcmVxdWVzdChzdHJ1Y3QgZHdjX2lzb194cmVxX3BvcnQgKmVyZXEpCit7CisJc3RydWN0IGR3Y19pc29fcGt0X2Rlc2NfcG9ydCAqeGZkID0gTlVMTDsKKwlpbnQgaTsKKworCURXQ19ERUJVRygicGVyX2lvX2ZyYW1lX2Rlc2NzPSVwIiwgZXJlcS0+cGVyX2lvX2ZyYW1lX2Rlc2NzKTsKKwlEV0NfREVCVUcoInRyX3N1Yl9mbGFncz0lZCIsIGVyZXEtPnRyX3N1Yl9mbGFncyk7CisJRFdDX0RFQlVHKCJlcnJvcl9jb3VudD0lZCIsIGVyZXEtPmVycm9yX2NvdW50KTsKKwlEV0NfREVCVUcoInBpb19hbGxvY19wa3RfY291bnQ9JWQiLCBlcmVxLT5waW9fYWxsb2NfcGt0X2NvdW50KTsKKwlEV0NfREVCVUcoInBpb19wa3RfY291bnQ9JWQiLCBlcmVxLT5waW9fcGt0X2NvdW50KTsKKwlEV0NfREVCVUcoInJlcz0lZCIsIGVyZXEtPnJlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZXJlcS0+cGlvX3BrdF9jb3VudDsgaSsrKSB7CisJCXhmZCA9ICZlcmVxLT5wZXJfaW9fZnJhbWVfZGVzY3NbMF07CisJCURXQ19ERUJVRygiRkQgIyVkIiwgaSk7CisKKwkJRFdDX0RFQlVHKCJ4ZmQtPmFjdHVhbF9sZW5ndGg9JWQiLCB4ZmQtPmFjdHVhbF9sZW5ndGgpOworCQlEV0NfREVCVUcoInhmZC0+bGVuZ3RoPSVkIiwgeGZkLT5sZW5ndGgpOworCQlEV0NfREVCVUcoInhmZC0+b2Zmc2V0PSVkIiwgeGZkLT5vZmZzZXQpOworCQlEV0NfREVCVUcoInhmZC0+c3RhdHVzPSVkIiwgeGZkLT5zdGF0dXMpOworCX0KK30KKworLyoqCisgKgorICovCitpbnQgZHdjX290Z19wY2RfeGlzb19lcF9xdWV1ZShkd2Nfb3RnX3BjZF90ICogcGNkLCB2b2lkICplcF9oYW5kbGUsCisJCQkgICAgICB1aW50OF90ICogYnVmLCBkd2NfZG1hX3QgZG1hX2J1ZiwgdWludDMyX3QgYnVmbGVuLAorCQkJICAgICAgaW50IHplcm8sIHZvaWQgKnJlcV9oYW5kbGUsIGludCBhdG9taWNfYWxsb2MsCisJCQkgICAgICB2b2lkICplcmVxX25vbnBvcnQpCit7CisJZHdjX290Z19wY2RfcmVxdWVzdF90ICpyZXEgPSBOVUxMOworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCWR3Y19pcnFmbGFnc190IGZsYWdzOworCWludCByZXM7CisKKwllcCA9IGdldF9lcF9mcm9tX2hhbmRsZShwY2QsIGVwX2hhbmRsZSk7CisJaWYgKCFlcCkgeworCQlEV0NfV0FSTigiYmFkIGVwXG4iKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCS8qIFdlIHN1cHBvcnQgdGhpcyBleHRlbnNpb24gb25seSBmb3IgRERNQSBtb2RlICovCisJaWYgKGVwLT5kd2NfZXAudHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykKKwkJaWYgKCFHRVRfQ09SRV9JRihwY2QpLT5kbWFfZGVzY19lbmFibGUpCisJCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisKKwkvKiBDcmVhdGUgYSBkd2Nfb3RnX3BjZF9yZXF1ZXN0X3Qgb2JqZWN0ICovCisJaWYgKGF0b21pY19hbGxvYykgeworCQlyZXEgPSBEV0NfQUxMT0NfQVRPTUlDKHNpemVvZigqcmVxKSk7CisJfSBlbHNlIHsKKwkJcmVxID0gRFdDX0FMTE9DKHNpemVvZigqcmVxKSk7CisJfQorCisJaWYgKCFyZXEpIHsKKwkJcmV0dXJuIC1EV0NfRV9OT19NRU1PUlk7CisJfQorCisJLyogQ3JlYXRlIHRoZSBJc29jIGRlc2NzIGZvciB0aGlzIHJlcXVlc3Qgd2hpY2ggc2hhbGwgYmUgdGhlIGV4YWN0IG1hdGNoCisJICogb2YgdGhlIHN0cnVjdHVyZSBzZW50IHRvIHVzIGZyb20gdGhlIG5vbi1wb3J0YWJsZSBsb2dpYyAqLworCXJlcyA9CisJICAgIGR3Y19vdGdfcGNkX3hpc29fY3JlYXRlX3BrdF9kZXNjcyhyZXEsIGVyZXFfbm9ucG9ydCwgYXRvbWljX2FsbG9jKTsKKwlpZiAocmVzKSB7CisJCURXQ19XQVJOKCJGYWlsZWQgdG8gaW5pdCB0aGUgSXNvYyBkZXNjcmlwdG9ycyIpOworCQlEV0NfRlJFRShyZXEpOworCQlyZXR1cm4gcmVzOworCX0KKworCURXQ19TUElOTE9DS19JUlFTQVZFKHBjZC0+bG9jaywgJmZsYWdzKTsKKworCURXQ19DSVJDTEVRX0lOSVRfRU5UUlkocmVxLCBxdWV1ZV9lbnRyeSk7CisJcmVxLT5idWYgPSBidWY7CisJcmVxLT5kbWEgPSBkbWFfYnVmOworCXJlcS0+bGVuZ3RoID0gYnVmbGVuOworCXJlcS0+c2VudF96bHAgPSB6ZXJvOworCXJlcS0+cHJpdiA9IHJlcV9oYW5kbGU7CisKKwkvL0RXQ19TUElOTE9DS19JUlFTQVZFKHBjZC0+bG9jaywgJmZsYWdzKTsKKwllcC0+ZHdjX2VwLmRtYV9hZGRyID0gZG1hX2J1ZjsKKwllcC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9IGJ1ZjsKKwllcC0+ZHdjX2VwLnhmZXJfYnVmZiA9IGJ1ZjsKKwllcC0+ZHdjX2VwLnhmZXJfbGVuID0gMDsKKwllcC0+ZHdjX2VwLnhmZXJfY291bnQgPSAwOworCWVwLT5kd2NfZXAuc2VudF96bHAgPSAwOworCWVwLT5kd2NfZXAudG90YWxfbGVuID0gYnVmbGVuOworCisJLyogQWRkIHRoaXMgcmVxdWVzdCB0byB0aGUgdGFpbCAqLworCURXQ19DSVJDTEVRX0lOU0VSVF9UQUlMKCZlcC0+cXVldWUsIHJlcSwgcXVldWVfZW50cnkpOworCWVwLT5kd2NfZXAueGlzb19xdWV1ZWRfeGZlcnMrKzsKKworLy9EV0NfREVCVUcoIkNQXzAiKTsKKy8vRFdDX0RFQlVHKCJyZXEtPmV4dF9yZXEudHJfc3ViX2ZsYWdzPSVkIiwgcmVxLT5leHRfcmVxLnRyX3N1Yl9mbGFncyk7CisvL3Bybl9leHRfcmVxdWVzdCgoc3RydWN0IGR3Y19pc29feHJlcV9wb3J0ICopIGVyZXFfbm9ucG9ydCk7CisvL3Bybl9leHRfcmVxdWVzdCgmcmVxLT5leHRfcmVxKTsKKworCS8vRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShwY2QtPmxvY2ssIGZsYWdzKTsKKworCS8qIElmIHRoZSByZXEtPnN0YXR1cyA9PSBBU0FQICB0aGVuIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBhY3RpdmUgdHJhbnNmZXIKKwkgKiBmb3IgdGhpcyBlbmRwb2ludC4gSWYgbm8gYWN0aXZlIHRyYW5zZmVycywgdGhlbiBnZXQgdGhlIGZpcnN0IGVudHJ5CisJICogZnJvbSB0aGUgcXVldWUgYW5kIHN0YXJ0IHRoYXQgdHJhbnNmZXIKKwkgKi8KKwlpZiAocmVxLT5leHRfcmVxLnRyX3N1Yl9mbGFncyA9PSBEV0NfRVJFUV9URl9BU0FQKSB7CisJCXJlcyA9IGR3Y19vdGdfcGNkX3hpc29fc3RhcnRfbmV4dF9yZXF1ZXN0KHBjZCwgZXApOworCQlpZiAocmVzKSB7CisJCQlEV0NfV0FSTigiRmFpbGVkIHRvIHN0YXJ0IHRoZSBuZXh0IElzb2MgdHJhbnNmZXIiKTsKKwkJCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUocGNkLT5sb2NrLCBmbGFncyk7CisJCQlEV0NfRlJFRShyZXEpOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUocGNkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorLyogRU5EIGlmZGVmIERXQ19VVEVfUEVSX0lPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkd2Nfb3RnX3BjZF9lcF9xdWV1ZShkd2Nfb3RnX3BjZF90ICogcGNkLCB2b2lkICplcF9oYW5kbGUsCisJCQkgdWludDhfdCAqIGJ1ZiwgZHdjX2RtYV90IGRtYV9idWYsIHVpbnQzMl90IGJ1ZmxlbiwKKwkJCSBpbnQgemVybywgdm9pZCAqcmVxX2hhbmRsZSwgaW50IGF0b21pY19hbGxvYykKK3sKKwlkd2NfaXJxZmxhZ3NfdCBmbGFnczsKKwlkd2Nfb3RnX3BjZF9yZXF1ZXN0X3QgKnJlcTsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDsKKwl1aW50MzJfdCBtYXhfdHJhbnNmZXI7CisKKwllcCA9IGdldF9lcF9mcm9tX2hhbmRsZShwY2QsIGVwX2hhbmRsZSk7CisJaWYgKCFlcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5kd2NfZXAubnVtICE9IDApKSB7CisJCURXQ19XQVJOKCJiYWQgZXBcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJaWYgKGF0b21pY19hbGxvYykgeworCQlyZXEgPSBEV0NfQUxMT0NfQVRPTUlDKHNpemVvZigqcmVxKSk7CisJfSBlbHNlIHsKKwkJcmVxID0gRFdDX0FMTE9DKHNpemVvZigqcmVxKSk7CisJfQorCisJaWYgKCFyZXEpIHsKKwkJcmV0dXJuIC1EV0NfRV9OT19NRU1PUlk7CisJfQorCURXQ19DSVJDTEVRX0lOSVRfRU5UUlkocmVxLCBxdWV1ZV9lbnRyeSk7CisJaWYgKCFHRVRfQ09SRV9JRihwY2QpLT5jb3JlX3BhcmFtcy0+b3B0KSB7CisJCWlmIChlcC0+ZHdjX2VwLm51bSAhPSAwKSB7CisJCQlEV0NfRVJST1IoInF1ZXVlIHJlcSAlcCwgbGVuICVkIGJ1ZiAlcFxuIiwKKwkJCQkgIHJlcV9oYW5kbGUsIGJ1ZmxlbiwgYnVmKTsKKwkJfQorCX0KKworCXJlcS0+YnVmID0gYnVmOworCXJlcS0+ZG1hID0gZG1hX2J1ZjsKKwlyZXEtPmxlbmd0aCA9IGJ1ZmxlbjsKKwlyZXEtPnNlbnRfemxwID0gemVybzsKKwlyZXEtPnByaXYgPSByZXFfaGFuZGxlOworCXJlcS0+ZHdfYWxpZ25fYnVmID0gTlVMTDsKKwlpZiAoKGRtYV9idWYgJiAweDMpICYmIEdFVF9DT1JFX0lGKHBjZCktPmRtYV9lbmFibGUKKwkJCSYmICFHRVRfQ09SRV9JRihwY2QpLT5kbWFfZGVzY19lbmFibGUpCisJCXJlcS0+ZHdfYWxpZ25fYnVmID0gRFdDX0RNQV9BTExPQyhidWZsZW4sCisJCQkJICZyZXEtPmR3X2FsaWduX2J1Zl9kbWEpOworCURXQ19TUElOTE9DS19JUlFTQVZFKHBjZC0+bG9jaywgJmZsYWdzKTsKKworCS8qCisJICogQWZ0ZXIgYWRkaW5nIHJlcXVlc3QgdG8gdGhlIHF1ZXVlIGZvciBJTiBJU09DIHdhaXQgZm9yIEluIFRva2VuIFJlY2VpdmVkCisJICogd2hlbiBUWCBGSUZPIGlzIGVtcHR5IGludGVycnVwdCBhbmQgZm9yIE9VVCBJU09DIHdhaXQgZm9yIE9VVCBUb2tlbiAKKwkgKiBSZWNlaXZlZCB3aGVuIEVQIGlzIGRpc2FibGVkIGludGVycnVwdCB0byBvYnRhaW4gc3RhcnRpbmcgbWljcm9mcmFtZQorCSAqIChvZGQvZXZlbikgc3RhcnQgdHJhbnNmZXIKKwkgKi8KKwlpZiAoZXAtPmR3Y19lcC50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKQorCXsKKwkJaWYgKHJlcSAhPSAwKSB7CisJCQlkZXBjdGxfZGF0YV90IGRlcGN0bCA9IHsuZDMyID0gRFdDX1JFQURfUkVHMzIoJnBjZC0+Y29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2VwLT5kd2NfZXAubnVtXS0+ZGllcGN0bCl9OworCQkJKytwY2QtPnJlcXVlc3RfcGVuZGluZzsKKworCQkJRFdDX0NJUkNMRVFfSU5TRVJUX1RBSUwoJmVwLT5xdWV1ZSwgcmVxLCBxdWV1ZV9lbnRyeSk7CisJCQlpZiAoZXAtPmR3Y19lcC5pc19pbikKKwkJCXsKKwkJCQlkZXBjdGwuYi5jbmFrID0gMTsKKwkJCQlEV0NfV1JJVEVfUkVHMzIoJnBjZC0+Y29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2VwLT5kd2NfZXAubnVtXS0+ZGllcGN0bCwgZGVwY3RsLmQzMik7CisJCQl9CisJCQkKKwkJCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUocGNkLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBGb3IgRVAwIElOIHdpdGhvdXQgcHJlbWF0dXJlIHN0YXR1cywgemxwIGlzIHJlcXVpcmVkPworCSAqLworCWlmIChlcC0+ZHdjX2VwLm51bSA9PSAwICYmIGVwLT5kd2NfZXAuaXNfaW4pIHsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlZC1PVVQgWkxQXG4iLCBlcC0+ZHdjX2VwLm51bSk7CisJCS8vX3JlcS0+emVybyA9IDE7CisJfQorCisJLyogU3RhcnQgdGhlIHRyYW5zZmVyICovCisJaWYgKERXQ19DSVJDTEVRX0VNUFRZKCZlcC0+cXVldWUpICYmICFlcC0+c3RvcHBlZCkgeworCQkvKiBFUDAgVHJhbnNmZXI/ICovCisJCWlmIChlcC0+ZHdjX2VwLm51bSA9PSAwKSB7CisJCQlzd2l0Y2ggKHBjZC0+ZXAwc3RhdGUpIHsKKwkJCWNhc2UgRVAwX0lOX0RBVEFfUEhBU0U6CisJCQkJRFdDX0RFQlVHUEwoREJHX1BDRCwKKwkJCQkJICAgICIlcyBlcDA6IEVQMF9JTl9EQVRBX1BIQVNFXG4iLAorCQkJCQkgICAgX19mdW5jX18pOworCQkJCWJyZWFrOworCisJCQljYXNlIEVQMF9PVVRfREFUQV9QSEFTRToKKwkJCQlEV0NfREVCVUdQTChEQkdfUENELAorCQkJCQkgICAgIiVzIGVwMDogRVAwX09VVF9EQVRBX1BIQVNFXG4iLAorCQkJCQkgICAgX19mdW5jX18pOworCQkJCWlmIChwY2QtPnJlcXVlc3RfY29uZmlnKSB7CisJCQkJCS8qIENvbXBsZXRlIFNUQVRVUyBQSEFTRSAqLworCQkJCQllcC0+ZHdjX2VwLmlzX2luID0gMTsKKwkJCQkJcGNkLT5lcDBzdGF0ZSA9IEVQMF9JTl9TVEFUVVNfUEhBU0U7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIEVQMF9JTl9TVEFUVVNfUEhBU0U6CisJCQkJRFdDX0RFQlVHUEwoREJHX1BDRCwKKwkJCQkJICAgICIlcyBlcDA6IEVQMF9JTl9TVEFUVVNfUEhBU0VcbiIsCisJCQkJCSAgICBfX2Z1bmNfXyk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwgImVwMDogb2RkIHN0YXRlICVkXG4iLAorCQkJCQkgICAgcGNkLT5lcDBzdGF0ZSk7CisJCQkJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShwY2QtPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gLURXQ19FX1NIVVRET1dOOworCQkJfQorCisJCQllcC0+ZHdjX2VwLmRtYV9hZGRyID0gZG1hX2J1ZjsKKwkJCWVwLT5kd2NfZXAuc3RhcnRfeGZlcl9idWZmID0gYnVmOworCQkJZXAtPmR3Y19lcC54ZmVyX2J1ZmYgPSBidWY7CisJCQllcC0+ZHdjX2VwLnhmZXJfbGVuID0gYnVmbGVuOworCQkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ID0gMDsKKwkJCWVwLT5kd2NfZXAuc2VudF96bHAgPSAwOworCQkJZXAtPmR3Y19lcC50b3RhbF9sZW4gPSBlcC0+ZHdjX2VwLnhmZXJfbGVuOworCisJCQlpZiAoemVybykgeworCQkJCWlmICgoZXAtPmR3Y19lcC54ZmVyX2xlbiAlCisJCQkJICAgICBlcC0+ZHdjX2VwLm1heHBhY2tldCA9PSAwKQorCQkJCSAgICAmJiAoZXAtPmR3Y19lcC54ZmVyX2xlbiAhPSAwKSkgeworCQkJCQllcC0+ZHdjX2VwLnNlbnRfemxwID0gMTsKKwkJCQl9CisKKwkJCX0KKworCQkJZHdjX290Z19lcDBfc3RhcnRfdHJhbnNmZXIoR0VUX0NPUkVfSUYocGNkKSwKKwkJCQkJCSAgICZlcC0+ZHdjX2VwKTsKKwkJfQkJLy8gbm9uLWVwMCBlbmRwb2ludHMKKwkJZWxzZSB7CisjaWZkZWYgRFdDX1VURV9DRkkKKwkJCWlmIChlcC0+ZHdjX2VwLmJ1ZmZfbW9kZSAhPSBCTV9TVEFOREFSRCkgeworCQkJCS8qIHN0b3JlIHRoZSByZXF1ZXN0IGxlbmd0aCAqLworCQkJCWVwLT5kd2NfZXAuY2ZpX3JlcV9sZW4gPSBidWZsZW47CisJCQkJcGNkLT5jZmktPm9wcy5idWlsZF9kZXNjcmlwdG9ycyhwY2QtPmNmaSwgcGNkLAorCQkJCQkJCQllcCwgcmVxKTsKKwkJCX0gZWxzZSB7CisjZW5kaWYKKwkJCQltYXhfdHJhbnNmZXIgPQorCQkJCSAgICBHRVRfQ09SRV9JRihlcC0+cGNkKS0+CisJCQkJICAgIGNvcmVfcGFyYW1zLT5tYXhfdHJhbnNmZXJfc2l6ZTsKKworCQkJCS8qIFNldHVwIGFuZCBzdGFydCB0aGUgVHJhbnNmZXIgKi8KKwkJCQlpZiAocmVxLT5kd19hbGlnbl9idWYpeworCQkJCQlpZiAoZXAtPmR3Y19lcC5pc19pbikKKwkJCQkJCWR3Y19tZW1jcHkocmVxLT5kd19hbGlnbl9idWYsIGJ1ZiwgYnVmbGVuKTsKKwkJCQkJZXAtPmR3Y19lcC5kbWFfYWRkciA9IHJlcS0+ZHdfYWxpZ25fYnVmX2RtYTsKKwkJCQkJZXAtPmR3Y19lcC5zdGFydF94ZmVyX2J1ZmYgPSByZXEtPmR3X2FsaWduX2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcC0+ZHdjX2VwLnhmZXJfYnVmZiA9IHJlcS0+ZHdfYWxpZ25fYnVmOworCQkJCX0gZWxzZSB7CisJCQkJCWVwLT5kd2NfZXAuZG1hX2FkZHIgPSBkbWFfYnVmOworCQkJCQllcC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcC0+ZHdjX2VwLnhmZXJfYnVmZiA9IGJ1ZjsJCisJCQkJfQorCQkJCWVwLT5kd2NfZXAueGZlcl9sZW4gPSAwOworCQkJCWVwLT5kd2NfZXAueGZlcl9jb3VudCA9IDA7CisJCQkJZXAtPmR3Y19lcC5zZW50X3pscCA9IDA7CisJCQkJZXAtPmR3Y19lcC50b3RhbF9sZW4gPSBidWZsZW47CisKKwkJCQllcC0+ZHdjX2VwLm1heHhmZXIgPSBtYXhfdHJhbnNmZXI7CisJCQkJaWYgKEdFVF9DT1JFX0lGKHBjZCktPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJCQl1aW50MzJfdCBvdXRfbWF4X3hmZXIgPQorCQkJCQkgICAgRERNQV9NQVhfVFJBTlNGRVJfU0laRSAtCisJCQkJCSAgICAoRERNQV9NQVhfVFJBTlNGRVJfU0laRSAlIDQpOworCQkJCQlpZiAoZXAtPmR3Y19lcC5pc19pbikgeworCQkJCQkJaWYgKGVwLT5kd2NfZXAubWF4eGZlciA+CisJCQkJCQkgICAgRERNQV9NQVhfVFJBTlNGRVJfU0laRSkgeworCQkJCQkJCWVwLT5kd2NfZXAubWF4eGZlciA9CisJCQkJCQkJICAgIERETUFfTUFYX1RSQU5TRkVSX1NJWkU7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoZXAtPmR3Y19lcC5tYXh4ZmVyID4KKwkJCQkJCSAgICBvdXRfbWF4X3hmZXIpIHsKKwkJCQkJCQllcC0+ZHdjX2VwLm1heHhmZXIgPQorCQkJCQkJCSAgICBvdXRfbWF4X3hmZXI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGVwLT5kd2NfZXAubWF4eGZlciA8IGVwLT5kd2NfZXAudG90YWxfbGVuKSB7CisJCQkJCWVwLT5kd2NfZXAubWF4eGZlciAtPQorCQkJCQkgICAgKGVwLT5kd2NfZXAubWF4eGZlciAlCisJCQkJCSAgICAgZXAtPmR3Y19lcC5tYXhwYWNrZXQpOworCQkJCX0KKworCQkJCWlmICh6ZXJvKSB7CisJCQkJCWlmICgoZXAtPmR3Y19lcC50b3RhbF9sZW4gJQorCQkJCQkgICAgIGVwLT5kd2NfZXAubWF4cGFja2V0ID09IDApCisJCQkJCSAgICAmJiAoZXAtPmR3Y19lcC50b3RhbF9sZW4gIT0gMCkpIHsKKwkJCQkJCWVwLT5kd2NfZXAuc2VudF96bHAgPSAxOworCQkJCQl9CisJCQkJfQorI2lmZGVmIERXQ19VVEVfQ0ZJCisJCQl9CisjZW5kaWYKKwkJCWR3Y19vdGdfZXBfc3RhcnRfdHJhbnNmZXIoR0VUX0NPUkVfSUYocGNkKSwKKwkJCQkJCSAgJmVwLT5kd2NfZXApOworCQl9CisJfQorCisJaWYgKHJlcSAhPSAwKSB7CisJCSsrcGNkLT5yZXF1ZXN0X3BlbmRpbmc7CisJCURXQ19DSVJDTEVRX0lOU0VSVF9UQUlMKCZlcC0+cXVldWUsIHJlcSwgcXVldWVfZW50cnkpOworCQlpZiAoZXAtPmR3Y19lcC5pc19pbiAmJiBlcC0+c3RvcHBlZAorCQkgICAgJiYgIShHRVRfQ09SRV9JRihwY2QpLT5kbWFfZW5hYmxlKSkgeworCQkJLyoqIEB0b2RvIE5HUyBDcmVhdGUgYSBmdW5jdGlvbiBmb3IgdGhpcy4gKi8KKwkJCWRpZXBtc2tfZGF0YV90IGRpZXBtc2sgPSB7LmQzMiA9IDAgfTsKKwkJCWRpZXBtc2suYi5pbnRrdHhmZW1wID0gMTsKKwkJCWlmIChHRVRfQ09SRV9JRihwY2QpLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQkJCURXQ19NT0RJRllfUkVHMzIoJkdFVF9DT1JFX0lGKHBjZCktPmRldl9pZi0+CisJCQkJCQkgZGV2X2dsb2JhbF9yZWdzLT4KKwkJCQkJCSBkaWVwZWFjaGludG1za1tlcC0+ZHdjX2VwLm51bV0sCisJCQkJCQkgMCwgZGllcG1zay5kMzIpOworCQkJfSBlbHNlIHsKKwkJCQlEV0NfTU9ESUZZX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWYtPgorCQkJCQkJIGRldl9nbG9iYWxfcmVncy0+ZGllcG1zaywgMCwKKwkJCQkJCSBkaWVwbXNrLmQzMik7CisJCQl9CisKKwkJfQorCX0KKwlEV0NfU1BJTlVOTE9DS19JUlFSRVNUT1JFKHBjZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkd2Nfb3RnX3BjZF9lcF9kZXF1ZXVlKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKmVwX2hhbmRsZSwKKwkJCSAgIHZvaWQgKnJlcV9oYW5kbGUpCit7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisJZHdjX290Z19wY2RfcmVxdWVzdF90ICpyZXE7CisJZHdjX290Z19wY2RfZXBfdCAqZXA7CisKKwllcCA9IGdldF9lcF9mcm9tX2hhbmRsZShwY2QsIGVwX2hhbmRsZSk7CisJaWYgKCFlcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5kd2NfZXAubnVtICE9IDApKSB7CisJCURXQ19XQVJOKCJiYWQgYXJndW1lbnRcbiIpOworCQlyZXR1cm4gLURXQ19FX0lOVkFMSUQ7CisJfQorCisJRFdDX1NQSU5MT0NLX0lSUVNBVkUocGNkLT5sb2NrLCAmZmxhZ3MpOworCisJLyogbWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgcXVldWVkIG9uIHRoaXMgZW5kcG9pbnQgKi8KKwlEV0NfQ0lSQ0xFUV9GT1JFQUNIKHJlcSwgJmVwLT5xdWV1ZSwgcXVldWVfZW50cnkpIHsKKwkJaWYgKHJlcS0+cHJpdiA9PSAodm9pZCAqKXJlcV9oYW5kbGUpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJlcS0+cHJpdiAhPSAodm9pZCAqKXJlcV9oYW5kbGUpIHsKKwkJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShwY2QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCWlmICghRFdDX0NJUkNMRVFfRU1QVFlfRU5UUlkocmVxLCBxdWV1ZV9lbnRyeSkpIHsKKwkJZHdjX290Z19yZXF1ZXN0X2RvbmUoZXAsIHJlcSwgLURXQ19FX1JFU1RBUlQpOworCX0gZWxzZSB7CisJCXJlcSA9IE5VTEw7CisJfQorCisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShwY2QtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXEgPyAwIDogLURXQ19FX1NIVVRET1dOOworCit9CisKK2ludCBkd2Nfb3RnX3BjZF9lcF9oYWx0KGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKmVwX2hhbmRsZSwgaW50IHZhbHVlKQoreworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCWR3Y19pcnFmbGFnc190IGZsYWdzOworCWludCByZXR2YWwgPSAwOworCisJZXAgPSBnZXRfZXBfZnJvbV9oYW5kbGUocGNkLCBlcF9oYW5kbGUpOworCisJaWYgKCFlcCB8fCAoIWVwLT5kZXNjICYmIGVwICE9ICZwY2QtPmVwMCkgfHwKKwkgICAgKGVwLT5kZXNjICYmIChlcC0+ZGVzYy0+Ym1BdHRyaWJ1dGVzID09IFVFX0lTT0NIUk9OT1VTKSkpIHsKKwkJRFdDX1dBUk4oIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1EV0NfRV9JTlZBTElEOworCX0KKworCURXQ19TUElOTE9DS19JUlFTQVZFKHBjZC0+bG9jaywgJmZsYWdzKTsKKwlpZiAoIURXQ19DSVJDTEVRX0VNUFRZKCZlcC0+cXVldWUpKSB7CisJCURXQ19XQVJOKCIlZCAlcyBYRmVyIEluIHByb2Nlc3NcbiIsIGVwLT5kd2NfZXAubnVtLAorCQkJIGVwLT5kd2NfZXAuaXNfaW4gPyAiSU4iIDogIk9VVCIpOworCQlyZXR2YWwgPSAtRFdDX0VfQUdBSU47CisJfSBlbHNlIGlmICh2YWx1ZSA9PSAwKSB7CisJCWR3Y19vdGdfZXBfY2xlYXJfc3RhbGwoR0VUX0NPUkVfSUYocGNkKSwgJmVwLT5kd2NfZXApOworCX0gZWxzZSBpZiAodmFsdWUgPT0gMSkgeworCQlpZiAoZXAtPmR3Y19lcC5pc19pbiA9PSAxICYmIEdFVF9DT1JFX0lGKHBjZCktPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJZHR4ZnN0c19kYXRhX3QgdHhzdGF0dXM7CisJCQlmaWZvc2l6ZV9kYXRhX3QgdHhmaWZvc2l6ZTsKKworCQkJdHhmaWZvc2l6ZS5kMzIgPQorCQkJICAgIERXQ19SRUFEX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5jb3JlX2dsb2JhbF9yZWdzLT4KKwkJCQkJICAgZHR4ZnNpeltlcC0+ZHdjX2VwLnR4X2ZpZm9fbnVtXSk7CisJCQl0eHN0YXR1cy5kMzIgPQorCQkJICAgIERXQ19SRUFEX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWYtPgorCQkJCQkgICBpbl9lcF9yZWdzW2VwLT5kd2NfZXAubnVtXS0+ZHR4ZnN0cyk7CisKKwkJCWlmICh0eHN0YXR1cy5iLnR4ZnNwY2F2YWlsIDwgdHhmaWZvc2l6ZS5iLmRlcHRoKSB7CisJCQkJRFdDX1dBUk4oIiVzKCkgRGF0YSBJbiBUeCBGaWZvXG4iLCBfX2Z1bmNfXyk7CisJCQkJcmV0dmFsID0gLURXQ19FX0FHQUlOOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZXAtPmR3Y19lcC5udW0gPT0gMCkgeworCQkJCQlwY2QtPmVwMHN0YXRlID0gRVAwX1NUQUxMOworCQkJCX0KKworCQkJCWVwLT5zdG9wcGVkID0gMTsKKwkJCQlkd2Nfb3RnX2VwX3NldF9zdGFsbChHRVRfQ09SRV9JRihwY2QpLAorCQkJCQkJICAgICAmZXAtPmR3Y19lcCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZXAtPmR3Y19lcC5udW0gPT0gMCkgeworCQkJCXBjZC0+ZXAwc3RhdGUgPSBFUDBfU1RBTEw7CisJCQl9CisKKwkJCWVwLT5zdG9wcGVkID0gMTsKKwkJCWR3Y19vdGdfZXBfc2V0X3N0YWxsKEdFVF9DT1JFX0lGKHBjZCksICZlcC0+ZHdjX2VwKTsKKwkJfQorCX0gZWxzZSBpZiAodmFsdWUgPT0gMikgeworCQllcC0+ZHdjX2VwLnN0YWxsX2NsZWFyX2ZsYWcgPSAwOworCX0gZWxzZSBpZiAodmFsdWUgPT0gMykgeworCQllcC0+ZHdjX2VwLnN0YWxsX2NsZWFyX2ZsYWcgPSAxOworCX0KKworCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUocGNkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIHJlbW90ZSB3YWtldXAgb2YgdGhlIGhvc3QgZnJvbSBzdXNwZW5kIHN0YXRlLgorICovCit2b2lkIGR3Y19vdGdfcGNkX3JlbV93a3VwX2Zyb21fc3VzcGVuZChkd2Nfb3RnX3BjZF90ICogcGNkLCBpbnQgc2V0KQoreworCWRjdGxfZGF0YV90IGRjdGwgPSB7IDAgfTsKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJZHN0c19kYXRhX3QgZHN0czsKKworCWRzdHMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kc3RzKTsKKwlpZiAoIWRzdHMuYi5zdXNwc3RzKSB7CisJCURXQ19XQVJOKCJSZW1vdGUgd2FrZXVwIHdoaWxlIGlzIG5vdCBpbiBzdXNwZW5kIHN0YXRlXG4iKTsKKwl9CisJLyogQ2hlY2sgaWYgREVWSUNFX1JFTU9URV9XQUtFVVAgZmVhdHVyZSBlbmFibGVkICovCisJaWYgKHBjZC0+cmVtb3RlX3dha2V1cF9lbmFibGUpIHsKKwkJaWYgKHNldCkgeworCisJCQlpZiAoY29yZV9pZi0+YWRwX2VuYWJsZSkgeworCQkJCWdwd3Jkbl9kYXRhX3QgZ3B3cmRuOworCisJCQkJZHdjX290Z19hZHBfcHJvYmVfc3RvcChjb3JlX2lmKTsKKworCQkJCS8qIE1hc2sgU1JQIGRldGVjdGVkIGludGVycnVwdCBmcm9tIFBvd2VyIERvd24gTG9naWMgKi8KKwkJCQlncHdyZG4uZDMyID0gMDsKKwkJCQlncHdyZG4uYi5zcnBfZGV0X21zayA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+CisJCQkJCQkgZ3B3cmRuLCBncHdyZG4uZDMyLCAwKTsKKworCQkJCS8qIERpc2FibGUgUG93ZXIgRG93biBMb2dpYyAqLworCQkJCWdwd3Jkbi5kMzIgPSAwOworCQkJCWdwd3Jkbi5iLnBtdWFjdHYgPSAxOworCQkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPgorCQkJCQkJIGdwd3JkbiwgZ3B3cmRuLmQzMiwgMCk7CisKKwkJCQkvKgorCQkJCSAqIEluaXRpYWxpemUgdGhlIENvcmUgZm9yIERldmljZSBtb2RlLgorCQkJCSAqLworCQkJCWNvcmVfaWYtPm9wX3N0YXRlID0gQl9QRVJJUEhFUkFMOworCQkJCWR3Y19vdGdfY29yZV9pbml0KGNvcmVfaWYpOworCQkJCWR3Y19vdGdfZW5hYmxlX2dsb2JhbF9pbnRlcnJ1cHRzKGNvcmVfaWYpOworCQkJCWNpbF9wY2Rfc3RhcnQoY29yZV9pZik7CisKKwkJCQlkd2Nfb3RnX2luaXRpYXRlX3NycChjb3JlX2lmKTsKKwkJCX0KKworCQkJZGN0bC5iLnJtdHdrdXBzaWcgPSAxOworCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQkJIGRldl9nbG9iYWxfcmVncy0+ZGN0bCwgMCwgZGN0bC5kMzIpOworCQkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIlNldCBSZW1vdGUgV2FrZXVwXG4iKTsKKworCQkJZHdjX21kZWxheSgyKTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJCSBkZXZfZ2xvYmFsX3JlZ3MtPmRjdGwsIGRjdGwuZDMyLCAwKTsKKwkJCURXQ19ERUJVR1BMKERCR19QQ0QsICJDbGVhciBSZW1vdGUgV2FrZXVwXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCURXQ19ERUJVR1BMKERCR19QQ0QsICJSZW1vdGUgV2FrZXVwIGlzIGRpc2FibGVkXG4iKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfVVNCX0RXQ19PVEdfTFBNCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhdGVzIHJlbW90ZSB3YWtldXAgb2YgdGhlIGhvc3QgZnJvbSBMMSBzbGVlcCBzdGF0ZS4KKyAqLwordm9pZCBkd2Nfb3RnX3BjZF9yZW1fd2t1cF9mcm9tX3NsZWVwKGR3Y19vdGdfcGNkX3QgKiBwY2QsIGludCBzZXQpCit7CisJZ2xwbWNmZ19kYXRhX3QgbHBtY2ZnOworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKworCWxwbWNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisKKwkvKiBDaGVjayBpZiB3ZSBhcmUgaW4gTDEgc3RhdGUgKi8KKwlpZiAoIWxwbWNmZy5iLnBydF9zbGVlcF9zdHMpIHsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkRldmljZSBpcyBub3QgaW4gc2xlZXAgc3RhdGVcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogQ2hlY2sgaWYgaG9zdCBhbGxvd3MgcmVtb3RlIHdha2V1cCAqLworCWlmICghbHBtY2ZnLmIucmVtX3drdXBfZW4pIHsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkhvc3QgZG9lcyBub3QgYWxsb3cgcmVtb3RlIHdha2V1cFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaGVjayBpZiBSZXN1bWUgT0sgKi8KKwlpZiAoIWxwbWNmZy5iLnNsZWVwX3N0YXRlX3Jlc3VtZW9rKSB7CisJCURXQ19ERUJVR1BMKERCR19QQ0QsICJTbGVlcCBzdGF0ZSByZXN1bWUgaXMgbm90IE9LXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWxwbWNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2xwbWNmZyk7CisJbHBtY2ZnLmIuZW5fdXRtaV9zbGVlcCA9IDA7CisJbHBtY2ZnLmIuaGlyZF90aHJlcyAmPSAofigxIDw8IDQpKTsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdscG1jZmcsIGxwbWNmZy5kMzIpOworCisJaWYgKHNldCkgeworCQlkY3RsX2RhdGFfdCBkY3RsID0gey5kMzIgPSAwIH07CisJCWRjdGwuYi5ybXR3a3Vwc2lnID0gMTsKKwkJLyogU2V0IFJtdFdrVXBTaWcgYml0IHRvIHN0YXJ0IHJlbW90ZSB3YWt1cCBzaWduYWxpbmcuCisJCSAqIEhhcmR3YXJlIHdpbGwgYXV0b21hdGljYWxseSBjbGVhciB0aGlzIGJpdC4KKwkJICovCisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsLAorCQkJCSAwLCBkY3RsLmQzMik7CisJCURXQ19ERUJVR1BMKERCR19QQ0QsICJTZXQgUmVtb3RlIFdha2V1cFxuIik7CisJfQorCit9CisjZW5kaWYKKworLyoqCisgKiBQZXJmb3JtcyByZW1vdGUgd2FrZXVwLgorICovCit2b2lkIGR3Y19vdGdfcGNkX3JlbW90ZV93YWtldXAoZHdjX290Z19wY2RfdCAqIHBjZCwgaW50IHNldCkKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJZHdjX2lycWZsYWdzX3QgZmxhZ3M7CisJaWYgKGR3Y19vdGdfaXNfZGV2aWNlX21vZGUoY29yZV9pZikpIHsKKwkJRFdDX1NQSU5MT0NLX0lSUVNBVkUocGNkLT5sb2NrLCAmZmxhZ3MpOworI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwkJaWYgKGNvcmVfaWYtPmx4X3N0YXRlID09IERXQ19PVEdfTDEpIHsKKwkJCWR3Y19vdGdfcGNkX3JlbV93a3VwX2Zyb21fc2xlZXAocGNkLCBzZXQpOworCQl9IGVsc2UgeworI2VuZGlmCisJCQlkd2Nfb3RnX3BjZF9yZW1fd2t1cF9mcm9tX3N1c3BlbmQocGNkLCBzZXQpOworI2lmZGVmIENPTkZJR19VU0JfRFdDX09UR19MUE0KKwkJfQorI2VuZGlmCisJCURXQ19TUElOVU5MT0NLX0lSUVJFU1RPUkUocGNkLT5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybjsKK30KKwordm9pZCBkd2Nfb3RnX3BjZF9kaXNjb25uZWN0X3VzKGR3Y19vdGdfcGNkX3QgKiBwY2QsIGludCBub19vZl91c2VjcykKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJZGN0bF9kYXRhX3QgZGN0bCA9IHsgMCB9OworCisJaWYgKGR3Y19vdGdfaXNfZGV2aWNlX21vZGUoY29yZV9pZikpIHsKKwkJZGN0bC5iLnNmdGRpc2NvbiA9IDE7CisJCURXQ19QUklOVEYoIlNvZnQgZGlzY29ubmVjdCBmb3IgJWQgdXNlY29uZHNcbiIsbm9fb2ZfdXNlY3MpOworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwgMCwgZGN0bC5kMzIpOworCQlkd2NfdWRlbGF5KG5vX29mX3VzZWNzKTsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjdGwsIGRjdGwuZDMyLDApOworCQkKKwl9IGVsc2V7CisJCURXQ19QUklOVEYoIk5PVCBTVVBQT1JURUQgSU4gSE9TVCBNT0RFXG4iKTsKKwl9CisJcmV0dXJuOworCit9CisKK2ludCBkd2Nfb3RnX3BjZF93YWtldXAoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkc3RzX2RhdGFfdCBkc3RzOworCWdvdGdjdGxfZGF0YV90IGdvdGdjdGw7CisKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSBQcm90b2NvbCBpZiBubyBzZXNzaW9uIGlzIGluIHByb2dyZXNzLiBJZgorCSAqIGEgc2Vzc2lvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBidXQgdGhlIGRldmljZSBpcyBzdXNwZW5kZWQsCisJICogcmVtb3RlIHdha2V1cCBzaWduYWxpbmcgaXMgc3RhcnRlZC4KKwkgKi8KKworCS8qIENoZWNrIGlmIHZhbGlkIHNlc3Npb24gKi8KKwlnb3RnY3RsLmQzMiA9CisJICAgIERXQ19SRUFEX1JFRzMyKCYoR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9nbG9iYWxfcmVncy0+Z290Z2N0bCkpOworCWlmIChnb3RnY3RsLmIuYnNlc3ZsZCkgeworCQkvKiBDaGVjayBpZiBzdXNwZW5kIHN0YXRlICovCisJCWRzdHMuZDMyID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCYKKwkJCQkgICAoR0VUX0NPUkVfSUYocGNkKS0+ZGV2X2lmLT4KKwkJCQkgICAgZGV2X2dsb2JhbF9yZWdzLT5kc3RzKSk7CisJCWlmIChkc3RzLmIuc3VzcHN0cykgeworCQkJZHdjX290Z19wY2RfcmVtb3RlX3dha2V1cChwY2QsIDEpOworCQl9CisJfSBlbHNlIHsKKwkJZHdjX290Z19wY2RfaW5pdGlhdGVfc3JwKHBjZCk7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworLyoqCisgKiBTdGFydCB0aGUgU1JQIHRpbWVyIHRvIGRldGVjdCB3aGVuIHRoZSBTUlAgZG9lcyBub3QgY29tcGxldGUgd2l0aGluCisgKiA2IHNlY29uZHMuCisgKgorICogQHBhcmFtIHBjZCB0aGUgcGNkIHN0cnVjdHVyZS4KKyAqLwordm9pZCBkd2Nfb3RnX3BjZF9pbml0aWF0ZV9zcnAoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkd2NfaXJxZmxhZ3NfdCBmbGFnczsKKwlEV0NfU1BJTkxPQ0tfSVJRU0FWRShwY2QtPmxvY2ssICZmbGFncyk7CisJZHdjX290Z19pbml0aWF0ZV9zcnAoR0VUX0NPUkVfSUYocGNkKSk7CisJRFdDX1NQSU5VTkxPQ0tfSVJRUkVTVE9SRShwY2QtPmxvY2ssIGZsYWdzKTsKK30KKworaW50IGR3Y19vdGdfcGNkX2dldF9mcmFtZV9udW1iZXIoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlyZXR1cm4gZHdjX290Z19nZXRfZnJhbWVfbnVtYmVyKEdFVF9DT1JFX0lGKHBjZCkpOworfQorCitpbnQgZHdjX290Z19wY2RfaXNfbHBtX2VuYWJsZWQoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlyZXR1cm4gR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9wYXJhbXMtPmxwbV9lbmFibGU7Cit9CisKK3VpbnQzMl90IGdldF9iX2hucF9lbmFibGUoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlyZXR1cm4gcGNkLT5iX2hucF9lbmFibGU7Cit9CisKK3VpbnQzMl90IGdldF9hX2hucF9zdXBwb3J0KGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJcmV0dXJuIHBjZC0+YV9obnBfc3VwcG9ydDsKK30KKwordWludDMyX3QgZ2V0X2FfYWx0X2hucF9zdXBwb3J0KGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJcmV0dXJuIHBjZC0+YV9hbHRfaG5wX3N1cHBvcnQ7Cit9CisKK2ludCBkd2Nfb3RnX3BjZF9nZXRfcm13a3VwX2VuYWJsZShkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCXJldHVybiBwY2QtPnJlbW90ZV93YWtldXBfZW5hYmxlOworfQorCisjZW5kaWYgLyogRFdDX0hPU1RfT05MWSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX3BjZC5oIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX3BjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMmRkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfcGNkLmgKQEAgLTAsMCArMSwyNjIgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAkRmlsZTogLy9kd2gvdXNiX2lpcC9kZXYvc29mdHdhcmUvb3RnL2xpbnV4L2RyaXZlcnMvZHdjX290Z19wY2QuaCAkCisgKiAkUmV2aXNpb246ICM0NiAkCisgKiAkRGF0ZTogMjAxMS8xMC8yMCAkCisgKiAkQ2hhbmdlOiAxODcwMTI0ICQKKyAqCisgKiBTeW5vcHN5cyBIUyBPVEcgTGludXggU29mdHdhcmUgRHJpdmVyIGFuZCBkb2N1bWVudGF0aW9uIChoZXJlaW5hZnRlciwKKyAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgKiBvdGhlcndpc2UgZXhwcmVzc2x5IGFncmVlZCB0byBpbiB3cml0aW5nIGJldHdlZW4gU3lub3BzeXMgYW5kIHlvdS4KKyAqCisgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdCB1bmRlcgorICogYW55IEVuZCBVc2VyIFNvZnR3YXJlIExpY2Vuc2UgQWdyZWVtZW50IG9yIEFncmVlbWVudCBmb3IgTGljZW5zZWQgUHJvZHVjdAorICogd2l0aCBTeW5vcHN5cyBvciBhbnkgc3VwcGxlbWVudCB0aGVyZXRvLiBZb3UgYXJlIHBlcm1pdHRlZCB0byB1c2UgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoaXMKKyAqIG5vdGljZS4gWW91IG1heSBub3QgdmlldywgdXNlLCBkaXNjbG9zZSwgY29weSBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSBvcgorICogYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tCisgKiBTeW5vcHN5cy4gSWYgeW91IGRvIG5vdCBhZ3JlZSB3aXRoIHRoaXMgbm90aWNlLCBpbmNsdWRpbmcgdGhlIGRpc2NsYWltZXIKKyAqIGJlbG93LCB0aGVuIHlvdSBhcmUgbm90IGF1dGhvcml6ZWQgdG8gdXNlIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIERJU1RSSUJVVEVEIEJZIFNZTk9QU1lTIFNPTEVMWSBPTiBBTiAiQVMgSVMiIEJBU0lTCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIEhFUkVCWSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBTWU5PUFNZUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisgKiBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBEV0NfSE9TVF9PTkxZCisjaWYgIWRlZmluZWQoX19EV0NfUENEX0hfXykKKyNkZWZpbmUgX19EV0NfUENEX0hfXworCisjaW5jbHVkZSAiZHdjX290Z19vc19kZXAuaCIKKyNpbmNsdWRlICJ1c2IuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2NpbC5oIgorI2luY2x1ZGUgImR3Y19vdGdfcGNkX2lmLmgiCitzdHJ1Y3QgY2Zpb2JqZWN0OworCisvKioKKyAqIEBmaWxlCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdHJ1Y3R1cmVzLCBjb25zdGFudHMsIGFuZCBpbnRlcmZhY2VzIGZvcgorICogdGhlIFBlcnBoZXJpYWwgQ29udG9sbGVyIERyaXZlciAoUENEKS4KKyAqCisgKiBUaGUgUGVyaXBoZXJhbCBDb250cm9sbGVyIERyaXZlciAoUENEKSBmb3IgTGludXggd2lsbCBpbXBsZW1lbnQgdGhlCisgKiBHYWRnZXQgQVBJLCBzbyB0aGF0IHRoZSBleGlzdGluZyBHYWRnZXQgZHJpdmVycyBjYW4gYmUgdXNlZC4gRm9yCisgKiB0aGUgTWFzcyBTdG9yYWdlIEZ1bmN0aW9uIGRyaXZlciB0aGUgRmlsZS1iYWNrZWQgVVNCIFN0b3JhZ2UgR2FkZ2V0CisgKiAoRkJTKSBkcml2ZXIgd2lsbCBiZSB1c2VkLiAgVGhlIEZCUyBkcml2ZXIgc3VwcG9ydHMgdGhlCisgKiBDb250cm9sLUJ1bGsgKENCKSwgQ29udHJvbC1CdWxrLUludGVycnVwdCAoQ0JJKSwgYW5kIEJ1bGstT25seQorICogdHJhbnNwb3J0cy4KKyAqCisgKi8KKworLyoqIEludmFsaWQgRE1BIEFkZHJlc3MgKi8KKyNkZWZpbmUgRFdDX0RNQV9BRERSX0lOVkFMSUQJKH4oZHdjX2RtYV90KTApCisKKy8qKiBNYXggVHJhbnNmZXIgc2l6ZSBmb3IgYW55IEVQICovCisjZGVmaW5lIERETUFfTUFYX1RSQU5TRkVSX1NJWkUgNjU1MzUKKworLyoqCisgKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGNvcmVfaWYgZnJvbSB0aGUgcGNkIHBvaW50ZXIuCisgKi8KKyNkZWZpbmUgR0VUX0NPUkVfSUYoIF9wY2QgKSAoX3BjZC0+Y29yZV9pZikKKworLyoqCisgKiBTdGF0ZXMgb2YgRVAwLgorICovCit0eXBlZGVmIGVudW0gZXAwX3N0YXRlIHsKKwlFUDBfRElTQ09OTkVDVCwJCS8qIG5vIGhvc3QgKi8KKwlFUDBfSURMRSwKKwlFUDBfSU5fREFUQV9QSEFTRSwKKwlFUDBfT1VUX0RBVEFfUEhBU0UsCisJRVAwX0lOX1NUQVRVU19QSEFTRSwKKwlFUDBfT1VUX1NUQVRVU19QSEFTRSwKKwlFUDBfU1RBTEwsCit9IGVwMHN0YXRlX2U7CisKKy8qKiBGb3Jkd2FyZCBkZWNsYXJhdGlvbi4qLworc3RydWN0IGR3Y19vdGdfcGNkOworCisvKiogRFdDX290ZyBpc28gcmVxdWVzdCBzdHJ1Y3R1cmUuCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB1c2JfaXNvX3JlcXVlc3QgZHdjX290Z19wY2RfaXNvX3JlcXVlc3RfdDsKKworI2lmZGVmIERXQ19VVEVfUEVSX0lPCisKKy8qKgorICogVGhpcyBzaGFsbCBiZSB0aGUgZXhhY3QgYW5hbG9neSBvZiB0aGUgc2FtZSB0eXBlIHN0cnVjdHVyZSBkZWZpbmVkIGluIHRoZQorICogdXNiX2dhZGdldC5oLiBFYWNoIGRlc2NyaXB0b3IgY29udGFpbnMKKyAqLworc3RydWN0IGR3Y19pc29fcGt0X2Rlc2NfcG9ydCB7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IGxlbmd0aDsJLyogZXhwZWN0ZWQgbGVuZ3RoICovCisJdWludDMyX3QgYWN0dWFsX2xlbmd0aDsKKwl1aW50MzJfdCBzdGF0dXM7Cit9OworCitzdHJ1Y3QgZHdjX2lzb194cmVxX3BvcnQgeworCS8qKiB0cmFuc2Zlci9zdWJtaXNzaW9uIGZsYWcgKi8KKwl1aW50MzJfdCB0cl9zdWJfZmxhZ3M7CisJLyoqIFN0YXJ0IHRoZSByZXF1ZXN0IEFTQVAgKi8KKyNkZWZpbmUgRFdDX0VSRVFfVEZfQVNBUAkJMHgwMDAwMDAwMgorCS8qKiBKdXN0IGVucXVldWUgdGhlIHJlcXVlc3Qgdy9vIGluaXRpYXRpbmcgYSB0cmFuc2ZlciAqLworI2RlZmluZSBEV0NfRVJFUV9URl9FTlFVRVVFCQkweDAwMDAwMDA0CisKKwkvKioKKwkqIGNvdW50IG9mIElTTyBwYWNrZXRzIGF0dGFjaGVkIHRvIHRoaXMgcmVxdWVzdCAtIHNoYWxsCisJKiBub3QgZXhjZWVkIHRoZSBwaW9fYWxsb2NfcGt0X2NvdW50CisJKi8KKwl1aW50MzJfdCBwaW9fcGt0X2NvdW50OworCS8qKiBjb3VudCBvZiBJU08gcGFja2V0cyBhbGxvY2F0ZWQgZm9yIHRoaXMgcmVxdWVzdCAqLworCXVpbnQzMl90IHBpb19hbGxvY19wa3RfY291bnQ7CisJLyoqIG51bWJlciBvZiBJU08gcGFja2V0IGVycm9ycyAqLworCXVpbnQzMl90IGVycm9yX2NvdW50OworCS8qKiByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbiAqLworCXVpbnQzMl90IHJlczsKKwkvKiogV2lsbCBiZSBhbGxvY2F0ZWQgYW5kIGZyZWVkIGluIHRoZSBVVEUgZ2FkZ2V0IGFuZCBiYXNlZCBvbiB0aGUgQ0ZDIHZhbHVlICovCisJc3RydWN0IGR3Y19pc29fcGt0X2Rlc2NfcG9ydCAqcGVyX2lvX2ZyYW1lX2Rlc2NzOworfTsKKyNlbmRpZgorLyoqIERXQ19vdGcgcmVxdWVzdCBzdHJ1Y3R1cmUuCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBhIGxpc3Qgb2YgcmVxdWVzdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y19vdGdfcGNkX3JlcXVlc3QgeworCXZvaWQgKnByaXY7CisJdm9pZCAqYnVmOworCWR3Y19kbWFfdCBkbWE7CisJdWludDMyX3QgbGVuZ3RoOworCXVpbnQzMl90IGFjdHVhbDsKKwl1bnNpZ25lZCBzZW50X3pscDoxOworICAgIC8qKgorICAgICAqIFVzZWQgaW5zdGVhZCBvZiBvcmlnaW5hbCBidWZmZXIgaWYKKyAgICAgKiBpdChwaHlzaWNhbCBhZGRyZXNzKSBpcyBub3QgZHdvcmQtYWxpZ25lZC4KKyAgICAgKiovCisgICAgIHVpbnQ4X3QgKmR3X2FsaWduX2J1ZjsKKyAgICAgZHdjX2RtYV90IGR3X2FsaWduX2J1Zl9kbWE7CisKKwkgRFdDX0NJUkNMRVFfRU5UUlkoZHdjX290Z19wY2RfcmVxdWVzdCkgcXVldWVfZW50cnk7CisjaWZkZWYgRFdDX1VURV9QRVJfSU8KKwlzdHJ1Y3QgZHdjX2lzb194cmVxX3BvcnQgZXh0X3JlcTsKKwkvL3ZvaWQgKnByaXZfZXJlcV9ucG9ydDsgLyogICovCisjZW5kaWYKK30gZHdjX290Z19wY2RfcmVxdWVzdF90OworCitEV0NfQ0lSQ0xFUV9IRUFEKHJlcV9saXN0LCBkd2Nfb3RnX3BjZF9yZXF1ZXN0KTsKKworLyoqCSAgUENEIEVQIHN0cnVjdHVyZS4KKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhbiBFUCwgdGhlcmUgaXMgYW4gYXJyYXkgb2YgRVBzIGluIHRoZSBQQ0QKKyAqIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHdjX290Z19wY2RfZXAgeworCS8qKiBVU0IgRVAgRGVzY3JpcHRvciAqLworCWNvbnN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yX3QgKmRlc2M7CisKKwkvKiogcXVldWUgb2YgZHdjX290Z19wY2RfcmVxdWVzdHMuICovCisJc3RydWN0IHJlcV9saXN0IHF1ZXVlOworCXVuc2lnbmVkIHN0b3BwZWQ6MTsKKwl1bnNpZ25lZCBkaXNhYmxpbmc6MTsKKwl1bnNpZ25lZCBkbWE6MTsKKwl1bnNpZ25lZCBxdWV1ZV9zb2Y6MTsKKworI2lmZGVmIERXQ19FTl9JU09DCisJLyoqIElTT0MgcmVxIGhhbmRsZSBwYXNzZWQgKi8KKwl2b2lkICppc29fcmVxX2hhbmRsZTsKKyNlbmRpZgkJCQkvL19FTl9JU09DXworCisJLyoqIERXQ19vdGcgZXAgZGF0YS4gKi8KKwlkd2NfZXBfdCBkd2NfZXA7CisKKwkvKiogUG9pbnRlciB0byBQQ0QgKi8KKwlzdHJ1Y3QgZHdjX290Z19wY2QgKnBjZDsKKworCXZvaWQgKnByaXY7Cit9IGR3Y19vdGdfcGNkX2VwX3Q7CisKKy8qKiBEV0Nfb3RnIFBDRCBTdHJ1Y3R1cmUuCisgKiBUaGlzIHN0cnVjdHVyZSBlbmNhcHN1bGF0ZXMgdGhlIGRhdGEgZm9yIHRoZSBkd2Nfb3RnIFBDRC4KKyAqLworc3RydWN0IGR3Y19vdGdfcGNkIHsKKwljb25zdCBzdHJ1Y3QgZHdjX290Z19wY2RfZnVuY3Rpb25fb3BzICpmb3BzOworCS8qKiBUaGUgRFdDIG90ZyBkZXZpY2UgcG9pbnRlciAqLworCXN0cnVjdCBkd2Nfb3RnX2RldmljZSAqb3RnX2RldjsKKwkvKiogQ29yZSBJbnRlcmZhY2UgKi8KKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZjsKKwkvKiogU3RhdGUgb2YgRVAwICovCisJZXAwc3RhdGVfZSBlcDBzdGF0ZTsKKwkvKiogRVAwIFJlcXVlc3QgaXMgcGVuZGluZyAqLworCXVuc2lnbmVkIGVwMF9wZW5kaW5nOjE7CisJLyoqIEluZGljYXRlcyB3aGVuIFNFVCBDT05GSUdVUkFUSU9OIFJlcXVlc3QgaXMgaW4gcHJvY2VzcyAqLworCXVuc2lnbmVkIHJlcXVlc3RfY29uZmlnOjE7CisJLyoqIFRoZSBzdGF0ZSBvZiB0aGUgUmVtb3RlIFdha2V1cCBFbmFibGUuICovCisJdW5zaWduZWQgcmVtb3RlX3dha2V1cF9lbmFibGU6MTsKKwkvKiogVGhlIHN0YXRlIG9mIHRoZSBCLURldmljZSBITlAgRW5hYmxlLiAqLworCXVuc2lnbmVkIGJfaG5wX2VuYWJsZToxOworCS8qKiBUaGUgc3RhdGUgb2YgQS1EZXZpY2UgSE5QIFN1cHBvcnQuICovCisJdW5zaWduZWQgYV9obnBfc3VwcG9ydDoxOworCS8qKiBUaGUgc3RhdGUgb2YgdGhlIEEtRGV2aWNlIEFsdCBITlAgc3VwcG9ydC4gKi8KKwl1bnNpZ25lZCBhX2FsdF9obnBfc3VwcG9ydDoxOworCS8qKiBDb3VudCBvZiBwZW5kaW5nIFJlcXVlc3RzICovCisJdW5zaWduZWQgcmVxdWVzdF9wZW5kaW5nOworCisJLyoqIFNFVFVQIHBhY2tldCBmb3IgRVAwCisJICogVGhpcyBzdHJ1Y3R1cmUgaXMgYWxsb2NhdGVkIGFzIGEgRE1BIGJ1ZmZlciBvbiBQQ0QgaW5pdGlhbGl6YXRpb24KKwkgKiB3aXRoIGVub3VnaCBzcGFjZSBmb3IgdXAgdG8gMyBzZXR1cCBwYWNrZXRzLgorCSAqLworCXVuaW9uIHsKKwkJdXNiX2RldmljZV9yZXF1ZXN0X3QgcmVxOworCQl1aW50MzJfdCBkMzJbMl07CisJfSAqc2V0dXBfcGt0OworCisJZHdjX2RtYV90IHNldHVwX3BrdF9kbWFfaGFuZGxlOworCisJLyoqIDItYnl0ZSBkbWEgYnVmZmVyIHVzZWQgdG8gcmV0dXJuIHN0YXR1cyBmcm9tIEdFVF9TVEFUVVMgKi8KKwl1aW50MTZfdCAqc3RhdHVzX2J1ZjsKKwlkd2NfZG1hX3Qgc3RhdHVzX2J1Zl9kbWFfaGFuZGxlOworCisJLyoqIEVQMCAqLworCWR3Y19vdGdfcGNkX2VwX3QgZXAwOworCisJLyoqIEFycmF5IG9mIElOIEVQcy4gKi8KKwlkd2Nfb3RnX3BjZF9lcF90IGluX2VwW01BWF9FUFNfQ0hBTk5FTFMgLSAxXTsKKwkvKiogQXJyYXkgb2YgT1VUIEVQcy4gKi8KKwlkd2Nfb3RnX3BjZF9lcF90IG91dF9lcFtNQVhfRVBTX0NIQU5ORUxTIC0gMV07CisJLyoqIG51bWJlciBvZiB2YWxpZCBFUHMgaW4gdGhlIGFib3ZlIGFycmF5LiAqLworLy8gICAgICAgIHVuc2lnbmVkICAgICAgbnVtX2VwcyA6IDQ7CisJZHdjX3NwaW5sb2NrX3QgKmxvY2s7CisKKwkvKiogVGFza2xldCB0byBkZWZlciBzdGFydGluZyBvZiBURVNUIG1vZGUgdHJhbnNtaXNzaW9ucyB1bnRpbAorCSAqCVN0YXR1cyBQaGFzZSBoYXMgYmVlbiBjb21wbGV0ZWQuCisJICovCisJZHdjX3Rhc2tsZXRfdCAqdGVzdF9tb2RlX3Rhc2tsZXQ7CisKKwkvKiogVGFza2xldCB0byBkZWxheSBzdGFydGluZyBvZiB4ZmVyIGluIERNQSBtb2RlICovCisJZHdjX3Rhc2tsZXRfdCAqc3RhcnRfeGZlcl90YXNrbGV0OworCisJLyoqIFRoZSB0ZXN0IG1vZGUgdG8gZW50ZXIgd2hlbiB0aGUgdGFza2xldCBpcyBleGVjdXRlZC4gKi8KKwl1bnNpZ25lZCB0ZXN0X21vZGU7CisJLyoqIFRoZSBjZmlfYXBpIHN0cnVjdHVyZSB0aGF0IGltcGxlbWVudHMgbW9zdCBvZiB0aGUgQ0ZJIEFQSQorCSAqIGFuZCBPVEcgc3BlY2lmaWMgY29yZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uYWxpdHkKKwkgKi8KKyNpZmRlZiBEV0NfVVRFX0NGSQorCXN0cnVjdCBjZmlvYmplY3QgKmNmaTsKKyNlbmRpZgorCit9OworCisvL0ZJWE1FIHRoaXMgZnVuY3Rpb25zIHNob3VsZCBiZSBzdGF0aWMsIGFuZCB0aGlzIHByb3RvdHlwZXMgc2hvdWxkIGJlIHJlbW92ZWQKK2V4dGVybiB2b2lkIGR3Y19vdGdfcmVxdWVzdF9udWtlKGR3Y19vdGdfcGNkX2VwX3QgKiBlcCk7CitleHRlcm4gdm9pZCBkd2Nfb3RnX3JlcXVlc3RfZG9uZShkd2Nfb3RnX3BjZF9lcF90ICogZXAsCisJCQkJIGR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqIHJlcSwgaW50MzJfdCBzdGF0dXMpOworCit2b2lkIGR3Y19vdGdfaXNvX2J1ZmZlcl9kb25lKGR3Y19vdGdfcGNkX3QgKiBwY2QsIGR3Y19vdGdfcGNkX2VwX3QgKiBlcCwKKwkJCSAgICAgdm9pZCAqcmVxX2hhbmRsZSk7CisKK2V4dGVybiB2b2lkIGRvX3Rlc3RfbW9kZSh2b2lkICpkYXRhKTsKKyNlbmRpZgorI2VuZGlmIC8qIERXQ19IT1NUX09OTFkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19wY2RfaWYuaCBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19wY2RfaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjgzODY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX3BjZF9pZi5oCkBAIC0wLDAgKzEsMzU3IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfcGNkX2lmLmggJAorICogJFJldmlzaW9uOiAjMTEgJAorICogJERhdGU6IDIwMTEvMTAvMjYgJAorICogJENoYW5nZTogMTg3MzAyOCAkCisgKgorICogU3lub3BzeXMgSFMgT1RHIExpbnV4IFNvZnR3YXJlIERyaXZlciBhbmQgZG9jdW1lbnRhdGlvbiAoaGVyZWluYWZ0ZXIsCisgKiAiU29mdHdhcmUiKSBpcyBhbiBVbnN1cHBvcnRlZCBwcm9wcmlldGFyeSB3b3JrIG9mIFN5bm9wc3lzLCBJbmMuIHVubGVzcworICogb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgKgorICogVGhlIFNvZnR3YXJlIElTIE5PVCBhbiBpdGVtIG9mIExpY2Vuc2VkIFNvZnR3YXJlIG9yIExpY2Vuc2VkIFByb2R1Y3QgdW5kZXIKKyAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAqIHdpdGggU3lub3BzeXMgb3IgYW55IHN1cHBsZW1lbnQgdGhlcmV0by4gWW91IGFyZSBwZXJtaXR0ZWQgdG8gdXNlIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgU29mdHdhcmUgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgKiBub3RpY2UuIFlvdSBtYXkgbm90IHZpZXcsIHVzZSwgZGlzY2xvc2UsIGNvcHkgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgb3IKKyAqIGFueSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGV4Y2VwdCBwdXJzdWFudCB0byB0aGlzIGxpY2Vuc2UgZ3JhbnQgZnJvbQorICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgKiBiZWxvdywgdGhlbiB5b3UgYXJlIG5vdCBhdXRob3JpemVkIHRvIHVzZSB0aGUgU29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIiBCQVNJUworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICogREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyNpZm5kZWYgRFdDX0hPU1RfT05MWQorCisjaWYgIWRlZmluZWQoX19EV0NfUENEX0lGX0hfXykKKyNkZWZpbmUgX19EV0NfUENEX0lGX0hfXworCisvLyNpbmNsdWRlICJkd2Nfb3MuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX2NvcmVfaWYuaCIKKworLyoqIEBmaWxlCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBEV0NfT1RHIFBDRCBDb3JlIEFQSS4KKyAqLworCitzdHJ1Y3QgZHdjX290Z19wY2Q7Cit0eXBlZGVmIHN0cnVjdCBkd2Nfb3RnX3BjZCBkd2Nfb3RnX3BjZF90OworCisvKiogTWF4cGFja2V0IHNpemUgZm9yIEVQMCAqLworI2RlZmluZSBNQVhfRVAwX1NJWkUJNjQKKy8qKiBNYXhwYWNrZXQgc2l6ZSBmb3IgYW55IEVQICovCisjZGVmaW5lIE1BWF9QQUNLRVRfU0laRSAxMDI0CisKKy8qKiBAbmFtZSBGdW5jdGlvbiBEcml2ZXIgQ2FsbGJhY2tzICovCisvKiogQHsgKi8KKworLyoqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBwcmV2aW91c2x5IHF1ZXVlZCByZXF1ZXN0IGhhcworICogY29tcGxldGVkLiAgVGhlIHN0YXR1cyB2YWx1ZSB3aWxsIGJlIHNldCB0byAtRFdDX0VfU0hVVERPV04gdG8gaW5kaWNhdGVkIGEKKyAqIGZhaWxlZCBvciBhYm9ydGVkIHRyYW5zZmVyLCBvciAtRFdDX0VfUkVTVEFSVCB0byBpbmRpY2F0ZSB0aGUgZGV2aWNlIHdhcyByZXNldCwKKyAqIG9yIC1EV0NfRV9USU1FT1VUIHRvIGluZGljYXRlIGl0IHRpbWVkIG91dCwgb3IgLURXQ19FX0lOVkFMSUQgdG8gaW5kaWNhdGUgaW52YWxpZAorICogcGFyYW1ldGVycy4gKi8KK3R5cGVkZWYgaW50ICgqZHdjX2NvbXBsZXRpb25fY2JfdCkgKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKmVwX2hhbmRsZSwKKwkJCQkgICAgdm9pZCAqcmVxX2hhbmRsZSwgaW50MzJfdCBzdGF0dXMsCisJCQkJICAgIHVpbnQzMl90IGFjdHVhbCk7CisvKioKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBwcmV2aW91c2xlIHF1ZXVlZCBJU09DIHJlcXVlc3QgaGFzCisgKiBjb21wbGV0ZWQuIENvdW50IG9mIElTT0MgcGFja2V0cyBjb3VsZCBiZSByZWFkIHVzaW5nIGR3Y19vdGdfcGNkX2dldF9pc29fcGFja2V0X2NvdW50CisgKiBmdW5jdGlvbi4KKyAqIFRoZSBzdGF0dXMgb2YgZWFjaCBJU09DIHBhY2tldCBjb3VsZCBiZSByZWFkIHVzaW5nIGR3Y19vdGdfcGNkX2dldF9pc29fcGFja2V0XyoKKyAqIGZ1bmN0aW9ucy4KKyAqLwordHlwZWRlZiBpbnQgKCpkd2NfaXNvY19jb21wbGV0aW9uX2NiX3QpIChkd2Nfb3RnX3BjZF90ICogcGNkLCB2b2lkICplcF9oYW5kbGUsCisJCQkJCSB2b2lkICpyZXFfaGFuZGxlLCBpbnQgcHJvY19idWZfbnVtKTsKKy8qKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBoYW5kbGUgYW55IFNFVFVQIHJlcXVlc3QgdGhhdCBjYW5ub3QgYmUgaGFuZGxlZCBieSB0aGUKKyAqIFBDRCBDb3JlLiAgVGhpcyBpbmNsdWRlcyBtb3N0IEdFVF9ERVNDUklQVE9ScywgU0VUX0NPTkZJR1MsIEFueQorICogY2xhc3Mtc3BlY2lmaWMgcmVxdWVzdHMsIGV0Yy4gIFRoZSBmdW5jdGlvbiBtdXN0IG5vbi1ibG9ja2luZy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqIFJldHVybnMgLURXQ19FX05PVF9TVVBQT1JURUQgaWYgdGhlIHJlcXVlc3QgaXMgbm90IHN1cHBvcnRlZC4KKyAqIFJldHVybnMgLURXQ19FX0lOVkFMSUQgaWYgdGhlIHNldHVwIHJlcXVlc3QgaGFkIGludmFsaWQgcGFyYW1ldGVycyBvciBieXRlcy4KKyAqIFJldHVybnMgLURXQ19FX1NIVVRET1dOIG9uIGFueSBvdGhlciBlcnJvci4gKi8KK3R5cGVkZWYgaW50ICgqZHdjX3NldHVwX2NiX3QpIChkd2Nfb3RnX3BjZF90ICogcGNkLCB1aW50OF90ICogYnl0ZXMpOworLyoqIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBkZXZpY2UgaGFzIGJlZW4gZGlzY29ubmVjdGVkLiAgVGhlIGZ1bmN0aW9uCisgKiBkcml2ZXIgc2hvdWxkIHRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIHRvIGNsZWFuIHVwIGFsbCBwZW5kaW5nIHJlcXVlc3RzIGluIHRoZQorICogUENEIENvcmUsIHJlbW92ZSBhbGwgZW5kcG9pbnRzIChleGNlcHQgZXAwKSwgYW5kIGluaXRpYWxpemUgYmFjayB0byByZXNldAorICogc3RhdGUuICovCit0eXBlZGVmIGludCAoKmR3Y19kaXNjb25uZWN0X2NiX3QpIChkd2Nfb3RnX3BjZF90ICogcGNkKTsKKy8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRldmljZSBoYXMgYmVlbiBjb25uZWN0ZWQuICovCit0eXBlZGVmIGludCAoKmR3Y19jb25uZWN0X2NiX3QpIChkd2Nfb3RnX3BjZF90ICogcGNkLCBpbnQgc3BlZWQpOworLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZGV2aWNlIGhhcyBiZWVuIHN1c3BlbmRlZCAqLwordHlwZWRlZiBpbnQgKCpkd2Nfc3VzcGVuZF9jYl90KSAoZHdjX290Z19wY2RfdCAqIHBjZCk7CisvKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBkZXZpY2UgaGFzIHJlY2VpdmVkIExQTSB0b2tlbnMsIGkuZS4KKyAqIGRldmljZSBoYXMgYmVlbiBzZW50IHRvIHNsZWVwIHN0YXRlLiAqLwordHlwZWRlZiBpbnQgKCpkd2Nfc2xlZXBfY2JfdCkgKGR3Y19vdGdfcGNkX3QgKiBwY2QpOworLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZGV2aWNlIGhhcyBiZWVuIHJlc3VtZWQKKyAqIGZyb20gc3VzcGVuZChMMikgb3IgTDEgc2xlZXAgc3RhdGUuICovCit0eXBlZGVmIGludCAoKmR3Y19yZXN1bWVfY2JfdCkgKGR3Y19vdGdfcGNkX3QgKiBwY2QpOworLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGhucCBwYXJhbXMgaGFzIGJlZW4gY2hhbmdlZC4KKyAqIFVzZXIgY2FuIGNhbGwgZ2V0X2JfaG5wX2VuYWJsZSwgZ2V0X2FfaG5wX3N1cHBvcnQsIGdldF9hX2FsdF9obnBfc3VwcG9ydCBmdW5jdGlvbnMKKyAqIHRvIGdldCBobnAgcGFyYW1ldGVycy4gKi8KK3R5cGVkZWYgaW50ICgqZHdjX2hucF9wYXJhbXNfY2hhbmdlZF9jYl90KSAoZHdjX290Z19wY2RfdCAqIHBjZCk7CisvKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgVVNCIFJFU0VUIGlzIGRldGVjdGVkLiAqLwordHlwZWRlZiBpbnQgKCpkd2NfcmVzZXRfY2JfdCkgKGR3Y19vdGdfcGNkX3QgKiBwY2QpOworCit0eXBlZGVmIGludCAoKmNmaV9zZXR1cF9jYl90KSAoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqY3RybF9yZXFfYnl0ZXMpOworCisvKioKKyAqCisgKiBAcGFyYW0gZXBfaGFuZGxlCVZvaWQgcG9pbnRlciB0byB0aGUgdXNiX2VwIHN0cnVjdHVyZQorICogQHBhcmFtIGVyZXFfcG9ydCBQb2ludGVyIHRvIHRoZSBleHRlbmRlZCByZXF1ZXN0IHN0cnVjdHVyZSBjcmVhdGVkIGluIHRoZQorICoJCQkJCXBvcnRhYmxlIHBhcnQuCisgKi8KK3R5cGVkZWYgaW50ICgqeGlzb19jb21wbGV0aW9uX2NiX3QpIChkd2Nfb3RnX3BjZF90ICogcGNkLCB2b2lkICplcF9oYW5kbGUsCisJCQkJICAgICB2b2lkICpyZXFfaGFuZGxlLCBpbnQzMl90IHN0YXR1cywKKwkJCQkgICAgIHZvaWQgKmVyZXFfcG9ydCk7CisvKiogRnVuY3Rpb24gRHJpdmVyIE9wcyBEYXRhIFN0cnVjdHVyZSAqLworc3RydWN0IGR3Y19vdGdfcGNkX2Z1bmN0aW9uX29wcyB7CisJZHdjX2Nvbm5lY3RfY2JfdCBjb25uZWN0OworCWR3Y19kaXNjb25uZWN0X2NiX3QgZGlzY29ubmVjdDsKKwlkd2Nfc2V0dXBfY2JfdCBzZXR1cDsKKwlkd2NfY29tcGxldGlvbl9jYl90IGNvbXBsZXRlOworCWR3Y19pc29jX2NvbXBsZXRpb25fY2JfdCBpc29jX2NvbXBsZXRlOworCWR3Y19zdXNwZW5kX2NiX3Qgc3VzcGVuZDsKKwlkd2Nfc2xlZXBfY2JfdCBzbGVlcDsKKwlkd2NfcmVzdW1lX2NiX3QgcmVzdW1lOworCWR3Y19yZXNldF9jYl90IHJlc2V0OworCWR3Y19obnBfcGFyYW1zX2NoYW5nZWRfY2JfdCBobnBfY2hhbmdlZDsKKwljZmlfc2V0dXBfY2JfdCBjZmlfc2V0dXA7CisjaWZkZWYgRFdDX1VURV9QRVJfSU8KKwl4aXNvX2NvbXBsZXRpb25fY2JfdCB4aXNvY19jb21wbGV0ZTsKKyNlbmRpZgorfTsKKy8qKiBAfSAqLworCisvKiogQG5hbWUgRnVuY3Rpb24gRHJpdmVyIEZ1bmN0aW9ucyAqLworLyoqIEB7ICovCisKKy8qKiBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IHBvaW50ZXIgb24gZHdjX290Z19wY2RfdCwKKyAqIHRoaXMgcG9pbnRlciB3aWxsIGJlIHVzZWQgZm9yIGFsbCBQQ0QgQVBJIGZ1bmN0aW9ucy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBUaGUgRFdDX09URyBDb3JlCisgKi8KK2V4dGVybiBkd2Nfb3RnX3BjZF90ICpkd2Nfb3RnX3BjZF9pbml0KGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZik7CisKKy8qKiBGcmVlcyBQQ0QgYWxsb2NhdGVkIGJ5IGR3Y19vdGdfcGNkX2luaXQKKyAqCisgKiBAcGFyYW0gcGNkIFRoZSBQQ0QKKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19wY2RfcmVtb3ZlKGR3Y19vdGdfcGNkX3QgKiBwY2QpOworCisvKiogQ2FsbCB0aGlzIHRvIGJpbmQgdGhlIGZ1bmN0aW9uIGRyaXZlciB0byB0aGUgUENEIENvcmUuCisgKgorICogQHBhcmFtIHBjZCBQb2ludGVyIG9uIGR3Y19vdGdfcGNkX3QgcmV0dXJuZWQgYnkgZHdjX290Z19wY2RfaW5pdCBmdW5jdGlvbi4KKyAqIEBwYXJhbSBmb3BzIFRoZSBGdW5jdGlvbiBEcml2ZXIgT3BzIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gYWxsIGNhbGxiYWNrcy4KKyAqLworZXh0ZXJuIHZvaWQgZHdjX290Z19wY2Rfc3RhcnQoZHdjX290Z19wY2RfdCAqIHBjZCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBkd2Nfb3RnX3BjZF9mdW5jdGlvbl9vcHMgKmZvcHMpOworCisvKiogRW5hYmxlcyBhbiBlbmRwb2ludCBmb3IgdXNlLiAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIGFuIGVuZHBvaW50IGluCisgKiB0aGUgUENELiAgVGhlIGVuZHBvaW50IGlzIGRlc2NyaWJlZCBieSB0aGUgZXBfZGVzYyB3aGljaCBoYXMgdGhlCisgKiBzYW1lIGZvcm1hdCBhcyBhIFVTQiBlcCBkZXNjcmlwdG9yLiAgVGhlIGVwX2hhbmRsZSBwYXJhbWV0ZXIgaXMgdXNlZCB0byByZWZlcgorICogdG8gdGhlIGVuZHBvaW50IGZyb20gb3RoZXIgQVBJIGZ1bmN0aW9ucyBhbmQgaW4gY2FsbGJhY2tzLiAgTm9ybWFsbHkgdGhpcworICogc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhIFNFVF9DT05GSUdVUkFUSU9OL1NFVF9JTlRFUkZBQ0UgdG8gY29uZmlndXJlIHRoZQorICogY29yZSBmb3IgdGhhdCBpbnRlcmZhY2UuCisgKgorICogUmV0dXJucyAtRFdDX0VfSU5WQUxJRCBpZiBpbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQuCisgKiBSZXR1cm5zIC1EV0NfRV9TSFVURE9XTiBpZiBhbnkgb3RoZXIgZXJyb3Igb2N1cnJlZC4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICoKKyAqIEBwYXJhbSBwY2QgVGhlIFBDRAorICogQHBhcmFtIGVwX2Rlc2MgRW5kcG9pbnQgZGVzY3JpcHRvcgorICogQHBhcmFtIHVzYl9lcCBIYW5kbGUgb24gZW5kcG9pbnQsIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IGVuZHBvaW50LgorICovCitleHRlcm4gaW50IGR3Y19vdGdfcGNkX2VwX2VuYWJsZShkd2Nfb3RnX3BjZF90ICogcGNkLAorCQkJCSBjb25zdCB1aW50OF90ICogZXBfZGVzYywgdm9pZCAqdXNiX2VwKTsKKworLyoqIERpc2FibGUgdGhlIGVuZHBvaW50IHJlZmVyZW5jZWQgYnkgZXBfaGFuZGxlLgorICoKKyAqIFJldHVybnMgLURXQ19FX0lOVkFMSUQgaWYgaW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkLgorICogUmV0dXJucyAtRFdDX0VfU0hVVERPV04gaWYgYW55IG90aGVyIGVycm9yIG9jY3VycmVkLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICovCitleHRlcm4gaW50IGR3Y19vdGdfcGNkX2VwX2Rpc2FibGUoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlKTsKKworLyoqIFF1ZXVlIGEgZGF0YSB0cmFuc2ZlciByZXF1ZXN0IG9uIHRoZSBlbmRwb2ludCByZWZlcmVuY2VkIGJ5IGVwX2hhbmRsZS4KKyAqIEFmdGVyIHRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZXMsIHRoZSBjb21wbGV0ZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoCisgKiB0aGUgcmVxdWVzdCBzdGF0dXMuCisgKgorICogQHBhcmFtIHBjZCBUaGUgUENECisgKiBAcGFyYW0gZXBfaGFuZGxlIFRoZSBoYW5kbGUgb2YgdGhlIGVuZHBvaW50CisgKiBAcGFyYW0gYnVmIFRoZSBidWZmZXIgZm9yIHRoZSBkYXRhCisgKiBAcGFyYW0gZG1hX2J1ZiBUaGUgRE1BIGJ1ZmZlciBmb3IgdGhlIGRhdGEKKyAqIEBwYXJhbSBidWZsZW4gVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0cmFuc2ZlcgorICogQHBhcmFtIHplcm8gU3BlY2lmaWVzIHdoZXRoZXIgdG8gc2VuZCB6ZXJvIGxlbmd0aCBsYXN0IHBhY2tldC4KKyAqIEBwYXJhbSByZXFfaGFuZGxlIFNldCB0aGlzIGhhbmRsZSB0byBhbnkgdmFsdWUgdG8gdXNlIHRvIHJlZmVyZW5jZSB0aGlzCisgKiByZXF1ZXN0IGluIHRoZSBlcF9kZXF1ZXVlIGZ1bmN0aW9uIG9yIGZyb20gdGhlIGNvbXBsZXRlIGNhbGxiYWNrCisgKiBAcGFyYW0gYXRvbWljX2FsbG9jIElmIGRyaXZlciBuZWVkIHRvIHBlcmZvcm0gYXRvbWljIGFsbG9jYXRpb25zCisgKiBmb3IgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgorICoKKyAqIFJldHVybnMgLURXQ19FX0lOVkFMSUQgaWYgaW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkLgorICogUmV0dXJucyAtRFdDX0VfU0hVVERPV04gaWYgYW55IG90aGVyIGVycm9yIG9jdXJyZWQuCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gKi8KK2V4dGVybiBpbnQgZHdjX290Z19wY2RfZXBfcXVldWUoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlLAorCQkJCXVpbnQ4X3QgKiBidWYsIGR3Y19kbWFfdCBkbWFfYnVmLAorCQkJCXVpbnQzMl90IGJ1ZmxlbiwgaW50IHplcm8sIHZvaWQgKnJlcV9oYW5kbGUsCisJCQkJaW50IGF0b21pY19hbGxvYyk7CisjaWZkZWYgRFdDX1VURV9QRVJfSU8KKy8qKgorICoKKyAqIEBwYXJhbSBlcmVxX25vbnBvcnQJUG9pbnRlciB0byB0aGUgZXh0ZW5kZWQgcmVxdWVzdCBwYXJ0IG9mIHRoZQorICoJCQkJCQl1c2JfcmVxdWVzdCBzdHJ1Y3R1cmUgZGVmaW5lZCBpbiB1c2JfZ2FkZ2V0LmggZmlsZS4KKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3BjZF94aXNvX2VwX3F1ZXVlKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKmVwX2hhbmRsZSwKKwkJCQkgICAgIHVpbnQ4X3QgKiBidWYsIGR3Y19kbWFfdCBkbWFfYnVmLAorCQkJCSAgICAgdWludDMyX3QgYnVmbGVuLCBpbnQgemVybywKKwkJCQkgICAgIHZvaWQgKnJlcV9oYW5kbGUsIGludCBhdG9taWNfYWxsb2MsCisJCQkJICAgICB2b2lkICplcmVxX25vbnBvcnQpOworCisjZW5kaWYKKworLyoqIERlLXF1ZXVlIHRoZSBzcGVjaWZpZWQgZGF0YSB0cmFuc2ZlciB0aGF0IGhhcyBub3QgeWV0IGNvbXBsZXRlZC4KKyAqCisgKiBSZXR1cm5zIC1EV0NfRV9JTlZBTElEIGlmIGludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZC4KKyAqIFJldHVybnMgLURXQ19FX1NIVVRET1dOIGlmIGFueSBvdGhlciBlcnJvciBvY3VycmVkLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICovCitleHRlcm4gaW50IGR3Y19vdGdfcGNkX2VwX2RlcXVldWUoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlLAorCQkJCSAgdm9pZCAqcmVxX2hhbmRsZSk7CisKKy8qKiBIYWx0IChTVEFMTCkgYW4gZW5kcG9pbnQgb3IgY2xlYXIgaXQuCisgKgorICogUmV0dXJucyAtRFdDX0VfSU5WQUxJRCBpZiBpbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQuCisgKiBSZXR1cm5zIC1EV0NfRV9TSFVURE9XTiBpZiBhbnkgb3RoZXIgZXJyb3Igb2N1cnJlZC4KKyAqIFJldHVybnMgLURXQ19FX0FHQUlOIGlmIHRoZSBTVEFMTCBjYW5ub3QgYmUgc2VudCBhbmQgbXVzdCBiZSB0cmllZCBhZ2FpbiBsYXRlcgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICovCitleHRlcm4gaW50IGR3Y19vdGdfcGNkX2VwX2hhbHQoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlLCBpbnQgdmFsdWUpOworCisvKiogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9uIGV2ZXJ5IGhhcmR3YXJlIGludGVycnVwdCAqLworZXh0ZXJuIGludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2ludHIoZHdjX290Z19wY2RfdCAqIHBjZCk7CisKKy8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgY3VycmVudCBmcmFtZSBudW1iZXIgKi8KK2V4dGVybiBpbnQgZHdjX290Z19wY2RfZ2V0X2ZyYW1lX251bWJlcihkd2Nfb3RnX3BjZF90ICogcGNkKTsKKworLyoqCisgKiBTdGFydCBpc29jaHJvbm91cyB0cmFuc2ZlcnMgb24gdGhlIGVuZHBvaW50IHJlZmVyZW5jZWQgYnkgZXBfaGFuZGxlLgorICogRm9yIGlzb2Nocm9ub3VzIHRyYW5zZmVycyBkdWJsZSBidWZmZXJpbmcgaXMgdXNlZC4KKyAqIEFmdGVyIHByb2Nlc3NpbmcgZWFjaCBvZiBidWZmZXJzIGNvbWxldGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aAorICogc3RhdHVzIGZvciBlYWNoIHRyYW5zYWN0aW9uLgorICoKKyAqIEBwYXJhbSBwY2QgVGhlIFBDRAorICogQHBhcmFtIGVwX2hhbmRsZSBUaGUgaGFuZGxlIG9mIHRoZSBlbmRwb2ludAorICogQHBhcmFtIGJ1ZjAgVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiBmaXJzdCBkYXRhIGJ1ZmZlcgorICogQHBhcmFtIGJ1ZjEgVGhlIHZpcnR1YWwgYWRkcmVzcyBvZiBzZWNvbmQgZGF0YSBidWZmZXIKKyAqIEBwYXJhbSBkbWEwIFRoZSBETUEgYWRkcmVzcyBvZiBmaXJzdCBkYXRhIGJ1ZmZlcgorICogQHBhcmFtIGRtYTEgVGhlIERNQSBhZGRyZXNzIG9mIHNlY29uZCBkYXRhIGJ1ZmZlcgorICogQHBhcmFtIHN5bmNfZnJhbWUgRGF0YSBwYXR0ZXJuIGZyYW1lIG51bWJlcgorICogQHBhcmFtIGRwX2ZyYW1lIERhdGEgc2l6ZSBmb3IgcGF0dGVybiBmcmFtZQorICogQHBhcmFtIGRhdGFfcGVyX2ZyYW1lIERhdGEgc2l6ZSBmb3IgcmVndWxhciBmcmFtZQorICogQHBhcmFtIHN0YXJ0X2ZyYW1lIEZyYW1lIG51bWJlciB0byBzdGFydCB0cmFuc2ZlcnMsIGlmIC0xIHRoZW4gc3RhcnQgdHJhbnNmZXJzIEFTQVAuCisgKiBAcGFyYW0gYnVmX3Byb2NfaW50cnZsIEludGVydmFsIG9mIElTT0MgQnVmZmVyIHByb2Nlc3NpbmcKKyAqIEBwYXJhbSByZXFfaGFuZGxlIEhhbmRsZSBvZiBJU09DIHJlcXVlc3QKKyAqIEBwYXJhbSBhdG9taWNfYWxsb2MgU3BlY2VmaWVzIHdoZXRoZXIgdG8gcGVyZm9ybSBhdG9taWMgYWxsb2NhdGlvbiBmb3IKKyAqIAkJCWludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKiBSZXR1cm5zIC1EV0NfRV9OT19NRU1PUlkgaWYgdGhlcmUgaXMgbm8gZW5vdWdoIG1lbW9yeS4KKyAqIFJldHVybnMgLURXQ19FX0lOVkFMSUQgaWYgaW5jb3JyZWN0IGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi4KKyAqIFJldHVybnMgLURXX0VfU0hVVERPV04gZm9yIGFueSBvdGhlciBlcnJvci4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzCisgKi8KK2V4dGVybiBpbnQgZHdjX290Z19wY2RfaXNvX2VwX3N0YXJ0KGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKmVwX2hhbmRsZSwKKwkJCQkgICAgdWludDhfdCAqIGJ1ZjAsIHVpbnQ4X3QgKiBidWYxLAorCQkJCSAgICBkd2NfZG1hX3QgZG1hMCwgZHdjX2RtYV90IGRtYTEsCisJCQkJICAgIGludCBzeW5jX2ZyYW1lLCBpbnQgZHBfZnJhbWUsCisJCQkJICAgIGludCBkYXRhX3Blcl9mcmFtZSwgaW50IHN0YXJ0X2ZyYW1lLAorCQkJCSAgICBpbnQgYnVmX3Byb2NfaW50cnZsLCB2b2lkICpyZXFfaGFuZGxlLAorCQkJCSAgICBpbnQgYXRvbWljX2FsbG9jKTsKKworLyoqIFN0b3AgSVNPQyB0cmFuc2ZlcnMgb24gZW5kcG9pbnQgcmVmZXJlbmNlZCBieSBlcF9oYW5kbGUuCisgKgorICogQHBhcmFtIHBjZCBUaGUgUENECisgKiBAcGFyYW0gZXBfaGFuZGxlIFRoZSBoYW5kbGUgb2YgdGhlIGVuZHBvaW50CisgKiBAcGFyYW0gcmVxX2hhbmRsZSBIYW5kbGUgb2YgSVNPQyByZXF1ZXN0CisgKgorICogUmV0dXJucyAtRFdDX0VfSU5WQUxJRCBpZiBpbmNvcnJlY3QgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcworICovCitpbnQgZHdjX290Z19wY2RfaXNvX2VwX3N0b3AoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlLAorCQkJICAgIHZvaWQgKnJlcV9oYW5kbGUpOworCisvKiogR2V0IElTT0MgcGFja2V0IHN0YXR1cy4KKyAqCisgKiBAcGFyYW0gcGNkIFRoZSBQQ0QKKyAqIEBwYXJhbSBlcF9oYW5kbGUgVGhlIGhhbmRsZSBvZiB0aGUgZW5kcG9pbnQKKyAqIEBwYXJhbSBpc29fcmVxX2hhbmRsZSBJc29jaHJvbm91c2ggcmVxdWVzdCBoYW5kbGUKKyAqIEBwYXJhbSBwYWNrZXQgTnVtYmVyIG9mIHBhY2tldAorICogQHBhcmFtIHN0YXR1cyBPdXQgcGFyYW1ldGVyIGZvciByZXR1cm5pbmcgc3RhdHVzCisgKiBAcGFyYW0gYWN0dWFsIE91dCBwYXJhbWV0ZXIgZm9yIHJldHVybmluZyBhY3R1YWwgbGVuZ3RoCisgKiBAcGFyYW0gb2Zmc2V0IE91dCBwYXJhbWV0ZXIgZm9yIHJldHVybmluZyBvZmZzZXQKKyAqCisgKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfcGNkX2dldF9pc29fcGFja2V0X3BhcmFtcyhkd2Nfb3RnX3BjZF90ICogcGNkLAorCQkJCQkgICAgICB2b2lkICplcF9oYW5kbGUsCisJCQkJCSAgICAgIHZvaWQgKmlzb19yZXFfaGFuZGxlLCBpbnQgcGFja2V0LAorCQkJCQkgICAgICBpbnQgKnN0YXR1cywgaW50ICphY3R1YWwsCisJCQkJCSAgICAgIGludCAqb2Zmc2V0KTsKKworLyoqIEdldCBJU09DIHBhY2tldCBjb3VudC4KKyAqCisgKiBAcGFyYW0gcGNkIFRoZSBQQ0QKKyAqIEBwYXJhbSBlcF9oYW5kbGUgVGhlIGhhbmRsZSBvZiB0aGUgZW5kcG9pbnQKKyAqIEBwYXJhbSBpc29fcmVxX2hhbmRsZQorICovCitleHRlcm4gaW50IGR3Y19vdGdfcGNkX2dldF9pc29fcGFja2V0X2NvdW50KGR3Y19vdGdfcGNkX3QgKiBwY2QsCisJCQkJCSAgICB2b2lkICplcF9oYW5kbGUsCisJCQkJCSAgICB2b2lkICppc29fcmVxX2hhbmRsZSk7CisKKy8qKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUgU1JQIFByb3RvY29sIGlmIG5vIHNlc3Npb24gaXMgaW4gcHJvZ3Jlc3MuIElmCisgKiBhIHNlc3Npb24gaXMgYWxyZWFkeSBpbiBwcm9ncmVzcywgYnV0IHRoZSBkZXZpY2UgaXMgc3VzcGVuZGVkLAorICogcmVtb3RlIHdha2V1cCBzaWduYWxpbmcgaXMgc3RhcnRlZC4KKyAqLworZXh0ZXJuIGludCBkd2Nfb3RnX3BjZF93YWtldXAoZHdjX290Z19wY2RfdCAqIHBjZCk7CisKKy8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMSBpZiBMUE0gc3VwcG9ydCBpcyBlbmFibGVkLCBhbmQgMCBvdGhlcndpc2UuICovCitleHRlcm4gaW50IGR3Y19vdGdfcGNkX2lzX2xwbV9lbmFibGVkKGR3Y19vdGdfcGNkX3QgKiBwY2QpOworCisvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgcmVtb3RlIHdha2V1cCBpcyBhbGxvd2VkIGFuZCAwLCBvdGhlcndpc2UuICovCitleHRlcm4gaW50IGR3Y19vdGdfcGNkX2dldF9ybXdrdXBfZW5hYmxlKGR3Y19vdGdfcGNkX3QgKiBwY2QpOworCisvKiogSW5pdGlhdGUgU1JQICovCitleHRlcm4gdm9pZCBkd2Nfb3RnX3BjZF9pbml0aWF0ZV9zcnAoZHdjX290Z19wY2RfdCAqIHBjZCk7CisKKy8qKiBTdGFydHMgcmVtb3RlIHdha2V1cCBzaWduYWxpbmcuICovCitleHRlcm4gdm9pZCBkd2Nfb3RnX3BjZF9yZW1vdGVfd2FrZXVwKGR3Y19vdGdfcGNkX3QgKiBwY2QsIGludCBzZXQpOworCisvKiogU3RhcnRzIG1pY29yc2Vjb25kIHNvZnQgZGlzY29ubmVjdC4gKi8KK2V4dGVybiB2b2lkIGR3Y19vdGdfcGNkX2Rpc2Nvbm5lY3RfdXMoZHdjX290Z19wY2RfdCAqIHBjZCwgaW50IG5vX29mX3VzZWNzKTsKKy8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgd2hldGhlciBkZXZpY2UgaXMgZHVhbHNwZWVkLiovCitleHRlcm4gdWludDMyX3QgZHdjX290Z19wY2RfaXNfZHVhbHNwZWVkKGR3Y19vdGdfcGNkX3QgKiBwY2QpOworCisvKiogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHdoZXRoZXIgZGV2aWNlIGlzIG90Zy4gKi8KK2V4dGVybiB1aW50MzJfdCBkd2Nfb3RnX3BjZF9pc19vdGcoZHdjX290Z19wY2RfdCAqIHBjZCk7CisKKy8qKiBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgdG8gZ2V0IGhucCBwYXJhbWV0ZXJzICovCitleHRlcm4gdWludDMyX3QgZ2V0X2JfaG5wX2VuYWJsZShkd2Nfb3RnX3BjZF90ICogcGNkKTsKK2V4dGVybiB1aW50MzJfdCBnZXRfYV9obnBfc3VwcG9ydChkd2Nfb3RnX3BjZF90ICogcGNkKTsKK2V4dGVybiB1aW50MzJfdCBnZXRfYV9hbHRfaG5wX3N1cHBvcnQoZHdjX290Z19wY2RfdCAqIHBjZCk7CisKKy8qKiBDRkkgc3BlY2lmaWMgSW50ZXJmYWNlIGZ1bmN0aW9ucyAqLworLyoqIEFsbG9jYXRlIGEgY2ZpIGJ1ZmZlciAqLworZXh0ZXJuIHVpbnQ4X3QgKmNmaXdfZXBfYWxsb2NfYnVmZmVyKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKnBlcCwKKwkJCQkgICAgIGR3Y19kbWFfdCAqIGFkZHIsIHNpemVfdCBidWZsZW4sCisJCQkJICAgICBpbnQgZmxhZ3MpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQH0gKi8KKworI2VuZGlmCQkJCS8qIF9fRFdDX1BDRF9JRl9IX18gKi8KKworI2VuZGlmCQkJCS8qIERXQ19IT1NUX09OTFkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19wY2RfaW50ci5jIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX3BjZF9pbnRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIyODZmZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19wY2RfaW50ci5jCkBAIC0wLDAgKzEsNDgxNSBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICRGaWxlOiAvL2R3aC91c2JfaWlwL2Rldi9zb2Z0d2FyZS9vdGcvbGludXgvZHJpdmVycy9kd2Nfb3RnX3BjZF9pbnRyLmMgJAorICogJFJldmlzaW9uOiAjMTEzICQKKyAqICREYXRlOiAyMDExLzEwLzI0ICQKKyAqICRDaGFuZ2U6IDE4NzExNjAgJAorICoKKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisjaWZuZGVmIERXQ19IT1NUX09OTFkKKworI2luY2x1ZGUgImR3Y19vdGdfcGNkLmgiCisKKyNpZmRlZiBEV0NfVVRFX0NGSQorI2luY2x1ZGUgImR3Y19vdGdfY2ZpLmgiCisjZW5kaWYKKworI2lmZGVmIERXQ19VVEVfUEVSX0lPCitleHRlcm4gdm9pZCBjb21wbGV0ZV94aXNvX2VwKGR3Y19vdGdfcGNkX2VwX3QgKiBlcCk7CisjZW5kaWYKKy8vI2RlZmluZSBQUklOVF9DRklfRE1BX0RFU0NTCisKKyNkZWZpbmUgREVCVUdfRVAwCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIE9URy4KKyAqLworc3RhdGljIHZvaWQgZHdjX290Z19wY2RfdXBkYXRlX290Zyhkd2Nfb3RnX3BjZF90ICogcGNkLCBjb25zdCB1bnNpZ25lZCByZXNldCkKK3sKKworCWlmIChyZXNldCkgeworCQlwY2QtPmJfaG5wX2VuYWJsZSA9IDA7CisJCXBjZC0+YV9obnBfc3VwcG9ydCA9IDA7CisJCXBjZC0+YV9hbHRfaG5wX3N1cHBvcnQgPSAwOworCX0KKworCWlmIChwY2QtPmZvcHMtPmhucF9jaGFuZ2VkKSB7CisJCXBjZC0+Zm9wcy0+aG5wX2NoYW5nZWQocGNkKTsKKwl9Cit9CisKKy8qKiBAZmlsZQorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUENEIEludGVycnVwdCBoYW5kbGVycy4KKyAqCisgKiBUaGUgUENEIGhhbmRsZXMgdGhlIGRldmljZSBpbnRlcnJ1cHRzLiAgTWFueSBjb25kaXRpb25zIGNhbiBjYXVzZSBhCisgKiBkZXZpY2UgaW50ZXJydXB0LiBXaGVuIGFuIGludGVycnVwdCBvY2N1cnMsIHRoZSBkZXZpY2UgaW50ZXJydXB0CisgKiBzZXJ2aWNlIHJvdXRpbmUgZGV0ZXJtaW5lcyB0aGUgY2F1c2Ugb2YgdGhlIGludGVycnVwdCBhbmQKKyAqIGRpc3BhdGNoZXMgaGFuZGxpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uLiBUaGVzZSBpbnRlcnJ1cHQKKyAqIGhhbmRsaW5nIGZ1bmN0aW9ucyBhcmUgZGVzY3JpYmVkIGJlbG93LgorICogQWxsIGludGVycnVwdCByZWdpc3RlcnMgYXJlIHByb2Nlc3NlZCBmcm9tIExTQiB0byBNU0IuCisgKi8KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHByaW50cyB0aGUgZXAwIHN0YXRlIGZvciBkZWJ1ZyBwdXJwb3Nlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHByaW50X2VwMF9zdGF0ZShkd2Nfb3RnX3BjZF90ICogcGNkKQoreworI2lmZGVmIERFQlVHCisJY2hhciBzdHJbNDBdOworCisJc3dpdGNoIChwY2QtPmVwMHN0YXRlKSB7CisJY2FzZSBFUDBfRElTQ09OTkVDVDoKKwkJZHdjX3N0cmNweShzdHIsICJFUDBfRElTQ09OTkVDVCIpOworCQlicmVhazsKKwljYXNlIEVQMF9JRExFOgorCQlkd2Nfc3RyY3B5KHN0ciwgIkVQMF9JRExFIik7CisJCWJyZWFrOworCWNhc2UgRVAwX0lOX0RBVEFfUEhBU0U6CisJCWR3Y19zdHJjcHkoc3RyLCAiRVAwX0lOX0RBVEFfUEhBU0UiKTsKKwkJYnJlYWs7CisJY2FzZSBFUDBfT1VUX0RBVEFfUEhBU0U6CisJCWR3Y19zdHJjcHkoc3RyLCAiRVAwX09VVF9EQVRBX1BIQVNFIik7CisJCWJyZWFrOworCWNhc2UgRVAwX0lOX1NUQVRVU19QSEFTRToKKwkJZHdjX3N0cmNweShzdHIsICJFUDBfSU5fU1RBVFVTX1BIQVNFIik7CisJCWJyZWFrOworCWNhc2UgRVAwX09VVF9TVEFUVVNfUEhBU0U6CisJCWR3Y19zdHJjcHkoc3RyLCAiRVAwX09VVF9TVEFUVVNfUEhBU0UiKTsKKwkJYnJlYWs7CisJY2FzZSBFUDBfU1RBTEw6CisJCWR3Y19zdHJjcHkoc3RyLCAiRVAwX1NUQUxMIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWR3Y19zdHJjcHkoc3RyLCAiRVAwX0lOVkFMSUQiKTsKKwl9CisKKwlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXMoJWQpXG4iLCBzdHIsIHBjZC0+ZXAwc3RhdGUpOworI2VuZGlmCit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHBheWxvYWQgaW4gdGhlIG1lbW9yeSAKKyAqIGZvciBvdXQgZW5kcG9pbnRzIGFuZCBwcmludHMgc2l6ZSBmb3IgZGVidWcgcHVycG9zZXModXNlZCBpbiAKKyAqIDIuOTNhIERldk91dE5hayBmZWF0dXJlKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHByaW50X21lbW9yeV9wYXlsb2FkKGR3Y19vdGdfcGNkX3QgKiBwY2QsICBkd2NfZXBfdCAqIGVwKQoreworI2lmZGVmIERFQlVHCisJZGVwdHNpel9kYXRhX3QgZGVwdHNpel9pbml0ID0gey5kMzIgPSAwIH07CisJZGVwdHNpel9kYXRhX3QgZGVwdHNpel91cGR0ID0gey5kMzIgPSAwIH07CisJaW50IHBhY2tfbnVtOworCXVuc2lnbmVkIHBheWxvYWQ7CisJCisJZGVwdHNpel9pbml0LmQzMiA9IHBjZC0+Y29yZV9pZi0+c3RhcnRfZG9lcHRzaXpfdmFsW2VwLT5udW1dOworCWRlcHRzaXpfdXBkdC5kMzIgPQorCQlEV0NfUkVBRF9SRUczMigmcGNkLT5jb3JlX2lmLT5kZXZfaWYtPgorCQkJCQkJb3V0X2VwX3JlZ3NbZXAtPm51bV0tPmRvZXB0c2l6KTsKKwkvKiBQYXlsb2FkIHdpbGwgYmUgKi8KKwlwYXlsb2FkID0gZGVwdHNpel9pbml0LmIueGZlcnNpemUgLSBkZXB0c2l6X3VwZHQuYi54ZmVyc2l6ZTsKKwkvKiBQYWNrZXQgY291bnQgaXMgZGVjcmVtZW50ZWQgZXZlcnkgdGltZSBhIHBhY2tldAorCSAqIGlzIHdyaXR0ZW4gdG8gdGhlIFJ4RklGTyBub3QgaW4gdG8gdGhlIGV4dGVybmFsIG1lbW9yeQorCSAqIFNvLCBpZiBwYXlsb2FkID09IDAsIHRoZW4gaXQgbWVhbnMgbm8gcGFja2V0IHdhcyBzZW50IHRvIGV4dCBtZW1vcnkqLworCXBhY2tfbnVtID0gKCFwYXlsb2FkKSA/IDAgOiAoZGVwdHNpel9pbml0LmIucGt0Y250IC0gZGVwdHNpel91cGR0LmIucGt0Y250KTsKKwlEV0NfREVCVUdQTChEQkdfUENEViwKKwkJIlBheWxvYWQgZm9yIEVQJWQtJXNcbiIsCisJCWVwLT5udW0sIChlcC0+aXNfaW4gPyAiSU4iIDogIk9VVCIpKTsKKwlEV0NfREVCVUdQTChEQkdfUENEViwKKwkJIk51bWJlciBvZiB0cmFuc2ZlcmVkIGJ5dGVzID0gMHglMDh4XG4iLCBwYXlsb2FkKTsKKwlEV0NfREVCVUdQTChEQkdfUENEViwKKwkJIk51bWJlciBvZiB0cmFuc2ZlcmVkIHBhY2tldHMgPSAlZFxuIiwgcGFja19udW0pOwkKKyNlbmRpZgkKK30KKworCisjaWZkZWYgRFdDX1VURV9DRkkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9kZXNjKHN0cnVjdCBkd2Nfb3RnX2RtYV9kZXNjICpkZGVzYywKKwkJCSAgICAgIGNvbnN0IHVpbnQ4X3QgKiBlcG5hbWUsIGludCBkZXNjbnVtKQoreworCUNGSV9JTkZPCisJICAgICgiJXMgRE1BX0RFU0MoJWQpIGJ1Zj0weCUwOHggYnl0ZXM9MHglMDR4OyBzcD0weCV4OyBsPTB4JXg7IHN0cz0weCUwMng7IGJzPTB4JTAyeFxuIiwKKwkgICAgIGVwbmFtZSwgZGVzY251bSwgZGRlc2MtPmJ1ZiwgZGRlc2MtPnN0YXR1cy5iLmJ5dGVzLAorCSAgICAgZGRlc2MtPnN0YXR1cy5iLnNwLCBkZGVzYy0+c3RhdHVzLmIubCwgZGRlc2MtPnN0YXR1cy5iLnN0cywKKwkgICAgIGRkZXNjLT5zdGF0dXMuYi5icyk7Cit9CisjZW5kaWYKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgcG9pbnRlciB0byBpbiBlcCBzdHJ1Y3Qgd2l0aCBudW1iZXIgZXBfbnVtCisgKi8KK3N0YXRpYyBpbmxpbmUgZHdjX290Z19wY2RfZXBfdCAqZ2V0X2luX2VwKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHVpbnQzMl90IGVwX251bSkKK3sKKwlpbnQgaTsKKwlpbnQgbnVtX2luX2VwcyA9IEdFVF9DT1JFX0lGKHBjZCktPmRldl9pZi0+bnVtX2luX2VwczsKKwlpZiAoZXBfbnVtID09IDApIHsKKwkJcmV0dXJuICZwY2QtPmVwMDsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2luX2VwczsgKytpKSB7CisJCQlpZiAocGNkLT5pbl9lcFtpXS5kd2NfZXAubnVtID09IGVwX251bSkKKwkJCQlyZXR1cm4gJnBjZC0+aW5fZXBbaV07CisJCX0KKwkJcmV0dXJuIDA7CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBwb2ludGVyIHRvIG91dCBlcCBzdHJ1Y3Qgd2l0aCBudW1iZXIgZXBfbnVtCisgKi8KK3N0YXRpYyBpbmxpbmUgZHdjX290Z19wY2RfZXBfdCAqZ2V0X291dF9lcChkd2Nfb3RnX3BjZF90ICogcGNkLCB1aW50MzJfdCBlcF9udW0pCit7CisJaW50IGk7CisJaW50IG51bV9vdXRfZXBzID0gR0VUX0NPUkVfSUYocGNkKS0+ZGV2X2lmLT5udW1fb3V0X2VwczsKKwlpZiAoZXBfbnVtID09IDApIHsKKwkJcmV0dXJuICZwY2QtPmVwMDsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX291dF9lcHM7ICsraSkgeworCQkJaWYgKHBjZC0+b3V0X2VwW2ldLmR3Y19lcC5udW0gPT0gZXBfbnVtKQorCQkJCXJldHVybiAmcGNkLT5vdXRfZXBbaV07CisJCX0KKwkJcmV0dXJuIDA7CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb25zIGdldHMgYSBwb2ludGVyIHRvIGFuIEVQIGZyb20gdGhlIHdJbmRleCBhZGRyZXNzCisgKiB2YWx1ZSBvZiB0aGUgY29udHJvbCByZXF1ZXN0LgorICovCitkd2Nfb3RnX3BjZF9lcF90ICpnZXRfZXBfYnlfYWRkcihkd2Nfb3RnX3BjZF90ICogcGNkLCB1MTYgd0luZGV4KQoreworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCXVpbnQzMl90IGVwX251bSA9IFVFX0dFVF9BRERSKHdJbmRleCk7CisKKwlpZiAoZXBfbnVtID09IDApIHsKKwkJZXAgPSAmcGNkLT5lcDA7CisJfSBlbHNlIGlmIChVRV9HRVRfRElSKHdJbmRleCkgPT0gVUVfRElSX0lOKSB7CS8qIGluIGVwICovCisJCWVwID0gJnBjZC0+aW5fZXBbZXBfbnVtIC0gMV07CisJfSBlbHNlIHsKKwkJZXAgPSAmcGNkLT5vdXRfZXBbZXBfbnVtIC0gMV07CisJfQorCisJcmV0dXJuIGVwOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBFUCByZXF1ZXN0IHF1ZXVlLCBpZiB0aGUgcXVldWUgaXMgbm90CisgKiBlbXB0eSB0aGUgbmV4dCByZXF1ZXN0IGlzIHN0YXJ0ZWQuCisgKi8KK3ZvaWQgc3RhcnRfbmV4dF9yZXF1ZXN0KGR3Y19vdGdfcGNkX2VwX3QgKiBlcCkKK3sKKwlkd2Nfb3RnX3BjZF9yZXF1ZXN0X3QgKnJlcSA9IDA7CisJdWludDMyX3QgbWF4X3RyYW5zZmVyID0KKwkgICAgR0VUX0NPUkVfSUYoZXAtPnBjZCktPmNvcmVfcGFyYW1zLT5tYXhfdHJhbnNmZXJfc2l6ZTsKKworI2lmZGVmIERXQ19VVEVfQ0ZJCisJc3RydWN0IGR3Y19vdGdfcGNkICpwY2Q7CisJcGNkID0gZXAtPnBjZDsKKyNlbmRpZgorCisJaWYgKCFEV0NfQ0lSQ0xFUV9FTVBUWSgmZXAtPnF1ZXVlKSkgeworCQlyZXEgPSBEV0NfQ0lSQ0xFUV9GSVJTVCgmZXAtPnF1ZXVlKTsKKworI2lmZGVmIERXQ19VVEVfQ0ZJCisJCWlmIChlcC0+ZHdjX2VwLmJ1ZmZfbW9kZSAhPSBCTV9TVEFOREFSRCkgeworCQkJZXAtPmR3Y19lcC5jZmlfcmVxX2xlbiA9IHJlcS0+bGVuZ3RoOworCQkJcGNkLT5jZmktPm9wcy5idWlsZF9kZXNjcmlwdG9ycyhwY2QtPmNmaSwgcGNkLCBlcCwgcmVxKTsKKwkJfSBlbHNlIHsKKyNlbmRpZgorCQkJLyogU2V0dXAgYW5kIHN0YXJ0IHRoZSBUcmFuc2ZlciAqLworCQkJaWYgKHJlcS0+ZHdfYWxpZ25fYnVmKSB7CisJCQkJZXAtPmR3Y19lcC5kbWFfYWRkciA9IHJlcS0+ZHdfYWxpZ25fYnVmX2RtYTsKKwkJCQllcC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9IHJlcS0+ZHdfYWxpZ25fYnVmOworCQkJCWVwLT5kd2NfZXAueGZlcl9idWZmID0gcmVxLT5kd19hbGlnbl9idWY7CisJCQl9IGVsc2UgeworCQkJCWVwLT5kd2NfZXAuZG1hX2FkZHIgPSByZXEtPmRtYTsKKwkJCQllcC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9IHJlcS0+YnVmOworCQkJCWVwLT5kd2NfZXAueGZlcl9idWZmID0gcmVxLT5idWY7CisJCQl9CisJCQllcC0+ZHdjX2VwLnNlbnRfemxwID0gMDsKKwkJCWVwLT5kd2NfZXAudG90YWxfbGVuID0gcmVxLT5sZW5ndGg7CisJCQllcC0+ZHdjX2VwLnhmZXJfbGVuID0gMDsKKwkJCWVwLT5kd2NfZXAueGZlcl9jb3VudCA9IDA7CisKKwkJCWVwLT5kd2NfZXAubWF4eGZlciA9IG1heF90cmFuc2ZlcjsKKwkJCWlmIChHRVRfQ09SRV9JRihlcC0+cGNkKS0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCQkJdWludDMyX3Qgb3V0X21heF94ZmVyID0gRERNQV9NQVhfVFJBTlNGRVJfU0laRQorCQkJCSAgICAtIChERE1BX01BWF9UUkFOU0ZFUl9TSVpFICUgNCk7CisJCQkJaWYgKGVwLT5kd2NfZXAuaXNfaW4pIHsKKwkJCQkJaWYgKGVwLT5kd2NfZXAubWF4eGZlciA+CisJCQkJCSAgICBERE1BX01BWF9UUkFOU0ZFUl9TSVpFKSB7CisJCQkJCQllcC0+ZHdjX2VwLm1heHhmZXIgPQorCQkJCQkJICAgIERETUFfTUFYX1RSQU5TRkVSX1NJWkU7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoZXAtPmR3Y19lcC5tYXh4ZmVyID4gb3V0X21heF94ZmVyKSB7CisJCQkJCQllcC0+ZHdjX2VwLm1heHhmZXIgPQorCQkJCQkJICAgIG91dF9tYXhfeGZlcjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChlcC0+ZHdjX2VwLm1heHhmZXIgPCBlcC0+ZHdjX2VwLnRvdGFsX2xlbikgeworCQkJCWVwLT5kd2NfZXAubWF4eGZlciAtPQorCQkJCSAgICAoZXAtPmR3Y19lcC5tYXh4ZmVyICUgZXAtPmR3Y19lcC5tYXhwYWNrZXQpOworCQkJfQorCQkJaWYgKHJlcS0+c2VudF96bHApIHsKKwkJCQlpZiAoKGVwLT5kd2NfZXAudG90YWxfbGVuICUKKwkJCQkgICAgIGVwLT5kd2NfZXAubWF4cGFja2V0ID09IDApCisJCQkJICAgICYmIChlcC0+ZHdjX2VwLnRvdGFsX2xlbiAhPSAwKSkgeworCQkJCQllcC0+ZHdjX2VwLnNlbnRfemxwID0gMTsKKwkJCQl9CisKKwkJCX0KKyNpZmRlZiBEV0NfVVRFX0NGSQorCQl9CisjZW5kaWYKKwkJZHdjX290Z19lcF9zdGFydF90cmFuc2ZlcihHRVRfQ09SRV9JRihlcC0+cGNkKSwgJmVwLT5kd2NfZXApOworCX0gZWxzZSBpZiAoZXAtPmR3Y19lcC50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCURXQ19QUklOVEYoIlRoZXJlIGFyZSBubyBtb3JlIElTT0MgcmVxdWVzdHMgXG4iKTsKKwkJZXAtPmR3Y19lcC5mcmFtZV9udW0gPSAweEZGRkZGRkZGOworCX0KK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFNPRiBJbnRlcnJ1cHRzLiBBdCB0aGlzIHRpbWUgdGhlIFNPRgorICogSW50ZXJydXB0IGlzIGRpc2FibGVkLgorICovCitpbnQzMl90IGR3Y19vdGdfcGNkX2hhbmRsZV9zb2ZfaW50cihkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKworCWdpbnRzdHNfZGF0YV90IGdpbnRzdHM7CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAiU09GXG4iKTsKKworCS8qIENsZWFyIGludGVycnVwdCAqLworCWdpbnRzdHMuZDMyID0gMDsKKwlnaW50c3RzLmIuc29maW50ciA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzLCBnaW50c3RzLmQzMik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIFJ4IFN0YXR1cyBRdWV1ZSBMZXZlbCBJbnRlcnJ1cHQsIHdoaWNoCisgKiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGxlYXN0IG9uZSBwYWNrZXQgaW4gdGhlIFJ4IEZJRk8uICBUaGUKKyAqIHBhY2tldHMgYXJlIG1vdmVkIGZyb20gdGhlIEZJRk8gdG8gbWVtb3J5LCB3aGVyZSB0aGV5IHdpbGwgYmUKKyAqIHByb2Nlc3NlZCB3aGVuIHRoZSBFbmRwb2ludCBJbnRlcnJ1cHQgUmVnaXN0ZXIgaW5kaWNhdGVzIFRyYW5zZmVyCisgKiBDb21wbGV0ZSBvciBTRVRVUCBQaGFzZSBEb25lLgorICoKKyAqIFJlcGVhdCB0aGUgZm9sbG93aW5nIHVudGlsIHRoZSBSeCBTdGF0dXMgUXVldWUgaXMgZW1wdHk6CisgKgkgLSMgUmVhZCB0aGUgUmVjZWl2ZSBTdGF0dXMgUG9wIFJlZ2lzdGVyIChHUlhTVFNQKSB0byBnZXQgUGFja2V0CisgKgkJaW5mbworICoJIC0jIElmIFJlY2VpdmUgRklGTyBpcyBlbXB0eSB0aGVuIHNraXAgdG8gc3RlcCBDbGVhciB0aGUgaW50ZXJydXB0CisgKgkJYW5kIGV4aXQKKyAqCSAtIyBJZiBTRVRVUCBQYWNrZXQgY2FsbCBkd2Nfb3RnX3JlYWRfc2V0dXBfcGFja2V0IHRvIGNvcHkgdGhlCisgKgkJU0VUVVAgZGF0YSB0byB0aGUgYnVmZmVyCisgKgkgLSMgSWYgT1VUIERhdGEgUGFja2V0IGNhbGwgZHdjX290Z19yZWFkX3BhY2tldCB0byBjb3B5IHRoZSBkYXRhCisgKgkJdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICovCitpbnQzMl90IGR3Y19vdGdfcGNkX2hhbmRsZV9yeF9zdGF0dXNfcV9sZXZlbF9pbnRyKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCWR3Y19vdGdfY29yZV9nbG9iYWxfcmVnc190ICpnbG9iYWxfcmVncyA9IGNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3M7CisJZ2ludG1za19kYXRhX3QgZ2ludG1hc2sgPSB7LmQzMiA9IDAgfTsKKwlkZXZpY2VfZ3J4c3RzX2RhdGFfdCBzdGF0dXM7CisJZHdjX290Z19wY2RfZXBfdCAqZXA7CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKyNpZmRlZiBERUJVRworCXN0YXRpYyBjaGFyICpkcGlkX3N0cltdID0geyAiRDAiLCAiRDIiLCAiRDEiLCAiTURBVEEiIH07CisjZW5kaWYKKworCS8vRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcyglcClcbiIsIF9fZnVuY19fLCBfcGNkKTsKKwkvKiBEaXNhYmxlIHRoZSBSeCBTdGF0dXMgUXVldWUgTGV2ZWwgaW50ZXJydXB0ICovCisJZ2ludG1hc2suYi5yeHN0c3FsdmwgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrLCBnaW50bWFzay5kMzIsIDApOworCisJLyogR2V0IHRoZSBTdGF0dXMgZnJvbSB0aGUgdG9wIG9mIHRoZSBGSUZPICovCisJc3RhdHVzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z3J4c3RzcCk7CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAiRVA6JWQgQkNudDolZCBEUElEOiVzICIKKwkJICAgICJwa3RzdHM6JXggRnJhbWU6JWQoMHglMHgpXG4iLAorCQkgICAgc3RhdHVzLmIuZXBudW0sIHN0YXR1cy5iLmJjbnQsCisJCSAgICBkcGlkX3N0cltzdGF0dXMuYi5kcGlkXSwKKwkJICAgIHN0YXR1cy5iLnBrdHN0cywgc3RhdHVzLmIuZm4sIHN0YXR1cy5iLmZuKTsKKwkvKiBHZXQgcG9pbnRlciB0byBFUCBzdHJ1Y3R1cmUgKi8KKwllcCA9IGdldF9vdXRfZXAocGNkLCBzdGF0dXMuYi5lcG51bSk7CisKKwlzd2l0Y2ggKHN0YXR1cy5iLnBrdHN0cykgeworCWNhc2UgRFdDX0RTVFNfR09VVF9OQUs6CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiR2xvYmFsIE9VVCBOQUtcbiIpOworCQlicmVhazsKKwljYXNlIERXQ19TVFNfREFUQV9VUERUOgorCQlEV0NfREVCVUdQTChEQkdfUENEViwgIk9VVCBEYXRhIFBhY2tldFxuIik7CisJCWlmIChzdGF0dXMuYi5iY250ICYmIGVwLT5kd2NfZXAueGZlcl9idWZmKSB7CisJCQkvKiogQHRvZG8gTkdTIENoZWNrIGZvciBidWZmZXIgb3ZlcmZsb3c/ICovCisJCQlkd2Nfb3RnX3JlYWRfcGFja2V0KGNvcmVfaWYsCisJCQkJCSAgICBlcC0+ZHdjX2VwLnhmZXJfYnVmZiwKKwkJCQkJICAgIHN0YXR1cy5iLmJjbnQpOworCQkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ICs9IHN0YXR1cy5iLmJjbnQ7CisJCQllcC0+ZHdjX2VwLnhmZXJfYnVmZiArPSBzdGF0dXMuYi5iY250OworCQl9CisJCWJyZWFrOworCWNhc2UgRFdDX1NUU19YRkVSX0NPTVA6CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiT1VUIENvbXBsZXRlXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBEV0NfRFNUU19TRVRVUF9DT01QOgorI2lmZGVmIERFQlVHX0VQMAorCQlEV0NfREVCVUdQTChEQkdfUENEViwgIlNldHVwIENvbXBsZXRlXG4iKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIERXQ19EU1RTX1NFVFVQX1VQRFQ6CisJCWR3Y19vdGdfcmVhZF9zZXR1cF9wYWNrZXQoY29yZV9pZiwgcGNkLT5zZXR1cF9wa3QtPmQzMik7CisjaWZkZWYgREVCVUdfRVAwCisJCURXQ19ERUJVR1BMKERCR19QQ0QsCisJCQkgICAgIlNFVFVQIFBLVDogJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlMDR4XG4iLAorCQkJICAgIHBjZC0+c2V0dXBfcGt0LT5yZXEuYm1SZXF1ZXN0VHlwZSwKKwkJCSAgICBwY2QtPnNldHVwX3BrdC0+cmVxLmJSZXF1ZXN0LAorCQkJICAgIFVHRVRXKHBjZC0+c2V0dXBfcGt0LT5yZXEud1ZhbHVlKSwKKwkJCSAgICBVR0VUVyhwY2QtPnNldHVwX3BrdC0+cmVxLndJbmRleCksCisJCQkgICAgVUdFVFcocGNkLT5zZXR1cF9wa3QtPnJlcS53TGVuZ3RoKSk7CisjZW5kaWYKKwkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ICs9IHN0YXR1cy5iLmJjbnQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiSW52YWxpZCBQYWNrZXQgU3RhdHVzICgweCUweClcbiIsCisJCQkgICAgc3RhdHVzLmIucGt0c3RzKTsKKwkJYnJlYWs7CisJfQorCisJLyogRW5hYmxlIHRoZSBSeCBTdGF0dXMgUXVldWUgTGV2ZWwgaW50ZXJydXB0ICovCisJRFdDX01PRElGWV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIDAsIGdpbnRtYXNrLmQzMik7CisJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJZ2ludHN0cy5kMzIgPSAwOworCWdpbnRzdHMuYi5yeHN0c3FsdmwgPSAxOworCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIGdpbnRzdHMuZDMyKTsKKworCS8vRFdDX0RFQlVHUEwoREJHX1BDRFYsICJFWElUOiAlc1xuIiwgX19mdW5jX18pOworCXJldHVybiAxOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gZXhhbWluZXMgdGhlIERldmljZSBJTiBUb2tlbiBMZWFybmluZyBRdWV1ZSB0bworICogZGV0ZXJtaW5lIHRoZSBFUCBudW1iZXIgb2YgdGhlIGxhc3QgSU4gdG9rZW4gcmVjZWl2ZWQuICBUaGlzCisgKiBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgdGhlIE1hc3MgU3RvcmFnZSBkZXZpY2Ugd2hlcmUgdGhlcmUgYXJlIG9ubHkKKyAqIDIgSU4gRVBzIChDb250cm9sLUlOIGFuZCBCVUxLLUlOKS4KKyAqCisgKiBUaGUgRVAgbnVtYmVycyBmb3IgdGhlIGZpcnN0IHNpeCBJTiBUb2tlbnMgYXJlIGluIERUS05RUjEgYW5kIHRoZXJlCisgKiBhcmUgOCBFUCBOdW1iZXJzIGluIGVhY2ggb2YgdGhlIG90aGVyIHBvc3NpYmxlIERUS05RIFJlZ2lzdGVycy4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGdldF9lcF9vZl9sYXN0X2luX3Rva2VuKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlkd2Nfb3RnX2RldmljZV9nbG9iYWxfcmVnc190ICpkZXZfZ2xvYmFsX3JlZ3MgPQorCSAgICBjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVnczsKKwljb25zdCB1aW50MzJfdCBUT0tFTl9RX0RFUFRIID0gY29yZV9pZi0+aHdjZmcyLmIuZGV2X3Rva2VuX3FfZGVwdGg7CisJLyogTnVtYmVyIG9mIFRva2VuIFF1ZXVlIFJlZ2lzdGVycyAqLworCWNvbnN0IGludCBEVEtOUV9SRUdfQ05UID0gKFRPS0VOX1FfREVQVEggKyA3KSAvIDg7CisJZHRrbnExX2RhdGFfdCBkdGtucXIxOworCXVpbnQzMl90IGluX3Rrbl9lcG51bXNbNF07CisJaW50IG5keCA9IDA7CisJaW50IGkgPSAwOworCXZvbGF0aWxlIHVpbnQzMl90ICphZGRyID0gJmRldl9nbG9iYWxfcmVncy0+ZHRrbnFyMTsKKwlpbnQgZXBudW0gPSAwOworCisJLy9EV0NfREVCVUdQTChEQkdfUENELCJkZXZfdG9rZW5fcV9kZXB0aD0lZFxuIixUT0tFTl9RX0RFUFRIKTsKKworCS8qIFJlYWQgdGhlIERUS05RIFJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBEVEtOUV9SRUdfQ05UOyBpKyspIHsKKwkJaW5fdGtuX2VwbnVtc1tpXSA9IERXQ19SRUFEX1JFRzMyKGFkZHIpOworCQlEV0NfREVCVUdQTChEQkdfUENEViwgIkRUS05RUiVkPTB4JTA4eFxuIiwgaSArIDEsCisJCQkgICAgaW5fdGtuX2VwbnVtc1tpXSk7CisJCWlmIChhZGRyID09ICZkZXZfZ2xvYmFsX3JlZ3MtPmR2YnVzZGlzKSB7CisJCQlhZGRyID0gJmRldl9nbG9iYWxfcmVncy0+ZHRrbnFyM19kdGhyY3RsOworCQl9IGVsc2UgeworCQkJKythZGRyOworCQl9CisKKwl9CisKKwkvKiBDb3B5IHRoZSBEVEtOUVIxIGRhdGEgdG8gdGhlIGJpdCBmaWVsZC4gKi8KKwlkdGtucXIxLmQzMiA9IGluX3Rrbl9lcG51bXNbMF07CisJLyogR2V0IHRoZSBFUCBudW1iZXJzICovCisJaW5fdGtuX2VwbnVtc1swXSA9IGR0a25xcjEuYi5lcG51bXMwXzU7CisJbmR4ID0gZHRrbnFyMS5iLmludGtud3B0ciAtIDE7CisKKwkvL0RXQ19ERUJVR1BMKERCR19QQ0RWLCJuZHg9JWRcbiIsbmR4KTsKKwlpZiAobmR4ID09IC0xKSB7CisJCS8qKiBAdG9kbyBGaW5kIGEgc2ltcGxlciB3YXkgdG8gY2FsY3VsYXRlIHRoZSBtYXgKKwkJICogcXVldWUgcG9zaXRpb24uKi8KKwkJaW50IGNudCA9IFRPS0VOX1FfREVQVEg7CisJCWlmIChUT0tFTl9RX0RFUFRIIDw9IDYpIHsKKwkJCWNudCA9IFRPS0VOX1FfREVQVEggLSAxOworCQl9IGVsc2UgaWYgKFRPS0VOX1FfREVQVEggPD0gMTQpIHsKKwkJCWNudCA9IFRPS0VOX1FfREVQVEggLSA3OworCQl9IGVsc2UgaWYgKFRPS0VOX1FfREVQVEggPD0gMjIpIHsKKwkJCWNudCA9IFRPS0VOX1FfREVQVEggLSAxNTsKKwkJfSBlbHNlIHsKKwkJCWNudCA9IFRPS0VOX1FfREVQVEggLSAyMzsKKwkJfQorCQllcG51bSA9IChpbl90a25fZXBudW1zW0RUS05RX1JFR19DTlQgLSAxXSA+PiAoY250ICogNCkpICYgMHhGOworCX0gZWxzZSB7CisJCWlmIChuZHggPD0gNSkgeworCQkJZXBudW0gPSAoaW5fdGtuX2VwbnVtc1swXSA+PiAobmR4ICogNCkpICYgMHhGOworCQl9IGVsc2UgaWYgKG5keCA8PSAxMykgeworCQkJbmR4IC09IDY7CisJCQllcG51bSA9IChpbl90a25fZXBudW1zWzFdID4+IChuZHggKiA0KSkgJiAweEY7CisJCX0gZWxzZSBpZiAobmR4IDw9IDIxKSB7CisJCQluZHggLT0gMTQ7CisJCQllcG51bSA9IChpbl90a25fZXBudW1zWzJdID4+IChuZHggKiA0KSkgJiAweEY7CisJCX0gZWxzZSBpZiAobmR4IDw9IDI5KSB7CisJCQluZHggLT0gMjI7CisJCQllcG51bSA9IChpbl90a25fZXBudW1zWzNdID4+IChuZHggKiA0KSkgJiAweEY7CisJCX0KKwl9CisJLy9EV0NfREVCVUdQTChEQkdfUENELCJlcG51bT0lZFxuIixlcG51bSk7CisJcmV0dXJuIGVwbnVtOworfQorCisvKioKKyAqIFRoaXMgaW50ZXJydXB0IG9jY3VycyB3aGVuIHRoZSBub24tcGVyaW9kaWMgVHggRklGTyBpcyBoYWxmLWVtcHR5LgorICogVGhlIGFjdGl2ZSByZXF1ZXN0IGlzIGNoZWNrZWQgZm9yIHRoZSBuZXh0IHBhY2tldCB0byBiZSBsb2FkZWQgaW50bworICogdGhlIG5vbi1wZXJpb2RpYyBUeCBGSUZPLgorICovCitpbnQzMl90IGR3Y19vdGdfcGNkX2hhbmRsZV9ucF90eF9maWZvX2VtcHR5X2ludHIoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzID0gY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwlkd2Nfb3RnX2Rldl9pbl9lcF9yZWdzX3QgKmVwX3JlZ3M7CisJZ25wdHhzdHNfZGF0YV90IHR4c3RhdHVzID0gey5kMzIgPSAwIH07CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKworCWludCBlcG51bSA9IDA7CisJZHdjX290Z19wY2RfZXBfdCAqZXAgPSAwOworCXVpbnQzMl90IGxlbiA9IDA7CisJaW50IGR3b3JkczsKKworCS8qIEdldCB0aGUgZXBudW0gZnJvbSB0aGUgSU4gVG9rZW4gTGVhcm5pbmcgUXVldWUuICovCisJZXBudW0gPSBnZXRfZXBfb2ZfbGFzdF9pbl90b2tlbihjb3JlX2lmKTsKKwllcCA9IGdldF9pbl9lcChwY2QsIGVwbnVtKTsKKworCURXQ19ERUJVR1BMKERCR19QQ0QsICJOUCBUeEZpZm8gRW1wdHk6ICVkIFxuIiwgZXBudW0pOworCisJZXBfcmVncyA9IGNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tlcG51bV07CisKKwlsZW4gPSBlcC0+ZHdjX2VwLnhmZXJfbGVuIC0gZXAtPmR3Y19lcC54ZmVyX2NvdW50OworCWlmIChsZW4gPiBlcC0+ZHdjX2VwLm1heHBhY2tldCkgeworCQlsZW4gPSBlcC0+ZHdjX2VwLm1heHBhY2tldDsKKwl9CisJZHdvcmRzID0gKGxlbiArIDMpIC8gNDsKKworCS8qIFdoaWxlIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBxdWV1ZSBhbmQgc3BhY2UgaW4gdGhlIEZJRk8gYW5kCisJICogTW9yZSBkYXRhIHRvIHRyYW5mZXIsIFdyaXRlIHBhY2tldHMgdG8gdGhlIFR4IEZJRk8gKi8KKwl0eHN0YXR1cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmducHR4c3RzKTsKKwlEV0NfREVCVUdQTChEQkdfUENEViwgImI0IEdOUFRYU1RTPTB4JTA4eFxuIiwgdHhzdGF0dXMuZDMyKTsKKworCXdoaWxlICh0eHN0YXR1cy5iLm5wdHhxc3BjYXZhaWwgPiAwICYmCisJICAgICAgIHR4c3RhdHVzLmIubnB0eGZzcGNhdmFpbCA+IGR3b3JkcyAmJgorCSAgICAgICBlcC0+ZHdjX2VwLnhmZXJfY291bnQgPCBlcC0+ZHdjX2VwLnhmZXJfbGVuKSB7CisJCS8qIFdyaXRlIHRoZSBGSUZPICovCisJCWR3Y19vdGdfZXBfd3JpdGVfcGFja2V0KGNvcmVfaWYsICZlcC0+ZHdjX2VwLCAwKTsKKwkJbGVuID0gZXAtPmR3Y19lcC54ZmVyX2xlbiAtIGVwLT5kd2NfZXAueGZlcl9jb3VudDsKKworCQlpZiAobGVuID4gZXAtPmR3Y19lcC5tYXhwYWNrZXQpIHsKKwkJCWxlbiA9IGVwLT5kd2NfZXAubWF4cGFja2V0OworCQl9CisKKwkJZHdvcmRzID0gKGxlbiArIDMpIC8gNDsKKwkJdHhzdGF0dXMuZDMyID0gRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nbnB0eHN0cyk7CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiR05QVFhTVFM9MHglMDh4XG4iLCB0eHN0YXR1cy5kMzIpOworCX0KKworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiR05QVFhTVFM9MHglMDh4XG4iLAorCQkgICAgRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5nbnB0eHN0cykpOworCisJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJZ2ludHN0cy5kMzIgPSAwOworCWdpbnRzdHMuYi5ucHR4ZmVtcHR5ID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50c3RzLCBnaW50c3RzLmQzMik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRlZGljYXRlZCBUeCBGSUZPIEVtcHR5IGludGVycnVwdCBvY2N1cnMuCisgKiBUaGUgYWN0aXZlIHJlcXVlc3QgaXMgY2hlY2tlZCBmb3IgdGhlIG5leHQgcGFja2V0IHRvIGJlIGxvYWRlZCBpbnRvCisgKiBhcHJvcHJpYXRlIFR4IEZJRk8uCisgKi8KK3N0YXRpYyBpbnQzMl90IHdyaXRlX2VtcHR5X3R4X2ZpZm8oZHdjX290Z19wY2RfdCAqIHBjZCwgdWludDMyX3QgZXBudW0pCit7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCWR3Y19vdGdfZGV2X2lmX3QgKmRldl9pZiA9IGNvcmVfaWYtPmRldl9pZjsKKwlkd2Nfb3RnX2Rldl9pbl9lcF9yZWdzX3QgKmVwX3JlZ3M7CisJZHR4ZnN0c19kYXRhX3QgdHhzdGF0dXMgPSB7LmQzMiA9IDAgfTsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcCA9IDA7CisJdWludDMyX3QgbGVuID0gMDsKKwlpbnQgZHdvcmRzOworCisJZXAgPSBnZXRfaW5fZXAocGNkLCBlcG51bSk7CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAiRGVkaWNhdGVkIFR4RmlmbyBFbXB0eTogJWQgXG4iLCBlcG51bSk7CisKKwllcF9yZWdzID0gY29yZV9pZi0+ZGV2X2lmLT5pbl9lcF9yZWdzW2VwbnVtXTsKKworCWxlbiA9IGVwLT5kd2NfZXAueGZlcl9sZW4gLSBlcC0+ZHdjX2VwLnhmZXJfY291bnQ7CisKKwlpZiAobGVuID4gZXAtPmR3Y19lcC5tYXhwYWNrZXQpIHsKKwkJbGVuID0gZXAtPmR3Y19lcC5tYXhwYWNrZXQ7CisJfQorCisJZHdvcmRzID0gKGxlbiArIDMpIC8gNDsKKworCS8qIFdoaWxlIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBxdWV1ZSBhbmQgc3BhY2UgaW4gdGhlIEZJRk8gYW5kCisJICogTW9yZSBkYXRhIHRvIHRyYW5mZXIsIFdyaXRlIHBhY2tldHMgdG8gdGhlIFR4IEZJRk8gKi8KKwl0eHN0YXR1cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2VwbnVtXS0+ZHR4ZnN0cyk7CisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICJiNCBkdHhmc3RzWyVkXT0weCUwOHhcbiIsIGVwbnVtLCB0eHN0YXR1cy5kMzIpOworCisJd2hpbGUgKHR4c3RhdHVzLmIudHhmc3BjYXZhaWwgPiBkd29yZHMgJiYKKwkgICAgICAgZXAtPmR3Y19lcC54ZmVyX2NvdW50IDwgZXAtPmR3Y19lcC54ZmVyX2xlbiAmJgorCSAgICAgICBlcC0+ZHdjX2VwLnhmZXJfbGVuICE9IDApIHsKKwkJLyogV3JpdGUgdGhlIEZJRk8gKi8KKwkJZHdjX290Z19lcF93cml0ZV9wYWNrZXQoY29yZV9pZiwgJmVwLT5kd2NfZXAsIDApOworCisJCWxlbiA9IGVwLT5kd2NfZXAueGZlcl9sZW4gLSBlcC0+ZHdjX2VwLnhmZXJfY291bnQ7CisJCWlmIChsZW4gPiBlcC0+ZHdjX2VwLm1heHBhY2tldCkgeworCQkJbGVuID0gZXAtPmR3Y19lcC5tYXhwYWNrZXQ7CisJCX0KKworCQlkd29yZHMgPSAobGVuICsgMykgLyA0OworCQl0eHN0YXR1cy5kMzIgPQorCQkgICAgRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tlcG51bV0tPmR0eGZzdHMpOworCQlEV0NfREVCVUdQTChEQkdfUENEViwgImR0eGZzdHNbJWRdPTB4JTA4eFxuIiwgZXBudW0sCisJCQkgICAgdHhzdGF0dXMuZDMyKTsKKwl9CisKKwlEV0NfREVCVUdQTChEQkdfUENEViwgImI0IGR0eGZzdHNbJWRdPTB4JTA4eFxuIiwgZXBudW0sCisJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2VwbnVtXS0+ZHR4ZnN0cykpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgRGV2aWNlIGlzIGRpc2Nvbm5lY3RlZC4gSXQgc3RvcHMKKyAqIGFueSBhY3RpdmUgcmVxdWVzdHMgYW5kIGluZm9ybXMgdGhlIEdhZGdldCBkcml2ZXIgb2YgdGhlCisgKiBkaXNjb25uZWN0LgorICovCit2b2lkIGR3Y19vdGdfcGNkX3N0b3AoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlpbnQgaSwgbnVtX2luX2VwcywgbnVtX291dF9lcHM7CisJZHdjX290Z19wY2RfZXBfdCAqZXA7CisKKwlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKworCURXQ19TUElOTE9DSyhwY2QtPmxvY2spOworCisJbnVtX2luX2VwcyA9IEdFVF9DT1JFX0lGKHBjZCktPmRldl9pZi0+bnVtX2luX2VwczsKKwludW1fb3V0X2VwcyA9IEdFVF9DT1JFX0lGKHBjZCktPmRldl9pZi0+bnVtX291dF9lcHM7CisKKwlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzKCkgXG4iLCBfX2Z1bmNfXyk7CisJLyogZG9uJ3QgZGlzY29ubmVjdCBkcml2ZXJzIG1vcmUgdGhhbiBvbmNlICovCisJaWYgKHBjZC0+ZXAwc3RhdGUgPT0gRVAwX0RJU0NPTk5FQ1QpIHsKKwkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzKCkgQWxyZWFkeSBEaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJRFdDX1NQSU5VTkxPQ0socGNkLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlwY2QtPmVwMHN0YXRlID0gRVAwX0RJU0NPTk5FQ1Q7CisKKwkvKiBSZXNldCB0aGUgT1RHIHN0YXRlLiAqLworCWR3Y19vdGdfcGNkX3VwZGF0ZV9vdGcocGNkLCAxKTsKKworCS8qIERpc2FibGUgdGhlIE5QIFR4IEZpZm8gRW1wdHkgSW50ZXJydXB0LiAqLworCWludHJfbWFzay5iLm5wdHhmZW1wdHkgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJkdFVF9DT1JFX0lGKHBjZCktPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssCisJCQkgaW50cl9tYXNrLmQzMiwgMCk7CisKKwkvKiBGbHVzaCB0aGUgRklGT3MgKi8KKwkvKipAdG9kbyBOR1MgRmx1c2ggUGVyaW9kaWMgRklGT3MgKi8KKwlkd2Nfb3RnX2ZsdXNoX3R4X2ZpZm8oR0VUX0NPUkVfSUYocGNkKSwgMHgxMCk7CisJZHdjX290Z19mbHVzaF9yeF9maWZvKEdFVF9DT1JFX0lGKHBjZCkpOworCisJLyogcHJldmVudCBuZXcgcmVxdWVzdCBzdWJtaXNzaW9ucywga2lsbCBhbnkgb3V0c3RhbmRpbmcgcmVxdWVzdHMgICovCisJZXAgPSAmcGNkLT5lcDA7CisJZHdjX290Z19yZXF1ZXN0X251a2UoZXApOworCS8qIHByZXZlbnQgbmV3IHJlcXVlc3Qgc3VibWlzc2lvbnMsIGtpbGwgYW55IG91dHN0YW5kaW5nIHJlcXVlc3RzICAqLworCWZvciAoaSA9IDA7IGkgPCBudW1faW5fZXBzOyBpKyspIHsKKwkJZHdjX290Z19wY2RfZXBfdCAqZXAgPSAmcGNkLT5pbl9lcFtpXTsKKwkJZHdjX290Z19yZXF1ZXN0X251a2UoZXApOworCX0KKwkvKiBwcmV2ZW50IG5ldyByZXF1ZXN0IHN1Ym1pc3Npb25zLCBraWxsIGFueSBvdXRzdGFuZGluZyByZXF1ZXN0cyAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX291dF9lcHM7IGkrKykgeworCQlkd2Nfb3RnX3BjZF9lcF90ICplcCA9ICZwY2QtPm91dF9lcFtpXTsKKwkJZHdjX290Z19yZXF1ZXN0X251a2UoZXApOworCX0KKworCS8qIHJlcG9ydCBkaXNjb25uZWN0OyB0aGUgZHJpdmVyIGlzIGFscmVhZHkgcXVpZXNjZWQgKi8KKwlpZiAocGNkLT5mb3BzLT5kaXNjb25uZWN0KSB7CisJCURXQ19TUElOVU5MT0NLKHBjZC0+bG9jayk7CisJCXBjZC0+Zm9wcy0+ZGlzY29ubmVjdChwY2QpOworCQlEV0NfU1BJTkxPQ0socGNkLT5sb2NrKTsKKwl9CisJRFdDX1NQSU5VTkxPQ0socGNkLT5sb2NrKTsKK30KKworLyoqCisgKiBUaGlzIGludGVycnVwdCBpbmRpY2F0ZXMgdGhhdCAuLi4KKyAqLworaW50MzJfdCBkd2Nfb3RnX3BjZF9oYW5kbGVfaTJjX2ludHIoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKwlnaW50c3RzX2RhdGFfdCBnaW50c3RzOworCisJRFdDX1BSSU5URigiSU5URVJSVVBUIEhhbmRsZXIgbm90IGltcGxlbWVudGVkIGZvciAlc1xuIiwgImkyY2ludHIiKTsKKwlpbnRyX21hc2suYi5pMmNpbnRyID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLAorCQkJIGludHJfbWFzay5kMzIsIDApOworCisJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJZ2ludHN0cy5kMzIgPSAwOworCWdpbnRzdHMuYi5pMmNpbnRyID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJkdFVF9DT1JFX0lGKHBjZCktPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsCisJCQlnaW50c3RzLmQzMik7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogVGhpcyBpbnRlcnJ1cHQgaW5kaWNhdGVzIHRoYXQgLi4uCisgKi8KK2ludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2Vhcmx5X3N1c3BlbmRfaW50cihkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCWdpbnRzdHNfZGF0YV90IGdpbnRzdHM7CisjaWYgZGVmaW5lZChWRVJCT1NFKQorCURXQ19QUklOVEYoIkVhcmx5IFN1c3BlbmQgRGV0ZWN0ZWRcbiIpOworI2VuZGlmCisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwlnaW50c3RzLmQzMiA9IDA7CisJZ2ludHN0cy5iLmVybHlzdXNwZW5kID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJkdFVF9DT1JFX0lGKHBjZCktPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsCisJCQlnaW50c3RzLmQzMik7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIEVQTyB0byByZWNlaXZlIFNFVFVQIHBhY2tldHMuCisgKgorICogQHRvZG8gTkdTOiBVcGRhdGUgdGhlIGNvbW1lbnRzIGZyb20gdGhlIEhXIEZTLgorICoKKyAqCS0jIFByb2dyYW0gdGhlIGZvbGxvd2luZyBmaWVsZHMgaW4gdGhlIGVuZHBvaW50IHNwZWNpZmljIHJlZ2lzdGVycworICoJZm9yIENvbnRyb2wgT1VUIEVQIDAsIGluIG9yZGVyIHRvIHJlY2VpdmUgYSBzZXR1cCBwYWNrZXQKKyAqCS0gRE9FUFRTSVowLlBhY2tldCBDb3VudCA9IDMgKFRvIHJlY2VpdmUgdXAgdG8gMyBiYWNrIHRvIGJhY2sKKyAqCSAgc2V0dXAgcGFja2V0cykKKyAqCS0gRE9FUFRTSVpFMC5UcmFuc2ZlciBTaXplID0gMjQgQnl0ZXMgKFRvIHJlY2VpdmUgdXAgdG8gMyBiYWNrCisgKgkgIHRvIGJhY2sgc2V0dXAgcGFja2V0cykKKyAqCQktIEluIERNQSBtb2RlLCBET0VQRE1BMCBSZWdpc3RlciB3aXRoIGEgbWVtb3J5IGFkZHJlc3MgdG8KKyAqCQkgIHN0b3JlIGFueSBzZXR1cCBwYWNrZXRzIHJlY2VpdmVkCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gcGNkCSAgUHJvZ3JhbW1pbmcgdmlldyBvZiB0aGUgUENELgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZXAwX291dF9zdGFydChkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJIGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJZHdjX290Z19kZXZfaWZfdCAqZGV2X2lmID0gY29yZV9pZi0+ZGV2X2lmOworCWRlcHRzaXowX2RhdGFfdCBkb2VwdHNpemUwID0gey5kMzIgPSAwIH07CisJZHdjX290Z19kZXZfZG1hX2Rlc2NfdCAqZG1hX2Rlc2M7CisJZGVwY3RsX2RhdGFfdCBkb2VwY3RsID0gey5kMzIgPSAwIH07CisKKyNpZmRlZiBWRVJCT1NFCisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcygpIGRvZXBjdGwwPSUweFxuIiwgX19mdW5jX18sCisJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5vdXRfZXBfcmVnc1swXS0+ZG9lcGN0bCkpOworI2VuZGlmCisKKwlkb2VwdHNpemUwLmIuc3VwY250ID0gMzsKKwlkb2VwdHNpemUwLmIucGt0Y250ID0gMTsKKwlkb2VwdHNpemUwLmIueGZlcnNpemUgPSA4ICogMzsKKworCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCWlmICghY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCQkvKiogcHV0IGhlcmUgYXMgZm9yIEhlcm1lcyBtb2RlIGRlcHRpc3ogcmVnaXN0ZXIgc2hvdWxkIG5vdCBiZSB3cml0dGVuICovCisJCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+b3V0X2VwX3JlZ3NbMF0tPmRvZXB0c2l6LAorCQkJCQlkb2VwdHNpemUwLmQzMik7CisKKwkJCS8qKiBAdG9kbyBkbWEgbmVlZHMgdG8gaGFuZGxlIG11bHRpcGxlIHNldHVwIHBhY2tldHMgKHVwIHRvIDMpICovCisJCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+b3V0X2VwX3JlZ3NbMF0tPmRvZXBkbWEsCisJCQkJCXBjZC0+c2V0dXBfcGt0X2RtYV9oYW5kbGUpOworCQl9IGVsc2UgeworCQkJZGV2X2lmLT5zZXR1cF9kZXNjX2luZGV4ID0KKwkJCSAgICAoZGV2X2lmLT5zZXR1cF9kZXNjX2luZGV4ICsgMSkgJiAxOworCQkJZG1hX2Rlc2MgPQorCQkJICAgIGRldl9pZi0+c2V0dXBfZGVzY19hZGRyW2Rldl9pZi0+c2V0dXBfZGVzY19pbmRleF07CisKKwkJCS8qKiBETUEgRGVzY3JpcHRvciBTZXR1cCAqLworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmJzID0gQlNfSE9TVF9CVVNZOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmwgPSAxOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5iLmlvYyA9IDE7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuYnl0ZXMgPSBwY2QtPmVwMC5kd2NfZXAubWF4cGFja2V0OworCQkJZG1hX2Rlc2MtPmJ1ZiA9IHBjZC0+c2V0dXBfcGt0X2RtYV9oYW5kbGU7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmIuc3RzID0gMDsKKwkJCWRtYV9kZXNjLT5zdGF0dXMuYi5icyA9IEJTX0hPU1RfUkVBRFk7CisKKwkJCS8qKiBET0VQRE1BMCBSZWdpc3RlciB3cml0ZSAqLworCQkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPm91dF9lcF9yZWdzWzBdLT5kb2VwZG1hLAorCQkJCQlkZXZfaWYtPgorCQkJCQlkbWFfc2V0dXBfZGVzY19hZGRyCisJCQkJCVtkZXZfaWYtPnNldHVwX2Rlc2NfaW5kZXhdKTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyoqIHB1dCBoZXJlIGFzIGZvciBIZXJtZXMgbW9kZSBkZXB0aXN6IHJlZ2lzdGVyIHNob3VsZCBub3QgYmUgd3JpdHRlbiAqLworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+b3V0X2VwX3JlZ3NbMF0tPmRvZXB0c2l6LAorCQkJCWRvZXB0c2l6ZTAuZDMyKTsKKwl9CisKKwkvKiogRE9FUENUTDAgUmVnaXN0ZXIgd3JpdGUgKi8KKwlkb2VwY3RsLmIuZXBlbmEgPSAxOworCWRvZXBjdGwuYi5jbmFrID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+b3V0X2VwX3JlZ3NbMF0tPmRvZXBjdGwsIGRvZXBjdGwuZDMyKTsKKworI2lmZGVmIFZFUkJPU0UKKwlEV0NfREVCVUdQTChEQkdfUENEViwgImRvZXBjdGwwPSUweFxuIiwKKwkJICAgIERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPm91dF9lcF9yZWdzWzBdLT5kb2VwY3RsKSk7CisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICJkaWVwY3RsMD0lMHhcbiIsCisJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzWzBdLT5kaWVwY3RsKSk7CisjZW5kaWYKK30KKworLyoqCisgKiBUaGlzIGludGVycnVwdCBvY2N1cnMgd2hlbiBhIFVTQiBSZXNldCBpcyBkZXRlY3RlZC4gV2hlbiB0aGUgVVNCCisgKiBSZXNldCBJbnRlcnJ1cHQgb2NjdXJzIHRoZSBkZXZpY2Ugc3RhdGUgaXMgc2V0IHRvIERFRkFVTFQgYW5kIHRoZQorICogRVAwIHN0YXRlIGlzIHNldCB0byBJRExFLgorICoJLSMJU2V0IHRoZSBOQUsgYml0IGZvciBhbGwgT1VUIGVuZHBvaW50cyAoRE9FUENUTG4uU05BSyA9IDEpCisgKgktIwlVbm1hc2sgdGhlIGZvbGxvd2luZyBpbnRlcnJ1cHQgYml0cworICoJCS0gREFJTlRNU0suSU5FUDAgPSAxIChDb250cm9sIDAgSU4gZW5kcG9pbnQpCisgKgktIERBSU5UTVNLLk9VVEVQMCA9IDEgKENvbnRyb2wgMCBPVVQgZW5kcG9pbnQpCisgKgktIERPRVBNU0suU0VUVVAgPSAxCisgKgktIERPRVBNU0suWGZlckNvbXBsID0gMQorICoJLSBESUVQTVNLLlhmZXJDb21wbCA9IDEKKyAqCS0gRElFUE1TSy5UaW1lT3V0ID0gMQorICoJLSMgUHJvZ3JhbSB0aGUgZm9sbG93aW5nIGZpZWxkcyBpbiB0aGUgZW5kcG9pbnQgc3BlY2lmaWMgcmVnaXN0ZXJzCisgKglmb3IgQ29udHJvbCBPVVQgRVAgMCwgaW4gb3JkZXIgdG8gcmVjZWl2ZSBhIHNldHVwIHBhY2tldAorICoJLSBET0VQVFNJWjAuUGFja2V0IENvdW50ID0gMyAoVG8gcmVjZWl2ZSB1cCB0byAzIGJhY2sgdG8gYmFjaworICoJICBzZXR1cCBwYWNrZXRzKQorICoJLSBET0VQVFNJWkUwLlRyYW5zZmVyIFNpemUgPSAyNCBCeXRlcyAoVG8gcmVjZWl2ZSB1cCB0byAzIGJhY2sKKyAqCSAgdG8gYmFjayBzZXR1cCBwYWNrZXRzKQorICoJCS0gSW4gRE1BIG1vZGUsIERPRVBETUEwIFJlZ2lzdGVyIHdpdGggYSBtZW1vcnkgYWRkcmVzcyB0bworICoJCSAgc3RvcmUgYW55IHNldHVwIHBhY2tldHMgcmVjZWl2ZWQKKyAqIEF0IHRoaXMgcG9pbnQsIGFsbCB0aGUgcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24sIGV4Y2VwdCBmb3IgZW5hYmxpbmcKKyAqIHRoZSBjb250cm9sIDAgT1VUIGVuZHBvaW50IGlzIGRvbmUsIGZvciByZWNlaXZpbmcgU0VUVVAgcGFja2V0cy4KKyAqLworaW50MzJfdCBkd2Nfb3RnX3BjZF9oYW5kbGVfdXNiX3Jlc2V0X2ludHIoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJZHdjX290Z19kZXZfaWZfdCAqZGV2X2lmID0gY29yZV9pZi0+ZGV2X2lmOworCWRlcGN0bF9kYXRhX3QgZG9lcGN0bCA9IHsuZDMyID0gMCB9OworCWRlcGN0bF9kYXRhX3QgZGllcGN0bCA9IHsuZDMyID0gMCB9OworCWRhaW50X2RhdGFfdCBkYWludG1zayA9IHsuZDMyID0gMCB9OworCWRvZXBtc2tfZGF0YV90IGRvZXBtc2sgPSB7LmQzMiA9IDAgfTsKKwlkaWVwbXNrX2RhdGFfdCBkaWVwbXNrID0gey5kMzIgPSAwIH07CisJZGNmZ19kYXRhX3QgZGNmZyA9IHsuZDMyID0gMCB9OworCWdyc3RjdGxfdCByZXNldGN0bCA9IHsuZDMyID0gMCB9OworCWRjdGxfZGF0YV90IGRjdGwgPSB7LmQzMiA9IDAgfTsKKwlpbnQgaSA9IDA7CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKwlwY2djY3RsX2RhdGFfdCBwb3dlciA9IHsuZDMyID0gMCB9OworCisJcG93ZXIuZDMyID0gRFdDX1JFQURfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCk7CisJaWYgKHBvd2VyLmIuc3RvcHBjbGspIHsKKwkJcG93ZXIuZDMyID0gMDsKKwkJcG93ZXIuYi5zdG9wcGNsayA9IDE7CisJCURXQ19NT0RJRllfUkVHMzIoY29yZV9pZi0+cGNnY2N0bCwgcG93ZXIuZDMyLCAwKTsKKworCQlwb3dlci5iLnB3cmNsbXAgPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKGNvcmVfaWYtPnBjZ2NjdGwsIHBvd2VyLmQzMiwgMCk7CisKKwkJcG93ZXIuYi5yc3RwZHdubW9kdWxlID0gMTsKKwkJRFdDX01PRElGWV9SRUczMihjb3JlX2lmLT5wY2djY3RsLCBwb3dlci5kMzIsIDApOworCX0KKworCWNvcmVfaWYtPmx4X3N0YXRlID0gRFdDX09UR19MMDsKKworCURXQ19QUklOVEYoIlVTQiBSRVNFVFxuIik7CisjaWZkZWYgRFdDX0VOX0lTT0MKKwlmb3IgKGkgPSAxOyBpIDwgMTY7ICsraSkgeworCQlkd2Nfb3RnX3BjZF9lcF90ICplcDsKKwkJZHdjX2VwX3QgKmR3Y19lcDsKKwkJZXAgPSBnZXRfaW5fZXAocGNkLCBpKTsKKwkJaWYgKGVwICE9IDApIHsKKwkJCWR3Y19lcCA9ICZlcC0+ZHdjX2VwOworCQkJZHdjX2VwLT5uZXh0X2ZyYW1lID0gMHhmZmZmZmZmZjsKKwkJfQorCX0KKyNlbmRpZiAvKiBEV0NfRU5fSVNPQyAqLworCisJLyogcmVzZXQgdGhlIEhOUCBzZXR0aW5ncyAqLworCWR3Y19vdGdfcGNkX3VwZGF0ZV9vdGcocGNkLCAxKTsKKworCS8qIENsZWFyIHRoZSBSZW1vdGUgV2FrZXVwIFNpZ25hbGxpbmcgKi8KKwlkY3RsLmIucm10d2t1cHNpZyA9IDE7CisJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjdGwsIGRjdGwuZDMyLCAwKTsKKworCS8qIFNldCBOQUsgZm9yIGFsbCBPVVQgRVBzICovCisJZG9lcGN0bC5iLnNuYWsgPSAxOworCWZvciAoaSA9IDA7IGkgPD0gZGV2X2lmLT5udW1fb3V0X2VwczsgaSsrKSB7CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5vdXRfZXBfcmVnc1tpXS0+ZG9lcGN0bCwgZG9lcGN0bC5kMzIpOworCX0KKworCS8qIEZsdXNoIHRoZSBOUCBUeCBGSUZPICovCisJZHdjX290Z19mbHVzaF90eF9maWZvKGNvcmVfaWYsIDB4MTApOworCS8qIEZsdXNoIHRoZSBMZWFybmluZyBRdWV1ZSAqLworCXJlc2V0Y3RsLmIuaW50a25xZmxzaCA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5ncnN0Y3RsLCByZXNldGN0bC5kMzIpOworCisJaWYgKCFjb3JlX2lmLT5jb3JlX3BhcmFtcy0+ZW5fbXVsdGlwbGVfdHhfZmlmbyAmJiBjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCWNvcmVfaWYtPnN0YXJ0X3ByZWRpY3QgPSAwOworCQlmb3IgKGkgPSAwOyBpPD0gY29yZV9pZi0+ZGV2X2lmLT5udW1faW5fZXBzOyArK2kpIHsKKwkJCWNvcmVfaWYtPm5leHRlcF9zZXFbaV0gPSAweGZmOwkvLyAweGZmIC0gRVAgbm90IGFjdGl2ZQorCQl9CisJCWNvcmVfaWYtPm5leHRlcF9zZXFbMF0gPSAwOwkKKwkJY29yZV9pZi0+Zmlyc3RfaW5fbmV4dGVwX3NlcSA9IDA7CisJCWRpZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1swXS0+ZGllcGN0bCk7CisJCWRpZXBjdGwuYi5uZXh0ZXAgPSAwOworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1swXS0+ZGllcGN0bCwgZGllcGN0bC5kMzIpOworCQkKKwkJLyogVXBkYXRlIElOIEVuZHBvaW50IE1pc21hdGNoIENvdW50IGJ5IGFjdGl2ZSBJTiBOUCBFUCBjb3VudCArIDEgKi8KKwkJZGNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcpOworCQlkY2ZnLmIuZXBtc2NudCA9IDI7CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcsIGRjZmcuZDMyKTsKKworCQlEV0NfREVCVUdQTChEQkdfUENEViwiJXMgZmlyc3RfaW5fbmV4dGVwX3NlcT0gJTJkOyBuZXh0ZXBfc2VxW106XG4iLCAKKwkJCV9fZnVuY19fLCBjb3JlX2lmLT5maXJzdF9pbl9uZXh0ZXBfc2VxKTsKKwkJZm9yIChpPTA7IGkgPD0gY29yZV9pZi0+ZGV2X2lmLT5udW1faW5fZXBzOyBpKyspIHsKKwkJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiJTJkXG4iLCBjb3JlX2lmLT5uZXh0ZXBfc2VxW2ldKTsKKwkJfQorCX0KKworCWlmIChjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQlkYWludG1zay5iLmluZXAwID0gMTsKKwkJZGFpbnRtc2suYi5vdXRlcDAgPSAxOworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kZWFjaGludG1zaywKKwkJCQlkYWludG1zay5kMzIpOworCisJCWRvZXBtc2suYi5zZXR1cCA9IDE7CisJCWRvZXBtc2suYi54ZmVyY29tcGwgPSAxOworCQlkb2VwbXNrLmIuYWhiZXJyID0gMTsKKwkJZG9lcG1zay5iLmVwZGlzYWJsZWQgPSAxOworCisJCWlmIChjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJCWRvZXBtc2suYi5zdHNwaHNlcmN2ZCA9IDE7CisJCQlkb2VwbXNrLmIuYm5hID0gMTsKKwkJfQorLyoJCQorCQlkb2VwbXNrLmIuYmFiYmxlID0gMTsKKwkJZG9lcG1zay5iLm55ZXQgPSAxOworCQkKKwkJaWYgKGNvcmVfaWYtPmRtYV9lbmFibGUpIHsKKwkJCWRvZXBtc2suYi5uYWsgPSAxOworCQl9CisqLworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kb2VwZWFjaGludG1za1swXSwKKwkJCQlkb2VwbXNrLmQzMik7CisKKwkJZGllcG1zay5iLnhmZXJjb21wbCA9IDE7CisJCWRpZXBtc2suYi50aW1lb3V0ID0gMTsKKwkJZGllcG1zay5iLmVwZGlzYWJsZWQgPSAxOworCQlkaWVwbXNrLmIuYWhiZXJyID0gMTsKKwkJZGllcG1zay5iLmludGtuZXBtaXMgPSAxOyAKKwkJaWYgKCFjb3JlX2lmLT5lbl9tdWx0aXBsZV90eF9maWZvICYmIGNvcmVfaWYtPmRtYV9lbmFibGUpCisJCQlkaWVwbXNrLmIuaW50a25lcG1pcyA9IDA7IAorCisvKgkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJZGllcG1zay5iLmJuYSA9IDE7CisJCX0KKyovCisvKgkJCisJCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQlkaWVwbXNrLmIubmFrID0gMTsKKwkJfQorKi8KKwkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGllcGVhY2hpbnRtc2tbMF0sCisJCQkJZGllcG1zay5kMzIpOworCX0gZWxzZSB7CisJCWRhaW50bXNrLmIuaW5lcDAgPSAxOworCQlkYWludG1zay5iLm91dGVwMCA9IDE7CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRhaW50bXNrLAorCQkJCWRhaW50bXNrLmQzMik7CisKKwkJZG9lcG1zay5iLnNldHVwID0gMTsKKwkJZG9lcG1zay5iLnhmZXJjb21wbCA9IDE7CisJCWRvZXBtc2suYi5haGJlcnIgPSAxOworCQlkb2VwbXNrLmIuZXBkaXNhYmxlZCA9IDE7CisKKwkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJZG9lcG1zay5iLnN0c3Boc2VyY3ZkID0gMTsKKwkJCWRvZXBtc2suYi5ibmEgPSAxOworCQl9CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRvZXBtc2ssIGRvZXBtc2suZDMyKTsKKworCQlkaWVwbXNrLmIueGZlcmNvbXBsID0gMTsKKwkJZGllcG1zay5iLnRpbWVvdXQgPSAxOworCQlkaWVwbXNrLmIuZXBkaXNhYmxlZCA9IDE7CisJCWRpZXBtc2suYi5haGJlcnIgPSAxOworCQlpZiAoIWNvcmVfaWYtPmVuX211bHRpcGxlX3R4X2ZpZm8gJiYgY29yZV9pZi0+ZG1hX2VuYWJsZSkKKwkJCWRpZXBtc2suYi5pbnRrbmVwbWlzID0gMDsgCisvKgorCQlpZiAoY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlKSB7CisJCQlkaWVwbXNrLmIuYm5hID0gMTsKKwkJfQorKi8KKworCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kaWVwbXNrLCBkaWVwbXNrLmQzMik7CisJfQorCisJLyogUmVzZXQgRGV2aWNlIEFkZHJlc3MgKi8KKwlkY2ZnLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGNmZyk7CisJZGNmZy5iLmRldmFkZHIgPSAwOworCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcsIGRjZmcuZDMyKTsKKworCS8qIHNldHVwIEVQMCB0byByZWNlaXZlIFNFVFVQIHBhY2tldHMgKi8KKwllcDBfb3V0X3N0YXJ0KGNvcmVfaWYsIHBjZCk7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwlnaW50c3RzLmQzMiA9IDA7CisJZ2ludHN0cy5iLnVzYnJlc2V0ID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIGdpbnRzdHMuZDMyKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIEdldCB0aGUgZGV2aWNlIHNwZWVkIGZyb20gdGhlIGRldmljZSBzdGF0dXMgcmVnaXN0ZXIgYW5kIGNvbnZlcnQgaXQKKyAqIHRvIFVTQiBzcGVlZCBjb25zdGFudC4KKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqLworc3RhdGljIGludCBnZXRfZGV2aWNlX3NwZWVkKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZikKK3sKKwlkc3RzX2RhdGFfdCBkc3RzOworCWludCBzcGVlZCA9IDA7CisJZHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRzdHMpOworCisJc3dpdGNoIChkc3RzLmIuZW51bXNwZCkgeworCWNhc2UgRFdDX0RTVFNfRU5VTVNQRF9IU19QSFlfMzBNSFpfT1JfNjBNSFo6CisJCXNwZWVkID0gVVNCX1NQRUVEX0hJR0g7CisJCWJyZWFrOworCWNhc2UgRFdDX0RTVFNfRU5VTVNQRF9GU19QSFlfMzBNSFpfT1JfNjBNSFo6CisJY2FzZSBEV0NfRFNUU19FTlVNU1BEX0ZTX1BIWV80OE1IWjoKKwkJc3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKKwkJYnJlYWs7CisKKwljYXNlIERXQ19EU1RTX0VOVU1TUERfTFNfUEhZXzZNSFo6CisJCXNwZWVkID0gVVNCX1NQRUVEX0xPVzsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNwZWVkOworfQorCisvKioKKyAqIFJlYWQgdGhlIGRldmljZSBzdGF0dXMgcmVnaXN0ZXIgYW5kIHNldCB0aGUgZGV2aWNlIHNwZWVkIGluIHRoZQorICogZGF0YSBzdHJ1Y3R1cmUuCisgKiBTZXQgdXAgRVAwIHRvIHJlY2VpdmUgU0VUVVAgcGFja2V0cyBieSBjYWxsaW5nIGR3Y19lcDBfYWN0aXZhdGUuCisgKi8KK2ludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2VudW1fZG9uZV9pbnRyKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJZHdjX290Z19wY2RfZXBfdCAqZXAwID0gJnBjZC0+ZXAwOworCWdpbnRzdHNfZGF0YV90IGdpbnRzdHM7CisJZ3VzYmNmZ19kYXRhX3QgZ3VzYmNmZzsKKwlkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdCAqZ2xvYmFsX3JlZ3MgPQorCSAgICBHRVRfQ09SRV9JRihwY2QpLT5jb3JlX2dsb2JhbF9yZWdzOworCXVpbnQ4X3QgdXRtaTE2YiwgdXRtaThiOworCWludCBzcGVlZDsKKwlEV0NfREVCVUdQTChEQkdfUENELCAiU1BFRUQgRU5VTVxuIik7CisKKwlpZiAoR0VUX0NPUkVfSUYocGNkKS0+c25wc2lkID49IE9UR19DT1JFX1JFVl8yXzYwYSkgeworCQl1dG1pMTZiID0gNjsJLy92YWhyYW1hIG9sZCB2YWx1ZSB3YXMgNjsKKwkJdXRtaThiID0gOTsKKwl9IGVsc2UgeworCQl1dG1pMTZiID0gNDsKKwkJdXRtaThiID0gODsKKwl9CisJZHdjX290Z19lcDBfYWN0aXZhdGUoR0VUX0NPUkVfSUYocGNkKSwgJmVwMC0+ZHdjX2VwKTsKKworI2lmZGVmIERFQlVHX0VQMAorCXByaW50X2VwMF9zdGF0ZShwY2QpOworI2VuZGlmCisKKwlpZiAocGNkLT5lcDBzdGF0ZSA9PSBFUDBfRElTQ09OTkVDVCkgeworCQlwY2QtPmVwMHN0YXRlID0gRVAwX0lETEU7CisJfSBlbHNlIGlmIChwY2QtPmVwMHN0YXRlID09IEVQMF9TVEFMTCkgeworCQlwY2QtPmVwMHN0YXRlID0gRVAwX0lETEU7CisJfQorCisJcGNkLT5lcDBzdGF0ZSA9IEVQMF9JRExFOworCisJZXAwLT5zdG9wcGVkID0gMDsKKworCXNwZWVkID0gZ2V0X2RldmljZV9zcGVlZChHRVRfQ09SRV9JRihwY2QpKTsKKwlwY2QtPmZvcHMtPmNvbm5lY3QocGNkLCBzcGVlZCk7CisKKwkvKiBTZXQgVVNCIHR1cm5hcm91bmQgdGltZSBiYXNlZCBvbiBkZXZpY2Ugc3BlZWQgYW5kIFBIWSBpbnRlcmZhY2UuICovCisJZ3VzYmNmZy5kMzIgPSBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmd1c2JjZmcpOworCWlmIChzcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgeworCQlpZiAoR0VUX0NPUkVfSUYocGNkKS0+aHdjZmcyLmIuaHNfcGh5X3R5cGUgPT0KKwkJICAgIERXQ19IV0NGRzJfSFNfUEhZX1RZUEVfVUxQSSkgeworCQkJLyogVUxQSSBpbnRlcmZhY2UgKi8KKwkJCWd1c2JjZmcuYi51c2J0cmR0aW0gPSA5OworCQl9CisJCWlmIChHRVRfQ09SRV9JRihwY2QpLT5od2NmZzIuYi5oc19waHlfdHlwZSA9PQorCQkgICAgRFdDX0hXQ0ZHMl9IU19QSFlfVFlQRV9VVE1JKSB7CisJCQkvKiBVVE1JKyBpbnRlcmZhY2UgKi8KKwkJCWlmIChHRVRfQ09SRV9JRihwY2QpLT5od2NmZzQuYi51dG1pX3BoeV9kYXRhX3dpZHRoID09IDApIHsKKwkJCQlndXNiY2ZnLmIudXNidHJkdGltID0gdXRtaThiOworCQkJfSBlbHNlIGlmIChHRVRfQ09SRV9JRihwY2QpLT5od2NmZzQuCisJCQkJICAgYi51dG1pX3BoeV9kYXRhX3dpZHRoID09IDEpIHsKKwkJCQlndXNiY2ZnLmIudXNidHJkdGltID0gdXRtaTE2YjsKKwkJCX0gZWxzZSBpZiAoR0VUX0NPUkVfSUYocGNkKS0+CisJCQkJICAgY29yZV9wYXJhbXMtPnBoeV91dG1pX3dpZHRoID09IDgpIHsKKwkJCQlndXNiY2ZnLmIudXNidHJkdGltID0gdXRtaThiOworCQkJfSBlbHNlIHsKKwkJCQlndXNiY2ZnLmIudXNidHJkdGltID0gdXRtaTE2YjsKKwkJCX0KKwkJfQorCQlpZiAoR0VUX0NPUkVfSUYocGNkKS0+aHdjZmcyLmIuaHNfcGh5X3R5cGUgPT0KKwkJICAgIERXQ19IV0NGRzJfSFNfUEhZX1RZUEVfVVRNSV9VTFBJKSB7CisJCQkvKiBVVE1JKyAgT1IgIFVMUEkgaW50ZXJmYWNlICovCisJCQlpZiAoZ3VzYmNmZy5iLnVscGlfdXRtaV9zZWwgPT0gMSkgeworCQkJCS8qIFVMUEkgaW50ZXJmYWNlICovCisJCQkJZ3VzYmNmZy5iLnVzYnRyZHRpbSA9IDk7CisJCQl9IGVsc2UgeworCQkJCS8qIFVUTUkrIGludGVyZmFjZSAqLworCQkJCWlmIChHRVRfQ09SRV9JRihwY2QpLT4KKwkJCQkgICAgY29yZV9wYXJhbXMtPnBoeV91dG1pX3dpZHRoID09IDE2KSB7CisJCQkJCWd1c2JjZmcuYi51c2J0cmR0aW0gPSB1dG1pMTZiOworCQkJCX0gZWxzZSB7CisJCQkJCWd1c2JjZmcuYi51c2J0cmR0aW0gPSB1dG1pOGI7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogRnVsbCBvciBsb3cgc3BlZWQgKi8KKwkJZ3VzYmNmZy5iLnVzYnRyZHRpbSA9IDk7CisJfQorCURXQ19XUklURV9SRUczMigmZ2xvYmFsX3JlZ3MtPmd1c2JjZmcsIGd1c2JjZmcuZDMyKTsKKworCS8qIENsZWFyIGludGVycnVwdCAqLworCWdpbnRzdHMuZDMyID0gMDsKKwlnaW50c3RzLmIuZW51bWRvbmUgPSAxOworCURXQ19XUklURV9SRUczMigmR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywKKwkJCWdpbnRzdHMuZDMyKTsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBUaGlzIGludGVycnVwdCBpbmRpY2F0ZXMgdGhhdCB0aGUgSVNPIE9VVCBQYWNrZXQgd2FzIGRyb3BwZWQgZHVlIHRvCisgKiBSeCBGSUZPIGZ1bGwgb3IgUnggU3RhdHVzIFF1ZXVlIEZ1bGwuICBJZiB0aGlzIGludGVycnVwdCBvY2N1cnMKKyAqIHJlYWQgYWxsIHRoZSBkYXRhIGZyb20gdGhlIFJ4IEZJRk8uCisgKi8KK2ludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2lzb2Nfb3V0X3BhY2tldF9kcm9wcGVkX2ludHIoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKwlnaW50c3RzX2RhdGFfdCBnaW50c3RzOworCisJRFdDX1dBUk4oIklOVEVSUlVQVCBIYW5kbGVyIG5vdCBpbXBsZW1lbnRlZCBmb3IgJXNcbiIsCisJCSAiSVNPQyBPdXQgRHJvcHBlZCIpOworCisJaW50cl9tYXNrLmIuaXNvb3V0ZHJvcCA9IDE7CisJRFdDX01PRElGWV9SRUczMigmR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaywKKwkJCSBpbnRyX21hc2suZDMyLCAwKTsKKworCS8qIENsZWFyIGludGVycnVwdCAqLworCWdpbnRzdHMuZDMyID0gMDsKKwlnaW50c3RzLmIuaXNvb3V0ZHJvcCA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzLAorCQkJZ2ludHN0cy5kMzIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogVGhpcyBpbnRlcnJ1cHQgaW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlIHBvcnRpb24gb2YgdGhlIG1pY3JvLWZyYW1lCisgKiBmb3IgcGVyaW9kaWMgdHJhbnNhY3Rpb25zLiAgSWYgdGhlcmUgaXMgYSBwZXJpb2RpYyB0cmFuc2FjdGlvbiBmb3IKKyAqIHRoZSBuZXh0IGZyYW1lLCBsb2FkIHRoZSBwYWNrZXRzIGludG8gdGhlIEVQIHBlcmlvZGljIFR4IEZJRk8uCisgKi8KK2ludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2VuZF9wZXJpb2RpY19mcmFtZV9pbnRyKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJZ2ludG1za19kYXRhX3QgaW50cl9tYXNrID0gey5kMzIgPSAwIH07CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKwlEV0NfUFJJTlRGKCJJTlRFUlJVUFQgSGFuZGxlciBub3QgaW1wbGVtZW50ZWQgZm9yICVzXG4iLCAiRU9QIik7CisKKwlpbnRyX21hc2suYi5lb3BmcmFtZSA9IDE7CisJRFdDX01PRElGWV9SRUczMigmR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaywKKwkJCSBpbnRyX21hc2suZDMyLCAwKTsKKworCS8qIENsZWFyIGludGVycnVwdCAqLworCWdpbnRzdHMuZDMyID0gMDsKKwlnaW50c3RzLmIuZW9wZnJhbWUgPSAxOworCURXQ19XUklURV9SRUczMigmR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywKKwkJCWdpbnRzdHMuZDMyKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIFRoaXMgaW50ZXJydXB0IGluZGljYXRlcyB0aGF0IEVQIG9mIHRoZSBwYWNrZXQgb24gdGhlIHRvcCBvZiB0aGUKKyAqIG5vbi1wZXJpb2RpYyBUeCBGSUZPIGRvZXMgbm90IG1hdGNoIEVQIG9mIHRoZSBJTiBUb2tlbiByZWNlaXZlZC4KKyAqCisgKiBUaGUgIkRldmljZSBJTiBUb2tlbiBRdWV1ZSIgUmVnaXN0ZXJzIGFyZSByZWFkIHRvIGRldGVybWluZSB0aGUKKyAqIG9yZGVyIHRoZSBJTiBUb2tlbnMgaGF2ZSBiZWVuIHJlY2VpdmVkLiBUaGUgbm9uLXBlcmlvZGljIFR4IEZJRk8KKyAqIGlzIGZsdXNoZWQsIHNvIGl0IGNhbiBiZSByZWxvYWRlZCBpbiB0aGUgb3JkZXIgc2VlbiBpbiB0aGUgSU4gVG9rZW4KKyAqIFF1ZXVlLgorICovCitpbnQzMl90IGR3Y19vdGdfcGNkX2hhbmRsZV9lcF9taXNtYXRjaF9pbnRyKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJZGN0bF9kYXRhX3QgZGN0bDsKKwlnaW50bXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKworCWlmICghY29yZV9pZi0+ZW5fbXVsdGlwbGVfdHhfZmlmbyAmJiBjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCWNvcmVfaWYtPnN0YXJ0X3ByZWRpY3QgPSAxOworCQorCQlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzKCVwKVxuIiwgX19mdW5jX18sIGNvcmVfaWYpOworCQorCQlnaW50c3RzLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzKTsKKwkJaWYgKCFnaW50c3RzLmIuZ2lubmFrZWZmKSB7CisJCQkvKiBEaXNhYmxlIEVQIE1pc21hdGNoIGludGVycnVwdCAqLworCQkJaW50cl9tYXNrLmQzMiA9IDA7CisJCQlpbnRyX21hc2suYi5lcG1pc21hdGNoID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIGludHJfbWFzay5kMzIsIDApOworCQkJLyogRW5hYmxlIHRoZSBHbG9iYWwgSU4gTkFLIEVmZmVjdGl2ZSBJbnRlcnJ1cHQgKi8KKwkJCWludHJfbWFzay5kMzIgPSAwOworCQkJaW50cl9tYXNrLmIuZ2lubmFrZWZmID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIDAsIGludHJfbWFzay5kMzIpOworCQkJLyogU2V0IHRoZSBnbG9iYWwgbm9uLXBlcmlvZGljIElOIE5BSyBoYW5kc2hha2UgKi8KKwkJCWRjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsKTsKKwkJCWRjdGwuYi5zZ25waW5uYWsgPSAxOworCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwgZGN0bC5kMzIpOworCQl9IGVsc2UgeworCQkJRFdDX1BSSU5URigiZ2ludHN0cy5iLmdpbm5ha2VmZiA9IDEhIGRjdGwuYi5zZ25waW5uYWsgbm90IHNldFxuIik7CisJCX0KKwkJLyogRGlzYWJsaW5nIG9mIGFsbCBFUCdzIHdpbGwgYmUgZG9uZSBpbiBkd2Nfb3RnX3BjZF9oYW5kbGVfaW5fbmFrX2VmZmVjdGl2ZSgpCisJCSAqIGhhbmRsZXIgYWZ0ZXIgR2xvYmFsIElOIE5BSyBFZmZlY3RpdmUgaW50ZXJydXB0IHdpbGwgYmUgYXNzZXJ0ZWQgKi8KKwl9CisJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJZ2ludHN0cy5kMzIgPSAwOworCWdpbnRzdHMuYi5lcG1pc21hdGNoID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIGdpbnRzdHMuZDMyKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIFRoaXMgaW50ZXJydXB0IGlzIHZhbGlkIG9ubHkgaW4gRE1BIG1vZGUuIFRoaXMgaW50ZXJydXB0IGluZGljYXRlcyB0aGF0IHRoZQorICogY29yZSBoYXMgc3RvcHBlZCBmZXRjaGluZyBkYXRhIGZvciBJTiBlbmRwb2ludHMgZHVlIHRvIHRoZSB1bmF2YWlsYWJpbGl0eSBvZgorICogVHhGSUZPIHNwYWNlIG9yIFJlcXVlc3QgUXVldWUgc3BhY2UuIFRoaXMgaW50ZXJydXB0IGlzIHVzZWQgYnkgdGhlCisgKiBhcHBsaWNhdGlvbiBmb3IgYW4gZW5kcG9pbnQgbWlzbWF0Y2ggYWxnb3JpdGhtLgorICogCisgKiBAcGFyYW0gcGNkIFRoZSBQQ0QgCisgKi8KK2ludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2VwX2ZldHN1c3BfaW50cihkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCWdpbnRzdHNfZGF0YV90IGdpbnRzdHM7CisJZ2ludG1za19kYXRhX3QgZ2ludG1za19kYXRhOworCWRjdGxfZGF0YV90IGRjdGw7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgY29yZV9pZik7CisJCisJLyogQ2xlYXIgdGhlIGdsb2JhbCBub24tcGVyaW9kaWMgSU4gTkFLIGhhbmRzaGFrZSAqLworCWRjdGwuZDMyID0gMDsKKwlkY3RsLmIuY2ducGlubmFrID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwgZGN0bC5kMzIsIGRjdGwuZDMyKTsgCisJCisJLyogTWFzayBHSU5UU1RTLkZFVFNVU1AgaW50ZXJydXB0ICovCisJZ2ludG1za19kYXRhLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrKTsKKwlnaW50bXNrX2RhdGEuYi5mZXRzdXNwID0gMDsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIGdpbnRtc2tfZGF0YS5kMzIpOworCisJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJZ2ludHN0cy5kMzIgPSAwOworCWdpbnRzdHMuYi5mZXRzdXNwID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsIGdpbnRzdHMuZDMyKTsKKworCXJldHVybiAxOworfQorLyoqCisgKiBUaGlzIGZ1bmNpb24gc3RhbGxzIEVQMC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVwMF9kb19zdGFsbChkd2Nfb3RnX3BjZF90ICogcGNkLCBjb25zdCBpbnQgZXJyX3ZhbCkKK3sKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDAgPSAmcGNkLT5lcDA7CisJdXNiX2RldmljZV9yZXF1ZXN0X3QgKmN0cmwgPSAmcGNkLT5zZXR1cF9wa3QtPnJlcTsKKwlEV0NfV0FSTigicmVxICUwMnguJTAyeCBwcm90b2NvbCBTVEFMTDsgZXJyICVkXG4iLAorCQkgY3RybC0+Ym1SZXF1ZXN0VHlwZSwgY3RybC0+YlJlcXVlc3QsIGVycl92YWwpOworCisJZXAwLT5kd2NfZXAuaXNfaW4gPSAxOworCWR3Y19vdGdfZXBfc2V0X3N0YWxsKEdFVF9DT1JFX0lGKHBjZCksICZlcDAtPmR3Y19lcCk7CisJcGNkLT5lcDAuc3RvcHBlZCA9IDE7CisJcGNkLT5lcDBzdGF0ZSA9IEVQMF9JRExFOworCWVwMF9vdXRfc3RhcnQoR0VUX0NPUkVfSUYocGNkKSwgcGNkKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9ucyBkZWxlZ2F0ZXMgdGhlIHNldHVwIGNvbW1hbmQgdG8gdGhlIGdhZGdldCBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkb19nYWRnZXRfc2V0dXAoZHdjX290Z19wY2RfdCAqIHBjZCwKKwkJCQkgICB1c2JfZGV2aWNlX3JlcXVlc3RfdCAqIGN0cmwpCit7CisJaW50IHJldCA9IDA7CisJRFdDX1NQSU5VTkxPQ0socGNkLT5sb2NrKTsKKwlyZXQgPSBwY2QtPmZvcHMtPnNldHVwKHBjZCwgKHVpbnQ4X3QgKikgY3RybCk7CisJRFdDX1NQSU5MT0NLKHBjZC0+bG9jayk7CisJaWYgKHJldCA8IDApIHsKKwkJZXAwX2RvX3N0YWxsKHBjZCwgcmV0KTsKKwl9CisKKwkvKiogQHRvZG8gVGhpcyBpcyBhIGdfZmlsZV9zdG9yYWdlIGdhZGdldCBkcml2ZXIgc3BlY2lmaWMKKwkgKiB3b3JrYXJvdW5kOiBhIERFTEFZRURfU1RBVFVTIHJlc3VsdCBmcm9tIHRoZSBmc2dfc2V0dXAKKwkgKiByb3V0aW5lIHdpbGwgcmVzdWx0IGluIHRoZSBnYWRnZXQgcXVldWVpbmcgYSBFUDAgSU4gc3RhdHVzCisJICogcGhhc2UgZm9yIGEgdHdvLXN0YWdlIGNvbnRyb2wgdHJhbnNmZXIuIEV4YWN0bHkgdGhlIHNhbWUgYXMKKwkgKiBhIFNFVF9DT05GSUdVUkFUSU9OL1NFVF9JTlRFUkZBQ0UgZXhjZXB0IHRoYXQgdGhpcyBpcyBhIGNsYXNzCisJICogc3BlY2lmaWMgcmVxdWVzdC4gIE5lZWQgYSBnZW5lcmljIHdheSB0byBrbm93IHdoZW4gdGhlIGdhZGdldAorCSAqIGRyaXZlciB3aWxsIHF1ZXVlIHRoZSBzdGF0dXMgcGhhc2UuIENhbiB3ZSBhc3N1bWUgd2hlbiB3ZQorCSAqIGNhbGwgdGhlIGdhZGdldCBkcml2ZXIgc2V0dXAoKSBmdW5jdGlvbiB0aGF0IGl0IHdpbGwgYWx3YXlzCisJICogcXVldWUgYW5kIHJlcXVpcmUgdGhlIGZvbGxvd2luZyBmbGFnPyBOZWVkIHRvIGxvb2sgaW50bworCSAqIHRoaXMuCisJICovCisKKwlpZiAocmV0ID09IDI1NiArIDk5OSkgeworCQlwY2QtPnJlcXVlc3RfY29uZmlnID0gMTsKKwl9Cit9CisKKyNpZmRlZiBEV0NfVVRFX0NGSQorLyoqCisgKiBUaGlzIGZ1bmN0aW9ucyBkZWxlZ2F0ZXMgdGhlIENGSSBzZXR1cCBjb21tYW5kcyB0byB0aGUgZ2FkZ2V0IGRyaXZlci4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSB0byBpbmRpY2F0ZSBhIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNmaV9nYWRnZXRfc2V0dXAoZHdjX290Z19wY2RfdCAqIHBjZCwKKwkJCQkgICBzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCAqY3RybF9yZXEpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAocGNkLT5mb3BzICYmIHBjZC0+Zm9wcy0+Y2ZpX3NldHVwKSB7CisJCURXQ19TUElOVU5MT0NLKHBjZC0+bG9jayk7CisJCXJldCA9IHBjZC0+Zm9wcy0+Y2ZpX3NldHVwKHBjZCwgY3RybF9yZXEpOworCQlEV0NfU1BJTkxPQ0socGNkLT5sb2NrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVwMF9kb19zdGFsbChwY2QsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSBaZXJvLUxlbmd0aCBQYWNrZXQgZm9yIHRoZSBJTiBzdGF0dXMgcGhhc2UKKyAqIG9mIGEgMiBzdGFnZSBjb250cm9sIHRyYW5zZmVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fc2V0dXBfaW5fc3RhdHVzX3BoYXNlKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJZHdjX290Z19wY2RfZXBfdCAqZXAwID0gJnBjZC0+ZXAwOworCWlmIChwY2QtPmVwMHN0YXRlID09IEVQMF9TVEFMTCkgeworCQlyZXR1cm47CisJfQorCisJcGNkLT5lcDBzdGF0ZSA9IEVQMF9JTl9TVEFUVVNfUEhBU0U7CisKKwkvKiBQcmVwYXJlIGZvciBtb3JlIFNFVFVQIFBhY2tldHMgKi8KKwlEV0NfREVCVUdQTChEQkdfUENELCAiRVAwIElOIFpMUFxuIik7CisJZXAwLT5kd2NfZXAueGZlcl9sZW4gPSAwOworCWVwMC0+ZHdjX2VwLnhmZXJfY291bnQgPSAwOworCWVwMC0+ZHdjX2VwLmlzX2luID0gMTsKKwllcDAtPmR3Y19lcC5kbWFfYWRkciA9IHBjZC0+c2V0dXBfcGt0X2RtYV9oYW5kbGU7CisJZHdjX290Z19lcDBfc3RhcnRfdHJhbnNmZXIoR0VUX0NPUkVfSUYocGNkKSwgJmVwMC0+ZHdjX2VwKTsKKworCS8qIFByZXBhcmUgZm9yIG1vcmUgU0VUVVAgUGFja2V0cyAqLworCS8vZXAwX291dF9zdGFydChHRVRfQ09SRV9JRihwY2QpLCBwY2QpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSBaZXJvLUxlbmd0aCBQYWNrZXQgZm9yIHRoZSBPVVQgc3RhdHVzIHBoYXNlCisgKiBvZiBhIDIgc3RhZ2UgY29udHJvbCB0cmFuc2Zlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRvX3NldHVwX291dF9zdGF0dXNfcGhhc2UoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDAgPSAmcGNkLT5lcDA7CisJaWYgKHBjZC0+ZXAwc3RhdGUgPT0gRVAwX1NUQUxMKSB7CisJCURXQ19ERUJVR1BMKERCR19QQ0QsICJFUDAgU1RBTExFRFxuIik7CisJCXJldHVybjsKKwl9CisJcGNkLT5lcDBzdGF0ZSA9IEVQMF9PVVRfU1RBVFVTX1BIQVNFOworCisJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkVQMCBPVVQgWkxQXG4iKTsKKwllcDAtPmR3Y19lcC54ZmVyX2xlbiA9IDA7CisJZXAwLT5kd2NfZXAueGZlcl9jb3VudCA9IDA7CisJZXAwLT5kd2NfZXAuaXNfaW4gPSAwOworCWVwMC0+ZHdjX2VwLmRtYV9hZGRyID0gcGNkLT5zZXR1cF9wa3RfZG1hX2hhbmRsZTsKKwlkd2Nfb3RnX2VwMF9zdGFydF90cmFuc2ZlcihHRVRfQ09SRV9JRihwY2QpLCAmZXAwLT5kd2NfZXApOworCisJLyogUHJlcGFyZSBmb3IgbW9yZSBTRVRVUCBQYWNrZXRzICovCisJaWYgKEdFVF9DT1JFX0lGKHBjZCktPmRtYV9lbmFibGUgPT0gMCkgeworCQllcDBfb3V0X3N0YXJ0KEdFVF9DT1JFX0lGKHBjZCksIHBjZCk7CisJfQorfQorCisvKioKKyAqIENsZWFyIHRoZSBFUCBoYWx0IChTVEFMTCkgYW5kIGlmIHBlbmRpbmcgcmVxdWVzdHMgc3RhcnQgdGhlCisgKiB0cmFuc2Zlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHBjZF9jbGVhcl9oYWx0KGR3Y19vdGdfcGNkX3QgKiBwY2QsIGR3Y19vdGdfcGNkX2VwX3QgKiBlcCkKK3sKKwlpZiAoZXAtPmR3Y19lcC5zdGFsbF9jbGVhcl9mbGFnID09IDApCisJCWR3Y19vdGdfZXBfY2xlYXJfc3RhbGwoR0VUX0NPUkVfSUYocGNkKSwgJmVwLT5kd2NfZXApOworCisJLyogUmVhY3RpdmUgdGhlIEVQICovCisJZHdjX290Z19lcF9hY3RpdmF0ZShHRVRfQ09SRV9JRihwY2QpLCAmZXAtPmR3Y19lcCk7CisJaWYgKGVwLT5zdG9wcGVkKSB7CisJCWVwLT5zdG9wcGVkID0gMDsKKwkJLyogSWYgdGhlcmUgaXMgYSByZXF1ZXN0IGluIHRoZSBFUCBxdWV1ZSBzdGFydCBpdCAqLworCisJCS8qKiBAdG9kbyBGSVhNRTogdGhpcyBjYXVzZXMgYW4gRVAgbWlzbWF0Y2ggaW4gRE1BIG1vZGUuCisJCSAqIGVwbWlzbWF0Y2ggbm90IHlldCBpbXBsZW1lbnRlZC4gKi8KKworCQkvKgorCQkgKiBBYm92ZSBmaXhtZSBpcyBzb2x2ZWQgYnkgaW1wbG1lbnRpbmcgYSB0YXNrbGV0IHRvIGNhbGwgdGhlCisJCSAqIHN0YXJ0X25leHRfcmVxdWVzdCgpLCBvdXRzaWRlIG9mIGludGVycnVwdCBjb250ZXh0IGF0IHNvbWUKKwkJICogdGltZSBhZnRlciB0aGUgY3VycmVudCB0aW1lLCBhZnRlciBhIGNsZWFyLWhhbHQgc2V0dXAgcGFja2V0LgorCQkgKiBTdGlsbCBuZWVkIHRvIGltcGxlbWVudCBlcCBtaXNtYXRjaCBpbiB0aGUgZnV0dXJlIGlmIGEgZ2FkZ2V0CisJCSAqIGV2ZXIgdXNlcyBtb3JlIHRoYW4gb25lIGVuZHBvaW50IGF0IG9uY2UKKwkJICovCisJCWVwLT5xdWV1ZV9zb2YgPSAxOworCQlEV0NfVEFTS19TQ0hFRFVMRShwY2QtPnN0YXJ0X3hmZXJfdGFza2xldCk7CisJfQorCS8qIFN0YXJ0IENvbnRyb2wgU3RhdHVzIFBoYXNlICovCisJZG9fc2V0dXBfaW5fc3RhdHVzX3BoYXNlKHBjZCk7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgU0VUX0ZFQVRVUkUgVEVTVF9NT0RFIFNldHVwIHBhY2tldAorICogaXMgc2VudCBmcm9tIHRoZSBob3N0LiAgVGhlIERldmljZSBDb250cm9sIHJlZ2lzdGVyIGlzIHdyaXR0ZW4gd2l0aAorICogdGhlIFRlc3QgTW9kZSBiaXRzIHNldCB0byB0aGUgc3BlY2lmaWVkIFRlc3QgTW9kZS4gIFRoaXMgaXMgZG9uZSBhcworICogYSB0YXNrbGV0IHNvIHRoYXQgdGhlICJTdGF0dXMiIHBoYXNlIG9mIHRoZSBjb250cm9sIHRyYW5zZmVyCisgKiBjb21wbGV0ZXMgYmVmb3JlIHRyYW5zbWl0dGluZyB0aGUgVEVTVCBwYWNrZXRzLgorICoKKyAqIEB0b2RvIFRoaXMgaGFzIG5vdCBiZWVuIHRlc3RlZCBzaW5jZSB0aGUgdGFza2xldCBzdHJ1Y3Qgd2FzIHB1dAorICogaW50byB0aGUgUENEIHN0cnVjdCEKKyAqCisgKi8KK3ZvaWQgZG9fdGVzdF9tb2RlKHZvaWQgKmRhdGEpCit7CisJZGN0bF9kYXRhX3QgZGN0bDsKKwlkd2Nfb3RnX3BjZF90ICpwY2QgPSAoZHdjX290Z19wY2RfdCAqKSBkYXRhOworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKwlpbnQgdGVzdF9tb2RlID0gcGNkLT50ZXN0X21vZGU7CisKKy8vICAgICAgICBEV0NfV0FSTigiJXMoKSBoYXMgbm90IGJlZW4gdGVzdGVkIHNpbmNlIGJlaW5nIHJld3JpdHRlbiFcbiIsIF9fZnVuY19fKTsKKworCWRjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsKTsKKwlzd2l0Y2ggKHRlc3RfbW9kZSkgeworCWNhc2UgMToJCS8vIFRFU1RfSgorCQlkY3RsLmIudHN0Y3RsID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CQkvLyBURVNUX0sKKwkJZGN0bC5iLnRzdGN0bCA9IDI7CisJCWJyZWFrOworCisJY2FzZSAzOgkJLy8gVEVTVF9TRTBfTkFLCisJCWRjdGwuYi50c3RjdGwgPSAzOworCQlicmVhazsKKworCWNhc2UgNDoJCS8vIFRFU1RfUEFDS0VUCisJCWRjdGwuYi50c3RjdGwgPSA0OworCQlicmVhazsKKworCWNhc2UgNToJCS8vIFRFU1RfRk9SQ0VfRU5BQkxFCisJCWRjdGwuYi50c3RjdGwgPSA1OworCQlicmVhazsKKwl9CisJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwgZGN0bC5kMzIpOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgR0VUX1NUQVRVUyBTZXR1cCBDb21tYW5kcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRvX2dldF9zdGF0dXMoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwl1c2JfZGV2aWNlX3JlcXVlc3RfdCBjdHJsID0gcGNkLT5zZXR1cF9wa3QtPnJlcTsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDAgPSAmcGNkLT5lcDA7CisJdWludDE2X3QgKnN0YXR1cyA9IHBjZC0+c3RhdHVzX2J1ZjsKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisKKyNpZmRlZiBERUJVR19FUDAKKwlEV0NfREVCVUdQTChEQkdfUENELAorCQkgICAgIkdFVF9TVEFUVVMgJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlMDR4XG4iLAorCQkgICAgY3RybC5ibVJlcXVlc3RUeXBlLCBjdHJsLmJSZXF1ZXN0LAorCQkgICAgVUdFVFcoY3RybC53VmFsdWUpLCBVR0VUVyhjdHJsLndJbmRleCksCisJCSAgICBVR0VUVyhjdHJsLndMZW5ndGgpKTsKKyNlbmRpZgorCisJc3dpdGNoIChVVF9HRVRfUkVDSVBJRU5UKGN0cmwuYm1SZXF1ZXN0VHlwZSkpIHsKKwljYXNlIFVUX0RFVklDRToKKwkJaWYoVUdFVFcoY3RybC53SW5kZXgpID09IDB4RjAwMCkgeyAvKiBPVEcgU3RhdHVzIHNlbGVjdG9yICovCisJCQlEV0NfUFJJTlRGKCJ3SW5kZXggLSAlZFxuIiwgVUdFVFcoY3RybC53SW5kZXgpKTsKKwkJCURXQ19QUklOVEYoIk9URyBWRVJTSU9OIC0gJWRcbiIsIGNvcmVfaWYtPm90Z192ZXIpOworCQkJRFdDX1BSSU5URigiT1RHIENBUCAtICVkLCAlZFxuIiwgY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z19jYXAsCisJCQkJCQlEV0NfT1RHX0NBUF9QQVJBTV9ITlBfU1JQX0NBUEFCTEUpOworCQkJaWYoY29yZV9pZi0+b3RnX3ZlciA9PSAxICYmIAorCQkJY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z19jYXAgPT0gRFdDX09UR19DQVBfUEFSQU1fSE5QX1NSUF9DQVBBQkxFKSB7CisJCQkJdWludDhfdCAqb3Rnc3RzID0gKHVpbnQ4X3QqKXBjZC0+c3RhdHVzX2J1ZjsKKwkJCQkqb3Rnc3RzID0gKGNvcmVfaWYtPm90Z19zdHMgJiAweDEpOworCQkJCXBjZC0+ZXAwX3BlbmRpbmcgPSAxOworCQkJCWVwMC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9ICh1aW50OF90ICopIG90Z3N0czsKKwkJCQllcDAtPmR3Y19lcC54ZmVyX2J1ZmYgPSAodWludDhfdCAqKSBvdGdzdHM7CisJCQkJZXAwLT5kd2NfZXAuZG1hX2FkZHIgPSBwY2QtPnN0YXR1c19idWZfZG1hX2hhbmRsZTsKKwkJCQllcDAtPmR3Y19lcC54ZmVyX2xlbiA9IDE7CisJCQkJZXAwLT5kd2NfZXAueGZlcl9jb3VudCA9IDA7CisJCQkJZXAwLT5kd2NfZXAudG90YWxfbGVuID0gZXAwLT5kd2NfZXAueGZlcl9sZW47CisJCQkJZHdjX290Z19lcDBfc3RhcnRfdHJhbnNmZXIoR0VUX0NPUkVfSUYocGNkKSwgJmVwMC0+ZHdjX2VwKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UgeworCQkJCWVwMF9kb19zdGFsbChwY2QsIC1EV0NfRV9OT1RfU1VQUE9SVEVEKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCSpzdGF0dXMgPSAweDE7CS8qIFNlbGYgcG93ZXJlZCAqLworCQkJKnN0YXR1cyB8PSBwY2QtPnJlbW90ZV93YWtldXBfZW5hYmxlIDw8IDE7CisJCQlicmVhazsKKwkJfQorCWNhc2UgVVRfSU5URVJGQUNFOgorCQkqc3RhdHVzID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFVUX0VORFBPSU5UOgorCQllcCA9IGdldF9lcF9ieV9hZGRyKHBjZCwgVUdFVFcoY3RybC53SW5kZXgpKTsKKwkJaWYgKGVwID09IDAgfHwgVUdFVFcoY3RybC53TGVuZ3RoKSA+IDIpIHsKKwkJCWVwMF9kb19zdGFsbChwY2QsIC1EV0NfRV9OT1RfU1VQUE9SVEVEKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiogQHRvZG8gY2hlY2sgZm9yIEVQIHN0YWxsICovCisJCSpzdGF0dXMgPSBlcC0+c3RvcHBlZDsKKwkJYnJlYWs7CisJfQorCXBjZC0+ZXAwX3BlbmRpbmcgPSAxOworCWVwMC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9ICh1aW50OF90ICopIHN0YXR1czsKKwllcDAtPmR3Y19lcC54ZmVyX2J1ZmYgPSAodWludDhfdCAqKSBzdGF0dXM7CisJZXAwLT5kd2NfZXAuZG1hX2FkZHIgPSBwY2QtPnN0YXR1c19idWZfZG1hX2hhbmRsZTsKKwllcDAtPmR3Y19lcC54ZmVyX2xlbiA9IDI7CisJZXAwLT5kd2NfZXAueGZlcl9jb3VudCA9IDA7CisJZXAwLT5kd2NfZXAudG90YWxfbGVuID0gZXAwLT5kd2NfZXAueGZlcl9sZW47CisJZHdjX290Z19lcDBfc3RhcnRfdHJhbnNmZXIoR0VUX0NPUkVfSUYocGNkKSwgJmVwMC0+ZHdjX2VwKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIFNFVF9GRUFUVVJFIFNldHVwIENvbW1hbmRzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fc2V0X2ZlYXR1cmUoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzID0gY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKwl1c2JfZGV2aWNlX3JlcXVlc3RfdCBjdHJsID0gcGNkLT5zZXR1cF9wa3QtPnJlcTsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcCA9IDA7CisJaW50MzJfdCBvdGdfY2FwX3BhcmFtID0gY29yZV9pZi0+Y29yZV9wYXJhbXMtPm90Z19jYXA7CisJZ290Z2N0bF9kYXRhX3QgZ290Z2N0bCA9IHsuZDMyID0gMCB9OworCisJRFdDX0RFQlVHUEwoREJHX1BDRCwgIlNFVF9GRUFUVVJFOiUwMnguJTAyeCB2JTA0eCBpJTA0eCBsJTA0eFxuIiwKKwkJICAgIGN0cmwuYm1SZXF1ZXN0VHlwZSwgY3RybC5iUmVxdWVzdCwKKwkJICAgIFVHRVRXKGN0cmwud1ZhbHVlKSwgVUdFVFcoY3RybC53SW5kZXgpLAorCQkgICAgVUdFVFcoY3RybC53TGVuZ3RoKSk7CisJRFdDX0RFQlVHUEwoREJHX1BDRCwgIm90Z19jYXA9JWRcbiIsIG90Z19jYXBfcGFyYW0pOworCisJc3dpdGNoIChVVF9HRVRfUkVDSVBJRU5UKGN0cmwuYm1SZXF1ZXN0VHlwZSkpIHsKKwljYXNlIFVUX0RFVklDRToKKwkJc3dpdGNoIChVR0VUVyhjdHJsLndWYWx1ZSkpIHsKKwkJY2FzZSBVRl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDoKKwkJCXBjZC0+cmVtb3RlX3dha2V1cF9lbmFibGUgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBVRl9URVNUX01PREU6CisJCQkvKiBTZXR1cCB0aGUgVGVzdCBNb2RlIHRhc2tsZXQgdG8gZG8gdGhlIFRlc3QKKwkJCSAqIFBhY2tldCBnZW5lcmF0aW9uIGFmdGVyIHRoZSBTRVRVUCBTdGF0dXMKKwkJCSAqIHBoYXNlIGhhcyBjb21wbGV0ZWQuICovCisKKwkJCS8qKiBAdG9kbyBUaGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQgc2luY2UgdGhlCisJCQkgKiB0YXNrbGV0IHN0cnVjdCB3YXMgcHV0IGludG8gdGhlIFBDRAorCQkJICogc3RydWN0ISAqLworCQkJcGNkLT50ZXN0X21vZGUgPSBVR0VUVyhjdHJsLndJbmRleCkgPj4gODsKKwkJCURXQ19UQVNLX1NDSEVEVUxFKHBjZC0+dGVzdF9tb2RlX3Rhc2tsZXQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBVRl9ERVZJQ0VfQl9ITlBfRU5BQkxFOgorCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsCisJCQkJICAgICJTRVRfRkVBVFVSRTogVVNCX0RFVklDRV9CX0hOUF9FTkFCTEVcbiIpOworCisJCQkvKiBkZXYgbWF5IGluaXRpYXRlIEhOUCAqLworCQkJaWYgKG90Z19jYXBfcGFyYW0gPT0gRFdDX09UR19DQVBfUEFSQU1fSE5QX1NSUF9DQVBBQkxFKSB7CisJCQkJcGNkLT5iX2hucF9lbmFibGUgPSAxOworCQkJCWR3Y19vdGdfcGNkX3VwZGF0ZV9vdGcocGNkLCAwKTsKKwkJCQlEV0NfREVCVUdQTChEQkdfUENELCAiUmVxdWVzdCBCIEhOUFxuIik7CisJCQkJLyoqQHRvZG8gSXMgdGhlIGdvdGdjdGwuZGV2aG5wZW4gY2xlYXJlZAorCQkJCSAqIGJ5IGEgVVNCIFJlc2V0PyAqLworCQkJCWdvdGdjdGwuYi5kZXZobnBlbiA9IDE7CisJCQkJZ290Z2N0bC5iLmhucHJlcSA9IDE7CisJCQkJRFdDX1dSSVRFX1JFRzMyKCZnbG9iYWxfcmVncy0+Z290Z2N0bCwKKwkJCQkJCWdvdGdjdGwuZDMyKTsKKwkJCX0gZWxzZSB7CisJCQkJZXAwX2RvX3N0YWxsKHBjZCwgLURXQ19FX05PVF9TVVBQT1JURUQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVUZfREVWSUNFX0FfSE5QX1NVUFBPUlQ6CisJCQkvKiBSSCBwb3J0IHN1cHBvcnRzIEhOUCAqLworCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsCisJCQkJICAgICJTRVRfRkVBVFVSRTogVVNCX0RFVklDRV9BX0hOUF9TVVBQT1JUXG4iKTsKKwkJCWlmIChvdGdfY2FwX3BhcmFtID09IERXQ19PVEdfQ0FQX1BBUkFNX0hOUF9TUlBfQ0FQQUJMRSkgeworCQkJCXBjZC0+YV9obnBfc3VwcG9ydCA9IDE7CisJCQkJZHdjX290Z19wY2RfdXBkYXRlX290ZyhwY2QsIDApOworCQkJfSBlbHNlIHsKKwkJCQllcDBfZG9fc3RhbGwocGNkLCAtRFdDX0VfTk9UX1NVUFBPUlRFRCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBVRl9ERVZJQ0VfQV9BTFRfSE5QX1NVUFBPUlQ6CisJCQkvKiBvdGhlciBSSCBwb3J0IGRvZXMgKi8KKwkJCURXQ19ERUJVR1BMKERCR19QQ0RWLAorCQkJCSAgICAiU0VUX0ZFQVRVUkU6IFVTQl9ERVZJQ0VfQV9BTFRfSE5QX1NVUFBPUlRcbiIpOworCQkJaWYgKG90Z19jYXBfcGFyYW0gPT0gRFdDX09UR19DQVBfUEFSQU1fSE5QX1NSUF9DQVBBQkxFKSB7CisJCQkJcGNkLT5hX2FsdF9obnBfc3VwcG9ydCA9IDE7CisJCQkJZHdjX290Z19wY2RfdXBkYXRlX290ZyhwY2QsIDApOworCQkJfSBlbHNlIHsKKwkJCQllcDBfZG9fc3RhbGwocGNkLCAtRFdDX0VfTk9UX1NVUFBPUlRFRCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWVwMF9kb19zdGFsbChwY2QsIC1EV0NfRV9OT1RfU1VQUE9SVEVEKTsKKwkJCXJldHVybjsKKworCQl9CisJCWRvX3NldHVwX2luX3N0YXR1c19waGFzZShwY2QpOworCQlicmVhazsKKworCWNhc2UgVVRfSU5URVJGQUNFOgorCQlkb19nYWRnZXRfc2V0dXAocGNkLCAmY3RybCk7CisJCWJyZWFrOworCisJY2FzZSBVVF9FTkRQT0lOVDoKKwkJaWYgKFVHRVRXKGN0cmwud1ZhbHVlKSA9PSBVRl9FTkRQT0lOVF9IQUxUKSB7CisJCQllcCA9IGdldF9lcF9ieV9hZGRyKHBjZCwgVUdFVFcoY3RybC53SW5kZXgpKTsKKwkJCWlmIChlcCA9PSAwKSB7CisJCQkJZXAwX2RvX3N0YWxsKHBjZCwgLURXQ19FX05PVF9TVVBQT1JURUQpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWVwLT5zdG9wcGVkID0gMTsKKwkJCWR3Y19vdGdfZXBfc2V0X3N0YWxsKGNvcmVfaWYsICZlcC0+ZHdjX2VwKTsKKwkJfQorCQlkb19zZXR1cF9pbl9zdGF0dXNfcGhhc2UocGNkKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2VzcyB0aGUgQ0xFQVJfRkVBVFVSRSBTZXR1cCBDb21tYW5kcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRvX2NsZWFyX2ZlYXR1cmUoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwl1c2JfZGV2aWNlX3JlcXVlc3RfdCBjdHJsID0gcGNkLT5zZXR1cF9wa3QtPnJlcTsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcCA9IDA7CisKKwlEV0NfREVCVUdQTChEQkdfUENELAorCQkgICAgIkNMRUFSX0ZFQVRVUkU6JTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlMDR4XG4iLAorCQkgICAgY3RybC5ibVJlcXVlc3RUeXBlLCBjdHJsLmJSZXF1ZXN0LAorCQkgICAgVUdFVFcoY3RybC53VmFsdWUpLCBVR0VUVyhjdHJsLndJbmRleCksCisJCSAgICBVR0VUVyhjdHJsLndMZW5ndGgpKTsKKworCXN3aXRjaCAoVVRfR0VUX1JFQ0lQSUVOVChjdHJsLmJtUmVxdWVzdFR5cGUpKSB7CisJY2FzZSBVVF9ERVZJQ0U6CisJCXN3aXRjaCAoVUdFVFcoY3RybC53VmFsdWUpKSB7CisJCWNhc2UgVUZfREVWSUNFX1JFTU9URV9XQUtFVVA6CisJCQlwY2QtPnJlbW90ZV93YWtldXBfZW5hYmxlID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgVUZfVEVTVF9NT0RFOgorCQkJLyoqIEB0b2RvIEFkZCBDTEVBUl9GRUFUVVJFIGZvciBURVNUIG1vZGVzLiAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWVwMF9kb19zdGFsbChwY2QsIC1EV0NfRV9OT1RfU1VQUE9SVEVEKTsKKwkJCXJldHVybjsKKwkJfQorCQlkb19zZXR1cF9pbl9zdGF0dXNfcGhhc2UocGNkKTsKKwkJYnJlYWs7CisKKwljYXNlIFVUX0VORFBPSU5UOgorCQllcCA9IGdldF9lcF9ieV9hZGRyKHBjZCwgVUdFVFcoY3RybC53SW5kZXgpKTsKKwkJaWYgKGVwID09IDApIHsKKwkJCWVwMF9kb19zdGFsbChwY2QsIC1EV0NfRV9OT1RfU1VQUE9SVEVEKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBjZF9jbGVhcl9oYWx0KHBjZCwgZXApOworCisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2Nlc3MgdGhlIFNFVF9BRERSRVNTIFNldHVwIENvbW1hbmRzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fc2V0X2FkZHJlc3MoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWYgPSBHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWY7CisJdXNiX2RldmljZV9yZXF1ZXN0X3QgY3RybCA9IHBjZC0+c2V0dXBfcGt0LT5yZXE7CisKKwlpZiAoY3RybC5ibVJlcXVlc3RUeXBlID09IFVUX0RFVklDRSkgeworCQlkY2ZnX2RhdGFfdCBkY2ZnID0gey5kMzIgPSAwIH07CisKKyNpZmRlZiBERUJVR19FUDAKKy8vICAgICAgICAgICAgICAgICAgICAgIERXQ19ERUJVR1BMKERCR19QQ0RWLCAiU0VUX0FERFJFU1M6JWRcbiIsIGN0cmwud1ZhbHVlKTsKKyNlbmRpZgorCQlkY2ZnLmIuZGV2YWRkciA9IFVHRVRXKGN0cmwud1ZhbHVlKTsKKwkJRFdDX01PRElGWV9SRUczMigmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjZmcsIDAsIGRjZmcuZDMyKTsKKwkJZG9fc2V0dXBfaW5fc3RhdHVzX3BoYXNlKHBjZCk7CisJfQorfQorCisvKioKKyAqCVRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIFNFVFVQIGNvbW1hbmRzLiBJbiBMaW51eCwgdGhlIFVTQiBDb21tYW5kCisgKglwcm9jZXNzaW5nIGlzIGRvbmUgaW4gdHdvIHBsYWNlcyAtIHRoZSBmaXJzdCBiZWluZyB0aGUgUENEIGFuZCB0aGUKKyAqCXNlY29uZCBpbiB0aGUgR2FkZ2V0IERyaXZlciAoZm9yIGV4YW1wbGUsIHRoZSBGaWxlLUJhY2tlZCBTdG9yYWdlCisgKglHYWRnZXQgRHJpdmVyKS4KKyAqCisgKiA8dGFibGU+CisgKiA8dHI+PHRkPkNvbW1hbmQJPC90ZD48dGQ+RHJpdmVyIDwvdGQ+PHRkPkRlc2NyaXB0aW9uPC90ZD48L3RyPgorICoKKyAqIDx0cj48dGQ+R0VUX1NUQVRVUyA8L3RkPjx0ZD5QQ0QgPC90ZD48dGQ+Q29tbWFuZCBpcyBwcm9jZXNzZWQgYXMKKyAqIGRlZmluZWQgaW4gY2hhcHRlciA5IG9mIHRoZSBVU0IgMi4wIFNwZWNpZmljYXRpb24gY2hhcHRlciA5CisgKiA8L3RkPjwvdHI+CisgKgorICogPHRyPjx0ZD5DTEVBUl9GRUFUVVJFIDwvdGQ+PHRkPlBDRCA8L3RkPjx0ZD5UaGUgRGV2aWNlIGFuZCBFbmRwb2ludAorICogcmVxdWVzdHMgYXJlIHRoZSBFTkRQT0lOVF9IQUxUIGZlYXR1cmUgaXMgcHJvY2VzZWQsIGFsbCBvdGhlcnMgdGhlCisgKiBpbnRlcmZhY2UgcmVxdWVzdHMgYXJlIGlnbm9yZWQuPC90ZD48L3RyPgorICoKKyAqIDx0cj48dGQ+U0VUX0ZFQVRVUkUgPC90ZD48dGQ+UENEIDwvdGQ+PHRkPlRoZSBEZXZpY2UgYW5kIEVuZHBvaW50CisgKiByZXF1ZXN0cyBhcmUgcHJvY2Vzc2VkIGJ5IHRoZSBQQ0QuICBJbnRlcmZhY2UgcmVxdWVzdHMgYXJlIHBhc3NlZAorICogdG8gdGhlIEdhZGdldCBEcml2ZXIuPC90ZD48L3RyPgorICoKKyAqIDx0cj48dGQ+U0VUX0FERFJFU1MgPC90ZD48dGQ+UENEIDwvdGQ+PHRkPlByb2dyYW0gdGhlIERDRkcgcmVnLAorICogd2l0aCBkZXZpY2UgYWRkcmVzcyByZWNlaXZlZCA8L3RkPjwvdHI+CisgKgorICogPHRyPjx0ZD5HRVRfREVTQ1JJUFRPUiA8L3RkPjx0ZD5HYWRnZXQgRHJpdmVyIDwvdGQ+PHRkPlJldHVybiB0aGUKKyAqIHJlcXVlc3RlZCBkZXNjcmlwdG9yPC90ZD48L3RyPgorICoKKyAqIDx0cj48dGQ+U0VUX0RFU0NSSVBUT1IgPC90ZD48dGQ+R2FkZ2V0IERyaXZlciA8L3RkPjx0ZD5PcHRpb25hbCAtCisgKiBub3QgaW1wbGVtZW50ZWQgYnkgYW55IG9mIHRoZSBleGlzdGluZyBHYWRnZXQgRHJpdmVycy48L3RkPjwvdHI+CisgKgorICogPHRyPjx0ZD5TRVRfQ09ORklHVVJBVElPTiA8L3RkPjx0ZD5HYWRnZXQgRHJpdmVyIDwvdGQ+PHRkPkRpc2FibGUKKyAqIGFsbCBFUHMgYW5kIGVuYWJsZSBFUHMgZm9yIG5ldyBjb25maWd1cmF0aW9uLjwvdGQ+PC90cj4KKyAqCisgKiA8dHI+PHRkPkdFVF9DT05GSUdVUkFUSU9OIDwvdGQ+PHRkPkdhZGdldCBEcml2ZXIgPC90ZD48dGQ+UmV0dXJuCisgKiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uPC90ZD48L3RyPgorICoKKyAqIDx0cj48dGQ+U0VUX0lOVEVSRkFDRSA8L3RkPjx0ZD5HYWRnZXQgRHJpdmVyIDwvdGQ+PHRkPkRpc2FibGUgYWxsCisgKiBFUHMgYW5kIGVuYWJsZSBFUHMgZm9yIG5ldyBjb25maWd1cmF0aW9uLjwvdGQ+PC90cj4KKyAqCisgKiA8dHI+PHRkPkdFVF9JTlRFUkZBQ0UgPC90ZD48dGQ+R2FkZ2V0IERyaXZlciA8L3RkPjx0ZD5SZXR1cm4gdGhlCisgKiBjdXJyZW50IGludGVyZmFjZS48L3RkPjwvdHI+CisgKgorICogPHRyPjx0ZD5TWU5DX0ZSQU1FIDwvdGQ+PHRkPlBDRCA8L3RkPjx0ZD5EaXNwbGF5IGRlYnVnCisgKiBtZXNzYWdlLjwvdGQ+PC90cj4KKyAqIDwvdGFibGU+CisgKgorICogV2hlbiB0aGUgU0VUVVAgUGhhc2UgRG9uZSBpbnRlcnJ1cHQgb2NjdXJzLCB0aGUgUENEIFNFVFVQIGNvbW1hbmRzIGFyZQorICogcHJvY2Vzc2VkIGJ5IHBjZF9zZXR1cC4gQ2FsbGluZyB0aGUgRnVuY3Rpb24gRHJpdmVyJ3Mgc2V0dXAgZnVuY3Rpb24gZnJvbQorICogcGNkX3NldHVwIHByb2Nlc3NlcyB0aGUgZ2FkZ2V0IFNFVFVQIGNvbW1hbmRzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGNkX3NldHVwKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCWR3Y19vdGdfZGV2X2lmX3QgKmRldl9pZiA9IGNvcmVfaWYtPmRldl9pZjsKKwl1c2JfZGV2aWNlX3JlcXVlc3RfdCBjdHJsID0gcGNkLT5zZXR1cF9wa3QtPnJlcTsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDAgPSAmcGNkLT5lcDA7CisKKwlkZXB0c2l6MF9kYXRhX3QgZG9lcHRzaXplMCA9IHsuZDMyID0gMCB9OworCisjaWZkZWYgRFdDX1VURV9DRkkKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCBjZmlfcmVxOworI2VuZGlmCisKKyNpZmRlZiBERUJVR19FUDAKKwlEV0NfREVCVUdQTChEQkdfUENELCAiU0VUVVAgJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlMDR4XG4iLAorCQkgICAgY3RybC5ibVJlcXVlc3RUeXBlLCBjdHJsLmJSZXF1ZXN0LAorCQkgICAgVUdFVFcoY3RybC53VmFsdWUpLCBVR0VUVyhjdHJsLndJbmRleCksCisJCSAgICBVR0VUVyhjdHJsLndMZW5ndGgpKTsKKyNlbmRpZgorCisJZG9lcHRzaXplMC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5vdXRfZXBfcmVnc1swXS0+ZG9lcHRzaXopOworCisJLyoqIEB0b2RvIGhhbmRsZSA+IDEgc2V0dXAgcGFja2V0ICwgYXNzZXJ0IGVycm9yIGZvciBub3cgKi8KKworCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlICYmIGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSA9PSAwCisJICAgICYmIChkb2VwdHNpemUwLmIuc3VwY250IDwgMikpIHsKKwkJRFdDX0VSUk9SCisJCSAgICAoIlxuXG4tLS0tLS0tLS0tLQkgQ0FOTk9UIGhhbmRsZSA+IDEgc2V0dXAgcGFja2V0IGluIERNQSBtb2RlXG5cbiIpOworCX0KKworCS8qIENsZWFuIHVwIHRoZSByZXF1ZXN0IHF1ZXVlICovCisJZHdjX290Z19yZXF1ZXN0X251a2UoZXAwKTsKKwllcDAtPnN0b3BwZWQgPSAwOworCisJaWYgKGN0cmwuYm1SZXF1ZXN0VHlwZSAmIFVFX0RJUl9JTikgeworCQllcDAtPmR3Y19lcC5pc19pbiA9IDE7CisJCXBjZC0+ZXAwc3RhdGUgPSBFUDBfSU5fREFUQV9QSEFTRTsKKwl9IGVsc2UgeworCQllcDAtPmR3Y19lcC5pc19pbiA9IDA7CisJCXBjZC0+ZXAwc3RhdGUgPSBFUDBfT1VUX0RBVEFfUEhBU0U7CisJfQorCisJaWYgKFVHRVRXKGN0cmwud0xlbmd0aCkgPT0gMCkgeworCQllcDAtPmR3Y19lcC5pc19pbiA9IDE7CisJCXBjZC0+ZXAwc3RhdGUgPSBFUDBfSU5fU1RBVFVTX1BIQVNFOworCX0KKworCWlmIChVVF9HRVRfVFlQRShjdHJsLmJtUmVxdWVzdFR5cGUpICE9IFVUX1NUQU5EQVJEKSB7CisKKyNpZmRlZiBEV0NfVVRFX0NGSQorCQlEV0NfTUVNQ1BZKCZjZmlfcmVxLCAmY3RybCwgc2l6ZW9mKHVzYl9kZXZpY2VfcmVxdWVzdF90KSk7CisKKwkJLy9wcmludGsoS0VSTl9BTEVSVCAiQ0ZJOiByZXFfdHlwZT0weCUwMng7IHJlcT0weCUwMnhcbiIsIAorCQkJCWN0cmwuYlJlcXVlc3RUeXBlLCBjdHJsLmJSZXF1ZXN0KTsKKwkJaWYgKFVUX0dFVF9UWVBFKGNmaV9yZXEuYlJlcXVlc3RUeXBlKSA9PSBVVF9WRU5ET1IpIHsKKwkJCWlmIChjZmlfcmVxLmJSZXF1ZXN0ID4gMHhCMCAmJiBjZmlfcmVxLmJSZXF1ZXN0IDwgMHhCRikgeworCQkJCXJldHZhbCA9IGNmaV9zZXR1cChwY2QsICZjZmlfcmVxKTsKKwkJCQlpZiAocmV0dmFsIDwgMCkgeworCQkJCQllcDBfZG9fc3RhbGwocGNkLCByZXR2YWwpOworCQkJCQlwY2QtPmVwMF9wZW5kaW5nID0gMDsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCS8qIGlmIG5lZWQgZ2FkZ2V0IHNldHVwIHRoZW4gY2FsbCBpdCBhbmQgY2hlY2sgdGhlIHJldHZhbCAqLworCQkJCWlmIChwY2QtPmNmaS0+bmVlZF9nYWRnZXRfYXR0KSB7CisJCQkJCXJldHZhbCA9CisJCQkJCSAgICBjZmlfZ2FkZ2V0X3NldHVwKHBjZCwKKwkJCQkJCQkgICAgICZwY2QtPgorCQkJCQkJCSAgICAgY2ZpLT5jdHJsX3JlcSk7CisJCQkJCWlmIChyZXR2YWwgPCAwKSB7CisJCQkJCQlwY2QtPmVwMF9wZW5kaW5nID0gMDsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChwY2QtPmNmaS0+bmVlZF9zdGF0dXNfaW5fY29tcGxldGUpIHsKKwkJCQkJZG9fc2V0dXBfaW5fc3RhdHVzX3BoYXNlKHBjZCk7CisJCQkJfQorCQkJCXJldHVybjsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJLyogaGFuZGxlIG5vbi1zdGFuZGFyZCAoY2xhc3MvdmVuZG9yKSByZXF1ZXN0cyBpbiB0aGUgZ2FkZ2V0IGRyaXZlciAqLworCQlkb19nYWRnZXRfc2V0dXAocGNkLCAmY3RybCk7CisJCXJldHVybjsKKwl9CisKKwkvKiogQHRvZG8gTkdTOiBIYW5kbGUgYmFkIHNldHVwIHBhY2tldD8gKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLyAtLS0gU3RhbmRhcmQgUmVxdWVzdCBoYW5kbGluZyAtLS0gLy8vLworCisJc3dpdGNoIChjdHJsLmJSZXF1ZXN0KSB7CisJY2FzZSBVUl9HRVRfU1RBVFVTOgorCQlkb19nZXRfc3RhdHVzKHBjZCk7CisJCWJyZWFrOworCisJY2FzZSBVUl9DTEVBUl9GRUFUVVJFOgorCQlkb19jbGVhcl9mZWF0dXJlKHBjZCk7CisJCWJyZWFrOworCisJY2FzZSBVUl9TRVRfRkVBVFVSRToKKwkJZG9fc2V0X2ZlYXR1cmUocGNkKTsKKwkJYnJlYWs7CisKKwljYXNlIFVSX1NFVF9BRERSRVNTOgorCQlkb19zZXRfYWRkcmVzcyhwY2QpOworCQlicmVhazsKKworCWNhc2UgVVJfU0VUX0lOVEVSRkFDRToKKwljYXNlIFVSX1NFVF9DT05GSUc6CisvLyAgICAgICAgICAgICAgX3BjZC0+cmVxdWVzdF9jb25maWcgPSAxOyAgICAgICAvKiBDb25maWd1cmF0aW9uIGNoYW5nZWQgKi8KKwkJZG9fZ2FkZ2V0X3NldHVwKHBjZCwgJmN0cmwpOworCQlicmVhazsKKworCWNhc2UgVVJfU1lOQ0hfRlJBTUU6CisJCWRvX2dhZGdldF9zZXR1cChwY2QsICZjdHJsKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBDYWxsIHRoZSBHYWRnZXQgRHJpdmVyJ3Mgc2V0dXAgZnVuY3Rpb25zICovCisJCWRvX2dhZGdldF9zZXR1cChwY2QsICZjdHJsKTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gY29tcGxldGVzIHRoZSBlcDAgY29udHJvbCB0cmFuc2Zlci4KKyAqLworc3RhdGljIGludDMyX3QgZXAwX2NvbXBsZXRlX3JlcXVlc3QoZHdjX290Z19wY2RfZXBfdCAqIGVwKQoreworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gR0VUX0NPUkVfSUYoZXAtPnBjZCk7CisJZHdjX290Z19kZXZfaWZfdCAqZGV2X2lmID0gY29yZV9pZi0+ZGV2X2lmOworCWR3Y19vdGdfZGV2X2luX2VwX3JlZ3NfdCAqaW5fZXBfcmVncyA9CisJICAgIGRldl9pZi0+aW5fZXBfcmVnc1tlcC0+ZHdjX2VwLm51bV07CisjaWZkZWYgREVCVUdfRVAwCisJZHdjX290Z19kZXZfb3V0X2VwX3JlZ3NfdCAqb3V0X2VwX3JlZ3MgPQorCSAgICBkZXZfaWYtPm91dF9lcF9yZWdzW2VwLT5kd2NfZXAubnVtXTsKKyNlbmRpZgorCWRlcHRzaXowX2RhdGFfdCBkZXB0c2l6OworCWRldl9kbWFfZGVzY19zdHNfdCBkZXNjX3N0czsKKwlkd2Nfb3RnX3BjZF9yZXF1ZXN0X3QgKnJlcTsKKwlpbnQgaXNfbGFzdCA9IDA7CisJZHdjX290Z19wY2RfdCAqcGNkID0gZXAtPnBjZDsKKworI2lmZGVmIERXQ19VVEVfQ0ZJCisJc3RydWN0IGNmaV91c2JfY3RybHJlcXVlc3QgKmN0cmxyZXE7CisJaW50IHJldHZhbCA9IC1EV0NfRV9OT1RfU1VQUE9SVEVEOworI2VuZGlmCisKKwlpZiAocGNkLT5lcDBfcGVuZGluZyAmJiBEV0NfQ0lSQ0xFUV9FTVBUWSgmZXAtPnF1ZXVlKSkgeworCQlpZiAoZXAtPmR3Y19lcC5pc19pbikgeworI2lmZGVmIERFQlVHX0VQMAorCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICJEbyBzZXR1cCBPVVQgc3RhdHVzIHBoYXNlXG4iKTsKKyNlbmRpZgorCQkJZG9fc2V0dXBfb3V0X3N0YXR1c19waGFzZShwY2QpOworCQl9IGVsc2UgeworI2lmZGVmIERFQlVHX0VQMAorCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICJEbyBzZXR1cCBJTiBzdGF0dXMgcGhhc2VcbiIpOworI2VuZGlmCisKKyNpZmRlZiBEV0NfVVRFX0NGSQorCQkJY3RybHJlcSA9ICZwY2QtPmNmaS0+Y3RybF9yZXE7CisKKwkJCWlmIChVVF9HRVRfVFlQRShjdHJscmVxLT5iUmVxdWVzdFR5cGUpID09IFVUX1ZFTkRPUikgeworCQkJCWlmIChjdHJscmVxLT5iUmVxdWVzdCA+IDB4QjAKKwkJCQkgICAgJiYgY3RybHJlcS0+YlJlcXVlc3QgPCAweEJGKSB7CisKKwkJCQkJLyogUmV0dXJuIGlmIHRoZSBQQ0QgZmFpbGVkIHRvIGhhbmRsZSB0aGUgcmVxdWVzdCAqLworCQkJCQlpZiAoKHJldHZhbCA9CisJCQkJCSAgICAgcGNkLT5jZmktPm9wcy4KKwkJCQkJICAgICBjdHJsX3dyaXRlX2NvbXBsZXRlKHBjZC0+Y2ZpLAorCQkJCQkJCQkgcGNkKSkgPCAwKSB7CisJCQkJCQlDRklfSU5GTworCQkJCQkJICAgICgiRVJST1Igc2V0dGluZyBhIG5ldyB2YWx1ZSBpbiB0aGUgUENEKCVkKVxuIiwKKwkJCQkJCSAgICAgcmV0dmFsKTsKKwkJCQkJCWVwMF9kb19zdGFsbChwY2QsIHJldHZhbCk7CisJCQkJCQlwY2QtPmVwMF9wZW5kaW5nID0gMDsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisKKwkJCQkJLyogSWYgdGhlIGdhZGdldCBuZWVkcyB0byBiZSBub3RpZmllZCBvbiB0aGUgcmVxdWVzdCAqLworCQkJCQlpZiAocGNkLT5jZmktPm5lZWRfZ2FkZ2V0X2F0dCA9PSAxKSB7CisJCQkJCQkvL3JldHZhbCA9IGRvX2dhZGdldF9zZXR1cChwY2QsICZwY2QtPmNmaS0+Y3RybF9yZXEpOworCQkJCQkJcmV0dmFsID0KKwkJCQkJCSAgICBjZmlfZ2FkZ2V0X3NldHVwKHBjZCwKKwkJCQkJCQkJICAgICAmcGNkLT5jZmktPgorCQkJCQkJCQkgICAgIGN0cmxfcmVxKTsKKworCQkJCQkJLyogUmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uIGlmIHRoZSBnYWRnZXQgZmFpbGVkIHRvIHByb2Nlc3MKKwkJCQkJCSAqIHRoZSByZXF1ZXN0IHByb3Blcmx5IC0gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICEhIQorCQkJCQkJICovCisJCQkJCQlpZiAocmV0dmFsIDwgMCkgeworCQkJCQkJCUNGSV9JTkZPCisJCQkJCQkJICAgICgiRVJST1Igc2V0dGluZyBhIG5ldyB2YWx1ZSBpbiB0aGUgZ2FkZ2V0KCVkKVxuIiwKKwkJCQkJCQkgICAgIHJldHZhbCk7CisJCQkJCQkJcGNkLT5lcDBfcGVuZGluZyA9IDA7CisJCQkJCQkJcmV0dXJuIDA7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlDRklfSU5GTygiJXM6IFJFVFZBTD0lZFxuIiwgX19mdW5jX18sCisJCQkJCQkgcmV0dmFsKTsKKwkJCQkJLyogSWYgd2UgaGl0IGhlcmUgdGhlbiB0aGUgUENEIGFuZCB0aGUgZ2FkZ2V0IGhhcyBwcm9wZXJseQorCQkJCQkgKiBoYW5kbGVkIHRoZSByZXF1ZXN0IC0gc28gc2VuZCB0aGUgWkxQIElOIHRvIHRoZSBob3N0LgorCQkJCQkgKi8KKwkJCQkJLyogQHRvZG86IE1BUyAtIGRlY2lkZSB3aGV0aGVyIHdlIG5lZWQgdG8gc3RhcnQgdGhlIHNldHVwCisJCQkJCSAqIHN0YWdlIGJhc2VkIG9uIHRoZSBuZWVkX3NldHVwIHZhbHVlIG9mIHRoZSBjZmkgb2JqZWN0CisJCQkJCSAqLworCQkJCQlkb19zZXR1cF9pbl9zdGF0dXNfcGhhc2UocGNkKTsKKwkJCQkJcGNkLT5lcDBfcGVuZGluZyA9IDA7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCisJCQlkb19zZXR1cF9pbl9zdGF0dXNfcGhhc2UocGNkKTsKKwkJfQorCQlwY2QtPmVwMF9wZW5kaW5nID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKERXQ19DSVJDTEVRX0VNUFRZKCZlcC0+cXVldWUpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXEgPSBEV0NfQ0lSQ0xFUV9GSVJTVCgmZXAtPnF1ZXVlKTsKKworCWlmIChwY2QtPmVwMHN0YXRlID09IEVQMF9PVVRfU1RBVFVTX1BIQVNFCisJICAgIHx8IHBjZC0+ZXAwc3RhdGUgPT0gRVAwX0lOX1NUQVRVU19QSEFTRSkgeworCQlpc19sYXN0ID0gMTsKKwl9IGVsc2UgaWYgKGVwLT5kd2NfZXAuaXNfaW4pIHsKKwkJZGVwdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmaW5fZXBfcmVncy0+ZGllcHRzaXopOworCQlpZiAoY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlICE9IDApCisJCQlkZXNjX3N0cyA9IGRldl9pZi0+aW5fZGVzY19hZGRyLT5zdGF0dXM7CisjaWZkZWYgREVCVUdfRVAwCisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiJWQgbGVuPSVkICB4ZmVyc2l6ZT0lZCBwa3RjbnQ9JWRcbiIsCisJCQkgICAgZXAtPmR3Y19lcC5udW0sIGVwLT5kd2NfZXAueGZlcl9sZW4sCisJCQkgICAgZGVwdHNpei5iLnhmZXJzaXplLCBkZXB0c2l6LmIucGt0Y250KTsKKyNlbmRpZgorCisJCWlmICgoKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSA9PSAwKQorCQkgICAgICYmIChkZXB0c2l6LmIueGZlcnNpemUgPT0gMCkpCisJCSAgICB8fCAoKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSAhPSAwKQorCQkJJiYgKGRlc2Nfc3RzLmIuYnl0ZXMgPT0gMCkpKSB7CisJCQlyZXEtPmFjdHVhbCA9IGVwLT5kd2NfZXAueGZlcl9jb3VudDsKKwkJCS8qIElzIGEgWmVybyBMZW4gUGFja2V0IG5lZWRlZD8gKi8KKwkJCWlmIChyZXEtPnNlbnRfemxwKSB7CisjaWZkZWYgREVCVUdfRVAwCisJCQkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIlNldHVwIFJ4IFpMUFxuIik7CisjZW5kaWYKKwkJCQlyZXEtPnNlbnRfemxwID0gMDsKKwkJCX0KKwkJCWRvX3NldHVwX291dF9zdGF0dXNfcGhhc2UocGNkKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGVwMC1PVVQgKi8KKyNpZmRlZiBERUJVR19FUDAKKwkJZGVwdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmb3V0X2VwX3JlZ3MtPmRvZXB0c2l6KTsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlZCBsZW49JWQgeHNpemU9JWQgcGt0Y250PSVkXG4iLAorCQkJICAgIGVwLT5kd2NfZXAubnVtLCBlcC0+ZHdjX2VwLnhmZXJfbGVuLAorCQkJICAgIGRlcHRzaXouYi54ZmVyc2l6ZSwgZGVwdHNpei5iLnBrdGNudCk7CisjZW5kaWYKKwkJcmVxLT5hY3R1YWwgPSBlcC0+ZHdjX2VwLnhmZXJfY291bnQ7CisKKwkJLyogSXMgYSBaZXJvIExlbiBQYWNrZXQgbmVlZGVkPyAqLworCQlpZiAocmVxLT5zZW50X3pscCkgeworI2lmZGVmIERFQlVHX0VQMAorCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICJTZXR1cCBUeCBaTFBcbiIpOworI2VuZGlmCisJCQlyZXEtPnNlbnRfemxwID0gMDsKKwkJfQorCQlpZiAoY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlID09IDApCisJCQlkb19zZXR1cF9pbl9zdGF0dXNfcGhhc2UocGNkKTsKKwl9CisKKwkvKiBDb21wbGV0ZSB0aGUgcmVxdWVzdCAqLworCWlmIChpc19sYXN0KSB7CisJCWR3Y19vdGdfcmVxdWVzdF9kb25lKGVwLCByZXEsIDApOworCQllcC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9IDA7CisJCWVwLT5kd2NfZXAueGZlcl9idWZmID0gMDsKKwkJZXAtPmR3Y19lcC54ZmVyX2xlbiA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERXQ19VVEVfQ0ZJCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0cmF2ZXJzZXMgYWxsIHRoZSBDRkkgRE1BIGRlc2NyaXB0b3JzIGFuZAorICogYW5kIGFjY3VtdWxhdGVzIHRoZSBieXRlcyB0aGF0IGFyZSBsZWZ0IHRvIGJlIHRyYW5zZmVyZWQuCisgKgorICogQHJldHVybiBUaGUgdG90YWwgYnl0ZXMgbGVmdCB0byB0cmFuc2ZlcmVkLCBvciBhIG5lZ2F0aXZlIHZhbHVlIGFzIGZhaWx1cmUKKyAqLworc3RhdGljIGlubGluZSBpbnQgY2ZpX2NhbGNfZGVzY19yZXNpZHVlKGR3Y19vdGdfcGNkX2VwX3QgKiBlcCkKK3sKKwlpbnQzMl90IHJldCA9IDA7CisJaW50IGk7CisJc3RydWN0IGR3Y19vdGdfZG1hX2Rlc2MgKmRkZXNjID0gTlVMTDsKKwlzdHJ1Y3QgY2ZpX2VwICpjZmllcDsKKworCS8qIFNlZSBpZiB0aGUgcGNkX2VwIGhhcyBpdHMgcmVzcGVjdGl2ZSBjZmlfZXAgbWFwcGVkICovCisJY2ZpZXAgPSBnZXRfY2ZpX2VwX2J5X3BjZF9lcChlcC0+cGNkLT5jZmksIGVwKTsKKwlpZiAoIWNmaWVwKSB7CisJCUNGSV9JTkZPKCIlczogRmFpbGVkIHRvIGZpbmQgZXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWRkZXNjID0gZXAtPmR3Y19lcC5kZXNjczsKKworCWZvciAoaSA9IDA7IChpIDwgY2ZpZXAtPmRlc2NfY291bnQpICYmIChpIDwgTUFYX0RNQV9ERVNDU19QRVJfRVApOyBpKyspIHsKKworI2lmIGRlZmluZWQoUFJJTlRfQ0ZJX0RNQV9ERVNDUykKKwkJcHJpbnRfZGVzYyhkZGVzYywgZXAtPmVwLm5hbWUsIGkpOworI2VuZGlmCisJCXJldCArPSBkZGVzYy0+c3RhdHVzLmIuYnl0ZXM7CisJCWRkZXNjKys7CisJfQorCisJaWYgKHJldCkKKwkJQ0ZJX0lORk8oIiEhISEhISEhISEgV0FSTklORyAoJXMpIC0gcmVzaWR1ZT0lZFxuIiwgX19mdW5jX18sCisJCQkgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbXBsZXRlcyB0aGUgcmVxdWVzdCBmb3IgdGhlIEVQLiBJZiB0aGVyZSBhcmUKKyAqIGFkZGl0aW9uYWwgcmVxdWVzdHMgZm9yIHRoZSBFUCBpbiB0aGUgcXVldWUgdGhleSB3aWxsIGJlIHN0YXJ0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNvbXBsZXRlX2VwKGR3Y19vdGdfcGNkX2VwX3QgKiBlcCkKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKGVwLT5wY2QpOworCWR3Y19vdGdfZGV2X2lmX3QgKmRldl9pZiA9IGNvcmVfaWYtPmRldl9pZjsKKwlkd2Nfb3RnX2Rldl9pbl9lcF9yZWdzX3QgKmluX2VwX3JlZ3MgPQorCSAgICBkZXZfaWYtPmluX2VwX3JlZ3NbZXAtPmR3Y19lcC5udW1dOworCWRlcHRzaXpfZGF0YV90IGRlcHRzaXo7CisJZGV2X2RtYV9kZXNjX3N0c190IGRlc2Nfc3RzOworCWR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqcmVxID0gMDsKKwlkd2Nfb3RnX2Rldl9kbWFfZGVzY190ICpkbWFfZGVzYzsKKwl1aW50MzJfdCBieXRlX2NvdW50ID0gMDsKKwlpbnQgaXNfbGFzdCA9IDA7CisJaW50IGk7CisKKwlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzKCkgJWQtJXNcbiIsIF9fZnVuY19fLCBlcC0+ZHdjX2VwLm51bSwKKwkJICAgIChlcC0+ZHdjX2VwLmlzX2luID8gIklOIiA6ICJPVVQiKSk7CisKKwkvKiBHZXQgYW55IHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlpZiAoIURXQ19DSVJDTEVRX0VNUFRZKCZlcC0+cXVldWUpKSB7CisJCXJlcSA9IERXQ19DSVJDTEVRX0ZJUlNUKCZlcC0+cXVldWUpOworCQlpZiAoIXJlcSkgeworCQkJRFdDX1BSSU5URigiY29tcGxldGVfZXAgMHglcCwgcmVxID0gTlVMTCFcbiIsIGVwKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCURXQ19QUklOVEYoImNvbXBsZXRlX2VwIDB4JXAsIGVwLT5xdWV1ZSBlbXB0eSFcbiIsIGVwKTsKKwkJcmV0dXJuOworCX0KKworCURXQ19ERUJVR1BMKERCR19QQ0QsICJSZXF1ZXN0cyAlZFxuIiwgZXAtPnBjZC0+cmVxdWVzdF9wZW5kaW5nKTsKKworCWlmIChlcC0+ZHdjX2VwLmlzX2luKSB7CisJCWRlcHRzaXouZDMyID0gRFdDX1JFQURfUkVHMzIoJmluX2VwX3JlZ3MtPmRpZXB0c2l6KTsKKworCQlpZiAoY29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSA9PSAwKSB7CisJCQkJaWYgKGRlcHRzaXouYi54ZmVyc2l6ZSA9PSAwCisJCQkJICAgICYmIGRlcHRzaXouYi5wa3RjbnQgPT0gMCkgeworCQkJCQlieXRlX2NvdW50ID0KKwkJCQkJICAgIGVwLT5kd2NfZXAueGZlcl9sZW4gLQorCQkJCQkgICAgZXAtPmR3Y19lcC54ZmVyX2NvdW50OworCisJCQkJCWVwLT5kd2NfZXAueGZlcl9idWZmICs9IGJ5dGVfY291bnQ7CisJCQkJCWVwLT5kd2NfZXAuZG1hX2FkZHIgKz0gYnl0ZV9jb3VudDsKKwkJCQkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ICs9IGJ5dGVfY291bnQ7CisKKwkJCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsCisJCQkJCQkgICAgIiVkLSVzIGxlbj0lZCAgeGZlcnNpemU9JWQgcGt0Y250PSVkXG4iLAorCQkJCQkJICAgIGVwLT5kd2NfZXAubnVtLAorCQkJCQkJICAgIChlcC0+ZHdjX2VwLgorCQkJCQkJICAgICBpc19pbiA/ICJJTiIgOiAiT1VUIiksCisJCQkJCQkgICAgZXAtPmR3Y19lcC54ZmVyX2xlbiwKKwkJCQkJCSAgICBkZXB0c2l6LmIueGZlcnNpemUsCisJCQkJCQkgICAgZGVwdHNpei5iLnBrdGNudCk7CisKKwkJCQkJaWYgKGVwLT5kd2NfZXAueGZlcl9sZW4gPAorCQkJCQkgICAgZXAtPmR3Y19lcC50b3RhbF9sZW4pIHsKKwkJCQkJCWR3Y19vdGdfZXBfc3RhcnRfdHJhbnNmZXIKKwkJCQkJCSAgICAoY29yZV9pZiwgJmVwLT5kd2NfZXApOworCQkJCQl9IGVsc2UgaWYgKGVwLT5kd2NfZXAuc2VudF96bHApIHsKKwkJCQkJCS8qICAgICAKKwkJCQkJCSAqIFRoaXMgZnJhZ21lbnQgb2YgY29kZSBzaG91bGQgaW5pdGlhdGUgMAorCQkJCQkJICogbGVuZ3RoIHRyYW5zZmVyIGluIGNhc2UgaWYgaXQgaXMgcXVldWVkCisJCQkJCQkgKiBhIHRyYW5zZmVyIHdpdGggc2l6ZSBkaXZpc2libGUgdG8gRVBzIG1heAorCQkJCQkJICogcGFja2V0IHNpemUgYW5kIHdpdGggdXNiX3JlcXVlc3QgemVybyBmaWVsZAorCQkJCQkJICogaXMgc2V0LCB3aGljaCBtZWFucyB0aGF0IGFmdGVyIGRhdGEgaXMgdHJhbnNmZXJlZCwKKwkJCQkJCSAqIGl0IGlzIGFsc28gc2hvdWxkIGJlIHRyYW5zZmVyZWQKKwkJCQkJCSAqIGEgMCBsZW5ndGggcGFja2V0IGF0IHRoZSBlbmQuIEZvciBTbGF2ZSBhbmQKKwkJCQkJCSAqIEJ1ZmZlciBETUEgbW9kZXMgaW4gdGhpcyBjYXNlIFNXIGhhcworCQkJCQkJICogdG8gaW5pdGlhdGUgMiB0cmFuc2ZlcnMgb25lIHdpdGggdHJhbnNmZXIgc2l6ZSwKKwkJCQkJCSAqIGFuZCB0aGUgc2Vjb25kIHdpdGggMCBzaXplLiBGb3IgRGVzY3JpcHRvcgorCQkJCQkJICogRE1BIG1vZGUgU1cgaXMgYWJsZSB0byBpbml0aWF0ZSBhIHRyYW5zZmVyLAorCQkJCQkJICogd2hpY2ggd2lsbCBoYW5kbGUgYWxsIHRoZSBwYWNrZXRzIGluY2x1ZGluZworCQkJCQkJICogdGhlIGxhc3QgIDAgbGVuZ3RoLgorCQkJCQkJICovCisJCQkJCQllcC0+ZHdjX2VwLnNlbnRfemxwID0gMDsKKwkJCQkJCWR3Y19vdGdfZXBfc3RhcnRfemxfdHJhbnNmZXIKKwkJCQkJCSAgICAoY29yZV9pZiwgJmVwLT5kd2NfZXApOworCQkJCQl9IGVsc2UgeworCQkJCQkJaXNfbGFzdCA9IDE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZihlcC0+ZHdjX2VwLnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpCisJCQkJCXsKKwkJCQkJCXJlcS0+YWN0dWFsID0gMDsKKwkJCQkJCWR3Y19vdGdfcmVxdWVzdF9kb25lKGVwLCByZXEsIDApOworCisJCQkJCQllcC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9IDA7CisJCQkJCQllcC0+ZHdjX2VwLnhmZXJfYnVmZiA9IDA7CisJCQkJCQllcC0+ZHdjX2VwLnhmZXJfbGVuID0gMDsKKworCQkJCQkJLyogSWYgdGhlcmUgaXMgYSByZXF1ZXN0IGluIHRoZSBxdWV1ZSBzdGFydCBpdC4gKi8KKwkJCQkJCXN0YXJ0X25leHRfcmVxdWVzdChlcCk7CisJCQkJCX0gZWxzZQorCQkJCQkJRFdDX1dBUk4KKwkJCQkJCSgiSW5jb21wbGV0ZSB0cmFuc2ZlciAoJWQgLSAlcyBbc2l6PSVkIHBrdD0lZF0pXG4iLAorCQkJCQkJZXAtPmR3Y19lcC5udW0sCisJCQkJCQkoZXAtPmR3Y19lcC5pc19pbiA/ICJJTiIgOiAiT1VUIiksCisJCQkJCQlkZXB0c2l6LmIueGZlcnNpemUsCisJCQkJCQlkZXB0c2l6LmIucGt0Y250KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWRtYV9kZXNjID0gZXAtPmR3Y19lcC5kZXNjX2FkZHI7CisJCQkJYnl0ZV9jb3VudCA9IDA7CisJCQkJZXAtPmR3Y19lcC5zZW50X3pscCA9IDA7CisKKyNpZmRlZiBEV0NfVVRFX0NGSQorCQkJCUNGSV9JTkZPKCIlczogQlVGRkVSX01PREU9JWRcbiIsIF9fZnVuY19fLAorCQkJCQkgZXAtPmR3Y19lcC5idWZmX21vZGUpOworCQkJCWlmIChlcC0+ZHdjX2VwLmJ1ZmZfbW9kZSAhPSBCTV9TVEFOREFSRCkgeworCQkJCQlpbnQgcmVzaWR1ZTsKKworCQkJCQlyZXNpZHVlID0gY2ZpX2NhbGNfZGVzY19yZXNpZHVlKGVwKTsKKwkJCQkJaWYgKHJlc2lkdWUgPCAwKQorCQkJCQkJcmV0dXJuOworCisJCQkJCWJ5dGVfY291bnQgPSByZXNpZHVlOworCQkJCX0gZWxzZSB7CisjZW5kaWYKKwkJCQkJZm9yIChpID0gMDsgaSA8IGVwLT5kd2NfZXAuZGVzY19jbnQ7CisJCQkJCSAgICAgKytpKSB7CisJCQkJCWRlc2Nfc3RzID0gZG1hX2Rlc2MtPnN0YXR1czsKKwkJCQkJYnl0ZV9jb3VudCArPSBkZXNjX3N0cy5iLmJ5dGVzOworCQkJCQlkbWFfZGVzYysrOworCQkJCX0KKyNpZmRlZiBEV0NfVVRFX0NGSQorCQkJCX0KKyNlbmRpZgorCQkJCWlmIChieXRlX2NvdW50ID09IDApIHsKKwkJCQkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ID0KKwkJCQkJICAgIGVwLT5kd2NfZXAudG90YWxfbGVuOworCQkJCQlpc19sYXN0ID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlEV0NfV0FSTigiSW5jb21wbGV0ZSB0cmFuc2ZlclxuIik7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGRlcHRzaXouYi54ZmVyc2l6ZSA9PSAwICYmIGRlcHRzaXouYi5wa3RjbnQgPT0gMCkgeworCQkJCURXQ19ERUJVR1BMKERCR19QQ0RWLAorCQkJCQkgICAgIiVkLSVzIGxlbj0lZCAgeGZlcnNpemU9JWQgcGt0Y250PSVkXG4iLAorCQkJCQkgICAgZXAtPmR3Y19lcC5udW0sCisJCQkJCSAgICBlcC0+ZHdjX2VwLmlzX2luID8gIklOIiA6ICJPVVQiLAorCQkJCQkgICAgZXAtPmR3Y19lcC54ZmVyX2xlbiwKKwkJCQkJICAgIGRlcHRzaXouYi54ZmVyc2l6ZSwKKwkJCQkJICAgIGRlcHRzaXouYi5wa3RjbnQpOworCisJCQkJLyogICAgICBDaGVjayBpZiB0aGUgd2hvbGUgdHJhbnNmZXIgd2FzIGNvbXBsZXRlZCwgCisJCQkJICogICAgICBpZiBubywgc2V0dXAgdHJhbnNmZXIgZm9yIG5leHQgcG9ydGlvbiBvZiBkYXRhCisJCQkJICovCisJCQkJaWYgKGVwLT5kd2NfZXAueGZlcl9sZW4gPCBlcC0+ZHdjX2VwLnRvdGFsX2xlbikgeworCQkJCQlkd2Nfb3RnX2VwX3N0YXJ0X3RyYW5zZmVyKGNvcmVfaWYsCisJCQkJCQkJCSAgJmVwLT5kd2NfZXApOworCQkJCX0gZWxzZSBpZiAoZXAtPmR3Y19lcC5zZW50X3pscCkgeworCQkJCQkvKiAgICAgCisJCQkJCSAqIFRoaXMgZnJhZ21lbnQgb2YgY29kZSBzaG91bGQgaW5pdGlhdGUgMAorCQkJCQkgKiBsZW5ndGggdHJhc2ZlciBpbiBjYXNlIGlmIGl0IGlzIHF1ZXVlZAorCQkJCQkgKiBhIHRyYXNmZXIgd2l0aCBzaXplIGRpdmlzaWJsZSB0byBFUHMgbWF4CisJCQkJCSAqIHBhY2tldCBzaXplIGFuZCB3aXRoIHVzYl9yZXF1ZXN0IHplcm8gZmllbGQKKwkJCQkJICogaXMgc2V0LCB3aGljaCBtZWFucyB0aGF0IGFmdGVyIGRhdGEgaXMgdHJhbnNmZXJlZCwKKwkJCQkJICogaXQgaXMgYWxzbyBzaG91bGQgYmUgdHJhbnNmZXJlZAorCQkJCQkgKiBhIDAgbGVuZ3RoIHBhY2tldCBhdCB0aGUgZW5kLiBGb3IgU2xhdmUgYW5kCisJCQkJCSAqIEJ1ZmZlciBETUEgbW9kZXMgaW4gdGhpcyBjYXNlIFNXIGhhcworCQkJCQkgKiB0byBpbml0aWF0ZSAyIHRyYW5zZmVycyBvbmUgd2l0aCB0cmFuc2ZlciBzaXplLAorCQkJCQkgKiBhbmQgdGhlIHNlY29uZCB3aXRoIDAgc2l6ZS4gRm9yIERlc3JpcHRvcgorCQkJCQkgKiBETUEgbW9kZSBTVyBpcyBhYmxlIHRvIGluaXRpYXRlIGEgdHJhbnNmZXIsCisJCQkJCSAqIHdoaWNoIHdpbGwgaGFuZGxlIGFsbCB0aGUgcGFja2V0cyBpbmNsdWRpbmcKKwkJCQkJICogdGhlIGxhc3QgIDAgbGVndGguCisJCQkJCSAqLworCQkJCQllcC0+ZHdjX2VwLnNlbnRfemxwID0gMDsKKwkJCQkJZHdjX290Z19lcF9zdGFydF96bF90cmFuc2Zlcihjb3JlX2lmLAorCQkJCQkJCQkgICAgICZlcC0+ZHdjX2VwKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpc19sYXN0ID0gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCURXQ19XQVJOCisJCQkJICAgICgiSW5jb21wbGV0ZSB0cmFuc2ZlciAoJWQtJXMgW3Npej0lZCBwa3Q9JWRdKVxuIiwKKwkJCQkgICAgIGVwLT5kd2NfZXAubnVtLAorCQkJCSAgICAgKGVwLT5kd2NfZXAuaXNfaW4gPyAiSU4iIDogIk9VVCIpLAorCQkJCSAgICAgZGVwdHNpei5iLnhmZXJzaXplLCBkZXB0c2l6LmIucGt0Y250KTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWR3Y19vdGdfZGV2X291dF9lcF9yZWdzX3QgKm91dF9lcF9yZWdzID0KKwkJICAgIGRldl9pZi0+b3V0X2VwX3JlZ3NbZXAtPmR3Y19lcC5udW1dOworCQlkZXNjX3N0cy5kMzIgPSAwOworCQlpZiAoY29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJCWRtYV9kZXNjID0gZXAtPmR3Y19lcC5kZXNjX2FkZHI7CisJCQkJYnl0ZV9jb3VudCA9IDA7CisJCQkJZXAtPmR3Y19lcC5zZW50X3pscCA9IDA7CisKKyNpZmRlZiBEV0NfVVRFX0NGSQorCQkJCUNGSV9JTkZPKCIlczogQlVGRkVSX01PREU9JWRcbiIsIF9fZnVuY19fLAorCQkJCQkgZXAtPmR3Y19lcC5idWZmX21vZGUpOworCQkJCWlmIChlcC0+ZHdjX2VwLmJ1ZmZfbW9kZSAhPSBCTV9TVEFOREFSRCkgeworCQkJCQlpbnQgcmVzaWR1ZTsKKwkJCQkJcmVzaWR1ZSA9IGNmaV9jYWxjX2Rlc2NfcmVzaWR1ZShlcCk7CisJCQkJCWlmIChyZXNpZHVlIDwgMCkKKwkJCQkJCXJldHVybjsKKwkJCQkJYnl0ZV9jb3VudCA9IHJlc2lkdWU7CisJCQkJfSBlbHNlIHsKKyNlbmRpZgorCisJCQkJCWZvciAoaSA9IDA7IGkgPCBlcC0+ZHdjX2VwLmRlc2NfY250OworCQkJCQkgICAgICsraSkgeworCQkJCQkJZGVzY19zdHMgPSBkbWFfZGVzYy0+c3RhdHVzOworCQkJCQkJYnl0ZV9jb3VudCArPSBkZXNjX3N0cy5iLmJ5dGVzOworCQkJCQkJZG1hX2Rlc2MrKzsKKwkJCQkJfQorCisjaWZkZWYgRFdDX1VURV9DRkkKKwkJCQl9CisjZW5kaWYKKwkJCQkvKiBDaGVja2luZyBmb3IgaW50ZXJydXB0IE91dCB0cmFuc2ZlcnMgd2l0aCBub3QgCisJCQkJICogZHdvcmQgYWxpZ25lZCBtcHMgc2l6ZXMgCisJCQkJICovCisJCQkJaWYgKGVwLT5kd2NfZXAudHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSU5UUiAmJgorCQkJCQkJCShlcC0+ZHdjX2VwLm1heHBhY2tldCU0KSkgeworCQkJCQllcC0+ZHdjX2VwLnhmZXJfY291bnQgPSBlcC0+ZHdjX2VwLnRvdGFsX2xlbiAtIGJ5dGVfY291bnQ7CisJCQkJCWlmICgoZXAtPmR3Y19lcC54ZmVyX2xlbiAlIGVwLT5kd2NfZXAubWF4cGFja2V0KSAmJgorCQkJCQkJKGVwLT5kd2NfZXAueGZlcl9sZW4vZXAtPmR3Y19lcC5tYXhwYWNrZXQgPCBNQVhfRE1BX0RFU0NfQ05UKSkKKwkJCQkJCWVwLT5kd2NfZXAueGZlcl9sZW4gLT0KKwkJCQkJCQkoZXAtPmR3Y19lcC5kZXNjX2NudCAtIDEpICogZXAtPmR3Y19lcC5tYXhwYWNrZXQgKworCQkJCQkJCQkJZXAtPmR3Y19lcC54ZmVyX2xlbiAlIGVwLT5kd2NfZXAubWF4cGFja2V0OworCQkJCQllbHNlCQkJCQkJCisJCQkJCQllcC0+ZHdjX2VwLnhmZXJfbGVuIC09CisJCQkJCQkJCQllcC0+ZHdjX2VwLmRlc2NfY250ICogZXAtPmR3Y19lcC5tYXhwYWNrZXQ7CisJCQkJCWlmIChlcC0+ZHdjX2VwLnhmZXJfbGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlkd2Nfb3RnX2VwX3N0YXJ0X3RyYW5zZmVyKGNvcmVfaWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXAtPmR3Y19lcCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpc19sYXN0ID0gMTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWVwLT5kd2NfZXAueGZlcl9jb3VudCA9IGVwLT5kd2NfZXAudG90YWxfbGVuCisJCQkJCQktIGJ5dGVfY291bnQgKworCQkJCQkJKCg0IC0gKGVwLT5kd2NfZXAudG90YWxfbGVuICYgMHgzKSkgJiAweDMpOworCQkJCQlpc19sYXN0ID0gMTsKKwkJCQl9CQorCQkJfSBlbHNlIHsKKwkJCQlkZXB0c2l6LmQzMiA9IDA7CisJCQkJZGVwdHNpei5kMzIgPQorCQkJCSAgICBEV0NfUkVBRF9SRUczMigmb3V0X2VwX3JlZ3MtPmRvZXB0c2l6KTsKKworCQkJCWJ5dGVfY291bnQgPSAoZXAtPmR3Y19lcC54ZmVyX2xlbiAtCisJCQkJCSAgICAgIGVwLT5kd2NfZXAueGZlcl9jb3VudCAtCisJCQkJCSAgICAgIGRlcHRzaXouYi54ZmVyc2l6ZSk7CisJCQkJZXAtPmR3Y19lcC54ZmVyX2J1ZmYgKz0gYnl0ZV9jb3VudDsKKwkJCQllcC0+ZHdjX2VwLmRtYV9hZGRyICs9IGJ5dGVfY291bnQ7CisJCQkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ICs9IGJ5dGVfY291bnQ7CisKKwkJCQkvKiAgICAgIENoZWNrIGlmIHRoZSB3aG9sZSB0cmFuc2ZlciB3YXMgY29tcGxldGVkLCAKKwkJCQkgKiAgICAgIGlmIG5vLCBzZXR1cCB0cmFuc2ZlciBmb3IgbmV4dCBwb3J0aW9uIG9mIGRhdGEKKwkJCQkgKi8KKwkJCQlpZiAoZXAtPmR3Y19lcC54ZmVyX2xlbiA8IGVwLT5kd2NfZXAudG90YWxfbGVuKSB7CisJCQkJCWR3Y19vdGdfZXBfc3RhcnRfdHJhbnNmZXIoY29yZV9pZiwKKwkJCQkJCQkJICAmZXAtPmR3Y19lcCk7CisJCQkJfSBlbHNlIGlmIChlcC0+ZHdjX2VwLnNlbnRfemxwKSB7CisJCQkJCS8qICAgICAKKwkJCQkJICogVGhpcyBmcmFnbWVudCBvZiBjb2RlIHNob3VsZCBpbml0aWF0ZSAwCisJCQkJCSAqIGxlbmd0aCB0cmFzZmVyIGluIGNhc2UgaWYgaXQgaXMgcXVldWVkCisJCQkJCSAqIGEgdHJhc2ZlciB3aXRoIHNpemUgZGl2aXNpYmxlIHRvIEVQcyBtYXgKKwkJCQkJICogcGFja2V0IHNpemUgYW5kIHdpdGggdXNiX3JlcXVlc3QgemVybyBmaWVsZAorCQkJCQkgKiBpcyBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgYWZ0ZXIgZGF0YSBpcyB0cmFuc2ZlcmVkLAorCQkJCQkgKiBpdCBpcyBhbHNvIHNob3VsZCBiZSB0cmFuc2ZlcmVkCisJCQkJCSAqIGEgMCBsZW5ndGggcGFja2V0IGF0IHRoZSBlbmQuIEZvciBTbGF2ZSBhbmQKKwkJCQkJICogQnVmZmVyIERNQSBtb2RlcyBpbiB0aGlzIGNhc2UgU1cgaGFzCisJCQkJCSAqIHRvIGluaXRpYXRlIDIgdHJhbnNmZXJzIG9uZSB3aXRoIHRyYW5zZmVyIHNpemUsCisJCQkJCSAqIGFuZCB0aGUgc2Vjb25kIHdpdGggMCBzaXplLiBGb3IgRGVzcmlwdG9yCisJCQkJCSAqIERNQSBtb2RlIFNXIGlzIGFibGUgdG8gaW5pdGlhdGUgYSB0cmFuc2ZlciwKKwkJCQkJICogd2hpY2ggd2lsbCBoYW5kbGUgYWxsIHRoZSBwYWNrZXRzIGluY2x1ZGluZworCQkJCQkgKiB0aGUgbGFzdCAgMCBsZWd0aC4KKwkJCQkJICovCisJCQkJCWVwLT5kd2NfZXAuc2VudF96bHAgPSAwOworCQkJCQlkd2Nfb3RnX2VwX3N0YXJ0X3psX3RyYW5zZmVyKGNvcmVfaWYsCisJCQkJCQkJCSAgICAgJmVwLT5kd2NfZXApOworCQkJCX0gZWxzZSB7CisJCQkJCWlzX2xhc3QgPSAxOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qICAgICAgQ2hlY2sgaWYgdGhlIHdob2xlIHRyYW5zZmVyIHdhcyBjb21wbGV0ZWQsIAorCQkJICogICAgICBpZiBubywgc2V0dXAgdHJhbnNmZXIgZm9yIG5leHQgcG9ydGlvbiBvZiBkYXRhCisJCQkgKi8KKwkJCWlmIChlcC0+ZHdjX2VwLnhmZXJfbGVuIDwgZXAtPmR3Y19lcC50b3RhbF9sZW4pIHsKKwkJCQlkd2Nfb3RnX2VwX3N0YXJ0X3RyYW5zZmVyKGNvcmVfaWYsICZlcC0+ZHdjX2VwKTsKKwkJCX0gZWxzZSBpZiAoZXAtPmR3Y19lcC5zZW50X3pscCkgeworCQkJCS8qICAgICAKKwkJCQkgKiBUaGlzIGZyYWdtZW50IG9mIGNvZGUgc2hvdWxkIGluaXRpYXRlIDAKKwkJCQkgKiBsZW5ndGggdHJhbnNmZXIgaW4gY2FzZSBpZiBpdCBpcyBxdWV1ZWQKKwkJCQkgKiBhIHRyYW5zZmVyIHdpdGggc2l6ZSBkaXZpc2libGUgdG8gRVBzIG1heAorCQkJCSAqIHBhY2tldCBzaXplIGFuZCB3aXRoIHVzYl9yZXF1ZXN0IHplcm8gZmllbGQKKwkJCQkgKiBpcyBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgYWZ0ZXIgZGF0YSBpcyB0cmFuc2ZlcmVkLAorCQkJCSAqIGl0IGlzIGFsc28gc2hvdWxkIGJlIHRyYW5zZmVyZWQKKwkJCQkgKiBhIDAgbGVuZ3RoIHBhY2tldCBhdCB0aGUgZW5kLiBGb3IgU2xhdmUgYW5kCisJCQkJICogQnVmZmVyIERNQSBtb2RlcyBpbiB0aGlzIGNhc2UgU1cgaGFzCisJCQkJICogdG8gaW5pdGlhdGUgMiB0cmFuc2ZlcnMgb25lIHdpdGggdHJhbnNmZXIgc2l6ZSwKKwkJCQkgKiBhbmQgdGhlIHNlY29uZCB3aXRoIDAgc2l6ZS4gRm9yIERlc2NyaXB0b3IKKwkJCQkgKiBETUEgbW9kZSBTVyBpcyBhYmxlIHRvIGluaXRpYXRlIGEgdHJhbnNmZXIsCisJCQkJICogd2hpY2ggd2lsbCBoYW5kbGUgYWxsIHRoZSBwYWNrZXRzIGluY2x1ZGluZworCQkJCSAqIHRoZSBsYXN0ICAwIGxlbmd0aC4KKwkJCQkgKi8KKwkJCQllcC0+ZHdjX2VwLnNlbnRfemxwID0gMDsKKwkJCQlkd2Nfb3RnX2VwX3N0YXJ0X3psX3RyYW5zZmVyKGNvcmVfaWYsCisJCQkJCQkJICAgICAmZXAtPmR3Y19lcCk7CisJCQl9IGVsc2UgeworCQkJCWlzX2xhc3QgPSAxOworCQkJfQorCQl9CisKKwkJRFdDX0RFQlVHUEwoREJHX1BDRFYsCisJCQkgICAgImFkZHIgJXAsCSAlZC0lcyBsZW49JWQgY250PSVkIHhzaXplPSVkIHBrdGNudD0lZFxuIiwKKwkJCSAgICAmb3V0X2VwX3JlZ3MtPmRvZXB0c2l6LCBlcC0+ZHdjX2VwLm51bSwKKwkJCSAgICBlcC0+ZHdjX2VwLmlzX2luID8gIklOIiA6ICJPVVQiLAorCQkJICAgIGVwLT5kd2NfZXAueGZlcl9sZW4sIGVwLT5kd2NfZXAueGZlcl9jb3VudCwKKwkJCSAgICBkZXB0c2l6LmIueGZlcnNpemUsIGRlcHRzaXouYi5wa3RjbnQpOworCX0KKworCS8qIENvbXBsZXRlIHRoZSByZXF1ZXN0ICovCisJaWYgKGlzX2xhc3QpIHsKKyNpZmRlZiBEV0NfVVRFX0NGSQorCQlpZiAoZXAtPmR3Y19lcC5idWZmX21vZGUgIT0gQk1fU1RBTkRBUkQpIHsKKwkJCXJlcS0+YWN0dWFsID0gZXAtPmR3Y19lcC5jZmlfcmVxX2xlbiAtIGJ5dGVfY291bnQ7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJCXJlcS0+YWN0dWFsID0gZXAtPmR3Y19lcC54ZmVyX2NvdW50OworI2lmZGVmIERXQ19VVEVfQ0ZJCisJCX0KKyNlbmRpZgorCQlpZiAocmVxLT5kd19hbGlnbl9idWYpIHsKKwkJCWlmICghZXAtPmR3Y19lcC5pc19pbikgeworCQkJCWR3Y19tZW1jcHkocmVxLT5idWYsIHJlcS0+ZHdfYWxpZ25fYnVmLCByZXEtPmxlbmd0aCk7IAorCQkJfQorCQkJRFdDX0RNQV9GUkVFKHJlcS0+bGVuZ3RoLCByZXEtPmR3X2FsaWduX2J1ZiwKKwkJCQkgICAgIHJlcS0+ZHdfYWxpZ25fYnVmX2RtYSk7CisJCX0KKworCQlkd2Nfb3RnX3JlcXVlc3RfZG9uZShlcCwgcmVxLCAwKTsKKworCQllcC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiA9IDA7CisJCWVwLT5kd2NfZXAueGZlcl9idWZmID0gMDsKKwkJZXAtPmR3Y19lcC54ZmVyX2xlbiA9IDA7CisKKwkJLyogSWYgdGhlcmUgaXMgYSByZXF1ZXN0IGluIHRoZSBxdWV1ZSBzdGFydCBpdC4gKi8KKwkJc3RhcnRfbmV4dF9yZXF1ZXN0KGVwKTsKKwl9Cit9CisKKyNpZmRlZiBEV0NfRU5fSVNPQworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gQk5BIGludGVycnVwdCBmb3IgSXNvY2hyb25vdXMgRVBzCisgKgorICovCitzdGF0aWMgdm9pZCBkd2Nfb3RnX3BjZF9oYW5kbGVfaXNvX2JuYShkd2Nfb3RnX3BjZF9lcF90ICogZXApCit7CisJZHdjX2VwX3QgKmR3Y19lcCA9ICZlcC0+ZHdjX2VwOworCXZvbGF0aWxlIHVpbnQzMl90ICphZGRyOworCWRlcGN0bF9kYXRhX3QgZGVwY3RsID0gey5kMzIgPSAwIH07CisJZHdjX290Z19wY2RfdCAqcGNkID0gZXAtPnBjZDsKKwlkd2Nfb3RnX2Rldl9kbWFfZGVzY190ICpkbWFfZGVzYzsKKwlpbnQgaTsKKworCWRtYV9kZXNjID0KKwkgICAgZHdjX2VwLT5pc29fZGVzY19hZGRyICsgZHdjX2VwLT5kZXNjX2NudCAqIChkd2NfZXAtPnByb2NfYnVmX251bSk7CisKKwlpZiAoZHdjX2VwLT5pc19pbikgeworCQlkZXZfZG1hX2Rlc2Nfc3RzX3Qgc3RzID0gey5kMzIgPSAwIH07CisJCWZvciAoaSA9IDA7IGkgPCBkd2NfZXAtPmRlc2NfY250OyArK2ksICsrZG1hX2Rlc2MpIHsKKwkJCXN0cy5kMzIgPSBkbWFfZGVzYy0+c3RhdHVzLmQzMjsKKwkJCXN0cy5iX2lzb19pbi5icyA9IEJTX0hPU1RfUkVBRFk7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmQzMiA9IHN0cy5kMzI7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZG1hX2Rlc2Nfc3RzX3Qgc3RzID0gey5kMzIgPSAwIH07CisJCWZvciAoaSA9IDA7IGkgPCBkd2NfZXAtPmRlc2NfY250OyArK2ksICsrZG1hX2Rlc2MpIHsKKwkJCXN0cy5kMzIgPSBkbWFfZGVzYy0+c3RhdHVzLmQzMjsKKwkJCXN0cy5iX2lzb19vdXQuYnMgPSBCU19IT1NUX1JFQURZOworCQkJZG1hX2Rlc2MtPnN0YXR1cy5kMzIgPSBzdHMuZDMyOworCQl9CisJfQorCisJaWYgKGR3Y19lcC0+aXNfaW4gPT0gMCkgeworCQlhZGRyID0KKwkJICAgICZHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWYtPm91dF9lcF9yZWdzW2R3Y19lcC0+CisJCQkJCQkJICAgbnVtXS0+ZG9lcGN0bDsKKwl9IGVsc2UgeworCQlhZGRyID0KKwkJICAgICZHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWYtPmluX2VwX3JlZ3NbZHdjX2VwLT5udW1dLT5kaWVwY3RsOworCX0KKwlkZXBjdGwuYi5lcGVuYSA9IDE7CisJRFdDX01PRElGWV9SRUczMihhZGRyLCBkZXBjdGwuZDMyLCBkZXBjdGwuZDMyKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgbGF0ZXN0IGlzbyBwYWNrZXQgaW5mb3JtYXRpb24obm9uLVBUSSBtb2RlKQorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGVwIFRoZSBFUCB0byBzdGFydCB0aGUgdHJhbnNmZXIgb24uCisgKgorICovCit2b2lkIHNldF9jdXJyZW50X3BrdF9pbmZvKGR3Y19vdGdfY29yZV9pZl90ICogY29yZV9pZiwgZHdjX2VwX3QgKiBlcCkKK3sKKwlkZXB0c2l6X2RhdGFfdCBkZXB0c2l6ID0gey5kMzIgPSAwIH07CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1aW50MzJfdCBvZmZzZXQ7CisKKwlpZiAoZXAtPnByb2NfYnVmX251bSkKKwkJZG1hX2FkZHIgPSBlcC0+ZG1hX2FkZHIxOworCWVsc2UKKwkJZG1hX2FkZHIgPSBlcC0+ZG1hX2FkZHIwOworCisJaWYgKGVwLT5pc19pbikgeworCQlkZXB0c2l6LmQzMiA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQkgICBpbl9lcF9yZWdzW2VwLT5udW1dLT5kaWVwdHNpeik7CisJCW9mZnNldCA9IGVwLT5kYXRhX3Blcl9mcmFtZTsKKwl9IGVsc2UgeworCQlkZXB0c2l6LmQzMiA9CisJCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQkgICBvdXRfZXBfcmVnc1tlcC0+bnVtXS0+ZG9lcHRzaXopOworCQlvZmZzZXQgPQorCQkgICAgZXAtPmRhdGFfcGVyX2ZyYW1lICsKKwkJICAgICgweDQgJiAoMHg0IC0gKGVwLT5kYXRhX3Blcl9mcmFtZSAmIDB4MykpKTsKKwl9CisKKwlpZiAoIWRlcHRzaXouYi54ZmVyc2l6ZSkgeworCQllcC0+cGt0X2luZm9bZXAtPmN1cl9wa3RdLmxlbmd0aCA9IGVwLT5kYXRhX3Blcl9mcmFtZTsKKwkJZXAtPnBrdF9pbmZvW2VwLT5jdXJfcGt0XS5vZmZzZXQgPQorCQkgICAgZXAtPmN1cl9wa3RfZG1hX2FkZHIgLSBkbWFfYWRkcjsKKwkJZXAtPnBrdF9pbmZvW2VwLT5jdXJfcGt0XS5zdGF0dXMgPSAwOworCX0gZWxzZSB7CisJCWVwLT5wa3RfaW5mb1tlcC0+Y3VyX3BrdF0ubGVuZ3RoID0gZXAtPmRhdGFfcGVyX2ZyYW1lOworCQllcC0+cGt0X2luZm9bZXAtPmN1cl9wa3RdLm9mZnNldCA9CisJCSAgICBlcC0+Y3VyX3BrdF9kbWFfYWRkciAtIGRtYV9hZGRyOworCQllcC0+cGt0X2luZm9bZXAtPmN1cl9wa3RdLnN0YXR1cyA9IC1EV0NfRV9OT19EQVRBOworCX0KKwllcC0+Y3VyX3BrdF9hZGRyICs9IG9mZnNldDsKKwllcC0+Y3VyX3BrdF9kbWFfYWRkciArPSBvZmZzZXQ7CisJZXAtPmN1cl9wa3QrKzsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgbGF0ZXN0IGlzbyBwYWNrZXQgaW5mb3JtYXRpb24oRERNQSBtb2RlKQorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGR3Y19lcCBUaGUgRVAgdG8gc3RhcnQgdGhlIHRyYW5zZmVyIG9uLgorICoKKyAqLworc3RhdGljIHZvaWQgc2V0X2RkbWFfaXNvX3BrdHNfaW5mbyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsCisJCQkJICAgZHdjX2VwX3QgKiBkd2NfZXApCit7CisJZHdjX290Z19kZXZfZG1hX2Rlc2NfdCAqZG1hX2Rlc2M7CisJZGV2X2RtYV9kZXNjX3N0c190IHN0cyA9IHsuZDMyID0gMCB9OworCWlzb19wa3RfaW5mb190ICppc29fcGFja2V0OworCXVpbnQzMl90IGRhdGFfcGVyX2Rlc2M7CisJdWludDMyX3Qgb2Zmc2V0OworCWludCBpLCBqOworCisJaXNvX3BhY2tldCA9IGR3Y19lcC0+cGt0X2luZm87CisKKwkvKiogUmVpbml0IGNsb3NlZCBETUEgRGVzY3JpcHRvcnMqLworCS8qKiBJU08gT1VUIEVQICovCisJaWYgKGR3Y19lcC0+aXNfaW4gPT0gMCkgeworCQlkbWFfZGVzYyA9CisJCSAgICBkd2NfZXAtPmlzb19kZXNjX2FkZHIgKworCQkgICAgZHdjX2VwLT5kZXNjX2NudCAqIGR3Y19lcC0+cHJvY19idWZfbnVtOworCQlvZmZzZXQgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBkd2NfZXAtPmRlc2NfY250IC0gZHdjX2VwLT5wa3RfcGVyX2ZybTsKKwkJICAgICBpICs9IGR3Y19lcC0+cGt0X3Blcl9mcm0pIHsKKwkJCWZvciAoaiA9IDA7IGogPCBkd2NfZXAtPnBrdF9wZXJfZnJtOyArK2opIHsKKwkJCQlkYXRhX3Blcl9kZXNjID0KKwkJCQkgICAgKChqICsgMSkgKiBkd2NfZXAtPm1heHBhY2tldCA+CisJCQkJICAgICBkd2NfZXAtPgorCQkJCSAgICAgZGF0YV9wZXJfZnJhbWUpID8gZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSAtCisJCQkJICAgIGogKiBkd2NfZXAtPm1heHBhY2tldCA6IGR3Y19lcC0+bWF4cGFja2V0OworCQkJCWRhdGFfcGVyX2Rlc2MgKz0KKwkJCQkgICAgKGRhdGFfcGVyX2Rlc2MgJSA0KSA/ICg0IC0KKwkJCQkJCQkgICBkYXRhX3Blcl9kZXNjICUKKwkJCQkJCQkgICA0KSA6IDA7CisKKwkJCQlzdHMuZDMyID0gZG1hX2Rlc2MtPnN0YXR1cy5kMzI7CisKKwkJCQkvKiBXcml0ZSBzdGF0dXMgaW4gaXNvX3BhY2tldF9kZWNzcmlwdG9yICAqLworCQkJCWlzb19wYWNrZXQtPnN0YXR1cyA9CisJCQkJICAgIHN0cy5iX2lzb19vdXQucnhzdHMgKworCQkJCSAgICAoc3RzLmJfaXNvX291dC5icyBeIEJTX0RNQV9ET05FKTsKKwkJCQlpZiAoaXNvX3BhY2tldC0+c3RhdHVzKSB7CisJCQkJCWlzb19wYWNrZXQtPnN0YXR1cyA9IC1EV0NfRV9OT19EQVRBOworCQkJCX0KKworCQkJCS8qIFJlY2VpdmVkIGRhdGEgbGVuZ3RoICovCisJCQkJaWYgKCFzdHMuYl9pc29fb3V0LnJ4Ynl0ZXMpIHsKKwkJCQkJaXNvX3BhY2tldC0+bGVuZ3RoID0KKwkJCQkJICAgIGRhdGFfcGVyX2Rlc2MgLQorCQkJCQkgICAgc3RzLmJfaXNvX291dC5yeGJ5dGVzOworCQkJCX0gZWxzZSB7CisJCQkJCWlzb19wYWNrZXQtPmxlbmd0aCA9CisJCQkJCSAgICBkYXRhX3Blcl9kZXNjIC0KKwkJCQkJICAgIHN0cy5iX2lzb19vdXQucnhieXRlcyArICg0IC0KKwkJCQkJCQkJICAgICBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lCisJCQkJCQkJCSAgICAgJSA0KTsKKwkJCQl9CisKKwkJCQlpc29fcGFja2V0LT5vZmZzZXQgPSBvZmZzZXQ7CisKKwkJCQlvZmZzZXQgKz0gZGF0YV9wZXJfZGVzYzsKKwkJCQlkbWFfZGVzYysrOworCQkJCWlzb19wYWNrZXQrKzsKKwkJCX0KKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBkd2NfZXAtPnBrdF9wZXJfZnJtIC0gMTsgKytqKSB7CisJCQlkYXRhX3Blcl9kZXNjID0KKwkJCSAgICAoKGogKyAxKSAqIGR3Y19lcC0+bWF4cGFja2V0ID4KKwkJCSAgICAgZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSkgPyBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lIC0KKwkJCSAgICBqICogZHdjX2VwLT5tYXhwYWNrZXQgOiBkd2NfZXAtPm1heHBhY2tldDsKKwkJCWRhdGFfcGVyX2Rlc2MgKz0KKwkJCSAgICAoZGF0YV9wZXJfZGVzYyAlIDQpID8gKDQgLSBkYXRhX3Blcl9kZXNjICUgNCkgOiAwOworCisJCQlzdHMuZDMyID0gZG1hX2Rlc2MtPnN0YXR1cy5kMzI7CisKKwkJCS8qIFdyaXRlIHN0YXR1cyBpbiBpc29fcGFja2V0X2RlY3NyaXB0b3IgICovCisJCQlpc29fcGFja2V0LT5zdGF0dXMgPQorCQkJICAgIHN0cy5iX2lzb19vdXQucnhzdHMgKworCQkJICAgIChzdHMuYl9pc29fb3V0LmJzIF4gQlNfRE1BX0RPTkUpOworCQkJaWYgKGlzb19wYWNrZXQtPnN0YXR1cykgeworCQkJCWlzb19wYWNrZXQtPnN0YXR1cyA9IC1EV0NfRV9OT19EQVRBOworCQkJfQorCisJCQkvKiBSZWNlaXZlZCBkYXRhIGxlbmd0aCAqLworCQkJaXNvX3BhY2tldC0+bGVuZ3RoID0KKwkJCSAgICBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lIC0gc3RzLmJfaXNvX291dC5yeGJ5dGVzOworCisJCQlpc29fcGFja2V0LT5vZmZzZXQgPSBvZmZzZXQ7CisKKwkJCW9mZnNldCArPSBkYXRhX3Blcl9kZXNjOworCQkJaXNvX3BhY2tldCsrOworCQkJZG1hX2Rlc2MrKzsKKwkJfQorCisJCXN0cy5kMzIgPSBkbWFfZGVzYy0+c3RhdHVzLmQzMjsKKworCQkvKiBXcml0ZSBzdGF0dXMgaW4gaXNvX3BhY2tldF9kZWNzcmlwdG9yICAqLworCQlpc29fcGFja2V0LT5zdGF0dXMgPQorCQkgICAgc3RzLmJfaXNvX291dC5yeHN0cyArIChzdHMuYl9pc29fb3V0LmJzIF4gQlNfRE1BX0RPTkUpOworCQlpZiAoaXNvX3BhY2tldC0+c3RhdHVzKSB7CisJCQlpc29fcGFja2V0LT5zdGF0dXMgPSAtRFdDX0VfTk9fREFUQTsKKwkJfQorCQkvKiBSZWNlaXZlZCBkYXRhIGxlbmd0aCAqLworCQlpZiAoIXN0cy5iX2lzb19vdXQucnhieXRlcykgeworCQkJaXNvX3BhY2tldC0+bGVuZ3RoID0KKwkJCSAgICBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lIC0gc3RzLmJfaXNvX291dC5yeGJ5dGVzOworCQl9IGVsc2UgeworCQkJaXNvX3BhY2tldC0+bGVuZ3RoID0KKwkJCSAgICBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lIC0gc3RzLmJfaXNvX291dC5yeGJ5dGVzICsKKwkJCSAgICAoNCAtIGR3Y19lcC0+ZGF0YV9wZXJfZnJhbWUgJSA0KTsKKwkJfQorCisJCWlzb19wYWNrZXQtPm9mZnNldCA9IG9mZnNldDsKKwl9IGVsc2UgeworLyoqIElTTyBJTiBFUCAqLworCisJCWRtYV9kZXNjID0KKwkJICAgIGR3Y19lcC0+aXNvX2Rlc2NfYWRkciArCisJCSAgICBkd2NfZXAtPmRlc2NfY250ICogZHdjX2VwLT5wcm9jX2J1Zl9udW07CisKKwkJZm9yIChpID0gMDsgaSA8IGR3Y19lcC0+ZGVzY19jbnQgLSAxOyBpKyspIHsKKwkJCXN0cy5kMzIgPSBkbWFfZGVzYy0+c3RhdHVzLmQzMjsKKworCQkJLyogV3JpdGUgc3RhdHVzIGluIGlzbyBwYWNrZXQgZGVzY3JpcHRvciAqLworCQkJaXNvX3BhY2tldC0+c3RhdHVzID0KKwkJCSAgICBzdHMuYl9pc29faW4udHhzdHMgKworCQkJICAgIChzdHMuYl9pc29faW4uYnMgXiBCU19ETUFfRE9ORSk7CisJCQlpZiAoaXNvX3BhY2tldC0+c3RhdHVzICE9IDApIHsKKwkJCQlpc29fcGFja2V0LT5zdGF0dXMgPSAtRFdDX0VfTk9fREFUQTsKKworCQkJfQorCQkJLyogQnl0ZXMgaGFzIGJlZW4gdHJhbnNmZXJlZCAqLworCQkJaXNvX3BhY2tldC0+bGVuZ3RoID0KKwkJCSAgICBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lIC0gc3RzLmJfaXNvX2luLnR4Ynl0ZXM7CisKKwkJCWRtYV9kZXNjKys7CisJCQlpc29fcGFja2V0Kys7CisJCX0KKworCQlzdHMuZDMyID0gZG1hX2Rlc2MtPnN0YXR1cy5kMzI7CisJCXdoaWxlIChzdHMuYl9pc29faW4uYnMgPT0gQlNfRE1BX0JVU1kpIHsKKwkJCXN0cy5kMzIgPSBkbWFfZGVzYy0+c3RhdHVzLmQzMjsKKwkJfQorCisJCS8qIFdyaXRlIHN0YXR1cyBpbiBpc28gcGFja2V0IGRlc2NyaXB0b3IgPz8/IGRvIGJlIGRvbmUgd2l0aCBFUlJPUiBjb2RlcyAqLworCQlpc29fcGFja2V0LT5zdGF0dXMgPQorCQkgICAgc3RzLmJfaXNvX2luLnR4c3RzICsgKHN0cy5iX2lzb19pbi5icyBeIEJTX0RNQV9ET05FKTsKKwkJaWYgKGlzb19wYWNrZXQtPnN0YXR1cyAhPSAwKSB7CisJCQlpc29fcGFja2V0LT5zdGF0dXMgPSAtRFdDX0VfTk9fREFUQTsKKwkJfQorCisJCS8qIEJ5dGVzIGhhcyBiZWVuIHRyYW5zZmVyZWQgKi8KKwkJaXNvX3BhY2tldC0+bGVuZ3RoID0KKwkJICAgIGR3Y19lcC0+ZGF0YV9wZXJfZnJhbWUgLSBzdHMuYl9pc29faW4udHhieXRlczsKKwl9Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZWluaXRpYWxpemUgRE1BIERlc2NyaXB0b3JzIGZvciBJc29jaHJvbm91cyB0cmFuc2ZlcgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyLgorICogQHBhcmFtIGR3Y19lcCBUaGUgRVAgdG8gc3RhcnQgdGhlIHRyYW5zZmVyIG9uLgorICoKKyAqLworc3RhdGljIHZvaWQgcmVpbml0X2RkbWFfaXNvX3hmZXIoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLCBkd2NfZXBfdCAqIGR3Y19lcCkKK3sKKwlpbnQgaSwgajsKKwlkd2Nfb3RnX2Rldl9kbWFfZGVzY190ICpkbWFfZGVzYzsKKwlkbWFfYWRkcl90IGRtYV9hZDsKKwl2b2xhdGlsZSB1aW50MzJfdCAqYWRkcjsKKwlkZXZfZG1hX2Rlc2Nfc3RzX3Qgc3RzID0gey5kMzIgPSAwIH07CisJdWludDMyX3QgZGF0YV9wZXJfZGVzYzsKKworCWlmIChkd2NfZXAtPmlzX2luID09IDApIHsKKwkJYWRkciA9ICZjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2R3Y19lcC0+bnVtXS0+ZG9lcGN0bDsKKwl9IGVsc2UgeworCQlhZGRyID0gJmNvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tkd2NfZXAtPm51bV0tPmRpZXBjdGw7CisJfQorCisJaWYgKGR3Y19lcC0+cHJvY19idWZfbnVtID09IDApIHsKKwkJLyoqIEJ1ZmZlciAwIGRlc2NyaXB0b3JzIHNldHVwICovCisJCWRtYV9hZCA9IGR3Y19lcC0+ZG1hX2FkZHIwOworCX0gZWxzZSB7CisJCS8qKiBCdWZmZXIgMSBkZXNjcmlwdG9ycyBzZXR1cCAqLworCQlkbWFfYWQgPSBkd2NfZXAtPmRtYV9hZGRyMTsKKwl9CisKKwkvKiogUmVpbml0IGNsb3NlZCBETUEgRGVzY3JpcHRvcnMqLworCS8qKiBJU08gT1VUIEVQICovCisJaWYgKGR3Y19lcC0+aXNfaW4gPT0gMCkgeworCQlkbWFfZGVzYyA9CisJCSAgICBkd2NfZXAtPmlzb19kZXNjX2FkZHIgKworCQkgICAgZHdjX2VwLT5kZXNjX2NudCAqIGR3Y19lcC0+cHJvY19idWZfbnVtOworCisJCXN0cy5iX2lzb19vdXQuYnMgPSBCU19IT1NUX1JFQURZOworCQlzdHMuYl9pc29fb3V0LnJ4c3RzID0gMDsKKwkJc3RzLmJfaXNvX291dC5sID0gMDsKKwkJc3RzLmJfaXNvX291dC5zcCA9IDA7CisJCXN0cy5iX2lzb19vdXQuaW9jID0gMDsKKwkJc3RzLmJfaXNvX291dC5waWQgPSAwOworCQlzdHMuYl9pc29fb3V0LmZyYW1lbnVtID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgZHdjX2VwLT5kZXNjX2NudCAtIGR3Y19lcC0+cGt0X3Blcl9mcm07CisJCSAgICAgaSArPSBkd2NfZXAtPnBrdF9wZXJfZnJtKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgZHdjX2VwLT5wa3RfcGVyX2ZybTsgKytqKSB7CisJCQkJZGF0YV9wZXJfZGVzYyA9CisJCQkJICAgICgoaiArIDEpICogZHdjX2VwLT5tYXhwYWNrZXQgPgorCQkJCSAgICAgZHdjX2VwLT4KKwkJCQkgICAgIGRhdGFfcGVyX2ZyYW1lKSA/IGR3Y19lcC0+ZGF0YV9wZXJfZnJhbWUgLQorCQkJCSAgICBqICogZHdjX2VwLT5tYXhwYWNrZXQgOiBkd2NfZXAtPm1heHBhY2tldDsKKwkJCQlkYXRhX3Blcl9kZXNjICs9CisJCQkJICAgIChkYXRhX3Blcl9kZXNjICUgNCkgPyAoNCAtCisJCQkJCQkJICAgZGF0YV9wZXJfZGVzYyAlCisJCQkJCQkJICAgNCkgOiAwOworCQkJCXN0cy5iX2lzb19vdXQucnhieXRlcyA9IGRhdGFfcGVyX2Rlc2M7CisJCQkJZG1hX2Rlc2MtPmJ1ZiA9IGRtYV9hZDsKKwkJCQlkbWFfZGVzYy0+c3RhdHVzLmQzMiA9IHN0cy5kMzI7CisKKwkJCQlkbWFfYWQgKz0gZGF0YV9wZXJfZGVzYzsKKwkJCQlkbWFfZGVzYysrOworCQkJfQorCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IGR3Y19lcC0+cGt0X3Blcl9mcm0gLSAxOyArK2opIHsKKworCQkJZGF0YV9wZXJfZGVzYyA9CisJCQkgICAgKChqICsgMSkgKiBkd2NfZXAtPm1heHBhY2tldCA+CisJCQkgICAgIGR3Y19lcC0+ZGF0YV9wZXJfZnJhbWUpID8gZHdjX2VwLT5kYXRhX3Blcl9mcmFtZSAtCisJCQkgICAgaiAqIGR3Y19lcC0+bWF4cGFja2V0IDogZHdjX2VwLT5tYXhwYWNrZXQ7CisJCQlkYXRhX3Blcl9kZXNjICs9CisJCQkgICAgKGRhdGFfcGVyX2Rlc2MgJSA0KSA/ICg0IC0gZGF0YV9wZXJfZGVzYyAlIDQpIDogMDsKKwkJCXN0cy5iX2lzb19vdXQucnhieXRlcyA9IGRhdGFfcGVyX2Rlc2M7CisKKwkJCWRtYV9kZXNjLT5idWYgPSBkbWFfYWQ7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmQzMiA9IHN0cy5kMzI7CisKKwkJCWRtYV9kZXNjKys7CisJCQlkbWFfYWQgKz0gZGF0YV9wZXJfZGVzYzsKKwkJfQorCisJCXN0cy5iX2lzb19vdXQuaW9jID0gMTsKKwkJc3RzLmJfaXNvX291dC5sID0gZHdjX2VwLT5wcm9jX2J1Zl9udW07CisKKwkJZGF0YV9wZXJfZGVzYyA9CisJCSAgICAoKGogKyAxKSAqIGR3Y19lcC0+bWF4cGFja2V0ID4KKwkJICAgICBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lKSA/IGR3Y19lcC0+ZGF0YV9wZXJfZnJhbWUgLQorCQkgICAgaiAqIGR3Y19lcC0+bWF4cGFja2V0IDogZHdjX2VwLT5tYXhwYWNrZXQ7CisJCWRhdGFfcGVyX2Rlc2MgKz0KKwkJICAgIChkYXRhX3Blcl9kZXNjICUgNCkgPyAoNCAtIGRhdGFfcGVyX2Rlc2MgJSA0KSA6IDA7CisJCXN0cy5iX2lzb19vdXQucnhieXRlcyA9IGRhdGFfcGVyX2Rlc2M7CisKKwkJZG1hX2Rlc2MtPmJ1ZiA9IGRtYV9hZDsKKwkJZG1hX2Rlc2MtPnN0YXR1cy5kMzIgPSBzdHMuZDMyOworCX0gZWxzZSB7CisvKiogSVNPIElOIEVQICovCisKKwkJZG1hX2Rlc2MgPQorCQkgICAgZHdjX2VwLT5pc29fZGVzY19hZGRyICsKKwkJICAgIGR3Y19lcC0+ZGVzY19jbnQgKiBkd2NfZXAtPnByb2NfYnVmX251bTsKKworCQlzdHMuYl9pc29faW4uYnMgPSBCU19IT1NUX1JFQURZOworCQlzdHMuYl9pc29faW4udHhzdHMgPSAwOworCQlzdHMuYl9pc29faW4uc3AgPSAwOworCQlzdHMuYl9pc29faW4uaW9jID0gMDsKKwkJc3RzLmJfaXNvX2luLnBpZCA9IGR3Y19lcC0+cGt0X3Blcl9mcm07CisJCXN0cy5iX2lzb19pbi5mcmFtZW51bSA9IGR3Y19lcC0+bmV4dF9mcmFtZTsKKwkJc3RzLmJfaXNvX2luLnR4Ynl0ZXMgPSBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lOworCQlzdHMuYl9pc29faW4ubCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGR3Y19lcC0+ZGVzY19jbnQgLSAxOyBpKyspIHsKKwkJCWRtYV9kZXNjLT5idWYgPSBkbWFfYWQ7CisJCQlkbWFfZGVzYy0+c3RhdHVzLmQzMiA9IHN0cy5kMzI7CisKKwkJCXN0cy5iX2lzb19pbi5mcmFtZW51bSArPSBkd2NfZXAtPmJJbnRlcnZhbDsKKwkJCWRtYV9hZCArPSBkd2NfZXAtPmRhdGFfcGVyX2ZyYW1lOworCQkJZG1hX2Rlc2MrKzsKKwkJfQorCisJCXN0cy5iX2lzb19pbi5pb2MgPSAxOworCQlzdHMuYl9pc29faW4ubCA9IGR3Y19lcC0+cHJvY19idWZfbnVtOworCisJCWRtYV9kZXNjLT5idWYgPSBkbWFfYWQ7CisJCWRtYV9kZXNjLT5zdGF0dXMuZDMyID0gc3RzLmQzMjsKKworCQlkd2NfZXAtPm5leHRfZnJhbWUgPQorCQkgICAgc3RzLmJfaXNvX2luLmZyYW1lbnVtICsgZHdjX2VwLT5iSW50ZXJ2YWwgKiAxOworCX0KKwlkd2NfZXAtPnByb2NfYnVmX251bSA9IChkd2NfZXAtPnByb2NfYnVmX251bSBeIDEpICYgMHgxOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdG8gaGFuZGxlIElzbyBFUCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAqIGluIGNhc2UgSXNvIG91dCBwYWNrZXQgd2FzIGRyb3BwZWQKKyAqCisgKiBAcGFyYW0gY29yZV9pZiBQcm9ncmFtbWluZyB2aWV3IG9mIERXQ19vdGcgY29udHJvbGxlci4KKyAqIEBwYXJhbSBkd2NfZXAgVGhlIEVQIGZvciB3aWhpY2ggdHJhbnNmZXIgY29tcGxldGUgd2FzIGFzc2VydGVkCisgKgorICovCitzdGF0aWMgdWludDMyX3QgaGFuZGxlX2lzb19vdXRfcGt0X2Ryb3BwZWQoZHdjX290Z19jb3JlX2lmX3QgKiBjb3JlX2lmLAorCQkJCQkgICBkd2NfZXBfdCAqIGR3Y19lcCkKK3sKKwl1aW50MzJfdCBkbWFfYWRkcjsKKwl1aW50MzJfdCBkcnBfcGt0OworCXVpbnQzMl90IGRycF9wa3RfY250OworCWRlcHRzaXpfZGF0YV90IGRlcHRzaXogPSB7LmQzMiA9IDAgfTsKKwlkZXBjdGxfZGF0YV90IGRlcGN0bCA9IHsuZDMyID0gMCB9OworCWludCBpOworCisJZGVwdHNpei5kMzIgPQorCSAgICBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCSAgIG91dF9lcF9yZWdzW2R3Y19lcC0+bnVtXS0+ZG9lcHRzaXopOworCisJZHJwX3BrdCA9IGR3Y19lcC0+cGt0X2NudCAtIGRlcHRzaXouYi5wa3RjbnQ7CisJZHJwX3BrdF9jbnQgPSBkd2NfZXAtPnBrdF9wZXJfZnJtIC0gKGRycF9wa3QgJSBkd2NfZXAtPnBrdF9wZXJfZnJtKTsKKworCS8qIFNldHRpbmcgZHJvcHBlZCBwYWNrZXRzIHN0YXR1cyAqLworCWZvciAoaSA9IDA7IGkgPCBkcnBfcGt0X2NudDsgKytpKSB7CisJCWR3Y19lcC0+cGt0X2luZm9bZHJwX3BrdF0uc3RhdHVzID0gLURXQ19FX05PX0RBVEE7CisJCWRycF9wa3QrKzsKKwkJZGVwdHNpei5iLnBrdGNudC0tOworCX0KKworCWlmIChkZXB0c2l6LmIucGt0Y250ID4gMCkgeworCQlkZXB0c2l6LmIueGZlcnNpemUgPQorCQkgICAgZHdjX2VwLT54ZmVyX2xlbiAtIChkd2NfZXAtPnBrdF9jbnQgLQorCQkJCQlkZXB0c2l6LmIucGt0Y250KSAqIGR3Y19lcC0+bWF4cGFja2V0OworCX0gZWxzZSB7CisJCWRlcHRzaXouYi54ZmVyc2l6ZSA9IDA7CisJCWRlcHRzaXouYi5wa3RjbnQgPSAwOworCX0KKworCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tkd2NfZXAtPm51bV0tPmRvZXB0c2l6LAorCQkJZGVwdHNpei5kMzIpOworCisJaWYgKGRlcHRzaXouYi5wa3RjbnQgPiAwKSB7CisJCWlmIChkd2NfZXAtPnByb2NfYnVmX251bSkgeworCQkJZG1hX2FkZHIgPQorCQkJICAgIGR3Y19lcC0+ZG1hX2FkZHIxICsgZHdjX2VwLT54ZmVyX2xlbiAtCisJCQkgICAgZGVwdHNpei5iLnhmZXJzaXplOworCQl9IGVsc2UgeworCQkJZG1hX2FkZHIgPQorCQkJICAgIGR3Y19lcC0+ZG1hX2FkZHIwICsgZHdjX2VwLT54ZmVyX2xlbiAtCisJCQkgICAgZGVwdHNpei5iLnhmZXJzaXplOzsKKwkJfQorCisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT4KKwkJCQlvdXRfZXBfcmVnc1tkd2NfZXAtPm51bV0tPmRvZXBkbWEsIGRtYV9hZGRyKTsKKworCQkvKiogUmUtZW5hYmxlIGVuZHBvaW50LCBjbGVhciBuYWsgICovCisJCWRlcGN0bC5kMzIgPSAwOworCQlkZXBjdGwuYi5lcGVuYSA9IDE7CisJCWRlcGN0bC5iLmNuYWsgPSAxOworCisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJIG91dF9lcF9yZWdzW2R3Y19lcC0+bnVtXS0+ZG9lcGN0bCwgZGVwY3RsLmQzMiwKKwkJCQkgZGVwY3RsLmQzMik7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJldHVybiAxOworCX0KK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgaXNvIHBhY2tldHMgaW5mb3JtYXRpb24oUFRJIG1vZGUpCisgKgorICogQHBhcmFtIGNvcmVfaWYgUHJvZ3JhbW1pbmcgdmlldyBvZiBEV0Nfb3RnIGNvbnRyb2xsZXIuCisgKiBAcGFyYW0gZXAgVGhlIEVQIHRvIHN0YXJ0IHRoZSB0cmFuc2ZlciBvbi4KKyAqCisgKi8KK3N0YXRpYyB1aW50MzJfdCBzZXRfaXNvX3BrdHNfaW5mbyhkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYsIGR3Y19lcF90ICogZXApCit7CisJaW50IGksIGo7CisJZG1hX2FkZHJfdCBkbWFfYWQ7CisJaXNvX3BrdF9pbmZvX3QgKnBhY2tldF9pbmZvID0gZXAtPnBrdF9pbmZvOworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBmcmFtZV9kYXRhOworCWRlcHRzaXpfZGF0YV90IGRlcHRzaXo7CisKKwlpZiAoZXAtPnByb2NfYnVmX251bSA9PSAwKSB7CisJCS8qKiBCdWZmZXIgMCBkZXNjcmlwdG9ycyBzZXR1cCAqLworCQlkbWFfYWQgPSBlcC0+ZG1hX2FkZHIwOworCX0gZWxzZSB7CisJCS8qKiBCdWZmZXIgMSBkZXNjcmlwdG9ycyBzZXR1cCAqLworCQlkbWFfYWQgPSBlcC0+ZG1hX2FkZHIxOworCX0KKworCWlmIChlcC0+aXNfaW4pIHsKKwkJZGVwdHNpei5kMzIgPQorCQkgICAgRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJICAgaW5fZXBfcmVnc1tlcC0+bnVtXS0+ZGllcHRzaXopOworCX0gZWxzZSB7CisJCWRlcHRzaXouZDMyID0KKwkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPgorCQkJCSAgIG91dF9lcF9yZWdzW2VwLT5udW1dLT5kb2VwdHNpeik7CisJfQorCisJaWYgKCFkZXB0c2l6LmIueGZlcnNpemUpIHsKKwkJb2Zmc2V0ID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IGVwLT5wa3RfY250OyBpICs9IGVwLT5wa3RfcGVyX2ZybSkgeworCQkJZnJhbWVfZGF0YSA9IGVwLT5kYXRhX3Blcl9mcmFtZTsKKwkJCWZvciAoaiA9IDA7IGogPCBlcC0+cGt0X3Blcl9mcm07ICsraikgeworCisJCQkJLyogUGFja2V0IHN0YXR1cyAtIGlzIG5vdCBzZXQgYXMgaW5pdGlhbGx5CisJCQkJICogaXQgaXMgc2V0IHRvIDAgYW5kIGlmIHBhY2tldCB3YXMgc2VudAorCQkJCSBzdWNjZXNzZnVsbHksIHN0YXR1cyBmaWVsZCB3aWxsIHJlbWFpbiAwKi8KKworCQkJCS8qIEJ5dGVzIGhhcyBiZWVuIHRyYW5zZmVyZWQgKi8KKwkJCQlwYWNrZXRfaW5mby0+bGVuZ3RoID0KKwkJCQkgICAgKGVwLT5tYXhwYWNrZXQgPAorCQkJCSAgICAgZnJhbWVfZGF0YSkgPyBlcC0+bWF4cGFja2V0IDogZnJhbWVfZGF0YTsKKworCQkJCS8qIFJlY2VpdmVkIHBhY2tldCBvZmZzZXQgKi8KKwkJCQlwYWNrZXRfaW5mby0+b2Zmc2V0ID0gb2Zmc2V0OworCQkJCW9mZnNldCArPSBwYWNrZXRfaW5mby0+bGVuZ3RoOworCQkJCWZyYW1lX2RhdGEgLT0gcGFja2V0X2luZm8tPmxlbmd0aDsKKworCQkJCXBhY2tldF9pbmZvKys7CisJCQl9CisJCX0KKwkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJLyogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGluIGNhc2Ugb2YgVHJhbnNmZXIgQ29tcGxldGUgd2l0aAorCQkgKiBQa3REcnBTdHMgaW50ZXJydXB0cyBtZXJnaW5nIC0gaW4gdGhpcyBjYXNlIFRyYW5zZmVyIGNvbXBsZXRlCisJCSAqIGludGVycnVwdCBmb3IgSXNvYyBPdXQgRW5kcG9pbnQgaXMgYXNzZXJ0ZWQgd2l0aG91dCBQa3REcnBTdHMKKwkJICogc2V0IGFuZCB3aXRoIERPRVBUU0laIHJlZ2lzdGVyIG5vbiB6ZXJvLiBJbnZlc3RpZ2F0aW9ucyBzaG93ZWQsCisJCSAqIHRoYXQgdGhpcyBoYXBwZW5zIHdoZW4gT3V0IHBhY2tldCBpcyBkcm9wcGVkLCBidXQgYmVjYXVzZSBvZgorCQkgKiBpbnRlcnJ1cHRzIG1lcmdpbmcgZHVyaW5nIGZpcnN0IGludGVycnVwdCBoYW5kbGluZyBQa3REcnBTdHMKKwkJICogYml0IGlzIGNsZWFyZWQgYW5kIGZvciBuZXh0IG1lcmdlZCBpbnRlcnJ1cHRzIGl0IGlzIG5vdCByZXNldC4KKwkJICogSW4gdGhpcyBjYXNlIFNXIGhhZGxlcyB0aGUgaW50ZXJydXB0IGFzIGlmIFBrdERycFN0cyBiaXQgaXMgc2V0LgorCQkgKi8KKwkJaWYgKGVwLT5pc19pbikgeworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gaGFuZGxlX2lzb19vdXRfcGt0X2Ryb3BwZWQoY29yZV9pZiwgZXApOworCQl9CisJfQorfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdG8gaGFuZGxlIElzbyBFUCB0cmFuc2ZlciBjb21wbGV0ZSBpbnRlcnJ1cHQKKyAqCisgKiBAcGFyYW0gcGNkIFRoZSBQQ0QKKyAqIEBwYXJhbSBlcCBUaGUgRVAgZm9yIHdoaWNoIHRyYW5zZmVyIGNvbXBsZXRlIHdhcyBhc3NlcnRlZAorICoKKyAqLworc3RhdGljIHZvaWQgY29tcGxldGVfaXNvX2VwKGR3Y19vdGdfcGNkX3QgKiBwY2QsIGR3Y19vdGdfcGNkX2VwX3QgKiBlcCkKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKGVwLT5wY2QpOworCWR3Y19lcF90ICpkd2NfZXAgPSAmZXAtPmR3Y19lcDsKKwl1aW50OF90IGlzX2xhc3QgPSAwOworCisJaWYgKGVwLT5kd2NfZXAubmV4dF9mcmFtZSA9PSAweGZmZmZmZmZmKSB7CisJCURXQ19XQVJOKCJOZXh0IGZyYW1lIGlzIG5vdCBzZXQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCWlmIChjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKwkJCXNldF9kZG1hX2lzb19wa3RzX2luZm8oY29yZV9pZiwgZHdjX2VwKTsKKwkJCXJlaW5pdF9kZG1hX2lzb194ZmVyKGNvcmVfaWYsIGR3Y19lcCk7CisJCQlpc19sYXN0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb3JlX2lmLT5wdGlfZW5oX2VuYWJsZSkgeworCQkJCWlmIChzZXRfaXNvX3BrdHNfaW5mbyhjb3JlX2lmLCBkd2NfZXApKSB7CisJCQkJCWR3Y19lcC0+cHJvY19idWZfbnVtID0KKwkJCQkJICAgIChkd2NfZXAtPnByb2NfYnVmX251bSBeIDEpICYgMHgxOworCQkJCQlkd2Nfb3RnX2lzb19lcF9zdGFydF9idWZfdHJhbnNmZXIKKwkJCQkJICAgIChjb3JlX2lmLCBkd2NfZXApOworCQkJCQlpc19sYXN0ID0gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXNldF9jdXJyZW50X3BrdF9pbmZvKGNvcmVfaWYsIGR3Y19lcCk7CisJCQkJaWYgKGR3Y19lcC0+Y3VyX3BrdCA+PSBkd2NfZXAtPnBrdF9jbnQpIHsKKwkJCQkJaXNfbGFzdCA9IDE7CisJCQkJCWR3Y19lcC0+Y3VyX3BrdCA9IDA7CisJCQkJCWR3Y19lcC0+cHJvY19idWZfbnVtID0KKwkJCQkJICAgIChkd2NfZXAtPnByb2NfYnVmX251bSBeIDEpICYgMHgxOworCQkJCQlpZiAoZHdjX2VwLT5wcm9jX2J1Zl9udW0pIHsKKwkJCQkJCWR3Y19lcC0+Y3VyX3BrdF9hZGRyID0KKwkJCQkJCSAgICBkd2NfZXAtPnhmZXJfYnVmZjE7CisJCQkJCQlkd2NfZXAtPmN1cl9wa3RfZG1hX2FkZHIgPQorCQkJCQkJICAgIGR3Y19lcC0+ZG1hX2FkZHIxOworCQkJCQl9IGVsc2UgeworCQkJCQkJZHdjX2VwLT5jdXJfcGt0X2FkZHIgPQorCQkJCQkJICAgIGR3Y19lcC0+eGZlcl9idWZmMDsKKwkJCQkJCWR3Y19lcC0+Y3VyX3BrdF9kbWFfYWRkciA9CisJCQkJCQkgICAgZHdjX2VwLT5kbWFfYWRkcjA7CisJCQkJCX0KKworCQkJCX0KKwkJCQlkd2Nfb3RnX2lzb19lcF9zdGFydF9mcm1fdHJhbnNmZXIoY29yZV9pZiwKKwkJCQkJCQkJICBkd2NfZXApOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc2V0X2N1cnJlbnRfcGt0X2luZm8oY29yZV9pZiwgZHdjX2VwKTsKKwkJaWYgKGR3Y19lcC0+Y3VyX3BrdCA+PSBkd2NfZXAtPnBrdF9jbnQpIHsKKwkJCWlzX2xhc3QgPSAxOworCQkJZHdjX2VwLT5jdXJfcGt0ID0gMDsKKwkJCWR3Y19lcC0+cHJvY19idWZfbnVtID0gKGR3Y19lcC0+cHJvY19idWZfbnVtIF4gMSkgJiAweDE7CisJCQlpZiAoZHdjX2VwLT5wcm9jX2J1Zl9udW0pIHsKKwkJCQlkd2NfZXAtPmN1cl9wa3RfYWRkciA9IGR3Y19lcC0+eGZlcl9idWZmMTsKKwkJCQlkd2NfZXAtPmN1cl9wa3RfZG1hX2FkZHIgPSBkd2NfZXAtPmRtYV9hZGRyMTsKKwkJCX0gZWxzZSB7CisJCQkJZHdjX2VwLT5jdXJfcGt0X2FkZHIgPSBkd2NfZXAtPnhmZXJfYnVmZjA7CisJCQkJZHdjX2VwLT5jdXJfcGt0X2RtYV9hZGRyID0gZHdjX2VwLT5kbWFfYWRkcjA7CisJCQl9CisKKwkJfQorCQlkd2Nfb3RnX2lzb19lcF9zdGFydF9mcm1fdHJhbnNmZXIoY29yZV9pZiwgZHdjX2VwKTsKKwl9CisJaWYgKGlzX2xhc3QpCisJCWR3Y19vdGdfaXNvX2J1ZmZlcl9kb25lKHBjZCwgZXAsIGVwLT5pc29fcmVxX2hhbmRsZSk7Cit9CisjZW5kaWYgLyogRFdDX0VOX0lTT0MgKi8KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZSBCTkEgaW50ZXJydXB0IGZvciBOb24gSXNvY2hyb25vdXMgRVBzCisgKgorICovCitzdGF0aWMgdm9pZCBkd2Nfb3RnX3BjZF9oYW5kbGVfbm9uaXNvX2JuYShkd2Nfb3RnX3BjZF9lcF90ICogZXApCit7CisJZHdjX2VwX3QgKmR3Y19lcCA9ICZlcC0+ZHdjX2VwOworCXZvbGF0aWxlIHVpbnQzMl90ICphZGRyOworCWRlcGN0bF9kYXRhX3QgZGVwY3RsID0gey5kMzIgPSAwIH07CisJZHdjX290Z19wY2RfdCAqcGNkID0gZXAtPnBjZDsKKwlkd2Nfb3RnX2Rldl9kbWFfZGVzY190ICpkbWFfZGVzYzsKKwlkZXZfZG1hX2Rlc2Nfc3RzX3Qgc3RzID0gey5kMzIgPSAwIH07CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBlcC0+cGNkLT5jb3JlX2lmOworCWludCBpLCBzdGFydDsKKworCWlmICghZHdjX2VwLT5kZXNjX2NudCkKKwkJRFdDX1dBUk4oIkRlc2NyaXB0b3IgY291bnQgPSAlZFxuIiwgZHdjX2VwLT5kZXNjX2NudCk7CisKKwlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmNvbnRfb25fYm5hICYmICFkd2NfZXAtPmlzX2luCisJCQkJCQkJJiYgZHdjX2VwLT50eXBlICE9IERXQ19PVEdfRVBfVFlQRV9DT05UUk9MKSB7CisJCXVpbnQzMl90IGRvZXBkbWE7CisJCWR3Y19vdGdfZGV2X291dF9lcF9yZWdzX3QgKm91dF9yZWdzID0KKwkJCWNvcmVfaWYtPmRldl9pZi0+b3V0X2VwX3JlZ3NbZHdjX2VwLT5udW1dOworCQlkb2VwZG1hID0gRFdDX1JFQURfUkVHMzIoJihvdXRfcmVncy0+ZG9lcGRtYSkpOworCQlzdGFydCA9IChkb2VwZG1hIC0gZHdjX2VwLT5kbWFfZGVzY19hZGRyKS9zaXplb2YoZHdjX290Z19kZXZfZG1hX2Rlc2NfdCk7CisJCWRtYV9kZXNjID0gJihkd2NfZXAtPmRlc2NfYWRkcltzdGFydF0pOworCX0gZWxzZSB7CisJCXN0YXJ0ID0gMDsKKwkJZG1hX2Rlc2MgPSBkd2NfZXAtPmRlc2NfYWRkcjsKKwl9CisJCisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IGR3Y19lcC0+ZGVzY19jbnQ7ICsraSwgKytkbWFfZGVzYykgeworCQlzdHMuZDMyID0gZG1hX2Rlc2MtPnN0YXR1cy5kMzI7CisJCXN0cy5iLmJzID0gQlNfSE9TVF9SRUFEWTsKKwkJZG1hX2Rlc2MtPnN0YXR1cy5kMzIgPSBzdHMuZDMyOworCX0KKworCWlmIChkd2NfZXAtPmlzX2luID09IDApIHsKKwkJYWRkciA9CisJCSAgICAmR0VUX0NPUkVfSUYocGNkKS0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tkd2NfZXAtPgorCQkJCQkJCSAgIG51bV0tPmRvZXBjdGw7CisJfSBlbHNlIHsKKwkJYWRkciA9CisJCSAgICAmR0VUX0NPUkVfSUYocGNkKS0+ZGV2X2lmLT5pbl9lcF9yZWdzW2R3Y19lcC0+bnVtXS0+ZGllcGN0bDsKKwl9CisJZGVwY3RsLmIuZXBlbmEgPSAxOworCWRlcGN0bC5iLmNuYWsgPSAxOworCURXQ19NT0RJRllfUkVHMzIoYWRkciwgMCwgZGVwY3RsLmQzMik7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIEVQMCBDb250cm9sIHRyYW5zZmVycy4KKyAqCisgKiBUaGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgdHJhbmZlcnMgYXJlIHRyYWNrZWQgaW4KKyAqIDxjb2RlPmVwMHN0YXRlPC9jb2RlPi4KKyAqLworc3RhdGljIHZvaWQgaGFuZGxlX2VwMChkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDAgPSAmcGNkLT5lcDA7CisJZGV2X2RtYV9kZXNjX3N0c190IGRlc2Nfc3RzOworCWRlcHRzaXowX2RhdGFfdCBkZXB0c2l6OworCXVpbnQzMl90IGJ5dGVfY291bnQ7CisKKyNpZmRlZiBERUJVR19FUDAKKwlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwlwcmludF9lcDBfc3RhdGUocGNkKTsKKyNlbmRpZgorCisvLyAgICAgIERXQ19QUklOVEYoIkhBTkRMRSBFUDBcbiIpOworCisJc3dpdGNoIChwY2QtPmVwMHN0YXRlKSB7CisJY2FzZSBFUDBfRElTQ09OTkVDVDoKKwkJYnJlYWs7CisKKwljYXNlIEVQMF9JRExFOgorCQlwY2QtPnJlcXVlc3RfY29uZmlnID0gMDsKKworCQlwY2Rfc2V0dXAocGNkKTsKKwkJYnJlYWs7CisKKwljYXNlIEVQMF9JTl9EQVRBX1BIQVNFOgorI2lmZGVmIERFQlVHX0VQMAorCQlEV0NfREVCVUdQTChEQkdfUENELCAiREFUQV9JTiBFUCVkLSVzOiB0eXBlPSVkLCBtcHM9JWRcbiIsCisJCQkgICAgZXAwLT5kd2NfZXAubnVtLCAoZXAwLT5kd2NfZXAuaXNfaW4gPyAiSU4iIDogIk9VVCIpLAorCQkJICAgIGVwMC0+ZHdjX2VwLnR5cGUsIGVwMC0+ZHdjX2VwLm1heHBhY2tldCk7CisjZW5kaWYKKworCQlpZiAoY29yZV9pZi0+ZG1hX2VuYWJsZSAhPSAwKSB7CisJCQkvKgorCQkJICogRm9yIEVQMCB3ZSBjYW4gb25seSBwcm9ncmFtIDEgcGFja2V0IGF0IGEgdGltZSBzbyB3ZQorCQkJICogbmVlZCB0byBkbyB0aGUgbWFrZSBjYWxjdWxhdGlvbnMgYWZ0ZXIgZWFjaCBjb21wbGV0ZS4KKwkJCSAqIENhbGwgd3JpdGVfcGFja2V0IHRvIG1ha2UgdGhlIGNhbGN1bGF0aW9ucywgYXMgaW4KKwkJCSAqIHNsYXZlIG1vZGUsIGFuZCB1c2UgdGhvc2UgdmFsdWVzIHRvIGRldGVybWluZSBpZiB3ZQorCQkJICogY2FuIGNvbXBsZXRlLgorCQkJICovCisJCQlpZiAoY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlID09IDApIHsKKwkJCQlkZXB0c2l6LmQzMiA9CisJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCSAgIGRldl9pZi0+aW5fZXBfcmVnc1swXS0+CisJCQkJCQkgICBkaWVwdHNpeik7CisJCQkJYnl0ZV9jb3VudCA9CisJCQkJICAgIGVwMC0+ZHdjX2VwLnhmZXJfbGVuIC0gZGVwdHNpei5iLnhmZXJzaXplOworCQkJfSBlbHNlIHsKKwkJCQlkZXNjX3N0cyA9CisJCQkJICAgIGNvcmVfaWYtPmRldl9pZi0+aW5fZGVzY19hZGRyLT5zdGF0dXM7CisJCQkJYnl0ZV9jb3VudCA9CisJCQkJICAgIGVwMC0+ZHdjX2VwLnhmZXJfbGVuIC0gZGVzY19zdHMuYi5ieXRlczsKKwkJCX0KKwkJCWVwMC0+ZHdjX2VwLnhmZXJfY291bnQgKz0gYnl0ZV9jb3VudDsKKwkJCWVwMC0+ZHdjX2VwLnhmZXJfYnVmZiArPSBieXRlX2NvdW50OworCQkJZXAwLT5kd2NfZXAuZG1hX2FkZHIgKz0gYnl0ZV9jb3VudDsKKwkJfQorCQlpZiAoZXAwLT5kd2NfZXAueGZlcl9jb3VudCA8IGVwMC0+ZHdjX2VwLnRvdGFsX2xlbikgeworCQkJZHdjX290Z19lcDBfY29udGludWVfdHJhbnNmZXIoR0VUX0NPUkVfSUYocGNkKSwKKwkJCQkJCSAgICAgICZlcDAtPmR3Y19lcCk7CisJCQlEV0NfREVCVUdQTChEQkdfUENELCAiQ09OVElOVUUgVFJBTlNGRVJcbiIpOworCQl9IGVsc2UgaWYgKGVwMC0+ZHdjX2VwLnNlbnRfemxwKSB7CisJCQlkd2Nfb3RnX2VwMF9jb250aW51ZV90cmFuc2ZlcihHRVRfQ09SRV9JRihwY2QpLAorCQkJCQkJICAgICAgJmVwMC0+ZHdjX2VwKTsKKwkJCWVwMC0+ZHdjX2VwLnNlbnRfemxwID0gMDsKKwkJCURXQ19ERUJVR1BMKERCR19QQ0QsICJDT05USU5VRSBUUkFOU0ZFUlxuIik7CisJCX0gZWxzZSB7CisJCQllcDBfY29tcGxldGVfcmVxdWVzdChlcDApOworCQkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkNPTVBMRVRFIFRSQU5TRkVSXG4iKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEVQMF9PVVRfREFUQV9QSEFTRToKKyNpZmRlZiBERUJVR19FUDAKKwkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkRBVEFfT1VUIEVQJWQtJXM6IHR5cGU9JWQsIG1wcz0lZFxuIiwKKwkJCSAgICBlcDAtPmR3Y19lcC5udW0sIChlcDAtPmR3Y19lcC5pc19pbiA/ICJJTiIgOiAiT1VUIiksCisJCQkgICAgZXAwLT5kd2NfZXAudHlwZSwgZXAwLT5kd2NfZXAubWF4cGFja2V0KTsKKyNlbmRpZgorCQlpZiAoY29yZV9pZi0+ZG1hX2VuYWJsZSAhPSAwKSB7CisJCQlpZiAoY29yZV9pZi0+ZG1hX2Rlc2NfZW5hYmxlID09IDApIHsKKwkJCQlkZXB0c2l6LmQzMiA9CisJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT4KKwkJCQkJCSAgIGRldl9pZi0+b3V0X2VwX3JlZ3NbMF0tPgorCQkJCQkJICAgZG9lcHRzaXopOworCQkJCWJ5dGVfY291bnQgPQorCQkJCSAgICBlcDAtPmR3Y19lcC5tYXhwYWNrZXQgLSBkZXB0c2l6LmIueGZlcnNpemU7CisJCQl9IGVsc2UgeworCQkJCWRlc2Nfc3RzID0KKwkJCQkgICAgY29yZV9pZi0+ZGV2X2lmLT5vdXRfZGVzY19hZGRyLT5zdGF0dXM7CisJCQkJYnl0ZV9jb3VudCA9CisJCQkJICAgIGVwMC0+ZHdjX2VwLm1heHBhY2tldCAtIGRlc2Nfc3RzLmIuYnl0ZXM7CisJCQl9CisJCQllcDAtPmR3Y19lcC54ZmVyX2NvdW50ICs9IGJ5dGVfY291bnQ7CisJCQllcDAtPmR3Y19lcC54ZmVyX2J1ZmYgKz0gYnl0ZV9jb3VudDsKKwkJCWVwMC0+ZHdjX2VwLmRtYV9hZGRyICs9IGJ5dGVfY291bnQ7CisJCX0KKwkJaWYgKGVwMC0+ZHdjX2VwLnhmZXJfY291bnQgPCBlcDAtPmR3Y19lcC50b3RhbF9sZW4pIHsKKwkJCWR3Y19vdGdfZXAwX2NvbnRpbnVlX3RyYW5zZmVyKEdFVF9DT1JFX0lGKHBjZCksCisJCQkJCQkgICAgICAmZXAwLT5kd2NfZXApOworCQkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkNPTlRJTlVFIFRSQU5TRkVSXG4iKTsKKwkJfSBlbHNlIGlmIChlcDAtPmR3Y19lcC5zZW50X3pscCkgeworCQkJZHdjX290Z19lcDBfY29udGludWVfdHJhbnNmZXIoR0VUX0NPUkVfSUYocGNkKSwKKwkJCQkJCSAgICAgICZlcDAtPmR3Y19lcCk7CisJCQllcDAtPmR3Y19lcC5zZW50X3pscCA9IDA7CisJCQlEV0NfREVCVUdQTChEQkdfUENELCAiQ09OVElOVUUgVFJBTlNGRVJcbiIpOworCQl9IGVsc2UgeworCQkJZXAwX2NvbXBsZXRlX3JlcXVlc3QoZXAwKTsKKwkJCURXQ19ERUJVR1BMKERCR19QQ0QsICJDT01QTEVURSBUUkFOU0ZFUlxuIik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEVQMF9JTl9TVEFUVVNfUEhBU0U6CisJY2FzZSBFUDBfT1VUX1NUQVRVU19QSEFTRToKKwkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkNBU0U6IEVQMF9TVEFUVVNcbiIpOworCQllcDBfY29tcGxldGVfcmVxdWVzdChlcDApOworCQlwY2QtPmVwMHN0YXRlID0gRVAwX0lETEU7CisJCWVwMC0+c3RvcHBlZCA9IDE7CisJCWVwMC0+ZHdjX2VwLmlzX2luID0gMDsJLyogT1VUIGZvciBuZXh0IFNFVFVQICovCisKKwkJLyogUHJlcGFyZSBmb3IgbW9yZSBTRVRVUCBQYWNrZXRzICovCisJCWlmIChjb3JlX2lmLT5kbWFfZW5hYmxlKSB7CisJCQllcDBfb3V0X3N0YXJ0KGNvcmVfaWYsIHBjZCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEVQMF9TVEFMTDoKKwkJRFdDX0VSUk9SKCJFUDAgU1RBTExlZCwgc2hvdWxkIG5vdCBnZXQgaGVyZSBwY2Rfc2V0dXAoKVxuIik7CisJCWJyZWFrOworCX0KKyNpZmRlZiBERUJVR19FUDAKKwlwcmludF9lcDBfc3RhdGUocGNkKTsKKyNlbmRpZgorfQorCisvKioKKyAqIFJlc3RhcnQgdHJhbnNmZXIKKyAqLworc3RhdGljIHZvaWQgcmVzdGFydF90cmFuc2Zlcihkd2Nfb3RnX3BjZF90ICogcGNkLCBjb25zdCB1aW50MzJfdCBlcG51bSkKK3sKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZjsKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWY7CisJZGVwdHNpel9kYXRhX3QgZGllcHRzaXogPSB7LmQzMiA9IDAgfTsKKwlkd2Nfb3RnX3BjZF9lcF90ICplcDsKKworCWVwID0gZ2V0X2luX2VwKHBjZCwgZXBudW0pOworCisjaWZkZWYgRFdDX0VOX0lTT0MKKwlpZiAoZXAtPmR3Y19lcC50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCXJldHVybjsKKwl9CisjZW5kaWYgLyogRFdDX0VOX0lTT0MgICovCisKKwljb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKwlkZXZfaWYgPSBjb3JlX2lmLT5kZXZfaWY7CisKKwlkaWVwdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2VwbnVtXS0+ZGllcHRzaXopOworCisJRFdDX0RFQlVHUEwoREJHX1BDRCwgInhmZXJfYnVmZj0lcCB4ZmVyX2NvdW50PSUweCB4ZmVyX2xlbj0lMHgiCisJCSAgICAiIHN0b3BwZWQ9JWRcbiIsIGVwLT5kd2NfZXAueGZlcl9idWZmLAorCQkgICAgZXAtPmR3Y19lcC54ZmVyX2NvdW50LCBlcC0+ZHdjX2VwLnhmZXJfbGVuLCBlcC0+c3RvcHBlZCk7CisJLyoKKwkgKiBJZiB4ZmVyc2l6ZSBpcyAwIGFuZCBwa3RjbnQgaW4gbm90IDAsIHJlc2VuZCB0aGUgbGFzdCBwYWNrZXQuCisJICovCisJaWYgKGRpZXB0c2l6LmIucGt0Y250ICYmIGRpZXB0c2l6LmIueGZlcnNpemUgPT0gMCAmJgorCSAgICBlcC0+ZHdjX2VwLnN0YXJ0X3hmZXJfYnVmZiAhPSAwKSB7CisJCWlmIChlcC0+ZHdjX2VwLnRvdGFsX2xlbiA8PSBlcC0+ZHdjX2VwLm1heHBhY2tldCkgeworCQkJZXAtPmR3Y19lcC54ZmVyX2NvdW50ID0gMDsKKwkJCWVwLT5kd2NfZXAueGZlcl9idWZmID0gZXAtPmR3Y19lcC5zdGFydF94ZmVyX2J1ZmY7CisJCQllcC0+ZHdjX2VwLnhmZXJfbGVuID0gZXAtPmR3Y19lcC54ZmVyX2NvdW50OworCQl9IGVsc2UgeworCQkJZXAtPmR3Y19lcC54ZmVyX2NvdW50IC09IGVwLT5kd2NfZXAubWF4cGFja2V0OworCQkJLyogY29udmVydCBwYWNrZXQgc2l6ZSB0byBkd29yZHMuICovCisJCQllcC0+ZHdjX2VwLnhmZXJfYnVmZiAtPSBlcC0+ZHdjX2VwLm1heHBhY2tldDsKKwkJCWVwLT5kd2NfZXAueGZlcl9sZW4gPSBlcC0+ZHdjX2VwLnhmZXJfY291bnQ7CisJCX0KKwkJZXAtPnN0b3BwZWQgPSAwOworCQlEV0NfREVCVUdQTChEQkdfUENELCAieGZlcl9idWZmPSVwIHhmZXJfY291bnQ9JTB4ICIKKwkJCSAgICAieGZlcl9sZW49JTB4IHN0b3BwZWQ9JWRcbiIsCisJCQkgICAgZXAtPmR3Y19lcC54ZmVyX2J1ZmYsCisJCQkgICAgZXAtPmR3Y19lcC54ZmVyX2NvdW50LCBlcC0+ZHdjX2VwLnhmZXJfbGVuLAorCQkJICAgIGVwLT5zdG9wcGVkKTsKKwkJaWYgKGVwbnVtID09IDApIHsKKwkJCWR3Y19vdGdfZXAwX3N0YXJ0X3RyYW5zZmVyKGNvcmVfaWYsICZlcC0+ZHdjX2VwKTsKKwkJfSBlbHNlIHsKKwkJCWR3Y19vdGdfZXBfc3RhcnRfdHJhbnNmZXIoY29yZV9pZiwgJmVwLT5kd2NfZXApOworCQl9CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGUgbmV3IG5leHRlcCBzZXF1bmNlIGJhc2VkIG9uIExlYXJuIFF1ZXVlLgorICoKKyAqIEBwYXJhbSBjb3JlX2lmIFByb2dyYW1taW5nIHZpZXcgb2YgRFdDX290ZyBjb250cm9sbGVyCisgKi8KK3ZvaWQgcHJlZGljdF9uZXh0ZXBfc2VxKCBkd2Nfb3RnX2NvcmVfaWZfdCAqIGNvcmVfaWYpCit7CisJZHdjX290Z19kZXZpY2VfZ2xvYmFsX3JlZ3NfdCAqZGV2X2dsb2JhbF9yZWdzID0KKwkgICAgY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3M7CisJY29uc3QgdWludDMyX3QgVE9LRU5fUV9ERVBUSCA9IGNvcmVfaWYtPmh3Y2ZnMi5iLmRldl90b2tlbl9xX2RlcHRoOworCS8qIE51bWJlciBvZiBUb2tlbiBRdWV1ZSBSZWdpc3RlcnMgKi8KKwljb25zdCBpbnQgRFRLTlFfUkVHX0NOVCA9IChUT0tFTl9RX0RFUFRIICsgNykgLyA4OworCWR0a25xMV9kYXRhX3QgZHRrbnFyMTsKKwl1aW50MzJfdCBpbl90a25fZXBudW1zWzRdOworCXVpbnQ4X3Qgc2VxbnVtW01BWF9FUFNfQ0hBTk5FTFNdOworCXVpbnQ4X3QgaW50a25fc2VxW1RPS0VOX1FfREVQVEhdOworCWdyc3RjdGxfdCByZXNldGN0bCA9IHsuZDMyID0gMCB9OworCXVpbnQ4X3QgdGVtcDsKKwlpbnQgbmR4ID0gMDsKKwlpbnQgc3RhcnQgPSAwOworCWludCBlbmQgPSAwOworCWludCBzb3J0X2RvbmUgPSAwOworCWludCBpID0gMDsKKwl2b2xhdGlsZSB1aW50MzJfdCAqYWRkciA9ICZkZXZfZ2xvYmFsX3JlZ3MtPmR0a25xcjE7CisKKworCURXQ19ERUJVR1BMKERCR19QQ0QsImRldl90b2tlbl9xX2RlcHRoPSVkXG4iLFRPS0VOX1FfREVQVEgpOworCisJLyogUmVhZCB0aGUgRFRLTlEgUmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IERUS05RX1JFR19DTlQ7IGkrKykgeworCQlpbl90a25fZXBudW1zW2ldID0gRFdDX1JFQURfUkVHMzIoYWRkcik7CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiRFRLTlFSJWQ9MHglMDh4XG4iLCBpICsgMSwKKwkJCSAgICBpbl90a25fZXBudW1zW2ldKTsKKwkJaWYgKGFkZHIgPT0gJmRldl9nbG9iYWxfcmVncy0+ZHZidXNkaXMpIHsKKwkJCWFkZHIgPSAmZGV2X2dsb2JhbF9yZWdzLT5kdGtucXIzX2R0aHJjdGw7CisJCX0gZWxzZSB7CisJCQkrK2FkZHI7CisJCX0KKworCX0KKworCS8qIENvcHkgdGhlIERUS05RUjEgZGF0YSB0byB0aGUgYml0IGZpZWxkLiAqLworCWR0a25xcjEuZDMyID0gaW5fdGtuX2VwbnVtc1swXTsKKwlpZiAoZHRrbnFyMS5iLndyYXBfYml0KSB7CisJCW5keCA9IGR0a25xcjEuYi5pbnRrbndwdHI7CisJCWVuZCA9IG5keCAtMTsKKwkJaWYgKGVuZCA8IDApIAorCQkJZW5kID0gVE9LRU5fUV9ERVBUSCAtMTsKKwl9IGVsc2UgeworCQluZHggPSAwOworCQllbmQgPSBkdGtucXIxLmIuaW50a253cHRyIC0xOworCQlpZiAoZW5kIDwgMCkgCisJCQllbmQgPSAwOworCX0KKwlzdGFydCA9IG5keDsKKwkKKwkvKiBGaWxsIHNlcW51bVtdIGJ5IGluaXRpYWwgdmFsdWVzOiBFUCBudW1iZXIgKyAzMSAqLworCWZvciAoaT0wOyBpIDw9IGNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsgaSsrKSB7CisJCXNlcW51bVtpXSA9IGkgKzMxOworCX0KKwkKKwkvKiBGaWxsIGludGtuX3NlcVtdIGZyb20gaW5fdGtuX2VwbnVtc1swXSAqLworCWZvciAoaT0wOyBpIDwgNjsgaSsrKSAKKwkJaW50a25fc2VxW2ldID0gKGluX3Rrbl9lcG51bXNbMF0gPj4gKCg3LWkpICogNCkpICYgMHhmOworCQorCWlmIChUT0tFTl9RX0RFUFRIID4gNikgeworCQkvKiBGaWxsIGludGtuX3NlcVtdIGZyb20gaW5fdGtuX2VwbnVtc1sxXSAqLworCQlmb3IgKGk9NjsgaSA8IDE0OyBpKyspIAorCQkJaW50a25fc2VxW2ldID0gKGluX3Rrbl9lcG51bXNbMV0gPj4gKCg3LShpLTYpKSAqIDQpKSAmIDB4ZjsKKwl9CisJCisJaWYgKFRPS0VOX1FfREVQVEggPiAxNCkgeworCQkvKiBGaWxsIGludGtuX3NlcVtdIGZyb20gaW5fdGtuX2VwbnVtc1sxXSAqLworCQlmb3IgKGk9MTQ7IGkgPCAyMjsgaSsrKSAKKwkJCWludGtuX3NlcVtpXSA9IChpbl90a25fZXBudW1zWzJdID4+ICgoNy0oaS0xNCkpICogNCkpICYgMHhmOworCX0KKworCWlmIChUT0tFTl9RX0RFUFRIID4gMjIpIHsKKwkJLyogRmlsbCBpbnRrbl9zZXFbXSBmcm9tIGluX3Rrbl9lcG51bXNbMV0gKi8KKwkJZm9yIChpPTIyOyBpIDwgMzA7IGkrKykgCisJCQlpbnRrbl9zZXFbaV0gPSAoaW5fdGtuX2VwbnVtc1szXSA+PiAoKDctKGktMjIpKSAqIDQpKSAmIDB4ZjsKKwl9CisKKwlEV0NfREVCVUdQTChEQkdfUENEViwiJXMgc3RhcnQ9JWQgZW5kPSVkIGludGtuX3NlcVtdOlxuIiwgX19mdW5jX18sIHN0YXJ0LCBlbmQpOworCWZvciAoaT0wOyBpPFRPS0VOX1FfREVQVEg7IGkrKykgCisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCIlZFxuIiwgaW50a25fc2VxW2ldKTsKKworCS8qIFVwZGF0ZSBzZXFudW0gYmFzZWQgb24gaW50a25fc2VxW10gKi8KKwlpID0gMDsKKwlkbyB7CisJCXNlcW51bVtpbnRrbl9zZXFbbmR4XV0gPSBpOworCQluZHgrKzsKKwkJaSsrOworCQlpZiAobmR4ID09IFRPS0VOX1FfREVQVEgpIAorCQkJbmR4ID0gMDsKKwl9IHdoaWxlICggaSA8IFRPS0VOX1FfREVQVEggKTsKKwkKKwkvKiBNYXJrIG5vbiBhY3RpdmUgRVAncyBpbiBzZXFudW1bXSBieSAweGZmICovCisJZm9yIChpPTA7IGk8PWNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsgaSsrKSB7CisJCWlmIChjb3JlX2lmLT5uZXh0ZXBfc2VxW2ldID09IDB4ZmYgKQorCQkJc2VxbnVtW2ldID0gMHhmZjsKKwl9CisJCisJLyogU29ydCBzZXFudW1bXSAqLworCXNvcnRfZG9uZSA9IDA7CisJd2hpbGUgKCFzb3J0X2RvbmUpIHsKKwkJc29ydF9kb25lID0gMTsKKwkJZm9yIChpPTA7IGk8Y29yZV9pZi0+ZGV2X2lmLT5udW1faW5fZXBzOyBpKyspIHsKKwkJCWlmIChzZXFudW1baV0gPiBzZXFudW1baSsxXSkgeworCQkJCXRlbXAgPSBzZXFudW1baV07CisJCQkJc2VxbnVtW2ldID0gc2VxbnVtW2krMV07CisJCQkJc2VxbnVtW2krMV0gPSB0ZW1wOworCQkJCXNvcnRfZG9uZSA9IDA7CisJCQl9CisJCX0KKwl9CisKKwluZHggPSBzdGFydCArIHNlcW51bVswXTsKKwlpZiAobmR4ID49IFRPS0VOX1FfREVQVEgpIAorCQluZHggPSBuZHggJSBUT0tFTl9RX0RFUFRIOworCWNvcmVfaWYtPmZpcnN0X2luX25leHRlcF9zZXEgPSBpbnRrbl9zZXFbbmR4XTsKKwkKKwkvKiBVcGRhdGUgc2VxbnVtW10gYnkgRVAgbnVtYmVycyAgKi8KKwlmb3IgKGk9MDsgaTw9Y29yZV9pZi0+ZGV2X2lmLT5udW1faW5fZXBzOyBpKyspIHsKKwkJbmR4ID0gc3RhcnQgKyBpOworCQlpZiAoc2VxbnVtW2ldIDwgMzEpIHsKKwkJCW5keCA9IHN0YXJ0ICsgc2VxbnVtW2ldOworCQkJaWYgKG5keCA+PSBUT0tFTl9RX0RFUFRIKSAKKwkJCQluZHggPSBuZHggJSBUT0tFTl9RX0RFUFRIOworCQkJc2VxbnVtW2ldID0gaW50a25fc2VxW25keF07CisJCX0gZWxzZSB7CisJCQlpZiAoc2VxbnVtW2ldIDwgMHhmZikgeworCQkJCXNlcW51bVtpXSA9IHNlcW51bVtpXSAtIDMxOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIFVwZGF0ZSBuZXh0ZXBfc2VxW10gYmFzZWQgb24gc2VxbnVtW10gKi8KKwlmb3IgKGk9MDsgaTxjb3JlX2lmLT5kZXZfaWYtPm51bV9pbl9lcHM7IGkrKykgeworCQlpZiAoc2VxbnVtW2ldICE9IDB4ZmYpIHsKKwkJCWlmIChzZXFudW1baSsxXSAhPSAweGZmKSB7CisJCQkJY29yZV9pZi0+bmV4dGVwX3NlcVtzZXFudW1baV1dID0gc2VxbnVtW2krMV07CisJCQl9IGVsc2UgeworCQkJCWNvcmVfaWYtPm5leHRlcF9zZXFbc2VxbnVtW2ldXSA9IGNvcmVfaWYtPmZpcnN0X2luX25leHRlcF9zZXE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0KKwkKKwlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzIGZpcnN0X2luX25leHRlcF9zZXE9ICUyZDsgbmV4dGVwX3NlcVtdOlxuIiwgCisJCV9fZnVuY19fLCBjb3JlX2lmLT5maXJzdF9pbl9uZXh0ZXBfc2VxKTsKKwlmb3IgKGk9MDsgaSA8PSBjb3JlX2lmLT5kZXZfaWYtPm51bV9pbl9lcHM7IGkrKykgeworCQlEV0NfREVCVUdQTChEQkdfUENEViwiJTJkXG4iLCBjb3JlX2lmLT5uZXh0ZXBfc2VxW2ldKTsKKwl9CisKKwkvKiBGbHVzaCB0aGUgTGVhcm5pbmcgUXVldWUgKi8KKwlyZXNldGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z3JzdGN0bCk7CisJcmVzZXRjdGwuYi5pbnRrbnFmbHNoID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdyc3RjdGwsIHJlc2V0Y3RsLmQzMik7CisJCisKK30KKworLyoqCisgKiBoYW5kbGUgdGhlIElOIEVQIGRpc2FibGUgaW50ZXJydXB0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2luX2VwX2Rpc2FibGVfaW50cihkd2Nfb3RnX3BjZF90ICogcGNkLAorCQkJCQkgICAgIGNvbnN0IHVpbnQzMl90IGVwbnVtKQoreworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWYgPSBjb3JlX2lmLT5kZXZfaWY7CisJZGVwdHNpel9kYXRhX3QgZGllcHRzaXogPSB7LmQzMiA9IDAgfTsKKwlkY3RsX2RhdGFfdCBkY3RsID0gey5kMzIgPSAwIH07CisJZHdjX290Z19wY2RfZXBfdCAqZXA7CisJZHdjX2VwX3QgKmR3Y19lcDsKKwlnaW50bXNrX2RhdGFfdCBnaW50bXNrX2RhdGE7CisJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJdWludDMyX3QgZGllcGRtYTsKKwl1aW50MzJfdCByZW1haW5fdG9fdHJhbnNmZXIgPSAwOworCXVpbnQ4X3QgaTsKKwl1aW50MzJfdCB4ZmVyX3NpemU7CisJCisJZXAgPSBnZXRfaW5fZXAocGNkLCBlcG51bSk7CisJZHdjX2VwID0gJmVwLT5kd2NfZXA7CisKKwlpZiAoZHdjX2VwLT50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCWR3Y19vdGdfZmx1c2hfdHhfZmlmbyhjb3JlX2lmLCBkd2NfZXAtPnR4X2ZpZm9fbnVtKTsKKwkJY29tcGxldGVfZXAoZXApOworCQlyZXR1cm47CisJfQorCisJRFdDX0RFQlVHUEwoREJHX1BDRCwgImRpZXBjdGwlZD0lMHhcbiIsIGVwbnVtLAorCQkgICAgRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tlcG51bV0tPmRpZXBjdGwpKTsKKwlkaWVwdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2VwbnVtXS0+ZGllcHRzaXopOworCWRlcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2VwbnVtXS0+ZGllcGN0bCk7CisKKwlEV0NfREVCVUdQTChEQkdfQU5ZLCAicGt0Y250PSVkIHNpemU9JWRcbiIsCisJCSAgICBkaWVwdHNpei5iLnBrdGNudCwgZGllcHRzaXouYi54ZmVyc2l6ZSk7CisJCisJaWYgKChjb3JlX2lmLT5zdGFydF9wcmVkaWN0ID09IDApIHx8IChkZXBjdGwuYi5lcHR5cGUgJiAxKSkgeyAKKwkJaWYgKGVwLT5zdG9wcGVkKSB7CisJCQlpZiAoY29yZV9pZi0+ZW5fbXVsdGlwbGVfdHhfZmlmbykKKwkJCQkvKiBGbHVzaCB0aGUgVHggRklGTyAqLworCQkJCWR3Y19vdGdfZmx1c2hfdHhfZmlmbyhjb3JlX2lmLCBkd2NfZXAtPnR4X2ZpZm9fbnVtKTsKKwkJCS8qIENsZWFyIHRoZSBHbG9iYWwgSU4gTlAgTkFLICovCisJCQlkY3RsLmQzMiA9IDA7CisJCQlkY3RsLmIuY2ducGlubmFrID0gMTsKKwkJCURXQ19NT0RJRllfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsLCBkY3RsLmQzMiwgZGN0bC5kMzIpOyAKKwkJCS8qIFJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uICovCisJCQlpZiAoZGllcHRzaXouYi5wa3RjbnQgIT0gMCB8fCBkaWVwdHNpei5iLnhmZXJzaXplICE9IDApIHsKKwkJCQlyZXN0YXJ0X3RyYW5zZmVyKHBjZCwgZXBudW0pOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogUmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gKi8KKwkJCWlmIChkaWVwdHNpei5iLnBrdGNudCAhPSAwIHx8IGRpZXB0c2l6LmIueGZlcnNpemUgIT0gMCkgeworCQkJCXJlc3RhcnRfdHJhbnNmZXIocGNkLCBlcG51bSk7CisJCQl9CisJCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiU1RPUFBFRCEhIVxuIik7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmIChjb3JlX2lmLT5zdGFydF9wcmVkaWN0ID4gMikgewkvLyBOUCBJTiBFUAorCQljb3JlX2lmLT5zdGFydF9wcmVkaWN0LS07CisJCXJldHVybjsKKwl9CisKKwljb3JlX2lmLT5zdGFydF9wcmVkaWN0LS07CisJCisJaWYgKGNvcmVfaWYtPnN0YXJ0X3ByZWRpY3QgPT0gMSkgewkvLyBBbGwgTlAgSU4gRXAncyBkaXNhYmxlZCBub3cKKworCQlwcmVkaWN0X25leHRlcF9zZXEoY29yZV9pZik7CisJCQkKKwkJLyogVXBkYXRlIGFsbCBhY3RpdmUgSU4gRVAncyBOZXh0RVAgZmllbGQgYmFzZWQgb2YgbmV4dGVwX3NlcVtdICovCisJCWZvciAoIGkgPSAwOyBpIDw9IGNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsgaSsrKSB7CisJCQlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGN0bCk7CisJCQlpZiAoY29yZV9pZi0+bmV4dGVwX3NlcVtpXSAhPSAweGZmKSB7CS8vIEFjdGl2ZSBOUCBJTiBFUAorCQkJCWRlcGN0bC5iLm5leHRlcCA9IGNvcmVfaWYtPm5leHRlcF9zZXFbaV07CisJCQkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbaV0tPmRpZXBjdGwsIGRlcGN0bC5kMzIpOworCQkJfQorCQl9CisJCS8qIEZsdXNoIFNoYXJlZCBOUCBUeEZJRk8gKi8KKwkJZHdjX290Z19mbHVzaF90eF9maWZvKGNvcmVfaWYsIDApOworCQkvKiBSZXdpbmQgYnVmZmVycyAqLworCQlpZiAoIWNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgewkJCisJCQlpID0gY29yZV9pZi0+Zmlyc3RfaW5fbmV4dGVwX3NlcTsKKwkJCWRvIHsKKwkJCQllcCA9IGdldF9pbl9lcChwY2QsIGkpOworCQkJCWRpZXB0c2l6LmQzMiA9IERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbaV0tPmRpZXB0c2l6KTsKKwkJCQl4ZmVyX3NpemUgPSBlcC0+ZHdjX2VwLnRvdGFsX2xlbiAtIGVwLT5kd2NfZXAueGZlcl9jb3VudDsKKwkJCQlpZiAoeGZlcl9zaXplID4gZXAtPmR3Y19lcC5tYXh4ZmVyKSAKKwkJCQkJeGZlcl9zaXplID0gZXAtPmR3Y19lcC5tYXh4ZmVyOworCQkJCWRlcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwY3RsKTsKKwkJCQlpZiAoZGllcHRzaXouYi5wa3RjbnQgIT0gMCkgeworCQkJCQlpZiAoeGZlcl9zaXplID09IDApIHsKKwkJCQkJCXJlbWFpbl90b190cmFuc2ZlciA9IDA7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoKHhmZXJfc2l6ZSAlIGVwLT5kd2NfZXAubWF4cGFja2V0KSA9PSAwKSB7CisJCQkJCQkJcmVtYWluX3RvX3RyYW5zZmVyID0gCisJCQkJCQkJCWRpZXB0c2l6LmIucGt0Y250ICogZXAtPmR3Y19lcC5tYXhwYWNrZXQ7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXJlbWFpbl90b190cmFuc2ZlciA9ICgoZGllcHRzaXouYi5wa3RjbnQgLTEpICogZXAtPmR3Y19lcC5tYXhwYWNrZXQpIAorCQkJCQkJCQkrICh4ZmVyX3NpemUgJSBlcC0+ZHdjX2VwLm1heHBhY2tldCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJZGllcGRtYSA9IERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbaV0tPmRpZXBkbWEpOworCQkJCQlkaWVwdHNpei5iLnhmZXJzaXplID0gcmVtYWluX3RvX3RyYW5zZmVyOworCQkJCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcHRzaXosIGRpZXB0c2l6LmQzMik7CisJCQkJCWRpZXBkbWEgPSBlcC0+ZHdjX2VwLmRtYV9hZGRyICsgKHhmZXJfc2l6ZSAtIHJlbWFpbl90b190cmFuc2Zlcik7CisJCQkJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwZG1hLCBkaWVwZG1hKTsKKwkJCQl9CisJCQkJaSA9IGNvcmVfaWYtPm5leHRlcF9zZXFbaV07CisJCQl9IHdoaWxlIChpICE9IGNvcmVfaWYtPmZpcnN0X2luX25leHRlcF9zZXEpOworCQl9IGVsc2UgeyAvLyBkbWFfZGVzY19lbmFibGUKKwkJCQlEV0NfUFJJTlRGKCIlcyBMZWFybmluZyBRdWV1ZSBub3Qgc3VwcG9ydGVkIGluIERETUFcbiIsIF9fZnVuY19fKTsKKwkJfQorCQkJCQorCQkvKiBSZXN0YXJ0IHRyYW5zZmVycyBpbiBwcmVkaWN0ZWQgc2VxdWVuY2VzICovCisJCWkgPSBjb3JlX2lmLT5maXJzdF9pbl9uZXh0ZXBfc2VxOworCQlkbyB7CisJCQlkaWVwdHNpei5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwdHNpeik7CisJCQlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGN0bCk7CisJCQlpZiAoZGllcHRzaXouYi5wa3RjbnQgIT0gMCkgeworCQkJCWRlcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwY3RsKTsKKwkJCQlkZXBjdGwuYi5lcGVuYSA9IDE7CisJCQkJZGVwY3RsLmIuY25hayA9IDE7CisJCQkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbaV0tPmRpZXBjdGwsIGRlcGN0bC5kMzIpOworCQkJfQorCQkJaSA9IGNvcmVfaWYtPm5leHRlcF9zZXFbaV07CisJCX0gd2hpbGUgKGkgIT0gY29yZV9pZi0+Zmlyc3RfaW5fbmV4dGVwX3NlcSk7CisKKwkJLyogQ2xlYXIgdGhlIGdsb2JhbCBub24tcGVyaW9kaWMgSU4gTkFLIGhhbmRzaGFrZSAqLworCQlkY3RsLmQzMiA9IDA7CisJCWRjdGwuYi5jZ25waW5uYWsgPSAxOworCQlEV0NfTU9ESUZZX1JFRzMyKCZkZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwgZGN0bC5kMzIsIGRjdGwuZDMyKTsgCisJCQkKKwkJLyogVW5tYXNrIEVQIE1pc21hdGNoIGludGVycnVwdCAqLworCQlnaW50bXNrX2RhdGEuZDMyID0gMDsKKwkJZ2ludG1za19kYXRhLmIuZXBtaXNtYXRjaCA9IDE7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIDAsIGdpbnRtc2tfZGF0YS5kMzIpOworCQkKKwkJY29yZV9pZi0+c3RhcnRfcHJlZGljdCA9IDA7CisKKwl9IAorfQorCisvKioKKyAqIEhhbmRsZXIgZm9yIHRoZSBJTiBFUCB0aW1lb3V0IGhhbmRzaGFrZSBpbnRlcnJ1cHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfaW5fZXBfdGltZW91dF9pbnRyKGR3Y19vdGdfcGNkX3QgKiBwY2QsCisJCQkJCSAgICAgY29uc3QgdWludDMyX3QgZXBudW0pCit7CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCWR3Y19vdGdfZGV2X2lmX3QgKmRldl9pZiA9IGNvcmVfaWYtPmRldl9pZjsKKworI2lmZGVmIERFQlVHCisJZGVwdHNpel9kYXRhX3QgZGllcHRzaXogPSB7LmQzMiA9IDAgfTsKKwl1aW50MzJfdCBudW0gPSAwOworI2VuZGlmCisJZGN0bF9kYXRhX3QgZGN0bCA9IHsuZDMyID0gMCB9OworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCisJZ2ludG1za19kYXRhX3QgaW50cl9tYXNrID0gey5kMzIgPSAwIH07CisKKwllcCA9IGdldF9pbl9lcChwY2QsIGVwbnVtKTsKKworCS8qIERpc2FibGUgdGhlIE5QIFR4IEZpZm8gRW1wdHkgSW50ZXJycnVwdCAqLworCWlmICghY29yZV9pZi0+ZG1hX2VuYWJsZSkgeworCQlpbnRyX21hc2suYi5ucHR4ZmVtcHR5ID0gMTsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaywKKwkJCQkgaW50cl9tYXNrLmQzMiwgMCk7CisJfQorCS8qKiBAdG9kbyBOR1MgQ2hlY2sgRVAgdHlwZS4KKwkgKiBJbXBsZW1lbnQgZm9yIFBlcmlvZGljIEVQcyAqLworCS8qCisJICogTm9uLXBlcmlvZGljIEVQCisJICovCisJLyogRW5hYmxlIHRoZSBHbG9iYWwgSU4gTkFLIEVmZmVjdGl2ZSBJbnRlcnJ1cHQgKi8KKwlpbnRyX21hc2suYi5naW5uYWtlZmYgPSAxOworCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssIDAsIGludHJfbWFzay5kMzIpOworCisJLyogU2V0IEdsb2JhbCBJTiBOQUsgKi8KKwlkY3RsLmIuc2ducGlubmFrID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZkZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwgZGN0bC5kMzIsIGRjdGwuZDMyKTsKKworCWVwLT5zdG9wcGVkID0gMTsKKworI2lmZGVmIERFQlVHCisJZGllcHRzaXouZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tudW1dLT5kaWVwdHNpeik7CisJRFdDX0RFQlVHUEwoREJHX0FOWSwgInBrdGNudD0lZCBzaXplPSVkXG4iLAorCQkgICAgZGllcHRzaXouYi5wa3RjbnQsIGRpZXB0c2l6LmIueGZlcnNpemUpOworI2VuZGlmCisKKyNpZmRlZiBESVNBQkxFX1BFUklPRElDX0VQCisJLyoKKwkgKiBTZXQgdGhlIE5BSyBiaXQgZm9yIHRoaXMgRVAgdG8KKwkgKiBzdGFydCB0aGUgZGlzYWJsZSBwcm9jZXNzLgorCSAqLworCWRpZXBjdGwuZDMyID0gMDsKKwlkaWVwY3RsLmIuc25hayA9IDE7CisJRFdDX01PRElGWV9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW251bV0tPmRpZXBjdGwsIGRpZXBjdGwuZDMyLAorCQkJIGRpZXBjdGwuZDMyKTsKKwllcC0+ZGlzYWJsaW5nID0gMTsKKwllcC0+c3RvcHBlZCA9IDE7CisjZW5kaWYKK30KKworLyoqCisgKiBIYW5kbGVyIGZvciB0aGUgSU4gRVAgTkFLIGludGVycnVwdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQzMl90IGhhbmRsZV9pbl9lcF9uYWtfaW50cihkd2Nfb3RnX3BjZF90ICogcGNkLAorCQkJCQkgICAgY29uc3QgdWludDMyX3QgZXBudW0pCit7CisJLyoqIEB0b2RvIGltcGxlbWVudCBJU1IgKi8KKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZjsKKwlkaWVwbXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKworCURXQ19QUklOVEYoIklOVEVSUlVQVCBIYW5kbGVyIG5vdCBpbXBsZW1lbnRlZCBmb3IgJXNcbiIsICJJTiBFUCBOQUsiKTsKKwljb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKwlpbnRyX21hc2suYi5uYWsgPSAxOworCisJaWYgKGNvcmVfaWYtPm11bHRpcHJvY19pbnRfZW5hYmxlKSB7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT4KKwkJCQkgZGllcGVhY2hpbnRtc2tbZXBudW1dLCBpbnRyX21hc2suZDMyLCAwKTsKKwl9IGVsc2UgeworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGllcG1zaywKKwkJCQkgaW50cl9tYXNrLmQzMiwgMCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogSGFuZGxlciBmb3IgdGhlIE9VVCBFUCBCYWJibGUgaW50ZXJydXB0LgorICovCitzdGF0aWMgaW5saW5lIGludDMyX3QgaGFuZGxlX291dF9lcF9iYWJibGVfaW50cihkd2Nfb3RnX3BjZF90ICogcGNkLAorCQkJCQkJY29uc3QgdWludDMyX3QgZXBudW0pCit7CisJLyoqIEB0b2RvIGltcGxlbWVudCBJU1IgKi8KKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZjsKKwlkb2VwbXNrX2RhdGFfdCBpbnRyX21hc2sgPSB7LmQzMiA9IDAgfTsKKworCURXQ19QUklOVEYoIklOVEVSUlVQVCBIYW5kbGVyIG5vdCBpbXBsZW1lbnRlZCBmb3IgJXNcbiIsCisJCSAgICJPVVQgRVAgQmFiYmxlIik7CisJY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJaW50cl9tYXNrLmIuYmFiYmxlID0gMTsKKworCWlmIChjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+CisJCQkJIGRvZXBlYWNoaW50bXNrW2VwbnVtXSwgaW50cl9tYXNrLmQzMiwgMCk7CisJfSBlbHNlIHsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRvZXBtc2ssCisJCQkJIGludHJfbWFzay5kMzIsIDApOworCX0KKworCXJldHVybiAxOworfQorCisvKioKKyAqIEhhbmRsZXIgZm9yIHRoZSBPVVQgRVAgTkFLIGludGVycnVwdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQzMl90IGhhbmRsZV9vdXRfZXBfbmFrX2ludHIoZHdjX290Z19wY2RfdCAqIHBjZCwKKwkJCQkJICAgICBjb25zdCB1aW50MzJfdCBlcG51bSkKK3sKKwkvKiogQHRvZG8gaW1wbGVtZW50IElTUiAqLworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmOworCWRvZXBtc2tfZGF0YV90IGludHJfbWFzayA9IHsuZDMyID0gMCB9OworCisJRFdDX1BSSU5URigiSU5URVJSVVBUIEhhbmRsZXIgbm90IGltcGxlbWVudGVkIGZvciAlc1xuIiwgIk9VVCBFUCBOQUsiKTsKKwljb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKwlpbnRyX21hc2suYi5uYWsgPSAxOworCisJaWYgKGNvcmVfaWYtPm11bHRpcHJvY19pbnRfZW5hYmxlKSB7CisJCURXQ19NT0RJRllfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT4KKwkJCQkgZG9lcGVhY2hpbnRtc2tbZXBudW1dLCBpbnRyX21hc2suZDMyLCAwKTsKKwl9IGVsc2UgeworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZG9lcG1zaywKKwkJCQkgaW50cl9tYXNrLmQzMiwgMCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogSGFuZGxlciBmb3IgdGhlIE9VVCBFUCBOWUVUIGludGVycnVwdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQzMl90IGhhbmRsZV9vdXRfZXBfbnlldF9pbnRyKGR3Y19vdGdfcGNkX3QgKiBwY2QsCisJCQkJCSAgICAgIGNvbnN0IHVpbnQzMl90IGVwbnVtKQoreworCS8qKiBAdG9kbyBpbXBsZW1lbnQgSVNSICovCisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWY7CisJZG9lcG1za19kYXRhX3QgaW50cl9tYXNrID0gey5kMzIgPSAwIH07CisKKwlEV0NfUFJJTlRGKCJJTlRFUlJVUFQgSGFuZGxlciBub3QgaW1wbGVtZW50ZWQgZm9yICVzXG4iLCAiT1VUIEVQIE5ZRVQiKTsKKwljb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKwlpbnRyX21hc2suYi5ueWV0ID0gMTsKKworCWlmIChjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+CisJCQkJIGRvZXBlYWNoaW50bXNrW2VwbnVtXSwgaW50cl9tYXNrLmQzMiwgMCk7CisJfSBlbHNlIHsKKwkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRvZXBtc2ssCisJCQkJIGludHJfbWFzay5kMzIsIDApOworCX0KKworCXJldHVybiAxOworfQorCisvKioKKyAqIFRoaXMgaW50ZXJydXB0IGluZGljYXRlcyB0aGF0IGFuIElOIEVQIGhhcyBhIHBlbmRpbmcgSW50ZXJydXB0LgorICogVGhlIHNlcXVlbmNlIGZvciBoYW5kbGluZyB0aGUgSU4gRVAgaW50ZXJydXB0IGlzIHNob3duIGJlbG93OgorICogLSMJUmVhZCB0aGUgRGV2aWNlIEFsbCBFbmRwb2ludCBJbnRlcnJ1cHQgcmVnaXN0ZXIKKyAqIC0jCVJlcGVhdCB0aGUgZm9sbG93aW5nIGZvciBlYWNoIElOIEVQIGludGVycnVwdCBiaXQgc2V0IChmcm9tCisgKgkJTFNCIHRvIE1TQikuCisgKiAtIwlSZWFkIHRoZSBEZXZpY2UgRW5kcG9pbnQgSW50ZXJydXB0IChESUVQSU5UbikgcmVnaXN0ZXIKKyAqIC0jCUlmICJUcmFuc2ZlciBDb21wbGV0ZSIgY2FsbCB0aGUgcmVxdWVzdCBjb21wbGV0ZSBmdW5jdGlvbgorICogLSMJSWYgIkVuZHBvaW50IERpc2FibGVkIiBjb21wbGV0ZSB0aGUgRVAgZGlzYWJsZSBwcm9jZWR1cmUuCisgKiAtIwlJZiAiQUhCIEVycm9yIEludGVycnVwdCIgbG9nIGVycm9yCisgKiAtIwlJZiAiVGltZS1vdXQgSGFuZHNoYWtlIiBsb2cgZXJyb3IKKyAqIC0jCUlmICJJTiBUb2tlbiBSZWNlaXZlZCB3aGVuIFR4RklGTyBFbXB0eSIgd3JpdGUgcGFja2V0IHRvIFR4CisgKgkJRklGTy4KKyAqIC0jCUlmICJJTiBUb2tlbiBFUCBNaXNtYXRjaCIgKGRpc2FibGUsIHRoaXMgaXMgaGFuZGxlZCBieSBFUAorICoJCU1pc21hdGNoIEludGVycnVwdCkKKyAqLworc3RhdGljIGludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2luX2VwX2ludHIoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKyNkZWZpbmUgQ0xFQVJfSU5fRVBfSU5UUihfX2NvcmVfaWYsX19lcG51bSxfX2ludHIpIFwKK2RvIHsgXAorCQlkaWVwaW50X2RhdGFfdCBkaWVwaW50ID0gey5kMzI9MH07IFwKKwkJZGllcGludC5iLl9faW50ciA9IDE7IFwKKwkJRFdDX1dSSVRFX1JFRzMyKCZfX2NvcmVfaWYtPmRldl9pZi0+aW5fZXBfcmVnc1tfX2VwbnVtXS0+ZGllcGludCwgXAorCQlkaWVwaW50LmQzMik7IFwKK30gd2hpbGUgKDApCisKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJZHdjX290Z19kZXZfaWZfdCAqZGV2X2lmID0gY29yZV9pZi0+ZGV2X2lmOworCWRpZXBpbnRfZGF0YV90IGRpZXBpbnQgPSB7LmQzMiA9IDAgfTsKKwlkZXBjdGxfZGF0YV90IGRlcGN0bCA9IHsuZDMyID0gMCB9OworCXVpbnQzMl90IGVwX2ludHI7CisJdWludDMyX3QgZXBudW0gPSAwOworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCWR3Y19lcF90ICpkd2NfZXA7CisJZ2ludG1za19kYXRhX3QgaW50cl9tYXNrID0gey5kMzIgPSAwIH07CisKKwlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzKCVwKVxuIiwgX19mdW5jX18sIHBjZCk7CisKKwkvKiBSZWFkIGluIHRoZSBkZXZpY2UgaW50ZXJydXB0IGJpdHMgKi8KKwllcF9pbnRyID0gZHdjX290Z19yZWFkX2Rldl9hbGxfaW5fZXBfaW50cihjb3JlX2lmKTsKKworCS8qIFNlcnZpY2UgdGhlIERldmljZSBJTiBpbnRlcnJ1cHRzIGZvciBlYWNoIGVuZHBvaW50ICovCisJd2hpbGUgKGVwX2ludHIpIHsKKwkJaWYgKGVwX2ludHIgJiAweDEpIHsKKwkJCXVpbnQzMl90IGVtcHR5X21zazsKKwkJCS8qIEdldCBFUCBwb2ludGVyICovCisJCQllcCA9IGdldF9pbl9lcChwY2QsIGVwbnVtKTsKKwkJCWR3Y19lcCA9ICZlcC0+ZHdjX2VwOworCisJCQlkZXBjdGwuZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2VwbnVtXS0+ZGllcGN0bCk7CisJCQllbXB0eV9tc2sgPQorCQkJICAgIERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPgorCQkJCQkgICBkZXZfZ2xvYmFsX3JlZ3MtPmR0a25xcjRfZmlmb2VtcHR5bXNrKTsKKworCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsCisJCQkJICAgICJJTiBFUCBJTlRFUlJVUFQgLSAlZFxuZXBtdHlfbXNrIC0gJTh4ICBkaWVwY3RsIC0gJTh4XG4iLAorCQkJCSAgICBlcG51bSwgZW1wdHlfbXNrLCBkZXBjdGwuZDMyKTsKKworCQkJRFdDX0RFQlVHUEwoREJHX1BDRCwKKwkJCQkgICAgIkVQJWQtJXM6IHR5cGU9JWQsIG1wcz0lZFxuIiwKKwkJCQkgICAgZHdjX2VwLT5udW0sIChkd2NfZXAtPmlzX2luID8gIklOIiA6ICJPVVQiKSwKKwkJCQkgICAgZHdjX2VwLT50eXBlLCBkd2NfZXAtPm1heHBhY2tldCk7CisKKwkJCWRpZXBpbnQuZDMyID0KKwkJCSAgICBkd2Nfb3RnX3JlYWRfZGV2X2luX2VwX2ludHIoY29yZV9pZiwgZHdjX2VwKTsKKworCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsCisJCQkJICAgICJFUCAlZCBJbnRlcnJ1cHQgUmVnaXN0ZXIgLSAweCV4XG4iLCBlcG51bSwKKwkJCQkgICAgZGllcGludC5kMzIpOworCQkJLyogVHJhbnNmZXIgY29tcGxldGUgKi8KKwkJCWlmIChkaWVwaW50LmIueGZlcmNvbXBsKSB7CisJCQkJLyogRGlzYWJsZSB0aGUgTlAgVHggRklGTyBFbXB0eQorCQkJCSAqIEludGVycnJ1cHQgKi8KKwkJCQlpZiAoY29yZV9pZi0+ZW5fbXVsdGlwbGVfdHhfZmlmbyA9PSAwKSB7CisJCQkJCWludHJfbWFzay5iLm5wdHhmZW1wdHkgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyCisJCQkJCSAgICAoJmNvcmVfaWYtPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRtc2ssCisJCQkJCSAgICAgaW50cl9tYXNrLmQzMiwgMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogRGlzYWJsZSB0aGUgVHggRklGTyBFbXB0eSBJbnRlcnJ1cHQgZm9yIHRoaXMgRVAgKi8KKwkJCQkJdWludDMyX3QgZmlmb2VtcHR5bXNrID0KKwkJCQkJICAgIDB4MSA8PCBkd2NfZXAtPm51bTsKKwkJCQkJRFdDX01PRElGWV9SRUczMigmY29yZV9pZi0+CisJCQkJCQkJIGRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kdGtucXI0X2ZpZm9lbXB0eW1zaywKKwkJCQkJCQkgZmlmb2VtcHR5bXNrLCAwKTsKKwkJCQl9CisJCQkJLyogQ2xlYXIgdGhlIGJpdCBpbiBESUVQSU5UbiBmb3IgdGhpcyBpbnRlcnJ1cHQgKi8KKwkJCQlDTEVBUl9JTl9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCB4ZmVyY29tcGwpOworCisJCQkJLyogQ29tcGxldGUgdGhlIHRyYW5zZmVyICovCisJCQkJaWYgKGVwbnVtID09IDApIHsKKwkJCQkJaGFuZGxlX2VwMChwY2QpOworCQkJCX0KKyNpZmRlZiBEV0NfRU5fSVNPQworCQkJCWVsc2UgaWYgKGR3Y19lcC0+dHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykgeworCQkJCQlpZiAoIWVwLT5zdG9wcGVkKQorCQkJCQkJY29tcGxldGVfaXNvX2VwKHBjZCwgZXApOworCQkJCX0KKyNlbmRpZiAvKiBEV0NfRU5fSVNPQyAqLworI2lmZGVmIERXQ19VVEVfUEVSX0lPCisJCQkJZWxzZSBpZiAoZHdjX2VwLT50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCQkJCWlmICghZXAtPnN0b3BwZWQpCisJCQkJCQljb21wbGV0ZV94aXNvX2VwKGVwKTsKKwkJCQl9CisjZW5kaWYgLyogRFdDX1VURV9QRVJfSU8gKi8KKwkJCQllbHNlIHsKKwkJCQkJaWYgKGR3Y19lcC0+dHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQyAmJiAKKwkJCQkJCQlkd2NfZXAtPmJJbnRlcnZhbCA+IDEpIHsKKwkJCQkJCWR3Y19lcC0+ZnJhbWVfbnVtICs9IGR3Y19lcC0+YkludGVydmFsOworCQkJCQkJaWYgKGR3Y19lcC0+ZnJhbWVfbnVtID4gMHgzRkZGKQorCQkJCQkJeworCQkJCQkJCWR3Y19lcC0+ZnJtX292ZXJydW4gPSAxOworCQkJCQkJCWR3Y19lcC0+ZnJhbWVfbnVtICY9IDB4M0ZGRjsKKwkJCQkJCX0gZWxzZSAKKwkJCQkJCQlkd2NfZXAtPmZybV9vdmVycnVuID0gMDsKKwkJCQkJfQorCQkJCQljb21wbGV0ZV9lcChlcCk7CisJCQkJCWlmKGRpZXBpbnQuYi5uYWspCisJCQkJCQlDTEVBUl9JTl9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBuYWspOworCQkJCX0KKwkJCX0KKwkJCS8qIEVuZHBvaW50IGRpc2FibGUgICAgICAqLworCQkJaWYgKGRpZXBpbnQuYi5lcGRpc2FibGVkKSB7CisJCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkVQJWQgSU4gZGlzYWJsZWRcbiIsCisJCQkJCSAgICBlcG51bSk7CisJCQkJaGFuZGxlX2luX2VwX2Rpc2FibGVfaW50cihwY2QsIGVwbnVtKTsKKworCQkJCS8qIENsZWFyIHRoZSBiaXQgaW4gRElFUElOVG4gZm9yIHRoaXMgaW50ZXJydXB0ICovCisJCQkJQ0xFQVJfSU5fRVBfSU5UUihjb3JlX2lmLCBlcG51bSwgZXBkaXNhYmxlZCk7CisJCQl9CisJCQkvKiBBSEIgRXJyb3IgKi8KKwkJCWlmIChkaWVwaW50LmIuYWhiZXJyKSB7CisJCQkJRFdDX0VSUk9SKCJFUCVkIElOIEFIQiBFcnJvclxuIiwgZXBudW0pOworCQkJCS8qIENsZWFyIHRoZSBiaXQgaW4gRElFUElOVG4gZm9yIHRoaXMgaW50ZXJydXB0ICovCisJCQkJQ0xFQVJfSU5fRVBfSU5UUihjb3JlX2lmLCBlcG51bSwgYWhiZXJyKTsKKwkJCX0KKwkJCS8qIFRpbWVPVVQgSGFuZHNoYWtlIChub24tSVNPQyBJTiBFUHMpICovCisJCQlpZiAoZGllcGludC5iLnRpbWVvdXQpIHsKKwkJCQlEV0NfRVJST1IoIkVQJWQgSU4gVGltZS1vdXRcbiIsIGVwbnVtKTsKKwkJCQloYW5kbGVfaW5fZXBfdGltZW91dF9pbnRyKHBjZCwgZXBudW0pOworCisJCQkJQ0xFQVJfSU5fRVBfSU5UUihjb3JlX2lmLCBlcG51bSwgdGltZW91dCk7CisJCQl9CisJCQkvKiogSU4gVG9rZW4gcmVjZWl2ZWQgd2l0aCBUeEYgRW1wdHkgKi8KKwkJCWlmIChkaWVwaW50LmIuaW50a3R4ZmVtcCkgeworCQkJCURXQ19ERUJVR1BMKERCR19BTlksCisJCQkJCSAgICAiRVAlZCBJTiBUS04gVHhGaWZvIEVtcHR5XG4iLAorCQkJCQkgICAgZXBudW0pOworCQkJCWlmICghZXAtPnN0b3BwZWQgJiYgZXBudW0gIT0gMCkgeworCisJCQkJCWRpZXBtc2tfZGF0YV90IGRpZXBtc2sgPSB7LmQzMiA9IDAgfTsKKwkJCQkJZGllcG1zay5iLmludGt0eGZlbXAgPSAxOworCisJCQkJCWlmIChjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQkJCQkJRFdDX01PRElGWV9SRUczMgorCQkJCQkJICAgICgmZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRpZXBlYWNoaW50bXNrCisJCQkJCQkgICAgIFtlcG51bV0sIGRpZXBtc2suZDMyLCAwKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCURXQ19NT0RJRllfUkVHMzIKKwkJCQkJCSAgICAoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kaWVwbXNrLAorCQkJCQkJICAgICBkaWVwbXNrLmQzMiwgMCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZQorCQkJCQkgICAmJiBlcG51bSA9PSAwCisJCQkJCSAgICYmIHBjZC0+ZXAwc3RhdGUgPT0KKwkJCQkJICAgRVAwX09VVF9TVEFUVVNfUEhBU0UpIHsKKwkJCQkJLy8gRVAwIElOIHNldCBTVEFMTAorCQkJCQlkZXBjdGwuZDMyID0KKwkJCQkJICAgIERXQ19SRUFEX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3MKKwkJCQkJCQkgICBbZXBudW1dLT5kaWVwY3RsKTsKKworCQkJCQkvKiBzZXQgdGhlIGRpc2FibGUgYW5kIHN0YWxsIGJpdHMgKi8KKwkJCQkJaWYgKGRlcGN0bC5iLmVwZW5hKSB7CisJCQkJCQlkZXBjdGwuYi5lcGRpcyA9IDE7CisJCQkJCX0KKwkJCQkJZGVwY3RsLmIuc3RhbGwgPSAxOworCQkJCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVncworCQkJCQkJCVtlcG51bV0tPmRpZXBjdGwsCisJCQkJCQkJZGVwY3RsLmQzMik7CisJCQkJfQorCQkJCUNMRUFSX0lOX0VQX0lOVFIoY29yZV9pZiwgZXBudW0sIGludGt0eGZlbXApOworCQkJfQorCQkJLyoqIElOIFRva2VuIFJlY2VpdmVkIHdpdGggRVAgbWlzbWF0Y2ggKi8KKwkJCWlmIChkaWVwaW50LmIuaW50a25lcG1pcykgeworCQkJCURXQ19ERUJVR1BMKERCR19BTlksCisJCQkJCSAgICAiRVAlZCBJTiBUS04gRVAgTWlzbWF0Y2hcbiIsIGVwbnVtKTsKKwkJCQlDTEVBUl9JTl9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBpbnRrbmVwbWlzKTsJCQkJCisJCQl9CisJCQkvKiogSU4gRW5kcG9pbnQgTkFLIEVmZmVjdGl2ZSAqLworCQkJaWYgKGRpZXBpbnQuYi5pbmVwbmFrZWZmKSB7CisJCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwKKwkJCQkJICAgICJFUCVkIElOIEVQIE5BSyBFZmZlY3RpdmVcbiIsCisJCQkJCSAgICBlcG51bSk7CisJCQkJLyogUGVyaW9kaWMgRVAgKi8KKwkJCQlpZiAoZXAtPmRpc2FibGluZykgeworCQkJCQlkZXBjdGwuZDMyID0gMDsKKwkJCQkJZGVwY3RsLmIuc25hayA9IDE7CisJCQkJCWRlcGN0bC5iLmVwZGlzID0gMTsKKwkJCQkJRFdDX01PRElGWV9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzCisJCQkJCQkJIFtlcG51bV0tPmRpZXBjdGwsCisJCQkJCQkJIGRlcGN0bC5kMzIsCisJCQkJCQkJIGRlcGN0bC5kMzIpOworCQkJCX0KKwkJCQlDTEVBUl9JTl9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBpbmVwbmFrZWZmKTsKKworCQkJfQorCisJCQkvKiogSU4gRVAgVHggRklGTyBFbXB0eSBJbnRyICovCisJCQlpZiAoZGllcGludC5iLmVtcHR5aW50cikgeworCQkJCURXQ19ERUJVR1BMKERCR19BTlksCisJCQkJCSAgICAiRVAlZCBUeCBGSUZPIEVtcHR5IEludHIgXG4iLAorCQkJCQkgICAgZXBudW0pOworCQkJCXdyaXRlX2VtcHR5X3R4X2ZpZm8ocGNkLCBlcG51bSk7CisKKwkJCQlDTEVBUl9JTl9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBlbXB0eWludHIpOworCisJCQl9CisKKwkJCS8qKiBJTiBFUCBCTkEgSW50ciAqLworCQkJaWYgKGRpZXBpbnQuYi5ibmEpIHsKKwkJCQlDTEVBUl9JTl9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBibmEpOworCQkJCWlmIChjb3JlX2lmLT5kbWFfZGVzY19lbmFibGUpIHsKKyNpZmRlZiBEV0NfRU5fSVNPQworCQkJCQlpZiAoZHdjX2VwLT50eXBlID09CisJCQkJCSAgICBEV0NfT1RHX0VQX1RZUEVfSVNPQykgeworCQkJCQkJLyoKKwkJCQkJCSAqIFRoaXMgY2hlY2tpbmcgaXMgcGVyZm9ybWVkIHRvIHByZXZlbnQgZmlyc3QgImZhbHNlIiBCTkEKKwkJCQkJCSAqIGhhbmRsaW5nIG9jY3VyaW5nIHJpZ2h0IGFmdGVyIHJlY29ubmVjdAorCQkJCQkJICovCisJCQkJCQlpZiAoZHdjX2VwLT5uZXh0X2ZyYW1lICE9CisJCQkJCQkgICAgMHhmZmZmZmZmZikKKwkJCQkJCQlkd2Nfb3RnX3BjZF9oYW5kbGVfaXNvX2JuYShlcCk7CisJCQkJCX0gZWxzZQorI2VuZGlmCQkJCS8qIERXQ19FTl9JU09DICovCisJCQkJCXsKKwkJCQkJCWR3Y19vdGdfcGNkX2hhbmRsZV9ub25pc29fYm5hKGVwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qIE5BSyBJbnRlcnJ1dHAgKi8KKwkJCWlmIChkaWVwaW50LmIubmFrKSB7CisJCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkVQJWQgSU4gTkFLIEludGVycnVwdFxuIiwKKwkJCQkJICAgIGVwbnVtKTsKKwkJCQlpZiAoZXAtPmR3Y19lcC50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKQorCQkJCXsKKwkJCQkJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJCQkJCWlmIChlcC0+ZHdjX2VwLmZyYW1lX251bSA9PSAweEZGRkZGRkZGKSAKKwkJCQkJeworCQkJCQkJZXAtPmR3Y19lcC5mcmFtZV9udW0gPSBjb3JlX2lmLT5mcmFtZV9udW07CisJCQkJCQlpZiAoZXAtPmR3Y19lcC5iSW50ZXJ2YWwgPiAxKSAKKwkJCQkJCXsKKwkJCQkJCQlkZXBjdGwuZDMyID0gMDsKKwkJCQkJCQlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tlcG51bV0tPmRpZXBjdGwpOworCQkJCQkJCWlmIChlcC0+ZHdjX2VwLmZyYW1lX251bSAmIDB4MSkgeworCQkJCQkJCQlkZXBjdGwuYi5zZXRkMXBpZCA9IDE7CisJCQkJCQkJCWRlcGN0bC5iLnNldGQwcGlkID0gMDsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQlkZXBjdGwuYi5zZXRkMHBpZCA9IDE7CisJCQkJCQkJCWRlcGN0bC5iLnNldGQxcGlkID0gMDsKKwkJCQkJCQl9CisJCQkJCQkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPmluX2VwX3JlZ3NbZXBudW1dLT5kaWVwY3RsLCBkZXBjdGwuZDMyKTsKKwkJCQkJCX0KKwkJCQkJCXN0YXJ0X25leHRfcmVxdWVzdChlcCk7CisJCQkJCX0KKwkJCQkJZXAtPmR3Y19lcC5mcmFtZV9udW0gKz0gZXAtPmR3Y19lcC5iSW50ZXJ2YWw7CisJCQkJCWlmIChkd2NfZXAtPmZyYW1lX251bSA+IDB4M0ZGRikKKwkJCQkJeworCQkJCQkJZHdjX2VwLT5mcm1fb3ZlcnJ1biA9IDE7CisJCQkJCQlkd2NfZXAtPmZyYW1lX251bSAmPSAweDNGRkY7CisJCQkJCX0gZWxzZSAKKwkJCQkJCWR3Y19lcC0+ZnJtX292ZXJydW4gPSAwOworCQkJCX0KKworCQkJCUNMRUFSX0lOX0VQX0lOVFIoY29yZV9pZiwgZXBudW0sIG5hayk7CisJCQl9CisJCX0KKwkJZXBudW0rKzsKKwkJZXBfaW50ciA+Pj0gMTsKKwl9CisKKwlyZXR1cm4gMTsKKyN1bmRlZiBDTEVBUl9JTl9FUF9JTlRSCit9CisKKy8qKgorICogVGhpcyBpbnRlcnJ1cHQgaW5kaWNhdGVzIHRoYXQgYW4gT1VUIEVQIGhhcyBhIHBlbmRpbmcgSW50ZXJydXB0LgorICogVGhlIHNlcXVlbmNlIGZvciBoYW5kbGluZyB0aGUgT1VUIEVQIGludGVycnVwdCBpcyBzaG93biBiZWxvdzoKKyAqIC0jCVJlYWQgdGhlIERldmljZSBBbGwgRW5kcG9pbnQgSW50ZXJydXB0IHJlZ2lzdGVyCisgKiAtIwlSZXBlYXQgdGhlIGZvbGxvd2luZyBmb3IgZWFjaCBPVVQgRVAgaW50ZXJydXB0IGJpdCBzZXQgKGZyb20KKyAqCQlMU0IgdG8gTVNCKS4KKyAqIC0jCVJlYWQgdGhlIERldmljZSBFbmRwb2ludCBJbnRlcnJ1cHQgKERPRVBJTlRuKSByZWdpc3RlcgorICogLSMJSWYgIlRyYW5zZmVyIENvbXBsZXRlIiBjYWxsIHRoZSByZXF1ZXN0IGNvbXBsZXRlIGZ1bmN0aW9uCisgKiAtIwlJZiAiRW5kcG9pbnQgRGlzYWJsZWQiIGNvbXBsZXRlIHRoZSBFUCBkaXNhYmxlIHByb2NlZHVyZS4KKyAqIC0jCUlmICJBSEIgRXJyb3IgSW50ZXJydXB0IiBsb2cgZXJyb3IKKyAqIC0jCUlmICJTZXR1cCBQaGFzZSBEb25lIiBwcm9jZXNzIFNldHVwIFBhY2tldCAoU2VlIFN0YW5kYXJkIFVTQgorICoJCUNvbW1hbmQgUHJvY2Vzc2luZykKKyAqLworc3RhdGljIGludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX291dF9lcF9pbnRyKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisjZGVmaW5lIENMRUFSX09VVF9FUF9JTlRSKF9fY29yZV9pZixfX2VwbnVtLF9faW50cikgXAorZG8geyBcCisJCWRvZXBpbnRfZGF0YV90IGRvZXBpbnQgPSB7LmQzMj0wfTsgXAorCQlkb2VwaW50LmIuX19pbnRyID0gMTsgXAorCQlEV0NfV1JJVEVfUkVHMzIoJl9fY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tfX2VwbnVtXS0+ZG9lcGludCwgXAorCQlkb2VwaW50LmQzMik7IFwKK30gd2hpbGUgKDApCisKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJdWludDMyX3QgZXBfaW50cjsKKwlkb2VwaW50X2RhdGFfdCBkb2VwaW50ID0gey5kMzIgPSAwIH07CisJdWludDMyX3QgZXBudW0gPSAwOworCWR3Y19vdGdfcGNkX2VwX3QgKmVwOworCWR3Y19lcF90ICpkd2NfZXA7CisJZGN0bF9kYXRhX3QgZGN0bCA9IHsuZDMyID0gMCB9OworCWdpbnRtc2tfZGF0YV90IGdpbnRtc2sgPSB7LmQzMiA9IDAgfTsKKworCisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBSZWFkIGluIHRoZSBkZXZpY2UgaW50ZXJydXB0IGJpdHMgKi8KKwllcF9pbnRyID0gZHdjX290Z19yZWFkX2Rldl9hbGxfb3V0X2VwX2ludHIoY29yZV9pZik7CisKKwl3aGlsZSAoZXBfaW50cikgeworCQlpZiAoZXBfaW50ciAmIDB4MSkgeworCQkJLyogR2V0IEVQIHBvaW50ZXIgKi8KKwkJCWVwID0gZ2V0X291dF9lcChwY2QsIGVwbnVtKTsKKwkJCWR3Y19lcCA9ICZlcC0+ZHdjX2VwOworCisjaWZkZWYgVkVSQk9TRQorCQkJRFdDX0RFQlVHUEwoREJHX1BDRFYsCisJCQkJICAgICJFUCVkLSVzOiB0eXBlPSVkLCBtcHM9JWRcbiIsCisJCQkJICAgIGR3Y19lcC0+bnVtLCAoZHdjX2VwLT5pc19pbiA/ICJJTiIgOiAiT1VUIiksCisJCQkJICAgIGR3Y19lcC0+dHlwZSwgZHdjX2VwLT5tYXhwYWNrZXQpOworI2VuZGlmCisJCQlkb2VwaW50LmQzMiA9CisJCQkgICAgZHdjX290Z19yZWFkX2Rldl9vdXRfZXBfaW50cihjb3JlX2lmLCBkd2NfZXApOworCisJCQkvKiBUcmFuc2ZlciBjb21wbGV0ZSAqLworCQkJaWYgKGRvZXBpbnQuYi54ZmVyY29tcGwpIHsKKworCQkJCWlmIChlcG51bSA9PSAwKSB7CisJCQkJCS8qIENsZWFyIHRoZSBiaXQgaW4gRE9FUElOVG4gZm9yIHRoaXMgaW50ZXJydXB0ICovCisJCQkJCUNMRUFSX09VVF9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLAorCQkJCQkJCSAgeGZlcmNvbXBsKTsKKwkJCQkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSA9PSAwCisJCQkJCSAgICB8fCBwY2QtPmVwMHN0YXRlICE9IEVQMF9JRExFKQorCQkJCQkJaGFuZGxlX2VwMChwY2QpOworI2lmZGVmIERXQ19FTl9JU09DCisJCQkJfSBlbHNlIGlmIChkd2NfZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJCQkJaWYgKGRvZXBpbnQuYi5wa3RkcnBzdHMgPT0gMCkgeworCQkJCQkJLyogQ2xlYXIgdGhlIGJpdCBpbiBET0VQSU5UbiBmb3IgdGhpcyBpbnRlcnJ1cHQgKi8KKwkJCQkJCUNMRUFSX09VVF9FUF9JTlRSKGNvcmVfaWYsCisJCQkJCQkJCSAgZXBudW0sCisJCQkJCQkJCSAgeGZlcmNvbXBsKTsKKwkJCQkJCWNvbXBsZXRlX2lzb19lcChwY2QsIGVwKTsKKwkJCQkJfSBlbHNlIHsKKworCQkJCQkJZG9lcGludF9kYXRhX3QgZG9lcGludCA9IHsuZDMyID0gMCB9OworCQkJCQkJZG9lcGludC5iLnhmZXJjb21wbCA9IDE7CisJCQkJCQlkb2VwaW50LmIucGt0ZHJwc3RzID0gMTsKKwkJCQkJCURXQ19XUklURV9SRUczMgorCQkJCQkJICAgICgmY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVncworCQkJCQkJICAgICBbZXBudW1dLT5kb2VwaW50LAorCQkJCQkJICAgICBkb2VwaW50LmQzMik7CisJCQkJCQlpZiAoaGFuZGxlX2lzb19vdXRfcGt0X2Ryb3BwZWQKKwkJCQkJCSAgICAoY29yZV9pZiwgZHdjX2VwKSkgeworCQkJCQkJCWNvbXBsZXRlX2lzb19lcChwY2QsCisJCQkJCQkJCQllcCk7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZiAvKiBEV0NfRU5fSVNPQyAqLworI2lmZGVmIERXQ19VVEVfUEVSX0lPCisJCQkJfSBlbHNlIGlmIChkd2NfZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJCQkJQ0xFQVJfT1VUX0VQX0lOVFIoY29yZV9pZiwgZXBudW0sIHhmZXJjb21wbCk7CisJCQkJCWlmICghZXAtPnN0b3BwZWQpCisJCQkJCQljb21wbGV0ZV94aXNvX2VwKGVwKTsKKyNlbmRpZiAvKiBEV0NfVVRFX1BFUl9JTyAqLworCQkJCX0gZWxzZSB7CisJCQkJCS8qIENsZWFyIHRoZSBiaXQgaW4gRE9FUElOVG4gZm9yIHRoaXMgaW50ZXJydXB0ICovCisJCQkJCUNMRUFSX09VVF9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLAorCQkJCQkJCSAgeGZlcmNvbXBsKTsKKworCQkJCQlpZiAoY29yZV9pZi0+Y29yZV9wYXJhbXMtPmRldl9vdXRfbmFrKSB7CisJCQkJCQlEV0NfVElNRVJfQ0FOQ0VMKHBjZC0+Y29yZV9pZi0+ZXBfeGZlcl90aW1lcltlcG51bV0pOworCQkJCQkJcGNkLT5jb3JlX2lmLT5lcF94ZmVyX2luZm9bZXBudW1dLnN0YXRlID0gMDsKKyNpZmRlZiBERUJVRworCQkJCQkJcHJpbnRfbWVtb3J5X3BheWxvYWQocGNkLCBkd2NfZXApOworI2VuZGlmCisJCQkJCX0KKwkJCQkJY29tcGxldGVfZXAoZXApOwkJCQkJCQorCQkJCX0KKworCQkJfQorCisJCQkvKiBFbmRwb2ludCBkaXNhYmxlICAgICAgKi8KKwkJCWlmIChkb2VwaW50LmIuZXBkaXNhYmxlZCkgeworCisJCQkJLyogQ2xlYXIgdGhlIGJpdCBpbiBET0VQSU5UbiBmb3IgdGhpcyBpbnRlcnJ1cHQgKi8KKwkJCQlDTEVBUl9PVVRfRVBfSU5UUihjb3JlX2lmLCBlcG51bSwgZXBkaXNhYmxlZCk7CisJCQkJaWYgKGNvcmVfaWYtPmNvcmVfcGFyYW1zLT5kZXZfb3V0X25haykgeworI2lmZGVmIERFQlVHCisJCQkJCXByaW50X21lbW9yeV9wYXlsb2FkKHBjZCwgZHdjX2VwKTsKKyNlbmRpZgorCQkJCQkvKiBJbiBjYXNlIG9mIHRpbWVvdXQgY29uZGl0aW9uICovCisJCQkJCWlmIChjb3JlX2lmLT5lcF94ZmVyX2luZm9bZXBudW1dLnN0YXRlID09IDIpIHsKKwkJCQkJCWRjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJCQkJCQkJZGV2X2dsb2JhbF9yZWdzLT5kY3RsKTsKKwkJCQkJCWRjdGwuYi5jZ291dG5hayA9IDE7CisJCQkJCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsLAorCQkJCQkJCQkJCQkJCQkJCWRjdGwuZDMyKTsKKwkJCQkJCS8qIFVubWFzayBnb3V0bmFrZWZmIGludGVycnVwdCB3aGljaCB3YXMgbWFza2VkCisJCQkJCQkgKiBkdXJpbmcgaGFuZGxlIG5hayBvdXQgaW50ZXJydXB0ICovCisJCQkJCQlnaW50bXNrLmIuZ291dG5ha2VmZiA9IDE7CisJCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLAorCQkJCQkJCQkJCQkJCQkJCTAsIGdpbnRtc2suZDMyKTsKKwkJCQkJCisJCQkJCQljb21wbGV0ZV9lcChlcCk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGVwLT5kd2NfZXAudHlwZSA9PSBEV0NfT1RHX0VQX1RZUEVfSVNPQykKKwkJCQl7CisJCQkJCWRjdGxfZGF0YV90IGRjdGw7CisJCQkJCWdpbnRtc2tfZGF0YV90IGludHJfbWFzayA9IHsuZDMyID0gMH07CisJCQkJCWR3Y19vdGdfcGNkX3JlcXVlc3RfdCAqcmVxID0gMDsKKworCQkJCQlkY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPgorCQkJCQkJZGV2X2dsb2JhbF9yZWdzLT5kY3RsKTsKKwkJCQkJZGN0bC5iLmNnb3V0bmFrID0gMTsKKwkJCQkJRFdDX1dSSVRFX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCwKKwkJCQkJCWRjdGwuZDMyKTsKKworCQkJCQlpbnRyX21hc2suZDMyID0gMDsKKwkJCQkJaW50cl9tYXNrLmIuaW5jb21wbGlzb291dCA9IDE7CSAgIAorCisJCQkJCS8qIEdldCBhbnkgcGVuZGluZyByZXF1ZXN0cyAqLworCQkJCQlpZiAoIURXQ19DSVJDTEVRX0VNUFRZKCZlcC0+cXVldWUpKSB7CisJCQkJCQlyZXEgPSBEV0NfQ0lSQ0xFUV9GSVJTVCgmZXAtPnF1ZXVlKTsKKwkJCQkJCWlmICghcmVxKSB7CisJCQkJCQkJRFdDX1BSSU5URigiY29tcGxldGVfZXAgMHglcCwgcmVxID0gTlVMTCFcbiIsIGVwKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZHdjX290Z19yZXF1ZXN0X2RvbmUoZXAsIHJlcSwgMCk7CisJCQkJCQkJc3RhcnRfbmV4dF9yZXF1ZXN0KGVwKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCURXQ19QUklOVEYoImNvbXBsZXRlX2VwIDB4JXAsIGVwLT5xdWV1ZSBlbXB0eSFcbiIsIGVwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qIEFIQiBFcnJvciAqLworCQkJaWYgKGRvZXBpbnQuYi5haGJlcnIpIHsKKwkJCQlEV0NfRVJST1IoIkVQJWQgT1VUIEFIQiBFcnJvclxuIiwgZXBudW0pOworCQkJCURXQ19FUlJPUigiRVAlZCBERVBETUE9MHglMDh4IFxuIiwKKwkJCQkJICBlcG51bSwgY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tlcG51bV0tPmRvZXBkbWEpOworCQkJCUNMRUFSX09VVF9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBhaGJlcnIpOworCQkJfQorCQkJLyogU2V0dXAgUGhhc2UgRG9uZSAoY29udG9ybCBFUHMpICovCisJCQlpZiAoZG9lcGludC5iLnNldHVwKSB7CisjaWZkZWYgREVCVUdfRVAwCisJCQkJRFdDX0RFQlVHUEwoREJHX1BDRCwgIkVQJWQgU0VUVVAgRG9uZVxuIiwKKwkJCQkJICAgIGVwbnVtKTsKKyNlbmRpZgorCQkJCUNMRUFSX09VVF9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBzZXR1cCk7CisKKwkJCQloYW5kbGVfZXAwKHBjZCk7CisJCQl9CisKKwkJCS8qKiBPVVQgRVAgQk5BIEludHIgKi8KKwkJCWlmIChkb2VwaW50LmIuYm5hKSB7CisJCQkJQ0xFQVJfT1VUX0VQX0lOVFIoY29yZV9pZiwgZXBudW0sIGJuYSk7CisJCQkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworI2lmZGVmIERXQ19FTl9JU09DCisJCQkJCWlmIChkd2NfZXAtPnR5cGUgPT0KKwkJCQkJICAgIERXQ19PVEdfRVBfVFlQRV9JU09DKSB7CisJCQkJCQkvKgorCQkJCQkJICogVGhpcyBjaGVja2luZyBpcyBwZXJmb3JtZWQgdG8gcHJldmVudCBmaXJzdCAiZmFsc2UiIEJOQQorCQkJCQkJICogaGFuZGxpbmcgb2NjdXJpbmcgcmlnaHQgYWZ0ZXIgcmVjb25uZWN0CisJCQkJCQkgKi8KKwkJCQkJCWlmIChkd2NfZXAtPm5leHRfZnJhbWUgIT0KKwkJCQkJCSAgICAweGZmZmZmZmZmKQorCQkJCQkJCWR3Y19vdGdfcGNkX2hhbmRsZV9pc29fYm5hKGVwKTsKKwkJCQkJfSBlbHNlCisjZW5kaWYJCQkJLyogRFdDX0VOX0lTT0MgKi8KKwkJCQkJeworCQkJCQkJZHdjX290Z19wY2RfaGFuZGxlX25vbmlzb19ibmEoZXApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGRvZXBpbnQuYi5zdHNwaHNlcmN2ZCkgeworCQkJCUNMRUFSX09VVF9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBzdHNwaHNlcmN2ZCk7CisJCQkJaWYgKGNvcmVfaWYtPmRtYV9kZXNjX2VuYWJsZSkgeworCQkJCQlkb19zZXR1cF9pbl9zdGF0dXNfcGhhc2UocGNkKTsKKwkJCQl9CisJCQl9CisJCQkvKiBCYWJibGUgSW50ZXJydXRwICovCisJCQlpZiAoZG9lcGludC5iLmJhYmJsZSkgeworCQkJCURXQ19ERUJVR1BMKERCR19BTlksICJFUCVkIE9VVCBCYWJibGVcbiIsCisJCQkJCSAgICBlcG51bSk7CisJCQkJaGFuZGxlX291dF9lcF9iYWJibGVfaW50cihwY2QsIGVwbnVtKTsKKworCQkJCUNMRUFSX09VVF9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBiYWJibGUpOworCQkJfQorCQkJaWYgKGRvZXBpbnQuYi5vdXR0a25lcGRpcykKKwkJCXsKKwkJCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiRVAlZCBPVVQgVG9rZW4gcmVjZWl2ZWQgd2hlbiBFUCBpcyBcCisJCQkJCWRpc2FibGVkXG4iLGVwbnVtKTsKKwkJCQlpZiAoZXAtPmR3Y19lcC50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKQorCQkJCXsKKwkJCQkJZG9lcG1za19kYXRhX3QgZG9lcG1zayA9IHsuZDMyID0gMH07CisJCQkJCWVwLT5kd2NfZXAuZnJhbWVfbnVtID0gY29yZV9pZi0+ZnJhbWVfbnVtOworCQkJCQlpZiAoZXAtPmR3Y19lcC5iSW50ZXJ2YWwgPiAxKSAKKwkJCQkJeworCQkJCQkJZGVwY3RsX2RhdGFfdCBkZXBjdGw7CisJCQkJCQlkZXBjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJCQkJCQkJCQkJb3V0X2VwX3JlZ3NbZXBudW1dLT5kb2VwY3RsKTsKKwkJCQkJCWlmIChlcC0+ZHdjX2VwLmZyYW1lX251bSAmIDB4MSkgeworCQkJCQkJCWRlcGN0bC5iLnNldGQxcGlkID0gMTsKKwkJCQkJCQlkZXBjdGwuYi5zZXRkMHBpZCA9IDA7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWRlcGN0bC5iLnNldGQwcGlkID0gMTsKKwkJCQkJCQlkZXBjdGwuYi5zZXRkMXBpZCA9IDA7CisJCQkJCQl9CisJCQkJCQlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+CisJCQkJCQkJCQkJb3V0X2VwX3JlZ3NbZXBudW1dLT5kb2VwY3RsLCBkZXBjdGwuZDMyKTsKKwkJCQkJfQorCQkJCQlzdGFydF9uZXh0X3JlcXVlc3QoZXApOworCQkJCQlkb2VwbXNrLmIub3V0dGtuZXBkaXMgPSAxOworCQkJCQlEV0NfTU9ESUZZX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZG9lcG1zaywgCisJCQkJCQkJCSBkb2VwbXNrLmQzMiwgMCk7CisJCQkJfQorCQkJCUNMRUFSX09VVF9FUF9JTlRSKGNvcmVfaWYsIGVwbnVtLCBvdXR0a25lcGRpcyk7CisJCQl9CisJCQkKKwkJCS8qIE5BSyBJbnRlcnJ1dHAgKi8KKwkJCWlmIChkb2VwaW50LmIubmFrKSB7CisJCQkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIkVQJWQgT1VUIE5BS1xuIiwgZXBudW0pOworCQkJCWhhbmRsZV9vdXRfZXBfbmFrX2ludHIocGNkLCBlcG51bSk7CisKKwkJCQlDTEVBUl9PVVRfRVBfSU5UUihjb3JlX2lmLCBlcG51bSwgbmFrKTsKKwkJCX0KKwkJCS8qIE5ZRVQgSW50ZXJydXRwICovCisJCQlpZiAoZG9lcGludC5iLm55ZXQpIHsKKwkJCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiRVAlZCBPVVQgTllFVFxuIiwgZXBudW0pOworCQkJCWhhbmRsZV9vdXRfZXBfbnlldF9pbnRyKHBjZCwgZXBudW0pOworCisJCQkJQ0xFQVJfT1VUX0VQX0lOVFIoY29yZV9pZiwgZXBudW0sIG55ZXQpOworCQkJfQorCQl9CisKKwkJZXBudW0rKzsKKwkJZXBfaW50ciA+Pj0gMTsKKwl9CisKKwlyZXR1cm4gMTsKKworI3VuZGVmIENMRUFSX09VVF9FUF9JTlRSCit9CitzdGF0aWMgaW50IGRyb3BfdHJhbnNmZXIodWludDMyX3QgdHJndF9mciwgdWludDMyX3QgY3Vycl9mciwgdWludDhfdCBmcm1fb3ZlcnJ1bikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpZighZnJtX292ZXJydW4gJiYgY3Vycl9mciA+PSB0cmd0X2ZyKSAKKwkJcmV0dmFsID0gMTsKKwllbHNlIGlmIChmcm1fb3ZlcnJ1biAmJiAoY3Vycl9mciA+PSB0cmd0X2ZyICYmICgoY3Vycl9mciAtIHRyZ3RfZnIpIDwgMHgzRkZGLzIpKSkKKwkJcmV0dmFsID0gMTsKKwlyZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBJbmNvbXBsZXRlIElTTyBJTiBUcmFuc2ZlciBJbnRlcnJ1cHQuCisgKiBUaGlzIGludGVycnVwdCBpbmRpY2F0ZXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBvY2N1cnJlZAorICogd2hpbGUgdHJhbnNtaXR0aW5nIGFuIElTT0MgdHJhbnNhY3Rpb24uCisgKiAtIENvcnJ1cHRlZCBJTiBUb2tlbiBmb3IgSVNPQyBFUC4KKyAqIC0gUGFja2V0IG5vdCBjb21wbGV0ZSBpbiBGSUZPLgorICogVGhlIGZvbGxvdyBhY3Rpb25zIHdpbGwgYmUgdGFrZW46CisgKgktIwlEZXRlcm1pbmUgdGhlIEVQCisgKgktIwlTZXQgaW5jb21wbGV0ZSBmbGFnIGluIGR3Y19lcCBzdHJ1Y3R1cmUKKyAqCS0jCURpc2FibGUgRVA7IHdoZW4gIkVuZHBvaW50IERpc2FibGVkIiBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQKKyAqCQlGbHVzaCBGSUZPCisgKi8KK2ludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2luY29tcGxldGVfaXNvY19pbl9pbnRyKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKworI2lmZGVmIERXQ19FTl9JU09DCisJZHdjX290Z19kZXZfaWZfdCAqZGV2X2lmOworCWRlcHRzaXpfZGF0YV90IGRlcHRzaXogPSB7LmQzMiA9IDAgfTsKKwlkZXBjdGxfZGF0YV90IGRlcGN0bCA9IHsuZDMyID0gMCB9OworCWRzdHNfZGF0YV90IGRzdHMgPSB7LmQzMiA9IDAgfTsKKwlkd2NfZXBfdCAqZHdjX2VwOworCWludCBpOworCisJZGV2X2lmID0gR0VUX0NPUkVfSUYocGNkKS0+ZGV2X2lmOworCisJZm9yIChpID0gMTsgaSA8PSBkZXZfaWYtPm51bV9pbl9lcHM7ICsraSkgeworCQlkd2NfZXAgPSAmcGNkLT5pbl9lcFtpXS5kd2NfZXA7CisJCWlmIChkd2NfZXAtPmFjdGl2ZSAmJiBkd2NfZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJCWRlcHRzaXouZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwdHNpeik7CisJCQlkZXBjdGwuZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwY3RsKTsKKworCQkJaWYgKGRlcGN0bC5iLmVwZGlzICYmIGRlcHRzaXouZDMyKSB7CisJCQkJc2V0X2N1cnJlbnRfcGt0X2luZm8oR0VUX0NPUkVfSUYocGNkKSwgZHdjX2VwKTsKKwkJCQlpZiAoZHdjX2VwLT5jdXJfcGt0ID49IGR3Y19lcC0+cGt0X2NudCkgeworCQkJCQlkd2NfZXAtPmN1cl9wa3QgPSAwOworCQkJCQlkd2NfZXAtPnByb2NfYnVmX251bSA9CisJCQkJCSAgICAoZHdjX2VwLT5wcm9jX2J1Zl9udW0gXiAxKSAmIDB4MTsKKworCQkJCQlpZiAoZHdjX2VwLT5wcm9jX2J1Zl9udW0pIHsKKwkJCQkJCWR3Y19lcC0+Y3VyX3BrdF9hZGRyID0KKwkJCQkJCSAgICBkd2NfZXAtPnhmZXJfYnVmZjE7CisJCQkJCQlkd2NfZXAtPmN1cl9wa3RfZG1hX2FkZHIgPQorCQkJCQkJICAgIGR3Y19lcC0+ZG1hX2FkZHIxOworCQkJCQl9IGVsc2UgeworCQkJCQkJZHdjX2VwLT5jdXJfcGt0X2FkZHIgPQorCQkJCQkJICAgIGR3Y19lcC0+eGZlcl9idWZmMDsKKwkJCQkJCWR3Y19lcC0+Y3VyX3BrdF9kbWFfYWRkciA9CisJCQkJCQkgICAgZHdjX2VwLT5kbWFfYWRkcjA7CisJCQkJCX0KKworCQkJCX0KKworCQkJCWRzdHMuZDMyID0KKwkJCQkgICAgRFdDX1JFQURfUkVHMzIoJkdFVF9DT1JFX0lGKHBjZCktPmRldl9pZi0+CisJCQkJCQkgICBkZXZfZ2xvYmFsX3JlZ3MtPmRzdHMpOworCQkJCWR3Y19lcC0+bmV4dF9mcmFtZSA9IGRzdHMuYi5zb2ZmbjsKKworCQkJCWR3Y19vdGdfaXNvX2VwX3N0YXJ0X2ZybV90cmFuc2ZlcihHRVRfQ09SRV9JRgorCQkJCQkJCQkgIChwY2QpLAorCQkJCQkJCQkgIGR3Y19lcCk7CisJCQl9CisJCX0KKwl9CisKKyNlbHNlCisJZGVwY3RsX2RhdGFfdCBkZXBjdGwgPSB7LmQzMiA9IDAgfTsKKwlkd2NfZXBfdCAqZHdjX2VwOworCWR3Y19vdGdfZGV2X2lmX3QgKmRldl9pZjsKKwlpbnQgaTsKKwlkZXZfaWYgPSBHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWY7CisKKwlEV0NfREVCVUdQTChEQkdfUENELCJJbmNvbXBsZXRlIElTTyBJTiBcbiIpOworCQorCWZvciAoaSA9IDE7IGkgPD0gZGV2X2lmLT5udW1faW5fZXBzOyArK2kpIHsKKwkJZHdjX2VwID0gJnBjZC0+aW5fZXBbaS0xXS5kd2NfZXA7CisJCWRlcGN0bC5kMzIgPQorCQkJRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGN0bCk7CisJCWlmIChkZXBjdGwuYi5lcGVuYSAmJiBkd2NfZXAtPnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJCWlmIChkcm9wX3RyYW5zZmVyKGR3Y19lcC0+ZnJhbWVfbnVtLCBHRVRfQ09SRV9JRihwY2QpLT5mcmFtZV9udW0sIAorCQkJCQkJCWR3Y19lcC0+ZnJtX292ZXJydW4pKQorCQkJeworCQkJCWRlcGN0bC5kMzIgPQorCQkJCQlEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwY3RsKTsKKwkJCQlkZXBjdGwuYi5zbmFrID0gMTsKKwkJCQlkZXBjdGwuYi5lcGRpcyA9IDE7CisJCQkJRFdDX01PRElGWV9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwY3RsLCBkZXBjdGwuZDMyLCBkZXBjdGwuZDMyKTsKKwkJCX0KKwkJfQorCX0KKworCS8qaW50cl9tYXNrLmIuaW5jb21wbGlzb2luID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLAorCQkJIGludHJfbWFzay5kMzIsIDApOwkgKi8KKyNlbmRpZgkJCQkvL0RXQ19FTl9JU09DCisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwlnaW50c3RzLmQzMiA9IDA7CisJZ2ludHN0cy5iLmluY29tcGxpc29pbiA9IDE7CisJRFdDX1dSSVRFX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50c3RzLAorCQkJZ2ludHN0cy5kMzIpOworCisJcmV0dXJuIDE7Cit9CisKKy8qKgorICogSW5jb21wbGV0ZSBJU08gT1VUIFRyYW5zZmVyIEludGVycnVwdC4KKyAqCisgKiBUaGlzIGludGVycnVwdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29yZSBoYXMgZHJvcHBlZCBhbiBJU08gT1VUCisgKiBwYWNrZXQuIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBjYW4gYmUgdGhlIGNhdXNlOgorICogLSBGSUZPIEZ1bGwsIHRoZSBlbnRpcmUgcGFja2V0IHdvdWxkIG5vdCBmaXQgaW4gdGhlIEZJRk8uCisgKiAtIENSQyBFcnJvcgorICogLSBDb3JydXB0ZWQgVG9rZW4KKyAqIFRoZSBmb2xsb3cgYWN0aW9ucyB3aWxsIGJlIHRha2VuOgorICoJLSMJRGV0ZXJtaW5lIHRoZSBFUAorICoJLSMJU2V0IGluY29tcGxldGUgZmxhZyBpbiBkd2NfZXAgc3RydWN0dXJlCisgKgktIwlSZWFkIGFueSBkYXRhIGZyb20gdGhlIEZJRk8KKyAqCS0jCURpc2FibGUgRVAuIFdoZW4gIkVuZHBvaW50IERpc2FibGVkIiBpbnRlcnJ1cHQgaXMgcmVjZWl2ZWQKKyAqCQlyZS1lbmFibGUgRVAuCisgKi8KK2ludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2luY29tcGxldGVfaXNvY19vdXRfaW50cihkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKworI2lmZGVmIERXQ19FTl9JU09DCisJZHdjX290Z19kZXZfaWZfdCAqZGV2X2lmOworCWRlcHRzaXpfZGF0YV90IGRlcHRzaXogPSB7LmQzMiA9IDAgfTsKKwlkZXBjdGxfZGF0YV90IGRlcGN0bCA9IHsuZDMyID0gMCB9OworCWRzdHNfZGF0YV90IGRzdHMgPSB7LmQzMiA9IDAgfTsKKwlkd2NfZXBfdCAqZHdjX2VwOworCWludCBpOworCisJZGV2X2lmID0gR0VUX0NPUkVfSUYocGNkKS0+ZGV2X2lmOworCisJZm9yIChpID0gMTsgaSA8PSBkZXZfaWYtPm51bV9vdXRfZXBzOyArK2kpIHsKKwkJZHdjX2VwID0gJnBjZC0+aW5fZXBbaV0uZHdjX2VwOworCQlpZiAocGNkLT5vdXRfZXBbaV0uZHdjX2VwLmFjdGl2ZSAmJgorCQkgICAgcGNkLT5vdXRfZXBbaV0uZHdjX2VwLnR5cGUgPT0gRFdDX09UR19FUF9UWVBFX0lTT0MpIHsKKwkJCWRlcHRzaXouZDMyID0KKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5vdXRfZXBfcmVnc1tpXS0+ZG9lcHRzaXopOworCQkJZGVwY3RsLmQzMiA9CisJCQkgICAgRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+b3V0X2VwX3JlZ3NbaV0tPmRvZXBjdGwpOworCisJCQlpZiAoZGVwY3RsLmIuZXBkaXMgJiYgZGVwdHNpei5kMzIpIHsKKwkJCQlzZXRfY3VycmVudF9wa3RfaW5mbyhHRVRfQ09SRV9JRihwY2QpLAorCQkJCQkJICAgICAmcGNkLT5vdXRfZXBbaV0uZHdjX2VwKTsKKwkJCQlpZiAoZHdjX2VwLT5jdXJfcGt0ID49IGR3Y19lcC0+cGt0X2NudCkgeworCQkJCQlkd2NfZXAtPmN1cl9wa3QgPSAwOworCQkJCQlkd2NfZXAtPnByb2NfYnVmX251bSA9CisJCQkJCSAgICAoZHdjX2VwLT5wcm9jX2J1Zl9udW0gXiAxKSAmIDB4MTsKKworCQkJCQlpZiAoZHdjX2VwLT5wcm9jX2J1Zl9udW0pIHsKKwkJCQkJCWR3Y19lcC0+Y3VyX3BrdF9hZGRyID0KKwkJCQkJCSAgICBkd2NfZXAtPnhmZXJfYnVmZjE7CisJCQkJCQlkd2NfZXAtPmN1cl9wa3RfZG1hX2FkZHIgPQorCQkJCQkJICAgIGR3Y19lcC0+ZG1hX2FkZHIxOworCQkJCQl9IGVsc2UgeworCQkJCQkJZHdjX2VwLT5jdXJfcGt0X2FkZHIgPQorCQkJCQkJICAgIGR3Y19lcC0+eGZlcl9idWZmMDsKKwkJCQkJCWR3Y19lcC0+Y3VyX3BrdF9kbWFfYWRkciA9CisJCQkJCQkgICAgZHdjX2VwLT5kbWFfYWRkcjA7CisJCQkJCX0KKworCQkJCX0KKworCQkJCWRzdHMuZDMyID0KKwkJCQkgICAgRFdDX1JFQURfUkVHMzIoJkdFVF9DT1JFX0lGKHBjZCktPmRldl9pZi0+CisJCQkJCQkgICBkZXZfZ2xvYmFsX3JlZ3MtPmRzdHMpOworCQkJCWR3Y19lcC0+bmV4dF9mcmFtZSA9IGRzdHMuYi5zb2ZmbjsKKworCQkJCWR3Y19vdGdfaXNvX2VwX3N0YXJ0X2ZybV90cmFuc2ZlcihHRVRfQ09SRV9JRgorCQkJCQkJCQkgIChwY2QpLAorCQkJCQkJCQkgIGR3Y19lcCk7CisJCQl9CisJCX0KKwl9CisjZWxzZQorCS8qKiBAdG9kbyBpbXBsZW1lbnQgSVNSICovCisJZ2ludG1za19kYXRhX3QgaW50cl9tYXNrID0gey5kMzIgPSAwIH07CisJZHdjX290Z19jb3JlX2lmX3QgKmNvcmVfaWY7CisJZGVwdHNpel9kYXRhX3QgZGVwdHNpeiA9IHsuZDMyID0gMCB9OworCWRlcGN0bF9kYXRhX3QgZGVwY3RsID0gey5kMzIgPSAwIH07CisJZGN0bF9kYXRhX3QgZGN0bCA9IHsuZDMyID0gMCB9OworCWR3Y19lcF90ICpkd2NfZXAgPSBOVUxMOworCWludCBpOworCWNvcmVfaWYgPSBHRVRfQ09SRV9JRihwY2QpOworCisJZm9yIChpID0gMDsgaSA8IGNvcmVfaWYtPmRldl9pZi0+bnVtX291dF9lcHM7ICsraSkgeworCQlkd2NfZXAgPSAmcGNkLT5vdXRfZXBbaV0uZHdjX2VwOworCQlkZXBjdGwuZDMyID0KKwkJCURXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPm91dF9lcF9yZWdzW2R3Y19lcC0+bnVtXS0+ZG9lcGN0bCk7CisJCWlmIChkZXBjdGwuYi5lcGVuYSAmJiBkZXBjdGwuYi5kcGlkID09IChjb3JlX2lmLT5mcmFtZV9udW0gJiAweDEpKSB7CisJCQljb3JlX2lmLT5kZXZfaWYtPmlzb2NfZXAgPSBkd2NfZXA7CQorCQkJZGVwdHNpei5kMzIgPQorCQkJCQlEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tkd2NfZXAtPm51bV0tPmRvZXB0c2l6KTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwlkY3RsLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5kZXZfaWYtPmRldl9nbG9iYWxfcmVncy0+ZGN0bCk7CisJZ2ludHN0cy5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cyk7CisJaW50cl9tYXNrLmQzMiA9IERXQ19SRUFEX1JFRzMyKCZjb3JlX2lmLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrKTsKKworCWlmICghaW50cl9tYXNrLmIuZ291dG5ha2VmZikgeworCQkvKiBVbm1hc2sgaXQgKi8KKwkJaW50cl9tYXNrLmIuZ291dG5ha2VmZiA9IDE7CisJCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaywgaW50cl9tYXNrLmQzMik7CisgCX0KKwlpZiAoIWdpbnRzdHMuYi5nb3V0bmFrZWZmKSB7CisJCWRjdGwuYi5zZ291dG5hayA9IDE7CisJfQorCURXQ19XUklURV9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5kZXZfZ2xvYmFsX3JlZ3MtPmRjdGwsIGRjdGwuZDMyKTsKKworCWRlcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmY29yZV9pZi0+ZGV2X2lmLT5vdXRfZXBfcmVnc1tkd2NfZXAtPm51bV0tPmRvZXBjdGwpOworCWlmIChkZXBjdGwuYi5lcGVuYSkgeworCQlkZXBjdGwuYi5lcGRpcyA9IDE7CisJCWRlcGN0bC5iLnNuYWsgPSAxOworCX0KKwlEV0NfV1JJVEVfUkVHMzIoJmNvcmVfaWYtPmRldl9pZi0+b3V0X2VwX3JlZ3NbZHdjX2VwLT5udW1dLT5kb2VwY3RsLCBkZXBjdGwuZDMyKTsKKworCWludHJfbWFzay5kMzIgPSAwOworCWludHJfbWFzay5iLmluY29tcGxpc29vdXQgPSAxOworCQkKKyNlbmRpZiAvKiBEV0NfRU5fSVNPQyAqLworCisJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJZ2ludHN0cy5kMzIgPSAwOworCWdpbnRzdHMuYi5pbmNvbXBsaXNvb3V0ID0gMTsKKwlEV0NfV1JJVEVfUkVHMzIoJkdFVF9DT1JFX0lGKHBjZCktPmNvcmVfZ2xvYmFsX3JlZ3MtPmdpbnRzdHMsCisJCQlnaW50c3RzLmQzMik7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIEdsb2JhbCBJTiBOQUsgRWZmZWN0aXZlIGludGVycnVwdC4KKyAqCisgKi8KK2ludDMyX3QgZHdjX290Z19wY2RfaGFuZGxlX2luX25ha19lZmZlY3RpdmUoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWYgPSBHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWY7CisJZGVwY3RsX2RhdGFfdCBkaWVwY3RsID0gey5kMzIgPSAwIH07CisJZ2ludG1za19kYXRhX3QgaW50cl9tYXNrID0gey5kMzIgPSAwIH07CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKwlkd2Nfb3RnX2NvcmVfaWZfdCAqY29yZV9pZiA9IEdFVF9DT1JFX0lGKHBjZCk7CisJaW50IGk7CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAiR2xvYmFsIElOIE5BSyBFZmZlY3RpdmVcbiIpOworCisJLyogRGlzYWJsZSBhbGwgYWN0aXZlIElOIEVQcyAqLworCWZvciAoaSA9IDA7IGkgPD0gZGV2X2lmLT5udW1faW5fZXBzOyBpKyspIHsKKwkJZGllcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5pbl9lcF9yZWdzW2ldLT5kaWVwY3RsKTsKKwkJaWYgKCEoZGllcGN0bC5iLmVwdHlwZSAmIDEpICYmIGRpZXBjdGwuYi5lcGVuYSkgeworCQkJaWYgKGNvcmVfaWYtPnN0YXJ0X3ByZWRpY3QgPiAwKQorCQkJCWNvcmVfaWYtPnN0YXJ0X3ByZWRpY3QrKzsKKwkJCWRpZXBjdGwuYi5lcGRpcyA9IDE7CisJCQlkaWVwY3RsLmIuc25hayA9IDE7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+aW5fZXBfcmVnc1tpXS0+ZGllcGN0bCwgZGllcGN0bC5kMzIpOworCQl9CQkJCQkJCisJfQorCQorCisJLyogRGlzYWJsZSB0aGUgR2xvYmFsIElOIE5BSyBFZmZlY3RpdmUgSW50ZXJydXB0ICovCisJaW50cl9tYXNrLmIuZ2lubmFrZWZmID0gMTsKKwlEV0NfTU9ESUZZX1JFRzMyKCZHRVRfQ09SRV9JRihwY2QpLT5jb3JlX2dsb2JhbF9yZWdzLT5naW50bXNrLAorCQkJIGludHJfbWFzay5kMzIsIDApOworCisJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJZ2ludHN0cy5kMzIgPSAwOworCWdpbnRzdHMuYi5naW5uYWtlZmYgPSAxOworCURXQ19XUklURV9SRUczMigmR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywKKwkJCWdpbnRzdHMuZDMyKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIE9VVCBOQUsgRWZmZWN0aXZlLgorICoKKyAqLworaW50MzJfdCBkd2Nfb3RnX3BjZF9oYW5kbGVfb3V0X25ha19lZmZlY3RpdmUoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlkd2Nfb3RnX2Rldl9pZl90ICpkZXZfaWYgPSBHRVRfQ09SRV9JRihwY2QpLT5kZXZfaWY7CisJZ2ludG1za19kYXRhX3QgaW50cl9tYXNrID0gey5kMzIgPSAwIH07CisJZ2ludHN0c19kYXRhX3QgZ2ludHN0czsKKwlkZXBjdGxfZGF0YV90IGRvZXBjdGw7CisJaW50IGk7CisKKwkvKiBEaXNhYmxlIHRoZSBHbG9iYWwgT1VUIE5BSyBFZmZlY3RpdmUgSW50ZXJydXB0ICovCisJaW50cl9tYXNrLmIuZ291dG5ha2VmZiA9IDE7CisJRFdDX01PRElGWV9SRUczMigmR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludG1zaywKKwkJaW50cl9tYXNrLmQzMiwgMCk7CisJCisJLyogSWYgREVWIE9VVCBOQUsgZW5hYmxlZCovCisJaWYgKHBjZC0+Y29yZV9pZi0+Y29yZV9wYXJhbXMtPmRldl9vdXRfbmFrKSB7CisJCS8qIFJ1biBvdmVyIGFsbCBvdXQgZW5kcG9pbnRzIHRvIGRldGVybWluZSB0aGUgZXAgbnVtYmVyIG9uCisJCSAqIHdoaWNoIHRoZSB0aW1lb3V0IGhhcyBoYXBwZW5lZCAKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPD0gZGV2X2lmLT5udW1fb3V0X2VwczsgaSsrKSB7CisJCQlpZiAoIHBjZC0+Y29yZV9pZi0+ZXBfeGZlcl9pbmZvW2ldLnN0YXRlID09IDIgKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID4gZGV2X2lmLT5udW1fb3V0X2VwcykgeworCQkJZGN0bF9kYXRhX3QgZGN0bDsKKwkJCWRjdGwuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+CisJCQkJZGV2X2dsb2JhbF9yZWdzLT5kY3RsKTsKKwkJCWRjdGwuYi5jZ291dG5hayA9IDE7CisJCQlEV0NfV1JJVEVfUkVHMzIoJmRldl9pZi0+ZGV2X2dsb2JhbF9yZWdzLT5kY3RsLAorCQkJCWRjdGwuZDMyKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogRGlzYWJsZSB0aGUgZW5kcG9pbnQgKi8KKwkJZG9lcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT4KKwkJCQkJCQkJCQlvdXRfZXBfcmVnc1tpXS0+ZG9lcGN0bCk7CisJCWlmIChkb2VwY3RsLmIuZXBlbmEpIHsKKwkJCWRvZXBjdGwuYi5lcGRpcyA9IDE7CisJCQlkb2VwY3RsLmIuc25hayA9IDE7CisJCX0KKwkJRFdDX1dSSVRFX1JFRzMyKCZkZXZfaWYtPm91dF9lcF9yZWdzW2ldLT5kb2VwY3RsLCBkb2VwY3RsLmQzMik7CisJCXJldHVybiAxOworCX0KKwkvKiBXZSBjb21lIGhlcmUgZnJvbSBJbmNvbXBsZXRlIElTTyBPVVQgaGFuZGxlciAqLworCWlmKGRldl9pZi0+aXNvY19lcCkKKwl7CisJCWR3Y19lcF90ICpkd2NfZXAgPSAoZHdjX2VwX3QgKilkZXZfaWYtPmlzb2NfZXA7CisJCXVpbnQzMl90IGVwbnVtID0gZHdjX2VwLT5udW07CisJCWRvZXBpbnRfZGF0YV90IGRvZXBpbnQ7CisJCWRvZXBpbnQuZDMyID0gRFdDX1JFQURfUkVHMzIoJmRldl9pZi0+b3V0X2VwX3JlZ3NbZHdjX2VwLT5udW1dLT5kb2VwaW50KTsKKwkJZGV2X2lmLT5pc29jX2VwID0gTlVMTDsKKwkJZG9lcGN0bC5kMzIgPSBEV0NfUkVBRF9SRUczMigmZGV2X2lmLT5vdXRfZXBfcmVnc1tlcG51bV0tPmRvZXBjdGwpOworCQlEV0NfUFJJTlRGKCJCZWZvcmUgZGlzYWJsZSBET0VQQ1RMID0gJTA4eFxuIiwgZG9lcGN0bC5kMzIpOworCQlpZiAoZG9lcGN0bC5iLmVwZW5hKSB7CisJCQlkb2VwY3RsLmIuZXBkaXMgPSAxOworCQkJZG9lcGN0bC5iLnNuYWsgPSAxOworCQl9CisJCURXQ19XUklURV9SRUczMigmZGV2X2lmLT5vdXRfZXBfcmVnc1tlcG51bV0tPmRvZXBjdGwsIGRvZXBjdGwuZDMyKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlCisJCURXQ19QUklOVEYoIklOVEVSUlVQVCBIYW5kbGVyIG5vdCBpbXBsZW1lbnRlZCBmb3IgJXNcbiIsCisJCQkgICAiR2xvYmFsIE9VVCBOQUsgRWZmZWN0aXZlXG4iKTsKKwkKK291dDoKKwkvKiBDbGVhciBpbnRlcnJ1cHQgKi8KKwlnaW50c3RzLmQzMiA9IDA7CisJZ2ludHN0cy5iLmdvdXRuYWtlZmYgPSAxOworCURXQ19XUklURV9SRUczMigmR0VUX0NPUkVfSUYocGNkKS0+Y29yZV9nbG9iYWxfcmVncy0+Z2ludHN0cywKKwkJCWdpbnRzdHMuZDMyKTsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIFBDRCBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqCisgKiBUaGUgUENEIGhhbmRsZXMgdGhlIGRldmljZSBpbnRlcnJ1cHRzLiAgTWFueSBjb25kaXRpb25zIGNhbiBjYXVzZSBhCisgKiBkZXZpY2UgaW50ZXJydXB0LiBXaGVuIGFuIGludGVycnVwdCBvY2N1cnMsIHRoZSBkZXZpY2UgaW50ZXJydXB0CisgKiBzZXJ2aWNlIHJvdXRpbmUgZGV0ZXJtaW5lcyB0aGUgY2F1c2Ugb2YgdGhlIGludGVycnVwdCBhbmQKKyAqIGRpc3BhdGNoZXMgaGFuZGxpbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGZ1bmN0aW9uLiBUaGVzZSBpbnRlcnJ1cHQKKyAqIGhhbmRsaW5nIGZ1bmN0aW9ucyBhcmUgZGVzY3JpYmVkIGJlbG93LgorICoKKyAqIEFsbCBpbnRlcnJ1cHQgcmVnaXN0ZXJzIGFyZSBwcm9jZXNzZWQgZnJvbSBMU0IgdG8gTVNCLgorICoKKyAqLworaW50MzJfdCBkd2Nfb3RnX3BjZF9oYW5kbGVfaW50cihkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCWR3Y19vdGdfY29yZV9pZl90ICpjb3JlX2lmID0gR0VUX0NPUkVfSUYocGNkKTsKKyNpZmRlZiBWRVJCT1NFCisJZHdjX290Z19jb3JlX2dsb2JhbF9yZWdzX3QgKmdsb2JhbF9yZWdzID0gY29yZV9pZi0+Y29yZV9nbG9iYWxfcmVnczsKKyNlbmRpZgorCWdpbnRzdHNfZGF0YV90IGdpbnRyX3N0YXR1czsKKwlpbnQzMl90IHJldHZhbCA9IDA7CisKKwkvKiBFeGl0IGZyb20gSVNSIGlmIGNvcmUgaXMgaGliZXJuYXRlZCAqLworCWlmIChjb3JlX2lmLT5oaWJlcm5hdGlvbl9zdXNwZW5kID09IDEpIHsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisjaWZkZWYgVkVSQk9TRQorCURXQ19ERUJVR1BMKERCR19BTlksICIlcygpIGdpbnRzdHM9JTA4eAkgZ2ludG1zaz0lMDh4XG4iLAorCQkgICAgX19mdW5jX18sCisJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpLAorCQkgICAgRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrKSk7CisjZW5kaWYKKworCWlmIChkd2Nfb3RnX2lzX2RldmljZV9tb2RlKGNvcmVfaWYpKSB7CisJCURXQ19TUElOTE9DSyhwY2QtPmxvY2spOworI2lmZGVmIFZFUkJPU0UKKwkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcygpIGdpbnRzdHM9JTA4eCAgZ2ludG1zaz0lMDh4XG4iLAorCQkJICAgIF9fZnVuY19fLAorCQkJICAgIERXQ19SRUFEX1JFRzMyKCZnbG9iYWxfcmVncy0+Z2ludHN0cyksCisJCQkgICAgRFdDX1JFQURfUkVHMzIoJmdsb2JhbF9yZWdzLT5naW50bXNrKSk7CisjZW5kaWYKKworCQlnaW50cl9zdGF0dXMuZDMyID0gZHdjX290Z19yZWFkX2NvcmVfaW50cihjb3JlX2lmKTsKKworCQlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzOiBnaW50c3RzJmdpbnRtc2s9JTA4eFxuIiwKKwkJCSAgICBfX2Z1bmNfXywgZ2ludHJfc3RhdHVzLmQzMik7CisKKwkJaWYgKGdpbnRyX3N0YXR1cy5iLnNvZmludHIpIHsKKwkJCXJldHZhbCB8PSBkd2Nfb3RnX3BjZF9oYW5kbGVfc29mX2ludHIocGNkKTsKKwkJfQorCQlpZiAoZ2ludHJfc3RhdHVzLmIucnhzdHNxbHZsKSB7CisJCQlyZXR2YWwgfD0KKwkJCSAgICBkd2Nfb3RnX3BjZF9oYW5kbGVfcnhfc3RhdHVzX3FfbGV2ZWxfaW50cihwY2QpOworCQl9CisJCWlmIChnaW50cl9zdGF0dXMuYi5ucHR4ZmVtcHR5KSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19wY2RfaGFuZGxlX25wX3R4X2ZpZm9fZW1wdHlfaW50cihwY2QpOworCQl9CisJCWlmIChnaW50cl9zdGF0dXMuYi5nb3V0bmFrZWZmKSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19wY2RfaGFuZGxlX291dF9uYWtfZWZmZWN0aXZlKHBjZCk7CisJCX0KKwkJaWYgKGdpbnRyX3N0YXR1cy5iLmkyY2ludHIpIHsKKwkJCXJldHZhbCB8PSBkd2Nfb3RnX3BjZF9oYW5kbGVfaTJjX2ludHIocGNkKTsKKwkJfQorCQlpZiAoZ2ludHJfc3RhdHVzLmIuZXJseXN1c3BlbmQpIHsKKwkJCXJldHZhbCB8PSBkd2Nfb3RnX3BjZF9oYW5kbGVfZWFybHlfc3VzcGVuZF9pbnRyKHBjZCk7CisJCX0KKwkJaWYgKGdpbnRyX3N0YXR1cy5iLnVzYnJlc2V0KSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19wY2RfaGFuZGxlX3VzYl9yZXNldF9pbnRyKHBjZCk7CisJCX0KKwkJaWYgKGdpbnRyX3N0YXR1cy5iLmVudW1kb25lKSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19wY2RfaGFuZGxlX2VudW1fZG9uZV9pbnRyKHBjZCk7CisJCX0KKwkJaWYgKGdpbnRyX3N0YXR1cy5iLmlzb291dGRyb3ApIHsKKwkJCXJldHZhbCB8PQorCQkJICAgIGR3Y19vdGdfcGNkX2hhbmRsZV9pc29jX291dF9wYWNrZXRfZHJvcHBlZF9pbnRyCisJCQkgICAgKHBjZCk7CisJCX0KKwkJaWYgKGdpbnRyX3N0YXR1cy5iLmVvcGZyYW1lKSB7CisJCQlyZXR2YWwgfD0KKwkJCSAgICBkd2Nfb3RnX3BjZF9oYW5kbGVfZW5kX3BlcmlvZGljX2ZyYW1lX2ludHIocGNkKTsKKwkJfQorCQlpZiAoZ2ludHJfc3RhdHVzLmIuaW5lcGludCkgeworCQkJaWYgKCFjb3JlX2lmLT5tdWx0aXByb2NfaW50X2VuYWJsZSkgeworCQkJCXJldHZhbCB8PSBkd2Nfb3RnX3BjZF9oYW5kbGVfaW5fZXBfaW50cihwY2QpOworCQkJfQorCQl9CisJCWlmIChnaW50cl9zdGF0dXMuYi5vdXRlcGludHIpIHsKKwkJCWlmICghY29yZV9pZi0+bXVsdGlwcm9jX2ludF9lbmFibGUpIHsKKwkJCQlyZXR2YWwgfD0gZHdjX290Z19wY2RfaGFuZGxlX291dF9lcF9pbnRyKHBjZCk7CisJCQl9CisJCX0KKwkJaWYgKGdpbnRyX3N0YXR1cy5iLmVwbWlzbWF0Y2gpIHsKKwkJCXJldHZhbCB8PSBkd2Nfb3RnX3BjZF9oYW5kbGVfZXBfbWlzbWF0Y2hfaW50cihwY2QpOworCQl9CisJCWlmIChnaW50cl9zdGF0dXMuYi5mZXRzdXNwKSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19wY2RfaGFuZGxlX2VwX2ZldHN1c3BfaW50cihwY2QpOworCQl9CisJCWlmIChnaW50cl9zdGF0dXMuYi5naW5uYWtlZmYpIHsKKwkJCXJldHZhbCB8PSBkd2Nfb3RnX3BjZF9oYW5kbGVfaW5fbmFrX2VmZmVjdGl2ZShwY2QpOworCQl9CisJCWlmIChnaW50cl9zdGF0dXMuYi5pbmNvbXBsaXNvaW4pIHsKKwkJCXJldHZhbCB8PQorCQkJICAgIGR3Y19vdGdfcGNkX2hhbmRsZV9pbmNvbXBsZXRlX2lzb2NfaW5faW50cihwY2QpOworCQl9CisJCWlmIChnaW50cl9zdGF0dXMuYi5pbmNvbXBsaXNvb3V0KSB7CisJCQlyZXR2YWwgfD0KKwkJCSAgICBkd2Nfb3RnX3BjZF9oYW5kbGVfaW5jb21wbGV0ZV9pc29jX291dF9pbnRyKHBjZCk7CisJCX0KKworCQkvKiBJbiBNUEkgbW9kZSBEZXZpY2UgRW5kcG9pbnRzIGludGVycnVwdHMgYXJlIGFzc2VydGVkCisJCSAqIHdpdGhvdXQgc2V0dGluZyBvdXRlcGludHIgYW5kIGluZXBpbnQgYml0cyBzZXQsIHNvIHRoZXNlCisJCSAqIEludGVycnVwdCBoYW5kbGVycyBhcmUgY2FsbGVkIHdpdGhvdXQgY2hlY2tpbmcgdGhlc2UgYml0LWZpZWxkcworCQkgKi8KKwkJaWYgKGNvcmVfaWYtPm11bHRpcHJvY19pbnRfZW5hYmxlKSB7CisJCQlyZXR2YWwgfD0gZHdjX290Z19wY2RfaGFuZGxlX2luX2VwX2ludHIocGNkKTsKKwkJCXJldHZhbCB8PSBkd2Nfb3RnX3BjZF9oYW5kbGVfb3V0X2VwX2ludHIocGNkKTsKKwkJfQorI2lmZGVmIFZFUkJPU0UKKwkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcygpIGdpbnRzdHM9JTB4XG4iLCBfX2Z1bmNfXywKKwkJCSAgICBEV0NfUkVBRF9SRUczMigmZ2xvYmFsX3JlZ3MtPmdpbnRzdHMpKTsKKyNlbmRpZgorCQlEV0NfU1BJTlVOTE9DSyhwY2QtPmxvY2spOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYgLyogRFdDX0hPU1RfT05MWSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX3BjZF9saW51eC5jIGIvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX3BjZF9saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4N2Q3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9kd2Nfb3RnL2R3Y19vdGdfcGNkX2xpbnV4LmMKQEAgLTAsMCArMSwxMzIwIEBACisgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKiAkRmlsZTogLy9kd2gvdXNiX2lpcC9kZXYvc29mdHdhcmUvb3RnL2xpbnV4L2RyaXZlcnMvZHdjX290Z19wY2RfbGludXguYyAkCisgICogJFJldmlzaW9uOiAjMTkgJAorICAqICREYXRlOiAyMDExLzEwLzI2ICQKKyAgKiAkQ2hhbmdlOiAxODczMDI4ICQKKyAgKgorICAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICAqICJTb2Z0d2FyZSIpIGlzIGFuIFVuc3VwcG9ydGVkIHByb3ByaWV0YXJ5IHdvcmsgb2YgU3lub3BzeXMsIEluYy4gdW5sZXNzCisgICogb3RoZXJ3aXNlIGV4cHJlc3NseSBhZ3JlZWQgdG8gaW4gd3JpdGluZyBiZXR3ZWVuIFN5bm9wc3lzIGFuZCB5b3UuCisgICoKKyAgKiBUaGUgU29mdHdhcmUgSVMgTk9UIGFuIGl0ZW0gb2YgTGljZW5zZWQgU29mdHdhcmUgb3IgTGljZW5zZWQgUHJvZHVjdCB1bmRlcgorICAqIGFueSBFbmQgVXNlciBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCBvciBBZ3JlZW1lbnQgZm9yIExpY2Vuc2VkIFByb2R1Y3QKKyAgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAgKiByZWRpc3RyaWJ1dGUgdGhpcyBTb2Z0d2FyZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICogbW9kaWZpY2F0aW9uLCBwcm92aWRlZCB0aGF0IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGlzCisgICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgICogYW55IGluZm9ybWF0aW9uIGNvbnRhaW5lZCBoZXJlaW4gZXhjZXB0IHB1cnN1YW50IHRvIHRoaXMgbGljZW5zZSBncmFudCBmcm9tCisgICogU3lub3BzeXMuIElmIHlvdSBkbyBub3QgYWdyZWUgd2l0aCB0aGlzIG5vdGljZSwgaW5jbHVkaW5nIHRoZSBkaXNjbGFpbWVyCisgICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICAqCisgICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBESVNUUklCVVRFRCBCWSBTWU5PUFNZUyBTT0xFTFkgT04gQU4gIkFTIElTIiBCQVNJUworICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICAqIEFSRSBIRVJFQlkgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgU1lOT1BTWVMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorICAqIERBTUFHRS4KKyAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworI2lmbmRlZiBEV0NfSE9TVF9PTkxZCisKKy8qKiBAZmlsZQorICogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFBlcmlwaGVyYWwgQ29udHJvbGxlciBEcml2ZXIuCisgKgorICogVGhlIFBlcmlwaGVyYWwgQ29udHJvbGxlciBEcml2ZXIgKFBDRCkgaXMgcmVzcG9uc2libGUgZm9yCisgKiB0cmFuc2xhdGluZyByZXF1ZXN0cyBmcm9tIHRoZSBGdW5jdGlvbiBEcml2ZXIgaW50byB0aGUgYXBwcm9wcmlhdGUKKyAqIGFjdGlvbnMgb24gdGhlIERXQ19vdGcgY29udHJvbGxlci4gSXQgaXNvbGF0ZXMgdGhlIEZ1bmN0aW9uIERyaXZlcgorICogZnJvbSB0aGUgc3BlY2lmaWNzIG9mIHRoZSBjb250cm9sbGVyIGJ5IHByb3ZpZGluZyBhbiBBUEkgdG8gdGhlCisgKiBGdW5jdGlvbiBEcml2ZXIuCisgKgorICogVGhlIFBlcmlwaGVyYWwgQ29udHJvbGxlciBEcml2ZXIgZm9yIExpbnV4IHdpbGwgaW1wbGVtZW50IHRoZQorICogR2FkZ2V0IEFQSSwgc28gdGhhdCB0aGUgZXhpc3RpbmcgR2FkZ2V0IGRyaXZlcnMgY2FuIGJlIHVzZWQuCisgKiAoR2FkZ2V0IERyaXZlciBpcyB0aGUgTGludXggdGVybWlub2xvZ3kgZm9yIGEgRnVuY3Rpb24gRHJpdmVyLikKKyAqCisgKiBUaGUgTGludXggR2FkZ2V0IEFQSSBpcyBkZWZpbmVkIGluIHRoZSBoZWFkZXIgZmlsZQorICogPGNvZGU+PGxpbnV4L3VzYl9nYWRnZXQuaD48L2NvZGU+LiAgVGhlIFVTQiBFUCBvcGVyYXRpb25zIEFQSSBpcworICogZGVmaW5lZCBpbiB0aGUgc3RydWN0dXJlIDxjb2RlPnVzYl9lcF9vcHM8L2NvZGU+IGFuZCB0aGUgVVNCCisgKiBDb250cm9sbGVyIEFQSSBpcyBkZWZpbmVkIGluIHRoZSBzdHJ1Y3R1cmUKKyAqIDxjb2RlPnVzYl9nYWRnZXRfb3BzPC9jb2RlPi4KKyAqCisgKi8KKworI2luY2x1ZGUgImR3Y19vdGdfb3NfZGVwLmgiCisjaW5jbHVkZSAiZHdjX290Z19wY2RfaWYuaCIKKyNpbmNsdWRlICJkd2Nfb3RnX3BjZC5oIgorI2luY2x1ZGUgImR3Y19vdGdfZHJpdmVyLmgiCisjaW5jbHVkZSAiZHdjX290Z19kYmcuaCIKKworc3RhdGljIHN0cnVjdCBnYWRnZXRfd3JhcHBlciB7CisJZHdjX290Z19wY2RfdCAqcGNkOworCisJc3RydWN0IHVzYl9nYWRnZXQgZ2FkZ2V0OworCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyOworCisJc3RydWN0IHVzYl9lcCBlcDA7CisJc3RydWN0IHVzYl9lcCBpbl9lcFsxNl07CisJc3RydWN0IHVzYl9lcCBvdXRfZXBbMTZdOworCit9ICpnYWRnZXRfd3JhcHBlcjsKKworLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIGJ1ZmZlciAqLworZXh0ZXJuIHZvaWQgZHVtcF9tc2coY29uc3QgdTggKiBidWYsIHVuc2lnbmVkIGludCBsZW5ndGgpOworLyoqCisgKiBHZXQgdGhlIGR3Y19vdGdfcGNkX2VwX3QqIGZyb20gdXNiX2VwKiBwb2ludGVyIC0gTlVMTCBpbiBjYXNlCisgKiBpZiB0aGUgZW5kcG9pbnQgaXMgbm90IGZvdW5kCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHdjX290Z19wY2RfZXAgKmVwX2Zyb21faGFuZGxlKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKmhhbmRsZSkKK3sKKwlpbnQgaTsKKwlpZiAocGNkLT5lcDAucHJpdiA9PSBoYW5kbGUpIHsKKwkJcmV0dXJuICZwY2QtPmVwMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0VQU19DSEFOTkVMUyAtIDE7IGkrKykgeworCQlpZiAocGNkLT5pbl9lcFtpXS5wcml2ID09IGhhbmRsZSkKKwkJCXJldHVybiAmcGNkLT5pbl9lcFtpXTsKKwkJaWYgKHBjZC0+b3V0X2VwW2ldLnByaXYgPT0gaGFuZGxlKQorCQkJcmV0dXJuICZwY2QtPm91dF9lcFtpXTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogVVNCIEVuZHBvaW50IE9wZXJhdGlvbnMgKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGJyaWVmbHkgZGVzY3JpYmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBHYWRnZXQKKyAqIEFQSSBlbmRwb2ludCBvcGVyYXRpb25zIGltcGxlbWVudGVkIGluIHRoZSBEV0Nfb3RnIGRyaXZlcgorICogc29mdHdhcmUuIERldGFpbGVkIGRlc2NyaXB0aW9ucyBvZiB0aGUgZ2VuZXJpYyBiZWhhdmlvciBvZiBlYWNoIG9mCisgKiB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIGZvdW5kIGluIHRoZSBMaW51eCBoZWFkZXIgZmlsZQorICogaW5jbHVkZS9saW51eC91c2JfZ2FkZ2V0LmguCisgKgorICogVGhlIEdhZGdldCBBUEkgcHJvdmlkZXMgd3JhcHBlciBmdW5jdGlvbnMgZm9yIGVhY2ggb2YgdGhlIGZ1bmN0aW9uCisgKiBwb2ludGVycyBkZWZpbmVkIGluIHVzYl9lcF9vcHMuIFRoZSBHYWRnZXQgRHJpdmVyIGNhbGxzIHRoZSB3cmFwcGVyCisgKiBmdW5jdGlvbiwgd2hpY2ggdGhlbiBjYWxscyB0aGUgdW5kZXJseWluZyBQQ0QgZnVuY3Rpb24uIFRoZQorICogZm9sbG93aW5nIHNlY3Rpb25zIGFyZSBuYW1lZCBhY2NvcmRpbmcgdG8gdGhlIHdyYXBwZXIKKyAqIGZ1bmN0aW9ucy4gV2l0aGluIGVhY2ggc2VjdGlvbiwgdGhlIGNvcnJlc3BvbmRpbmcgRFdDX290ZyBQQ0QKKyAqIGZ1bmN0aW9uIG5hbWUgaXMgc3BlY2lmaWVkLgorICoKKyAqLworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBHYWRnZXQgRHJpdmVyIGZvciBlYWNoIEVQIHRvIGJlCisgKiBjb25maWd1cmVkIGZvciB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIChTRVRfQ09ORklHVVJBVElPTikuCisgKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgZHdjX290Z19lcF90IGRhdGEgc3RydWN0dXJlLCBhbmQgdGhlbgorICogY2FsbHMgZHdjX290Z19lcF9hY3RpdmF0ZS4KKyAqLworc3RhdGljIGludCBlcF9lbmFibGUoc3RydWN0IHVzYl9lcCAqdXNiX2VwLAorCQkgICAgIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfZGVzYykKK3sKKwlpbnQgcmV0dmFsOworCisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcyglcCwlcClcbiIsIF9fZnVuY19fLCB1c2JfZXAsIGVwX2Rlc2MpOworCisJaWYgKCF1c2JfZXAgfHwgIWVwX2Rlc2MgfHwgZXBfZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQT0lOVCkgeworCQlEV0NfV0FSTigiJXMsIGJhZCBlcCBvciBkZXNjcmlwdG9yXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAodXNiX2VwID09ICZnYWRnZXRfd3JhcHBlci0+ZXAwKSB7CisJCURXQ19XQVJOKCIlcywgYmFkIGVwKDApXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENoZWNrIEZJRk8gc2l6ZT8gKi8KKwlpZiAoIWVwX2Rlc2MtPndNYXhQYWNrZXRTaXplKSB7CisJCURXQ19XQVJOKCIlcywgYmFkICVzIG1heHBhY2tldFxuIiwgX19mdW5jX18sIHVzYl9lcC0+bmFtZSk7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCWlmICghZ2FkZ2V0X3dyYXBwZXItPmRyaXZlciB8fAorCSAgICBnYWRnZXRfd3JhcHBlci0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJCURXQ19XQVJOKCIlcywgYm9ndXMgZGV2aWNlIHN0YXRlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0KKworCS8qIERlbGV0ZSBhZnRlciBjaGVjayAtIE1BUyAqLworI2lmIDAKKwluYXQgPSAodWludDMyX3QpIGVwX2Rlc2MtPndNYXhQYWNrZXRTaXplOworCXByaW50ayhLRVJOX0FMRVJUICIlczogbmF0IChiZWZvcmUpID0lZFxuIiwgX19mdW5jX18sIG5hdCk7CisJbmF0ID0gKG5hdCA+PiAxMSkgJiAweDAzOworCXByaW50ayhLRVJOX0FMRVJUICIlczogbmF0IChhZnRlcikgPSVkXG4iLCBfX2Z1bmNfXywgbmF0KTsKKyNlbmRpZgorCXJldHZhbCA9IGR3Y19vdGdfcGNkX2VwX2VuYWJsZShnYWRnZXRfd3JhcHBlci0+cGNkLAorCQkJCSAgICAgICAoY29uc3QgdWludDhfdCAqKWVwX2Rlc2MsCisJCQkJICAgICAgICh2b2lkICopdXNiX2VwKTsKKwlpZiAocmV0dmFsKSB7CisJCURXQ19XQVJOKCJkd2Nfb3RnX3BjZF9lcF9lbmFibGUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdXNiX2VwLT5tYXhwYWNrZXQgPSBsZTE2X3RvX2NwdShlcF9kZXNjLT53TWF4UGFja2V0U2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGFuIEVQIGlzIGRpc2FibGVkIGR1ZSB0byBkaXNjb25uZWN0IG9yCisgKiBjaGFuZ2UgaW4gY29uZmlndXJhdGlvbi4gQW55IHBlbmRpbmcgcmVxdWVzdHMgd2lsbCB0ZXJtaW5hdGUgd2l0aCBhCisgKiBzdGF0dXMgb2YgLUVTSFVURE9XTi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBkd2Nfb3RnX2VwX3QgZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoaXMgRVAsCisgKiBhbmQgdGhlbiBjYWxscyBkd2Nfb3RnX2VwX2RlYWN0aXZhdGUuCisgKi8KK3N0YXRpYyBpbnQgZXBfZGlzYWJsZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXApCit7CisJaW50IHJldHZhbDsKKworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgdXNiX2VwKTsKKwlpZiAoIXVzYl9lcCkgeworCQlEV0NfREVCVUdQTChEQkdfUENELCAiJXMsICVzIG5vdCBlbmFibGVkXG4iLCBfX2Z1bmNfXywKKwkJCSAgICB1c2JfZXAgPyB1c2JfZXAtPm5hbWUgOiBOVUxMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dmFsID0gZHdjX290Z19wY2RfZXBfZGlzYWJsZShnYWRnZXRfd3JhcHBlci0+cGNkLCB1c2JfZXApOworCWlmIChyZXR2YWwpIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgcmVxdWVzdCBvYmplY3QgdG8gdXNlIHdpdGggdGhlIHNwZWNpZmllZAorICogZW5kcG9pbnQuCisgKgorICogQHBhcmFtIGVwIFRoZSBlbmRwb2ludCB0byBiZSB1c2VkIHdpdGggd2l0aCB0aGUgcmVxdWVzdAorICogQHBhcmFtIGdmcF9mbGFncyB0aGUgR0ZQXyogZmxhZ3MgdG8gdXNlLgorICovCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICpkd2Nfb3RnX3BjZF9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKmVwLAorCQkJCQkJICAgICBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IHVzYl9yZXF1ZXN0ICp1c2JfcmVxOworCisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcyglcCwlZClcbiIsIF9fZnVuY19fLCBlcCwgZ2ZwX2ZsYWdzKTsKKwlpZiAoMCA9PSBlcCkgeworCQlEV0NfV0FSTigiJXMoKSAlc1xuIiwgX19mdW5jX18sICJJbnZhbGlkIEVQIVxuIik7CisJCXJldHVybiAwOworCX0KKwl1c2JfcmVxID0ga21hbGxvYyhzaXplb2YoKnVzYl9yZXEpLCBnZnBfZmxhZ3MpOworCWlmICgwID09IHVzYl9yZXEpIHsKKwkJRFdDX1dBUk4oIiVzKCkgJXNcbiIsIF9fZnVuY19fLCAicmVxdWVzdCBhbGxvY2F0aW9uIGZhaWxlZCFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtc2V0KHVzYl9yZXEsIDAsIHNpemVvZigqdXNiX3JlcSkpOworCXVzYl9yZXEtPmRtYSA9IERXQ19ETUFfQUREUl9JTlZBTElEOworCisJcmV0dXJuIHVzYl9yZXE7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBmcmVlcyBhIHJlcXVlc3Qgb2JqZWN0LgorICoKKyAqIEBwYXJhbSBlcCBUaGUgZW5kcG9pbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CisgKiBAcGFyYW0gcmVxIFRoZSByZXF1ZXN0IGJlaW5nIGZyZWVkCisgKi8KK3N0YXRpYyB2b2lkIGR3Y19vdGdfcGNkX2ZyZWVfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcyglcCwlcClcbiIsIF9fZnVuY19fLCBlcCwgcmVxKTsKKworCWlmICgwID09IGVwIHx8IDAgPT0gcmVxKSB7CisJCURXQ19XQVJOKCIlcygpICVzXG4iLCBfX2Z1bmNfXywKKwkJCSAiSW52YWxpZCBlcCBvciByZXEgYXJndW1lbnQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWtmcmVlKHJlcSk7Cit9CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMjgpCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuIEkvTyBidWZmZXIgdG8gYmUgdXNlZCBmb3IgYSB0cmFuc2ZlcgorICogdG8vZnJvbSB0aGUgc3BlY2lmaWVkIGVuZHBvaW50LgorICoKKyAqIEBwYXJhbSB1c2JfZXAgVGhlIGVuZHBvaW50IHRvIGJlIHVzZWQgd2l0aCB3aXRoIHRoZSByZXF1ZXN0CisgKiBAcGFyYW0gYnl0ZXMgVGhlIGRlc2lyZWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB0aGUgYnVmZmVyCisgKiBAcGFyYW0gZG1hIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlcidzIERNQSBhZGRyZXNzOyBtdXN0IGJlIHZhbGlkCisgKiBAcGFyYW0gZ2ZwX2ZsYWdzIHRoZSBHRlBfKiBmbGFncyB0byB1c2UuCisgKiBAcmV0dXJuIGFkZHJlc3Mgb2YgYSBuZXcgYnVmZmVyIG9yIG51bGwgaXMgYnVmZmVyIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgKi8KK3N0YXRpYyB2b2lkICpkd2Nfb3RnX3BjZF9hbGxvY19idWZmZXIoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCB1bnNpZ25lZCBieXRlcywKKwkJCQkgICAgICBkbWFfYWRkcl90ICogZG1hLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJdm9pZCAqYnVmOworCWR3Y19vdGdfcGNkX3QgKnBjZCA9IDA7CisKKwlwY2QgPSBnYWRnZXRfd3JhcHBlci0+cGNkOworCisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcyglcCwlZCwlcCwlMHgpXG4iLCBfX2Z1bmNfXywgdXNiX2VwLCBieXRlcywKKwkJICAgIGRtYSwgZ2ZwX2ZsYWdzKTsKKworCS8qIENoZWNrIGR3b3JkIGFsaWdubWVudCAqLworCWlmICgoYnl0ZXMgJiAweDNVTCkgIT0gMCkgeworCQlEV0NfV0FSTigiJXMoKSBCdWZmZXIgc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiIKKwkJCSAiRFdPUkQgc2l6ZSAoJWQpIiwgX19mdW5jX18sIGJ5dGVzKTsKKwl9CisKKwlidWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoTlVMTCwgYnl0ZXMsIGRtYSwgZ2ZwX2ZsYWdzKTsKKworCS8qIENoZWNrIGR3b3JkIGFsaWdubWVudCAqLworCWlmICgoKGludClidWYgJiAweDNVTCkgIT0gMCkgeworCQlEV0NfV0FSTigiJXMoKSBCdWZmZXIgaXMgbm90IERXT1JEIGFsaWduZWQgKCVwKSIsCisJCQkgX19mdW5jX18sIGJ1Zik7CisJfQorCisJcmV0dXJuIGJ1ZjsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIGFuIEkvTyBidWZmZXIgdGhhdCB3YXMgYWxsb2NhdGVkIGJ5IGFsbG9jX2J1ZmZlci4KKyAqCisgKiBAcGFyYW0gdXNiX2VwIHRoZSBlbmRwb2ludCBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcgorICogQHBhcmFtIGJ1ZiBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAqIEBwYXJhbSBkbWEgVGhlIGJ1ZmZlcidzIERNQSBhZGRyZXNzCisgKiBAcGFyYW0gYnl0ZXMgVGhlIG51bWJlciBvZiBieXRlcyBvZiB0aGUgYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGR3Y19vdGdfcGNkX2ZyZWVfYnVmZmVyKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgdm9pZCAqYnVmLAorCQkJCSAgICBkbWFfYWRkcl90IGRtYSwgdW5zaWduZWQgYnl0ZXMpCit7CisJZHdjX290Z19wY2RfdCAqcGNkID0gMDsKKworCXBjZCA9IGdhZGdldF93cmFwcGVyLT5wY2Q7CisKKwlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzKCVwLCUweCwlZClcbiIsIF9fZnVuY19fLCBidWYsIGRtYSwgYnl0ZXMpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgYnl0ZXMsIGJ1ZiwgZG1hKTsKK30KKyNlbmRpZgorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdWJtaXQgYW4gSS9PIFJlcXVlc3QgdG8gYW4gRVAuCisgKgorICoJLSBXaGVuIHRoZSByZXF1ZXN0IGNvbXBsZXRlcyB0aGUgcmVxdWVzdCdzIGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqCSAgaXMgY2FsbGVkIHRvIHJldHVybiB0aGUgcmVxdWVzdCB0byB0aGUgZHJpdmVyLgorICoJLSBBbiBFUCwgZXhjZXB0IGNvbnRyb2wgRVBzLCBtYXkgaGF2ZSBtdWx0aXBsZSByZXF1ZXN0cworICoJICBwZW5kaW5nLgorICoJLSBPbmNlIHN1Ym1pdHRlZCB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgZXhhbWluZWQgb3IgbW9kaWZpZWQuCisgKgktIEVhY2ggcmVxdWVzdCBpcyB0dXJuZWQgaW50byBvbmUgb3IgbW9yZSBwYWNrZXRzLgorICoJLSBBIEJVTEsgRVAgY2FuIHF1ZXVlIGFueSBhbW91bnQgb2YgZGF0YTsgdGhlIHRyYW5zZmVyIGlzCisgKgkgIHBhY2tldGl6ZWQuCisgKgktIFplcm8gbGVuZ3RoIFBhY2tldHMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSByZXF1ZXN0ICd6ZXJvJworICoJICBmbGFnLgorICovCitzdGF0aWMgaW50IGVwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1c2JfcmVxLAorCQkgICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCWR3Y19vdGdfcGNkX3QgKnBjZDsKKwlzdHJ1Y3QgZHdjX290Z19wY2RfZXAgKmVwID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gMCwgaXNfaXNvY19lcCA9IDA7CisJZG1hX2FkZHJfdCBkbWFfYWRkciA9IERXQ19ETUFfQUREUl9JTlZBTElEOworCisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcyglcCwlcCwlZClcbiIsCisJCSAgICBfX2Z1bmNfXywgdXNiX2VwLCB1c2JfcmVxLCBnZnBfZmxhZ3MpOworCisJaWYgKCF1c2JfcmVxIHx8ICF1c2JfcmVxLT5jb21wbGV0ZSB8fCAhdXNiX3JlcS0+YnVmKSB7CisJCURXQ19XQVJOKCJiYWQgcGFyYW1zXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCF1c2JfZXApIHsKKwkJRFdDX1dBUk4oImJhZCBlcFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBjZCA9IGdhZGdldF93cmFwcGVyLT5wY2Q7CisJaWYgKCFnYWRnZXRfd3JhcHBlci0+ZHJpdmVyIHx8CisJICAgIGdhZGdldF93cmFwcGVyLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICJnYWRnZXQuc3BlZWQ9JWRcbiIsCisJCQkgICAgZ2FkZ2V0X3dyYXBwZXItPmdhZGdldC5zcGVlZCk7CisJCURXQ19XQVJOKCJib2d1cyBkZXZpY2Ugc3RhdGVcbiIpOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAiJXMgcXVldWUgcmVxICVwLCBsZW4gJWQgYnVmICVwXG4iLAorCQkgICAgdXNiX2VwLT5uYW1lLCB1c2JfcmVxLCB1c2JfcmVxLT5sZW5ndGgsIHVzYl9yZXEtPmJ1Zik7CisKKwl1c2JfcmVxLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJdXNiX3JlcS0+YWN0dWFsID0gMDsKKworCWVwID0gZXBfZnJvbV9oYW5kbGUocGNkLCB1c2JfZXApOworCWlmIChlcCA9PSBOVUxMKQorCQlpc19pc29jX2VwID0gMDsKKwllbHNlCisJCWlzX2lzb2NfZXAgPSAoZXAtPmR3Y19lcC50eXBlID09IERXQ19PVEdfRVBfVFlQRV9JU09DKSA/IDEgOiAwOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwyOCkKKwlkbWFfYWRkciA9IHVzYl9yZXEtPmRtYTsKKyNlbHNlCisJaWYgKEdFVF9DT1JFX0lGKHBjZCktPmRtYV9lbmFibGUpIHsKKwkJc3RydWN0IHBjaV9kZXYgKmRldiA9IGdhZGdldF93cmFwcGVyLT5wY2QtPm90Z19kZXYtPm9zX2RlcC5wY2lkZXY7CisJCWlmICh1c2JfcmVxLT5sZW5ndGggIT0gMCAmJiB1c2JfcmVxLT5kbWEgPT0gRFdDX0RNQV9BRERSX0lOVkFMSUQpIHsKKwkJCWRtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoZGV2LCB1c2JfcmVxLT5idWYsIHVzYl9yZXEtPmxlbmd0aCwKKwkJCQkJZXAtPmR3Y19lcC5pc19pbiA/IFBDSV9ETUFfVE9ERVZJQ0UgOiBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBEV0NfVVRFX1BFUl9JTworCWlmIChpc19pc29jX2VwID09IDEpIHsKKwkJcmV0dmFsID0gZHdjX290Z19wY2RfeGlzb19lcF9xdWV1ZShwY2QsIHVzYl9lcCwgdXNiX3JlcS0+YnVmLCBkbWFfYWRkciwKKwkJCXVzYl9yZXEtPmxlbmd0aCwgdXNiX3JlcS0+emVybywgdXNiX3JlcSwKKwkJCWdmcF9mbGFncyA9PSBHRlBfQVRPTUlDID8gMSA6IDAsICZ1c2JfcmVxLT5leHRfcmVxKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCXJldHZhbCA9IGR3Y19vdGdfcGNkX2VwX3F1ZXVlKHBjZCwgdXNiX2VwLCB1c2JfcmVxLT5idWYsIGRtYV9hZGRyLAorCQkJCSAgICAgIHVzYl9yZXEtPmxlbmd0aCwgdXNiX3JlcS0+emVybywgdXNiX3JlcSwKKwkJCQkgICAgICBnZnBfZmxhZ3MgPT0gR0ZQX0FUT01JQyA/IDEgOiAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gY2FuY2VscyBhbiBJL08gcmVxdWVzdCBmcm9tIGFuIEVQLgorICovCitzdGF0aWMgaW50IGVwX2RlcXVldWUoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVzYl9yZXEpCit7CisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcyglcCwlcClcbiIsIF9fZnVuY19fLCB1c2JfZXAsIHVzYl9yZXEpOworCisJaWYgKCF1c2JfZXAgfHwgIXVzYl9yZXEpIHsKKwkJRFdDX1dBUk4oImJhZCBhcmd1bWVudFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWdhZGdldF93cmFwcGVyLT5kcml2ZXIgfHwKKwkgICAgZ2FkZ2V0X3dyYXBwZXItPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgeworCQlEV0NfV0FSTigiYm9ndXMgZGV2aWNlIHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCWlmIChkd2Nfb3RnX3BjZF9lcF9kZXF1ZXVlKGdhZGdldF93cmFwcGVyLT5wY2QsIHVzYl9lcCwgdXNiX3JlcSkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdXNiX2VwX3NldF9oYWx0IHN0YWxscyBhbiBlbmRwb2ludC4KKyAqCisgKiB1c2JfZXBfY2xlYXJfaGFsdCBjbGVhcnMgYW4gZW5kcG9pbnQgaGFsdCBhbmQgcmVzZXRzIGl0cyBkYXRhCisgKiB0b2dnbGUuCisgKgorICogQm90aCBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIHdpdGggdGhlIHNhbWUgdW5kZXJseWluZworICogZnVuY3Rpb24uIFRoZSBiZWhhdmlvciBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBhcmd1bWVudC4KKyAqCisgKiBAcGFyYW1baW5dIHVzYl9lcCB0aGUgRW5kcG9pbnQgdG8gaGFsdCBvciBjbGVhciBoYWx0LgorICogQHBhcmFtW2luXSB2YWx1ZQorICoJLSAwIG1lYW5zIGNsZWFyX2hhbHQuCisgKgktIDEgbWVhbnMgc2V0X2hhbHQsCisgKgktIDIgbWVhbnMgY2xlYXIgc3RhbGwgbG9jayBmbGFnLgorICoJLSAzIG1lYW5zIHNldCAgc3RhbGwgbG9jayBmbGFnLgorICovCitzdGF0aWMgaW50IGVwX2hhbHQoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBpbnQgdmFsdWUpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAiSEFMVCAlcyAlZFxuIiwgdXNiX2VwLT5uYW1lLCB2YWx1ZSk7CisKKwlpZiAoIXVzYl9lcCkgeworCQlEV0NfV0FSTigiYmFkIGVwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dmFsID0gZHdjX290Z19wY2RfZXBfaGFsdChnYWRnZXRfd3JhcHBlci0+cGNkLCB1c2JfZXAsIHZhbHVlKTsKKwlpZiAocmV0dmFsID09IC1EV0NfRV9BR0FJTikgeworCQlyZXR1cm4gLUVBR0FJTjsKKwl9IGVsc2UgaWYgKHJldHZhbCkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBEV0NfRU5fSVNPQworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3VibWl0IGFuIElTT0MgVHJhbnNmZXIgUmVxdWVzdCB0byBhbiBFUC4KKyAqCisgKgktIEV2ZXJ5IHRpbWUgYSBzeW5jIHBlcmlvZCBjb21wbGV0ZXMgdGhlIHJlcXVlc3QncyBjb21wbGV0aW9uIGNhbGxiYWNrCisgKgkgIGlzIGNhbGxlZCB0byBwcm92aWRlIGRhdGEgdG8gdGhlIGdhZGdldCBkcml2ZXIuCisgKgktIE9uY2Ugc3VibWl0dGVkIHRoZSByZXF1ZXN0IGNhbm5vdCBiZSBtb2RpZmllZC4KKyAqCS0gRWFjaCByZXF1ZXN0IGlzIHR1cm5lZCBpbnRvIHBlcmlvZGljIGRhdGEgcGFja2V0cyB1bnRpbGwgSVNPCisgKgkgIFRyYW5zZmVyIGlzIHN0b3BwZWQuLgorICovCitzdGF0aWMgaW50IGlzb19lcF9zdGFydChzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsIHN0cnVjdCB1c2JfaXNvX3JlcXVlc3QgKnJlcSwKKwkJCWdmcF90IGdmcF9mbGFncykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCWlmICghcmVxIHx8ICFyZXEtPnByb2Nlc3NfYnVmZmVyIHx8ICFyZXEtPmJ1ZjAgfHwgIXJlcS0+YnVmMSkgeworCQlEV0NfV0FSTigiYmFkIHBhcmFtc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghdXNiX2VwKSB7CisJCURXQ19QUklOVEYoImJhZCBwYXJhbXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXEtPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKworCXJldHZhbCA9CisJICAgIGR3Y19vdGdfcGNkX2lzb19lcF9zdGFydChnYWRnZXRfd3JhcHBlci0+cGNkLCB1c2JfZXAsIHJlcS0+YnVmMCwKKwkJCQkgICAgIHJlcS0+YnVmMSwgcmVxLT5kbWEwLCByZXEtPmRtYTEsCisJCQkJICAgICByZXEtPnN5bmNfZnJhbWUsIHJlcS0+ZGF0YV9wYXR0ZXJuX2ZyYW1lLAorCQkJCSAgICAgcmVxLT5kYXRhX3Blcl9mcmFtZSwKKwkJCQkgICAgIHJlcS0+ZmxhZ3MgJiBVU0JfUkVRX0lTT19BU0FQID8gLTEgOiByZXEtPgorCQkJCSAgICAgc3RhcnRfZnJhbWUsIHJlcS0+YnVmX3Byb2NfaW50cnZsLCByZXEsCisJCQkJICAgICBnZnBfZmxhZ3MgPT0gR0ZQX0FUT01JQyA/IDEgOiAwKTsKKworCWlmIChyZXR2YWwpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIHN0b3BzIElTTyBFUCBQZXJpb2RpYyBEYXRhIFRyYW5zZmVyLgorICovCitzdGF0aWMgaW50IGlzb19lcF9zdG9wKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgc3RydWN0IHVzYl9pc29fcmVxdWVzdCAqcmVxKQoreworCWludCByZXR2YWwgPSAwOworCWlmICghdXNiX2VwKSB7CisJCURXQ19XQVJOKCJiYWQgZXBcbiIpOworCX0KKworCWlmICghZ2FkZ2V0X3dyYXBwZXItPmRyaXZlciB8fAorCSAgICBnYWRnZXRfd3JhcHBlci0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiZ2FkZ2V0LnNwZWVkPSVkXG4iLAorCQkJICAgIGdhZGdldF93cmFwcGVyLT5nYWRnZXQuc3BlZWQpOworCQlEV0NfV0FSTigiYm9ndXMgZGV2aWNlIHN0YXRlXG4iKTsKKwl9CisKKwlkd2Nfb3RnX3BjZF9pc29fZXBfc3RvcChnYWRnZXRfd3JhcHBlci0+cGNkLCB1c2JfZXAsIHJlcSk7CisJaWYgKHJldHZhbCkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2lzb19yZXF1ZXN0ICphbGxvY19pc29fcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICplcCwKKwkJCQkJCSBpbnQgcGFja2V0cywgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCB1c2JfaXNvX3JlcXVlc3QgKnBSZXEgPSBOVUxMOworCXVpbnQzMl90IHJlcV9zaXplOworCisJcmVxX3NpemUgPSBzaXplb2Yoc3RydWN0IHVzYl9pc29fcmVxdWVzdCk7CisJcmVxX3NpemUgKz0KKwkgICAgKDIgKiBwYWNrZXRzICogKHNpemVvZihzdHJ1Y3QgdXNiX2dhZGdldF9pc29fcGFja2V0X2Rlc2NyaXB0b3IpKSk7CisKKwlwUmVxID0ga21hbGxvYyhyZXFfc2l6ZSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoIXBSZXEpIHsKKwkJRFdDX1dBUk4oIkNhbid0IGFsbG9jYXRlIElzbyBSZXF1ZXN0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXBSZXEtPmlzb19wYWNrZXRfZGVzYzAgPSAodm9pZCAqKShwUmVxICsgMSk7CisKKwlwUmVxLT5pc29fcGFja2V0X2Rlc2MxID0gcFJlcS0+aXNvX3BhY2tldF9kZXNjMCArIHBhY2tldHM7CisKKwlyZXR1cm4gcFJlcTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9pc29fcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9pc29fcmVxdWVzdCAqcmVxKQoreworCWtmcmVlKHJlcSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2lzb2NfZXBfb3BzIGR3Y19vdGdfcGNkX2VwX29wcyA9IHsKKwkuZXBfb3BzID0geworCQkgICAuZW5hYmxlID0gZXBfZW5hYmxlLAorCQkgICAuZGlzYWJsZSA9IGVwX2Rpc2FibGUsCisKKwkJICAgLmFsbG9jX3JlcXVlc3QgPSBkd2Nfb3RnX3BjZF9hbGxvY19yZXF1ZXN0LAorCQkgICAuZnJlZV9yZXF1ZXN0ID0gZHdjX290Z19wY2RfZnJlZV9yZXF1ZXN0LAorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQorCQkgICAuYWxsb2NfYnVmZmVyID0gZHdjX290Z19wY2RfYWxsb2NfYnVmZmVyLAorCQkgICAuZnJlZV9idWZmZXIgPSBkd2Nfb3RnX3BjZF9mcmVlX2J1ZmZlciwKKyNlbmRpZgorCisJCSAgIC5xdWV1ZSA9IGVwX3F1ZXVlLAorCQkgICAuZGVxdWV1ZSA9IGVwX2RlcXVldWUsCisKKwkJICAgLnNldF9oYWx0ID0gZXBfaGFsdCwKKwkJICAgLmZpZm9fc3RhdHVzID0gMCwKKwkJICAgLmZpZm9fZmx1c2ggPSAwLAorCQkgICB9LAorCS5pc29fZXBfc3RhcnQgPSBpc29fZXBfc3RhcnQsCisJLmlzb19lcF9zdG9wID0gaXNvX2VwX3N0b3AsCisJLmFsbG9jX2lzb19yZXF1ZXN0ID0gYWxsb2NfaXNvX3JlcXVlc3QsCisJLmZyZWVfaXNvX3JlcXVlc3QgPSBmcmVlX2lzb19yZXF1ZXN0LAorfTsKKworI2Vsc2UKKworc3RhdGljIHN0cnVjdCB1c2JfZXBfb3BzIGR3Y19vdGdfcGNkX2VwX29wcyA9IHsKKwkuZW5hYmxlID0gZXBfZW5hYmxlLAorCS5kaXNhYmxlID0gZXBfZGlzYWJsZSwKKworCS5hbGxvY19yZXF1ZXN0ID0gZHdjX290Z19wY2RfYWxsb2NfcmVxdWVzdCwKKwkuZnJlZV9yZXF1ZXN0ID0gZHdjX290Z19wY2RfZnJlZV9yZXF1ZXN0LAorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI4KQorCS5hbGxvY19idWZmZXIgPSBkd2Nfb3RnX3BjZF9hbGxvY19idWZmZXIsCisJLmZyZWVfYnVmZmVyID0gZHdjX290Z19wY2RfZnJlZV9idWZmZXIsCisjZW5kaWYKKworCS5xdWV1ZSA9IGVwX3F1ZXVlLAorCS5kZXF1ZXVlID0gZXBfZGVxdWV1ZSwKKworCS5zZXRfaGFsdCA9IGVwX2hhbHQsCisJLmZpZm9fc3RhdHVzID0gMCwKKwkuZmlmb19mbHVzaCA9IDAsCisKK307CisKKyNlbmRpZiAvKiBfRU5fSVNPQ18gKi8KKy8qCUdhZGdldCBPcGVyYXRpb25zICovCisvKioKKyAqIFRoZSBmb2xsb3dpbmcgZ2FkZ2V0IG9wZXJhdGlvbnMgd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgRFdDX290ZworICogUENELiBGdW5jdGlvbnMgaW4gdGhlIEFQSSB0aGF0IGFyZSBub3QgZGVzY3JpYmVkIGJlbG93IGFyZSBub3QKKyAqIGltcGxlbWVudGVkLgorICoKKyAqIFRoZSBHYWRnZXQgQVBJIHByb3ZpZGVzIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBlYWNoIG9mIHRoZSBmdW5jdGlvbgorICogcG9pbnRlcnMgZGVmaW5lZCBpbiB1c2JfZ2FkZ2V0X29wcy4gVGhlIEdhZGdldCBEcml2ZXIgY2FsbHMgdGhlCisgKiB3cmFwcGVyIGZ1bmN0aW9uLCB3aGljaCB0aGVuIGNhbGxzIHRoZSB1bmRlcmx5aW5nIFBDRCBmdW5jdGlvbi4gVGhlCisgKiBmb2xsb3dpbmcgc2VjdGlvbnMgYXJlIG5hbWVkIGFjY29yZGluZyB0byB0aGUgd3JhcHBlciBmdW5jdGlvbnMKKyAqIChleGNlcHQgZm9yIGlvY3RsLCB3aGljaCBkb2Vzbid0IGhhdmUgYSB3cmFwcGVyIGZ1bmN0aW9uKS4gV2l0aGluCisgKiBlYWNoIHNlY3Rpb24sIHRoZSBjb3JyZXNwb25kaW5nIERXQ19vdGcgUENEIGZ1bmN0aW9uIG5hbWUgaXMKKyAqIHNwZWNpZmllZC4KKyAqCisgKi8KKworLyoqCisgKkdldHMgdGhlIFVTQiBGcmFtZSBudW1iZXIgb2YgdGhlIGxhc3QgU09GLgorICovCitzdGF0aWMgaW50IGdldF9mcmFtZV9udW1iZXIoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgZ2FkZ2V0X3dyYXBwZXIgKmQ7CisKKwlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzKCVwKVxuIiwgX19mdW5jX18sIGdhZGdldCk7CisKKwlpZiAoZ2FkZ2V0ID09IDApIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZCA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBnYWRnZXRfd3JhcHBlciwgZ2FkZ2V0KTsKKwlyZXR1cm4gZHdjX290Z19wY2RfZ2V0X2ZyYW1lX251bWJlcihkLT5wY2QpOworfQorCisjaWZkZWYgQ09ORklHX1VTQl9EV0NfT1RHX0xQTQorc3RhdGljIGludCB0ZXN0X2xwbV9lbmFibGVkKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IGdhZGdldF93cmFwcGVyICpkOworCisJZCA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBnYWRnZXRfd3JhcHBlciwgZ2FkZ2V0KTsKKworCXJldHVybiBkd2Nfb3RnX3BjZF9pc19scG1fZW5hYmxlZChkLT5wY2QpOworfQorI2VuZGlmCisKKy8qKgorICogSW5pdGlhdGVzIFNlc3Npb24gUmVxdWVzdCBQcm90b2NvbCAoU1JQKSB0byB3YWtldXAgdGhlIGhvc3QgaWYgbm8KKyAqIHNlc3Npb24gaXMgaW4gcHJvZ3Jlc3MuIElmIGEgc2Vzc2lvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBidXQKKyAqIHRoZSBkZXZpY2UgaXMgc3VzcGVuZGVkLCByZW1vdGUgd2FrZXVwIHNpZ25hbGluZyBpcyBzdGFydGVkLgorICoKKyAqLworc3RhdGljIGludCB3YWtldXAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgZ2FkZ2V0X3dyYXBwZXIgKmQ7CisKKwlEV0NfREVCVUdQTChEQkdfUENEViwgIiVzKCVwKVxuIiwgX19mdW5jX18sIGdhZGdldCk7CisKKwlpZiAoZ2FkZ2V0ID09IDApIHsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIHsKKwkJZCA9IGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0cnVjdCBnYWRnZXRfd3JhcHBlciwgZ2FkZ2V0KTsKKwl9CisJZHdjX290Z19wY2Rfd2FrZXVwKGQtPnBjZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgZHdjX290Z19wY2Rfb3BzID0geworCS5nZXRfZnJhbWUgPSBnZXRfZnJhbWVfbnVtYmVyLAorCS53YWtldXAgPSB3YWtldXAsCisjaWZkZWYgQ09ORklHX1VTQl9EV0NfT1RHX0xQTQorCS5scG1fc3VwcG9ydCA9IHRlc3RfbHBtX2VuYWJsZWQsCisjZW5kaWYKKwkvLyBjdXJyZW50IHZlcnNpb25zIG11c3QgYWx3YXlzIGJlIHNlbGYtcG93ZXJlZAorfTsKKworc3RhdGljIGludCBfc2V0dXAoZHdjX290Z19wY2RfdCAqIHBjZCwgdWludDhfdCAqIGJ5dGVzKQoreworCWludCByZXR2YWwgPSAtRFdDX0VfTk9UX1NVUFBPUlRFRDsKKwlpZiAoZ2FkZ2V0X3dyYXBwZXItPmRyaXZlciAmJiBnYWRnZXRfd3JhcHBlci0+ZHJpdmVyLT5zZXR1cCkgeworCQlyZXR2YWwgPSBnYWRnZXRfd3JhcHBlci0+ZHJpdmVyLT5zZXR1cCgmZ2FkZ2V0X3dyYXBwZXItPmdhZGdldCwKKwkJCQkJCSAgICAgICAoc3RydWN0IHVzYl9jdHJscmVxdWVzdAorCQkJCQkJCSopYnl0ZXMpOworCX0KKworCWlmIChyZXR2YWwgPT0gLUVOT1RTVVBQKSB7CisJCXJldHZhbCA9IC1EV0NfRV9OT1RfU1VQUE9SVEVEOworCX0gZWxzZSBpZiAocmV0dmFsIDwgMCkgeworCQlyZXR2YWwgPSAtRFdDX0VfSU5WQUxJRDsKKwl9CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWZkZWYgRFdDX0VOX0lTT0MKK3N0YXRpYyBpbnQgX2lzb2NfY29tcGxldGUoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlLAorCQkJICB2b2lkICpyZXFfaGFuZGxlLCBpbnQgcHJvY19idWZfbnVtKQoreworCWludCBpLCBwYWNrZXRfY291bnQ7CisJc3RydWN0IHVzYl9nYWRnZXRfaXNvX3BhY2tldF9kZXNjcmlwdG9yICppc29fcGFja2V0ID0gMDsKKwlzdHJ1Y3QgdXNiX2lzb19yZXF1ZXN0ICppc29fcmVxID0gcmVxX2hhbmRsZTsKKworCWlmIChwcm9jX2J1Zl9udW0pIHsKKwkJaXNvX3BhY2tldCA9IGlzb19yZXEtPmlzb19wYWNrZXRfZGVzYzE7CisJfSBlbHNlIHsKKwkJaXNvX3BhY2tldCA9IGlzb19yZXEtPmlzb19wYWNrZXRfZGVzYzA7CisJfQorCXBhY2tldF9jb3VudCA9CisJICAgIGR3Y19vdGdfcGNkX2dldF9pc29fcGFja2V0X2NvdW50KHBjZCwgZXBfaGFuZGxlLCByZXFfaGFuZGxlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFja2V0X2NvdW50OyArK2kpIHsKKwkJaW50IHN0YXR1czsKKwkJaW50IGFjdHVhbDsKKwkJaW50IG9mZnNldDsKKwkJZHdjX290Z19wY2RfZ2V0X2lzb19wYWNrZXRfcGFyYW1zKHBjZCwgZXBfaGFuZGxlLCByZXFfaGFuZGxlLAorCQkJCQkJICBpLCAmc3RhdHVzLCAmYWN0dWFsLCAmb2Zmc2V0KTsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSAtRFdDX0VfTk9fREFUQToKKwkJCXN0YXR1cyA9IC1FTk9EQVRBOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoc3RhdHVzKSB7CisJCQkJRFdDX1BSSU5URigidW5rbm93biBzdGF0dXMgaW4gaXNvYyBwYWNrZXRcbiIpOworCQkJfQorCisJCX0KKwkJaXNvX3BhY2tldFtpXS5zdGF0dXMgPSBzdGF0dXM7CisJCWlzb19wYWNrZXRbaV0ub2Zmc2V0ID0gb2Zmc2V0OworCQlpc29fcGFja2V0W2ldLmFjdHVhbF9sZW5ndGggPSBhY3R1YWw7CisJfQorCisJaXNvX3JlcS0+c3RhdHVzID0gMDsKKwlpc29fcmVxLT5wcm9jZXNzX2J1ZmZlcihlcF9oYW5kbGUsIGlzb19yZXEpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogRFdDX0VOX0lTT0MgKi8KKworI2lmZGVmIERXQ19VVEVfUEVSX0lPCisvKioKKyAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHRlbmRlZCByZXF1ZXN0IHRvIHRoZSBMaW51eCB1c2JfcmVxdWVzdCdzCisgKiBleHRlbmRlZCBwYXJ0IGFuZCBjYWxsIHRoZSBnYWRnZXQncyBjb21wbGV0aW9uLgorICoKKyAqIEBwYXJhbSBwY2QJCQlQb2ludGVyIHRvIHRoZSBwY2Qgc3RydWN0dXJlCisgKiBAcGFyYW0gZXBfaGFuZGxlCQlWb2lkIHBvaW50ZXIgdG8gdGhlIHVzYl9lcCBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSByZXFfaGFuZGxlCVZvaWQgcG9pbnRlciB0byB0aGUgdXNiX3JlcXVlc3Qgc3RydWN0dXJlCisgKiBAcGFyYW0gc3RhdHVzCQlSZXF1ZXN0IHN0YXR1cyByZXR1cm5lZCBmcm9tIHRoZSBwb3J0YWJsZSBsb2dpYworICogQHBhcmFtIGVyZXFfcG9ydAkJVm9pZCBwb2ludGVyIHRvIHRoZSBleHRlbmRlZCByZXF1ZXN0IHN0cnVjdHVyZQorICoJCQkJCQljcmVhdGVkIGluIHRoZSB0aGUgcG9ydGFibGUgcGFydCB0aGF0IGNvbnRhaW5zIHRoZQorICoJCQkJCQlyZXN1bHRzIG9mIHRoZSBwcm9jZXNzZWQgaXNvIHBhY2tldHMuCisgKi8KK3N0YXRpYyBpbnQgX3hpc29jX2NvbXBsZXRlKGR3Y19vdGdfcGNkX3QgKiBwY2QsIHZvaWQgKmVwX2hhbmRsZSwKKwkJCSAgIHZvaWQgKnJlcV9oYW5kbGUsIGludDMyX3Qgc3RhdHVzLCB2b2lkICplcmVxX3BvcnQpCit7CisJc3RydWN0IGR3Y191dGVfaXNvX3JlcV9leHQgKmVyZXFvcmcgPSBOVUxMOworCXN0cnVjdCBkd2NfaXNvX3hyZXFfcG9ydCAqZXJlcXBvcnQgPSBOVUxMOworCXN0cnVjdCBkd2NfdXRlX2lzb19wYWNrZXRfZGVzY3JpcHRvciAqZGVzY19vcmcgPSBOVUxMOworCWludCBpOworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxOworCS8vc3RydWN0IGR3Y191dGVfaXNvX3BhY2tldF9kZXNjcmlwdG9yICoKKwkvL2ludCBzdGF0dXMgPSAwOworCisJcmVxID0gKHN0cnVjdCB1c2JfcmVxdWVzdCAqKXJlcV9oYW5kbGU7CisJZXJlcW9yZyA9ICZyZXEtPmV4dF9yZXE7CisJZXJlcXBvcnQgPSAoc3RydWN0IGR3Y19pc29feHJlcV9wb3J0ICopZXJlcV9wb3J0OworCWRlc2Nfb3JnID0gZXJlcW9yZy0+cGVyX2lvX2ZyYW1lX2Rlc2NzOworCisJaWYgKHJlcSAmJiByZXEtPmNvbXBsZXRlKSB7CisJCS8qIENvcHkgdGhlIHJlcXVlc3QgZGF0YSBmcm9tIHRoZSBwb3J0YWJsZSBsb2dpYyB0byBvdXIgcmVxdWVzdCAqLworCQlmb3IgKGkgPSAwOyBpIDwgZXJlcXBvcnQtPnBpb19wa3RfY291bnQ7IGkrKykgeworCQkJZGVzY19vcmdbaV0uYWN0dWFsX2xlbmd0aCA9CisJCQkgICAgZXJlcXBvcnQtPnBlcl9pb19mcmFtZV9kZXNjc1tpXS5hY3R1YWxfbGVuZ3RoOworCQkJZGVzY19vcmdbaV0uc3RhdHVzID0KKwkJCSAgICBlcmVxcG9ydC0+cGVyX2lvX2ZyYW1lX2Rlc2NzW2ldLnN0YXR1czsKKwkJfQorCisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgLURXQ19FX1NIVVRET1dOOgorCQkJcmVxLT5zdGF0dXMgPSAtRVNIVVRET1dOOworCQkJYnJlYWs7CisJCWNhc2UgLURXQ19FX1JFU1RBUlQ6CisJCQlyZXEtPnN0YXR1cyA9IC1FQ09OTlJFU0VUOworCQkJYnJlYWs7CisJCWNhc2UgLURXQ19FX0lOVkFMSUQ6CisJCQlyZXEtPnN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSAtRFdDX0VfVElNRU9VVDoKKwkJCXJlcS0+c3RhdHVzID0gLUVUSU1FRE9VVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVxLT5zdGF0dXMgPSBzdGF0dXM7CisJCX0KKworCQkvKiBBbmQgY2FsbCB0aGUgZ2FkZ2V0J3MgY29tcGxldGlvbiAqLworCQlyZXEtPmNvbXBsZXRlKGVwX2hhbmRsZSwgcmVxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBEV0NfVVRFX1BFUl9JTyAqLworc3RhdGljIGludCBfY29tcGxldGUoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqZXBfaGFuZGxlLAorCQkgICAgIHZvaWQgKnJlcV9oYW5kbGUsIGludDMyX3Qgc3RhdHVzLCB1aW50MzJfdCBhY3R1YWwpCit7CisJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IHVzYl9yZXF1ZXN0ICopcmVxX2hhbmRsZTsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisJc3RydWN0IGR3Y19vdGdfcGNkX2VwICplcCA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBQQ0lfSU5URVJGQUNFCisJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisjZW5kaWYKKworCWlmIChyZXEgJiYgcmVxLT5jb21wbGV0ZSkgeworCQlzd2l0Y2ggKHN0YXR1cykgeworCQljYXNlIC1EV0NfRV9TSFVURE9XTjoKKwkJCXJlcS0+c3RhdHVzID0gLUVTSFVURE9XTjsKKwkJCWJyZWFrOworCQljYXNlIC1EV0NfRV9SRVNUQVJUOgorCQkJcmVxLT5zdGF0dXMgPSAtRUNPTk5SRVNFVDsKKwkJCWJyZWFrOworCQljYXNlIC1EV0NfRV9JTlZBTElEOgorCQkJcmVxLT5zdGF0dXMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgLURXQ19FX1RJTUVPVVQ6CisJCQlyZXEtPnN0YXR1cyA9IC1FVElNRURPVVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlcS0+c3RhdHVzID0gc3RhdHVzOworCisJCX0KKworCQlyZXEtPmFjdHVhbCA9IGFjdHVhbDsKKwkJRFdDX1NQSU5VTkxPQ0socGNkLT5sb2NrKTsKKwkJcmVxLT5jb21wbGV0ZShlcF9oYW5kbGUsIHJlcSk7CisJCURXQ19TUElOTE9DSyhwY2QtPmxvY2spOworCX0KKyNpZmRlZiBQQ0lfSU5URVJGQUNFCisJZGV2ID0gZ2FkZ2V0X3dyYXBwZXItPnBjZC0+b3RnX2Rldi0+b3NfZGVwLnBjaWRldjsKKwllcCA9IGVwX2Zyb21faGFuZGxlKHBjZCwgZXBfaGFuZGxlKTsKKwlpZiAoR0VUX0NPUkVfSUYocGNkKS0+ZG1hX2VuYWJsZSkgeworCQlpZiAocmVxLT5sZW5ndGggIT0gMCkKKwkJCXBjaV91bm1hcF9zaW5nbGUoZGV2LCByZXEtPmRtYSwgcmVxLT5sZW5ndGgsCisJCQkJCSBlcC0+ZHdjX2VwLgorCQkJCQkgaXNfaW4gPyBQQ0lfRE1BX1RPREVWSUNFIDoKKwkJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfY29ubmVjdChkd2Nfb3RnX3BjZF90ICogcGNkLCBpbnQgc3BlZWQpCit7CisJZ2FkZ2V0X3dyYXBwZXItPmdhZGdldC5zcGVlZCA9IHNwZWVkOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9kaXNjb25uZWN0KGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJaWYgKGdhZGdldF93cmFwcGVyLT5kcml2ZXIgJiYgZ2FkZ2V0X3dyYXBwZXItPmRyaXZlci0+ZGlzY29ubmVjdCkgeworCQlnYWRnZXRfd3JhcHBlci0+ZHJpdmVyLT5kaXNjb25uZWN0KCZnYWRnZXRfd3JhcHBlci0+Z2FkZ2V0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX3Jlc3VtZShkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCWlmIChnYWRnZXRfd3JhcHBlci0+ZHJpdmVyICYmIGdhZGdldF93cmFwcGVyLT5kcml2ZXItPnJlc3VtZSkgeworCQlnYWRnZXRfd3JhcHBlci0+ZHJpdmVyLT5yZXN1bWUoJmdhZGdldF93cmFwcGVyLT5nYWRnZXQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zdXNwZW5kKGR3Y19vdGdfcGNkX3QgKiBwY2QpCit7CisJaWYgKGdhZGdldF93cmFwcGVyLT5kcml2ZXIgJiYgZ2FkZ2V0X3dyYXBwZXItPmRyaXZlci0+c3VzcGVuZCkgeworCQlnYWRnZXRfd3JhcHBlci0+ZHJpdmVyLT5zdXNwZW5kKCZnYWRnZXRfd3JhcHBlci0+Z2FkZ2V0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBvdGcgdmFsdWVzIGluIHRoZSBnYWRnZXQgc3RydWN0dXJlLgorICovCitzdGF0aWMgaW50IF9obnBfY2hhbmdlZChkd2Nfb3RnX3BjZF90ICogcGNkKQoreworCisJaWYgKCFnYWRnZXRfd3JhcHBlci0+Z2FkZ2V0LmlzX290ZykKKwkJcmV0dXJuIDA7CisKKwlnYWRnZXRfd3JhcHBlci0+Z2FkZ2V0LmJfaG5wX2VuYWJsZSA9IGdldF9iX2hucF9lbmFibGUocGNkKTsKKwlnYWRnZXRfd3JhcHBlci0+Z2FkZ2V0LmFfaG5wX3N1cHBvcnQgPSBnZXRfYV9obnBfc3VwcG9ydChwY2QpOworCWdhZGdldF93cmFwcGVyLT5nYWRnZXQuYV9hbHRfaG5wX3N1cHBvcnQgPSBnZXRfYV9hbHRfaG5wX3N1cHBvcnQocGNkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfcmVzZXQoZHdjX290Z19wY2RfdCAqIHBjZCkKK3sKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERXQ19VVEVfQ0ZJCitzdGF0aWMgaW50IF9jZmlfc2V0dXAoZHdjX290Z19wY2RfdCAqIHBjZCwgdm9pZCAqY2ZpX3JlcSkKK3sKKwlpbnQgcmV0dmFsID0gLURXQ19FX0lOVkFMSUQ7CisJaWYgKGdhZGdldF93cmFwcGVyLT5kcml2ZXItPmNmaV9mZWF0dXJlX3NldHVwKSB7CisJCXJldHZhbCA9CisJCSAgICBnYWRnZXRfd3JhcHBlci0+ZHJpdmVyLT4KKwkJICAgIGNmaV9mZWF0dXJlX3NldHVwKCZnYWRnZXRfd3JhcHBlci0+Z2FkZ2V0LAorCQkJCSAgICAgIChzdHJ1Y3QgY2ZpX3VzYl9jdHJscmVxdWVzdCAqKWNmaV9yZXEpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkd2Nfb3RnX3BjZF9mdW5jdGlvbl9vcHMgZm9wcyA9IHsKKwkuY29tcGxldGUgPSBfY29tcGxldGUsCisjaWZkZWYgRFdDX0VOX0lTT0MKKwkuaXNvY19jb21wbGV0ZSA9IF9pc29jX2NvbXBsZXRlLAorI2VuZGlmCisJLnNldHVwID0gX3NldHVwLAorCS5kaXNjb25uZWN0ID0gX2Rpc2Nvbm5lY3QsCisJLmNvbm5lY3QgPSBfY29ubmVjdCwKKwkucmVzdW1lID0gX3Jlc3VtZSwKKwkuc3VzcGVuZCA9IF9zdXNwZW5kLAorCS5obnBfY2hhbmdlZCA9IF9obnBfY2hhbmdlZCwKKwkucmVzZXQgPSBfcmVzZXQsCisjaWZkZWYgRFdDX1VURV9DRkkKKwkuY2ZpX3NldHVwID0gX2NmaV9zZXR1cCwKKyNlbmRpZgorI2lmZGVmIERXQ19VVEVfUEVSX0lPCisJLnhpc29jX2NvbXBsZXRlID0gX3hpc29jX2NvbXBsZXRlLAorI2VuZGlmCit9OworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHRvcCBsZXZlbCBQQ0QgaW50ZXJydXB0IGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBkd2Nfb3RnX3BjZF9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQoreworCWR3Y19vdGdfcGNkX3QgKnBjZCA9IGRldjsKKwlpbnQzMl90IHJldHZhbCA9IElSUV9OT05FOworCisJcmV0dmFsID0gZHdjX290Z19wY2RfaGFuZGxlX2ludHIocGNkKTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJUzNDMjQxMFhfQ0xFQVJfRUlOVFBFTkQoKTsKKwl9CisJcmV0dXJuIElSUV9SRVRWQUwocmV0dmFsKTsKK30KKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVkIHRoZSB1c2JfZXAgc3RydWN0dXJlcyB0byB0aGVyZSBkZWZhdWx0CisgKiBzdGF0ZS4KKyAqCisgKiBAcGFyYW0gZCBQb2ludGVyIG9uIGdhZGdldF93cmFwcGVyLgorICovCit2b2lkIGdhZGdldF9hZGRfZXBzKHN0cnVjdCBnYWRnZXRfd3JhcHBlciAqZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsKKworCQkiZXAwIiwKKwkJImVwMWluIiwKKwkJImVwMmluIiwKKwkJImVwM2luIiwKKwkJImVwNGluIiwKKwkJImVwNWluIiwKKwkJImVwNmluIiwKKwkJImVwN2luIiwKKwkJImVwOGluIiwKKwkJImVwOWluIiwKKwkJImVwMTBpbiIsCisJCSJlcDExaW4iLAorCQkiZXAxMmluIiwKKwkJImVwMTNpbiIsCisJCSJlcDE0aW4iLAorCQkiZXAxNWluIiwKKwkJImVwMW91dCIsCisJCSJlcDJvdXQiLAorCQkiZXAzb3V0IiwKKwkJImVwNG91dCIsCisJCSJlcDVvdXQiLAorCQkiZXA2b3V0IiwKKwkJImVwN291dCIsCisJCSJlcDhvdXQiLAorCQkiZXA5b3V0IiwKKwkJImVwMTBvdXQiLAorCQkiZXAxMW91dCIsCisJCSJlcDEyb3V0IiwKKwkJImVwMTNvdXQiLAorCQkiZXAxNG91dCIsCisJCSJlcDE1b3V0IgorCX07CisKKwlpbnQgaTsKKwlzdHJ1Y3QgdXNiX2VwICplcDsKKwlpbnQ4X3QgZGV2X2VuZHBvaW50czsKKworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiJXNcbiIsIF9fZnVuY19fKTsKKworCUlOSVRfTElTVF9IRUFEKCZkLT5nYWRnZXQuZXBfbGlzdCk7CisJZC0+Z2FkZ2V0LmVwMCA9ICZkLT5lcDA7CisJZC0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisKKwlJTklUX0xJU1RfSEVBRCgmZC0+Z2FkZ2V0LmVwMC0+ZXBfbGlzdCk7CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBFUDAgc3RydWN0dXJlLgorCSAqLworCWVwID0gJmQtPmVwMDsKKworCS8qIEluaXQgdGhlIHVzYl9lcCBzdHJ1Y3R1cmUuICovCisJZXAtPm5hbWUgPSBuYW1lc1swXTsKKwllcC0+b3BzID0gKHN0cnVjdCB1c2JfZXBfb3BzICopJmR3Y19vdGdfcGNkX2VwX29wczsKKworCS8qKgorCSAqIEB0b2RvIE5HUzogV2hhdCBzaG91bGQgdGhlIG1heCBwYWNrZXQgc2l6ZSBiZSBzZXQgdG8KKwkgKiBoZXJlPyAgQmVmb3JlIEVQIHR5cGUgaXMgc2V0PworCSAqLworCWVwLT5tYXhwYWNrZXQgPSBNQVhfUEFDS0VUX1NJWkU7CisJZHdjX290Z19wY2RfZXBfZW5hYmxlKGQtPnBjZCwgTlVMTCwgZXApOworCisJbGlzdF9hZGRfdGFpbCgmZXAtPmVwX2xpc3QsICZkLT5nYWRnZXQuZXBfbGlzdCk7CisKKwkvKioKKwkgKiBJbml0aWFsaXplIHRoZSBFUCBzdHJ1Y3R1cmVzLgorCSAqLworCWRldl9lbmRwb2ludHMgPSBkLT5wY2QtPmNvcmVfaWYtPmRldl9pZi0+bnVtX2luX2VwczsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfZW5kcG9pbnRzOyBpKyspIHsKKwkJZXAgPSAmZC0+aW5fZXBbaV07CisKKwkJLyogSW5pdCB0aGUgdXNiX2VwIHN0cnVjdHVyZS4gKi8KKwkJZXAtPm5hbWUgPSBuYW1lc1tkLT5wY2QtPmluX2VwW2ldLmR3Y19lcC5udW1dOworCQllcC0+b3BzID0gKHN0cnVjdCB1c2JfZXBfb3BzICopJmR3Y19vdGdfcGNkX2VwX29wczsKKworCQkvKioKKwkJICogQHRvZG8gTkdTOiBXaGF0IHNob3VsZCB0aGUgbWF4IHBhY2tldCBzaXplIGJlIHNldCB0bworCQkgKiBoZXJlPyAgQmVmb3JlIEVQIHR5cGUgaXMgc2V0PworCQkgKi8KKwkJZXAtPm1heHBhY2tldCA9IE1BWF9QQUNLRVRfU0laRTsKKwkJbGlzdF9hZGRfdGFpbCgmZXAtPmVwX2xpc3QsICZkLT5nYWRnZXQuZXBfbGlzdCk7CisJfQorCisJZGV2X2VuZHBvaW50cyA9IGQtPnBjZC0+Y29yZV9pZi0+ZGV2X2lmLT5udW1fb3V0X2VwczsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfZW5kcG9pbnRzOyBpKyspIHsKKwkJZXAgPSAmZC0+b3V0X2VwW2ldOworCisJCS8qIEluaXQgdGhlIHVzYl9lcCBzdHJ1Y3R1cmUuICovCisJCWVwLT5uYW1lID0gbmFtZXNbMTUgKyBkLT5wY2QtPm91dF9lcFtpXS5kd2NfZXAubnVtXTsKKwkJZXAtPm9wcyA9IChzdHJ1Y3QgdXNiX2VwX29wcyAqKSZkd2Nfb3RnX3BjZF9lcF9vcHM7CisKKwkJLyoqCisJCSAqIEB0b2RvIE5HUzogV2hhdCBzaG91bGQgdGhlIG1heCBwYWNrZXQgc2l6ZSBiZSBzZXQgdG8KKwkJICogaGVyZT8gIEJlZm9yZSBFUCB0eXBlIGlzIHNldD8KKwkJICovCisJCWVwLT5tYXhwYWNrZXQgPSBNQVhfUEFDS0VUX1NJWkU7CisKKwkJbGlzdF9hZGRfdGFpbCgmZXAtPmVwX2xpc3QsICZkLT5nYWRnZXQuZXBfbGlzdCk7CisJfQorCisJLyogcmVtb3ZlIGVwMCBmcm9tIHRoZSBsaXN0LiAgVGhlcmUgaXMgYSBlcDAgcG9pbnRlci4gKi8KKwlsaXN0X2RlbF9pbml0KCZkLT5lcDAuZXBfbGlzdCk7CisKKwlkLT5lcDAubWF4cGFja2V0ID0gTUFYX0VQMF9TSVpFOworfQorCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgdGhlIEdhZGdldCBkZXZpY2UuCisgKiByZXF1aXJlZCBieSBkZXZpY2VfdW5yZWdpc3RlcigpLgorICoKKyAqIEB0b2RvIFNob3VsZCB0aGlzIGRvIHNvbWV0aGluZz8JU2hvdWxkIGl0IGZyZWUgdGhlIFBDRD8KKyAqLworc3RhdGljIHZvaWQgZHdjX290Z19wY2RfZ2FkZ2V0X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBnYWRnZXRfd3JhcHBlciAqYWxsb2Nfd3JhcHBlcigKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpfZGV2CisjZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCXN0cnVjdCBwY2lfZGV2ICpfZGV2CisjZW5kaWYKKyAgICApCit7CisJc3RhdGljIGNoYXIgcGNkX25hbWVbXSA9ICJkd2Nfb3RnX3BjZCI7CisjaWZkZWYgTE1fSU5URVJGQUNFCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IGxtX2dldF9kcnZkYXRhKF9kZXYpOworI2VsaWYgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBwY2lfZ2V0X2RydmRhdGEoX2Rldik7CisjZW5kaWYKKworCXN0cnVjdCBnYWRnZXRfd3JhcHBlciAqZDsKKwlpbnQgcmV0dmFsOworCisJZCA9IERXQ19BTExPQyhzaXplb2YoKmQpKTsKKwlpZiAoZCA9PSBOVUxMKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCW1lbXNldChkLCAwLCBzaXplb2YoKmQpKTsKKworCWQtPmdhZGdldC5uYW1lID0gcGNkX25hbWU7CisJZC0+cGNkID0gb3RnX2Rldi0+cGNkOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDMwKQorCXN0cmNweShkLT5nYWRnZXQuZGV2LmJ1c19pZCwgImdhZGdldCIpOworI2Vsc2UKKwlkZXZfc2V0X25hbWUoJmQtPmdhZGdldC5kZXYsICIlcyIsICJnYWRnZXQiKTsKKyNlbmRpZgorCisJZC0+Z2FkZ2V0LmRldi5wYXJlbnQgPSAmX2Rldi0+ZGV2OworCWQtPmdhZGdldC5kZXYucmVsZWFzZSA9IGR3Y19vdGdfcGNkX2dhZGdldF9yZWxlYXNlOworCWQtPmdhZGdldC5vcHMgPSAmZHdjX290Z19wY2Rfb3BzOworCWQtPmdhZGdldC5pc19kdWFsc3BlZWQgPSBkd2Nfb3RnX3BjZF9pc19kdWFsc3BlZWQob3RnX2Rldi0+cGNkKTsKKwlkLT5nYWRnZXQuaXNfb3RnID0gZHdjX290Z19wY2RfaXNfb3RnKG90Z19kZXYtPnBjZCk7CisKKwlkLT5kcml2ZXIgPSAwOworCS8qIFJlZ2lzdGVyIHRoZSBnYWRnZXQgZGV2aWNlICovCisJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyKCZkLT5nYWRnZXQuZGV2KTsKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJRFdDX0VSUk9SKCJkZXZpY2VfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJRFdDX0ZSRUUoZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3dyYXBwZXIoc3RydWN0IGdhZGdldF93cmFwcGVyICpkKQoreworCWlmIChkLT5kcml2ZXIpIHsKKwkJLyogc2hvdWxkIGhhdmUgYmVlbiBkb25lIGFscmVhZHkgYnkgZHJpdmVyIG1vZGVsIGNvcmUgKi8KKwkJRFdDX1dBUk4oImRyaXZlciAnJXMnIGlzIHN0aWxsIHJlZ2lzdGVyZWRcbiIsCisJCQkgZC0+ZHJpdmVyLT5kcml2ZXIubmFtZSk7CisJCXVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIoZC0+ZHJpdmVyKTsKKwl9CisKKwlkZXZpY2VfdW5yZWdpc3RlcigmZC0+Z2FkZ2V0LmRldik7CisJRFdDX0ZSRUUoZCk7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplZCB0aGUgUENEIHBvcnRpb24gb2YgdGhlIGRyaXZlci4KKyAqCisgKi8KK2ludCBwY2RfaW5pdCgKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlzdHJ1Y3QgbG1fZGV2aWNlICpfZGV2CisjZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCXN0cnVjdCBwY2lfZGV2ICpfZGV2CisjZWxzZQorCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9kZXYKKyNlbmRpZgorICAgICkKK3sKKyNpZmRlZiBMTV9JTlRFUkZBQ0UKKwlkd2Nfb3RnX2RldmljZV90ICpvdGdfZGV2ID0gbG1fZ2V0X2RydmRhdGEoX2Rldik7CisjZWxpZiAgZGVmaW5lZChQQ0lfSU5URVJGQUNFKQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBwY2lfZ2V0X2RydmRhdGEoX2Rldik7CisjZW5kaWYKKworCWludCByZXR2YWwgPSAwOworCisJRFdDX0RFQlVHUEwoREJHX1BDRFYsICIlcyglcClcbiIsIF9fZnVuY19fLCBfZGV2KTsKKworCW90Z19kZXYtPnBjZCA9IGR3Y19vdGdfcGNkX2luaXQob3RnX2Rldi0+Y29yZV9pZik7CisKKwlpZiAoIW90Z19kZXYtPnBjZCkgeworCQlEV0NfRVJST1IoImR3Y19vdGdfcGNkX2luaXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJb3RnX2Rldi0+cGNkLT5vdGdfZGV2ID0gb3RnX2RldjsKKwlnYWRnZXRfd3JhcHBlciA9IGFsbG9jX3dyYXBwZXIoX2Rldik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgRVAgc3RydWN0dXJlcworCSAqLworCWdhZGdldF9hZGRfZXBzKGdhZGdldF93cmFwcGVyKTsKKwkvKgorCSAqIFNldHVwIGludGVydXB0IGhhbmRsZXIKKwkgKi8KKwlEV0NfREVCVUdQTChEQkdfQU5ZLCAicmVnaXN0ZXJpbmcgaGFuZGxlciBmb3IgaXJxJWRcbiIsIF9kZXYtPmlycSk7CisJcmV0dmFsID0gcmVxdWVzdF9pcnEoX2Rldi0+aXJxLCBkd2Nfb3RnX3BjZF9pcnEsCisJCQkgICAgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwKKwkJCSAgICAgZ2FkZ2V0X3dyYXBwZXItPmdhZGdldC5uYW1lLCBvdGdfZGV2LT5wY2QpOworCWlmIChyZXR2YWwgIT0gMCkgeworCQlEV0NfRVJST1IoInJlcXVlc3Qgb2YgaXJxJWQgZmFpbGVkXG4iLCBfZGV2LT5pcnEpOworCQlmcmVlX3dyYXBwZXIoZ2FkZ2V0X3dyYXBwZXIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWR3Y19vdGdfcGNkX3N0YXJ0KGdhZGdldF93cmFwcGVyLT5wY2QsICZmb3BzKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogQ2xlYW51cCB0aGUgUENELgorICovCit2b2lkIHBjZF9yZW1vdmUoCisjaWZkZWYgTE1fSU5URVJGQUNFCisJc3RydWN0IGxtX2RldmljZSAqX2RldgorI2VsaWYgIGRlZmluZWQoUENJX0lOVEVSRkFDRSkKKwlzdHJ1Y3QgcGNpX2RldiAqX2RldgorI2VuZGlmCisgICAgKQoreworI2lmZGVmIExNX0lOVEVSRkFDRQorCWR3Y19vdGdfZGV2aWNlX3QgKm90Z19kZXYgPSBsbV9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbGlmICBkZWZpbmVkKFBDSV9JTlRFUkZBQ0UpCisJZHdjX290Z19kZXZpY2VfdCAqb3RnX2RldiA9IHBjaV9nZXRfZHJ2ZGF0YShfZGV2KTsKKyNlbmRpZgorCWR3Y19vdGdfcGNkX3QgKnBjZCA9IG90Z19kZXYtPnBjZDsKKworCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgX2Rldik7CisKKwkvKgorCSAqIEZyZWUgdGhlIElSUQorCSAqLworCWZyZWVfaXJxKF9kZXYtPmlycSwgcGNkKTsKKwlkd2Nfb3RnX3BjZF9yZW1vdmUob3RnX2Rldi0+cGNkKTsKKwlmcmVlX3dyYXBwZXIoZ2FkZ2V0X3dyYXBwZXIpOworCW90Z19kZXYtPnBjZCA9IDA7Cit9CisKKy8qKgorICogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgYSBnYWRnZXQgZHJpdmVyIHdpdGggdGhlIFBDRC4KKyAqCisgKiBXaGVuIGEgZHJpdmVyIGlzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLCBpdCB3aWxsIHJlY2VpdmUgY29udHJvbAorICogcmVxdWVzdHMgaW5jbHVkaW5nIHNldF9jb25maWd1cmF0aW9uKCksIHdoaWNoIGVuYWJsZXMgbm9uLWNvbnRyb2wKKyAqIHJlcXVlc3RzLiAgdGhlbiB1c2IgdHJhZmZpYyBmb2xsb3dzIHVudGlsIGEgZGlzY29ubmVjdCBpcyByZXBvcnRlZC4KKyAqIHRoZW4gYSBob3N0IG1heSBjb25uZWN0IGFnYWluLCBvciB0aGUgZHJpdmVyIG1pZ2h0IGdldCB1bmJvdW5kLgorICoKKyAqIEBwYXJhbSBkcml2ZXIgVGhlIGRyaXZlciBiZWluZyByZWdpc3RlcmVkCisgKiBAcGFyYW0gYmluZCBUaGUgYmluZCBmdW5jdGlvbiBvZiBnYWRnZXQgZHJpdmVyCisgKi8KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMzcpCitpbnQgdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCisjZWxzZQoraW50IHVzYl9nYWRnZXRfcHJvYmVfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyLAorCQlpbnQgKCpiaW5kKShzdHJ1Y3QgdXNiX2dhZGdldCAqKSkKKyNlbmRpZgoreworCWludCByZXR2YWw7CisKKwlEV0NfREVCVUdQTChEQkdfUENELCAicmVnaXN0ZXJpbmcgZ2FkZ2V0IGRyaXZlciAnJXMnXG4iLAorCQkgICAgZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKKwlpZiAoIWRyaXZlciB8fCBkcml2ZXItPnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOIHx8CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDM3KQorCSAgICAhZHJpdmVyLT5iaW5kIHx8CisjZWxzZQorCQkhYmluZCB8fAorI2VuZGlmCisJICAgICFkcml2ZXItPnVuYmluZCB8fCAhZHJpdmVyLT5kaXNjb25uZWN0IHx8ICFkcml2ZXItPnNldHVwKSB7CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiRUlOVkFMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChnYWRnZXRfd3JhcHBlciA9PSAwKSB7CisJCURXQ19ERUJVR1BMKERCR19QQ0RWLCAiRU5PREVWXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChnYWRnZXRfd3JhcHBlci0+ZHJpdmVyICE9IDApIHsKKwkJRFdDX0RFQlVHUEwoREJHX1BDRFYsICJFQlVTWSAoJXApXG4iLCBnYWRnZXRfd3JhcHBlci0+ZHJpdmVyKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBob29rIHVwIHRoZSBkcml2ZXIgKi8KKwlnYWRnZXRfd3JhcHBlci0+ZHJpdmVyID0gZHJpdmVyOworCWdhZGdldF93cmFwcGVyLT5nYWRnZXQuZGV2LmRyaXZlciA9ICZkcml2ZXItPmRyaXZlcjsKKworCURXQ19ERUJVR1BMKERCR19QQ0QsICJiaW5kIHRvIGRyaXZlciAlc1xuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSk7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDM3KQorCXJldHZhbCA9IGRyaXZlci0+YmluZCgmZ2FkZ2V0X3dyYXBwZXItPmdhZGdldCk7CisjZWxzZQorCXJldHZhbCA9IGJpbmQoJmdhZGdldF93cmFwcGVyLT5nYWRnZXQpOworI2VuZGlmCisJaWYgKHJldHZhbCkgeworCQlEV0NfRVJST1IoImJpbmQgdG8gZHJpdmVyICVzIC0tPiBlcnJvciAlZFxuIiwKKwkJCSAgZHJpdmVyLT5kcml2ZXIubmFtZSwgcmV0dmFsKTsKKwkJZ2FkZ2V0X3dyYXBwZXItPmRyaXZlciA9IDA7CisJCWdhZGdldF93cmFwcGVyLT5nYWRnZXQuZGV2LmRyaXZlciA9IDA7CisJCXJldHVybiByZXR2YWw7CisJfQorCURXQ19ERUJVR1BMKERCR19BTlksICJyZWdpc3RlcmVkIGdhZGdldCBkcml2ZXIgJyVzJ1xuIiwKKwkJICAgIGRyaXZlci0+ZHJpdmVyLm5hbWUpOworCXJldHVybiAwOworfQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwzNykKK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIpOworI2Vsc2UKK0VYUE9SVF9TWU1CT0wodXNiX2dhZGdldF9wcm9iZV9kcml2ZXIpOworI2VuZGlmCisKKy8qKgorICogVGhpcyBmdW5jdGlvbiB1bnJlZ2lzdGVycyBhIGdhZGdldCBkcml2ZXIKKyAqCisgKiBAcGFyYW0gZHJpdmVyIFRoZSBkcml2ZXIgYmVpbmcgdW5yZWdpc3RlcmVkCisgKi8KK2ludCB1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCS8vRFdDX0RFQlVHUEwoREJHX1BDRFYsIiVzKCVwKVxuIiwgX19mdW5jX18sIF9kcml2ZXIpOworCisJaWYgKGdhZGdldF93cmFwcGVyID09IDApIHsKKwkJRFdDX0RFQlVHUEwoREJHX0FOWSwgIiVzIFJldHVybiglZCk6IHNfcGNkPT0wXG4iLCBfX2Z1bmNfXywKKwkJCSAgICAtRU5PREVWKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChkcml2ZXIgPT0gMCB8fCBkcml2ZXIgIT0gZ2FkZ2V0X3dyYXBwZXItPmRyaXZlcikgeworCQlEV0NfREVCVUdQTChEQkdfQU5ZLCAiJXMgUmV0dXJuKCVkKTogZHJpdmVyP1xuIiwgX19mdW5jX18sCisJCQkgICAgLUVJTlZBTCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRyaXZlci0+dW5iaW5kKCZnYWRnZXRfd3JhcHBlci0+Z2FkZ2V0KTsKKwlnYWRnZXRfd3JhcHBlci0+ZHJpdmVyID0gMDsKKworCURXQ19ERUJVR1BMKERCR19BTlksICJ1bnJlZ2lzdGVyZWQgZHJpdmVyICclcydcbiIsIGRyaXZlci0+ZHJpdmVyLm5hbWUpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHVzYl9nYWRnZXRfdW5yZWdpc3Rlcl9kcml2ZXIpOworCisjZW5kaWYgLyogRFdDX0hPU1RfT05MWSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9kd2Nfb3RnX3JlZ3MuaCBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19yZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjNjQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvZHdjX290Z19yZWdzLmgKQEAgLTAsMCArMSwyNTQ1IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogJEZpbGU6IC8vZHdoL3VzYl9paXAvZGV2L3NvZnR3YXJlL290Zy9saW51eC9kcml2ZXJzL2R3Y19vdGdfcmVncy5oICQKKyAqICRSZXZpc2lvbjogIzk3ICQKKyAqICREYXRlOiAyMDExLzEwLzI0ICQKKyAqICRDaGFuZ2U6IDE4NzExNjAgJAorICoKKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZm5kZWYgX19EV0NfT1RHX1JFR1NfSF9fCisjZGVmaW5lIF9fRFdDX09UR19SRUdTX0hfXworCisjaW5jbHVkZSAiZHdjX290Z19jb3JlX2lmLmgiCisKKy8qKgorICogQGZpbGUKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgYWNjZXNzaW5nIHRoZSBEV0Nfb3RnIGNvcmUgcmVnaXN0ZXJzLgorICoKKyAqIFRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2VzIHdpdGggdGhlIEhTIE9URyBjb3JlIGJ5IHJlYWRpbmcgZnJvbSBhbmQKKyAqIHdyaXRpbmcgdG8gdGhlIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlciAoQ1NSKSBzcGFjZSB0aHJvdWdoIHRoZQorICogQUhCIFNsYXZlIGludGVyZmFjZS4gVGhlc2UgcmVnaXN0ZXJzIGFyZSAzMiBiaXRzIHdpZGUsIGFuZCB0aGUKKyAqIGFkZHJlc3NlcyBhcmUgMzItYml0LWJsb2NrIGFsaWduZWQuCisgKiBDU1JzIGFyZSBjbGFzc2lmaWVkIGFzIGZvbGxvd3M6CisgKiAtIENvcmUgR2xvYmFsIFJlZ2lzdGVycworICogLSBEZXZpY2UgTW9kZSBSZWdpc3RlcnMKKyAqIC0gRGV2aWNlIEdsb2JhbCBSZWdpc3RlcnMKKyAqIC0gRGV2aWNlIEVuZHBvaW50IFNwZWNpZmljIFJlZ2lzdGVycworICogLSBIb3N0IE1vZGUgUmVnaXN0ZXJzCisgKiAtIEhvc3QgR2xvYmFsIFJlZ2lzdGVycworICogLSBIb3N0IFBvcnQgQ1NScworICogLSBIb3N0IENoYW5uZWwgU3BlY2lmaWMgUmVnaXN0ZXJzCisgKgorICogT25seSB0aGUgQ29yZSBHbG9iYWwgcmVnaXN0ZXJzIGNhbiBiZSBhY2Nlc3NlZCBpbiBib3RoIERldmljZSBhbmQKKyAqIEhvc3QgbW9kZXMuIFdoZW4gdGhlIEhTIE9URyBjb3JlIGlzIG9wZXJhdGluZyBpbiBvbmUgbW9kZSwgZWl0aGVyCisgKiBEZXZpY2Ugb3IgSG9zdCwgdGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IGFjY2VzcyByZWdpc3RlcnMgZnJvbSB0aGUKKyAqIG90aGVyIG1vZGUuIFdoZW4gdGhlIGNvcmUgc3dpdGNoZXMgZnJvbSBvbmUgbW9kZSB0byBhbm90aGVyLCB0aGUKKyAqIHJlZ2lzdGVycyBpbiB0aGUgbmV3IG1vZGUgb2Ygb3BlcmF0aW9uIG11c3QgYmUgcmVwcm9ncmFtbWVkIGFzIHRoZXkKKyAqIHdvdWxkIGJlIGFmdGVyIGEgcG93ZXItb24gcmVzZXQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogRFdDX290ZyBDb3JlIHJlZ2lzdGVycyAuIAorICogVGhlIGR3Y19vdGdfY29yZV9nbG9iYWxfcmVncyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgc2l6ZQorICogYW5kIHJlbGF0aXZlIGZpZWxkIG9mZnNldHMgZm9yIHRoZSBDb3JlIEdsb2JhbCByZWdpc3RlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y19vdGdfY29yZV9nbG9iYWxfcmVncyB7CisJLyoqIE9URyBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIuICA8aT5PZmZzZXQ6IDAwMGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZ290Z2N0bDsKKwkvKiogT1RHIEludGVycnVwdCBSZWdpc3Rlci4JIDxpPk9mZnNldDogMDA0aDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBnb3RnaW50OworCS8qKkNvcmUgQUhCIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCSA8aT5PZmZzZXQ6IDAwOGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZ2FoYmNmZzsKKworI2RlZmluZSBEV0NfR0xCSU5UUk1BU0sJCTB4MDAwMQorI2RlZmluZSBEV0NfRE1BRU5BQkxFCQkweDAwMjAKKyNkZWZpbmUgRFdDX05QVFhFTVBUWUxWTF9FTVBUWQkweDAwODAKKyNkZWZpbmUgRFdDX05QVFhFTVBUWUxWTF9IQUxGRU1QVFkJMHgwMDAwCisjZGVmaW5lIERXQ19QVFhFTVBUWUxWTF9FTVBUWQkweDAxMDAKKyNkZWZpbmUgRFdDX1BUWEVNUFRZTFZMX0hBTEZFTVBUWQkweDAwMDAKKworCS8qKkNvcmUgVVNCIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuCSA8aT5PZmZzZXQ6IDAwQ2g8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZ3VzYmNmZzsKKwkvKipDb3JlIFJlc2V0IFJlZ2lzdGVyLgkgPGk+T2Zmc2V0OiAwMTBoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGdyc3RjdGw7CisJLyoqQ29yZSBJbnRlcnJ1cHQgUmVnaXN0ZXIuCSA8aT5PZmZzZXQ6IDAxNGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZ2ludHN0czsKKwkvKipDb3JlIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLiAgPGk+T2Zmc2V0OiAwMThoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGdpbnRtc2s7CisJLyoqUmVjZWl2ZSBTdGF0dXMgUXVldWUgUmVhZCBSZWdpc3RlciAoUmVhZCBPbmx5KS4JPGk+T2Zmc2V0OiAwMUNoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGdyeHN0c3I7CisJLyoqUmVjZWl2ZSBTdGF0dXMgUXVldWUgUmVhZCAmIFBPUCBSZWdpc3RlciAoUmVhZCBPbmx5KS4gIDxpPk9mZnNldDogMDIwaDwvaT4qLworCXZvbGF0aWxlIHVpbnQzMl90IGdyeHN0c3A7CisJLyoqUmVjZWl2ZSBGSUZPIFNpemUgUmVnaXN0ZXIuCTxpPk9mZnNldDogMDI0aDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBncnhmc2l6OworCS8qKk5vbiBQZXJpb2RpYyBUcmFuc21pdCBGSUZPIFNpemUgUmVnaXN0ZXIuICA8aT5PZmZzZXQ6IDAyOGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZ25wdHhmc2l6OworCS8qKk5vbiBQZXJpb2RpYyBUcmFuc21pdCBGSUZPL1F1ZXVlIFN0YXR1cyBSZWdpc3RlciAoUmVhZAorCSAqIE9ubHkpLiA8aT5PZmZzZXQ6IDAyQ2g8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZ25wdHhzdHM7CisJLyoqSTJDIEFjY2VzcyBSZWdpc3Rlci4JIDxpPk9mZnNldDogMDMwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBnaTJjY3RsOworCS8qKlBIWSBWZW5kb3IgQ29udHJvbCBSZWdpc3Rlci4JIDxpPk9mZnNldDogMDM0aDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBncHZuZGN0bDsKKwkvKipHZW5lcmFsIFB1cnBvc2UgSW5wdXQvT3V0cHV0IFJlZ2lzdGVyLiAgPGk+T2Zmc2V0OiAwMzhoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGdncGlvOworCS8qKlVzZXIgSUQgUmVnaXN0ZXIuICA8aT5PZmZzZXQ6IDAzQ2g8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZ3VpZDsKKwkvKipTeW5vcHN5cyBJRCBSZWdpc3RlciAoUmVhZCBPbmx5KS4gIDxpPk9mZnNldDogMDQwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBnc25wc2lkOworCS8qKlVzZXIgSFcgQ29uZmlnMSBSZWdpc3RlciAoUmVhZCBPbmx5KS4gIDxpPk9mZnNldDogMDQ0aDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBnaHdjZmcxOworCS8qKlVzZXIgSFcgQ29uZmlnMiBSZWdpc3RlciAoUmVhZCBPbmx5KS4gIDxpPk9mZnNldDogMDQ4aDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBnaHdjZmcyOworI2RlZmluZSBEV0NfU0xBVkVfT05MWV9BUkNIIDAKKyNkZWZpbmUgRFdDX0VYVF9ETUFfQVJDSCAxCisjZGVmaW5lIERXQ19JTlRfRE1BX0FSQ0ggMgorCisjZGVmaW5lIERXQ19NT0RFX0hOUF9TUlBfQ0FQQUJMRQkwCisjZGVmaW5lIERXQ19NT0RFX1NSUF9PTkxZX0NBUEFCTEUJMQorI2RlZmluZSBEV0NfTU9ERV9OT19ITlBfU1JQX0NBUEFCTEUJCTIKKyNkZWZpbmUgRFdDX01PREVfU1JQX0NBUEFCTEVfREVWSUNFCQkzCisjZGVmaW5lIERXQ19NT0RFX05PX1NSUF9DQVBBQkxFX0RFVklDRQk0CisjZGVmaW5lIERXQ19NT0RFX1NSUF9DQVBBQkxFX0hPU1QJNQorI2RlZmluZSBEV0NfTU9ERV9OT19TUlBfQ0FQQUJMRV9IT1NUCTYKKworCS8qKlVzZXIgSFcgQ29uZmlnMyBSZWdpc3RlciAoUmVhZCBPbmx5KS4gIDxpPk9mZnNldDogMDRDaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBnaHdjZmczOworCS8qKlVzZXIgSFcgQ29uZmlnNCBSZWdpc3RlciAoUmVhZCBPbmx5KS4gIDxpPk9mZnNldDogMDUwaDwvaT4qLworCXZvbGF0aWxlIHVpbnQzMl90IGdod2NmZzQ7CisJLyoqIENvcmUgTFBNIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgPGk+T2Zmc2V0OiAwNTRoPC9pPiovCisJdm9sYXRpbGUgdWludDMyX3QgZ2xwbWNmZzsKKwkvKiogR2xvYmFsIFBvd2VyRG4gUmVnaXN0ZXIgPGk+T2Zmc2V0OiAwNThoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGdwd3JkbjsKKwkvKiogR2xvYmFsIERGSUZPIFNXIENvbmZpZyBSZWdpc3RlciAgPGk+T2Zmc2V0OiAwNUNoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGdkZmlmb2NmZzsKKwkvKiogQURQIENvbnRyb2wgUmVnaXN0ZXIgIDxpPk9mZnNldDogMDYwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBhZHBjdGw7CisJLyoqIFJlc2VydmVkICA8aT5PZmZzZXQ6IDA2NGgtMEZGaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZDM5WzM5XTsKKwkvKiogSG9zdCBQZXJpb2RpYyBUcmFuc21pdCBGSUZPIFNpemUgUmVnaXN0ZXIuIDxpPk9mZnNldDogMTAwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBocHR4ZnNpejsKKwkvKiogRGV2aWNlIFBlcmlvZGljIFRyYW5zbWl0IEZJRk8jbiBSZWdpc3RlciBpZiBkZWRpY2F0ZWQgZmlmb3MgYXJlIGRpc2FibGVkLAorCQlvdGhlcndpc2UgRGV2aWNlIFRyYW5zbWl0IEZJRk8jbiBSZWdpc3Rlci4KKwkgKiA8aT5PZmZzZXQ6IDEwNGggKyAoRklGT19OdW1iZXItMSkqMDRoLCAxIDw9IEZJRk8gTnVtYmVyIDw9IDE1ICgxPD1uPD0xNSkuPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGR0eGZzaXpbMTVdOworfSBkd2Nfb3RnX2NvcmVfZ2xvYmFsX3JlZ3NfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgb2YgdGhlIENvcmUgT1RHIENvbnRyb2wKKyAqIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKEdPVEdDVEwpLiAgU2V0IHRoZSBiaXRzIHVzaW5nIHRoZSBiaXQKKyAqIGZpZWxkcyB0aGVuIHdyaXRlIHRoZSA8aT5kMzI8L2k+IHZhbHVlIHRvIHRoZSByZWdpc3Rlci4KKyAqLwordHlwZWRlZiB1bmlvbiBnb3RnY3RsX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNlc3JlcXNjczoxOworCQl1bnNpZ25lZCBzZXNyZXE6MTsKKwkJdW5zaWduZWQgdmJ2YWxpZG92ZW46MTsKKwkJdW5zaWduZWQgdmJ2YWxpZG92dmFsOjE7CisJCXVuc2lnbmVkIGF2YWxpZG92ZW46MTsKKwkJdW5zaWduZWQgYXZhbGlkb3Z2YWw6MTsKKwkJdW5zaWduZWQgYnZhbGlkb3ZlbjoxOworCQl1bnNpZ25lZCBidmFsaWRvdnZhbDoxOworCQl1bnNpZ25lZCBoc3RuZWdzY3M6MTsKKwkJdW5zaWduZWQgaG5wcmVxOjE7CisJCXVuc2lnbmVkIGhzdHNldGhucGVuOjE7CisJCXVuc2lnbmVkIGRldmhucGVuOjE7CisJCXVuc2lnbmVkIHJlc2VydmVkMTJfMTU6NDsKKwkJdW5zaWduZWQgY29uaWRzdHM6MTsKKwkJdW5zaWduZWQgZGJuY3RpbWU6MTsKKwkJdW5zaWduZWQgYXNlc3ZsZDoxOworCQl1bnNpZ25lZCBic2VzdmxkOjE7CisJCXVuc2lnbmVkIG90Z3ZlcjoxOworCQl1bnNpZ25lZCByZXNlcnZlZDE6MTsKKwkJdW5zaWduZWQgbXVsdHZhbGlkYmM6NTsKKwkJdW5zaWduZWQgY2hpcnBlbjoxOworCQl1bnNpZ25lZCByZXNlcnZlZDI4XzMxOjQ7CisJfSBiOworfSBnb3RnY3RsX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgb2YgdGhlIENvcmUgT1RHIEludGVycnVwdCBSZWdpc3RlcgorICogKEdPVEdJTlQpLiAgU2V0L2NsZWFyIHRoZSBiaXRzIHVzaW5nIHRoZSBiaXQgZmllbGRzIHRoZW4gd3JpdGUgdGhlIDxpPmQzMjwvaT4KKyAqIHZhbHVlIHRvIHRoZSByZWdpc3Rlci4KKyAqLwordHlwZWRlZiB1bmlvbiBnb3RnaW50X2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBDdXJyZW50IE1vZGUgKi8KKwkJdW5zaWduZWQgcmVzZXJ2ZWQwXzE6MjsKKworCQkvKiogU2Vzc2lvbiBFbmQgRGV0ZWN0ZWQgKi8KKwkJdW5zaWduZWQgc2VzZW5kZGV0OjE7CisKKwkJdW5zaWduZWQgcmVzZXJ2ZWQzXzc6NTsKKworCQkvKiogU2Vzc2lvbiBSZXF1ZXN0IFN1Y2Nlc3MgU3RhdHVzIENoYW5nZSAqLworCQl1bnNpZ25lZCBzZXNyZXFzdWNzdHNjaG5nOjE7CisJCS8qKiBIb3N0IE5lZ290aWF0aW9uIFN1Y2Nlc3MgU3RhdHVzIENoYW5nZSAqLworCQl1bnNpZ25lZCBoc3RuZWdzdWNzdHNjaG5nOjE7CisKKwkJdW5zaWduZWQgcmVzZXJ2ZWQxMF8xNjo3OworCisJCS8qKiBIb3N0IE5lZ290aWF0aW9uIERldGVjdGVkICovCisJCXVuc2lnbmVkIGhzdG5lZ2RldDoxOworCQkvKiogQS1EZXZpY2UgVGltZW91dCBDaGFuZ2UgKi8KKwkJdW5zaWduZWQgYWRldnRvdXRjaG5nOjE7CisJCS8qKiBEZWJvdW5jZSBEb25lICovCisJCXVuc2lnbmVkIGRlYmRvbmU6MTsKKwkJLyoqIE11bHRpLVZhbHVlZCBpbnB1dCBjaGFuZ2VkICovCisJCXVuc2lnbmVkIG12aWM6MTsKKworCQl1bnNpZ25lZCByZXNlcnZlZDMxXzIxOjExOworCisJfSBiOworfSBnb3RnaW50X2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgb2YgdGhlIENvcmUgQUhCIENvbmZpZ3VyYXRpb24KKyAqIFJlZ2lzdGVyIChHQUhCQ0ZHKS4gU2V0L2NsZWFyIHRoZSBiaXRzIHVzaW5nIHRoZSBiaXQgZmllbGRzIHRoZW4KKyAqIHdyaXRlIHRoZSA8aT5kMzI8L2k+IHZhbHVlIHRvIHRoZSByZWdpc3Rlci4KKyAqLwordHlwZWRlZiB1bmlvbiBnYWhiY2ZnX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGdsYmxpbnRybXNrOjE7CisjZGVmaW5lIERXQ19HQUhCQ0ZHX0dMQklOVF9FTkFCTEUJCTEKKworCQl1bnNpZ25lZCBoYnVyc3RsZW46NDsKKyNkZWZpbmUgRFdDX0dBSEJDRkdfSU5UX0RNQV9CVVJTVF9TSU5HTEUJMAorI2RlZmluZSBEV0NfR0FIQkNGR19JTlRfRE1BX0JVUlNUX0lOQ1IJCTEKKyNkZWZpbmUgRFdDX0dBSEJDRkdfSU5UX0RNQV9CVVJTVF9JTkNSNAkJMworI2RlZmluZSBEV0NfR0FIQkNGR19JTlRfRE1BX0JVUlNUX0lOQ1I4CQk1CisjZGVmaW5lIERXQ19HQUhCQ0ZHX0lOVF9ETUFfQlVSU1RfSU5DUjE2CTcKKworCQl1bnNpZ25lZCBkbWFlbmFibGU6MTsKKyNkZWZpbmUgRFdDX0dBSEJDRkdfRE1BRU5BQkxFCQkJMQorCQl1bnNpZ25lZCByZXNlcnZlZDoxOworCQl1bnNpZ25lZCBucHR4ZmVtcGx2bF90eGZlbXBsdmw6MTsKKwkJdW5zaWduZWQgcHR4ZmVtcGx2bDoxOworI2RlZmluZSBEV0NfR0FIQkNGR19UWEZFTVBUWUxWTF9FTVBUWQkJMQorI2RlZmluZSBEV0NfR0FIQkNGR19UWEZFTVBUWUxWTF9IQUxGRU1QVFkJMAorCQl1bnNpZ25lZCByZXNlcnZlZDlfMjA6MTI7CisJCXVuc2lnbmVkIHJlbW1lbXN1cHA6MTsKKwkJdW5zaWduZWQgbm90aWFsbGRtYXdyaXQ6MTsKKwkJdW5zaWduZWQgYWhic2luZ2xlOjE7CisJCXVuc2lnbmVkIHJlc2VydmVkMjRfMzE6ODsKKwl9IGI7Cit9IGdhaGJjZmdfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBvZiB0aGUgQ29yZSBVU0IgQ29uZmlndXJhdGlvbgorICogUmVnaXN0ZXIgKEdVU0JDRkcpLiBTZXQgdGhlIGJpdHMgdXNpbmcgdGhlIGJpdCBmaWVsZHMgdGhlbiB3cml0ZQorICogdGhlIDxpPmQzMjwvaT4gdmFsdWUgdG8gdGhlIHJlZ2lzdGVyLgorICovCit0eXBlZGVmIHVuaW9uIGd1c2JjZmdfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgdG91dGNhbDozOworCQl1bnNpZ25lZCBwaHlpZjoxOworCQl1bnNpZ25lZCB1bHBpX3V0bWlfc2VsOjE7CisJCXVuc2lnbmVkIGZzaW50ZjoxOworCQl1bnNpZ25lZCBwaHlzZWw6MTsKKwkJdW5zaWduZWQgZGRyc2VsOjE7CisJCXVuc2lnbmVkIHNycGNhcDoxOworCQl1bnNpZ25lZCBobnBjYXA6MTsKKwkJdW5zaWduZWQgdXNidHJkdGltOjQ7CisJCXVuc2lnbmVkIHJlc2VydmVkMToxOworCQl1bnNpZ25lZCBwaHlscHdyY2xrc2VsOjE7CisJCXVuc2lnbmVkIG90Z3V0bWlmc3NlbDoxOworCQl1bnNpZ25lZCB1bHBpX2ZzbHM6MTsKKwkJdW5zaWduZWQgdWxwaV9hdXRvX3JlczoxOworCQl1bnNpZ25lZCB1bHBpX2Nsa19zdXNfbToxOworCQl1bnNpZ25lZCB1bHBpX2V4dF92YnVzX2RydjoxOworCQl1bnNpZ25lZCB1bHBpX2ludF92YnVzX2luZGljYXRvcjoxOworCQl1bnNpZ25lZCB0ZXJtX3NlbF9kbF9wdWxzZToxOworCQl1bnNpZ25lZCBpbmRpY2F0b3JfY29tcGxlbWVudDoxOworCQl1bnNpZ25lZCBpbmRpY2F0b3JfcGFzc190aHJvdWdoOjE7CisJCXVuc2lnbmVkIHVscGlfaW50X3Byb3RfZGlzOjE7CisJCXVuc2lnbmVkIGljX3VzYl9jYXA6MTsKKwkJdW5zaWduZWQgaWNfdHJhZmZpY19wdWxsX3JlbW92ZToxOworCQl1bnNpZ25lZCB0eF9lbmRfZGVsYXk6MTsKKwkJdW5zaWduZWQgZm9yY2VfaG9zdF9tb2RlOjE7CisJCXVuc2lnbmVkIGZvcmNlX2Rldl9tb2RlOjE7CisJCXVuc2lnbmVkIHJlc2VydmVkMzE6MTsKKwl9IGI7Cit9IGd1c2JjZmdfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBvZiB0aGUgQ29yZSBSZXNldCBSZWdpc3RlcgorICogKEdSU1RDVEwpLiAgU2V0L2NsZWFyIHRoZSBiaXRzIHVzaW5nIHRoZSBiaXQgZmllbGRzIHRoZW4gd3JpdGUgdGhlCisgKiA8aT5kMzI8L2k+IHZhbHVlIHRvIHRoZSByZWdpc3Rlci4KKyAqLwordHlwZWRlZiB1bmlvbiBncnN0Y3RsX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBDb3JlIFNvZnQgUmVzZXQgKENTZnRSc3QpIChEZXZpY2UgYW5kIEhvc3QpCisJCSAqCisJCSAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gZmx1c2ggdGhlIGNvbnRyb2wgbG9naWMgaW4gdGhlCisJCSAqIGVudGlyZSBjb3JlIHVzaW5nIHRoaXMgYml0LiBUaGlzIGJpdCByZXNldHMgdGhlCisJCSAqIHBpcGVsaW5lcyBpbiB0aGUgQUhCIENsb2NrIGRvbWFpbiBhcyB3ZWxsIGFzIHRoZQorCQkgKiBQSFkgQ2xvY2sgZG9tYWluLgorCQkgKgorCQkgKiBUaGUgc3RhdGUgbWFjaGluZXMgYXJlIHJlc2V0IHRvIGFuIElETEUgc3RhdGUsIHRoZQorCQkgKiBjb250cm9sIGJpdHMgaW4gdGhlIENTUnMgYXJlIGNsZWFyZWQsIGFsbCB0aGUKKwkJICogdHJhbnNtaXQgRklGT3MgYW5kIHRoZSByZWNlaXZlIEZJRk8gYXJlIGZsdXNoZWQuCisJCSAqCisJCSAqIFRoZSBzdGF0dXMgbWFzayBiaXRzIHRoYXQgY29udHJvbCB0aGUgZ2VuZXJhdGlvbiBvZgorCQkgKiB0aGUgaW50ZXJydXB0LCBhcmUgY2xlYXJlZCwgdG8gY2xlYXIgdGhlCisJCSAqIGludGVycnVwdC4gVGhlIGludGVycnVwdCBzdGF0dXMgYml0cyBhcmUgbm90CisJCSAqIGNsZWFyZWQsIHNvIHRoZSBhcHBsaWNhdGlvbiBjYW4gZ2V0IHRoZSBzdGF0dXMgb2YKKwkJICogYW55IGV2ZW50cyB0aGF0IG9jY3VycmVkIGluIHRoZSBjb3JlIGFmdGVyIGl0IGhhcworCQkgKiBzZXQgdGhpcyBiaXQuCisJCSAqCisJCSAqIEFueSB0cmFuc2FjdGlvbnMgb24gdGhlIEFIQiBhcmUgdGVybWluYXRlZCBhcyBzb29uCisJCSAqIGFzIHBvc3NpYmxlIGZvbGxvd2luZyB0aGUgcHJvdG9jb2wuIEFueQorCQkgKiB0cmFuc2FjdGlvbnMgb24gdGhlIFVTQiBhcmUgdGVybWluYXRlZCBpbW1lZGlhdGVseS4KKwkJICoKKwkJICogVGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gdGhlIENTUnMgYXJlCisJCSAqIHVuY2hhbmdlZCwgc28gdGhlIHNvZnR3YXJlIGRvZXNuJ3QgaGF2ZSB0bworCQkgKiByZXByb2dyYW0gdGhlc2UgcmVnaXN0ZXJzIChEZXZpY2UKKwkJICogQ29uZmlndXJhdGlvbi9Ib3N0IENvbmZpZ3VyYXRpb24vQ29yZSBTeXN0ZW0KKwkJICogQ29uZmlndXJhdGlvbi9Db3JlIFBIWSBDb25maWd1cmF0aW9uKS4KKwkJICoKKwkJICogVGhlIGFwcGxpY2F0aW9uIGNhbiB3cml0ZSB0byB0aGlzIGJpdCwgYW55IHRpbWUgaXQKKwkJICogd2FudHMgdG8gcmVzZXQgdGhlIGNvcmUuIFRoaXMgaXMgYSBzZWxmIGNsZWFyaW5nCisJCSAqIGJpdCBhbmQgdGhlIGNvcmUgY2xlYXJzIHRoaXMgYml0IGFmdGVyIGFsbCB0aGUKKwkJICogbmVjZXNzYXJ5IGxvZ2ljIGlzIHJlc2V0IGluIHRoZSBjb3JlLCB3aGljaCBtYXkKKwkJICogdGFrZSBzZXZlcmFsIGNsb2NrcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHN0YXRlCisJCSAqIG9mIHRoZSBjb3JlLgorCQkgKi8KKwkJdW5zaWduZWQgY3NmdHJzdDoxOworCQkvKiogSGNsayBTb2Z0IFJlc2V0CisJCSAqCisJCSAqIFRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoaXMgYml0IHRvIHJlc2V0IHRoZSBjb250cm9sIGxvZ2ljIGluCisJCSAqIHRoZSBBSEIgY2xvY2sgZG9tYWluLiBPbmx5IEFIQiBjbG9jayBkb21haW4gcGlwZWxpbmVzIGFyZQorCQkgKiByZXNldC4KKwkJICovCisJCXVuc2lnbmVkIGhzZnRyc3Q6MTsKKwkJLyoqIEhvc3QgRnJhbWUgQ291bnRlciBSZXNldCAoSG9zdCBPbmx5KTxicj4KKwkJICoKKwkJICogVGhlIGFwcGxpY2F0aW9uIGNhbiByZXNldCB0aGUgKG1pY3JvKWZyYW1lIG51bWJlcgorCQkgKiBjb3VudGVyIGluc2lkZSB0aGUgY29yZSwgdXNpbmcgdGhpcyBiaXQuIFdoZW4gdGhlCisJCSAqIChtaWNybylmcmFtZSBjb3VudGVyIGlzIHJlc2V0LCB0aGUgc3Vic2VxdWVudCBTT0YKKwkJICogc2VudCBvdXQgYnkgdGhlIGNvcmUsIHdpbGwgaGF2ZSBhIChtaWNybylmcmFtZQorCQkgKiBudW1iZXIgb2YgMC4KKwkJICovCisJCXVuc2lnbmVkIGhzdGZybToxOworCQkvKiogSW4gVG9rZW4gU2VxdWVuY2UgTGVhcm5pbmcgUXVldWUgRmx1c2gKKwkJICogKElOVGtuUUZsc2gpIChEZXZpY2UgT25seSkKKwkJICovCisJCXVuc2lnbmVkIGludGtucWZsc2g6MTsKKwkJLyoqIFJ4RklGTyBGbHVzaCAoUnhGRmxzaCkgKERldmljZSBhbmQgSG9zdCkKKwkJICoKKwkJICogVGhlIGFwcGxpY2F0aW9uIGNhbiBmbHVzaCB0aGUgZW50aXJlIFJlY2VpdmUgRklGTworCQkgKiB1c2luZyB0aGlzIGJpdC4gVGhlIGFwcGxpY2F0aW9uIG11c3QgZmlyc3QKKwkJICogZW5zdXJlIHRoYXQgdGhlIGNvcmUgaXMgbm90IGluIHRoZSBtaWRkbGUgb2YgYQorCQkgKiB0cmFuc2FjdGlvbi4gVGhlIGFwcGxpY2F0aW9uIHNob3VsZCB3cml0ZSBpbnRvCisJCSAqIHRoaXMgYml0LCBvbmx5IGFmdGVyIG1ha2luZyBzdXJlIHRoYXQgbmVpdGhlciB0aGUKKwkJICogRE1BIGVuZ2luZSBpcyByZWFkaW5nIGZyb20gdGhlIFJ4RklGTyBub3IgdGhlIE1BQworCQkgKiBpcyB3cml0aW5nIHRoZSBkYXRhIGluIHRvIHRoZSBGSUZPLiBUaGUKKwkJICogYXBwbGljYXRpb24gc2hvdWxkIHdhaXQgdW50aWwgdGhlIGJpdCBpcyBjbGVhcmVkCisJCSAqIGJlZm9yZSBwZXJmb3JtaW5nIGFueSBvdGhlciBvcGVyYXRpb25zLiBUaGlzIGJpdAorCQkgKiB3aWxsIHRha2VzIDggY2xvY2tzIChzbG93ZXN0IG9mIFBIWSBvciBBSEIgY2xvY2spCisJCSAqIHRvIGNsZWFyLgorCQkgKi8KKwkJdW5zaWduZWQgcnhmZmxzaDoxOworCQkvKiogVHhGSUZPIEZsdXNoIChUeEZGbHNoKSAoRGV2aWNlIGFuZCBIb3N0KS4gCisJCSAqCisJCSAqIFRoaXMgYml0IGlzIHVzZWQgdG8gc2VsZWN0aXZlbHkgZmx1c2ggYSBzaW5nbGUgb3IKKwkJICogYWxsIHRyYW5zbWl0IEZJRk9zLiBUaGUgYXBwbGljYXRpb24gbXVzdCBmaXJzdAorCQkgKiBlbnN1cmUgdGhhdCB0aGUgY29yZSBpcyBub3QgaW4gdGhlIG1pZGRsZSBvZiBhCisJCSAqIHRyYW5zYWN0aW9uLiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHdyaXRlIGludG8KKwkJICogdGhpcyBiaXQsIG9ubHkgYWZ0ZXIgbWFraW5nIHN1cmUgdGhhdCBuZWl0aGVyIHRoZQorCQkgKiBETUEgZW5naW5lIGlzIHdyaXRpbmcgaW50byB0aGUgVHhGSUZPIG5vciB0aGUgTUFDCisJCSAqIGlzIHJlYWRpbmcgdGhlIGRhdGEgb3V0IG9mIHRoZSBGSUZPLiBUaGUKKwkJICogYXBwbGljYXRpb24gc2hvdWxkIHdhaXQgdW50aWwgdGhlIGNvcmUgY2xlYXJzIHRoaXMKKwkJICogYml0LCBiZWZvcmUgcGVyZm9ybWluZyBhbnkgb3BlcmF0aW9ucy4gVGhpcyBiaXQKKwkJICogd2lsbCB0YWtlcyA4IGNsb2NrcyAoc2xvd2VzdCBvZiBQSFkgb3IgQUhCIGNsb2NrKQorCQkgKiB0byBjbGVhci4KKwkJICovCisJCXVuc2lnbmVkIHR4ZmZsc2g6MTsKKworCQkvKiogVHhGSUZPIE51bWJlciAoVHhGTnVtKSAoRGV2aWNlIGFuZCBIb3N0KS4KKwkJICoKKwkJICogVGhpcyBpcyB0aGUgRklGTyBudW1iZXIgd2hpY2ggbmVlZHMgdG8gYmUgZmx1c2hlZCwKKwkJICogdXNpbmcgdGhlIFR4RklGTyBGbHVzaCBiaXQuIFRoaXMgZmllbGQgc2hvdWxkIG5vdAorCQkgKiBiZSBjaGFuZ2VkIHVudGlsIHRoZSBUeEZJRk8gRmx1c2ggYml0IGlzIGNsZWFyZWQgYnkKKwkJICogdGhlIGNvcmUuCisJCSAqCSAtIDB4MCA6IE5vbiBQZXJpb2RpYyBUeEZJRk8gRmx1c2gKKwkJICoJIC0gMHgxIDogUGVyaW9kaWMgVHhGSUZPICMxIEZsdXNoIGluIGRldmljZSBtb2RlCisJCSAqCSAgIG9yIFBlcmlvZGljIFR4RklGTyBpbiBob3N0IG1vZGUKKwkJICoJIC0gMHgyIDogUGVyaW9kaWMgVHhGSUZPICMyIEZsdXNoIGluIGRldmljZSBtb2RlLgorCQkgKgkgLSAuLi4KKwkJICoJIC0gMHhGIDogUGVyaW9kaWMgVHhGSUZPICMxNSBGbHVzaCBpbiBkZXZpY2UgbW9kZQorCQkgKgkgLSAweDEwOiBGbHVzaCBhbGwgdGhlIFRyYW5zbWl0IE5vblBlcmlvZGljIGFuZAorCQkgKgkgICBUcmFuc21pdCBQZXJpb2RpYyBGSUZPcyBpbiB0aGUgY29yZQorCQkgKi8KKwkJdW5zaWduZWQgdHhmbnVtOjU7CisJCS8qKiBSZXNlcnZlZCAqLworCQl1bnNpZ25lZCByZXNlcnZlZDExXzI5OjE5OworCQkvKiogRE1BIFJlcXVlc3QgU2lnbmFsLgkgSW5kaWNhdGVkIERNQSByZXF1ZXN0IGlzIGluCisJCSAqIHByb2JyZXNzLiBVc2VkIGZvciBkZWJ1ZyBwdXJwb3NlLiAqLworCQl1bnNpZ25lZCBkbWFyZXE6MTsKKwkJLyoqIEFIQiBNYXN0ZXIgSWRsZS4gIEluZGljYXRlcyB0aGUgQUhCIE1hc3RlciBTdGF0ZQorCQkgKiBNYWNoaW5lIGlzIGluIElETEUgY29uZGl0aW9uLiAqLworCQl1bnNpZ25lZCBhaGJpZGxlOjE7CisJfSBiOworfSBncnN0Y3RsX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIG9mIHRoZSBDb3JlIEludGVycnVwdCBNYXNrCisgKiBSZWdpc3RlciAoR0lOVE1TSykuIFNldC9jbGVhciB0aGUgYml0cyB1c2luZyB0aGUgYml0IGZpZWxkcyB0aGVuCisgKiB3cml0ZSB0aGUgPGk+ZDMyPC9pPiB2YWx1ZSB0byB0aGUgcmVnaXN0ZXIuCisgKi8KK3R5cGVkZWYgdW5pb24gZ2ludG1za19kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCByZXNlcnZlZDA6MTsKKwkJdW5zaWduZWQgbW9kZW1pc21hdGNoOjE7CisJCXVuc2lnbmVkIG90Z2ludHI6MTsKKwkJdW5zaWduZWQgc29maW50cjoxOworCQl1bnNpZ25lZCByeHN0c3Fsdmw6MTsKKwkJdW5zaWduZWQgbnB0eGZlbXB0eToxOworCQl1bnNpZ25lZCBnaW5uYWtlZmY6MTsKKwkJdW5zaWduZWQgZ291dG5ha2VmZjoxOworCQl1bnNpZ25lZCB1bHBpY2tpbnQ6MTsKKwkJdW5zaWduZWQgaTJjaW50cjoxOworCQl1bnNpZ25lZCBlcmx5c3VzcGVuZDoxOworCQl1bnNpZ25lZCB1c2JzdXNwZW5kOjE7CisJCXVuc2lnbmVkIHVzYnJlc2V0OjE7CisJCXVuc2lnbmVkIGVudW1kb25lOjE7CisJCXVuc2lnbmVkIGlzb291dGRyb3A6MTsKKwkJdW5zaWduZWQgZW9wZnJhbWU6MTsKKwkJdW5zaWduZWQgcmVzdG9yZWRvbmU6MTsKKwkJdW5zaWduZWQgZXBtaXNtYXRjaDoxOworCQl1bnNpZ25lZCBpbmVwaW50cjoxOworCQl1bnNpZ25lZCBvdXRlcGludHI6MTsKKwkJdW5zaWduZWQgaW5jb21wbGlzb2luOjE7CisJCXVuc2lnbmVkIGluY29tcGxpc29vdXQ6MTsKKwkJdW5zaWduZWQgZmV0c3VzcDoxOworCQl1bnNpZ25lZCByZXNldGRldDoxOworCQl1bnNpZ25lZCBwb3J0aW50cjoxOworCQl1bnNpZ25lZCBoY2ludHI6MTsKKwkJdW5zaWduZWQgcHR4ZmVtcHR5OjE7CisJCXVuc2lnbmVkIGxwbXRyYW5yY3ZkOjE7CisJCXVuc2lnbmVkIGNvbmlkc3RzY2huZzoxOworCQl1bnNpZ25lZCBkaXNjb25uZWN0OjE7CisJCXVuc2lnbmVkIHNlc3NyZXFpbnRyOjE7CisJCXVuc2lnbmVkIHdrdXBpbnRyOjE7CisJfSBiOworfSBnaW50bXNrX2RhdGFfdDsKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIG9mIHRoZSBDb3JlIEludGVycnVwdCBSZWdpc3RlcgorICogKEdJTlRTVFMpLiAgU2V0L2NsZWFyIHRoZSBiaXRzIHVzaW5nIHRoZSBiaXQgZmllbGRzIHRoZW4gd3JpdGUgdGhlCisgKiA8aT5kMzI8L2k+IHZhbHVlIHRvIHRoZSByZWdpc3Rlci4KKyAqLwordHlwZWRlZiB1bmlvbiBnaW50c3RzX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKyNkZWZpbmUgRFdDX1NPRl9JTlRSX01BU0sgMHgwMDA4CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworI2RlZmluZSBEV0NfSE9TVF9NT0RFIDEKKwkJdW5zaWduZWQgY3VybW9kZToxOworCQl1bnNpZ25lZCBtb2RlbWlzbWF0Y2g6MTsKKwkJdW5zaWduZWQgb3RnaW50cjoxOworCQl1bnNpZ25lZCBzb2ZpbnRyOjE7CisJCXVuc2lnbmVkIHJ4c3RzcWx2bDoxOworCQl1bnNpZ25lZCBucHR4ZmVtcHR5OjE7CisJCXVuc2lnbmVkIGdpbm5ha2VmZjoxOworCQl1bnNpZ25lZCBnb3V0bmFrZWZmOjE7CisJCXVuc2lnbmVkIHVscGlja2ludDoxOworCQl1bnNpZ25lZCBpMmNpbnRyOjE7CisJCXVuc2lnbmVkIGVybHlzdXNwZW5kOjE7CisJCXVuc2lnbmVkIHVzYnN1c3BlbmQ6MTsKKwkJdW5zaWduZWQgdXNicmVzZXQ6MTsKKwkJdW5zaWduZWQgZW51bWRvbmU6MTsKKwkJdW5zaWduZWQgaXNvb3V0ZHJvcDoxOworCQl1bnNpZ25lZCBlb3BmcmFtZToxOworCQl1bnNpZ25lZCByZXN0b3JlZG9uZToxOworCQl1bnNpZ25lZCBlcG1pc21hdGNoOjE7CisJCXVuc2lnbmVkIGluZXBpbnQ6MTsKKwkJdW5zaWduZWQgb3V0ZXBpbnRyOjE7CisJCXVuc2lnbmVkIGluY29tcGxpc29pbjoxOworCQl1bnNpZ25lZCBpbmNvbXBsaXNvb3V0OjE7CisJCXVuc2lnbmVkIGZldHN1c3A6MTsKKwkJdW5zaWduZWQgcmVzZXRkZXQ6MTsKKwkJdW5zaWduZWQgcG9ydGludHI6MTsKKwkJdW5zaWduZWQgaGNpbnRyOjE7CisJCXVuc2lnbmVkIHB0eGZlbXB0eToxOworCQl1bnNpZ25lZCBscG10cmFucmN2ZDoxOworCQl1bnNpZ25lZCBjb25pZHN0c2Nobmc6MTsKKwkJdW5zaWduZWQgZGlzY29ubmVjdDoxOworCQl1bnNpZ25lZCBzZXNzcmVxaW50cjoxOworCQl1bnNpZ25lZCB3a3VwaW50cjoxOworCX0gYjsKK30gZ2ludHN0c19kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBEZXZpY2UgUmVjZWl2ZSBTdGF0dXMgUmVhZCBhbmQKKyAqIFBvcCBSZWdpc3RlcnMgKEdSWFNUU1IsIEdSWFNUU1ApIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4KKyAqIGVsZW1lbnQgdGhlbiByZWFkIG91dCB0aGUgYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBkZXZpY2VfZ3J4c3RzX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGVwbnVtOjQ7CisJCXVuc2lnbmVkIGJjbnQ6MTE7CisJCXVuc2lnbmVkIGRwaWQ6MjsKKworI2RlZmluZSBEV0NfU1RTX0RBVEFfVVBEVAkJMHgyCS8vIE9VVCBEYXRhIFBhY2tldAorI2RlZmluZSBEV0NfU1RTX1hGRVJfQ09NUAkJMHgzCS8vIE9VVCBEYXRhIFRyYW5zZmVyIENvbXBsZXRlCisKKyNkZWZpbmUgRFdDX0RTVFNfR09VVF9OQUsJCTB4MQkvLyBHbG9iYWwgT1VUIE5BSworI2RlZmluZSBEV0NfRFNUU19TRVRVUF9DT01QCQkweDQJLy8gU2V0dXAgUGhhc2UgQ29tcGxldGUKKyNkZWZpbmUgRFdDX0RTVFNfU0VUVVBfVVBEVCAweDYJLy8gU0VUVVAgUGFja2V0CisJCXVuc2lnbmVkIHBrdHN0czo0OworCQl1bnNpZ25lZCBmbjo0OworCQl1bnNpZ25lZCByZXNlcnZlZDI1XzMxOjc7CisJfSBiOworfSBkZXZpY2VfZ3J4c3RzX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIEhvc3QgUmVjZWl2ZSBTdGF0dXMgUmVhZCBhbmQKKyAqIFBvcCBSZWdpc3RlcnMgKEdSWFNUU1IsIEdSWFNUU1ApIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4KKyAqIGVsZW1lbnQgdGhlbiByZWFkIG91dCB0aGUgYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBob3N0X2dyeHN0c19kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaG51bTo0OworCQl1bnNpZ25lZCBiY250OjExOworCQl1bnNpZ25lZCBkcGlkOjI7CisKKwkJdW5zaWduZWQgcGt0c3RzOjQ7CisjZGVmaW5lIERXQ19HUlhTVFNfUEtUU1RTX0lOCQkJICAweDIKKyNkZWZpbmUgRFdDX0dSWFNUU19QS1RTVFNfSU5fWEZFUl9DT01QCSAgMHgzCisjZGVmaW5lIERXQ19HUlhTVFNfUEtUU1RTX0RBVEFfVE9HR0xFX0VSUiAweDUKKyNkZWZpbmUgRFdDX0dSWFNUU19QS1RTVFNfQ0hfSEFMVEVECQkgIDB4NworCisJCXVuc2lnbmVkIHJlc2VydmVkMjFfMzE6MTE7CisJfSBiOworfSBob3N0X2dyeHN0c19kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBGSUZPIFNpemUgUmVnaXN0ZXJzIChIUFRYRlNJWiwKKyAqIEdOUFRYRlNJWiwgRFBUWEZTSVpuLCBESUVQVFhGbikuIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gZWxlbWVudCAKKyAqIHRoZW4gcmVhZCBvdXQgdGhlIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQgZWxlbWVudHMuCisgKi8KK3R5cGVkZWYgdW5pb24gZmlmb3NpemVfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgc3RhcnRhZGRyOjE2OworCQl1bnNpZ25lZCBkZXB0aDoxNjsKKwl9IGI7Cit9IGZpZm9zaXplX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIE5vbi1QZXJpb2RpYyBUcmFuc21pdAorICogRklGTy9RdWV1ZSBTdGF0dXMgUmVnaXN0ZXIgKEdOUFRYU1RTKS4gUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUKKyAqIDxpPmQzMjwvaT4gZWxlbWVudCB0aGVuIHJlYWQgb3V0IHRoZSBiaXRzIHVzaW5nIHRoZSA8aT5iPC9pPml0CisgKiBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBnbnB0eHN0c19kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBucHR4ZnNwY2F2YWlsOjE2OworCQl1bnNpZ25lZCBucHR4cXNwY2F2YWlsOjg7CisJCS8qKiBUb3Agb2YgdGhlIE5vbi1QZXJpb2RpYyBUcmFuc21pdCBSZXF1ZXN0IFF1ZXVlCisJCSAqCS0gYml0IDI0IC0gVGVybWluYXRlIChMYXN0IGVudHJ5IGZvciB0aGUgc2VsZWN0ZWQKKwkJICoJICBjaGFubmVsL0VQKQorCQkgKgktIGJpdHMgMjY6MjUgLSBUb2tlbiBUeXBlCisJCSAqCSAgLSAyJ2IwMCAtIElOL09VVAorCQkgKgkgIC0gMidiMDEgLSBaZXJvIExlbmd0aCBPVVQKKwkJICoJICAtIDInYjEwIC0gUElORy9Db21wbGV0ZSBTcGxpdAorCQkgKgkgIC0gMidiMTEgLSBDaGFubmVsIEhhbHQKKwkJICoJLSBiaXRzIDMwOjI3IC0gQ2hhbm5lbC9FUCBOdW1iZXIKKwkJICovCisJCXVuc2lnbmVkIG5wdHhxdG9wX3Rlcm1pbmF0ZToxOworCQl1bnNpZ25lZCBucHR4cXRvcF90b2tlbjoyOworCQl1bnNpZ25lZCBucHR4cXRvcF9jaG5lcDo0OworCQl1bnNpZ25lZCByZXNlcnZlZDoxOworCX0gYjsKK30gZ25wdHhzdHNfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgVHJhbnNtaXQKKyAqIEZJRk8gU3RhdHVzIFJlZ2lzdGVyIChEVFhGU1RTKS4gUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUKKyAqIDxpPmQzMjwvaT4gZWxlbWVudCB0aGVuIHJlYWQgb3V0IHRoZSBiaXRzIHVzaW5nIHRoZSA8aT5iPC9pPml0CisgKiBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBkdHhmc3RzX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHR4ZnNwY2F2YWlsOjE2OworCQl1bnNpZ25lZCByZXNlcnZlZDoxNjsKKwl9IGI7Cit9IGR0eGZzdHNfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgSTJDIENvbnRyb2wgUmVnaXN0ZXIKKyAqIChJMkNDVEwpLiBSZWFkIHRoZSByZWdpc3RlciBpbnRvIHRoZSA8aT5kMzI8L2k+IGVsZW1lbnQgdGhlbiByZWFkIG91dCB0aGUKKyAqIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQgZWxlbWVudHMuCisgKi8KK3R5cGVkZWYgdW5pb24gZ2kyY2N0bF9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCByd2RhdGE6ODsKKwkJdW5zaWduZWQgcmVnYWRkcjo4OworCQl1bnNpZ25lZCBhZGRyOjc7CisJCXVuc2lnbmVkIGkyY2VuOjE7CisJCXVuc2lnbmVkIGFjazoxOworCQl1bnNpZ25lZCBpMmNzdXNwY3RsOjE7CisJCXVuc2lnbmVkIGkyY2RldmFkZHI6MjsKKwkJdW5zaWduZWQgaTJjZGF0c2UwOjE7CisJCXVuc2lnbmVkIHJlc2VydmVkOjE7CisJCXVuc2lnbmVkIHJ3OjE7CisJCXVuc2lnbmVkIGJzeWRuZToxOworCX0gYjsKK30gZ2kyY2N0bF9kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBQSFkgVmVuZG9yIENvbnRyb2wgUmVnaXN0ZXIKKyAqIChHUFZORENUTCkuIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gZWxlbWVudCB0aGVuIHJlYWQgb3V0IHRoZQorICogYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBncHZuZGN0bF9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCByZWdkYXRhOjg7CisJCXVuc2lnbmVkIHZjdHJsOjg7CisJCXVuc2lnbmVkIHJlZ2FkZHIxNl8yMTo2OworCQl1bnNpZ25lZCByZWd3cjoxOworCQl1bnNpZ25lZCByZXNlcnZlZDIzXzI0OjI7CisJCXVuc2lnbmVkIG5ld3JlZ3JlcToxOworCQl1bnNpZ25lZCB2c3RzYnN5OjE7CisJCXVuc2lnbmVkIHZzdHNkb25lOjE7CisJCXVuc2lnbmVkIHJlc2VydmVkMjhfMzA6MzsKKwkJdW5zaWduZWQgZGlzdWxwaWRydnI6MTsKKwl9IGI7Cit9IGdwdm5kY3RsX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIEdlbmVyYWwgUHVycG9zZSAKKyAqIElucHV0L091dHB1dCBSZWdpc3RlciAoR0dQSU8pLgorICogUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBlbGVtZW50IHRoZW4gcmVhZCBvdXQgdGhlCisgKiBiaXRzIHVzaW5nIHRoZSA8aT5iPC9pPml0IGVsZW1lbnRzLgorICovCit0eXBlZGVmIHVuaW9uIGdncGlvX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGdwaToxNjsKKwkJdW5zaWduZWQgZ3BvOjE2OworCX0gYjsKK30gZ2dwaW9fZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgVXNlciBJRCBSZWdpc3RlcgorICogKEdVSUQpLiBSZWFkIHRoZSByZWdpc3RlciBpbnRvIHRoZSA8aT5kMzI8L2k+IGVsZW1lbnQgdGhlbiByZWFkIG91dCB0aGUKKyAqIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQgZWxlbWVudHMuCisgKi8KK3R5cGVkZWYgdW5pb24gZ3VpZF9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCByd2RhdGE6MzI7CisJfSBiOworfSBndWlkX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIFN5bm9wc3lzIElEIFJlZ2lzdGVyCisgKiAoR1NOUFNJRCkuIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gZWxlbWVudCB0aGVuIHJlYWQgb3V0IHRoZQorICogYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBnc25wc2lkX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHJ3ZGF0YTozMjsKKwl9IGI7Cit9IGdzbnBzaWRfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgVXNlciBIVyBDb25maWcxCisgKiBSZWdpc3Rlci4gIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gZWxlbWVudCB0aGVuIHJlYWQKKyAqIG91dCB0aGUgYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBod2NmZzFfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgZXBfZGlyMDoyOworCQl1bnNpZ25lZCBlcF9kaXIxOjI7CisJCXVuc2lnbmVkIGVwX2RpcjI6MjsKKwkJdW5zaWduZWQgZXBfZGlyMzoyOworCQl1bnNpZ25lZCBlcF9kaXI0OjI7CisJCXVuc2lnbmVkIGVwX2RpcjU6MjsKKwkJdW5zaWduZWQgZXBfZGlyNjoyOworCQl1bnNpZ25lZCBlcF9kaXI3OjI7CisJCXVuc2lnbmVkIGVwX2Rpcjg6MjsKKwkJdW5zaWduZWQgZXBfZGlyOToyOworCQl1bnNpZ25lZCBlcF9kaXIxMDoyOworCQl1bnNpZ25lZCBlcF9kaXIxMToyOworCQl1bnNpZ25lZCBlcF9kaXIxMjoyOworCQl1bnNpZ25lZCBlcF9kaXIxMzoyOworCQl1bnNpZ25lZCBlcF9kaXIxNDoyOworCQl1bnNpZ25lZCBlcF9kaXIxNToyOworCX0gYjsKK30gaHdjZmcxX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIFVzZXIgSFcgQ29uZmlnMgorICogUmVnaXN0ZXIuICBSZWFkIHRoZSByZWdpc3RlciBpbnRvIHRoZSA8aT5kMzI8L2k+IGVsZW1lbnQgdGhlbiByZWFkCisgKiBvdXQgdGhlIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQgZWxlbWVudHMuCisgKi8KK3R5cGVkZWYgdW5pb24gaHdjZmcyX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qIEdIV0NGRzIgKi8KKwkJdW5zaWduZWQgb3BfbW9kZTozOworI2RlZmluZSBEV0NfSFdDRkcyX09QX01PREVfSE5QX1NSUF9DQVBBQkxFX09URyAwCisjZGVmaW5lIERXQ19IV0NGRzJfT1BfTU9ERV9TUlBfT05MWV9DQVBBQkxFX09URyAxCisjZGVmaW5lIERXQ19IV0NGRzJfT1BfTU9ERV9OT19ITlBfU1JQX0NBUEFCTEVfT1RHIDIKKyNkZWZpbmUgRFdDX0hXQ0ZHMl9PUF9NT0RFX1NSUF9DQVBBQkxFX0RFVklDRSAzCisjZGVmaW5lIERXQ19IV0NGRzJfT1BfTU9ERV9OT19TUlBfQ0FQQUJMRV9ERVZJQ0UgNAorI2RlZmluZSBEV0NfSFdDRkcyX09QX01PREVfU1JQX0NBUEFCTEVfSE9TVCA1CisjZGVmaW5lIERXQ19IV0NGRzJfT1BfTU9ERV9OT19TUlBfQ0FQQUJMRV9IT1NUIDYKKworCQl1bnNpZ25lZCBhcmNoaXRlY3R1cmU6MjsKKwkJdW5zaWduZWQgcG9pbnQycG9pbnQ6MTsKKwkJdW5zaWduZWQgaHNfcGh5X3R5cGU6MjsKKyNkZWZpbmUgRFdDX0hXQ0ZHMl9IU19QSFlfVFlQRV9OT1RfU1VQUE9SVEVEIDAKKyNkZWZpbmUgRFdDX0hXQ0ZHMl9IU19QSFlfVFlQRV9VVE1JIDEKKyNkZWZpbmUgRFdDX0hXQ0ZHMl9IU19QSFlfVFlQRV9VTFBJIDIKKyNkZWZpbmUgRFdDX0hXQ0ZHMl9IU19QSFlfVFlQRV9VVE1JX1VMUEkgMworCisJCXVuc2lnbmVkIGZzX3BoeV90eXBlOjI7CisJCXVuc2lnbmVkIG51bV9kZXZfZXA6NDsKKwkJdW5zaWduZWQgbnVtX2hvc3RfY2hhbjo0OworCQl1bnNpZ25lZCBwZXJpb19lcF9zdXBwb3J0ZWQ6MTsKKwkJdW5zaWduZWQgZHluYW1pY19maWZvOjE7CisJCXVuc2lnbmVkIG11bHRpX3Byb2NfaW50OjE7CisJCXVuc2lnbmVkIHJlc2VydmVkMjE6MTsKKwkJdW5zaWduZWQgbm9ucGVyaW9fdHhfcV9kZXB0aDoyOworCQl1bnNpZ25lZCBob3N0X3BlcmlvX3R4X3FfZGVwdGg6MjsKKwkJdW5zaWduZWQgZGV2X3Rva2VuX3FfZGVwdGg6NTsKKwkJdW5zaWduZWQgb3RnX2VuYWJsZV9pY191c2I6MTsKKwl9IGI7Cit9IGh3Y2ZnMl9kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBVc2VyIEhXIENvbmZpZzMKKyAqIFJlZ2lzdGVyLiAgUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBlbGVtZW50IHRoZW4gcmVhZAorICogb3V0IHRoZSBiaXRzIHVzaW5nIHRoZSA8aT5iPC9pPml0IGVsZW1lbnRzLgorICovCit0eXBlZGVmIHVuaW9uIGh3Y2ZnM19kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQkvKiBHSFdDRkczICovCisJCXVuc2lnbmVkIHhmZXJfc2l6ZV9jbnRyX3dpZHRoOjQ7CisJCXVuc2lnbmVkIHBhY2tldF9zaXplX2NudHJfd2lkdGg6MzsKKwkJdW5zaWduZWQgb3RnX2Z1bmM6MTsKKwkJdW5zaWduZWQgaTJjOjE7CisJCXVuc2lnbmVkIHZlbmRvcl9jdHJsX2lmOjE7CisJCXVuc2lnbmVkIG9wdGlvbmFsX2ZlYXR1cmVzOjE7CisJCXVuc2lnbmVkIHN5bmNoX3Jlc2V0X3R5cGU6MTsKKwkJdW5zaWduZWQgYWRwX3N1cHA6MTsKKwkJdW5zaWduZWQgb3RnX2VuYWJsZV9oc2ljOjE7CisJCXVuc2lnbmVkIGJjX3N1cHBvcnQ6MTsKKwkJdW5zaWduZWQgb3RnX2xwbV9lbjoxOworCQl1bnNpZ25lZCBkZmlmb19kZXB0aDoxNjsKKwl9IGI7Cit9IGh3Y2ZnM19kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBVc2VyIEhXIENvbmZpZzQKKyAqIFJlZ2lzdGVyLiAgUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBlbGVtZW50IHRoZW4gcmVhZAorICogb3V0IHRoZSBiaXRzIHVzaW5nIHRoZSA8aT5iPC9pPml0IGVsZW1lbnRzLgorICovCit0eXBlZGVmIHVuaW9uIGh3Y2ZnNF9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBudW1fZGV2X3BlcmlvX2luX2VwOjQ7CisJCXVuc2lnbmVkIHBvd2VyX29wdGltaXo6MTsKKwkJdW5zaWduZWQgbWluX2FoYl9mcmVxOjE7CisJCXVuc2lnbmVkIHBhcnRfcG93ZXJfZG93bjoxOworCQl1bnNpZ25lZCByZXNlcnZlZDo3OworCQl1bnNpZ25lZCB1dG1pX3BoeV9kYXRhX3dpZHRoOjI7CisJCXVuc2lnbmVkIG51bV9kZXZfbW9kZV9jdHJsX2VwOjQ7CisJCXVuc2lnbmVkIGlkZGlnX2ZpbHRfZW46MTsKKwkJdW5zaWduZWQgdmJ1c192YWxpZF9maWx0X2VuOjE7CisJCXVuc2lnbmVkIGFfdmFsaWRfZmlsdF9lbjoxOworCQl1bnNpZ25lZCBiX3ZhbGlkX2ZpbHRfZW46MTsKKwkJdW5zaWduZWQgc2Vzc2lvbl9lbmRfZmlsdF9lbjoxOworCQl1bnNpZ25lZCBkZWRfZmlmb19lbjoxOworCQl1bnNpZ25lZCBudW1faW5fZXBzOjQ7CisJCXVuc2lnbmVkIGRlc2NfZG1hOjE7CisJCXVuc2lnbmVkIGRlc2NfZG1hX2R5bjoxOworCX0gYjsKK30gaHdjZmc0X2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgb2YgdGhlIENvcmUgTFBNIENvbmZpZ3VyYXRpb24KKyAqIFJlZ2lzdGVyIChHTFBNQ0ZHKS4gU2V0IHRoZSBiaXRzIHVzaW5nIGJpdCBmaWVsZHMgdGhlbiB3cml0ZQorICogdGhlIDxpPmQzMjwvaT4gdmFsdWUgdG8gdGhlIHJlZ2lzdGVyLgorICovCit0eXBlZGVmIHVuaW9uIGdscG1jdGxfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJLyoqIExQTS1DYXBhYmxlIChMUE1DYXApIChEZXZpY2UgYW5kIEhvc3QpCisJCSAqIFRoZSBhcHBsaWNhdGlvbiB1c2VzIHRoaXMgYml0IHRvIGNvbnRyb2wKKwkJICogdGhlIERXQ19vdGcgY29yZSBMUE0gY2FwYWJpbGl0aWVzLgorCQkgKi8KKwkJdW5zaWduZWQgbHBtX2NhcF9lbjoxOworCQkvKiogTFBNIHJlc3BvbnNlIHByb2dyYW1tZWQgYnkgYXBwbGljYXRpb24gKEFwcEwxUmVzKSAoRGV2aWNlKQorCQkgKiBIYW5kc2hha2UgcmVzcG9uc2UgdG8gTFBNIHRva2VuIHByZS1wcm9ncmFtbWVkCisJCSAqIGJ5IGRldmljZSBhcHBsaWNhdGlvbiBzb2Z0d2FyZS4KKwkJICovCisJCXVuc2lnbmVkIGFwcGxfcmVzcDoxOworCQkvKiogSG9zdCBJbml0aWF0ZWQgUmVzdW1lIER1cmF0aW9uIChISVJEKSAoRGV2aWNlIGFuZCBIb3N0KQorCQkgKiBJbiBIb3N0IG1vZGUgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIHZhbHVlIG9mIEhJUkQKKwkJICogdG8gYmUgc2VudCBpbiBhbiBMUE0gdHJhbnNhY3Rpb24uCisJCSAqIEluIERldmljZSBtb2RlIHRoaXMgZmllbGQgaXMgdXBkYXRlZCB3aXRoIHRoZQorCQkgKiBSZWNlaXZlZCBMUE0gVG9rZW4gSElSRCBibUF0dHJpYnV0ZQorCQkgKiB3aGVuIGFuIEFDSy9OWUVUL1NUQUxMIHJlc3BvbnNlIGlzIHNlbnQKKwkJICogdG8gYW4gTFBNIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJdW5zaWduZWQgaGlyZDo0OworCQkvKiogUmVtb3RlV2FrZUVuYWJsZSAoYlJlbW90ZVdha2UpIChEZXZpY2UgYW5kIEhvc3QpCisJCSAqIEluIEhvc3QgbW9kZSB0aGlzIGJpdCBpbmRpY2F0ZXMgdGhlIHZhbHVlIG9mIHJlbW90ZQorCQkgKiB3YWtlIHVwIHRvIGJlIHNlbnQgaW4gd0luZGV4IGZpZWxkIG9mIExQTSB0cmFuc2FjdGlvbi4KKwkJICogSW4gRGV2aWNlIG1vZGUgdGhpcyBmaWVsZCBpcyB1cGRhdGVkIHdpdGggdGhlCisJCSAqIFJlY2VpdmVkIExQTSBUb2tlbiBiUmVtb3RlV2FrZSBibUF0dHJpYnV0ZQorCQkgKiB3aGVuIGFuIEFDSy9OWUVUL1NUQUxMIHJlc3BvbnNlIGlzIHNlbnQKKwkJICogdG8gYW4gTFBNIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJdW5zaWduZWQgcmVtX3drdXBfZW46MTsKKwkJLyoqIEVuYWJsZSB1dG1pX3NsZWVwX24gKEVuYmxTbHBNKSAoRGV2aWNlIGFuZCBIb3N0KQorCQkgKiBUaGUgYXBwbGljYXRpb24gdXNlcyB0aGlzIGJpdCB0byBjb250cm9sCisJCSAqIHRoZSB1dG1pX3NsZWVwX24gYXNzZXJ0aW9uIHRvIHRoZSBQSFkgd2hlbiBpbiBMMSBzdGF0ZS4KKwkJICovCisJCXVuc2lnbmVkIGVuX3V0bWlfc2xlZXA6MTsKKwkJLyoqIEhJUkQgVGhyZXNob2xkIChISVJEX1RocmVzKSAoRGV2aWNlIGFuZCBIb3N0KQorCQkgKi8KKwkJdW5zaWduZWQgaGlyZF90aHJlczo1OworCQkvKiogTFBNIFJlc3BvbnNlIChDb3JlTDFSZXMpIChEZXZpY2UgYW5kIEhvc3QpCisJCSAqIEluIEhvc3QgbW9kZSB0aGlzIGJpdCBjb250YWlucyBoYW5kc2FrZSByZXNwb25zZSB0bworCQkgKiBMUE0gdHJhbnNhY3Rpb24uCisJCSAqIEluIERldmljZSBtb2RlIHRoZSByZXNwb25zZSBvZiB0aGUgY29yZSB0bworCQkgKiBMUE0gdHJhbnNhY3Rpb24gcmVjZWl2ZWQgaXMgcmVmbGVjdGVkIGluIHRoZXNlIHR3byBiaXRzLgorCQkgCS0gMHgwIDogRVJST1IgKE5vIGhhbmRzaGFrZSByZXNwb25zZSkKKwkJCS0gMHgxIDogU1RBTEwKKwkJCS0gMHgyIDogTllFVAorCQkJLSAweDMgOiBBQ0sJCQkKKwkJICovCisJCXVuc2lnbmVkIGxwbV9yZXNwOjI7CisJCS8qKiBQb3J0IFNsZWVwIFN0YXR1cyAoU2xwU3RzKSAoRGV2aWNlIGFuZCBIb3N0KQorCQkgKiBUaGlzIGJpdCBpcyBzZXQgYXMgbG9uZyBhcyBhIFNsZWVwIGNvbmRpdGlvbgorCQkgKiBpcyBwcmVzZW50IG9uIHRoZSBVU0IgYnVzLgorCQkgKi8KKwkJdW5zaWduZWQgcHJ0X3NsZWVwX3N0czoxOworCQkvKiogU2xlZXAgU3RhdGUgUmVzdW1lIE9LIChMMVJlc3VtZU9LKSAoRGV2aWNlIGFuZCBIb3N0KQorCQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gb3IgaG9zdAorCQkgKiBjYW4gc3RhcnQgcmVzdW1lIGZyb20gU2xlZXAgc3RhdGUuCisJCSAqLworCQl1bnNpZ25lZCBzbGVlcF9zdGF0ZV9yZXN1bWVvazoxOworCQkvKiogTFBNIGNoYW5uZWwgSW5kZXggKExQTV9DaG5sX0luZHgpIChIb3N0KQorCQkgKiBUaGUgY2hhbm5lbCBudW1iZXIgb24gd2hpY2ggdGhlIExQTSB0cmFuc2FjdGlvbgorCQkgKiBoYXMgdG8gYmUgYXBwbGllZCB3aGlsZSBzZW5kaW5nCisJCSAqIGFuIExQTSB0cmFuc2FjdGlvbiB0byB0aGUgbG9jYWwgZGV2aWNlLgorCQkgKi8KKwkJdW5zaWduZWQgbHBtX2NoYW5faW5kZXg6NDsKKwkJLyoqIExQTSBSZXRyeSBDb3VudCAoTFBNX1JldHJ5X0NudCkgKEhvc3QpCisJCSAqIE51bWJlciBob3N0IHJldHJpZXMgdGhhdCB3b3VsZCBiZSBwZXJmb3JtZWQKKwkJICogaWYgdGhlIGRldmljZSByZXNwb25zZSB3YXMgbm90IHZhbGlkIHJlc3BvbnNlLgorCQkgKi8KKwkJdW5zaWduZWQgcmV0cnlfY291bnQ6MzsKKwkJLyoqIFNlbmQgTFBNIFRyYW5zYWN0aW9uIChTbmRMUE0pIChIb3N0KQorCQkgKiBXaGVuIHNldCBieSBhcHBsaWNhdGlvbiBzb2Z0d2FyZSwKKwkJICogYW4gTFBNIHRyYW5zYWN0aW9uIGNvbnRhaW5pbmcgdHdvIHRva2VucworCQkgKiBpcyBzZW50LgorCQkgKi8KKwkJdW5zaWduZWQgc2VuZF9scG06MTsKKwkJLyoqIExQTSBSZXRyeSBzdGF0dXMgKExQTV9SZXRyeUNudF9TdHMpIChIb3N0KQorCQkgKiBOdW1iZXIgb2YgTFBNIEhvc3QgUmV0cmllcyBzdGlsbCByZW1haW5pbmcKKwkJICogdG8gYmUgdHJhbnNtaXR0ZWQgZm9yIHRoZSBjdXJyZW50IExQTSBzZXF1ZW5jZQorCQkgKi8KKwkJdW5zaWduZWQgcmV0cnlfY291bnRfc3RzOjM7CisJCXVuc2lnbmVkIHJlc2VydmVkMjhfMjk6MjsKKwkJLyoqIEluIGhvc3QgbW9kZSBvbmNlIHRoaXMgYml0IGlzIHNldCwgdGhlIGhvc3QKKwkJICogY29uZmlndXJlcyB0byBkcml2ZSB0aGUgSFNJQyBJZGxlIHN0YXRlIG9uIHRoZSBidXMuCisJCSAqIEl0IHRoZW4gd2FpdHMgZm9yIHRoZSAgZGV2aWNlIHRvIGluaXRpYXRlIHRoZSBDb25uZWN0IHNlcXVlbmNlLgorCQkgKiBJbiBkZXZpY2UgbW9kZSBvbmNlIHRoaXMgYml0IGlzIHNldCwgdGhlIGRldmljZSB3YWl0cyBmb3IKKwkJICogdGhlIEhTSUMgSWRsZSBsaW5lIHN0YXRlIG9uIHRoZSBidXMuIFVwb24gcmVjZXZpbmcgdGhlIElkbGUKKwkJICogbGluZSBzdGF0ZSwgaXQgaW5pdGlhdGVzIHRoZSBIU0lDIENvbm5lY3Qgc2VxdWVuY2UuCisJCSAqLworCQl1bnNpZ25lZCBoc2ljX2Nvbm5lY3Q6MTsKKwkJLyoqIFRoaXMgYml0IG92ZXJyaWRlcyBhbmQgZnVuY3Rpb25hbGx5IGludmVydHMKKwkJICogdGhlIGlmX3NlbGVjdF9oc2ljIGlucHV0IHBvcnQgc2lnbmFsLgorCQkgKi8KKwkJdW5zaWduZWQgaW52X3NlbF9oc2ljOjE7CisJfSBiOworfSBnbHBtY2ZnX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgb2YgdGhlIENvcmUgQURQIFRpbWVyLCBDb250cm9sIGFuZAorICogU3RhdHVzIFJlZ2lzdGVyIChBRFBUSU1DVExTVFMpLiBTZXQgdGhlIGJpdHMgdXNpbmcgYml0IGZpZWxkcyB0aGVuIHdyaXRlCisgKiB0aGUgPGk+ZDMyPC9pPiB2YWx1ZSB0byB0aGUgcmVnaXN0ZXIuCisgKi8KK3R5cGVkZWYgdW5pb24gYWRwY3RsX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBQcm9iZSBEaXNjaGFyZ2UgKFBSQl9EU0NIRykKKwkJICogIFRoZXNlIGJpdHMgc2V0IHRoZSB0aW1lcyBmb3IgVEFEUF9EU0NIRy4gCisJCSAqICBUaGVzZSBiaXRzIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisJCSAqICAyJ2IwMCAtIDQgbXNlYworCQkgKiAgMidiMDEgLSA4IG1zZWMKKwkJICogIDInYjEwIC0gMTYgbXNlYworCQkgKiAgMidiMTEgLSAzMiBtc2VjCisJCSAqLworCQl1bnNpZ25lZCBwcmJfZHNjaGc6MjsKKwkJLyoqIFByb2JlIERlbHRhIChQUkJfREVMVEEpCisJCSAqICBUaGVzZSBiaXRzIHNldCB0aGUgcmVzb2x1dGlvbiBmb3IgUlRJTSAgIHZhbHVlLgorCQkgKiAgVGhlIGJpdHMgYXJlIGRlZmluZWQgaW4gdW5pdHMgb2YgMzIga0h6IGNsb2NrIGN5Y2xlcyBhcyBmb2xsb3dzOgorCQkgKiAgMidiMDAgIC0gIDEgY3ljbGVzCisJCSAqICAyJ2IwMSAgLSAgMiBjeWNsZXMKKwkJICogIDInYjEwIC0gIDMgY3ljbGVzCisJCSAqICAyJ2IxMSAtIDQgY3ljbGVzCisJCSAqICBGb3IgZXhhbXBsZSBpZiB0aGlzIHZhbHVlIGlzIGNob3NlbiB0byAyJ2IwMSwgaXQgbWVhbnMgdGhhdCBSVElNCisJCSAqICBpbmNyZW1lbnRzIGZvciBldmVyeSAzKHRocmVlKSAzMktoeiBjbG9jayBjeWNsZXMuCisJCSAqLworCQl1bnNpZ25lZCBwcmJfZGVsdGE6MjsKKwkJLyoqIFByb2JlIFBlcmlvZCAoUFJCX1BFUikKKwkJICogIFRoZXNlIGJpdHMgc2V0cyB0aGUgVEFEUF9QUkQgYXMgc2hvd24gaW4gRmlndXJlIDQgYXMgZm9sbG93czoKKwkJICogIDInYjAwICAtICAwLjYyNSB0byAwLjkyNSBzZWMgKHR5cGljYWwgMC43NzUgc2VjKQorCQkgKiAgMidiMDEgIC0gIDEuMjUgdG8gMS44NSBzZWMgKHR5cGljYWwgMS41NSBzZWMpCisJCSAqICAyJ2IxMCAgLSAgMS45IHRvIDIuNiBzZWMgKHR5cGljYWwgMi4yNzUgc2VjKQorCQkgKiAgMidiMTEgIC0gIFJlc2VydmVkCisJCSAqLworCQl1bnNpZ25lZCBwcmJfcGVyOjI7CisJCS8qKiBUaGVzZSBiaXRzIGNhcHR1cmUgdGhlIGxhdGVzdCB0aW1lIGl0IHRvb2sgZm9yIFZCVVMgdG8gcmFtcCBmcm9tIAorCQkgKiAgVkFEUF9TSU5LIHRvIFZBRFBfUFJCLiAKKwkJICogIDB4MDAwICAtICAxIGN5Y2xlcworCQkgKiAgMHgwMDEgIC0gIDIgY3ljbGVzCisJCSAqICAweDAwMiAgLSAgMyBjeWNsZXMKKwkJICogIGV0YworCQkgKiAgMHg3RkYgIC0gIDIwNDggY3ljbGVzCisJCSAqICBBIHRpbWUgb2YgMTAyNCBjeWNsZXMgYXQgMzIga0h6IGNvcnJlc3BvbmRzIHRvIGEgdGltZSBvZiAzMiBtc2VjLgorCQkqLworCQl1bnNpZ25lZCBydGltOjExOworCQkvKiogRW5hYmxlIFByb2JlIChFbmFQcmIpCisJCSAqICBXaGVuIHByb2dyYW1tZWQgdG8gMSdiMSwgdGhlIGNvcmUgcGVyZm9ybXMgYSBwcm9iZSBvcGVyYXRpb24uCisJCSAqICBUaGlzIGJpdCBpcyB2YWxpZCBvbmx5IGlmIE9UR19WZXIgPSAxJ2IxLgorCQkgKi8KKwkJdW5zaWduZWQgZW5hcHJiOjE7CisJCS8qKiBFbmFibGUgU2Vuc2UgKEVuYVNucykKKwkJICogIFdoZW4gcHJvZ3JhbW1lZCB0byAxJ2IxLCB0aGUgY29yZSBwZXJmb3JtcyBhIFNlbnNlIG9wZXJhdGlvbi4KKwkJICogIFRoaXMgYml0IGlzIHZhbGlkIG9ubHkgaWYgT1RHX1ZlciA9IDEnYjEuCisJCSAqLworCQl1bnNpZ25lZCBlbmFzbnM6MTsKKwkJLyoqIEFEUCBSZXNldCAoQURQUmVzKQorCQkgKiAgV2hlbiBzZXQsIEFEUCBjb250cm9sbGVyIGlzIHJlc2V0LgorCQkgKiAgVGhpcyBiaXQgaXMgdmFsaWQgb25seSBpZiBPVEdfVmVyID0gMSdiMS4KKyAJCSAqLworCQl1bnNpZ25lZCBhZHByZXM6MTsKKwkJLyoqIEFEUCBFbmFibGUgKEFEUEVuKQorCQkgKiAgV2hlbiBzZXQsIHRoZSBjb3JlIHBlcmZvcm1zIGVpdGhlciBBRFAgcHJvYmluZyBvciBzZW5zaW5nCisJCSAqICBiYXNlZCBvbiBFbmFQcmIgb3IgRW5hU25zLgorCQkgKiAgVGhpcyBiaXQgaXMgdmFsaWQgb25seSBpZiBPVEdfVmVyID0gMSdiMS4KKwkJICovCisJCXVuc2lnbmVkIGFkcGVuOjE7CisJCS8qKiBBRFAgUHJvYmUgSW50ZXJydXB0IChBRFBfUFJCX0lOVCkKKwkJICogIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCBpdCBtZWFucyB0aGF0IHRoZSBWQlVTCisJCSAqICB2b2x0YWdlIGlzIGdyZWF0ZXIgdGhhbiBWQURQX1BSQiBvciBWQURQX1BSQiBpcyByZWFjaGVkLgorCQkgKiAgVGhpcyBiaXQgaXMgdmFsaWQgb25seSBpZiBPVEdfVmVyID0gMSdiMS4KKwkJICovCisJCXVuc2lnbmVkIGFkcF9wcmJfaW50OjE7CisJCS8qKgorCQkgKiAgQURQIFNlbnNlIEludGVycnVwdCAoQURQX1NOU19JTlQpCisJCSAqICBXaGVuIHRoaXMgYml0IGlzIHNldCwgaXQgbWVhbnMgdGhhdCB0aGUgVkJVUyB2b2x0YWdlIGlzIGdyZWF0ZXIgdGhhbiAKKwkJICogIFZBRFBfU05TIHZhbHVlIG9yIFZBRFBfU05TIGlzIHJlYWNoZWQuCisJCSAqICBUaGlzIGJpdCBpcyB2YWxpZCBvbmx5IGlmIE9UR19WZXIgPSAxJ2IxLgorCQkgKi8KKwkJdW5zaWduZWQgYWRwX3Nuc19pbnQ6MTsKKwkJLyoqIEFEUCBUb21lb3V0IEludGVycnVwdCAoQURQX1RNT1VUX0lOVCkKKwkJICogIFRoaXMgYml0IGlzIHJlbGV2YW50IG9ubHkgZm9yIGFuIEFEUCBwcm9iZS4KKwkJICogIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCBpdCBtZWFucyB0aGF0IHRoZSByYW1wIHRpbWUgaGFzCisJCSAqICBjb21wbGV0ZWQgaWUgQURQQ1RMLlJUSU0gaGFzIHJlYWNoZWQgaXRzIHRlcm1pbmFsIHZhbHVlCisJCSAqICBvZiAweDdGRi4gIFRoaXMgaXMgYSBkZWJ1ZyBmZWF0dXJlIHRoYXQgYWxsb3dzIHNvZnR3YXJlCisJCSAqICB0byByZWFkIHRoZSByYW1wIHRpbWUgYWZ0ZXIgZWFjaCBjeWNsZS4KKwkJICogIFRoaXMgYml0IGlzIHZhbGlkIG9ubHkgaWYgT1RHX1ZlciA9IDEnYjEuCisJCSAqLworCQl1bnNpZ25lZCBhZHBfdG1vdXRfaW50OjE7CisJCS8qKiBBRFAgUHJvYmUgSW50ZXJydXB0IE1hc2sgKEFEUF9QUkJfSU5UX01TSykKKwkJICogIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCBpdCB1bm1hc2tzIHRoZSBpbnRlcnJ1cHQgZHVlIHRvIEFEUF9QUkJfSU5ULgorCQkgKiAgVGhpcyBiaXQgaXMgdmFsaWQgb25seSBpZiBPVEdfVmVyID0gMSdiMS4KKwkJICovCisJCXVuc2lnbmVkIGFkcF9wcmJfaW50X21zazoxOworCQkvKiogQURQIFNlbnNlIEludGVycnVwdCBNYXNrIChBRFBfU05TX0lOVF9NU0spCisJCSAqICBXaGVuIHRoaXMgYml0IGlzIHNldCwgaXQgdW5tYXNrcyB0aGUgaW50ZXJydXB0IGR1ZSB0byBBRFBfU05TX0lOVC4KKwkJICogIFRoaXMgYml0IGlzIHZhbGlkIG9ubHkgaWYgT1RHX1ZlciA9IDEnYjEuCisJCSAqLworCQl1bnNpZ25lZCBhZHBfc25zX2ludF9tc2s6MTsKKwkJLyoqIEFEUCBUaW1vZW91dCBJbnRlcnJ1cHQgTWFzayAoQURQX1RNT1VUX01TSykKKwkJICogIFdoZW4gdGhpcyBiaXQgaXMgc2V0LCBpdCB1bm1hc2tzIHRoZSBpbnRlcnJ1cHQgZHVlIHRvIEFEUF9UTU9VVF9JTlQuCisJCSAqICBUaGlzIGJpdCBpcyB2YWxpZCBvbmx5IGlmIE9UR19WZXIgPSAxJ2IxLgorCQkgKi8KKwkJdW5zaWduZWQgYWRwX3Rtb3V0X2ludF9tc2s6MTsKKwkJLyoqIEFjY2VzcyBSZXF1ZXN0CisJCSAqIDInYjAwIC0gUmVhZC9Xcml0ZSBWYWxpZCAodXBkYXRlZCBieSB0aGUgY29yZSkgCisJCSAqIDInYjAxIC0gUmVhZAorCQkgKiAyJ2IwMCAtIFdyaXRlCisJCSAqIDInYjAwIC0gUmVzZXJ2ZWQKKwkJICovCisJCXVuc2lnbmVkIGFyOjI7CisJCSAvKiogUmVzZXJ2ZWQgKi8KKwkJdW5zaWduZWQgcmVzZXJ2ZWQyOV8zMTozOworCX0gYjsKK30gYWRwY3RsX2RhdGFfdDsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIERldmljZSBSZWdpc3RlcnMKKy8qKgorICogRGV2aWNlIEdsb2JhbCBSZWdpc3RlcnMuIDxpPk9mZnNldHMgODAwaC1CRkZoPC9pPgorICoKKyAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyBkZWZpbmUgdGhlIHNpemUgYW5kIHJlbGF0aXZlIGZpZWxkIG9mZnNldHMKKyAqIGZvciB0aGUgRGV2aWNlIE1vZGUgUmVnaXN0ZXJzLgorICoKKyAqIDxpPlRoZXNlIHJlZ2lzdGVycyBhcmUgdmlzaWJsZSBvbmx5IGluIERldmljZSBtb2RlIGFuZCBtdXN0IG5vdCBiZQorICogYWNjZXNzZWQgaW4gSG9zdCBtb2RlLCBhcyB0aGUgcmVzdWx0cyBhcmUgdW5rbm93bi48L2k+CisgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y19vdGdfZGV2X2dsb2JhbF9yZWdzIHsKKwkvKiogRGV2aWNlIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuIDxpPk9mZnNldCA4MDBoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGRjZmc7CisJLyoqIERldmljZSBDb250cm9sIFJlZ2lzdGVyLiA8aT5PZmZzZXQ6IDgwNGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZGN0bDsKKwkvKiogRGV2aWNlIFN0YXR1cyBSZWdpc3RlciAoUmVhZCBPbmx5KS4gPGk+T2Zmc2V0OiA4MDhoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGRzdHM7CisJLyoqIFJlc2VydmVkLiA8aT5PZmZzZXQ6IDgwQ2g8L2k+ICovCisJdWludDMyX3QgdW51c2VkOworCS8qKiBEZXZpY2UgSU4gRW5kcG9pbnQgQ29tbW9uIEludGVycnVwdCBNYXNrCisJICogUmVnaXN0ZXIuIDxpPk9mZnNldDogODEwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkaWVwbXNrOworCS8qKiBEZXZpY2UgT1VUIEVuZHBvaW50IENvbW1vbiBJbnRlcnJ1cHQgTWFzaworCSAqIFJlZ2lzdGVyLiA8aT5PZmZzZXQ6IDgxNGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZG9lcG1zazsKKwkvKiogRGV2aWNlIEFsbCBFbmRwb2ludHMgSW50ZXJydXB0IFJlZ2lzdGVyLiAgPGk+T2Zmc2V0OiA4MThoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGRhaW50OworCS8qKiBEZXZpY2UgQWxsIEVuZHBvaW50cyBJbnRlcnJ1cHQgTWFzayBSZWdpc3Rlci4gIDxpPk9mZnNldDoKKwkgKiA4MUNoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGRhaW50bXNrOworCS8qKiBEZXZpY2UgSU4gVG9rZW4gUXVldWUgUmVhZCBSZWdpc3Rlci0xIChSZWFkIE9ubHkpLgorCSAqIDxpPk9mZnNldDogODIwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkdGtucXIxOworCS8qKiBEZXZpY2UgSU4gVG9rZW4gUXVldWUgUmVhZCBSZWdpc3Rlci0yIChSZWFkIE9ubHkpLgorCSAqIDxpPk9mZnNldDogODI0aDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkdGtucXIyOworCS8qKiBEZXZpY2UgVkJVUwkgZGlzY2hhcmdlIFJlZ2lzdGVyLiAgPGk+T2Zmc2V0OiA4MjhoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGR2YnVzZGlzOworCS8qKiBEZXZpY2UgVkJVUyBQdWxzZSBSZWdpc3Rlci4JIDxpPk9mZnNldDogODJDaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkdmJ1c3B1bHNlOworCS8qKiBEZXZpY2UgSU4gVG9rZW4gUXVldWUgUmVhZCBSZWdpc3Rlci0zIChSZWFkIE9ubHkpLiAvCisJICoJRGV2aWNlIFRocmVzaG9sZGluZyBjb250cm9sIHJlZ2lzdGVyIChSZWFkL1dyaXRlKQorCSAqIDxpPk9mZnNldDogODMwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkdGtucXIzX2R0aHJjdGw7CisJLyoqIERldmljZSBJTiBUb2tlbiBRdWV1ZSBSZWFkIFJlZ2lzdGVyLTQgKFJlYWQgT25seSkuIC8KKwkgKglEZXZpY2UgSU4gRVBzIGVtcHR5IEluci4gTWFzayBSZWdpc3RlciAoUmVhZC9Xcml0ZSkKKwkgKiA8aT5PZmZzZXQ6IDgzNGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZHRrbnFyNF9maWZvZW1wdHltc2s7CisJLyoqIERldmljZSBFYWNoIEVuZHBvaW50IEludGVycnVwdCBSZWdpc3RlciAoUmVhZCBPbmx5KS4gLworCSAqIDxpPk9mZnNldDogODM4aDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkZWFjaGludDsKKwkvKiogRGV2aWNlIEVhY2ggRW5kcG9pbnQgSW50ZXJydXB0IG1hc2sgUmVnaXN0ZXIgKFJlYWQvV3JpdGUpLiAvCisJICogPGk+T2Zmc2V0OiA4M0NoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGRlYWNoaW50bXNrOworCS8qKiBEZXZpY2UgRWFjaCBJbiBFbmRwb2ludCBJbnRlcnJ1cHQgbWFzayBSZWdpc3RlciAoUmVhZC9Xcml0ZSkuIC8KKwkgKiA8aT5PZmZzZXQ6IDg0MGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZGllcGVhY2hpbnRtc2tbTUFYX0VQU19DSEFOTkVMU107CisJLyoqIERldmljZSBFYWNoIE91dCBFbmRwb2ludCBJbnRlcnJ1cHQgbWFzayBSZWdpc3RlciAoUmVhZC9Xcml0ZSkuIC8KKwkgKiA8aT5PZmZzZXQ6IDg4MGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZG9lcGVhY2hpbnRtc2tbTUFYX0VQU19DSEFOTkVMU107Cit9IGR3Y19vdGdfZGV2aWNlX2dsb2JhbF9yZWdzX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBEZXZpY2UgQ29uZmlndXJhdGlvbgorICogUmVnaXN0ZXIuICBSZWFkIHRoZSByZWdpc3RlciBpbnRvIHRoZSA8aT5kMzI8L2k+IG1lbWJlciB0aGVuCisgKiBzZXQvY2xlYXIgdGhlIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQgZWxlbWVudHMuICBXcml0ZSB0aGUKKyAqIDxpPmQzMjwvaT4gbWVtYmVyIHRvIHRoZSBkY2ZnIHJlZ2lzdGVyLgorICovCit0eXBlZGVmIHVuaW9uIGRjZmdfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJLyoqIERldmljZSBTcGVlZCAqLworCQl1bnNpZ25lZCBkZXZzcGQ6MjsKKwkJLyoqIE5vbiBaZXJvIExlbmd0aCBTdGF0dXMgT1VUIEhhbmRzaGFrZSAqLworCQl1bnNpZ25lZCBuenN0c291dGhzaGs6MTsKKyNkZWZpbmUgRFdDX0RDRkdfU0VORF9TVEFMTCAxCisKKwkJdW5zaWduZWQgZW5hMzJraHpzOjE7CisJCS8qKiBEZXZpY2UgQWRkcmVzc2VzICovCisJCXVuc2lnbmVkIGRldmFkZHI6NzsKKwkJLyoqIFBlcmlvZGljIEZyYW1lIEludGVydmFsICovCisJCXVuc2lnbmVkIHBlcmZyaW50OjI7CisjZGVmaW5lIERXQ19EQ0ZHX0ZSQU1FX0lOVEVSVkFMXzgwIDAKKyNkZWZpbmUgRFdDX0RDRkdfRlJBTUVfSU5URVJWQUxfODUgMQorI2RlZmluZSBEV0NfRENGR19GUkFNRV9JTlRFUlZBTF85MCAyCisjZGVmaW5lIERXQ19EQ0ZHX0ZSQU1FX0lOVEVSVkFMXzk1IDMKKwkJCisJCS8qKiBFbmFibGUgRGV2aWNlIE9VVCBOQUsgZm9yIGJ1bGsgaW4gRERNQSBtb2RlICovCisJCXVuc2lnbmVkIGVuZGV2b3V0bmFrOjE7CisKKwkJdW5zaWduZWQgcmVzZXJ2ZWQxNF8xNzo0OworCQkvKiogSW4gRW5kcG9pbnQgTWlzLW1hdGNoIGNvdW50ICovCisJCXVuc2lnbmVkIGVwbXNjbnQ6NTsKKwkJLyoqIEVuYWJsZSBEZXNjcmlwdG9yIERNQSBpbiBEZXZpY2UgbW9kZSAqLworCQl1bnNpZ25lZCBkZXNjZG1hOjE7CisJCXVuc2lnbmVkIHBlcnNjaGludHZsOjI7CisJCXVuc2lnbmVkIHJlc3ZhbGlkOjY7CisJfSBiOworfSBkY2ZnX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIERldmljZSBDb250cm9sCisgKiBSZWdpc3Rlci4gIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gbWVtYmVyIHRoZW4KKyAqIHNldC9jbGVhciB0aGUgYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBkY3RsX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBSZW1vdGUgV2FrZXVwICovCisJCXVuc2lnbmVkIHJtdHdrdXBzaWc6MTsKKwkJLyoqIFNvZnQgRGlzY29ubmVjdCAqLworCQl1bnNpZ25lZCBzZnRkaXNjb246MTsKKwkJLyoqIEdsb2JhbCBOb24tUGVyaW9kaWMgSU4gTkFLIFN0YXR1cyAqLworCQl1bnNpZ25lZCBnbnBpbm5ha3N0czoxOworCQkvKiogR2xvYmFsIE9VVCBOQUsgU3RhdHVzICovCisJCXVuc2lnbmVkIGdvdXRuYWtzdHM6MTsKKwkJLyoqIFRlc3QgQ29udHJvbCAqLworCQl1bnNpZ25lZCB0c3RjdGw6MzsKKwkJLyoqIFNldCBHbG9iYWwgTm9uLVBlcmlvZGljIElOIE5BSyAqLworCQl1bnNpZ25lZCBzZ25waW5uYWs6MTsKKwkJLyoqIENsZWFyIEdsb2JhbCBOb24tUGVyaW9kaWMgSU4gTkFLICovCisJCXVuc2lnbmVkIGNnbnBpbm5hazoxOworCQkvKiogU2V0IEdsb2JhbCBPVVQgTkFLICovCisJCXVuc2lnbmVkIHNnb3V0bmFrOjE7CisJCS8qKiBDbGVhciBHbG9iYWwgT1VUIE5BSyAqLworCQl1bnNpZ25lZCBjZ291dG5hazoxOworCQkvKiogUG93ZXItT24gUHJvZ3JhbW1pbmcgRG9uZSAqLworCQl1bnNpZ25lZCBwd3JvbnByZ2RvbmU6MTsKKwkJLyoqIFJlc2VydmVkICovCisJCXVuc2lnbmVkIHJlc2VydmVkOjE7CisJCS8qKiBHbG9iYWwgTXVsdGkgQ291bnQgKi8KKwkJdW5zaWduZWQgZ21jOjI7CisJCS8qKiBJZ25vcmUgRnJhbWUgTnVtYmVyIGZvciBJU09DIEVQcyAqLworCQl1bnNpZ25lZCBpZnJtbnVtOjE7CisJCS8qKiBOQUsgb24gQmFiYmxlICovCisJCXVuc2lnbmVkIG5ha29uYmJsZToxOworCQkvKiogRW5hYmxlIENvbnRpbnVlIG9uIEJOQSAqLworCQl1bnNpZ25lZCBlbmNvbnRvbmJuYToxOworCisJCXVuc2lnbmVkIHJlc2VydmVkMThfMzE6MTQ7CisJfSBiOworfSBkY3RsX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIERldmljZSBTdGF0dXMKKyAqIFJlZ2lzdGVyLiAgUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBtZW1iZXIgdGhlbgorICogc2V0L2NsZWFyIHRoZSBiaXRzIHVzaW5nIHRoZSA8aT5iPC9pPml0IGVsZW1lbnRzLgorICovCit0eXBlZGVmIHVuaW9uIGRzdHNfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJLyoqIFN1c3BlbmQgU3RhdHVzICovCisJCXVuc2lnbmVkIHN1c3BzdHM6MTsKKwkJLyoqIEVudW1lcmF0ZWQgU3BlZWQgKi8KKwkJdW5zaWduZWQgZW51bXNwZDoyOworI2RlZmluZSBEV0NfRFNUU19FTlVNU1BEX0hTX1BIWV8zME1IWl9PUl82ME1IWiAwCisjZGVmaW5lIERXQ19EU1RTX0VOVU1TUERfRlNfUEhZXzMwTUhaX09SXzYwTUhaIDEKKyNkZWZpbmUgRFdDX0RTVFNfRU5VTVNQRF9MU19QSFlfNk1IWgkJICAgMgorI2RlZmluZSBEV0NfRFNUU19FTlVNU1BEX0ZTX1BIWV80OE1IWgkJICAgMworCQkvKiogRXJyYXRpYyBFcnJvciAqLworCQl1bnNpZ25lZCBlcnJ0aWNlcnI6MTsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQ0Xzc6NDsKKwkJLyoqIEZyYW1lIG9yIE1pY3JvZnJhbWUgTnVtYmVyIG9mIHRoZSByZWNlaXZlZCBTT0YgKi8KKwkJdW5zaWduZWQgc29mZm46MTQ7CisJCXVuc2lnbmVkIHJlc2VydmVkMjJfMzE6MTA7CisJfSBiOworfSBkc3RzX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIERldmljZSBJTiBFUCBJbnRlcnJ1cHQKKyAqIFJlZ2lzdGVyIGFuZCB0aGUgRGV2aWNlIElOIEVQIENvbW1vbiBNYXNrIFJlZ2lzdGVyLgorICoKKyAqIC0gUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBtZW1iZXIgdGhlbiBzZXQvY2xlYXIgdGhlCisgKgkgYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBkaWVwaW50X2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBUcmFuc2ZlciBjb21wbGV0ZSBtYXNrICovCisJCXVuc2lnbmVkIHhmZXJjb21wbDoxOworCQkvKiogRW5kcG9pbnQgZGlzYWJsZSBtYXNrICovCisJCXVuc2lnbmVkIGVwZGlzYWJsZWQ6MTsKKwkJLyoqIEFIQiBFcnJvciBtYXNrICovCisJCXVuc2lnbmVkIGFoYmVycjoxOworCQkvKiogVGltZU9VVCBIYW5kc2hha2UgbWFzayAobm9uLUlTT0MgRVBzKSAqLworCQl1bnNpZ25lZCB0aW1lb3V0OjE7CisJCS8qKiBJTiBUb2tlbiByZWNlaXZlZCB3aXRoIFR4RiBFbXB0eSBtYXNrICovCisJCXVuc2lnbmVkIGludGt0eGZlbXA6MTsKKwkJLyoqIElOIFRva2VuIFJlY2VpdmVkIHdpdGggRVAgbWlzbWF0Y2ggbWFzayAqLworCQl1bnNpZ25lZCBpbnRrbmVwbWlzOjE7CisJCS8qKiBJTiBFbmRwb2ludCBOQUsgRWZmZWN0aXZlIG1hc2sgKi8KKwkJdW5zaWduZWQgaW5lcG5ha2VmZjoxOworCQkvKiogUmVzZXJ2ZWQgKi8KKwkJdW5zaWduZWQgZW1wdHlpbnRyOjE7CisKKwkJdW5zaWduZWQgdHhmaWZvdW5kcm46MTsKKworCQkvKiogQk5BIEludGVycnVwdCBtYXNrICovCisJCXVuc2lnbmVkIGJuYToxOworCisJCXVuc2lnbmVkIHJlc2VydmVkMTBfMTI6MzsKKwkJLyoqIEJOQSBJbnRlcnJ1cHQgbWFzayAqLworCQl1bnNpZ25lZCBuYWs6MTsKKworCQl1bnNpZ25lZCByZXNlcnZlZDE0XzMxOjE4OworCX0gYjsKK30gZGllcGludF9kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBEZXZpY2UgSU4gRVAKKyAqIENvbW1vbi9EZWRpY2F0ZWQgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIuCisgKi8KK3R5cGVkZWYgdW5pb24gZGllcGludF9kYXRhIGRpZXBtc2tfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgRGV2aWNlIE9VVCBFUCBJbnRlcnJ1cHQKKyAqIFJlZ2lzdGVyYW5kIERldmljZSBPVVQgRVAgQ29tbW9uIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLgorICoKKyAqIC0gUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBtZW1iZXIgdGhlbiBzZXQvY2xlYXIgdGhlCisgKgkgYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBkb2VwaW50X2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBUcmFuc2ZlciBjb21wbGV0ZSAqLworCQl1bnNpZ25lZCB4ZmVyY29tcGw6MTsKKwkJLyoqIEVuZHBvaW50IGRpc2FibGUgICovCisJCXVuc2lnbmVkIGVwZGlzYWJsZWQ6MTsKKwkJLyoqIEFIQiBFcnJvciAqLworCQl1bnNpZ25lZCBhaGJlcnI6MTsKKwkJLyoqIFNldHVwIFBoYXNlIERvbmUgKGNvbnRvcmwgRVBzKSAqLworCQl1bnNpZ25lZCBzZXR1cDoxOworCQkvKiogT1VUIFRva2VuIFJlY2VpdmVkIHdoZW4gRW5kcG9pbnQgRGlzYWJsZWQgKi8KKwkJdW5zaWduZWQgb3V0dGtuZXBkaXM6MTsKKworCQl1bnNpZ25lZCBzdHNwaHNlcmN2ZDoxOworCQkvKiogQmFjay10by1CYWNrIFNFVFVQIFBhY2tldHMgUmVjZWl2ZWQgKi8KKwkJdW5zaWduZWQgYmFjazJiYWNrc2V0dXA6MTsKKworCQl1bnNpZ25lZCByZXNlcnZlZDc6MTsKKwkJLyoqIE9VVCBwYWNrZXQgRXJyb3IgKi8KKwkJdW5zaWduZWQgb3V0cGt0ZXJyOjE7CisJCS8qKiBCTkEgSW50ZXJydXB0ICovCisJCXVuc2lnbmVkIGJuYToxOworCisJCXVuc2lnbmVkIHJlc2VydmVkMTA6MTsKKwkJLyoqIFBhY2tldCBEcm9wIFN0YXR1cyAqLworCQl1bnNpZ25lZCBwa3RkcnBzdHM6MTsKKwkJLyoqIEJhYmJsZSBJbnRlcnJ1cHQgKi8KKwkJdW5zaWduZWQgYmFiYmxlOjE7CisJCS8qKiBOQUsgSW50ZXJydXB0ICovCisJCXVuc2lnbmVkIG5hazoxOworCQkvKiogTllFVCBJbnRlcnJ1cHQgKi8KKwkJdW5zaWduZWQgbnlldDoxOworCisJCXVuc2lnbmVkIHJlc2VydmVkMTVfMzE6MTc7CisJfSBiOworfSBkb2VwaW50X2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIERldmljZSBPVVQgRVAKKyAqIENvbW1vbi9EZWRpY2F0ZWQgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIuCisgKi8KK3R5cGVkZWYgdW5pb24gZG9lcGludF9kYXRhIGRvZXBtc2tfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgRGV2aWNlIEFsbCBFUCBJbnRlcnJ1cHQKKyAqIGFuZCBNYXNrIFJlZ2lzdGVycy4KKyAqIC0gUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBtZW1iZXIgdGhlbiBzZXQvY2xlYXIgdGhlCisgKgkgYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBkYWludF9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQkvKiogSU4gRW5kcG9pbnQgYml0cyAqLworCQl1bnNpZ25lZCBpbjoxNjsKKwkJLyoqIE9VVCBFbmRwb2ludCBiaXRzICovCisJCXVuc2lnbmVkIG91dDoxNjsKKwl9IGVwOworCXN0cnVjdCB7CisJCS8qKiBJTiBFbmRwb2ludCBiaXRzICovCisJCXVuc2lnbmVkIGluZXAwOjE7CisJCXVuc2lnbmVkIGluZXAxOjE7CisJCXVuc2lnbmVkIGluZXAyOjE7CisJCXVuc2lnbmVkIGluZXAzOjE7CisJCXVuc2lnbmVkIGluZXA0OjE7CisJCXVuc2lnbmVkIGluZXA1OjE7CisJCXVuc2lnbmVkIGluZXA2OjE7CisJCXVuc2lnbmVkIGluZXA3OjE7CisJCXVuc2lnbmVkIGluZXA4OjE7CisJCXVuc2lnbmVkIGluZXA5OjE7CisJCXVuc2lnbmVkIGluZXAxMDoxOworCQl1bnNpZ25lZCBpbmVwMTE6MTsKKwkJdW5zaWduZWQgaW5lcDEyOjE7CisJCXVuc2lnbmVkIGluZXAxMzoxOworCQl1bnNpZ25lZCBpbmVwMTQ6MTsKKwkJdW5zaWduZWQgaW5lcDE1OjE7CisJCS8qKiBPVVQgRW5kcG9pbnQgYml0cyAqLworCQl1bnNpZ25lZCBvdXRlcDA6MTsKKwkJdW5zaWduZWQgb3V0ZXAxOjE7CisJCXVuc2lnbmVkIG91dGVwMjoxOworCQl1bnNpZ25lZCBvdXRlcDM6MTsKKwkJdW5zaWduZWQgb3V0ZXA0OjE7CisJCXVuc2lnbmVkIG91dGVwNToxOworCQl1bnNpZ25lZCBvdXRlcDY6MTsKKwkJdW5zaWduZWQgb3V0ZXA3OjE7CisJCXVuc2lnbmVkIG91dGVwODoxOworCQl1bnNpZ25lZCBvdXRlcDk6MTsKKwkJdW5zaWduZWQgb3V0ZXAxMDoxOworCQl1bnNpZ25lZCBvdXRlcDExOjE7CisJCXVuc2lnbmVkIG91dGVwMTI6MTsKKwkJdW5zaWduZWQgb3V0ZXAxMzoxOworCQl1bnNpZ25lZCBvdXRlcDE0OjE7CisJCXVuc2lnbmVkIG91dGVwMTU6MTsKKwl9IGI7Cit9IGRhaW50X2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIERldmljZSBJTiBUb2tlbiBRdWV1ZQorICogUmVhZCBSZWdpc3RlcnMuCisgKiAtIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gbWVtYmVyLgorICogLSBSRUFELU9OTFkgUmVnaXN0ZXIKKyAqLwordHlwZWRlZiB1bmlvbiBkdGtucTFfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJLyoqIEluIFRva2VuIFF1ZXVlIFdyaXRlIFBvaW50ZXIgKi8KKwkJdW5zaWduZWQgaW50a253cHRyOjU7CisJCS8qKiBSZXNlcnZlZCAqLworCQl1bnNpZ25lZCByZXNlcnZlZDA1XzA2OjI7CisJCS8qKiB3cml0ZSBwb2ludGVyIGhhcyB3cmFwcGVkLiAqLworCQl1bnNpZ25lZCB3cmFwX2JpdDoxOworCQkvKiogRVAgTnVtYmVycyBvZiBJTiBUb2tlbnMgMCAuLi4gNCAqLworCQl1bnNpZ25lZCBlcG51bXMwXzU6MjQ7CisJfSBiOworfSBkdGtucTFfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyBUaHJlc2hvbGQgY29udHJvbCBSZWdpc3RlcgorICogLSBSZWFkIGFuZCB3cml0ZSB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBtZW1iZXIuCisgKiAtIFJFQUQtV1JJVEFCTEUgUmVnaXN0ZXIKKyAqLwordHlwZWRlZiB1bmlvbiBkdGhyY3RsX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBub24gSVNPIFR4IFRoci4gRW5hYmxlICovCisJCXVuc2lnbmVkIG5vbl9pc29fdGhyX2VuOjE7CisJCS8qKiBJU08gVHggVGhyLiBFbmFibGUgKi8KKwkJdW5zaWduZWQgaXNvX3Rocl9lbjoxOworCQkvKiogVHggVGhyLiBMZW5ndGggKi8KKwkJdW5zaWduZWQgdHhfdGhyX2xlbjo5OworCQkvKiogQUhCIFRocmVzaG9sZCByYXRpbyAqLworCQl1bnNpZ25lZCBhaGJfdGhyX3JhdGlvOjI7CisJCS8qKiBSZXNlcnZlZCAqLworCQl1bnNpZ25lZCByZXNlcnZlZDEzXzE1OjM7CisJCS8qKiBSeCBUaHIuIEVuYWJsZSAqLworCQl1bnNpZ25lZCByeF90aHJfZW46MTsKKwkJLyoqIFJ4IFRoci4gTGVuZ3RoICovCisJCXVuc2lnbmVkIHJ4X3Rocl9sZW46OTsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQyNjoxOworCQkvKiogQXJiaXRlciBQYXJraW5nIEVuYWJsZSovCisJCXVuc2lnbmVkIGFyYnBya2VuOjE7CisJCS8qKiBSZXNlcnZlZCAqLworCQl1bnNpZ25lZCByZXNlcnZlZDI4XzMxOjQ7CisJfSBiOworfSBkdGhyY3RsX2RhdGFfdDsKKworLyoqCisgKiBEZXZpY2UgTG9naWNhbCBJTiBFbmRwb2ludC1TcGVjaWZpYyBSZWdpc3RlcnMuIDxpPk9mZnNldHMKKyAqIDkwMGgtQUZDaDwvaT4KKyAqCisgKiBUaGVyZSB3aWxsIGJlIG9uZSBzZXQgb2YgZW5kcG9pbnQgcmVnaXN0ZXJzIHBlciBsb2dpY2FsIGVuZHBvaW50CisgKiBpbXBsZW1lbnRlZC4KKyAqCisgKiA8aT5UaGVzZSByZWdpc3RlcnMgYXJlIHZpc2libGUgb25seSBpbiBEZXZpY2UgbW9kZSBhbmQgbXVzdCBub3QgYmUKKyAqIGFjY2Vzc2VkIGluIEhvc3QgbW9kZSwgYXMgdGhlIHJlc3VsdHMgYXJlIHVua25vd24uPC9pPgorICovCit0eXBlZGVmIHN0cnVjdCBkd2Nfb3RnX2Rldl9pbl9lcF9yZWdzIHsKKwkvKiogRGV2aWNlIElOIEVuZHBvaW50IENvbnRyb2wgUmVnaXN0ZXIuIDxpPk9mZnNldDo5MDBoICsKKwkgKiAoZXBfbnVtICogMjBoKSArIDAwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkaWVwY3RsOworCS8qKiBSZXNlcnZlZC4gPGk+T2Zmc2V0OjkwMGggKyAoZXBfbnVtICogMjBoKSArIDA0aDwvaT4gKi8KKwl1aW50MzJfdCByZXNlcnZlZDA0OworCS8qKiBEZXZpY2UgSU4gRW5kcG9pbnQgSW50ZXJydXB0IFJlZ2lzdGVyLiA8aT5PZmZzZXQ6OTAwaCArCisJICogKGVwX251bSAqIDIwaCkgKyAwOGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZGllcGludDsKKwkvKiogUmVzZXJ2ZWQuIDxpPk9mZnNldDo5MDBoICsgKGVwX251bSAqIDIwaCkgKyAwQ2g8L2k+ICovCisJdWludDMyX3QgcmVzZXJ2ZWQwQzsKKwkvKiogRGV2aWNlIElOIEVuZHBvaW50IFRyYW5zZmVyIFNpemUKKwkgKiBSZWdpc3Rlci4gPGk+T2Zmc2V0OjkwMGggKyAoZXBfbnVtICogMjBoKSArIDEwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkaWVwdHNpejsKKwkvKiogRGV2aWNlIElOIEVuZHBvaW50IERNQSBBZGRyZXNzIFJlZ2lzdGVyLiA8aT5PZmZzZXQ6OTAwaCArCisJICogKGVwX251bSAqIDIwaCkgKyAxNGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZGllcGRtYTsKKwkvKiogRGV2aWNlIElOIEVuZHBvaW50IFRyYW5zbWl0IEZJRk8gU3RhdHVzIFJlZ2lzdGVyLiA8aT5PZmZzZXQ6OTAwaCArCisJICogKGVwX251bSAqIDIwaCkgKyAxOGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgZHR4ZnN0czsKKwkvKiogRGV2aWNlIElOIEVuZHBvaW50IERNQSBCdWZmZXIgUmVnaXN0ZXIuIDxpPk9mZnNldDo5MDBoICsKKwkgKiAoZXBfbnVtICogMjBoKSArIDFDaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkaWVwZG1hYjsKK30gZHdjX290Z19kZXZfaW5fZXBfcmVnc190OworCisvKioKKyAqIERldmljZSBMb2dpY2FsIE9VVCBFbmRwb2ludC1TcGVjaWZpYyBSZWdpc3RlcnMuIDxpPk9mZnNldHM6CisgKiBCMDBoLUNGQ2g8L2k+CisgKgorICogVGhlcmUgd2lsbCBiZSBvbmUgc2V0IG9mIGVuZHBvaW50IHJlZ2lzdGVycyBwZXIgbG9naWNhbCBlbmRwb2ludAorICogaW1wbGVtZW50ZWQuCisgKgorICogPGk+VGhlc2UgcmVnaXN0ZXJzIGFyZSB2aXNpYmxlIG9ubHkgaW4gRGV2aWNlIG1vZGUgYW5kIG11c3Qgbm90IGJlCisgKiBhY2Nlc3NlZCBpbiBIb3N0IG1vZGUsIGFzIHRoZSByZXN1bHRzIGFyZSB1bmtub3duLjwvaT4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgZHdjX290Z19kZXZfb3V0X2VwX3JlZ3MgeworCS8qKiBEZXZpY2UgT1VUIEVuZHBvaW50IENvbnRyb2wgUmVnaXN0ZXIuIDxpPk9mZnNldDpCMDBoICsKKwkgKiAoZXBfbnVtICogMjBoKSArIDAwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkb2VwY3RsOworCS8qKiBSZXNlcnZlZC4gPGk+T2Zmc2V0OkIwMGggKyAoZXBfbnVtICogMjBoKSArIDA0aDwvaT4gKi8KKwl1aW50MzJfdCByZXNlcnZlZDA0OworCS8qKiBEZXZpY2UgT1VUIEVuZHBvaW50IEludGVycnVwdCBSZWdpc3Rlci4gPGk+T2Zmc2V0OkIwMGggKworCSAqIChlcF9udW0gKiAyMGgpICsgMDhoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGRvZXBpbnQ7CisJLyoqIFJlc2VydmVkLiA8aT5PZmZzZXQ6QjAwaCArIChlcF9udW0gKiAyMGgpICsgMENoPC9pPiAqLworCXVpbnQzMl90IHJlc2VydmVkMEM7CisJLyoqIERldmljZSBPVVQgRW5kcG9pbnQgVHJhbnNmZXIgU2l6ZSBSZWdpc3Rlci4gPGk+T2Zmc2V0OgorCSAqIEIwMGggKyAoZXBfbnVtICogMjBoKSArIDEwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBkb2VwdHNpejsKKwkvKiogRGV2aWNlIE9VVCBFbmRwb2ludCBETUEgQWRkcmVzcyBSZWdpc3Rlci4gPGk+T2Zmc2V0OkIwMGgKKwkgKiArIChlcF9udW0gKiAyMGgpICsgMTRoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGRvZXBkbWE7CisJLyoqIFJlc2VydmVkLiA8aT5PZmZzZXQ6QjAwaCArIAkgKiAoZXBfbnVtICogMjBoKSArIDE4aDwvaT4gKi8KKwl1aW50MzJfdCB1bnVzZWQ7CisJLyoqIERldmljZSBPVVQgRW5kcG9pbnQgRE1BIEJ1ZmZlciBSZWdpc3Rlci4gPGk+T2Zmc2V0OkIwMGgKKwkgKiArIChlcF9udW0gKiAyMGgpICsgMUNoPC9pPiAqLworCXVpbnQzMl90IGRvZXBkbWFiOworfSBkd2Nfb3RnX2Rldl9vdXRfZXBfcmVnc190OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgRGV2aWNlIEVQIENvbnRyb2wKKyAqIFJlZ2lzdGVyLiAgUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBtZW1iZXIgdGhlbgorICogc2V0L2NsZWFyIHRoZSBiaXRzIHVzaW5nIHRoZSA8aT5iPC9pPml0IGVsZW1lbnRzLgorICovCit0eXBlZGVmIHVuaW9uIGRlcGN0bF9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQkvKiogTWF4aW11bSBQYWNrZXQgU2l6ZQorCQkgKiBJTi9PVVQgRVBuCisJCSAqIElOL09VVCBFUDAgLSAyIGJpdHMKKwkJICoJIDInYjAwOiA2NCBCeXRlcworCQkgKgkgMidiMDE6IDMyCisJCSAqCSAyJ2IxMDogMTYKKwkJICoJIDInYjExOiA4ICovCisJCXVuc2lnbmVkIG1wczoxMTsKKyNkZWZpbmUgRFdDX0RFUDBDVExfTVBTXzY0CSAwCisjZGVmaW5lIERXQ19ERVAwQ1RMX01QU18zMgkgMQorI2RlZmluZSBEV0NfREVQMENUTF9NUFNfMTYJIDIKKyNkZWZpbmUgRFdDX0RFUDBDVExfTVBTXzgJIDMKKworCQkvKiogTmV4dCBFbmRwb2ludAorCQkgKiBJTiBFUG4vSU4gRVAwCisJCSAqIE9VVCBFUG4vT1VUIEVQMCAtIHJlc2VydmVkICovCisJCXVuc2lnbmVkIG5leHRlcDo0OworCisJCS8qKiBVU0IgQWN0aXZlIEVuZHBvaW50ICovCisJCXVuc2lnbmVkIHVzYmFjdGVwOjE7CisKKwkJLyoqIEVuZHBvaW50IERQSUQgKElOVFIvQnVsayBJTiBhbmQgT1VUIGVuZHBvaW50cykKKwkJICogVGhpcyBmaWVsZCBjb250YWlucyB0aGUgUElEIG9mIHRoZSBwYWNrZXQgZ29pbmcgdG8KKwkJICogYmUgcmVjZWl2ZWQgb3IgdHJhbnNtaXR0ZWQgb24gdGhpcyBlbmRwb2ludC4gVGhlCisJCSAqIGFwcGxpY2F0aW9uIHNob3VsZCBwcm9ncmFtIHRoZSBQSUQgb2YgdGhlIGZpcnN0CisJCSAqIHBhY2tldCBnb2luZyB0byBiZSByZWNlaXZlZCBvciB0cmFuc21pdHRlZCBvbiB0aGlzCisJCSAqIGVuZHBvaW50ICwgYWZ0ZXIgdGhlIGVuZHBvaW50IGlzCisJCSAqIGFjdGl2YXRlZC4gQXBwbGljYXRpb24gdXNlIHRoZSBTZXREMVBJRCBhbmQKKwkJICogU2V0RDBQSUQgZmllbGRzIG9mIHRoaXMgcmVnaXN0ZXIgdG8gcHJvZ3JhbSBlaXRoZXIKKwkJICogRDAgb3IgRDEgUElELgorCQkgKgorCQkgKiBUaGUgZW5jb2RpbmcgZm9yIHRoaXMgZmllbGQgaXMKKwkJICoJIC0gMDogRDAKKwkJICoJIC0gMTogRDEKKwkJICovCisJCXVuc2lnbmVkIGRwaWQ6MTsKKworCQkvKiogTkFLIFN0YXR1cyAqLworCQl1bnNpZ25lZCBuYWtzdHM6MTsKKworCQkvKiogRW5kcG9pbnQgVHlwZQorCQkgKgkyJ2IwMDogQ29udHJvbAorCQkgKgkyJ2IwMTogSXNvY2hyb25vdXMKKwkJICoJMidiMTA6IEJ1bGsKKwkJICoJMidiMTE6IEludGVycnVwdCAqLworCQl1bnNpZ25lZCBlcHR5cGU6MjsKKworCQkvKiogU25vb3AgTW9kZQorCQkgKiBPVVQgRVBuL09VVCBFUDAKKwkJICogSU4gRVBuL0lOIEVQMCAtIHJlc2VydmVkICovCisJCXVuc2lnbmVkIHNucDoxOworCisJCS8qKiBTdGFsbCBIYW5kc2hha2UgKi8KKwkJdW5zaWduZWQgc3RhbGw6MTsKKworCQkvKiogVHggRmlmbyBOdW1iZXIKKwkJICogSU4gRVBuL0lOIEVQMAorCQkgKiBPVVQgRVBuL09VVCBFUDAgLSByZXNlcnZlZCAqLworCQl1bnNpZ25lZCB0eGZudW06NDsKKworCQkvKiogQ2xlYXIgTkFLICovCisJCXVuc2lnbmVkIGNuYWs6MTsKKwkJLyoqIFNldCBOQUsgKi8KKwkJdW5zaWduZWQgc25hazoxOworCQkvKiogU2V0IERBVEEwIFBJRCAoSU5UUi9CdWxrIElOIGFuZCBPVVQgZW5kcG9pbnRzKQorCQkgKiBXcml0aW5nIHRvIHRoaXMgZmllbGQgc2V0cyB0aGUgRW5kcG9pbnQgRFBJRCAoRFBJRCkKKwkJICogZmllbGQgaW4gdGhpcyByZWdpc3RlciB0byBEQVRBMC4gU2V0IEV2ZW4KKwkJICogKG1pY3JvKWZyYW1lIChTZXRFdmVuRnIpIChJU08gSU4gYW5kIE9VVCBFbmRwb2ludHMpCisJCSAqIFdyaXRpbmcgdG8gdGhpcyBmaWVsZCBzZXRzIHRoZSBFdmVuL09kZAorCQkgKiAobWljcm8pZnJhbWUgKEVPX0ZyTnVtKSBmaWVsZCB0byBldmVuIChtaWNybykKKwkJICogZnJhbWUuCisJCSAqLworCQl1bnNpZ25lZCBzZXRkMHBpZDoxOworCQkvKiogU2V0IERBVEExIFBJRCAoSU5UUi9CdWxrIElOIGFuZCBPVVQgZW5kcG9pbnRzKQorCQkgKiBXcml0aW5nIHRvIHRoaXMgZmllbGQgc2V0cyB0aGUgRW5kcG9pbnQgRFBJRCAoRFBJRCkKKwkJICogZmllbGQgaW4gdGhpcyByZWdpc3RlciB0byBEQVRBMSBTZXQgT2RkCisJCSAqIChtaWNybylmcmFtZSAoU2V0T2RkRnIpIChJU08gSU4gYW5kIE9VVCBFbmRwb2ludHMpCisJCSAqIFdyaXRpbmcgdG8gdGhpcyBmaWVsZCBzZXRzIHRoZSBFdmVuL09kZAorCQkgKiAobWljcm8pZnJhbWUgKEVPX0ZyTnVtKSBmaWVsZCB0byBvZGQgKG1pY3JvKSBmcmFtZS4KKwkJICovCisJCXVuc2lnbmVkIHNldGQxcGlkOjE7CisKKwkJLyoqIEVuZHBvaW50IERpc2FibGUgKi8KKwkJdW5zaWduZWQgZXBkaXM6MTsKKwkJLyoqIEVuZHBvaW50IEVuYWJsZSAqLworCQl1bnNpZ25lZCBlcGVuYToxOworCX0gYjsKK30gZGVwY3RsX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIERldmljZSBFUCBUcmFuc2ZlcgorICogU2l6ZSBSZWdpc3Rlci4gIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gbWVtYmVyIHRoZW4KKyAqIHNldC9jbGVhciB0aGUgYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBkZXB0c2l6X2RhdGEgeworCQkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJLyoqIFRyYW5zZmVyIHNpemUgKi8KKwkJdW5zaWduZWQgeGZlcnNpemU6MTk7CisvKiogTWF4IHBhY2tldCBjb3VudCBmb3IgRVAgKHBvdygyLDEwKS0xKSAqLworI2RlZmluZSBNQVhfUEtUX0NOVCAxMDIzCisJCS8qKiBQYWNrZXQgQ291bnQgKi8KKwkJdW5zaWduZWQgcGt0Y250OjEwOworCQkvKiogTXVsdGkgQ291bnQgLSBQZXJpb2RpYyBJTiBlbmRwb2ludHMgKi8KKwkJdW5zaWduZWQgbWM6MjsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQ6MTsKKwl9IGI7Cit9IGRlcHRzaXpfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgRGV2aWNlIEVQIDAgVHJhbnNmZXIKKyAqIFNpemUgUmVnaXN0ZXIuICBSZWFkIHRoZSByZWdpc3RlciBpbnRvIHRoZSA8aT5kMzI8L2k+IG1lbWJlciB0aGVuCisgKiBzZXQvY2xlYXIgdGhlIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQgZWxlbWVudHMuCisgKi8KK3R5cGVkZWYgdW5pb24gZGVwdHNpejBfZGF0YSB7CisJCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQkvKiogVHJhbnNmZXIgc2l6ZSAqLworCQl1bnNpZ25lZCB4ZmVyc2l6ZTo3OworCQkJCS8qKiBSZXNlcnZlZCAqLworCQl1bnNpZ25lZCByZXNlcnZlZDdfMTg6MTI7CisJCS8qKiBQYWNrZXQgQ291bnQgKi8KKwkJdW5zaWduZWQgcGt0Y250OjI7CisJCQkJLyoqIFJlc2VydmVkICovCisJCXVuc2lnbmVkIHJlc2VydmVkMjFfMjg6ODsKKwkJCQkvKipTZXR1cCBQYWNrZXQgQ291bnQgKERPRVBUU0laMCBPbmx5KSAqLworCQl1bnNpZ25lZCBzdXBjbnQ6MjsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQzMTsKKwl9IGI7Cit9IGRlcHRzaXowX2RhdGFfdDsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gRE1BIERlc2NyaXB0b3IgU3BlY2lmaWMgU3RydWN0dXJlcworLy8KKworLyoqIEJ1ZmZlciBzdGF0dXMgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBCU19IT1NUX1JFQURZCTB4MAorI2RlZmluZSBCU19ETUFfQlVTWQkJMHgxCisjZGVmaW5lIEJTX0RNQV9ET05FCQkweDIKKyNkZWZpbmUgQlNfSE9TVF9CVVNZCTB4MworCisvKiogUmVjZWl2ZS9UcmFuc21pdCBzdGF0dXMgZGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBSVFNfU1VDQ0VTUwkJMHgwCisjZGVmaW5lIFJUU19CVUZGTFVTSAkweDEKKyNkZWZpbmUgUlRTX1JFU0VSVkVECTB4MgorI2RlZmluZSBSVFNfQlVGRVJSCQkweDMKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIERNQSBEZXNjcmlwdG9yCisgKiBzdGF0dXMgcXVhZGxldC4gUmVhZCB0aGUgcXVhZGxldCBpbnRvIHRoZSA8aT5kMzI8L2k+IG1lbWJlciB0aGVuCisgKiBzZXQvY2xlYXIgdGhlIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQsIDxpPmJfaXNvX291dDwvaT4gYW5kCisgKiA8aT5iX2lzb19pbjwvaT4gZWxlbWVudHMuCisgKi8KK3R5cGVkZWYgdW5pb24gZGV2X2RtYV9kZXNjX3N0cyB7CisJCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkJLyoqIHF1YWRsZXQgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBSZWNlaXZlZCBudW1iZXIgb2YgYnl0ZXMgKi8KKwkJdW5zaWduZWQgYnl0ZXM6MTY7CisJCS8qKiBOQUsgYml0IC0gb25seSBmb3IgT1VUIEVQcyAqLworCQl1bnNpZ25lZCBuYWs6MTsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQxN18yMjo2OworCQkvKiogTXVsdGlwbGUgVHJhbnNmZXIgLSBvbmx5IGZvciBPVVQgRVBzICovCisJCXVuc2lnbmVkIG10cmY6MTsKKwkJLyoqIFNldHVwIFBhY2tldCByZWNlaXZlZCAtIG9ubHkgZm9yIE9VVCBFUHMgKi8KKwkJdW5zaWduZWQgc3I6MTsKKwkJLyoqIEludGVycnVwdCBPbiBDb21wbGV0ZSAqLworCQl1bnNpZ25lZCBpb2M6MTsKKwkJLyoqIFNob3J0IFBhY2tldCAqLworCQl1bnNpZ25lZCBzcDoxOworCQkvKiogTGFzdCAqLworCQl1bnNpZ25lZCBsOjE7CisJCS8qKiBSZWNlaXZlIFN0YXR1cyAqLworCQl1bnNpZ25lZCBzdHM6MjsKKwkJLyoqIEJ1ZmZlciBTdGF0dXMgKi8KKwkJdW5zaWduZWQgYnM6MjsKKwl9IGI7CisKKy8vI2lmZGVmIERXQ19FTl9JU09DCisJCS8qKiBpc28gb3V0IHF1YWRsZXQgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBSZWNlaXZlZCBudW1iZXIgb2YgYnl0ZXMgKi8KKwkJdW5zaWduZWQgcnhieXRlczoxMTsKKworCQl1bnNpZ25lZCByZXNlcnZlZDExOjE7CisJCS8qKiBGcmFtZSBOdW1iZXIgKi8KKwkJdW5zaWduZWQgZnJhbWVudW06MTE7CisJCS8qKiBSZWNlaXZlZCBJU08gRGF0YSBQSUQgKi8KKwkJdW5zaWduZWQgcGlkOjI7CisJCS8qKiBJbnRlcnJ1cHQgT24gQ29tcGxldGUgKi8KKwkJdW5zaWduZWQgaW9jOjE7CisJCS8qKiBTaG9ydCBQYWNrZXQgKi8KKwkJdW5zaWduZWQgc3A6MTsKKwkJLyoqIExhc3QgKi8KKwkJdW5zaWduZWQgbDoxOworCQkvKiogUmVjZWl2ZSBTdGF0dXMgKi8KKwkJdW5zaWduZWQgcnhzdHM6MjsKKwkJLyoqIEJ1ZmZlciBTdGF0dXMgKi8KKwkJdW5zaWduZWQgYnM6MjsKKwl9IGJfaXNvX291dDsKKworCQkvKiogaXNvIGluIHF1YWRsZXQgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBUcmFuc21pdGVkIG51bWJlciBvZiBieXRlcyAqLworCQl1bnNpZ25lZCB0eGJ5dGVzOjEyOworCQkvKiogRnJhbWUgTnVtYmVyICovCisJCXVuc2lnbmVkIGZyYW1lbnVtOjExOworCQkvKiogVHJhbnNtaXRlZCBJU08gRGF0YSBQSUQgKi8KKwkJdW5zaWduZWQgcGlkOjI7CisJCS8qKiBJbnRlcnJ1cHQgT24gQ29tcGxldGUgKi8KKwkJdW5zaWduZWQgaW9jOjE7CisJCS8qKiBTaG9ydCBQYWNrZXQgKi8KKwkJdW5zaWduZWQgc3A6MTsKKwkJLyoqIExhc3QgKi8KKwkJdW5zaWduZWQgbDoxOworCQkvKiogVHJhbnNtaXQgU3RhdHVzICovCisJCXVuc2lnbmVkIHR4c3RzOjI7CisJCS8qKiBCdWZmZXIgU3RhdHVzICovCisJCXVuc2lnbmVkIGJzOjI7CisJfSBiX2lzb19pbjsKKy8vI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEV0NfRU5fSVNPQyAqLworfSBkZXZfZG1hX2Rlc2Nfc3RzX3Q7CisKKy8qKgorICogRE1BIERlc2NyaXB0b3Igc3RydWN0dXJlCisgKgorICogRE1BIERlc2NyaXB0b3Igc3RydWN0dXJlIGNvbnRhaW5zIHR3byBxdWFkbGV0czoKKyAqIFN0YXR1cyBxdWFkbGV0IGFuZCBEYXRhIGJ1ZmZlciBwb2ludGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBkd2Nfb3RnX2Rldl9kbWFfZGVzYyB7CisJLyoqIERNQSBEZXNjcmlwdG9yIHN0YXR1cyBxdWFkbGV0ICovCisJZGV2X2RtYV9kZXNjX3N0c190IHN0YXR1czsKKwkvKiogRE1BIERlc2NyaXB0b3IgZGF0YSBidWZmZXIgcG9pbnRlciAqLworCXVpbnQzMl90IGJ1ZjsKK30gZHdjX290Z19kZXZfZG1hX2Rlc2NfdDsKKworLyoqCisgKiBUaGUgZHdjX290Z19kZXZfaWYgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG5lZWRlZCB0byBtYW5hZ2UKKyAqIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgYWN0aW5nIGluIGRldmljZSBtb2RlLiBJdCByZXByZXNlbnRzIHRoZQorICogcHJvZ3JhbW1pbmcgdmlldyBvZiB0aGUgZGV2aWNlLXNwZWNpZmljIGFzcGVjdHMgb2YgdGhlIGNvbnRyb2xsZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y19vdGdfZGV2X2lmIHsKKwkvKiogUG9pbnRlciB0byBkZXZpY2UgR2xvYmFsIHJlZ2lzdGVycy4KKwkgKiBEZXZpY2UgR2xvYmFsIFJlZ2lzdGVycyBzdGFydGluZyBhdCBvZmZzZXQgODAwaAorCSAqLworCWR3Y19vdGdfZGV2aWNlX2dsb2JhbF9yZWdzX3QgKmRldl9nbG9iYWxfcmVnczsKKyNkZWZpbmUgRFdDX0RFVl9HTE9CQUxfUkVHX09GRlNFVCAweDgwMAorCisJLyoqCisJICogRGV2aWNlIExvZ2ljYWwgSU4gRW5kcG9pbnQtU3BlY2lmaWMgUmVnaXN0ZXJzIDkwMGgtQUZDaAorCSAqLworCWR3Y19vdGdfZGV2X2luX2VwX3JlZ3NfdCAqaW5fZXBfcmVnc1tNQVhfRVBTX0NIQU5ORUxTXTsKKyNkZWZpbmUgRFdDX0RFVl9JTl9FUF9SRUdfT0ZGU0VUIDB4OTAwCisjZGVmaW5lIERXQ19FUF9SRUdfT0ZGU0VUIDB4MjAKKworCS8qKiBEZXZpY2UgTG9naWNhbCBPVVQgRW5kcG9pbnQtU3BlY2lmaWMgUmVnaXN0ZXJzIEIwMGgtQ0ZDaCAqLworCWR3Y19vdGdfZGV2X291dF9lcF9yZWdzX3QgKm91dF9lcF9yZWdzW01BWF9FUFNfQ0hBTk5FTFNdOworI2RlZmluZSBEV0NfREVWX09VVF9FUF9SRUdfT0ZGU0VUIDB4QjAwCisKKwkvKiBEZXZpY2UgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAqLworCXVpbnQ4X3Qgc3BlZWQ7CQkJCSAvKio8IERldmljZSBTcGVlZAkwOiBVbmtub3duLCAxOiBMUywgMjpGUywgMzogSFMgKi8KKwl1aW50OF90IG51bV9pbl9lcHM7CQkgLyoqPCBOdW1iZXIgIyBvZiBUeCBFUCByYW5nZTogMC0xNSBleGVwdCBlcDAgKi8KKwl1aW50OF90IG51bV9vdXRfZXBzOwkJIC8qKjwgTnVtYmVyICMgb2YgUnggRVAgcmFuZ2U6IDAtMTUgZXhlcHQgZXAgMCovCisKKwkvKiogU2l6ZSBvZiBwZXJpb2RpYyBGSUZPcyAoQnl0ZXMpICovCisJdWludDE2X3QgcGVyaW9fdHhfZmlmb19zaXplW01BWF9QRVJJT19GSUZPU107CisKKwkvKiogU2l6ZSBvZiBUeCBGSUZPcyAoQnl0ZXMpICovCisJdWludDE2X3QgdHhfZmlmb19zaXplW01BWF9UWF9GSUZPU107CisKKwkvKiogVGhyZXNob2xkaW5nIGVuYWJsZSBmbGFncyBhbmQgbGVuZ3RoIHZhcmFpYWJsZXMgKiovCisJdWludDE2X3QgcnhfdGhyX2VuOworCXVpbnQxNl90IGlzb190eF90aHJfZW47CisJdWludDE2X3Qgbm9uX2lzb190eF90aHJfZW47CisKKwl1aW50MTZfdCByeF90aHJfbGVuZ3RoOworCXVpbnQxNl90IHR4X3Rocl9sZW5ndGg7CisKKwkvKioKKwkgKiBQb2ludGVycyB0byB0aGUgRE1BIERlc2NyaXB0b3JzIGZvciBFUDAgQ29udHJvbAorCSAqIHRyYW5zZmVycyAodmlydHVhbCBhbmQgcGh5c2ljYWwpCisJICovCisKKwkvKiogMiBkZXNjcmlwdG9ycyBmb3IgU0VUVVAgcGFja2V0cyAqLworCWR3Y19kbWFfdCBkbWFfc2V0dXBfZGVzY19hZGRyWzJdOworCWR3Y19vdGdfZGV2X2RtYV9kZXNjX3QgKnNldHVwX2Rlc2NfYWRkclsyXTsKKworCS8qKiBQb2ludGVyIHRvIERlc2NyaXB0b3Igd2l0aCBsYXRlc3QgU0VUVVAgcGFja2V0ICovCisJZHdjX290Z19kZXZfZG1hX2Rlc2NfdCAqcHNldHVwOworCisJLyoqIEluZGV4IG9mIGN1cnJlbnQgU0VUVVAgaGFuZGxlciBkZXNjcmlwdG9yICovCisJdWludDMyX3Qgc2V0dXBfZGVzY19pbmRleDsKKworCS8qKiBEZXNjcmlwdG9yIGZvciBEYXRhIEluIG9yIFN0YXR1cyBJbiBwaGFzZXMgKi8KKwlkd2NfZG1hX3QgZG1hX2luX2Rlc2NfYWRkcjsKKwlkd2Nfb3RnX2Rldl9kbWFfZGVzY190ICppbl9kZXNjX2FkZHI7CisKKwkvKiogRGVzY3JpcHRvciBmb3IgRGF0YSBPdXQgb3IgU3RhdHVzIE91dCBwaGFzZXMgKi8KKwlkd2NfZG1hX3QgZG1hX291dF9kZXNjX2FkZHI7CisJZHdjX290Z19kZXZfZG1hX2Rlc2NfdCAqb3V0X2Rlc2NfYWRkcjsKKworCS8qKiBTZXR1cCBQYWNrZXQgRGV0ZWN0ZWQgLSBpZiBzZXQgY2xlYXIgTkFLIHdoZW4gcXVldWVpbmcgKi8KKwl1aW50MzJfdCBzcGQ7CisJLyoqIElzb2MgZXAgcG9pbnRlciBvbiB3aGljaCBpbmNvbXBsZXRlIGhhcHBlbnMgKi8KKwl2b2lkICppc29jX2VwOworCit9IGR3Y19vdGdfZGV2X2lmX3Q7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEhvc3QgTW9kZSBSZWdpc3RlciBTdHJ1Y3R1cmVzCisvLworLyoqCisgKiBUaGUgSG9zdCBHbG9iYWwgUmVnaXN0ZXJzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBzaXplIGFuZCByZWxhdGl2ZQorICogZmllbGQgb2Zmc2V0cyBmb3IgdGhlIEhvc3QgTW9kZSBHbG9iYWwgUmVnaXN0ZXJzLiAgSG9zdCBHbG9iYWwKKyAqIFJlZ2lzdGVycyBvZmZzZXRzIDQwMGgtN0ZGaC4KKyovCit0eXBlZGVmIHN0cnVjdCBkd2Nfb3RnX2hvc3RfZ2xvYmFsX3JlZ3MgeworCS8qKiBIb3N0IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIuICAgPGk+T2Zmc2V0OiA0MDBoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGhjZmc7CisJLyoqIEhvc3QgRnJhbWUgSW50ZXJ2YWwgUmVnaXN0ZXIuCTxpPk9mZnNldDogNDA0aDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBoZmlyOworCS8qKiBIb3N0IEZyYW1lIE51bWJlciAvIEZyYW1lIFJlbWFpbmluZyBSZWdpc3Rlci4gPGk+T2Zmc2V0OiA0MDhoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGhmbnVtOworCS8qKiBSZXNlcnZlZC4JPGk+T2Zmc2V0OiA0MENoPC9pPiAqLworCXVpbnQzMl90IHJlc2VydmVkNDBDOworCS8qKiBIb3N0IFBlcmlvZGljIFRyYW5zbWl0IEZJRk8vIFF1ZXVlIFN0YXR1cyBSZWdpc3Rlci4gPGk+T2Zmc2V0OiA0MTBoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGhwdHhzdHM7CisJLyoqIEhvc3QgQWxsIENoYW5uZWxzIEludGVycnVwdCBSZWdpc3Rlci4gPGk+T2Zmc2V0OiA0MTRoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGhhaW50OworCS8qKiBIb3N0IEFsbCBDaGFubmVscyBJbnRlcnJ1cHQgTWFzayBSZWdpc3Rlci4gPGk+T2Zmc2V0OiA0MThoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGhhaW50bXNrOworCS8qKiBIb3N0IEZyYW1lIExpc3QgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIC4gPGk+T2Zmc2V0OiA0MUNoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGhmbGJhZGRyOworfSBkd2Nfb3RnX2hvc3RfZ2xvYmFsX3JlZ3NfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIEhvc3QgQ29uZmlndXJhdGlvbiBSZWdpc3Rlci4KKyAqIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gbWVtYmVyIHRoZW4gc2V0L2NsZWFyIHRoZSBiaXRzIHVzaW5nCisgKiB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4gV3JpdGUgdGhlIDxpPmQzMjwvaT4gbWVtYmVyIHRvIHRoZSBoY2ZnIHJlZ2lzdGVyLgorICovCit0eXBlZGVmIHVuaW9uIGhjZmdfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQkvKiogRlMvTFMgUGh5IENsb2NrIFNlbGVjdCAqLworCQl1bnNpZ25lZCBmc2xzcGNsa3NlbDoyOworI2RlZmluZSBEV0NfSENGR18zMF82MF9NSFogMAorI2RlZmluZSBEV0NfSENGR180OF9NSFoJICAgMQorI2RlZmluZSBEV0NfSENGR182X01IWgkgICAyCisKKwkJLyoqIEZTL0xTIE9ubHkgU3VwcG9ydCAqLworCQl1bnNpZ25lZCBmc2xzc3VwcDoxOworCQl1bnNpZ25lZCByZXNlcnZlZDNfNjo0OworCQkvKiogRW5hYmxlIDMyLUtIeiBTdXNwZW5kIE1vZGUgKi8KKwkJdW5zaWduZWQgZW5hMzJraHpzOjE7CisJCS8qKiBSZXN1bWUgVmFsaWRhdGlvbiBQZXJpaW9kICovCisJCXVuc2lnbmVkIHJlc3ZhbGlkOjg7CisJCXVuc2lnbmVkIHJlc2VydmVkMTZfMjI6NzsKKwkJLyoqIEVuYWJsZSBTY2F0dGVyL2dhdGhlciBETUEgaW4gSG9zdCBtb2RlICovCisJCXVuc2lnbmVkIGRlc2NkbWE6MTsKKwkJLyoqIEZyYW1lIExpc3QgRW50cmllcyAqLworCQl1bnNpZ25lZCBmcmxpc3RlbjoyOworCQkvKiogRW5hYmxlIFBlcmlvZGljIFNjaGVkdWxpbmcgKi8KKwkJdW5zaWduZWQgcGVyc2NoZWRlbmE6MTsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQyN18zMDo0OworCQl1bnNpZ25lZCBtb2RlY2h0aW1lbjoxOworCX0gYjsKK30gaGNmZ19kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBIb3N0IEZyYW1lIFJlbWFpbmcvTnVtYmVyCisgKiBSZWdpc3Rlci4gCisgKi8KK3R5cGVkZWYgdW5pb24gaGZpcl9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGZyaW50OjE2OworCQl1bnNpZ25lZCBoZmlycmxkY3RybDoxOworCQl1bnNpZ25lZCByZXNlcnZlZDoxNTsKKwl9IGI7Cit9IGhmaXJfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgSG9zdCBGcmFtZSBSZW1haW5nL051bWJlcgorICogUmVnaXN0ZXIuIAorICovCit0eXBlZGVmIHVuaW9uIGhmbnVtX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgZnJudW06MTY7CisjZGVmaW5lIERXQ19IRk5VTV9NQVhfRlJOVU0gMHgzRkZGCisJCXVuc2lnbmVkIGZycmVtOjE2OworCX0gYjsKK30gaGZudW1fZGF0YV90OworCit0eXBlZGVmIHVuaW9uIGhwdHhzdHNfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBwdHhmc3BjYXZhaWw6MTY7CisJCXVuc2lnbmVkIHB0eHFzcGNhdmFpbDo4OworCQkvKiogVG9wIG9mIHRoZSBQZXJpb2RpYyBUcmFuc21pdCBSZXF1ZXN0IFF1ZXVlCisJCSAqCS0gYml0IDI0IC0gVGVybWluYXRlIChsYXN0IGVudHJ5IGZvciB0aGUgc2VsZWN0ZWQgY2hhbm5lbCkKKwkJICoJLSBiaXRzIDI2OjI1IC0gVG9rZW4gVHlwZQorCQkgKgkgIC0gMidiMDAgLSBaZXJvIGxlbmd0aAorCQkgKgkgIC0gMidiMDEgLSBQaW5nCisJCSAqCSAgLSAyJ2IxMCAtIERpc2FibGUKKwkJICoJLSBiaXRzIDMwOjI3IC0gQ2hhbm5lbCBOdW1iZXIKKwkJICoJLSBiaXQgMzEgLSBPZGQvZXZlbiBtaWNyb2ZyYW1lCisJCSAqLworCQl1bnNpZ25lZCBwdHhxdG9wX3Rlcm1pbmF0ZToxOworCQl1bnNpZ25lZCBwdHhxdG9wX3Rva2VuOjI7CisJCXVuc2lnbmVkIHB0eHF0b3BfY2hudW06NDsKKwkJdW5zaWduZWQgcHR4cXRvcF9vZGQ6MTsKKwl9IGI7Cit9IGhwdHhzdHNfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgSG9zdCBQb3J0IENvbnRyb2wgYW5kIFN0YXR1cworICogUmVnaXN0ZXIuIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gbWVtYmVyIHRoZW4gc2V0L2NsZWFyIHRoZQorICogYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4gV3JpdGUgdGhlIDxpPmQzMjwvaT4gbWVtYmVyIHRvIHRoZQorICogaHBydDAgcmVnaXN0ZXIuCisgKi8KK3R5cGVkZWYgdW5pb24gaHBydDBfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgcHJ0Y29ubnN0czoxOworCQl1bnNpZ25lZCBwcnRjb25uZGV0OjE7CisJCXVuc2lnbmVkIHBydGVuYToxOworCQl1bnNpZ25lZCBwcnRlbmNobmc6MTsKKwkJdW5zaWduZWQgcHJ0b3ZyY3VycmFjdDoxOworCQl1bnNpZ25lZCBwcnRvdnJjdXJyY2huZzoxOworCQl1bnNpZ25lZCBwcnRyZXM6MTsKKwkJdW5zaWduZWQgcHJ0c3VzcDoxOworCQl1bnNpZ25lZCBwcnRyc3Q6MTsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQ5OjE7CisJCXVuc2lnbmVkIHBydGxuc3RzOjI7CisJCXVuc2lnbmVkIHBydHB3cjoxOworCQl1bnNpZ25lZCBwcnR0c3RjdGw6NDsKKwkJdW5zaWduZWQgcHJ0c3BkOjI7CisjZGVmaW5lIERXQ19IUFJUMF9QUlRTUERfSElHSF9TUEVFRCAwCisjZGVmaW5lIERXQ19IUFJUMF9QUlRTUERfRlVMTF9TUEVFRCAxCisjZGVmaW5lIERXQ19IUFJUMF9QUlRTUERfTE9XX1NQRUVECTIKKwkJdW5zaWduZWQgcmVzZXJ2ZWQxOV8zMToxMzsKKwl9IGI7Cit9IGhwcnQwX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIEhvc3QgQWxsIEludGVycnVwdAorICogUmVnaXN0ZXIuIAorICovCit0eXBlZGVmIHVuaW9uIGhhaW50X2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoMDoxOworCQl1bnNpZ25lZCBjaDE6MTsKKwkJdW5zaWduZWQgY2gyOjE7CisJCXVuc2lnbmVkIGNoMzoxOworCQl1bnNpZ25lZCBjaDQ6MTsKKwkJdW5zaWduZWQgY2g1OjE7CisJCXVuc2lnbmVkIGNoNjoxOworCQl1bnNpZ25lZCBjaDc6MTsKKwkJdW5zaWduZWQgY2g4OjE7CisJCXVuc2lnbmVkIGNoOToxOworCQl1bnNpZ25lZCBjaDEwOjE7CisJCXVuc2lnbmVkIGNoMTE6MTsKKwkJdW5zaWduZWQgY2gxMjoxOworCQl1bnNpZ25lZCBjaDEzOjE7CisJCXVuc2lnbmVkIGNoMTQ6MTsKKwkJdW5zaWduZWQgY2gxNToxOworCQl1bnNpZ25lZCByZXNlcnZlZDoxNjsKKwl9IGI7CisKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGludDoxNjsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQ6MTY7CisJfSBiMjsKK30gaGFpbnRfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgSG9zdCBBbGwgSW50ZXJydXB0CisgKiBSZWdpc3Rlci4gCisgKi8KK3R5cGVkZWYgdW5pb24gaGFpbnRtc2tfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgY2gwOjE7CisJCXVuc2lnbmVkIGNoMToxOworCQl1bnNpZ25lZCBjaDI6MTsKKwkJdW5zaWduZWQgY2gzOjE7CisJCXVuc2lnbmVkIGNoNDoxOworCQl1bnNpZ25lZCBjaDU6MTsKKwkJdW5zaWduZWQgY2g2OjE7CisJCXVuc2lnbmVkIGNoNzoxOworCQl1bnNpZ25lZCBjaDg6MTsKKwkJdW5zaWduZWQgY2g5OjE7CisJCXVuc2lnbmVkIGNoMTA6MTsKKwkJdW5zaWduZWQgY2gxMToxOworCQl1bnNpZ25lZCBjaDEyOjE7CisJCXVuc2lnbmVkIGNoMTM6MTsKKwkJdW5zaWduZWQgY2gxNDoxOworCQl1bnNpZ25lZCBjaDE1OjE7CisJCXVuc2lnbmVkIHJlc2VydmVkOjE2OworCX0gYjsKKworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoaW50OjE2OworCQl1bnNpZ25lZCByZXNlcnZlZDoxNjsKKwl9IGIyOworfSBoYWludG1za19kYXRhX3Q7CisKKy8qKgorICogSG9zdCBDaGFubmVsIFNwZWNpZmljIFJlZ2lzdGVycy4gPGk+NTAwaC01RkNoPC9pPgorICovCit0eXBlZGVmIHN0cnVjdCBkd2Nfb3RnX2hjX3JlZ3MgeworCS8qKiBIb3N0IENoYW5uZWwgMCBDaGFyYWN0ZXJpc3RpYyBSZWdpc3Rlci4gPGk+T2Zmc2V0OiA1MDBoICsgKGNoYW5fbnVtICogMjBoKSArIDAwaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBoY2NoYXI7CisJLyoqIEhvc3QgQ2hhbm5lbCAwIFNwbGl0IENvbnRyb2wgUmVnaXN0ZXIuIDxpPk9mZnNldDogNTAwaCArIChjaGFuX251bSAqIDIwaCkgKyAwNGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgaGNzcGx0OworCS8qKiBIb3N0IENoYW5uZWwgMCBJbnRlcnJ1cHQgUmVnaXN0ZXIuIDxpPk9mZnNldDogNTAwaCArIChjaGFuX251bSAqIDIwaCkgKyAwOGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgaGNpbnQ7CisJLyoqIEhvc3QgQ2hhbm5lbCAwIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLiA8aT5PZmZzZXQ6IDUwMGggKyAoY2hhbl9udW0gKiAyMGgpICsgMENoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGhjaW50bXNrOworCS8qKiBIb3N0IENoYW5uZWwgMCBUcmFuc2ZlciBTaXplIFJlZ2lzdGVyLiA8aT5PZmZzZXQ6IDUwMGggKyAoY2hhbl9udW0gKiAyMGgpICsgMTBoPC9pPiAqLworCXZvbGF0aWxlIHVpbnQzMl90IGhjdHNpejsKKwkvKiogSG9zdCBDaGFubmVsIDAgRE1BIEFkZHJlc3MgUmVnaXN0ZXIuIDxpPk9mZnNldDogNTAwaCArIChjaGFuX251bSAqIDIwaCkgKyAxNGg8L2k+ICovCisJdm9sYXRpbGUgdWludDMyX3QgaGNkbWE7CisJdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWQ7CisJLyoqIEhvc3QgQ2hhbm5lbCAwIERNQSBCdWZmZXIgQWRkcmVzcyBSZWdpc3Rlci4gPGk+T2Zmc2V0OiA1MDBoICsgKGNoYW5fbnVtICogMjBoKSArIDFDaDwvaT4gKi8KKwl2b2xhdGlsZSB1aW50MzJfdCBoY2RtYWI7Cit9IGR3Y19vdGdfaGNfcmVnc190OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgSG9zdCBDaGFubmVsIENoYXJhY3RlcmlzdGljcworICogUmVnaXN0ZXIuIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gbWVtYmVyIHRoZW4gc2V0L2NsZWFyIHRoZQorICogYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4gV3JpdGUgdGhlIDxpPmQzMjwvaT4gbWVtYmVyIHRvIHRoZQorICogaGNjaGFyIHJlZ2lzdGVyLgorICovCit0eXBlZGVmIHVuaW9uIGhjY2hhcl9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBNYXhpbXVtIHBhY2tldCBzaXplIGluIGJ5dGVzICovCisJCXVuc2lnbmVkIG1wczoxMTsKKworCQkvKiogRW5kcG9pbnQgbnVtYmVyICovCisJCXVuc2lnbmVkIGVwbnVtOjQ7CisKKwkJLyoqIDA6IE9VVCwgMTogSU4gKi8KKwkJdW5zaWduZWQgZXBkaXI6MTsKKworCQl1bnNpZ25lZCByZXNlcnZlZDoxOworCisJCS8qKiAwOiBGdWxsL2hpZ2ggc3BlZWQgZGV2aWNlLCAxOiBMb3cgc3BlZWQgZGV2aWNlICovCisJCXVuc2lnbmVkIGxzcGRkZXY6MTsKKworCQkvKiogMDogQ29udHJvbCwgMTogSXNvYywgMjogQnVsaywgMzogSW50ciAqLworCQl1bnNpZ25lZCBlcHR5cGU6MjsKKworCQkvKiogUGFja2V0cyBwZXIgZnJhbWUgZm9yIHBlcmlvZGljIHRyYW5zZmVycy4gMCBpcyByZXNlcnZlZC4gKi8KKwkJdW5zaWduZWQgbXVsdGljbnQ6MjsKKworCQkvKiogRGV2aWNlIGFkZHJlc3MgKi8KKwkJdW5zaWduZWQgZGV2YWRkcjo3OworCisJCS8qKgorCQkgKiBGcmFtZSB0byB0cmFuc21pdCBwZXJpb2RpYyB0cmFuc2FjdGlvbi4KKwkJICogMDogZXZlbiwgMTogb2RkCisJCSAqLworCQl1bnNpZ25lZCBvZGRmcm06MTsKKworCQkvKiogQ2hhbm5lbCBkaXNhYmxlICovCisJCXVuc2lnbmVkIGNoZGlzOjE7CisKKwkJLyoqIENoYW5uZWwgZW5hYmxlICovCisJCXVuc2lnbmVkIGNoZW46MTsKKwl9IGI7Cit9IGhjY2hhcl9kYXRhX3Q7CisKK3R5cGVkZWYgdW5pb24gaGNzcGx0X2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJLyoqIFBvcnQgQWRkcmVzcyAqLworCQl1bnNpZ25lZCBwcnRhZGRyOjc7CisKKwkJLyoqIEh1YiBBZGRyZXNzICovCisJCXVuc2lnbmVkIGh1YmFkZHI6NzsKKworCQkvKiogVHJhbnNhY3Rpb24gUG9zaXRpb24gKi8KKwkJdW5zaWduZWQgeGFjdHBvczoyOworI2RlZmluZSBEV0NfSENTUExJVF9YQUNUUE9TX01JRCAwCisjZGVmaW5lIERXQ19IQ1NQTElUX1hBQ1RQT1NfRU5EIDEKKyNkZWZpbmUgRFdDX0hDU1BMSVRfWEFDVFBPU19CRUdJTiAyCisjZGVmaW5lIERXQ19IQ1NQTElUX1hBQ1RQT1NfQUxMIDMKKworCQkvKiogRG8gQ29tcGxldGUgU3BsaXQgKi8KKwkJdW5zaWduZWQgY29tcHNwbHQ6MTsKKworCQkvKiogUmVzZXJ2ZWQgKi8KKwkJdW5zaWduZWQgcmVzZXJ2ZWQ6MTQ7CisKKwkJLyoqIFNwbGl0IEVuYmxlICovCisJCXVuc2lnbmVkIHNwbHRlbmE6MTsKKwl9IGI7Cit9IGhjc3BsdF9kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBIb3N0IEFsbCBJbnRlcnJ1cHQKKyAqIFJlZ2lzdGVyLiAKKyAqLwordHlwZWRlZiB1bmlvbiBoY2ludF9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQkvKiogVHJhbnNmZXIgQ29tcGxldGUgKi8KKwkJdW5zaWduZWQgeGZlcmNvbXA6MTsKKwkJLyoqIENoYW5uZWwgSGFsdGVkICovCisJCXVuc2lnbmVkIGNoaGx0ZDoxOworCQkvKiogQUhCIEVycm9yICovCisJCXVuc2lnbmVkIGFoYmVycjoxOworCQkvKiogU1RBTEwgUmVzcG9uc2UgUmVjZWl2ZWQgKi8KKwkJdW5zaWduZWQgc3RhbGw6MTsKKwkJLyoqIE5BSyBSZXNwb25zZSBSZWNlaXZlZCAqLworCQl1bnNpZ25lZCBuYWs6MTsKKwkJLyoqIEFDSyBSZXNwb25zZSBSZWNlaXZlZCAqLworCQl1bnNpZ25lZCBhY2s6MTsKKwkJLyoqIE5ZRVQgUmVzcG9uc2UgUmVjZWl2ZWQgKi8KKwkJdW5zaWduZWQgbnlldDoxOworCQkvKiogVHJhbnNhY3Rpb24gRXJyICovCisJCXVuc2lnbmVkIHhhY3RlcnI6MTsKKwkJLyoqIEJhYmJsZSBFcnJvciAqLworCQl1bnNpZ25lZCBiYmxlcnI6MTsKKwkJLyoqIEZyYW1lIE92ZXJydW4gKi8KKwkJdW5zaWduZWQgZnJtb3ZydW46MTsKKwkJLyoqIERhdGEgVG9nZ2xlIEVycm9yICovCisJCXVuc2lnbmVkIGRhdGF0Z2xlcnI6MTsKKwkJLyoqIEJ1ZmZlciBOb3QgQXZhaWxhYmxlIChvbmx5IGZvciBERE1BIG1vZGUpICovCisJCXVuc2lnbmVkIGJuYToxOworCQkvKiogRXhlc3NpdmUgdHJhbnNhY3Rpb24gZXJyb3IgKG9ubHkgZm9yIERETUEgbW9kZSkgKi8KKwkJdW5zaWduZWQgeGNzX3hhY3Q6MTsKKwkJLyoqIEZyYW1lIExpc3QgUm9sbG92ZXIgaW50ZXJydXB0ICovCisJCXVuc2lnbmVkIGZybV9saXN0X3JvbGw6MTsKKwkJLyoqIFJlc2VydmVkICovCisJCXVuc2lnbmVkIHJlc2VydmVkMTRfMzE6MTg7CisJfSBiOworfSBoY2ludF9kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBIb3N0IENoYW5uZWwgSW50ZXJydXB0IE1hc2sKKyAqIFJlZ2lzdGVyLiBSZWFkIHRoZSByZWdpc3RlciBpbnRvIHRoZSA8aT5kMzI8L2k+IG1lbWJlciB0aGVuIHNldC9jbGVhciB0aGUKKyAqIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQgZWxlbWVudHMuIFdyaXRlIHRoZSA8aT5kMzI8L2k+IG1lbWJlciB0byB0aGUKKyAqIGhjaW50bXNrIHJlZ2lzdGVyLgorICovCit0eXBlZGVmIHVuaW9uIGhjaW50bXNrX2RhdGEgeworCS8qKiByYXcgcmVnaXN0ZXIgZGF0YSAqLworCXVpbnQzMl90IGQzMjsKKworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgeGZlcmNvbXBsOjE7CisJCXVuc2lnbmVkIGNoaGx0ZDoxOworCQl1bnNpZ25lZCBhaGJlcnI6MTsKKwkJdW5zaWduZWQgc3RhbGw6MTsKKwkJdW5zaWduZWQgbmFrOjE7CisJCXVuc2lnbmVkIGFjazoxOworCQl1bnNpZ25lZCBueWV0OjE7CisJCXVuc2lnbmVkIHhhY3RlcnI6MTsKKwkJdW5zaWduZWQgYmJsZXJyOjE7CisJCXVuc2lnbmVkIGZybW92cnVuOjE7CisJCXVuc2lnbmVkIGRhdGF0Z2xlcnI6MTsKKwkJdW5zaWduZWQgYm5hOjE7CisJCXVuc2lnbmVkIHhjc194YWN0OjE7CisJCXVuc2lnbmVkIGZybV9saXN0X3JvbGw6MTsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQxNF8zMToxODsKKwl9IGI7Cit9IGhjaW50bXNrX2RhdGFfdDsKKworLyoqCisgKiBUaGlzIHVuaW9uIHJlcHJlc2VudHMgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIEhvc3QgQ2hhbm5lbCBUcmFuc2ZlciBTaXplCisgKiBSZWdpc3Rlci4gUmVhZCB0aGUgcmVnaXN0ZXIgaW50byB0aGUgPGk+ZDMyPC9pPiBtZW1iZXIgdGhlbiBzZXQvY2xlYXIgdGhlCisgKiBiaXRzIHVzaW5nIHRoZSA8aT5iPC9pPml0IGVsZW1lbnRzLiBXcml0ZSB0aGUgPGk+ZDMyPC9pPiBtZW1iZXIgdG8gdGhlCisgKiBoY2NoYXIgcmVnaXN0ZXIuCisgKi8KKwordHlwZWRlZiB1bmlvbiBoY3RzaXpfZGF0YSB7CisJLyoqIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQkvKiogVG90YWwgdHJhbnNmZXIgc2l6ZSBpbiBieXRlcyAqLworCQl1bnNpZ25lZCB4ZmVyc2l6ZToxOTsKKworCQkvKiogRGF0YSBwYWNrZXRzIHRvIHRyYW5zZmVyICovCisJCXVuc2lnbmVkIHBrdGNudDoxMDsKKworCQkvKioKKwkJICogUGFja2V0IElEIGZvciBuZXh0IGRhdGEgcGFja2V0CisJCSAqIDA6IERBVEEwCisJCSAqIDE6IERBVEEyCisJCSAqIDI6IERBVEExCisJCSAqIDM6IE1EQVRBIChub24tQ29udHJvbCksIFNFVFVQIChDb250cm9sKQorCQkgKi8KKwkJdW5zaWduZWQgcGlkOjI7CisjZGVmaW5lIERXQ19IQ1RTSVpfREFUQTAgMAorI2RlZmluZSBEV0NfSENUU0laX0RBVEExIDIKKyNkZWZpbmUgRFdDX0hDVFNJWl9EQVRBMiAxCisjZGVmaW5lIERXQ19IQ1RTSVpfTURBVEEgMworI2RlZmluZSBEV0NfSENUU0laX1NFVFVQIDMKKworCQkvKiogRG8gUElORyBwcm90b2NvbCB3aGVuIDEgKi8KKwkJdW5zaWduZWQgZG9wbmc6MTsKKwl9IGI7CisKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBTY2hlZHVsaW5nIGluZm9ybWF0aW9uICovCisJCXVuc2lnbmVkIHNjaGluZm86ODsKKworCQkvKiogTnVtYmVyIG9mIHRyYW5zZmVyIGRlc2NyaXB0b3JzLgorCQkgKiBNYXggdmFsdWU6CisJCSAqIDY0IGluIGdlbmVyYWwsCisJCSAqIDI1NiBvbmx5IGZvciBIUyBpc29jaHJvbm91cyBlbmRwb2ludC4KKwkJICovCisJCXVuc2lnbmVkIG50ZDo4OworCisJCS8qKiBEYXRhIHBhY2tldHMgdG8gdHJhbnNmZXIgKi8KKwkJdW5zaWduZWQgcmVzZXJ2ZWQxNl8yODoxMzsKKworCQkvKioKKwkJICogUGFja2V0IElEIGZvciBuZXh0IGRhdGEgcGFja2V0CisJCSAqIDA6IERBVEEwCisJCSAqIDE6IERBVEEyCisJCSAqIDI6IERBVEExCisJCSAqIDM6IE1EQVRBIChub24tQ29udHJvbCkKKwkJICovCisJCXVuc2lnbmVkIHBpZDoyOworCisJCS8qKiBEbyBQSU5HIHByb3RvY29sIHdoZW4gMSAqLworCQl1bnNpZ25lZCBkb3BuZzoxOworCX0gYl9kZG1hOworfSBoY3RzaXpfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgSG9zdCBETUEgQWRkcmVzcyAKKyAqIFJlZ2lzdGVyIHVzZWQgaW4gRGVzY3JpcHRvciBETUEgbW9kZS4KKyAqLwordHlwZWRlZiB1bmlvbiBoY2RtYV9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHJlZ2lzdGVyIGJpdHMgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCByZXNlcnZlZDBfMjozOworCQkvKiogQ3VycmVudCBUcmFuc2ZlciBEZXNjcmlwdG9yLiBOb3QgdXNlZCBmb3IgSVNPQyAqLworCQl1bnNpZ25lZCBjdGQ6ODsKKwkJLyoqIFN0YXJ0IEFkZHJlc3Mgb2YgRGVzY3JpcHRvciBMaXN0ICovCisJCXVuc2lnbmVkIGRtYV9hZGRyOjIxOworCX0gYjsKK30gaGNkbWFfZGF0YV90OworCisvKioKKyAqIFRoaXMgdW5pb24gcmVwcmVzZW50cyB0aGUgYml0IGZpZWxkcyBpbiB0aGUgRE1BIERlc2NyaXB0b3IKKyAqIHN0YXR1cyBxdWFkbGV0IGZvciBob3N0IG1vZGUuIFJlYWQgdGhlIHF1YWRsZXQgaW50byB0aGUgPGk+ZDMyPC9pPiBtZW1iZXIgdGhlbgorICogc2V0L2NsZWFyIHRoZSBiaXRzIHVzaW5nIHRoZSA8aT5iPC9pPml0IGVsZW1lbnRzLgorICovCit0eXBlZGVmIHVuaW9uIGhvc3RfZG1hX2Rlc2Nfc3RzIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisJLyoqIHF1YWRsZXQgYml0cyAqLworCisJLyogZm9yIG5vbi1pc29jaHJvbm91cyAgKi8KKwlzdHJ1Y3QgeworCQkvKiogTnVtYmVyIG9mIGJ5dGVzICovCisJCXVuc2lnbmVkIG5fYnl0ZXM6MTc7CisJCS8qKiBRVEQgb2Zmc2V0IHRvIGp1bXAgd2hlbiBTaG9ydCBQYWNrZXQgcmVjZWl2ZWQgLSBvbmx5IGZvciBJTiBFUHMgKi8KKwkJdW5zaWduZWQgcXRkX29mZnNldDo2OworCQkvKioKKwkJICogU2V0IHRvIHJlcXVlc3QgdGhlIGNvcmUgdG8ganVtcCB0byBhbHRlcm5hdGUgUVREIGlmCisJCSAqIFNob3J0IFBhY2tldCByZWNlaXZlZCAtIG9ubHkgZm9yIElOIEVQcworCQkgKi8KKwkJdW5zaWduZWQgYV9xdGQ6MTsKKwkJIC8qKgorCQkgICogU2V0dXAgUGFja2V0IGJpdC4gV2hlbiBzZXQgaW5kaWNhdGVzIHRoYXQgYnVmZmVyIGNvbnRhaW5zCisJCSAgKiBzZXR1cCBwYWNrZXQuCisJCSAgKi8KKwkJdW5zaWduZWQgc3VwOjE7CisJCS8qKiBJbnRlcnJ1cHQgT24gQ29tcGxldGUgKi8KKwkJdW5zaWduZWQgaW9jOjE7CisJCS8qKiBFbmQgb2YgTGlzdCAqLworCQl1bnNpZ25lZCBlb2w6MTsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQyNzoxOworCQkvKiogUngvVHggU3RhdHVzICovCisJCXVuc2lnbmVkIHN0czoyOworI2RlZmluZSBETUFfREVTQ19TVFNfUEtURVJSCTEKKwkJdW5zaWduZWQgcmVzZXJ2ZWQzMDoxOworCQkvKiogQWN0aXZlIEJpdCAqLworCQl1bnNpZ25lZCBhOjE7CisJfSBiOworCS8qIGZvciBpc29jaHJvbm91cyAqLworCXN0cnVjdCB7CisJCS8qKiBOdW1iZXIgb2YgYnl0ZXMgKi8KKwkJdW5zaWduZWQgbl9ieXRlczoxMjsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQxMl8yNDoxMzsKKwkJLyoqIEludGVycnVwdCBPbiBDb21wbGV0ZSAqLworCQl1bnNpZ25lZCBpb2M6MTsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQyNl8yNzoyOworCQkvKiogUngvVHggU3RhdHVzICovCisJCXVuc2lnbmVkIHN0czoyOworCQl1bnNpZ25lZCByZXNlcnZlZDMwOjE7CisJCS8qKiBBY3RpdmUgQml0ICovCisJCXVuc2lnbmVkIGE6MTsKKwl9IGJfaXNvYzsKK30gaG9zdF9kbWFfZGVzY19zdHNfdDsKKworI2RlZmluZQlNQVhfRE1BX0RFU0NfU0laRQkJMTMxMDcxCisjZGVmaW5lIE1BWF9ETUFfREVTQ19OVU1fR0VORVJJQwk2NAorI2RlZmluZSBNQVhfRE1BX0RFU0NfTlVNX0hTX0lTT0MJMjU2CisjZGVmaW5lIE1BWF9GUkxJU1RfRU5fTlVNCQk2NAorLyoqCisgKiBIb3N0LW1vZGUgRE1BIERlc2NyaXB0b3Igc3RydWN0dXJlCisgKgorICogRE1BIERlc2NyaXB0b3Igc3RydWN0dXJlIGNvbnRhaW5zIHR3byBxdWFkbGV0czoKKyAqIFN0YXR1cyBxdWFkbGV0IGFuZCBEYXRhIGJ1ZmZlciBwb2ludGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBkd2Nfb3RnX2hvc3RfZG1hX2Rlc2MgeworCS8qKiBETUEgRGVzY3JpcHRvciBzdGF0dXMgcXVhZGxldCAqLworCWhvc3RfZG1hX2Rlc2Nfc3RzX3Qgc3RhdHVzOworCS8qKiBETUEgRGVzY3JpcHRvciBkYXRhIGJ1ZmZlciBwb2ludGVyICovCisJdWludDMyX3QgYnVmOworfSBkd2Nfb3RnX2hvc3RfZG1hX2Rlc2NfdDsKKworLyoqIE9URyBIb3N0IEludGVyZmFjZSBTdHJ1Y3R1cmUuCisgKgorICogVGhlIE9URyBIb3N0IEludGVyZmFjZSBTdHJ1Y3R1cmUgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uCisgKiBuZWVkZWQgdG8gbWFuYWdlIHRoZSBEV0Nfb3RnIGNvbnRyb2xsZXIgYWN0aW5nIGluIGhvc3QgbW9kZS4gSXQKKyAqIHJlcHJlc2VudHMgdGhlIHByb2dyYW1taW5nIHZpZXcgb2YgdGhlIGhvc3Qtc3BlY2lmaWMgYXNwZWN0cyBvZiB0aGUKKyAqIGNvbnRyb2xsZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IGR3Y19vdGdfaG9zdF9pZiB7CisJLyoqIEhvc3QgR2xvYmFsIFJlZ2lzdGVycyBzdGFydGluZyBhdCBvZmZzZXQgNDAwaC4qLworCWR3Y19vdGdfaG9zdF9nbG9iYWxfcmVnc190ICpob3N0X2dsb2JhbF9yZWdzOworI2RlZmluZSBEV0NfT1RHX0hPU1RfR0xPQkFMX1JFR19PRkZTRVQgMHg0MDAKKworCS8qKiBIb3N0IFBvcnQgMCBDb250cm9sIGFuZCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl2b2xhdGlsZSB1aW50MzJfdCAqaHBydDA7CisjZGVmaW5lIERXQ19PVEdfSE9TVF9QT1JUX1JFR1NfT0ZGU0VUIDB4NDQwCisKKwkvKiogSG9zdCBDaGFubmVsIFNwZWNpZmljIFJlZ2lzdGVycyBhdCBvZmZzZXRzIDUwMGgtNUZDaC4gKi8KKwlkd2Nfb3RnX2hjX3JlZ3NfdCAqaGNfcmVnc1tNQVhfRVBTX0NIQU5ORUxTXTsKKyNkZWZpbmUgRFdDX09UR19IT1NUX0NIQU5fUkVHU19PRkZTRVQgMHg1MDAKKyNkZWZpbmUgRFdDX09UR19DSEFOX1JFR1NfT0ZGU0VUIDB4MjAKKworCS8qIEhvc3QgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiAqLworCS8qKiBOdW1iZXIgb2YgSG9zdCBDaGFubmVscyAocmFuZ2U6IDEtMTYpICovCisJdWludDhfdCBudW1faG9zdF9jaGFubmVsczsKKwkvKiogUGVyaW9kaWMgRVBzIHN1cHBvcnRlZCAoMDogbm8sIDE6IHllcykgKi8KKwl1aW50OF90IHBlcmlvX2Vwc19zdXBwb3J0ZWQ7CisJLyoqIFBlcmlvZGljIFR4IEZJRk8gU2l6ZSAoT25seSAxIGhvc3QgcGVyaW9kaWMgVHggRklGTykgKi8KKwl1aW50MTZfdCBwZXJpb190eF9maWZvX3NpemU7CisKK30gZHdjX290Z19ob3N0X2lmX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBQb3dlciBhbmQgQ2xvY2sgR2F0aW5nIENvbnRyb2wKKyAqIFJlZ2lzdGVyLiBSZWFkIHRoZSByZWdpc3RlciBpbnRvIHRoZSA8aT5kMzI8L2k+IG1lbWJlciB0aGVuIHNldC9jbGVhciB0aGUKKyAqIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQgZWxlbWVudHMuCisgKi8KK3R5cGVkZWYgdW5pb24gcGNnY2N0bF9kYXRhIHsKKwkvKiogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBTdG9wIFBjbGsgKi8KKwkJdW5zaWduZWQgc3RvcHBjbGs6MTsKKwkJLyoqIEdhdGUgSGNsayAqLworCQl1bnNpZ25lZCBnYXRlaGNsazoxOworCQkvKiogUG93ZXIgQ2xhbXAgKi8KKwkJdW5zaWduZWQgcHdyY2xtcDoxOworCQkvKiogUmVzZXQgUG93ZXIgRG93biBNb2R1bGVzICovCisJCXVuc2lnbmVkIHJzdHBkd25tb2R1bGU6MTsKKwkJLyoqIFJlc2VydmVkICovCisJCXVuc2lnbmVkIHJlc2VydmVkOjE7CisJCS8qKiBFbmFibGUgU2xlZXAgQ2xvY2sgR2F0aW5nIChFbmJsX0wxR2F0aW5nKSAqLworCQl1bnNpZ25lZCBlbmJsX3NsZWVwX2dhdGluZzoxOworCQkvKiogUEhZIEluIFNsZWVwIChQaHlTbGVlcCkgKi8KKwkJdW5zaWduZWQgcGh5X2luX3NsZWVwOjE7CisJCS8qKiBEZWVwIFNsZWVwKi8KKwkJdW5zaWduZWQgZGVlcF9zbGVlcDoxOworCQl1bnNpZ25lZCByZXNldGFmdHN1c3A6MTsKKwkJdW5zaWduZWQgcmVzdG9yZW1vZGU6MTsKKwkJdW5zaWduZWQgcmVzZXJ2ZWQxMF8xMjozOworCQl1bnNpZ25lZCBlc3NfcmVnX3Jlc3RvcmVkOjE7CisJCXVuc2lnbmVkIHBydF9jbGtfc2VsOjI7CisJCXVuc2lnbmVkIHBvcnRfcG93ZXI6MTsKKwkJdW5zaWduZWQgbWF4X3hjdnJzZWxlY3Q6MjsKKwkJdW5zaWduZWQgbWF4X3Rlcm1zZWw6MTsKKwkJdW5zaWduZWQgbWFjX2Rldl9hZGRyOjc7CisJCXVuc2lnbmVkIHAyaGRfZGV2X2VudW1fc3BkOjI7CisJCXVuc2lnbmVkIHAyaGRfcHJ0X3NwZDoyOworCQl1bnNpZ25lZCBpZl9kZXZfbW9kZToxOworCX0gYjsKK30gcGNnY2N0bF9kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBHbG9iYWwgRGF0YSBGSUZPIFNvZnR3YXJlCisgKiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyLiBSZWFkIHRoZSByZWdpc3RlciBpbnRvIHRoZSA8aT5kMzI8L2k+IG1lbWJlciB0aGVuCisgKiBzZXQvY2xlYXIgdGhlIGJpdHMgdXNpbmcgdGhlIDxpPmI8L2k+aXQgZWxlbWVudHMuCisgKi8KK3R5cGVkZWYgdW5pb24gZ2RmaWZvY2ZnX2RhdGEgeworCS8qIHJhdyByZWdpc3RlciBkYXRhICovCisJdWludDMyX3QgZDMyOworCS8qKiByZWdpc3RlciBiaXRzICovCisJc3RydWN0IHsKKwkJLyoqIE9URyBEYXRhIEZJRk8gZGVwdGggKi8KKwkJdW5zaWduZWQgZ2RmaWZvY2ZnOjE2OworCQkvKiogU3RhcnQgYWRkcmVzcyBvZiBFUCBpbmZvIGNvbnRyb2xsZXIgKi8KKwkJdW5zaWduZWQgZXBpbmZvYmFzZToxNjsKKwl9IGI7Cit9IGdkZmlmb2NmZ19kYXRhX3Q7CisKKy8qKgorICogVGhpcyB1bmlvbiByZXByZXNlbnRzIHRoZSBiaXQgZmllbGRzIGluIHRoZSBHbG9iYWwgUG93ZXIgRG93biBSZWdpc3RlcgorICogUmVnaXN0ZXIuIFJlYWQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIDxpPmQzMjwvaT4gbWVtYmVyIHRoZW4gc2V0L2NsZWFyIHRoZQorICogYml0cyB1c2luZyB0aGUgPGk+YjwvaT5pdCBlbGVtZW50cy4KKyAqLwordHlwZWRlZiB1bmlvbiBncHdyZG5fZGF0YSB7CisJLyogcmF3IHJlZ2lzdGVyIGRhdGEgKi8KKwl1aW50MzJfdCBkMzI7CisKKwkvKiogcmVnaXN0ZXIgYml0cyAqLworCXN0cnVjdCB7CisJCS8qKiBQTVUgSW50ZXJydXB0IFNlbGVjdCAqLworCQl1bnNpZ25lZCBwbXVpbnRzZWw6MTsKKwkJLyoqIFBNVSBBY3RpdmUgKi8KKwkJdW5zaWduZWQgcG11YWN0djoxOworCQkvKiogUmVzdG9yZSAqLworCQl1bnNpZ25lZCByZXN0b3JlOjE7CisJCS8qKiBQb3dlciBEb3duIENsYW1wICovCisJCXVuc2lnbmVkIHB3cmRuY2xtcDoxOworCQkvKiogUG93ZXIgRG93biBSZXNldCAqLworCQl1bnNpZ25lZCBwd3JkbnJzdG46MTsKKwkJLyoqIFBvd2VyIERvd24gU3dpdGNoICovCisJCXVuc2lnbmVkIHB3cmRuc3d0Y2g6MTsKKwkJLyoqIERpc2FibGUgVkJVUyAqLworCQl1bnNpZ25lZCBkaXNfdmJ1czoxOworCQkvKiogTGluZSBTdGF0ZSBDaGFuZ2UgKi8KKwkJdW5zaWduZWQgbG5zdHNjaG5nOjE7CisJCS8qKiBMaW5lIHN0YXRlIGNoYW5nZSBtYXNrICovCisJCXVuc2lnbmVkIGxuc3RjaG5nX21zazoxOworCQkvKiogUmVzZXQgRGV0ZWN0ZWQgKi8KKwkJdW5zaWduZWQgcnN0X2RldDoxOworCQkvKiogUmVzZXQgRGV0ZWN0IG1hc2sgKi8KKwkJdW5zaWduZWQgcnN0X2RldF9tc2s6MTsKKwkJLyoqIERpc2Nvbm5lY3QgRGV0ZWN0ZWQgKi8KKwkJdW5zaWduZWQgZGlzY29ubl9kZXQ6MTsKKwkJLyoqIERpc2Nvbm5lY3QgRGV0ZWN0IG1hc2sgKi8KKwkJdW5zaWduZWQgZGlzY29ubl9kZXRfbXNrOjE7CisJCS8qKiBDb25uZWN0IERldGVjdGVkKi8KKwkJdW5zaWduZWQgY29ubmVjdF9kZXQ6MTsKKwkJLyoqIENvbm5lY3QgRGV0ZWN0ZWQgTWFzayovCisJCXVuc2lnbmVkIGNvbm5lY3RfZGV0X21zazoxOworCQkvKiogU1JQIERldGVjdGVkICovCisJCXVuc2lnbmVkIHNycF9kZXQ6MTsKKwkJLyoqIFNSUCBEZXRlY3QgbWFzayAqLworCQl1bnNpZ25lZCBzcnBfZGV0X21zazoxOworCQkvKiogU3RhdHVzIENoYW5nZSBJbnRlcnJ1cHQgKi8KKwkJdW5zaWduZWQgc3RzX2NobmdpbnQ6MTsKKwkJLyoqIFN0YXR1cyBDaGFuZ2UgSW50ZXJydXB0IE1hc2sgKi8KKwkJdW5zaWduZWQgc3RzX2NobmdpbnRfbXNrOjE7CisJCS8qKiBMaW5lIFN0YXRlICovCisJCXVuc2lnbmVkIGxpbmVzdGF0ZToyOworCQkvKiogSW5kaWNhdGVzIGN1cnJlbnQgbW9kZShzdGF0dXMgb2YgSURESUcgc2lnbmFsKSAqLworCQl1bnNpZ25lZCBpZHN0czoxOworCQkvKiogQiBTZXNzaW9uIFZhbGlkIHNpZ25hbCBzdGF0dXMqLworCQl1bnNpZ25lZCBic2Vzc3ZsZDoxOworCQkvKiogQURQIEV2ZW50IERldGVjdGVkICovCisJCXVuc2lnbmVkIGFkcF9pbnQ6MTsKKwkJLyoqIE11bHRpIFZhbHVlZCBJRCBwaW4gKi8KKwkJdW5zaWduZWQgbXVsdF92YWxfaWRfYmM6NTsKKwkJLyoqIFJlc2VydmVkIDI0XzMxICovCisJCXVuc2lnbmVkIHJlc2VydmVkMjlfMzE6MzsKKwl9IGI7Cit9IGdwd3Jkbl9kYXRhX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy9saW51eC9kd2Nfb3RnX3BsYXQuaCBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvbGludXgvZHdjX290Z19wbGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZlMTg0NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvbGludXgvZHdjX290Z19wbGF0LmgKQEAgLTAsMCArMSwyNjggQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAkRmlsZTogLy9kd2gvdXNiX2lpcC9kZXYvc29mdHdhcmUvb3RnL2xpbnV4L3BsYXRmb3JtL2R3Y19vdGdfcGxhdC5oICQKKyAqICRSZXZpc2lvbjogMS4yICQKKyAqICREYXRlOiAyMDA4LTExLTIxIDA1OjM5OjE2ICQKKyAqICRDaGFuZ2U6IDEwNjQ5MTUgJAorICoKKyAqIFN5bm9wc3lzIEhTIE9URyBMaW51eCBTb2Z0d2FyZSBEcml2ZXIgYW5kIGRvY3VtZW50YXRpb24gKGhlcmVpbmFmdGVyLAorICogIlNvZnR3YXJlIikgaXMgYW4gVW5zdXBwb3J0ZWQgcHJvcHJpZXRhcnkgd29yayBvZiBTeW5vcHN5cywgSW5jLiB1bmxlc3MKKyAqIG90aGVyd2lzZSBleHByZXNzbHkgYWdyZWVkIHRvIGluIHdyaXRpbmcgYmV0d2VlbiBTeW5vcHN5cyBhbmQgeW91LgorICoKKyAqIFRoZSBTb2Z0d2FyZSBJUyBOT1QgYW4gaXRlbSBvZiBMaWNlbnNlZCBTb2Z0d2FyZSBvciBMaWNlbnNlZCBQcm9kdWN0IHVuZGVyCisgKiBhbnkgRW5kIFVzZXIgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgb3IgQWdyZWVtZW50IGZvciBMaWNlbnNlZCBQcm9kdWN0CisgKiB3aXRoIFN5bm9wc3lzIG9yIGFueSBzdXBwbGVtZW50IHRoZXJldG8uIFlvdSBhcmUgcGVybWl0dGVkIHRvIHVzZSBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIFNvZnR3YXJlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgcHJvdmlkZWQgdGhhdCByZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhpcworICogbm90aWNlLiBZb3UgbWF5IG5vdCB2aWV3LCB1c2UsIGRpc2Nsb3NlLCBjb3B5IG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIG9yCisgKiBhbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGhlcmVpbiBleGNlcHQgcHVyc3VhbnQgdG8gdGhpcyBsaWNlbnNlIGdyYW50IGZyb20KKyAqIFN5bm9wc3lzLiBJZiB5b3UgZG8gbm90IGFncmVlIHdpdGggdGhpcyBub3RpY2UsIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lcgorICogYmVsb3csIHRoZW4geW91IGFyZSBub3QgYXV0aG9yaXplZCB0byB1c2UgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgRElTVFJJQlVURUQgQlkgU1lOT1BTWVMgU09MRUxZIE9OIEFOICJBUyBJUyIgQkFTSVMKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgSEVSRUJZIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFNZTk9QU1lTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNpZiAhZGVmaW5lZChfX0RXQ19PVEdfUExBVF9IX18pCisjZGVmaW5lIF9fRFdDX09UR19QTEFUX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKworLyoqCisgKiBAZmlsZQorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgUGxhdGZvcm0gU3BlY2lmaWMgY29uc3RhbnRzLCBpbnRlcmZhY2VzCisgKiAoZnVuY3Rpb25zIGFuZCBtYWNyb3MpIGZvciBMaW51eC4KKyAqCisgKi8KKy8vI2lmICFkZWZpbmVkKF9fTElOVVhfQVJNX0FSQ0hfXykKKy8vI2Vycm9yICJUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGlzIExpbnV4IHNwZWNpZmljISEhIgorLy8jZW5kaWYKKworLyoqCisgKiBSZWFkcyB0aGUgY29udGVudCBvZiBhIHJlZ2lzdGVyLgorICoKKyAqIEBwYXJhbSByZWcgYWRkcmVzcyBvZiByZWdpc3RlciB0byByZWFkLgorICogQHJldHVybiBjb250ZW50cyBvZiB0aGUgcmVnaXN0ZXIuCisgKgorCisgKiBVc2FnZTo8YnI+CisgKiA8Y29kZT51aW50MzJfdCBkZXZfY3RsID0gZHdjX3JlYWRfcmVnMzIoJmRldl9yZWdzLT5kY3RsKTs8L2NvZGU+CisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHVpbnQzMl90IGR3Y19yZWFkX3JlZzMyKCB2b2xhdGlsZSB1aW50MzJfdCAqcmVnKQoreworICAgICAgICByZXR1cm4gcmVhZGwocmVnKTsKK307CisKKy8qKgorICogV3JpdGVzIGEgcmVnaXN0ZXIgd2l0aCBhIDMyIGJpdCB2YWx1ZS4KKyAqCisgKiBAcGFyYW0gcmVnIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgdG8gcmVhZC4KKyAqIEBwYXJhbSB2YWx1ZSB0byB3cml0ZSB0byBfcmVnLgorICoKKyAqIFVzYWdlOjxicj4KKyAqIDxjb2RlPmR3Y193cml0ZV9yZWczMigmZGV2X3JlZ3MtPmRjdGwsIDApOyA8L2NvZGU+CisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgZHdjX3dyaXRlX3JlZzMyKCB2b2xhdGlsZSB1aW50MzJfdCAqcmVnLCBjb25zdCB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICAgICAgd3JpdGVsKCB2YWx1ZSwgcmVnICk7Cit9OworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgYml0IHZhbHVlcyBpbiBhIHJlZ2lzdGVyLiAgVXNpbmcgdGhlCisgKiBhbGdvcml0aG06IChyZWdfY29udGVudHMgJiB+Y2xlYXJfbWFzaykgfCBzZXRfbWFzay4KKyAqCisgKiBAcGFyYW0gcmVnIGFkZHJlc3Mgb2YgcmVnaXN0ZXIgdG8gcmVhZC4KKyAqIEBwYXJhbSBjbGVhcl9tYXNrIGJpdCBtYXNrIHRvIGJlIGNsZWFyZWQuCisgKiBAcGFyYW0gc2V0X21hc2sgYml0IG1hc2sgdG8gYmUgc2V0LgorICoKKyAqIFVzYWdlOjxicj4KKyAqIDxjb2RlPiAvLyBDbGVhciB0aGUgU09GIEludGVycnVwdCBNYXNrIGJpdCBhbmQgPGJyPgorICogLy8gc2V0IHRoZSBPVEcgSW50ZXJydXB0IG1hc2sgYml0LCBsZWF2aW5nIGFsbCBvdGhlcnMgYXMgdGhleSB3ZXJlLgorICogICAgZHdjX21vZGlmeV9yZWczMigmZGV2X3JlZ3MtPmdpbnRtc2ssIERXQ19TT0ZfSU5ULCBEV0NfT1RHX0lOVCk7PC9jb2RlPgorICovCitzdGF0aWMgX19pbmxpbmVfXworIHZvaWQgZHdjX21vZGlmeV9yZWczMiggdm9sYXRpbGUgdWludDMyX3QgKnJlZywgY29uc3QgdWludDMyX3QgY2xlYXJfbWFzaywgY29uc3QgdWludDMyX3Qgc2V0X21hc2spCit7CisgICAgICAgIHdyaXRlbCggKHJlYWRsKHJlZykgJiB+Y2xlYXJfbWFzaykgfCBzZXRfbWFzaywgcmVnICk7Cit9OworCisKKy8qKgorICogV3JhcHBlciBmb3IgdGhlIE9TIG1pY3JvLXNlY29uZCBkZWxheSBmdW5jdGlvbi4KKyAqIEBwYXJhbVtpbl0gdXNlY3MgTWljcm9zZWNvbmRzIG9mIGRlbGF5CisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgVURFTEFZKCBjb25zdCB1aW50MzJfdCB1c2VjcyApCit7CisgICAgICAgIHVkZWxheSggdXNlY3MgKTsKK30KKworLyoqCisgKiBXcmFwcGVyIGZvciB0aGUgT1MgbWlsbGktc2Vjb25kIGRlbGF5IGZ1bmN0aW9uLgorICogQHBhcmFtW2luXSBtc2VjcyBtaWxsaXNlY29uZHMgb2YgZGVsYXkKKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBNREVMQVkoIGNvbnN0IHVpbnQzMl90IG1zZWNzICkKK3sKKyAgICAgICAgbWRlbGF5KCBtc2VjcyApOworfQorCisvKioKKyAqIFdyYXBwZXIgZm9yIHRoZSBMaW51eCBzcGluX2xvY2suICBPbiB0aGUgQVJNIChJbnRlZ3JhdG9yKQorICogc3Bpbl9sb2NrKCkgaXMgYSBub3AuCisgKgorICogQHBhcmFtIGxvY2sgUG9pbnRlciB0byB0aGUgc3BpbmxvY2suCisgKi8KK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgU1BJTl9MT0NLKCBzcGlubG9ja190ICpsb2NrICkKK3sKKyAgICAgICAgc3Bpbl9sb2NrKGxvY2spOworfQorCisvKioKKyAqIFdyYXBwZXIgZm9yIHRoZSBMaW51eCBzcGluX3VubG9jay4gIE9uIHRoZSBBUk0gKEludGVncmF0b3IpCisgKiBzcGluX2xvY2soKSBpcyBhIG5vcC4KKyAqCisgKiBAcGFyYW0gbG9jayBQb2ludGVyIHRvIHRoZSBzcGlubG9jay4KKyAqLworc3RhdGljIF9faW5saW5lX18gdm9pZCBTUElOX1VOTE9DSyggc3BpbmxvY2tfdCAqbG9jayApCit7CisgICAgICAgIHNwaW5fdW5sb2NrKGxvY2spOworfQorCisvKioKKyAqIFdyYXBwZXIgKG1hY3JvKSBmb3IgdGhlIExpbnV4IHNwaW5fbG9ja19pcnFzYXZlLiAgT24gdGhlIEFSTQorICogKEludGVncmF0b3IpIHNwaW5fbG9jaygpIGlzIGEgbm9wLgorICoKKyAqIEBwYXJhbSBsIFBvaW50ZXIgdG8gdGhlIHNwaW5sb2NrLgorICogQHBhcmFtIGYgdW5zaWduZWQgbG9uZyBmb3IgaXJxIGZsYWdzIHN0b3JhZ2UuCisgKi8KKyNkZWZpbmUgU1BJTl9MT0NLX0lSUVNBVkUoIGwsIGYgKSAgc3Bpbl9sb2NrX2lycXNhdmUobCxmKTsKKy8vI2RlZmluZSBTUElOX0xPQ0tfSVJRU0FWRSggbCwgZiApICBsb2NhbF9pcnFfc2F2ZSAoZik7CisKKy8qKgorICogV3JhcHBlciAobWFjcm8pIGZvciB0aGUgTGludXggc3Bpbl91bmxvY2tfaXJxcmVzdG9yZS4gIE9uIHRoZSBBUk0KKyAqIChJbnRlZ3JhdG9yKSBzcGluX2xvY2soKSBpcyBhIG5vcC4KKyAqCisgKiBAcGFyYW0gbCBQb2ludGVyIHRvIHRoZSBzcGlubG9jay4KKyAqIEBwYXJhbSBmIHVuc2lnbmVkIGxvbmcgZm9yIGlycSBmbGFncyBzdG9yYWdlLgorICovCisjZGVmaW5lIFNQSU5fVU5MT0NLX0lSUVJFU1RPUkUoIGwsZiApIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUobCxmKTsKKy8vI2RlZmluZSBTUElOX1VOTE9DS19JUlFSRVNUT1JFKCBsLGYgKSBsb2NhbF9pcnFfcmVzdG9yZSAoZik7CisKKy8qCisgKiBEZWJ1Z2dpbmcgc3VwcG9ydCB2YW5pc2hlcyBpbiBub24tZGVidWcgYnVpbGRzLgorICovCisKKworLyoqCisgKiBUaGUgRGVidWcgTGV2ZWwgYml0LW1hc2sgdmFyaWFibGUuCisgKi8KK2V4dGVybiB1aW50MzJfdCBnX2RiZ19sdmw7CisvKioKKyAqIFNldCB0aGUgRGVidWcgTGV2ZWwgdmFyaWFibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgU0VUX0RFQlVHX0xFVkVMKCBjb25zdCB1aW50MzJfdCBuZXcgKQoreworICAgICAgICB1aW50MzJfdCBvbGQgPSBnX2RiZ19sdmw7CisgICAgICAgIGdfZGJnX2x2bCA9IG5ldzsKKyAgICAgICAgcmV0dXJuIG9sZDsKK30KKworLyoqIFdoZW4gZGVidWcgbGV2ZWwgaGFzIHRoZSBEQkdfQ0lMIGJpdCBzZXQsIGRpc3BsYXkgQ0lMIERlYnVnIG1lc3NhZ2VzLiAqLworI2RlZmluZSBEQkdfQ0lMCQkoMHgyKQorLyoqIFdoZW4gZGVidWcgbGV2ZWwgaGFzIHRoZSBEQkdfQ0lMViBiaXQgc2V0LCBkaXNwbGF5IENJTCBWZXJib3NlIGRlYnVnCisgKiBtZXNzYWdlcyAqLworI2RlZmluZSBEQkdfQ0lMVgkoMHgyMCkKKy8qKiAgV2hlbiBkZWJ1ZyBsZXZlbCBoYXMgdGhlIERCR19QQ0QgYml0IHNldCwgZGlzcGxheSBQQ0QgKERldmljZSkgZGVidWcKKyAqICBtZXNzYWdlcyAqLworI2RlZmluZSBEQkdfUENECQkoMHg0KQorLyoqIFdoZW4gZGVidWcgbGV2ZWwgaGFzIHRoZSBEQkdfUENEViBzZXQsIGRpc3BsYXkgUENEIChEZXZpY2UpIFZlcmJvc2UgZGVidWcKKyAqIG1lc3NhZ2VzICovCisjZGVmaW5lIERCR19QQ0RWCSgweDQwKQorLyoqIFdoZW4gZGVidWcgbGV2ZWwgaGFzIHRoZSBEQkdfSENEIGJpdCBzZXQsIGRpc3BsYXkgSG9zdCBkZWJ1ZyBtZXNzYWdlcyAqLworI2RlZmluZSBEQkdfSENECQkoMHg4KQorLyoqIFdoZW4gZGVidWcgbGV2ZWwgaGFzIHRoZSBEQkdfSENEViBiaXQgc2V0LCBkaXNwbGF5IFZlcmJvc2UgSG9zdCBkZWJ1ZworICogbWVzc2FnZXMgKi8KKyNkZWZpbmUgREJHX0hDRFYJKDB4ODApCisvKiogV2hlbiBkZWJ1ZyBsZXZlbCBoYXMgdGhlIERCR19IQ0RfVVJCIGJpdCBzZXQsIGRpc3BsYXkgZW5xdWV1ZWQgVVJCcyBpbiBob3N0CisgKiAgbW9kZS4gKi8KKyNkZWZpbmUgREJHX0hDRF9VUkIJKDB4ODAwKQorCisvKiogV2hlbiBkZWJ1ZyBsZXZlbCBoYXMgYW55IGJpdCBzZXQsIGRpc3BsYXkgZGVidWcgbWVzc2FnZXMgKi8KKyNkZWZpbmUgREJHX0FOWQkJKDB4RkYpCisKKy8qKiBBbGwgZGVidWcgbWVzc2FnZXMgb2ZmICovCisjZGVmaW5lIERCR19PRkYJCTAKKworLyoqIFByZWZpeCBzdHJpbmcgZm9yIERXQ19ERUJVRyBwcmludCBtYWNyb3MuICovCisjZGVmaW5lIFVTQl9EV0MgImR3Y19vdGc6ICIKKworLyoqCisgKiBQcmludCBhIGRlYnVnIG1lc3NhZ2Ugd2hlbiB0aGUgR2xvYmFsIGRlYnVnIGxldmVsIHZhcmlhYmxlIGNvbnRhaW5zCisgKiB0aGUgYml0IGRlZmluZWQgaW4gPGNvZGU+bHZsPC9jb2RlPi4KKyAqCisgKiBAcGFyYW1baW5dIGx2bCAtIERlYnVnIGxldmVsLCB1c2Ugb25lIG9mIHRoZSBEQkdfIGNvbnN0YW50cyBhYm92ZS4KKyAqIEBwYXJhbVtpbl0geCAtIGxpa2UgcHJpbnRmCisgKgorICogICAgRXhhbXBsZTo8cD4KKyAqIDxjb2RlPgorICogICAgICBEV0NfREVCVUdQTCggREJHX0FOWSwgIiVzKCVwKVxuIiwgX19mdW5jX18sIF9yZWdfYmFzZV9hZGRyKTsKKyAqIDwvY29kZT4KKyAqIDxicj4KKyAqIHJlc3VsdHMgaW46PGJyPgorICogPGNvZGU+CisgKiB1c2ItRFdDX290ZzogZHdjX290Z19jaWxfaW5pdChjYTg2NzAwMCkKKyAqIDwvY29kZT4KKyAqLworI2lmZGVmIERFQlVHCisKKyMgZGVmaW5lIERXQ19ERUJVR1BMKGx2bCwgeC4uLikgZG97IGlmICgobHZsKSZnX2RiZ19sdmwpcHJpbnRrKCBLRVJOX0RFQlVHIFVTQl9EV0MgeCApOyB9d2hpbGUoMCkKKy8vIyBkZWZpbmUgRFdDX0RFQlVHUEwobHZsLCB4Li4uKSBwcmludGsoeCkKKworIyBkZWZpbmUgRFdDX0RFQlVHUCh4Li4uKQlEV0NfREVCVUdQTChEQkdfQU5ZLCB4ICkKKworIyBkZWZpbmUgQ0hLX0RFQlVHX0xFVkVMKGxldmVsKSAoKGxldmVsKSAmIGdfZGJnX2x2bCkKKy8vIyBkZWZpbmUgQ0hLX0RFQlVHX0xFVkVMKGxldmVsKSAxCisKKyNlbHNlCisKKyMgZGVmaW5lIERXQ19ERUJVR1BMKGx2bCwgeC4uLikgZG97fXdoaWxlKDApCisjIGRlZmluZSBEV0NfREVCVUdQKHguLi4pCisKKyMgZGVmaW5lIENIS19ERUJVR19MRVZFTChsZXZlbCkgKDApCisKKyNlbmRpZiAvKkRFQlVHKi8KKworLyoqCisgKiBQcmludCBhbiBFcnJvciBtZXNzYWdlLgorICovCisjZGVmaW5lIERXQ19FUlJPUih4Li4uKSBwcmludGsoIEtFUk5fRVJSIFVTQl9EV0MgeCApCisvLyNkZWZpbmUgRFdDX0VSUk9SKHguLi4pIHByaW50ayggeCApCisKKy8qKgorICogUHJpbnQgYSBXYXJuaW5nIG1lc3NhZ2UuCisgKi8KKyNkZWZpbmUgRFdDX1dBUk4oeC4uLikgcHJpbnRrKCBLRVJOX1dBUk5JTkcgVVNCX0RXQyB4ICkKKy8qKgorICogUHJpbnQgYSBub3RpY2UgKG5vcm1hbCBidXQgc2lnbmlmaWNhbnQgbWVzc2FnZSkuCisgKi8KKyNkZWZpbmUgRFdDX05PVElDRSh4Li4uKSBwcmludGsoIEtFUk5fTk9USUNFIFVTQl9EV0MgeCApCisvKioKKyAqICBCYXNpYyBtZXNzYWdlIHByaW50aW5nLgorICovCisjZGVmaW5lIERXQ19QUklOVCh4Li4uKSBwcmludGsoIEtFUk5fSU5GTyBVU0JfRFdDIHggKQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjX290Zy91c2IuaCBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvdXNiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiZGE4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2R3Y19vdGcvdXNiLmgKQEAgLTAsMCArMSw5NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTggVGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBGb3VuZGF0aW9uCisgKiBieSBMZW5uYXJ0IEF1Z3VzdHNzb24gKGxlbm5hcnRAYXVndXN0c3Nvbi5uZXQpIGF0CisgKiBDYXJsc3RlZHQgUmVzZWFyY2ggJiBUZWNobm9sb2d5LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgTmV0QlNECisgKiAgICAgICAgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIE5ldEJTRCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKiBNb2RpZmllZCBieSBTeW5vcHN5cywgSW5jLCAxMi8xMi8yMDA3ICovCisKKworI2lmbmRlZiBfVVNCX0hfCisjZGVmaW5lIF9VU0JfSF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorICogVGhlIFVTQiByZWNvcmRzIGNvbnRhaW4gc29tZSB1bmFsaWduZWQgbGl0dGxlLWVuZGlhbiB3b3JkCisgKiBjb21wb25lbnRzLiAgVGhlIFVbU0ddRVRXIG1hY3JvcyB0YWtlIGNhcmUgb2YgYm90aCB0aGUgYWxpZ25tZW50CisgKiBhbmQgZW5kaWFuIHByb2JsZW0gYW5kIHNob3VsZCBhbHdheXMgYmUgdXNlZCB0byBhY2Nlc3Mgbm9uLWJ5dGUKKyAqIHZhbHVlcy4KKyAqLwordHlwZWRlZiB1X2ludDhfdCB1Qnl0ZTsKK3R5cGVkZWYgdV9pbnQ4X3QgdVdvcmRbMl07Cit0eXBlZGVmIHVfaW50OF90IHVEV29yZFs0XTsKKworI2RlZmluZSBVU0VUVzIodyxoLGwpICgodylbMF0gPSAodV9pbnQ4X3QpKGwpLCAodylbMV0gPSAodV9pbnQ4X3QpKGgpKQorI2RlZmluZSBVQ09OU1RXKHgpCXsgKHgpICYgMHhmZiwgKCh4KSA+PiA4KSAmIDB4ZmYgfQorI2RlZmluZSBVQ09OU1REVyh4KQl7ICh4KSAmIDB4ZmYsICgoeCkgPj4gOCkgJiAweGZmLCBcCisJCQkgICgoeCkgPj4gMTYpICYgMHhmZiwgKCh4KSA+PiAyNCkgJiAweGZmIH0KKworI2lmIDEKKyNkZWZpbmUgVUdFVFcodykgKCh3KVswXSB8ICgodylbMV0gPDwgOCkpCisjZGVmaW5lIFVTRVRXKHcsdikgKCh3KVswXSA9ICh1X2ludDhfdCkodiksICh3KVsxXSA9ICh1X2ludDhfdCkoKHYpID4+IDgpKQorI2RlZmluZSBVR0VURFcodykgKCh3KVswXSB8ICgodylbMV0gPDwgOCkgfCAoKHcpWzJdIDw8IDE2KSB8ICgodylbM10gPDwgMjQpKQorI2RlZmluZSBVU0VURFcodyx2KSAoKHcpWzBdID0gKHVfaW50OF90KSh2KSwgXAorCQkgICAgICh3KVsxXSA9ICh1X2ludDhfdCkoKHYpID4+IDgpLCBcCisJCSAgICAgKHcpWzJdID0gKHVfaW50OF90KSgodikgPj4gMTYpLCBcCisJCSAgICAgKHcpWzNdID0gKHVfaW50OF90KSgodikgPj4gMjQpKQorI2Vsc2UKKy8qCisgKiBPbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzIHRoYXQgY2FuIGhhbmRsZSB1bmFubGlnZWQgYWNjZXNzZXMKKyAqIChlLmcuIGkzODYpIHRoZXNlIG1hY3JvcyBjYW4gYmUgcmVwbGFjZWQgYnkgdGhlIGZvbGxvd2luZy4KKyAqLworI2RlZmluZSBVR0VUVyh3KSAoKih1X2ludDE2X3QgKikodykpCisjZGVmaW5lIFVTRVRXKHcsdikgKCoodV9pbnQxNl90ICopKHcpID0gKHYpKQorI2RlZmluZSBVR0VURFcodykgKCoodV9pbnQzMl90ICopKHcpKQorI2RlZmluZSBVU0VURFcodyx2KSAoKih1X2ludDMyX3QgKikodykgPSAodikpCisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyBmb3IgYWNjZXNzaW5nIFVBUyBJVSBmaWVsZHMsIHdoaWNoIGFyZSBiaWctZW5kaWFuCisgKi8KKyNkZWZpbmUgSVVTRVRXMih3LGgsbCkgKCh3KVswXSA9ICh1X2ludDhfdCkoaCksICh3KVsxXSA9ICh1X2ludDhfdCkobCkpCisjZGVmaW5lIElVQ09OU1RXKHgpCXsgKCh4KSA+PiA4KSAmIDB4ZmYsICh4KSAmIDB4ZmYgfQorI2RlZmluZSBJVUNPTlNURFcoeCkJeyAoKHgpID4+IDI0KSAmIDB4ZmYsICgoeCkgPj4gMTYpICYgMHhmZiwgXAorCQkJKCh4KSA+PiA4KSAmIDB4ZmYsICh4KSAmIDB4ZmYgfQorI2RlZmluZSBJVUdFVFcodykgKCgodylbMF0gPDwgOCkgfCAodylbMV0pCisjZGVmaW5lIElVU0VUVyh3LHYpICgodylbMF0gPSAodV9pbnQ4X3QpKCh2KSA+PiA4KSwgKHcpWzFdID0gKHVfaW50OF90KSh2KSkKKyNkZWZpbmUgSVVHRVREVyh3KSAoKCh3KVswXSA8PCAyNCkgfCAoKHcpWzFdIDw8IDE2KSB8ICgodylbMl0gPDwgOCkgfCAodylbM10pCisjZGVmaW5lIElVU0VURFcodyx2KSAoKHcpWzBdID0gKHVfaW50OF90KSgodikgPj4gMjQpLCBcCisJCSAgICAgICh3KVsxXSA9ICh1X2ludDhfdCkoKHYpID4+IDE2KSwgXAorCQkgICAgICAodylbMl0gPSAodV9pbnQ4X3QpKCh2KSA+PiA4KSwgXAorCQkgICAgICAodylbM10gPSAodV9pbnQ4X3QpKHYpKQorCisjZGVmaW5lIFVQQUNLRUQgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1Qnl0ZQkJYm1SZXF1ZXN0VHlwZTsKKwl1Qnl0ZQkJYlJlcXVlc3Q7CisJdVdvcmQJCXdWYWx1ZTsKKwl1V29yZAkJd0luZGV4OworCXVXb3JkCQl3TGVuZ3RoOworfSBVUEFDS0VEIHVzYl9kZXZpY2VfcmVxdWVzdF90OworCisjZGVmaW5lIFVUX0dFVF9ESVIoYSkgKChhKSAmIDB4ODApCisjZGVmaW5lIFVUX1dSSVRFCQkweDAwCisjZGVmaW5lIFVUX1JFQUQJCQkweDgwCisKKyNkZWZpbmUgVVRfR0VUX1RZUEUoYSkgKChhKSAmIDB4NjApCisjZGVmaW5lIFVUX1NUQU5EQVJECQkweDAwCisjZGVmaW5lIFVUX0NMQVNTCQkweDIwCisjZGVmaW5lIFVUX1ZFTkRPUgkJMHg0MAorCisjZGVmaW5lIFVUX0dFVF9SRUNJUElFTlQoYSkgKChhKSAmIDB4MWYpCisjZGVmaW5lIFVUX0RFVklDRQkJMHgwMAorI2RlZmluZSBVVF9JTlRFUkZBQ0UJCTB4MDEKKyNkZWZpbmUgVVRfRU5EUE9JTlQJCTB4MDIKKyNkZWZpbmUgVVRfT1RIRVIJCTB4MDMKKworI2RlZmluZSBVVF9SRUFEX0RFVklDRQkJKFVUX1JFQUQgIHwgVVRfU1RBTkRBUkQgfCBVVF9ERVZJQ0UpCisjZGVmaW5lIFVUX1JFQURfSU5URVJGQUNFCShVVF9SRUFEICB8IFVUX1NUQU5EQVJEIHwgVVRfSU5URVJGQUNFKQorI2RlZmluZSBVVF9SRUFEX0VORFBPSU5UCShVVF9SRUFEICB8IFVUX1NUQU5EQVJEIHwgVVRfRU5EUE9JTlQpCisjZGVmaW5lIFVUX1dSSVRFX0RFVklDRQkJKFVUX1dSSVRFIHwgVVRfU1RBTkRBUkQgfCBVVF9ERVZJQ0UpCisjZGVmaW5lIFVUX1dSSVRFX0lOVEVSRkFDRQkoVVRfV1JJVEUgfCBVVF9TVEFOREFSRCB8IFVUX0lOVEVSRkFDRSkKKyNkZWZpbmUgVVRfV1JJVEVfRU5EUE9JTlQJKFVUX1dSSVRFIHwgVVRfU1RBTkRBUkQgfCBVVF9FTkRQT0lOVCkKKyNkZWZpbmUgVVRfUkVBRF9DTEFTU19ERVZJQ0UJKFVUX1JFQUQgIHwgVVRfQ0xBU1MgfCBVVF9ERVZJQ0UpCisjZGVmaW5lIFVUX1JFQURfQ0xBU1NfSU5URVJGQUNFCShVVF9SRUFEICB8IFVUX0NMQVNTIHwgVVRfSU5URVJGQUNFKQorI2RlZmluZSBVVF9SRUFEX0NMQVNTX09USEVSCShVVF9SRUFEICB8IFVUX0NMQVNTIHwgVVRfT1RIRVIpCisjZGVmaW5lIFVUX1JFQURfQ0xBU1NfRU5EUE9JTlQJKFVUX1JFQUQgIHwgVVRfQ0xBU1MgfCBVVF9FTkRQT0lOVCkKKyNkZWZpbmUgVVRfV1JJVEVfQ0xBU1NfREVWSUNFCShVVF9XUklURSB8IFVUX0NMQVNTIHwgVVRfREVWSUNFKQorI2RlZmluZSBVVF9XUklURV9DTEFTU19JTlRFUkZBQ0UgKFVUX1dSSVRFIHwgVVRfQ0xBU1MgfCBVVF9JTlRFUkZBQ0UpCisjZGVmaW5lIFVUX1dSSVRFX0NMQVNTX09USEVSCShVVF9XUklURSB8IFVUX0NMQVNTIHwgVVRfT1RIRVIpCisjZGVmaW5lIFVUX1dSSVRFX0NMQVNTX0VORFBPSU5UCShVVF9XUklURSB8IFVUX0NMQVNTIHwgVVRfRU5EUE9JTlQpCisjZGVmaW5lIFVUX1JFQURfVkVORE9SX0RFVklDRQkoVVRfUkVBRCAgfCBVVF9WRU5ET1IgfCBVVF9ERVZJQ0UpCisjZGVmaW5lIFVUX1JFQURfVkVORE9SX0lOVEVSRkFDRSAoVVRfUkVBRCAgfCBVVF9WRU5ET1IgfCBVVF9JTlRFUkZBQ0UpCisjZGVmaW5lIFVUX1JFQURfVkVORE9SX09USEVSCShVVF9SRUFEICB8IFVUX1ZFTkRPUiB8IFVUX09USEVSKQorI2RlZmluZSBVVF9SRUFEX1ZFTkRPUl9FTkRQT0lOVAkoVVRfUkVBRCAgfCBVVF9WRU5ET1IgfCBVVF9FTkRQT0lOVCkKKyNkZWZpbmUgVVRfV1JJVEVfVkVORE9SX0RFVklDRQkoVVRfV1JJVEUgfCBVVF9WRU5ET1IgfCBVVF9ERVZJQ0UpCisjZGVmaW5lIFVUX1dSSVRFX1ZFTkRPUl9JTlRFUkZBQ0UgKFVUX1dSSVRFIHwgVVRfVkVORE9SIHwgVVRfSU5URVJGQUNFKQorI2RlZmluZSBVVF9XUklURV9WRU5ET1JfT1RIRVIJKFVUX1dSSVRFIHwgVVRfVkVORE9SIHwgVVRfT1RIRVIpCisjZGVmaW5lIFVUX1dSSVRFX1ZFTkRPUl9FTkRQT0lOVCAoVVRfV1JJVEUgfCBVVF9WRU5ET1IgfCBVVF9FTkRQT0lOVCkKKworLyogUmVxdWVzdHMgKi8KKyNkZWZpbmUgVVJfR0VUX1NUQVRVUwkJMHgwMAorI2RlZmluZSAgVVNUQVRfU1RBTkRBUkRfU1RBVFVTICAweDAwCisjZGVmaW5lICBXVVNUQVRfV1VTQl9GRUFUVVJFICAgIDB4MDEKKyNkZWZpbmUgIFdVU1RBVF9DSEFOTkVMX0lORk8gICAgMHgwMgorI2RlZmluZSAgV1VTVEFUX1JFQ0VJVkVEX0RBVEEgICAweDAzCisjZGVmaW5lICBXVVNUQVRfTUFTX0FWQUlMQUJJTElUWSAweDA0CisjZGVmaW5lICBXVVNUQVRfQ1VSUkVOVF9UUkFOU01JVF9QT1dFUiAweDA1CisjZGVmaW5lIFVSX0NMRUFSX0ZFQVRVUkUJMHgwMQorI2RlZmluZSBVUl9TRVRfRkVBVFVSRQkJMHgwMworI2RlZmluZSBVUl9TRVRfQU5EX1RFU1RfRkVBVFVSRSAweDBjCisjZGVmaW5lIFVSX1NFVF9BRERSRVNTCQkweDA1CisjZGVmaW5lIFVSX0dFVF9ERVNDUklQVE9SCTB4MDYKKyNkZWZpbmUgIFVERVNDX0RFVklDRQkJMHgwMQorI2RlZmluZSAgVURFU0NfQ09ORklHCQkweDAyCisjZGVmaW5lICBVREVTQ19TVFJJTkcJCTB4MDMKKyNkZWZpbmUgIFVERVNDX0lOVEVSRkFDRQkweDA0CisjZGVmaW5lICBVREVTQ19FTkRQT0lOVAkJMHgwNQorI2RlZmluZSAgVURFU0NfU1NfVVNCX0NPTVBBTklPTgkweDMwCisjZGVmaW5lICBVREVTQ19ERVZJQ0VfUVVBTElGSUVSCTB4MDYKKyNkZWZpbmUgIFVERVNDX09USEVSX1NQRUVEX0NPTkZJR1VSQVRJT04gMHgwNworI2RlZmluZSAgVURFU0NfSU5URVJGQUNFX1BPV0VSCTB4MDgKKyNkZWZpbmUgIFVERVNDX09URwkJMHgwOQorI2RlZmluZSAgV1VERVNDX1NFQ1VSSVRZCTB4MGMKKyNkZWZpbmUgIFdVREVTQ19LRVkJCTB4MGQKKyNkZWZpbmUgICBXVURfR0VUX0tFWV9JTkRFWChfd1ZhbHVlXykgKChfd1ZhbHVlXykgJiAweGYpCisjZGVmaW5lICAgV1VEX0dFVF9LRVlfVFlQRShfd1ZhbHVlXykgKCgoX3dWYWx1ZV8pICYgMHgzMCkgPj4gNCkKKyNkZWZpbmUgICAgV1VEX0tFWV9UWVBFX0FTU09DICAgIDB4MDEKKyNkZWZpbmUgICAgV1VEX0tFWV9UWVBFX0dUSyAgICAgIDB4MDIKKyNkZWZpbmUgICBXVURfR0VUX0tFWV9PUklHSU4oX3dWYWx1ZV8pICgoKF93VmFsdWVfKSAmIDB4NDApID4+IDYpCisjZGVmaW5lICAgIFdVRF9LRVlfT1JJR0lOX0hPU1QgICAweDAwCisjZGVmaW5lICAgIFdVRF9LRVlfT1JJR0lOX0RFVklDRSAweDAxCisjZGVmaW5lICBXVURFU0NfRU5DUllQVElPTl9UWVBFCTB4MGUKKyNkZWZpbmUgIFdVREVTQ19CT1MJCTB4MGYKKyNkZWZpbmUgIFdVREVTQ19ERVZJQ0VfQ0FQQUJJTElUWSAweDEwCisjZGVmaW5lICBXVURFU0NfV0lSRUxFU1NfRU5EUE9JTlRfQ09NUEFOSU9OIDB4MTEKKyNkZWZpbmUgIFVERVNDX0JPUwkJMHgwZgorI2RlZmluZSAgVURFU0NfREVWSUNFX0NBUEFCSUxJVFkgMHgxMAorI2RlZmluZSAgVURFU0NfQ1NfREVWSUNFCTB4MjEJLyogY2xhc3Mgc3BlY2lmaWMgKi8KKyNkZWZpbmUgIFVERVNDX0NTX0NPTkZJRwkweDIyCisjZGVmaW5lICBVREVTQ19DU19TVFJJTkcJMHgyMworI2RlZmluZSAgVURFU0NfQ1NfSU5URVJGQUNFCTB4MjQKKyNkZWZpbmUgIFVERVNDX0NTX0VORFBPSU5UCTB4MjUKKyNkZWZpbmUgIFVERVNDX0hVQgkJMHgyOQorI2RlZmluZSBVUl9TRVRfREVTQ1JJUFRPUgkweDA3CisjZGVmaW5lIFVSX0dFVF9DT05GSUcJCTB4MDgKKyNkZWZpbmUgVVJfU0VUX0NPTkZJRwkJMHgwOQorI2RlZmluZSBVUl9HRVRfSU5URVJGQUNFCTB4MGEKKyNkZWZpbmUgVVJfU0VUX0lOVEVSRkFDRQkweDBiCisjZGVmaW5lIFVSX1NZTkNIX0ZSQU1FCQkweDBjCisjZGVmaW5lIFdVUl9TRVRfRU5DUllQVElPTiAgICAgIDB4MGQKKyNkZWZpbmUgV1VSX0dFVF9FTkNSWVBUSU9OCTB4MGUKKyNkZWZpbmUgV1VSX1NFVF9IQU5EU0hBS0UJMHgwZgorI2RlZmluZSBXVVJfR0VUX0hBTkRTSEFLRQkweDEwCisjZGVmaW5lIFdVUl9TRVRfQ09OTkVDVElPTgkweDExCisjZGVmaW5lIFdVUl9TRVRfU0VDVVJJVFlfREFUQQkweDEyCisjZGVmaW5lIFdVUl9HRVRfU0VDVVJJVFlfREFUQQkweDEzCisjZGVmaW5lIFdVUl9TRVRfV1VTQl9EQVRBCTB4MTQKKyNkZWZpbmUgIFdVREFUQV9EUlBJRV9JTkZPCTB4MDEKKyNkZWZpbmUgIFdVREFUQV9UUkFOU01JVF9EQVRBCTB4MDIKKyNkZWZpbmUgIFdVREFUQV9UUkFOU01JVF9QQVJBTVMJMHgwMworI2RlZmluZSAgV1VEQVRBX1JFQ0VJVkVfUEFSQU1TCTB4MDQKKyNkZWZpbmUgIFdVREFUQV9UUkFOU01JVF9QT1dFUgkweDA1CisjZGVmaW5lIFdVUl9MT09QQkFDS19EQVRBX1dSSVRFCTB4MTUKKyNkZWZpbmUgV1VSX0xPT1BCQUNLX0RBVEFfUkVBRAkweDE2CisjZGVmaW5lIFdVUl9TRVRfSU5URVJGQUNFX0RTCTB4MTcKKworLyogRmVhdHVyZSBudW1iZXJzICovCisjZGVmaW5lIFVGX0VORFBPSU5UX0hBTFQJMAorI2RlZmluZSBVRl9ERVZJQ0VfUkVNT1RFX1dBS0VVUAkxCisjZGVmaW5lIFVGX1RFU1RfTU9ERQkJMgorI2RlZmluZSBVRl9ERVZJQ0VfQl9ITlBfRU5BQkxFCTMKKyNkZWZpbmUgVUZfREVWSUNFX0FfSE5QX1NVUFBPUlQJNAorI2RlZmluZSBVRl9ERVZJQ0VfQV9BTFRfSE5QX1NVUFBPUlQgNQorI2RlZmluZSBXVUZfV1VTQgkJMworI2RlZmluZSAgV1VGX1RYX0RSUElFCQkweDAKKyNkZWZpbmUgIFdVRl9ERVZfWE1JVF9QQUNLRVQJMHgxCisjZGVmaW5lICBXVUZfQ09VTlRfUEFDS0VUUwkweDIKKyNkZWZpbmUgIFdVRl9DQVBUVVJFX1BBQ0tFVFMJMHgzCisjZGVmaW5lIFVGX0ZVTkNUSU9OX1NVU1BFTkQJMAorI2RlZmluZSBVRl9VMV9FTkFCTEUJCTQ4CisjZGVmaW5lIFVGX1UyX0VOQUJMRQkJNDkKKyNkZWZpbmUgVUZfTFRNX0VOQUJMRQkJNTAKKworLyogQ2xhc3MgcmVxdWVzdHMgZnJvbSB0aGUgVVNCIDIuMCBodWIgc3BlYywgdGFibGUgMTEtMTUgKi8KKyNkZWZpbmUgVUNSX0NMRUFSX0hVQl9GRUFUVVJFCQkoMHgyMDAwIHwgVVJfQ0xFQVJfRkVBVFVSRSkKKyNkZWZpbmUgVUNSX0NMRUFSX1BPUlRfRkVBVFVSRQkJKDB4MjMwMCB8IFVSX0NMRUFSX0ZFQVRVUkUpCisjZGVmaW5lIFVDUl9HRVRfSFVCX0RFU0NSSVBUT1IJCSgweGEwMDAgfCBVUl9HRVRfREVTQ1JJUFRPUikKKyNkZWZpbmUgVUNSX0dFVF9IVUJfU1RBVFVTCQkoMHhhMDAwIHwgVVJfR0VUX1NUQVRVUykKKyNkZWZpbmUgVUNSX0dFVF9QT1JUX1NUQVRVUwkJKDB4YTMwMCB8IFVSX0dFVF9TVEFUVVMpCisjZGVmaW5lIFVDUl9TRVRfSFVCX0ZFQVRVUkUJCSgweDIwMDAgfCBVUl9TRVRfRkVBVFVSRSkKKyNkZWZpbmUgVUNSX1NFVF9QT1JUX0ZFQVRVUkUJCSgweDIzMDAgfCBVUl9TRVRfRkVBVFVSRSkKKyNkZWZpbmUgVUNSX1NFVF9BTkRfVEVTVF9QT1JUX0ZFQVRVUkUJKDB4YTMwMCB8IFVSX1NFVF9BTkRfVEVTVF9GRUFUVVJFKQorCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxwc2hwYWNrMS5oPgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1Qnl0ZQkJYkxlbmd0aDsKKwl1Qnl0ZQkJYkRlc2NyaXB0b3JUeXBlOworCXVCeXRlCQliRGVzY3JpcHRvclN1YnR5cGU7Cit9IFVQQUNLRUQgdXNiX2Rlc2NyaXB0b3JfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVCeXRlCQliTGVuZ3RoOworCXVCeXRlCQliRGVzY3JpcHRvclR5cGU7Cit9IFVQQUNLRUQgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1Qnl0ZQkJYkxlbmd0aDsKKwl1Qnl0ZQkJYkRlc2NyaXB0b3JUeXBlOworCXVXb3JkCQliY2RVU0I7CisjZGVmaW5lIFVEX1VTQl8yXzAJCTB4MDIwMAorI2RlZmluZSBVRF9JU19VU0IyKGQpIChVR0VUVygoZCktPmJjZFVTQikgPj0gVURfVVNCXzJfMCkKKwl1Qnl0ZQkJYkRldmljZUNsYXNzOworCXVCeXRlCQliRGV2aWNlU3ViQ2xhc3M7CisJdUJ5dGUJCWJEZXZpY2VQcm90b2NvbDsKKwl1Qnl0ZQkJYk1heFBhY2tldFNpemU7CisJLyogVGhlIGZpZWxkcyBiZWxvdyBhcmUgbm90IHBhcnQgb2YgdGhlIGluaXRpYWwgZGVzY3JpcHRvci4gKi8KKwl1V29yZAkJaWRWZW5kb3I7CisJdVdvcmQJCWlkUHJvZHVjdDsKKwl1V29yZAkJYmNkRGV2aWNlOworCXVCeXRlCQlpTWFudWZhY3R1cmVyOworCXVCeXRlCQlpUHJvZHVjdDsKKwl1Qnl0ZQkJaVNlcmlhbE51bWJlcjsKKwl1Qnl0ZQkJYk51bUNvbmZpZ3VyYXRpb25zOworfSBVUEFDS0VEIHVzYl9kZXZpY2VfZGVzY3JpcHRvcl90OworI2RlZmluZSBVU0JfREVWSUNFX0RFU0NSSVBUT1JfU0laRSAxOAorCit0eXBlZGVmIHN0cnVjdCB7CisJdUJ5dGUJCWJMZW5ndGg7CisJdUJ5dGUJCWJEZXNjcmlwdG9yVHlwZTsKKwl1V29yZAkJd1RvdGFsTGVuZ3RoOworCXVCeXRlCQliTnVtSW50ZXJmYWNlOworCXVCeXRlCQliQ29uZmlndXJhdGlvblZhbHVlOworCXVCeXRlCQlpQ29uZmlndXJhdGlvbjsKKyNkZWZpbmUgVUNfQVRUX09ORQkJKDEgPDwgNykJLyogbXVzdCBiZSBzZXQgKi8KKyNkZWZpbmUgVUNfQVRUX1NFTEZQT1dFUgkoMSA8PCA2KQkvKiBzZWxmIHBvd2VyZWQgKi8KKyNkZWZpbmUgVUNfQVRUX1dBS0VVUAkJKDEgPDwgNSkJLyogY2FuIHdha2V1cCAqLworI2RlZmluZSBVQ19BVFRfQkFUVEVSWQkJKDEgPDwgNCkJLyogYmF0dGVyeSBwb3dlcmVkICovCisJdUJ5dGUJCWJtQXR0cmlidXRlczsKKyNkZWZpbmUgVUNfQlVTX1BPV0VSRUQJCTB4ODAKKyNkZWZpbmUgVUNfU0VMRl9QT1dFUkVECQkweDQwCisjZGVmaW5lIFVDX1JFTU9URV9XQUtFVVAJMHgyMAorCXVCeXRlCQliTWF4UG93ZXI7IC8qIG1heCBjdXJyZW50IGluIDIgbUEgdW5pdHMgKi8KKyNkZWZpbmUgVUNfUE9XRVJfRkFDVE9SIDIKK30gVVBBQ0tFRCB1c2JfY29uZmlnX2Rlc2NyaXB0b3JfdDsKKyNkZWZpbmUgVVNCX0NPTkZJR19ERVNDUklQVE9SX1NJWkUgOQorCit0eXBlZGVmIHN0cnVjdCB7CisJdUJ5dGUJCWJMZW5ndGg7CisJdUJ5dGUJCWJEZXNjcmlwdG9yVHlwZTsKKwl1Qnl0ZQkJYkludGVyZmFjZU51bWJlcjsKKwl1Qnl0ZQkJYkFsdGVybmF0ZVNldHRpbmc7CisJdUJ5dGUJCWJOdW1FbmRwb2ludHM7CisJdUJ5dGUJCWJJbnRlcmZhY2VDbGFzczsKKwl1Qnl0ZQkJYkludGVyZmFjZVN1YkNsYXNzOworCXVCeXRlCQliSW50ZXJmYWNlUHJvdG9jb2w7CisJdUJ5dGUJCWlJbnRlcmZhY2U7Cit9IFVQQUNLRUQgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yX3Q7CisjZGVmaW5lIFVTQl9JTlRFUkZBQ0VfREVTQ1JJUFRPUl9TSVpFIDkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVCeXRlCQliTGVuZ3RoOworCXVCeXRlCQliRGVzY3JpcHRvclR5cGU7CisJdUJ5dGUJCWJFbmRwb2ludEFkZHJlc3M7CisjZGVmaW5lIFVFX0dFVF9ESVIoYSkJKChhKSAmIDB4ODApCisjZGVmaW5lIFVFX1NFVF9ESVIoYSxkKQkoKGEpIHwgKCgoZCkmMSkgPDwgNykpCisjZGVmaW5lIFVFX0RJUl9JTgkweDgwCisjZGVmaW5lIFVFX0RJUl9PVVQJMHgwMAorI2RlZmluZSBVRV9BRERSCQkweDBmCisjZGVmaW5lIFVFX0dFVF9BRERSKGEpCSgoYSkgJiBVRV9BRERSKQorCXVCeXRlCQlibUF0dHJpYnV0ZXM7CisjZGVmaW5lIFVFX1hGRVJUWVBFCTB4MDMKKyNkZWZpbmUgIFVFX0NPTlRST0wJMHgwMAorI2RlZmluZSAgVUVfSVNPQ0hST05PVVMJMHgwMQorI2RlZmluZSAgVUVfQlVMSwkweDAyCisjZGVmaW5lICBVRV9JTlRFUlJVUFQJMHgwMworI2RlZmluZSBVRV9HRVRfWEZFUlRZUEUoYSkJKChhKSAmIFVFX1hGRVJUWVBFKQorI2RlZmluZSBVRV9JU09fVFlQRQkweDBjCisjZGVmaW5lICBVRV9JU09fQVNZTkMJMHgwNAorI2RlZmluZSAgVUVfSVNPX0FEQVBUCTB4MDgKKyNkZWZpbmUgIFVFX0lTT19TWU5DCTB4MGMKKyNkZWZpbmUgVUVfR0VUX0lTT19UWVBFKGEpCSgoYSkgJiBVRV9JU09fVFlQRSkKKwl1V29yZAkJd01heFBhY2tldFNpemU7CisJdUJ5dGUJCWJJbnRlcnZhbDsKK30gVVBBQ0tFRCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcl90OworI2RlZmluZSBVU0JfRU5EUE9JTlRfREVTQ1JJUFRPUl9TSVpFIDcKKwordHlwZWRlZiBzdHJ1Y3Qgc3NfZW5kcG9pbnRfY29tcGFuaW9uX2Rlc2NyaXB0b3IgeworCXVCeXRlIGJMZW5ndGg7CisJdUJ5dGUgYkRlc2NyaXB0b3JUeXBlOworCXVCeXRlIGJNYXhCdXJzdDsKKyNkZWZpbmUgVVNTRV9HRVRfTUFYX1NUUkVBTVMoYSkJCSgoYSkgJiAweDFmKQorI2RlZmluZSBVU1NFX1NFVF9NQVhfU1RSRUFNUyhhLCBiKQkoKGEpIHwgKChiKSAmIDB4MWYpKQorI2RlZmluZSBVU1NFX0dFVF9NQVhfUEFDS0VUX05VTShhKQkoKGEpICYgMHgwMykKKyNkZWZpbmUgVVNTRV9TRVRfTUFYX1BBQ0tFVF9OVU0oYSwgYikJKChhKSB8ICgoYikgJiAweDAzKSkKKwl1Qnl0ZSBibUF0dHJpYnV0ZXM7CisJdVdvcmQgd0J5dGVzUGVySW50ZXJ2YWw7Cit9IFVQQUNLRUQgc3NfZW5kcG9pbnRfY29tcGFuaW9uX2Rlc2NyaXB0b3JfdDsKKyNkZWZpbmUgVVNCX1NTX0VORFBPSU5UX0NPTVBBTklPTl9ERVNDUklQVE9SX1NJWkUgNgorCit0eXBlZGVmIHN0cnVjdCB7CisJdUJ5dGUJCWJMZW5ndGg7CisJdUJ5dGUJCWJEZXNjcmlwdG9yVHlwZTsKKwl1V29yZAkJYlN0cmluZ1sxMjddOworfSBVUEFDS0VEIHVzYl9zdHJpbmdfZGVzY3JpcHRvcl90OworI2RlZmluZSBVU0JfTUFYX1NUUklOR19MRU4gMTI4CisjZGVmaW5lIFVTQl9MQU5HVUFHRV9UQUJMRSAwCS8qICMgb2YgdGhlIHN0cmluZyBsYW5ndWFnZSBpZCB0YWJsZSAqLworCisvKiBIdWIgc3BlY2lmaWMgcmVxdWVzdCAqLworI2RlZmluZSBVUl9HRVRfQlVTX1NUQVRFCTB4MDIKKyNkZWZpbmUgVVJfQ0xFQVJfVFRfQlVGRkVSCTB4MDgKKyNkZWZpbmUgVVJfUkVTRVRfVFQJCTB4MDkKKyNkZWZpbmUgVVJfR0VUX1RUX1NUQVRFCQkweDBhCisjZGVmaW5lIFVSX1NUT1BfVFQJCTB4MGIKKworLyogSHViIGZlYXR1cmVzICovCisjZGVmaW5lIFVIRl9DX0hVQl9MT0NBTF9QT1dFUgkwCisjZGVmaW5lIFVIRl9DX0hVQl9PVkVSX0NVUlJFTlQJMQorI2RlZmluZSBVSEZfUE9SVF9DT05ORUNUSU9OCTAKKyNkZWZpbmUgVUhGX1BPUlRfRU5BQkxFCQkxCisjZGVmaW5lIFVIRl9QT1JUX1NVU1BFTkQJMgorI2RlZmluZSBVSEZfUE9SVF9PVkVSX0NVUlJFTlQJMworI2RlZmluZSBVSEZfUE9SVF9SRVNFVAkJNAorI2RlZmluZSBVSEZfUE9SVF9MMQkJNQorI2RlZmluZSBVSEZfUE9SVF9QT1dFUgkJOAorI2RlZmluZSBVSEZfUE9SVF9MT1dfU1BFRUQJOQorI2RlZmluZSBVSEZfUE9SVF9ISUdIX1NQRUVECTEwCisjZGVmaW5lIFVIRl9DX1BPUlRfQ09OTkVDVElPTgkxNgorI2RlZmluZSBVSEZfQ19QT1JUX0VOQUJMRQkxNworI2RlZmluZSBVSEZfQ19QT1JUX1NVU1BFTkQJMTgKKyNkZWZpbmUgVUhGX0NfUE9SVF9PVkVSX0NVUlJFTlQJMTkKKyNkZWZpbmUgVUhGX0NfUE9SVF9SRVNFVAkyMAorI2RlZmluZSBVSEZfQ19QT1JUX0wxCQkyMworI2RlZmluZSBVSEZfUE9SVF9URVNUCQkyMQorI2RlZmluZSBVSEZfUE9SVF9JTkRJQ0FUT1IJMjIKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVCeXRlCQliRGVzY0xlbmd0aDsKKwl1Qnl0ZQkJYkRlc2NyaXB0b3JUeXBlOworCXVCeXRlCQliTmJyUG9ydHM7CisJdVdvcmQJCXdIdWJDaGFyYWN0ZXJpc3RpY3M7CisjZGVmaW5lIFVIRF9QV1IJCQkweDAwMDMKKyNkZWZpbmUgIFVIRF9QV1JfR0FOR0VECQkweDAwMDAKKyNkZWZpbmUgIFVIRF9QV1JfSU5ESVZJRFVBTAkweDAwMDEKKyNkZWZpbmUgIFVIRF9QV1JfTk9fU1dJVENICTB4MDAwMgorI2RlZmluZSBVSERfQ09NUE9VTkQJCTB4MDAwNAorI2RlZmluZSBVSERfT0MJCQkweDAwMTgKKyNkZWZpbmUgIFVIRF9PQ19HTE9CQUwJCTB4MDAwMAorI2RlZmluZSAgVUhEX09DX0lORElWSURVQUwJMHgwMDA4CisjZGVmaW5lICBVSERfT0NfTk9ORQkJMHgwMDEwCisjZGVmaW5lIFVIRF9UVF9USElOSwkJMHgwMDYwCisjZGVmaW5lICBVSERfVFRfVEhJTktfOAkJMHgwMDAwCisjZGVmaW5lICBVSERfVFRfVEhJTktfMTYJMHgwMDIwCisjZGVmaW5lICBVSERfVFRfVEhJTktfMjQJMHgwMDQwCisjZGVmaW5lICBVSERfVFRfVEhJTktfMzIJMHgwMDYwCisjZGVmaW5lIFVIRF9QT1JUX0lORAkJMHgwMDgwCisJdUJ5dGUJCWJQd3JPbjJQd3JHb29kOwkvKiBkZWxheSBpbiAyIG1zIHVuaXRzICovCisjZGVmaW5lIFVIRF9QV1JPTl9GQUNUT1IgMgorCXVCeXRlCQliSHViQ29udHJDdXJyZW50OworCXVCeXRlCQlEZXZpY2VSZW1vdmFibGVbMzJdOyAvKiBtYXggMjU1IHBvcnRzICovCisjZGVmaW5lIFVIRF9OT1RfUkVNT1YoZGVzYywgaSkgXAorICAgICgoKGRlc2MpLT5EZXZpY2VSZW1vdmFibGVbKGkpLzhdID4+ICgoaSkgJSA4KSkgJiAxKQorCS8qIGRlcHJlY2F0ZWQgKi8gdUJ5dGUJCVBvcnRQb3dlckN0cmxNYXNrWzFdOworfSBVUEFDS0VEIHVzYl9odWJfZGVzY3JpcHRvcl90OworI2RlZmluZSBVU0JfSFVCX0RFU0NSSVBUT1JfU0laRSA5IC8qIGluY2x1ZGVzIGRlcHJlY2F0ZWQgUG9ydFBvd2VyQ3RybE1hc2sgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVCeXRlCQliTGVuZ3RoOworCXVCeXRlCQliRGVzY3JpcHRvclR5cGU7CisJdVdvcmQJCWJjZFVTQjsKKwl1Qnl0ZQkJYkRldmljZUNsYXNzOworCXVCeXRlCQliRGV2aWNlU3ViQ2xhc3M7CisJdUJ5dGUJCWJEZXZpY2VQcm90b2NvbDsKKwl1Qnl0ZQkJYk1heFBhY2tldFNpemUwOworCXVCeXRlCQliTnVtQ29uZmlndXJhdGlvbnM7CisJdUJ5dGUJCWJSZXNlcnZlZDsKK30gVVBBQ0tFRCB1c2JfZGV2aWNlX3F1YWxpZmllcl90OworI2RlZmluZSBVU0JfREVWSUNFX1FVQUxJRklFUl9TSVpFIDEwCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1Qnl0ZQkJYkxlbmd0aDsKKwl1Qnl0ZQkJYkRlc2NyaXB0b3JUeXBlOworCXVCeXRlCQlibUF0dHJpYnV0ZXM7CisjZGVmaW5lIFVPVEdfU1JQCTB4MDEKKyNkZWZpbmUgVU9UR19ITlAJMHgwMgorfSBVUEFDS0VEIHVzYl9vdGdfZGVzY3JpcHRvcl90OworCisvKiBPVEcgZmVhdHVyZSBzZWxlY3RvcnMgKi8KKyNkZWZpbmUgVU9UR19CX0hOUF9FTkFCTEUJMworI2RlZmluZSBVT1RHX0FfSE5QX1NVUFBPUlQJNAorI2RlZmluZSBVT1RHX0FfQUxUX0hOUF9TVVBQT1JUCTUKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVXb3JkCQl3U3RhdHVzOworLyogRGV2aWNlIHN0YXR1cyBmbGFncyAqLworI2RlZmluZSBVRFNfU0VMRl9QT1dFUkVECQkweDAwMDEKKyNkZWZpbmUgVURTX1JFTU9URV9XQUtFVVAJCTB4MDAwMgorLyogRW5kcG9pbnQgc3RhdHVzIGZsYWdzICovCisjZGVmaW5lIFVFU19IQUxUCQkJMHgwMDAxCit9IFVQQUNLRUQgdXNiX3N0YXR1c190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdVdvcmQJCXdIdWJTdGF0dXM7CisjZGVmaW5lIFVIU19MT0NBTF9QT1dFUgkJCTB4MDAwMQorI2RlZmluZSBVSFNfT1ZFUl9DVVJSRU5UCQkweDAwMDIKKwl1V29yZAkJd0h1YkNoYW5nZTsKK30gVVBBQ0tFRCB1c2JfaHViX3N0YXR1c190OworCit0eXBlZGVmIHN0cnVjdCB7CisJdVdvcmQJCXdQb3J0U3RhdHVzOworI2RlZmluZSBVUFNfQ1VSUkVOVF9DT05ORUNUX1NUQVRVUwkweDAwMDEKKyNkZWZpbmUgVVBTX1BPUlRfRU5BQkxFRAkJMHgwMDAyCisjZGVmaW5lIFVQU19TVVNQRU5ECQkJMHgwMDA0CisjZGVmaW5lIFVQU19PVkVSQ1VSUkVOVF9JTkRJQ0FUT1IJMHgwMDA4CisjZGVmaW5lIFVQU19SRVNFVAkJCTB4MDAxMAorI2RlZmluZSBVUFNfUE9SVF9QT1dFUgkJCTB4MDEwMAorI2RlZmluZSBVUFNfTE9XX1NQRUVECQkJMHgwMjAwCisjZGVmaW5lIFVQU19ISUdIX1NQRUVECQkJMHgwNDAwCisjZGVmaW5lIFVQU19QT1JUX1RFU1QJCQkweDA4MDAKKyNkZWZpbmUgVVBTX1BPUlRfSU5ESUNBVE9SCQkweDEwMDAKKwl1V29yZAkJd1BvcnRDaGFuZ2U7CisjZGVmaW5lIFVQU19DX0NPTk5FQ1RfU1RBVFVTCQkweDAwMDEKKyNkZWZpbmUgVVBTX0NfUE9SVF9FTkFCTEVECQkweDAwMDIKKyNkZWZpbmUgVVBTX0NfU1VTUEVORAkJCTB4MDAwNAorI2RlZmluZSBVUFNfQ19PVkVSQ1VSUkVOVF9JTkRJQ0FUT1IJMHgwMDA4CisjZGVmaW5lIFVQU19DX1BPUlRfUkVTRVQJCTB4MDAxMAorfSBVUEFDS0VEIHVzYl9wb3J0X3N0YXR1c190OworCisjaWZkZWYgX01TQ19WRVIKKyNpbmNsdWRlIDxwb3BwYWNrLmg+CisjZW5kaWYKKworLyogRGV2aWNlIGNsYXNzIGNvZGVzICovCisjZGVmaW5lIFVEQ0xBU1NfSU5fSU5URVJGQUNFCTB4MDAKKyNkZWZpbmUgVURDTEFTU19DT01NCQkweDAyCisjZGVmaW5lIFVEQ0xBU1NfSFVCCQkweDA5CisjZGVmaW5lICBVRFNVQkNMQVNTX0hVQgkJMHgwMAorI2RlZmluZSAgVURQUk9UT19GU0hVQgkJMHgwMAorI2RlZmluZSAgVURQUk9UT19IU0hVQlNUVAkweDAxCisjZGVmaW5lICBVRFBST1RPX0hTSFVCTVRUCTB4MDIKKyNkZWZpbmUgVURDTEFTU19ESUFHTk9TVElDCTB4ZGMKKyNkZWZpbmUgVURDTEFTU19XSVJFTEVTUwkweGUwCisjZGVmaW5lICBVRFNVQkNMQVNTX1JGCQkweDAxCisjZGVmaW5lICAgVURQUk9UT19CTFVFVE9PVEgJMHgwMQorI2RlZmluZSBVRENMQVNTX1ZFTkRPUgkJMHhmZgorCisvKiBJbnRlcmZhY2UgY2xhc3MgY29kZXMgKi8KKyNkZWZpbmUgVUlDTEFTU19VTlNQRUMJCTB4MDAKKworI2RlZmluZSBVSUNMQVNTX0FVRElPCQkweDAxCisjZGVmaW5lICBVSVNVQkNMQVNTX0FVRElPQ09OVFJPTAkxCisjZGVmaW5lICBVSVNVQkNMQVNTX0FVRElPU1RSRUFNCQkyCisjZGVmaW5lICBVSVNVQkNMQVNTX01JRElTVFJFQU0JCTMKKworI2RlZmluZSBVSUNMQVNTX0NEQwkJMHgwMiAvKiBjb21tdW5pY2F0aW9uICovCisjZGVmaW5lICBVSVNVQkNMQVNTX0RJUkVDVF9MSU5FX0NPTlRST0xfTU9ERUwJMQorI2RlZmluZSAgVUlTVUJDTEFTU19BQlNUUkFDVF9DT05UUk9MX01PREVMCTIKKyNkZWZpbmUgIFVJU1VCQ0xBU1NfVEVMRVBIT05FX0NPTlRST0xfTU9ERUwJMworI2RlZmluZSAgVUlTVUJDTEFTU19NVUxUSUNIQU5ORUxfQ09OVFJPTF9NT0RFTAk0CisjZGVmaW5lICBVSVNVQkNMQVNTX0NBUElfQ09OVFJPTE1PREVMCQk1CisjZGVmaW5lICBVSVNVQkNMQVNTX0VUSEVSTkVUX05FVFdPUktJTkdfQ09OVFJPTF9NT0RFTCA2CisjZGVmaW5lICBVSVNVQkNMQVNTX0FUTV9ORVRXT1JLSU5HX0NPTlRST0xfTU9ERUwgNworI2RlZmluZSAgIFVJUFJPVE9fQ0RDX0FUCQkJMQorCisjZGVmaW5lIFVJQ0xBU1NfSElECQkweDAzCisjZGVmaW5lICBVSVNVQkNMQVNTX0JPT1QJMQorI2RlZmluZSAgVUlQUk9UT19CT09UX0tFWUJPQVJECTEKKworI2RlZmluZSBVSUNMQVNTX1BIWVNJQ0FMCTB4MDUKKworI2RlZmluZSBVSUNMQVNTX0lNQUdFCQkweDA2CisKKyNkZWZpbmUgVUlDTEFTU19QUklOVEVSCQkweDA3CisjZGVmaW5lICBVSVNVQkNMQVNTX1BSSU5URVIJMQorI2RlZmluZSAgVUlQUk9UT19QUklOVEVSX1VOSQkxCisjZGVmaW5lICBVSVBST1RPX1BSSU5URVJfQkkJMgorI2RlZmluZSAgVUlQUk9UT19QUklOVEVSXzEyODQJMworCisjZGVmaW5lIFVJQ0xBU1NfTUFTUwkJMHgwOAorI2RlZmluZSAgVUlTVUJDTEFTU19SQkMJCTEKKyNkZWZpbmUgIFVJU1VCQ0xBU1NfU0ZGODAyMEkJMgorI2RlZmluZSAgVUlTVUJDTEFTU19RSUMxNTcJMworI2RlZmluZSAgVUlTVUJDTEFTU19VRkkJCTQKKyNkZWZpbmUgIFVJU1VCQ0xBU1NfU0ZGODA3MEkJNQorI2RlZmluZSAgVUlTVUJDTEFTU19TQ1NJCTYKKyNkZWZpbmUgIFVJUFJPVE9fTUFTU19DQklfSQkwCisjZGVmaW5lICBVSVBST1RPX01BU1NfQ0JJCTEKKyNkZWZpbmUgIFVJUFJPVE9fTUFTU19CQkJfT0xECTIJLyogTm90IGluIHRoZSBzcGVjIGFueW1vcmUgKi8KKyNkZWZpbmUgIFVJUFJPVE9fTUFTU19CQkIJODAJLyogJ1AnIGZvciB0aGUgSW9tZWdhIFppcCBkcml2ZSAqLworCisjZGVmaW5lIFVJQ0xBU1NfSFVCCQkweDA5CisjZGVmaW5lICBVSVNVQkNMQVNTX0hVQgkJMAorI2RlZmluZSAgVUlQUk9UT19GU0hVQgkJMAorI2RlZmluZSAgVUlQUk9UT19IU0hVQlNUVAkwIC8qIFllcywgc2FtZSBhcyBwcmV2aW91cyAqLworI2RlZmluZSAgVUlQUk9UT19IU0hVQk1UVAkxCisKKyNkZWZpbmUgVUlDTEFTU19DRENfREFUQQkweDBhCisjZGVmaW5lICBVSVNVQkNMQVNTX0RBVEEJCTAKKyNkZWZpbmUgICBVSVBST1RPX0RBVEFfSVNETkJSSQkJMHgzMCAgICAvKiBQaHlzaWNhbCBpZmFjZSAqLworI2RlZmluZSAgIFVJUFJPVE9fREFUQV9IRExDCQkweDMxICAgIC8qIEhETEMgKi8KKyNkZWZpbmUgICBVSVBST1RPX0RBVEFfVFJBTlNQQVJFTlQJMHgzMiAgICAvKiBUcmFuc3BhcmVudCAqLworI2RlZmluZSAgIFVJUFJPVE9fREFUQV9ROTIxTQkJMHg1MCAgICAvKiBNYW5hZ2VtZW50IGZvciBROTIxICovCisjZGVmaW5lICAgVUlQUk9UT19EQVRBX1E5MjEJCTB4NTEgICAgLyogRGF0YSBmb3IgUTkyMSAqLworI2RlZmluZSAgIFVJUFJPVE9fREFUQV9ROTIxVE0JCTB4NTIgICAgLyogVEVJIG11bHRpcGxleGVyIGZvciBROTIxICovCisjZGVmaW5lICAgVUlQUk9UT19EQVRBX1Y0MkJJUwkJMHg5MCAgICAvKiBEYXRhIGNvbXByZXNzaW9uICovCisjZGVmaW5lICAgVUlQUk9UT19EQVRBX1E5MzEJCTB4OTEgICAgLyogRXVyby1JU0ROICovCisjZGVmaW5lICAgVUlQUk9UT19EQVRBX1YxMjAJCTB4OTIgICAgLyogVi4yNCByYXRlIGFkYXB0aW9uICovCisjZGVmaW5lICAgVUlQUk9UT19EQVRBX0NBUEkJCTB4OTMgICAgLyogQ0FQSSAyLjAgY29tbWFuZHMgKi8KKyNkZWZpbmUgICBVSVBST1RPX0RBVEFfSE9TVF9CQVNFRAkweGZkICAgIC8qIEhvc3QgYmFzZWQgZHJpdmVyICovCisjZGVmaW5lICAgVUlQUk9UT19EQVRBX1BVRgkJMHhmZSAgICAvKiBzZWUgUHJvdC4gVW5pdCBGdW5jLiBEZXNjLiovCisjZGVmaW5lICAgVUlQUk9UT19EQVRBX1ZFTkRPUgkJMHhmZiAgICAvKiBWZW5kb3Igc3BlY2lmaWMgKi8KKworI2RlZmluZSBVSUNMQVNTX1NNQVJUQ0FSRAkweDBiCisKKy8qI2RlZmluZSBVSUNMQVNTX0ZJUk1fVVBECTB4MGMqLworCisjZGVmaW5lIFVJQ0xBU1NfU0VDVVJJVFkJMHgwZAorCisjZGVmaW5lIFVJQ0xBU1NfRElBR05PU1RJQwkweGRjCisKKyNkZWZpbmUgVUlDTEFTU19XSVJFTEVTUwkweGUwCisjZGVmaW5lICBVSVNVQkNMQVNTX1JGCQkJMHgwMQorI2RlZmluZSAgIFVJUFJPVE9fQkxVRVRPT1RICQkweDAxCisKKyNkZWZpbmUgVUlDTEFTU19BUFBMX1NQRUMJMHhmZQorI2RlZmluZSAgVUlTVUJDTEFTU19GSVJNV0FSRV9ET1dOTE9BRAkxCisjZGVmaW5lICBVSVNVQkNMQVNTX0lSREEJCTIKKyNkZWZpbmUgIFVJUFJPVE9fSVJEQQkJCTAKKworI2RlZmluZSBVSUNMQVNTX1ZFTkRPUgkJMHhmZgorCisjZGVmaW5lIFVTQl9IVUJfTUFYX0RFUFRIIDUKKworLyoKKyAqIE1pbmltdW0gdGltZSBhIGRldmljZSBuZWVkcyB0byBiZSBwb3dlcmVkIGRvd24gdG8gZ28gdGhyb3VnaAorICogYSBwb3dlciBjeWNsZS4gIFhYWCBBcmUgdGhlc2UgdGltZSBpbiB0aGUgc3BlYz8KKyAqLworI2RlZmluZSBVU0JfUE9XRVJfRE9XTl9USU1FCTIwMCAvKiBtcyAqLworI2RlZmluZSBVU0JfUE9SVF9QT1dFUl9ET1dOX1RJTUUJMTAwIC8qIG1zICovCisKKyNpZiAwCisvKiBUaGVzZSBhcmUgdGhlIHZhbHVlcyBmcm9tIHRoZSBzcGVjLiAqLworI2RlZmluZSBVU0JfUE9SVF9SRVNFVF9ERUxBWQkxMCAgLyogbXMgKi8KKyNkZWZpbmUgVVNCX1BPUlRfUk9PVF9SRVNFVF9ERUxBWSA1MCAgLyogbXMgKi8KKyNkZWZpbmUgVVNCX1BPUlRfUkVTRVRfUkVDT1ZFUlkJMTAgIC8qIG1zICovCisjZGVmaW5lIFVTQl9QT1JUX1BPV0VSVVBfREVMQVkJMTAwIC8qIG1zICovCisjZGVmaW5lIFVTQl9TRVRfQUREUkVTU19TRVRUTEUJMiAgIC8qIG1zICovCisjZGVmaW5lIFVTQl9SRVNVTUVfREVMQVkJKDIwKjUpICAvKiBtcyAqLworI2RlZmluZSBVU0JfUkVTVU1FX1dBSVQJCTEwICAvKiBtcyAqLworI2RlZmluZSBVU0JfUkVTVU1FX1JFQ09WRVJZCTEwICAvKiBtcyAqLworI2RlZmluZSBVU0JfRVhUUkFfUE9XRVJfVVBfVElNRQkwICAgLyogbXMgKi8KKyNlbHNlCisvKiBBbGxvdyBmb3IgbWFyZ2luYWwgKGkuZS4gbm9uLWNvbmZvcm1pbmcpIGRldmljZXMuICovCisjZGVmaW5lIFVTQl9QT1JUX1JFU0VUX0RFTEFZCTUwICAvKiBtcyAqLworI2RlZmluZSBVU0JfUE9SVF9ST09UX1JFU0VUX0RFTEFZIDI1MCAgLyogbXMgKi8KKyNkZWZpbmUgVVNCX1BPUlRfUkVTRVRfUkVDT1ZFUlkJMjUwICAvKiBtcyAqLworI2RlZmluZSBVU0JfUE9SVF9QT1dFUlVQX0RFTEFZCTMwMCAvKiBtcyAqLworI2RlZmluZSBVU0JfU0VUX0FERFJFU1NfU0VUVExFCTEwICAvKiBtcyAqLworI2RlZmluZSBVU0JfUkVTVU1FX0RFTEFZCSg1MCo1KSAgLyogbXMgKi8KKyNkZWZpbmUgVVNCX1JFU1VNRV9XQUlUCQk1MCAgLyogbXMgKi8KKyNkZWZpbmUgVVNCX1JFU1VNRV9SRUNPVkVSWQk1MCAgLyogbXMgKi8KKyNkZWZpbmUgVVNCX0VYVFJBX1BPV0VSX1VQX1RJTUUJMjAgIC8qIG1zICovCisjZW5kaWYKKworI2RlZmluZSBVU0JfTUlOX1BPV0VSCQkxMDAgLyogbUEgKi8KKyNkZWZpbmUgVVNCX01BWF9QT1dFUgkJNTAwIC8qIG1BICovCisKKyNkZWZpbmUgVVNCX0JVU19SRVNFVF9ERUxBWQkxMDAgLyogbXMgWFhYPyovCisKKyNkZWZpbmUgVVNCX1VOQ09ORklHX05PIDAKKyNkZWZpbmUgVVNCX1VOQ09ORklHX0lOREVYICgtMSkKKworLyoqKiBpb2N0bCgpIHJlbGF0ZWQgc3R1ZmYgKioqLworCitzdHJ1Y3QgdXNiX2N0bF9yZXF1ZXN0IHsKKwlpbnQJdWNyX2FkZHI7CisJdXNiX2RldmljZV9yZXF1ZXN0X3QgdWNyX3JlcXVlc3Q7CisJdm9pZAkqdWNyX2RhdGE7CisJaW50CXVjcl9mbGFnczsKKyNkZWZpbmUgVVNCRF9TSE9SVF9YRkVSX09LCTB4MDQJLyogYWxsb3cgc2hvcnQgcmVhZHMgKi8KKwlpbnQJdWNyX2FjdGxlbjsJCS8qIGFjdHVhbCBsZW5ndGggdHJhbnNmZXJyZWQgKi8KK307CisKK3N0cnVjdCB1c2JfYWx0X2ludGVyZmFjZSB7CisJaW50CXVhaV9jb25maWdfaW5kZXg7CisJaW50CXVhaV9pbnRlcmZhY2VfaW5kZXg7CisJaW50CXVhaV9hbHRfbm87Cit9OworCisjZGVmaW5lIFVTQl9DVVJSRU5UX0NPTkZJR19JTkRFWCAoLTEpCisjZGVmaW5lIFVTQl9DVVJSRU5UX0FMVF9JTkRFWCAoLTEpCisKK3N0cnVjdCB1c2JfY29uZmlnX2Rlc2MgeworCWludAl1Y2RfY29uZmlnX2luZGV4OworCXVzYl9jb25maWdfZGVzY3JpcHRvcl90IHVjZF9kZXNjOworfTsKKworc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzYyB7CisJaW50CXVpZF9jb25maWdfaW5kZXg7CisJaW50CXVpZF9pbnRlcmZhY2VfaW5kZXg7CisJaW50CXVpZF9hbHRfaW5kZXg7CisJdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yX3QgdWlkX2Rlc2M7Cit9OworCitzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2MgeworCWludAl1ZWRfY29uZmlnX2luZGV4OworCWludAl1ZWRfaW50ZXJmYWNlX2luZGV4OworCWludAl1ZWRfYWx0X2luZGV4OworCWludAl1ZWRfZW5kcG9pbnRfaW5kZXg7CisJdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3JfdCB1ZWRfZGVzYzsKK307CisKK3N0cnVjdCB1c2JfZnVsbF9kZXNjIHsKKwlpbnQJdWZkX2NvbmZpZ19pbmRleDsKKwl1X2ludAl1ZmRfc2l6ZTsKKwl1X2NoYXIJKnVmZF9kYXRhOworfTsKKworc3RydWN0IHVzYl9zdHJpbmdfZGVzYyB7CisJaW50CXVzZF9zdHJpbmdfaW5kZXg7CisJaW50CXVzZF9sYW5ndWFnZV9pZDsKKwl1c2Jfc3RyaW5nX2Rlc2NyaXB0b3JfdCB1c2RfZGVzYzsKK307CisKK3N0cnVjdCB1c2JfY3RsX3JlcG9ydF9kZXNjIHsKKwlpbnQJdWNyZF9zaXplOworCXVfY2hhcgl1Y3JkX2RhdGFbMTAyNF07CS8qIGZpbGxlZCBkYXRhIHNpemUgd2lsbCB2YXJ5ICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7IHVfaW50MzJfdCBjb29raWU7IH0gdXNiX2V2ZW50X2Nvb2tpZV90OworCisjZGVmaW5lIFVTQl9NQVhfREVWTkFNRVMgNAorI2RlZmluZSBVU0JfTUFYX0RFVk5BTUVMRU4gMTYKK3N0cnVjdCB1c2JfZGV2aWNlX2luZm8geworCXVfaW50OF90CXVkaV9idXM7CisJdV9pbnQ4X3QJdWRpX2FkZHI7CS8qIGRldmljZSBhZGRyZXNzICovCisJdXNiX2V2ZW50X2Nvb2tpZV90IHVkaV9jb29raWU7CisJY2hhcgkJdWRpX3Byb2R1Y3RbVVNCX01BWF9TVFJJTkdfTEVOXTsKKwljaGFyCQl1ZGlfdmVuZG9yW1VTQl9NQVhfU1RSSU5HX0xFTl07CisJY2hhcgkJdWRpX3JlbGVhc2VbOF07CisJdV9pbnQxNl90CXVkaV9wcm9kdWN0Tm87CisJdV9pbnQxNl90CXVkaV92ZW5kb3JObzsKKwl1X2ludDE2X3QJdWRpX3JlbGVhc2VObzsKKwl1X2ludDhfdAl1ZGlfY2xhc3M7CisJdV9pbnQ4X3QJdWRpX3N1YmNsYXNzOworCXVfaW50OF90CXVkaV9wcm90b2NvbDsKKwl1X2ludDhfdAl1ZGlfY29uZmlnOworCXVfaW50OF90CXVkaV9zcGVlZDsKKyNkZWZpbmUgVVNCX1NQRUVEX1VOS05PV04JMAorI2RlZmluZSBVU0JfU1BFRURfTE9XCQkxCisjZGVmaW5lIFVTQl9TUEVFRF9GVUxMCQkyCisjZGVmaW5lIFVTQl9TUEVFRF9ISUdICQkzCisjZGVmaW5lIFVTQl9TUEVFRF9WQVJJQUJMRQk0CisjZGVmaW5lIFVTQl9TUEVFRF9TVVBFUgkJNQorCWludAkJdWRpX3Bvd2VyOwkvKiBwb3dlciBjb25zdW1wdGlvbiBpbiBtQSwgMCBpZiBzZWxmcG93ZXJlZCAqLworCWludAkJdWRpX25wb3J0czsKKwljaGFyCQl1ZGlfZGV2bmFtZXNbVVNCX01BWF9ERVZOQU1FU11bVVNCX01BWF9ERVZOQU1FTEVOXTsKKwl1X2ludDhfdAl1ZGlfcG9ydHNbMTZdOy8qIGh1YiBvbmx5OiBhZGRyZXNzZXMgb2YgZGV2aWNlcyBvbiBwb3J0cyAqLworI2RlZmluZSBVU0JfUE9SVF9FTkFCTEVEIDB4ZmYKKyNkZWZpbmUgVVNCX1BPUlRfU1VTUEVOREVEIDB4ZmUKKyNkZWZpbmUgVVNCX1BPUlRfUE9XRVJFRCAweGZkCisjZGVmaW5lIFVTQl9QT1JUX0RJU0FCTEVEIDB4ZmMKK307CisKK3N0cnVjdCB1c2JfY3RsX3JlcG9ydCB7CisJaW50CXVjcl9yZXBvcnQ7CisJdV9jaGFyCXVjcl9kYXRhWzEwMjRdOwkvKiBmaWxsZWQgZGF0YSBzaXplIHdpbGwgdmFyeSAqLworfTsKKworc3RydWN0IHVzYl9kZXZpY2Vfc3RhdHMgeworCXVfbG9uZwl1ZHNfcmVxdWVzdHNbNF07CS8qIGluZGV4ZWQgYnkgdHJhbnNmZXIgdHlwZSBVRV8qICovCit9OworCisjZGVmaW5lIFdVU0JfTUlOX0lFCQkJMHg4MAorI2RlZmluZSBXVVNCX1dDVEFfSUUJCQkweDgwCisjZGVmaW5lIFdVU0JfV0NPTk5FQ1RBQ0tfSUUJCTB4ODEKKyNkZWZpbmUgV1VTQl9XSE9TVElORk9fSUUJCTB4ODIKKyNkZWZpbmUgIFdVSElfR0VUX0NBKF9ibUF0dHJpYnV0ZXNfKSAoKF9ibUF0dHJpYnV0ZXNfKSAmIDB4MykKKyNkZWZpbmUgICBXVUhJX0NBX1JFQ09OTgkJMHgwMAorI2RlZmluZSAgIFdVSElfQ0FfTElNSVRFRAkJMHgwMQorI2RlZmluZSAgIFdVSElfQ0FfQUxMCQkJMHgwMworI2RlZmluZSAgV1VISV9HRVRfTUxTSShfYm1BdHRyaWJ1dGVzXykgKCgoX2JtQXR0cmlidXRlc18pICYgMHgzOCkgPj4gMykKKyNkZWZpbmUgV1VTQl9XQ0hDSEFOR0VBTk5PVU5DRV9JRQkweDgzCisjZGVmaW5lIFdVU0JfV0RFVl9ESVNDT05ORUNUX0lFCQkweDg0CisjZGVmaW5lIFdVU0JfV0hPU1RfRElTQ09OTkVDVF9JRQkweDg1CisjZGVmaW5lIFdVU0JfV1JFTEVBU0VfQ0hBTk5FTF9JRQkweDg2CisjZGVmaW5lIFdVU0JfV1dPUktfSUUJCQkweDg3CisjZGVmaW5lIFdVU0JfV0NIQU5ORUxfU1RPUF9JRQkJMHg4OAorI2RlZmluZSBXVVNCX1dERVZfS0VFUEFMSVZFX0lFCQkweDg5CisjZGVmaW5lIFdVU0JfV0lTT0NIX0RJU0NBUkRfSUUJCTB4OEEKKyNkZWZpbmUgV1VTQl9XUkVTRVRERVZJQ0VfSUUJCTB4OEIKKyNkZWZpbmUgV1VTQl9XWE1JVF9QQUNLRVRfQURKVVNUX0lFCTB4OEMKKyNkZWZpbmUgV1VTQl9NQVhfSUUJCQkweDhDCisKKy8qIERldmljZSBOb3RpZmljYXRpb24gVHlwZXMgKi8KKworI2RlZmluZSBXVVNCX0ROX01JTgkJCTB4MDEKKyNkZWZpbmUgV1VTQl9ETl9DT05ORUNUCQkJMHgwMQorIyBkZWZpbmUgV1VTQl9EQV9PTERDT05OCTB4MDAKKyMgZGVmaW5lIFdVU0JfREFfTkVXQ09OTgkweDAxCisjIGRlZmluZSBXVVNCX0RBX1NFTEZfQkVBQ09OCTB4MDIKKyMgZGVmaW5lIFdVU0JfREFfRElSX0JFQUNPTgkweDA0CisjIGRlZmluZSBXVVNCX0RBX05PX0JFQUNPTgkweDA2CisjZGVmaW5lIFdVU0JfRE5fRElTQ09OTkVDVAkJMHgwMgorI2RlZmluZSBXVVNCX0ROX0VQUkRZCQkJMHgwMworI2RlZmluZSBXVVNCX0ROX01BU0FWQUlMQ0hBTkdFRAkJMHgwNAorI2RlZmluZSBXVVNCX0ROX1JFTU9URVdBS0VVUAkJMHgwNQorI2RlZmluZSBXVVNCX0ROX1NMRUVQCQkJMHgwNgorI2RlZmluZSBXVVNCX0ROX0FMSVZFCQkJMHgwNworI2RlZmluZSBXVVNCX0ROX01BWAkJCTB4MDcKKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8cHNocGFjazEuaD4KKyNlbmRpZgorCisvKiBXVVNCIEhhbmRzaGFrZSBEYXRhLiAgVXNlZCBkdXJpbmcgdGhlIFNFVC9HRVQgSEFORFNIQUtFIHJlcXVlc3RzICovCit0eXBlZGVmIHN0cnVjdCB3dXNiX2huZHNoa19kYXRhIHsKKwl1Qnl0ZSBiTWVzc2FnZU51bWJlcjsKKwl1Qnl0ZSBiU3RhdHVzOworCXVCeXRlIHRUS0lEWzNdOworCXVCeXRlIGJSZXNlcnZlZDsKKwl1Qnl0ZSBDRElEWzE2XTsKKwl1Qnl0ZSBOb25jZVsxNl07CisJdUJ5dGUgTUlDWzhdOworfSBVUEFDS0VEIHd1c2JfaG5kc2hrX2RhdGFfdDsKKyNkZWZpbmUgV1VTQl9IQU5EU0hBS0VfTEVOX0ZPUl9NSUMJMzgKKworLyogV1VTQiBDb25uZWN0aW9uIENvbnRleHQgKi8KK3R5cGVkZWYgc3RydWN0IHd1c2JfY29ubl9jb250ZXh0IHsKKwl1Qnl0ZSBDSElEIFsxNl07CisJdUJ5dGUgQ0RJRCBbMTZdOworCXVCeXRlIENLIFsxNl07Cit9IFVQQUNLRUQgd3VzYl9jb25uX2NvbnRleHRfdDsKKworLyogV1VTQiBTZWN1cml0eSBEZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCB3dXNiX3NlY3VyaXR5X2Rlc2MgeworCXVCeXRlIGJMZW5ndGg7CisJdUJ5dGUgYkRlc2NyaXB0b3JUeXBlOworCXVXb3JkIHdUb3RhbExlbmd0aDsKKwl1Qnl0ZSBiTnVtRW5jcnlwdGlvblR5cGVzOworfSBVUEFDS0VEIHd1c2Jfc2VjdXJpdHlfZGVzY190OworCisvKiBXVVNCIEVuY3J5cHRpb24gVHlwZSBEZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCB3dXNiX2VuY3J5cHRfdHlwZV9kZXNjIHsKKwl1Qnl0ZSBiTGVuZ3RoOworCXVCeXRlIGJEZXNjcmlwdG9yVHlwZTsKKworCXVCeXRlIGJFbmNyeXB0aW9uVHlwZTsKKyNkZWZpbmUgV1VFVERfVU5TRUNVUkUJCTAKKyNkZWZpbmUgV1VFVERfV0lSRUQJCTEKKyNkZWZpbmUgV1VFVERfQ0NNXzEJCTIKKyNkZWZpbmUgV1VFVERfUlNBXzEJCTMKKworCXVCeXRlIGJFbmNyeXB0aW9uVmFsdWU7CisJdUJ5dGUgYkF1dGhLZXlJbmRleDsKK30gVVBBQ0tFRCB3dXNiX2VuY3J5cHRfdHlwZV9kZXNjX3Q7CisKKy8qIFdVU0IgS2V5IERlc2NyaXB0b3IgKi8KK3R5cGVkZWYgc3RydWN0IHd1c2Jfa2V5X2Rlc2MgeworCXVCeXRlIGJMZW5ndGg7CisJdUJ5dGUgYkRlc2NyaXB0b3JUeXBlOworCXVCeXRlIHRUS0lEWzNdOworCXVCeXRlIGJSZXNlcnZlZDsKKwl1Qnl0ZSBLZXlEYXRhWzFdOwkvKiB2YXJpYWJsZSBsZW5ndGggKi8KK30gVVBBQ0tFRCB3dXNiX2tleV9kZXNjX3Q7CisKKy8qIFdVU0IgQk9TIERlc2NyaXB0b3IgKEJpbmFyeSBkZXZpY2UgT2JqZWN0IFN0b3JlKSAqLwordHlwZWRlZiBzdHJ1Y3Qgd3VzYl9ib3NfZGVzYyB7CisJdUJ5dGUgYkxlbmd0aDsKKwl1Qnl0ZSBiRGVzY3JpcHRvclR5cGU7CisJdVdvcmQgd1RvdGFsTGVuZ3RoOworCXVCeXRlIGJOdW1EZXZpY2VDYXBzOworfSBVUEFDS0VEIHd1c2JfYm9zX2Rlc2NfdDsKKworI2RlZmluZSBVU0JfREVWSUNFX0NBUEFCSUxJVFlfMjBfRVhURU5TSU9OCTB4MDIKK3R5cGVkZWYgc3RydWN0IHVzYl9kZXZfY2FwXzIwX2V4dF9kZXNjIHsKKwl1Qnl0ZSBiTGVuZ3RoOworCXVCeXRlIGJEZXNjcmlwdG9yVHlwZTsKKwl1Qnl0ZSBiRGV2Q2FwYWJpbGl0eVR5cGU7CisjZGVmaW5lIFVTQl8yMF9FWFRfTFBNCQkJCTB4MDIKKwl1RFdvcmQgYm1BdHRyaWJ1dGVzOworfSBVUEFDS0VEIHVzYl9kZXZfY2FwXzIwX2V4dF9kZXNjX3Q7CisKKyNkZWZpbmUgVVNCX0RFVklDRV9DQVBBQklMSVRZX1NTX1VTQgkJMHgwMwordHlwZWRlZiBzdHJ1Y3QgdXNiX2Rldl9jYXBfc3NfdXNiIHsKKwl1Qnl0ZSBiTGVuZ3RoOworCXVCeXRlIGJEZXNjcmlwdG9yVHlwZTsKKwl1Qnl0ZSBiRGV2Q2FwYWJpbGl0eVR5cGU7CisjZGVmaW5lIFVTQl9EQ19TU19VU0JfTFRNX0NBUEFCTEUJCTB4MDIKKwl1Qnl0ZSBibUF0dHJpYnV0ZXM7CisjZGVmaW5lIFVTQl9EQ19TU19VU0JfU1BFRURfU1VQUE9SVF9MT1cJCTB4MDEKKyNkZWZpbmUgVVNCX0RDX1NTX1VTQl9TUEVFRF9TVVBQT1JUX0ZVTEwJMHgwMgorI2RlZmluZSBVU0JfRENfU1NfVVNCX1NQRUVEX1NVUFBPUlRfSElHSAkweDA0CisjZGVmaW5lIFVTQl9EQ19TU19VU0JfU1BFRURfU1VQUE9SVF9TUwkJMHgwOAorCXVXb3JkIHdTcGVlZHNTdXBwb3J0ZWQ7CisJdUJ5dGUgYkZ1bmN0aW9uYWxpdHlTdXBwb3J0OworCXVCeXRlIGJVMURldkV4aXRMYXQ7CisJdVdvcmQgd1UyRGV2RXhpdExhdDsKK30gVVBBQ0tFRCB1c2JfZGV2X2NhcF9zc191c2JfdDsKKworI2RlZmluZSBVU0JfREVWSUNFX0NBUEFCSUxJVFlfQ09OVEFJTkVSX0lECTB4MDQKK3R5cGVkZWYgc3RydWN0IHVzYl9kZXZfY2FwX2NvbnRhaW5lcl9pZCB7CisJdUJ5dGUgYkxlbmd0aDsKKwl1Qnl0ZSBiRGVzY3JpcHRvclR5cGU7CisJdUJ5dGUgYkRldkNhcGFiaWxpdHlUeXBlOworCXVCeXRlIGJSZXNlcnZlZDsKKwl1Qnl0ZSBjb250YWluZXJJRFsxNl07Cit9IFVQQUNLRUQgdXNiX2Rldl9jYXBfY29udGFpbmVyX2lkX3Q7CisKKy8qIERldmljZSBDYXBhYmlsaXR5IFR5cGUgQ29kZXMgKi8KKyNkZWZpbmUgV1VTQl9ERVZJQ0VfQ0FQQUJJTElUWV9XSVJFTEVTU19VU0IgMHgwMQorCisvKiBEZXZpY2UgQ2FwYWJpbGl0eSBEZXNjcmlwdG9yICovCit0eXBlZGVmIHN0cnVjdCB3dXNiX2Rldl9jYXBfZGVzYyB7CisJdUJ5dGUgYkxlbmd0aDsKKwl1Qnl0ZSBiRGVzY3JpcHRvclR5cGU7CisJdUJ5dGUgYkRldkNhcGFiaWxpdHlUeXBlOworCXVCeXRlIGNhcHNbMV07CS8qIFZhcmlhYmxlIGxlbmd0aCAqLworfSBVUEFDS0VEIHd1c2JfZGV2X2NhcF9kZXNjX3Q7CisKKy8qIERldmljZSBDYXBhYmlsaXR5IERlc2NyaXB0b3IgKi8KK3R5cGVkZWYgc3RydWN0IHd1c2JfZGV2X2NhcF91d2JfZGVzYyB7CisJdUJ5dGUgYkxlbmd0aDsKKwl1Qnl0ZSBiRGVzY3JpcHRvclR5cGU7CisJdUJ5dGUgYkRldkNhcGFiaWxpdHlUeXBlOworCXVCeXRlIGJtQXR0cmlidXRlczsKKwl1V29yZCB3UEhZUmF0ZXM7CS8qIEJpdG1hcCAqLworCXVCeXRlIGJtVEZJVFhQb3dlckluZm87CisJdUJ5dGUgYm1GRklUWFBvd2VySW5mbzsKKwl1V29yZCBibUJhbmRHcm91cDsKKwl1Qnl0ZSBiUmVzZXJ2ZWQ7Cit9IFVQQUNLRUQgd3VzYl9kZXZfY2FwX3V3Yl9kZXNjX3Q7CisKKy8qIFdpcmVsZXNzIFVTQiBFbmRwb2ludCBDb21wYW5pb24gRGVzY3JpcHRvciAqLwordHlwZWRlZiBzdHJ1Y3Qgd3VzYl9lbmRwb2ludF9jb21wYW5pb25fZGVzYyB7CisJdUJ5dGUgYkxlbmd0aDsKKwl1Qnl0ZSBiRGVzY3JpcHRvclR5cGU7CisJdUJ5dGUgYk1heEJ1cnN0OworCXVCeXRlIGJNYXhTZXF1ZW5jZTsKKwl1V29yZCB3TWF4U3RyZWFtRGVsYXk7CisJdVdvcmQgd092ZXJUaGVBaXJQYWNrZXRTaXplOworCXVCeXRlIGJPdmVyVGhlQWlySW50ZXJ2YWw7CisJdUJ5dGUgYm1Db21wQXR0cmlidXRlczsKK30gVVBBQ0tFRCB3dXNiX2VuZHBvaW50X2NvbXBhbmlvbl9kZXNjX3Q7CisKKy8qIFdpcmVsZXNzIFVTQiBOdW1lcmljIEFzc29jaWF0aW9uIE0xIERhdGEgU3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCB3dXNiX20xX2RhdGEgeworCXVCeXRlIHZlcnNpb247CisJdVdvcmQgbGFuZ0lkOworCXVCeXRlIGRldmljZUZyaWVuZGx5TmFtZUxlbmd0aDsKKwl1Qnl0ZSBzaGFfMjU2X20zWzMyXTsKKwl1Qnl0ZSBkZXZpY2VGcmllbmRseU5hbWVbMjU2XTsKK30gVVBBQ0tFRCB3dXNiX20xX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgd3VzYl9tMl9kYXRhIHsKKwl1Qnl0ZSB2ZXJzaW9uOworCXVXb3JkIGxhbmdJZDsKKwl1Qnl0ZSBob3N0RnJpZW5kbHlOYW1lTGVuZ3RoOworCXVCeXRlIHBraFszODRdOworCXVCeXRlIGhvc3RGcmllbmRseU5hbWVbMjU2XTsKK30gVVBBQ0tFRCB3dXNiX20yX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgd3VzYl9tM19kYXRhIHsKKwl1Qnl0ZSBwa2RbMzg0XTsKKwl1Qnl0ZSBuZDsKK30gVVBBQ0tFRCB3dXNiX20zX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgd3VzYl9tNF9kYXRhIHsKKwl1RFdvcmQgX2F0dHJpYnV0ZVR5cGVJZEFuZExlbmd0aF8xOworCXVXb3JkICBhc3NvY2lhdGlvblR5cGVJZDsKKworCXVEV29yZCBfYXR0cmlidXRlVHlwZUlkQW5kTGVuZ3RoXzI7CisJdVdvcmQgIGFzc29jaWF0aW9uU3ViVHlwZUlkOworCisJdURXb3JkIF9hdHRyaWJ1dGVUeXBlSWRBbmRMZW5ndGhfMzsKKwl1RFdvcmQgbGVuZ3RoOworCisJdURXb3JkIF9hdHRyaWJ1dGVUeXBlSWRBbmRMZW5ndGhfNDsKKwl1RFdvcmQgYXNzb2NpYXRpb25TdGF0dXM7CisKKwl1RFdvcmQgX2F0dHJpYnV0ZVR5cGVJZEFuZExlbmd0aF81OworCXVCeXRlICBjaGlkWzE2XTsKKworCXVEV29yZCBfYXR0cmlidXRlVHlwZUlkQW5kTGVuZ3RoXzY7CisJdUJ5dGUgIGNkaWRbMTZdOworCisJdURXb3JkIF9hdHRyaWJ1dGVUeXBlSWRBbmRMZW5ndGhfNzsKKwl1Qnl0ZSAgYmFuZEdyb3Vwc1syXTsKK30gVVBBQ0tFRCB3dXNiX200X2RhdGFfdDsKKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8cG9wcGFjay5oPgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfVVNCX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggMDYwZTBlMi4uNWQyZDkyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwpAQCAtMjcsNiArMjcsMTEgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHhoY2ktaGNkLgogCitjb25maWcgVVNCX1hIQ0lfUExBVEZPUk0KKyAgICAgICAgdHJpc3RhdGUKKyAgICAgICAgZGVwZW5kcyBvbiBVU0JfWEhDSV9IQ0QKKwlkZWZhdWx0IHkKKwogY29uZmlnIFVTQl9YSENJX0hDRF9ERUJVR0dJTkcKIAlib29sICJEZWJ1Z2dpbmcgZm9yIHRoZSB4SENJIGhvc3QgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIFVTQl9YSENJX0hDRApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKaW5kZXggN2NhMjkwZi4uMzgzZmMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCkBAIC0xNSw2ICsxNSwxMCBAQAogeGhjaS1oY2QteSArPSB4aGNpLXJpbmcubyB4aGNpLWh1Yi5vIHhoY2ktZGJnLm8KIHhoY2ktaGNkLSQoQ09ORklHX1BDSSkJKz0geGhjaS1wY2kubwogCitpZm5lcSAoJChDT05GSUdfVVNCX1hIQ0lfUExBVEZPUk0pLCApCisJeGhjaS1oY2QteQkJKz0geGhjaS1wbGF0Lm8geGhjaS1jb21jZXJ0bzIwMDAubworZW5kaWYKKwogb2JqLSQoQ09ORklHX1VTQl9XSENJX0hDRCkJKz0gd2hjaS8KIAogb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS1xdWlya3MubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWNvbWNlcnRvMjAwMC5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWNvbWNlcnRvMjAwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTJjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktY29tY2VydG8yMDAwLmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiB4aGNpLWNvbWNlcnRvLmMgLSBDb21jZXJ0by0yMDAwIFBsYXRmb3JtIHNwZWNpZmljIHJvdXRpZW5lcy4KKyAqCisgKiBBdXRob3I6IE1ha2FyYW5kIFBhd2FnaQorICovCisKKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJ4aGNpLmgiCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCitleHRlcm4gaW50IHVzYjNfY2xrX2ludGVybmFsOworLyogVVNCIDMuMCBjbG9jayAqLworc3RhdGljIHN0cnVjdCBjbGsgKnVzYjNfY2xrOworCisjaWZkZWYgQ09ORklHX1BNCisKK3UzMiB1c2IzX3N1c3BlbmRlZCA9IDA7CisKK2ludCBjb21jZXJ0b194aGNpX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJaW50IGVycm9yX3N0YXR1cyA9IDA7CisJaW50IHZhbDsKKworCWlmICh1c2IzX3N1c3BlbmRlZCkgeworCQlwcl9lcnIoImNvbWNlcnRvX3hoY2lfYnVzX3N1c3BlbmQ6IFVTQiAzLjAgQWxyZWFkeSBTdXNwZW5kZWQgXG4iKTsKKwkJcmV0dXJuIGVycm9yX3N0YXR1czsKKwl9CisKKwllcnJvcl9zdGF0dXMgPSB4aGNpX2J1c19zdXNwZW5kKGhjZCk7CisKKwlpZiAoIWVycm9yX3N0YXR1cykgeworCisJCS8qIEFQUExZSU5HIFRIRSBSRVNFVCBUTyBVU0IzIFVUTUkgKi8KKwkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VUTUlfVVNCMSwgMSk7CisKKwkJLyogQVBQTFlJTkcgVEhFIFJFU0VUIFRPIFVTQjMgUEhZICovCisJCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VU0IxX1BIWSwgMSk7CisKKwkJLyogRGlzYWJsZSB0aGUgQ2xvY2sgKi8KKwkJY2xrX2Rpc2FibGUodXNiM19jbGspOworCisJCXVzYjNfc3VzcGVuZGVkID0gMTsKKwl9CisKKwlyZXR1cm4gZXJyb3Jfc3RhdHVzOworfQorCitpbnQgY29tY2VydG9feGhjaV9idXNfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJaW50IHZhbDsKKwlpbnQgZXJyb3Jfc3RhdHVzID0gMDsKKworCWlmICghdXNiM19zdXNwZW5kZWQpIHsKKwkJcHJfZXJyKCJjb21jZXJ0b194aGNpX2J1c19yZXN1bWU6IFVTQiAzLjAgQWxyZWFkeSBpbiBSZXN1bWUgc3RhdGUgXG4iKTsKKwkJcmV0dXJuIGVycm9yX3N0YXR1czsKKwl9CisKKwkvKiBFbmFibGUgdGhlIENsb2NrICovCisJaWYgKGNsa19lbmFibGUodXNiM19jbGspKXsKKwkJcHJfZXJyKCJjb21jZXJ0b19zdGFydF94aGM6VW5hYmxlIHRvIGVuYWJsZSB0aGUgdXNiMSBjbG9jayBcbiIpOworCX0KKworCS8qIEJyaW5nIHVzYjMgUEhZIG91dCBvZiByZXNldCAqLworCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VU0IxX1BIWSwgMCk7CisKKwlmb3IgKHZhbCA9IDAgOyB2YWwgPCA1MCA7IHZhbCsrKQorCQl1ZGVsYXkoMTAwMCk7CisKKyAgICAvKiBCcmluZyB1c2IzIFVUTUkgb3V0IG9mIHJlc2V0ICovCisJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VUTUlfVVNCMSwgMCk7CisKKwlmb3IgKHZhbCA9IDAgOyB2YWwgPCA1MCA7IHZhbCsrKQorCQl1ZGVsYXkoMTAwMCk7CisKKwllcnJvcl9zdGF0dXMgPSB4aGNpX2J1c19yZXN1bWUoaGNkKTsKKworCWlmIChlcnJvcl9zdGF0dXMpIHsKKwkJLyogeGhjaV9idXNfcmVzdW1lIGlzIG5vdCBzdWNjZXNzZnVsbCBrZWVwIFVTQjMgaW4gc3VzcGVuZCBtb2RlICovCisKKwkJLyogUHV0IFVTQjMgUEhZLCBVVE1JIGFuZCBDb250cm9sbGVyIGluIFJlc2V0ICovCisKKwkJLyogQVBQTFlJTkcgVEhFIFJFU0VUIFRPIFVTQjMgVVRNSSAqLworCQljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfVVRNSV9VU0IxLCAxKTsKKworCQkvKiBBUFBMWUlORyBUSEUgUkVTRVQgVE8gVVNCMyBQSFkgKi8KKwkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VTQjFfUEhZLCAxKTsKKworCQkvKiBEaXNhYmxlIHRoZSBDbG9jayAqLworCQljbGtfZGlzYWJsZSh1c2IzX2Nsayk7CisKKwkJcmV0dXJuIGVycm9yX3N0YXR1czsKKwl9CisKKwl1c2IzX3N1c3BlbmRlZCA9IDA7CisKKwlyZXR1cm4gZXJyb3Jfc3RhdHVzOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3VzYjNfcGh5X2luaXQodm9pZCkKK3sKKwl1MzIgdmFsOworCisgICAgICAgIHdyaXRlbCgweDAwRTAwMDgwLCBVU0IzX1BIWV9CQVNFICsgMHgxMCk7CisKKwkvL0NvbmZpZ3VyYXRpb24gZm9yIGludGVybmFsIGNsb2NrCisJaWYodXNiM19jbGtfaW50ZXJuYWwpCisJeworCQlwcmludGsoS0VSTl9JTkZPICJVU0IzLjAgY2xvY2sgc2VsZWN0ZWQ6IGludGVybmFsXG4iLCBfX2Z1bmNfXyk7CisKKwkJaWYoSEFMX2dldF9yZWZfY2xrKCkgPT0gUkVGX0NMS18yNE1IWikKKwkJCXZhbCA9IDB4NDIwRTgyQTg7CisJCWVsc2UKKwkJCXZhbCA9IDB4NDIwRTgyQTk7CisJfQorCWVsc2UKKwl7CisJCXZhbCA9IDB4NDIwOTkyN0E7CisJCXByaW50ayhLRVJOX0lORk8gIlVTQjMuMCBjbG9jayBzZWxlY3RlZDogZXh0ZXJuYWxcbiIsIF9fZnVuY19fKTsKKwl9CisKKwl3cml0ZWwodmFsLCBVU0IzX1BIWV9CQVNFICsgMHgyMCk7CisgICAgICAgIHdyaXRlbCgweDY5QzM0RjUzLCBVU0IzX1BIWV9CQVNFICsgMHgyNCk7CisgICAgICAgIHdyaXRlbCgweDAwMDVEODE1LCBVU0IzX1BIWV9CQVNFICsgMHgyOCk7CisgICAgICAgIHdyaXRlbCgweDAwMDAwODAxLCBVU0IzX1BIWV9CQVNFICsgMHgyQyk7Cit9CisKKwordm9pZCBjb21jZXJ0b19zdGFydF94aGNpKHZvaWQpCit7CisgICAgICAgIHUzMiB2YWw7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiIyMjICVzXG4iLCBfX2Z1bmNfXyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DMktfTUZDTl9FVk0pCisJcHJpbnRrKCIlczogUmVzZXRpbmcgdXNiMy4uLlxuIiwgX19mdW5jX18pOworCUdQSU9fcmVzZXRfZXh0ZXJuYWxfZGV2aWNlKENPTVBPTkVOVF9VU0JfSFVCLCAwKTsKKyNlbmRpZgorCQkvKiBFbmFibGUgdGhlIFVTQiAzLjAgY29udHJvbGxlciBjbG9jayAqLworCQkvKiBHZXQgdGhlIHVzYjMgY2xvY2sgc3RydWN0dXJlICAqLworCQl1c2IzX2NsayA9IGNsa19nZXQoTlVMTCwidXNiMSIpOworCisJCS8qIEVuYWJsZSB0aGUgQ2xvY2sgKi8KKwkJaWYgKGNsa19lbmFibGUodXNiM19jbGspKXsKKwkJCXByX2VycigiY29tY2VydG9fc3RhcnRfeGhjaTpVbmFibGUgdG8gZW5hYmxlIHRoZSB1c2IxIGNsb2NrIFxuIik7CisJCX0KKworCQkvKiBBUFBMWUlORyBUSEUgUkVTRVQgVE8gVVNCMyBVVE1JICovCisJCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VVE1JX1VTQjEsIDEpOworCisJCS8qIEFQUExZSU5HIFRIRSBSRVNFVCBUTyBVU0IzIFBIWSAqLworCQljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfVVNCMV9QSFksIDEpOworCisJCS8qIEFQTExZSU5HIFJFU0VUIFRPIFVTQjMgQVhJIFJFU0VUICovCisJCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9BWElfVVNCMSwgMSk7CisKKwkJY29tY2VydG9fdXNiM19waHlfaW5pdCgpOworCisKKwkJLyogQnJpbmcgdXNiMyBQSFkgb3V0IG9mIHJlc2V0ICovCisJCWMyMDAwX2Jsb2NrX3Jlc2V0KENPTVBPTkVOVF9VU0IxX1BIWSwgMCk7CisKKwkJdWRlbGF5KDEwMDApOworCisJCS8qIEJyaW5nIHVzYjMgVVRNSSBvdXQgb2YgcmVzZXQgKi8KKwkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VUTUlfVVNCMSwgMCk7CisKKwkJdWRlbGF5KDEwMDApOworCisJCS8qIEJyaW5nIHVzYjMgQ29udHJvbGxlciBvdXQgb2YgcmVzZXQgKi8KKwkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX0FYSV9VU0IxLCAwKTsKKworCQl1ZGVsYXkoMTAwMCk7Cit9CisKK3ZvaWQgY29tY2VydG9fc3RvcF94aGNpKHZvaWQpCit7CisgICAgICAgIHUzMiB2YWw7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiIyMjICVzXG4iLCBfX2Z1bmNfXyk7CisKKwkJLyogQVBQTFlJTkcgVEhFIFJFU0VUIFRPIFVTQjMgVVRNSSAqLworCQljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfVVRNSV9VU0IxLCAxKTsKKworCQkvKiBBUFBMWUlORyBUSEUgUkVTRVQgVE8gVVNCMyBQSFkgKi8KKwkJYzIwMDBfYmxvY2tfcmVzZXQoQ09NUE9ORU5UX1VTQjFfUEhZLCAxKTsKKworCQkvKiBBUExMWUlORyBSRVNFVCBUTyBVU0IzIEFYSSBSRVNFVCAqLworCQljMjAwMF9ibG9ja19yZXNldChDT01QT05FTlRfQVhJX1VTQjEsIDEpOworCisJCS8qIERpc2FibGUgdGhlIENsb2NrICovCisJCWNsa19kaXNhYmxlKHVzYjNfY2xrKTsKKworCQkvKiBSZWxlYXNlIHRoZSBjbG9jayAqLworCQljbGtfcHV0KHVzYjNfY2xrKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWNvbWNlcnRvMjAwMC5oIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWNvbWNlcnRvMjAwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjM2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktY29tY2VydG8yMDAwLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIHhoY2ktY29tY2VydG8uaCAtIENvbWNlcnRvLTIwMDAgUGxhdGZvcm0gc3BlY2lmaWMgcm91dGllbmVzLgorICoKKyAqIEF1dGhvcjogTWFrYXJhbmQgUGF3YWdpCisgKi8KKworCisjaWZuZGVmIF9fWEhDSV9DT01DRVJUT18yMDAwX0hfXworI2RlZmluZSBfX1hIQ0lfQ09NQ0VSVE9fMjAwMF9IX18KKworCisKKy8qIEV4cG9ydGVkIEZ1bmN0aW9ucyAqLworCisKK2V4dGVybiB2b2lkIGNvbWNlcnRvX3N0YXJ0X3hoY2kodm9pZCk7CitleHRlcm4gdm9pZCBjb21jZXJ0b19zdG9wX3hoY2kodm9pZCk7CisKK2V4dGVybiBpbnQgY29tY2VydG9feGhjaV9idXNfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpOworZXh0ZXJuIGludCBjb21jZXJ0b194aGNpX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpOworCisKKworI2VuZGlmIC8qIF9fWEhDSV9DT01DRVJUT18yMDAwX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWRiZy5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWRiZy5jCmluZGV4IGU5YjBmMDQuLjRiNDM2ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1kYmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktZGJnLmMKQEAgLTExOSw3ICsxMTksNyBAQAogCXhoY2lfZGJnKHhoY2ksICIgIEV2ZW50IEludGVycnVwdHMgJXNcbiIsCiAJCQkodGVtcCAmIENNRF9FSUUpID8gImVuYWJsZWQgIiA6ICJkaXNhYmxlZCIpOwogCXhoY2lfZGJnKHhoY2ksICIgIEhvc3QgU3lzdGVtIEVycm9yIEludGVycnVwdHMgJXNcbiIsCi0JCQkodGVtcCAmIENNRF9FSUUpID8gImVuYWJsZWQgIiA6ICJkaXNhYmxlZCIpOworCQkJKHRlbXAgJiBDTURfSFNFSUUpID8gImVuYWJsZWQgIiA6ICJkaXNhYmxlZCIpOwogCXhoY2lfZGJnKHhoY2ksICIgIEhDIGhhcyAlc2ZpbmlzaGVkIGxpZ2h0IHJlc2V0XG4iLAogCQkJKHRlbXAgJiBDTURfTFJFU0VUKSA/ICJub3QgIiA6ICIiKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYwppbmRleCBmZDhhMmMyLi43OGU5OGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCkBAIC01NywxMCArNTcsOCBAQAogCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOwogCiAJZGVzYy0+Yk5iclBvcnRzID0gcG9ydHM7Ci0JLyogVWdoLCB0aGVzZSBzaG91bGQgYmUgI2RlZmluZXMsIEZJWE1FICovCi0JLyogVXNpbmcgdGFibGUgMTEtMTMgaW4gVVNCIDIuMCBzcGVjLiAqLwogCXRlbXAgPSAwOwotCS8qIEJpdHMgMTowIC0gc3VwcG9ydCBwb3J0IHBvd2VyIHN3aXRjaGluZywgb3IgcG93ZXIgYWx3YXlzIG9uICovCisJLyogQml0cyAxOjAgLSBzdXBwb3J0IHBlci1wb3J0IHBvd2VyIHN3aXRjaGluZywgb3IgcG93ZXIgYWx3YXlzIG9uICovCiAJaWYgKEhDQ19QUEMoeGhjaS0+aGNjX3BhcmFtcykpCiAJCXRlbXAgfD0gMHgwMDAxOwogCWVsc2UKQEAgLTg2LDkgKzg0LDkgQEAKIAlwb3J0cyA9IHhoY2ktPm51bV91c2IyX3BvcnRzOwogCiAJeGhjaV9jb21tb25faHViX2Rlc2NyaXB0b3IoeGhjaSwgZGVzYywgcG9ydHMpOwotCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0hVQjsKIAl0ZW1wID0gMSArIChwb3J0cyAvIDgpOwotCWRlc2MtPmJEZXNjTGVuZ3RoID0gNyArIDIgKiB0ZW1wOworCWRlc2MtPmJEZXNjTGVuZ3RoID0gVVNCX0RUX0hVQl9OT05WQVJfU0laRSArIDIgKiB0ZW1wOwogCiAJLyogVGhlIERldmljZSBSZW1vdmFibGUgYml0cyBhcmUgcmVwb3J0ZWQgb24gYSBieXRlIGdyYW51bGFyaXR5LgogCSAqIElmIHRoZSBwb3J0IGRvZXNuJ3QgZXhpc3Qgd2l0aGluIHRoYXQgYnl0ZSwgdGhlIGJpdCBpcyBzZXQgdG8gMC4KQEAgLTEzNyw4ICsxMzUsOCBAQAogCiAJcG9ydHMgPSB4aGNpLT5udW1fdXNiM19wb3J0czsKIAl4aGNpX2NvbW1vbl9odWJfZGVzY3JpcHRvcih4aGNpLCBkZXNjLCBwb3J0cyk7Ci0JZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyYTsKLQlkZXNjLT5iRGVzY0xlbmd0aCA9IDEyOworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TU19IVUI7CisJZGVzYy0+YkRlc2NMZW5ndGggPSBVU0JfRFRfU1NfSFVCX1NJWkU7CiAKIAkvKiBoZWFkZXIgZGVjb2RlIGxhdGVuY3kgc2hvdWxkIGJlIHplcm8gZm9yIHJvb3RodWJzLAogCSAqIHNlZSBzZWN0aW9uIDQuMjMuNS4yLgpAQCAtNDI0LDYgKzQyMiwzNCBAQAogCXhoY2lfd3JpdGVsKHhoY2ksIHRlbXAsIHBvcnRfYXJyYXlbcG9ydF9pZF0pOwogfQogCisjaWYgMAordm9pZCB4aGNpX3NldF9yZW1vdGVfd2FrZV9tYXNrKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKKwkJX19sZTMyIF9faW9tZW0gKipwb3J0X2FycmF5LCBpbnQgcG9ydF9pZCwgdTE2IHdha2VfbWFzaykKK3sKKwl1MzIgdGVtcDsKKworCXRlbXAgPSB4aGNpX3JlYWRsKHhoY2ksIHBvcnRfYXJyYXlbcG9ydF9pZF0pOworCXRlbXAgPSB4aGNpX3BvcnRfc3RhdGVfdG9fbmV1dHJhbCh0ZW1wKTsKKworCWlmICh3YWtlX21hc2sgJiBVU0JfUE9SVF9GRUFUX1JFTU9URV9XQUtFX0NPTk5FQ1QpCisJCXRlbXAgfD0gUE9SVF9XS0NPTk5fRTsKKwllbHNlCisJCXRlbXAgJj0gflBPUlRfV0tDT05OX0U7CisKKwlpZiAod2FrZV9tYXNrICYgVVNCX1BPUlRfRkVBVF9SRU1PVEVfV0FLRV9ESVNDT05ORUNUKQorCQl0ZW1wIHw9IFBPUlRfV0tESVNDX0U7CisJZWxzZQorCQl0ZW1wICY9IH5QT1JUX1dLRElTQ19FOworCisJaWYgKHdha2VfbWFzayAmIFVTQl9QT1JUX0ZFQVRfUkVNT1RFX1dBS0VfT1ZFUl9DVVJSRU5UKQorCQl0ZW1wIHw9IFBPUlRfV0tPQ19FOworCWVsc2UKKwkJdGVtcCAmPSB+UE9SVF9XS09DX0U7CisKKwl4aGNpX3dyaXRlbCh4aGNpLCB0ZW1wLCBwb3J0X2FycmF5W3BvcnRfaWRdKTsKK30KKyNlbmRpZgorCiAvKiBUZXN0IGFuZCBjbGVhciBwb3J0IFJXQyBiaXQgKi8KIHZvaWQgeGhjaV90ZXN0X2FuZF9jbGVhcl9iaXQoc3RydWN0IHhoY2lfaGNkICp4aGNpLCBfX2xlMzIgX19pb21lbSAqKnBvcnRfYXJyYXksCiAJCQkJaW50IHBvcnRfaWQsIHUzMiBwb3J0X2JpdCkKQEAgLTQ4Niw2ICs1MTIsNyBAQAogCWludCBzbG90X2lkOwogCXN0cnVjdCB4aGNpX2J1c19zdGF0ZSAqYnVzX3N0YXRlOwogCXUxNiBsaW5rX3N0YXRlID0gMDsKKwl1MTYgd2FrZV9tYXNrID0gMDsKIAogCW1heF9wb3J0cyA9IHhoY2lfZ2V0X3BvcnRzKGhjZCwgJnBvcnRfYXJyYXkpOwogCWJ1c19zdGF0ZSA9ICZ4aGNpLT5idXNfc3RhdGVbaGNkX2luZGV4KGhjZCldOwpAQCAtNjI3LDYgKzY1NCw4IEBACiAJY2FzZSBTZXRQb3J0RmVhdHVyZToKIAkJaWYgKHdWYWx1ZSA9PSBVU0JfUE9SVF9GRUFUX0xJTktfU1RBVEUpCiAJCQlsaW5rX3N0YXRlID0gKHdJbmRleCAmIDB4ZmYwMCkgPj4gMzsKKwkJaWYgKHdWYWx1ZSA9PSBVU0JfUE9SVF9GRUFUX1JFTU9URV9XQUtFX01BU0spCisJCQl3YWtlX21hc2sgPSB3SW5kZXggJiAweGZmMDA7CiAJCXdJbmRleCAmPSAweGZmOwogCQlpZiAoIXdJbmRleCB8fCB3SW5kZXggPiBtYXhfcG9ydHMpCiAJCQlnb3RvIGVycm9yOwpAQCAtNzM3LDYgKzc2NiwxNiBAQAogCQkJdGVtcCA9IHhoY2lfcmVhZGwoeGhjaSwgcG9ydF9hcnJheVt3SW5kZXhdKTsKIAkJCXhoY2lfZGJnKHhoY2ksICJzZXQgcG9ydCByZXNldCwgYWN0dWFsIHBvcnQgJWQgc3RhdHVzICA9IDB4JXhcbiIsIHdJbmRleCwgdGVtcCk7CiAJCQlicmVhazsKKyNpZiAwCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9SRU1PVEVfV0FLRV9NQVNLOgorCQkJeGhjaV9zZXRfcmVtb3RlX3dha2VfbWFzayh4aGNpLCBwb3J0X2FycmF5LAorCQkJCQl3SW5kZXgsIHdha2VfbWFzayk7CisJCQl0ZW1wID0geGhjaV9yZWFkbCh4aGNpLCBwb3J0X2FycmF5W3dJbmRleF0pOworCQkJeGhjaV9kYmcoeGhjaSwgInNldCBwb3J0IHJlbW90ZSB3YWtlIG1hc2ssICIKKwkJCQkJImFjdHVhbCBwb3J0ICVkIHN0YXR1cyAgPSAweCV4XG4iLAorCQkJCQl3SW5kZXgsIHRlbXApOworCQkJYnJlYWs7CisjZW5kaWYKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX0JIX1BPUlRfUkVTRVQ6CiAJCQl0ZW1wIHw9IFBPUlRfV1I7CiAJCQl4aGNpX3dyaXRlbCh4aGNpLCB0ZW1wLCBwb3J0X2FycmF5W3dJbmRleF0pOwpAQCAtOTE3LDYgKzk1NiwxMCBAQAogCQkJdDIgfD0gUE9SVF9MSU5LX1NUUk9CRSB8IFhERVZfVTM7CiAJCQlzZXRfYml0KHBvcnRfaW5kZXgsICZidXNfc3RhdGUtPmJ1c19zdXNwZW5kZWQpOwogCQl9CisJCS8qIFVTQiBjb3JlIHNldHMgcmVtb3RlIHdha2UgbWFzayBmb3IgVVNCIDMuMCBodWJzLAorCQkgKiBpbmNsdWRpbmcgdGhlIFVTQiAzLjAgcm9vdGh1YiwgYnV0IG9ubHkgaWYgQ09ORklHX1VTQl9TVVNQRU5ECisJCSAqIGlzIGVuYWJsZWQsIHNvIGFsc28gZW5hYmxlIHJlbW90ZSB3YWtlIGhlcmUuCisJCSAqLwogCQlpZiAoaGNkLT5zZWxmLnJvb3RfaHViLT5kb19yZW1vdGVfd2FrZXVwKSB7CiAJCQlpZiAodDEgJiBQT1JUX0NPTk5FQ1QpIHsKIAkJCQl0MiB8PSBQT1JUX1dLT0NfRSB8IFBPUlRfV0tESVNDX0U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktbWVtLmMKaW5kZXggYTQwYWI5OC4uOThkNGMwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLW1lbS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1tZW0uYwpAQCAtMzQsMjUgKzM0LDI5IEBACiAgKiBTZWN0aW9uIDQuMTEuMS4xOgogICogIkFsbCBjb21wb25lbnRzIG9mIGFsbCBDb21tYW5kIGFuZCBUcmFuc2ZlciBUUkJzIHNoYWxsIGJlIGluaXRpYWxpemVkIHRvICcwJyIKICAqLwotc3RhdGljIHN0cnVjdCB4aGNpX3NlZ21lbnQgKnhoY2lfc2VnbWVudF9hbGxvYyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIGdmcF90IGZsYWdzKQorc3RhdGljIHN0cnVjdCB4aGNpX3NlZ21lbnQgKnhoY2lfc2VnbWVudF9hbGxvYyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCisJCQkJCXVuc2lnbmVkIGludCBjeWNsZV9zdGF0ZSwgZ2ZwX3QgZmxhZ3MpCiB7CiAJc3RydWN0IHhoY2lfc2VnbWVudCAqc2VnOwogCWRtYV9hZGRyX3QJZG1hOworCWludAkJaTsKIAogCXNlZyA9IGt6YWxsb2Moc2l6ZW9mICpzZWcsIGZsYWdzKTsKIAlpZiAoIXNlZykKIAkJcmV0dXJuIE5VTEw7Ci0JeGhjaV9kYmcoeGhjaSwgIkFsbG9jYXRpbmcgcHJpdiBzZWdtZW50IHN0cnVjdHVyZSBhdCAlcFxuIiwgc2VnKTsKIAogCXNlZy0+dHJicyA9IGRtYV9wb29sX2FsbG9jKHhoY2ktPnNlZ21lbnRfcG9vbCwgZmxhZ3MsICZkbWEpOwogCWlmICghc2VnLT50cmJzKSB7CiAJCWtmcmVlKHNlZyk7CiAJCXJldHVybiBOVUxMOwogCX0KLQl4aGNpX2RiZyh4aGNpLCAiLy8gQWxsb2NhdGluZyBzZWdtZW50IGF0ICVwICh2aXJ0dWFsKSAweCVsbHggKERNQSlcbiIsCi0JCQlzZWctPnRyYnMsICh1bnNpZ25lZCBsb25nIGxvbmcpZG1hKTsKIAogCW1lbXNldChzZWctPnRyYnMsIDAsIFNFR01FTlRfU0laRSk7CisJLyogSWYgdGhlIGN5Y2xlIHN0YXRlIGlzIDAsIHNldCB0aGUgY3ljbGUgYml0IHRvIDEgZm9yIGFsbCB0aGUgVFJCcyAqLworCWlmIChjeWNsZV9zdGF0ZSA9PSAwKSB7CisJCWZvciAoaSA9IDA7IGkgPCBUUkJTX1BFUl9TRUdNRU5UOyBpKyspCisJCQlzZWctPnRyYnNbaV0ubGluay5jb250cm9sIHw9IFRSQl9DWUNMRTsKKwl9CiAJc2VnLT5kbWEgPSBkbWE7CiAJc2VnLT5uZXh0ID0gTlVMTDsKIApAQCAtNjIsMTUgKzY2LDI2IEBACiBzdGF0aWMgdm9pZCB4aGNpX3NlZ21lbnRfZnJlZShzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB4aGNpX3NlZ21lbnQgKnNlZykKIHsKIAlpZiAoc2VnLT50cmJzKSB7Ci0JCXhoY2lfZGJnKHhoY2ksICJGcmVlaW5nIERNQSBzZWdtZW50IGF0ICVwICh2aXJ0dWFsKSAweCVsbHggKERNQSlcbiIsCi0JCQkJc2VnLT50cmJzLCAodW5zaWduZWQgbG9uZyBsb25nKXNlZy0+ZG1hKTsKIAkJZG1hX3Bvb2xfZnJlZSh4aGNpLT5zZWdtZW50X3Bvb2wsIHNlZy0+dHJicywgc2VnLT5kbWEpOwogCQlzZWctPnRyYnMgPSBOVUxMOwogCX0KLQl4aGNpX2RiZyh4aGNpLCAiRnJlZWluZyBwcml2IHNlZ21lbnQgc3RydWN0dXJlIGF0ICVwXG4iLCBzZWcpOwogCWtmcmVlKHNlZyk7CiB9CiAKK3N0YXRpYyB2b2lkIHhoY2lfZnJlZV9zZWdtZW50c19mb3JfcmluZyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCisJCQkJc3RydWN0IHhoY2lfc2VnbWVudCAqZmlyc3QpCit7CisJc3RydWN0IHhoY2lfc2VnbWVudCAqc2VnOworCisJc2VnID0gZmlyc3QtPm5leHQ7CisJd2hpbGUgKHNlZyAhPSBmaXJzdCkgeworCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpuZXh0ID0gc2VnLT5uZXh0OworCQl4aGNpX3NlZ21lbnRfZnJlZSh4aGNpLCBzZWcpOworCQlzZWcgPSBuZXh0OworCX0KKwl4aGNpX3NlZ21lbnRfZnJlZSh4aGNpLCBmaXJzdCk7Cit9CisKIC8qCiAgKiBNYWtlIHRoZSBwcmV2IHNlZ21lbnQgcG9pbnQgdG8gdGhlIG5leHQgc2VnbWVudC4KICAqCkBAIC03OSwxNCArOTQsMTQgQEAKICAqIHJlbGF0ZWQgZmxhZ3MsIHN1Y2ggYXMgRW5kIFRSQiwgVG9nZ2xlIEN5Y2xlLCBhbmQgbm8gc25vb3AuCiAgKi8KIHN0YXRpYyB2b2lkIHhoY2lfbGlua19zZWdtZW50cyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB4aGNpX3NlZ21lbnQgKnByZXYsCi0JCXN0cnVjdCB4aGNpX3NlZ21lbnQgKm5leHQsIGJvb2wgbGlua190cmJzLCBib29sIGlzb2MpCisJCXN0cnVjdCB4aGNpX3NlZ21lbnQgKm5leHQsIGVudW0geGhjaV9yaW5nX3R5cGUgdHlwZSkKIHsKIAl1MzIgdmFsOwogCiAJaWYgKCFwcmV2IHx8ICFuZXh0KQogCQlyZXR1cm47CiAJcHJldi0+bmV4dCA9IG5leHQ7Ci0JaWYgKGxpbmtfdHJicykgeworCWlmICh0eXBlICE9IFRZUEVfRVZFTlQpIHsKIAkJcHJldi0+dHJic1tUUkJTX1BFUl9TRUdNRU5ULTFdLmxpbmsuc2VnbWVudF9wdHIgPQogCQkJY3B1X3RvX2xlNjQobmV4dC0+ZG1hKTsKIApAQCAtOTcsMzkgKzExMiw1NSBAQAogCQkvKiBBbHdheXMgc2V0IHRoZSBjaGFpbiBiaXQgd2l0aCAwLjk1IGhhcmR3YXJlICovCiAJCS8qIFNldCBjaGFpbiBiaXQgZm9yIGlzb2MgcmluZ3Mgb24gQU1EIDAuOTYgaG9zdCAqLwogCQlpZiAoeGhjaV9saW5rX3RyYl9xdWlyayh4aGNpKSB8fAotCQkJCShpc29jICYmICh4aGNpLT5xdWlya3MgJiBYSENJX0FNRF8weDk2X0hPU1QpKSkKKwkJCQkodHlwZSA9PSBUWVBFX0lTT0MgJiYKKwkJCQkgKHhoY2ktPnF1aXJrcyAmIFhIQ0lfQU1EXzB4OTZfSE9TVCkpKQogCQkJdmFsIHw9IFRSQl9DSEFJTjsKIAkJcHJldi0+dHJic1tUUkJTX1BFUl9TRUdNRU5ULTFdLmxpbmsuY29udHJvbCA9IGNwdV90b19sZTMyKHZhbCk7CiAJfQotCXhoY2lfZGJnKHhoY2ksICJMaW5raW5nIHNlZ21lbnQgMHglbGx4IHRvIHNlZ21lbnQgMHglbGx4IChETUEpXG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwcmV2LT5kbWEsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKW5leHQtPmRtYSk7Cit9CisKKy8qCisgKiBMaW5rIHRoZSByaW5nIHRvIHRoZSBuZXcgc2VnbWVudHMuCisgKiBTZXQgVG9nZ2xlIEN5Y2xlIGZvciB0aGUgbmV3IHJpbmcgaWYgbmVlZGVkLgorICovCitzdGF0aWMgdm9pZCB4aGNpX2xpbmtfcmluZ3Moc3RydWN0IHhoY2lfaGNkICp4aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nLAorCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpmaXJzdCwgc3RydWN0IHhoY2lfc2VnbWVudCAqbGFzdCwKKwkJdW5zaWduZWQgaW50IG51bV9zZWdzKQoreworCXN0cnVjdCB4aGNpX3NlZ21lbnQgKm5leHQ7CisKKwlpZiAoIXJpbmcgfHwgIWZpcnN0IHx8ICFsYXN0KQorCQlyZXR1cm47CisKKwluZXh0ID0gcmluZy0+ZW5xX3NlZy0+bmV4dDsKKwl4aGNpX2xpbmtfc2VnbWVudHMoeGhjaSwgcmluZy0+ZW5xX3NlZywgZmlyc3QsIHJpbmctPnR5cGUpOworCXhoY2lfbGlua19zZWdtZW50cyh4aGNpLCBsYXN0LCBuZXh0LCByaW5nLT50eXBlKTsKKwlyaW5nLT5udW1fc2VncyArPSBudW1fc2VnczsKKwlyaW5nLT5udW1fdHJic19mcmVlICs9IChUUkJTX1BFUl9TRUdNRU5UIC0gMSkgKiBudW1fc2VnczsKKworCWlmIChyaW5nLT50eXBlICE9IFRZUEVfRVZFTlQgJiYgcmluZy0+ZW5xX3NlZyA9PSByaW5nLT5sYXN0X3NlZykgeworCQlyaW5nLT5sYXN0X3NlZy0+dHJic1tUUkJTX1BFUl9TRUdNRU5ULTFdLmxpbmsuY29udHJvbAorCQkJJj0gfmNwdV90b19sZTMyKExJTktfVE9HR0xFKTsKKwkJbGFzdC0+dHJic1tUUkJTX1BFUl9TRUdNRU5ULTFdLmxpbmsuY29udHJvbAorCQkJfD0gY3B1X3RvX2xlMzIoTElOS19UT0dHTEUpOworCQlyaW5nLT5sYXN0X3NlZyA9IGxhc3Q7CisJfQogfQogCiAvKiBYWFg6IERvIHdlIG5lZWQgdGhlIGhjZCBzdHJ1Y3R1cmUgaW4gYWxsIHRoZXNlIGZ1bmN0aW9ucz8gKi8KIHZvaWQgeGhjaV9yaW5nX2ZyZWUoc3RydWN0IHhoY2lfaGNkICp4aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nKQogewotCXN0cnVjdCB4aGNpX3NlZ21lbnQgKnNlZzsKLQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpmaXJzdF9zZWc7Ci0KIAlpZiAoIXJpbmcpCiAJCXJldHVybjsKLQlpZiAocmluZy0+Zmlyc3Rfc2VnKSB7Ci0JCWZpcnN0X3NlZyA9IHJpbmctPmZpcnN0X3NlZzsKLQkJc2VnID0gZmlyc3Rfc2VnLT5uZXh0OwotCQl4aGNpX2RiZyh4aGNpLCAiRnJlZWluZyByaW5nIGF0ICVwXG4iLCByaW5nKTsKLQkJd2hpbGUgKHNlZyAhPSBmaXJzdF9zZWcpIHsKLQkJCXN0cnVjdCB4aGNpX3NlZ21lbnQgKm5leHQgPSBzZWctPm5leHQ7Ci0JCQl4aGNpX3NlZ21lbnRfZnJlZSh4aGNpLCBzZWcpOwotCQkJc2VnID0gbmV4dDsKLQkJfQotCQl4aGNpX3NlZ21lbnRfZnJlZSh4aGNpLCBmaXJzdF9zZWcpOwotCQlyaW5nLT5maXJzdF9zZWcgPSBOVUxMOwotCX0KKworCWlmIChyaW5nLT5maXJzdF9zZWcpCisJCXhoY2lfZnJlZV9zZWdtZW50c19mb3JfcmluZyh4aGNpLCByaW5nLT5maXJzdF9zZWcpOworCiAJa2ZyZWUocmluZyk7CiB9CiAKLXN0YXRpYyB2b2lkIHhoY2lfaW5pdGlhbGl6ZV9yaW5nX2luZm8oc3RydWN0IHhoY2lfcmluZyAqcmluZykKK3N0YXRpYyB2b2lkIHhoY2lfaW5pdGlhbGl6ZV9yaW5nX2luZm8oc3RydWN0IHhoY2lfcmluZyAqcmluZywKKwkJCQkJdW5zaWduZWQgaW50IGN5Y2xlX3N0YXRlKQogewogCS8qIFRoZSByaW5nIGlzIGVtcHR5LCBzbyB0aGUgZW5xdWV1ZSBwb2ludGVyID09IGRlcXVldWUgcG9pbnRlciAqLwogCXJpbmctPmVucXVldWUgPSByaW5nLT5maXJzdF9zZWctPnRyYnM7CkBAIC0xMzksMTEgKzE3MCw1MyBAQAogCS8qIFRoZSByaW5nIGlzIGluaXRpYWxpemVkIHRvIDAuIFRoZSBwcm9kdWNlciBtdXN0IHdyaXRlIDEgdG8gdGhlIGN5Y2xlCiAJICogYml0IHRvIGhhbmRvdmVyIG93bmVyc2hpcCBvZiB0aGUgVFJCLCBzbyBQQ1MgPSAxLiAgVGhlIGNvbnN1bWVyIG11c3QKIAkgKiBjb21wYXJlIENDUyB0byB0aGUgY3ljbGUgYml0IHRvIGNoZWNrIG93bmVyc2hpcCwgc28gQ0NTID0gMS4KKwkgKgorCSAqIE5ldyByaW5ncyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCBjeWNsZSBzdGF0ZSBlcXVhbCB0byAxOyBpZiB3ZSBhcmUKKwkgKiBoYW5kbGluZyByaW5nIGV4cGFuc2lvbiwgc2V0IHRoZSBjeWNsZSBzdGF0ZSBlcXVhbCB0byB0aGUgb2xkIHJpbmcuCiAJICovCi0JcmluZy0+Y3ljbGVfc3RhdGUgPSAxOworCXJpbmctPmN5Y2xlX3N0YXRlID0gY3ljbGVfc3RhdGU7CiAJLyogTm90IG5lY2Vzc2FyeSBmb3IgbmV3IHJpbmdzLCBidXQgbmVlZGVkIGZvciByZS1pbml0aWFsaXplZCByaW5ncyAqLwogCXJpbmctPmVucV91cGRhdGVzID0gMDsKIAlyaW5nLT5kZXFfdXBkYXRlcyA9IDA7CisKKwkvKgorCSAqIEVhY2ggc2VnbWVudCBoYXMgYSBsaW5rIFRSQiwgYW5kIGxlYXZlIGFuIGV4dHJhIFRSQiBmb3IgU1cKKwkgKiBhY2NvdW50aW5nIHB1cnBvc2UKKwkgKi8KKwlyaW5nLT5udW1fdHJic19mcmVlID0gcmluZy0+bnVtX3NlZ3MgKiAoVFJCU19QRVJfU0VHTUVOVCAtIDEpIC0gMTsKK30KKworLyogQWxsb2NhdGUgc2VnbWVudHMgYW5kIGxpbmsgdGhlbSBmb3IgYSByaW5nICovCitzdGF0aWMgaW50IHhoY2lfYWxsb2Nfc2VnbWVudHNfZm9yX3Jpbmcoc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCQlzdHJ1Y3QgeGhjaV9zZWdtZW50ICoqZmlyc3QsIHN0cnVjdCB4aGNpX3NlZ21lbnQgKipsYXN0LAorCQl1bnNpZ25lZCBpbnQgbnVtX3NlZ3MsIHVuc2lnbmVkIGludCBjeWNsZV9zdGF0ZSwKKwkJZW51bSB4aGNpX3JpbmdfdHlwZSB0eXBlLCBnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3QgeGhjaV9zZWdtZW50ICpwcmV2OworCisJcHJldiA9IHhoY2lfc2VnbWVudF9hbGxvYyh4aGNpLCBjeWNsZV9zdGF0ZSwgZmxhZ3MpOworCWlmICghcHJldikKKwkJcmV0dXJuIC1FTk9NRU07CisJbnVtX3NlZ3MtLTsKKworCSpmaXJzdCA9IHByZXY7CisJd2hpbGUgKG51bV9zZWdzID4gMCkgeworCQlzdHJ1Y3QgeGhjaV9zZWdtZW50CSpuZXh0OworCisJCW5leHQgPSB4aGNpX3NlZ21lbnRfYWxsb2MoeGhjaSwgY3ljbGVfc3RhdGUsIGZsYWdzKTsKKwkJaWYgKCFuZXh0KSB7CisJCQl4aGNpX2ZyZWVfc2VnbWVudHNfZm9yX3JpbmcoeGhjaSwgKmZpcnN0KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXhoY2lfbGlua19zZWdtZW50cyh4aGNpLCBwcmV2LCBuZXh0LCB0eXBlKTsKKworCQlwcmV2ID0gbmV4dDsKKwkJbnVtX3NlZ3MtLTsKKwl9CisJeGhjaV9saW5rX3NlZ21lbnRzKHhoY2ksIHByZXYsICpmaXJzdCwgdHlwZSk7CisJKmxhc3QgPSBwcmV2OworCisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMTU0LDQ4ICsyMjcsMzQgQEAKICAqIFNlZSBzZWN0aW9uIDQuOS4xIGFuZCBmaWd1cmVzIDE1IGFuZCAxNi4KICAqLwogc3RhdGljIHN0cnVjdCB4aGNpX3JpbmcgKnhoY2lfcmluZ19hbGxvYyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCi0JCXVuc2lnbmVkIGludCBudW1fc2VncywgYm9vbCBsaW5rX3RyYnMsIGJvb2wgaXNvYywgZ2ZwX3QgZmxhZ3MpCisJCXVuc2lnbmVkIGludCBudW1fc2VncywgdW5zaWduZWQgaW50IGN5Y2xlX3N0YXRlLAorCQllbnVtIHhoY2lfcmluZ190eXBlIHR5cGUsIGdmcF90IGZsYWdzKQogewogCXN0cnVjdCB4aGNpX3JpbmcJKnJpbmc7Ci0Jc3RydWN0IHhoY2lfc2VnbWVudAkqcHJldjsKKwlpbnQgcmV0OwogCiAJcmluZyA9IGt6YWxsb2Moc2l6ZW9mICoocmluZyksIGZsYWdzKTsKLQl4aGNpX2RiZyh4aGNpLCAiQWxsb2NhdGluZyByaW5nIGF0ICVwXG4iLCByaW5nKTsKIAlpZiAoIXJpbmcpCiAJCXJldHVybiBOVUxMOwogCisJcmluZy0+bnVtX3NlZ3MgPSBudW1fc2VnczsKIAlJTklUX0xJU1RfSEVBRCgmcmluZy0+dGRfbGlzdCk7CisJcmluZy0+dHlwZSA9IHR5cGU7CiAJaWYgKG51bV9zZWdzID09IDApCiAJCXJldHVybiByaW5nOwogCi0JcmluZy0+Zmlyc3Rfc2VnID0geGhjaV9zZWdtZW50X2FsbG9jKHhoY2ksIGZsYWdzKTsKLQlpZiAoIXJpbmctPmZpcnN0X3NlZykKKwlyZXQgPSB4aGNpX2FsbG9jX3NlZ21lbnRzX2Zvcl9yaW5nKHhoY2ksICZyaW5nLT5maXJzdF9zZWcsCisJCQkmcmluZy0+bGFzdF9zZWcsIG51bV9zZWdzLCBjeWNsZV9zdGF0ZSwgdHlwZSwgZmxhZ3MpOworCWlmIChyZXQpCiAJCWdvdG8gZmFpbDsKLQludW1fc2Vncy0tOwogCi0JcHJldiA9IHJpbmctPmZpcnN0X3NlZzsKLQl3aGlsZSAobnVtX3NlZ3MgPiAwKSB7Ci0JCXN0cnVjdCB4aGNpX3NlZ21lbnQJKm5leHQ7Ci0KLQkJbmV4dCA9IHhoY2lfc2VnbWVudF9hbGxvYyh4aGNpLCBmbGFncyk7Ci0JCWlmICghbmV4dCkKLQkJCWdvdG8gZmFpbDsKLQkJeGhjaV9saW5rX3NlZ21lbnRzKHhoY2ksIHByZXYsIG5leHQsIGxpbmtfdHJicywgaXNvYyk7Ci0KLQkJcHJldiA9IG5leHQ7Ci0JCW51bV9zZWdzLS07Ci0JfQotCXhoY2lfbGlua19zZWdtZW50cyh4aGNpLCBwcmV2LCByaW5nLT5maXJzdF9zZWcsIGxpbmtfdHJicywgaXNvYyk7Ci0KLQlpZiAobGlua190cmJzKSB7CisJLyogT25seSBldmVudCByaW5nIGRvZXMgbm90IHVzZSBsaW5rIFRSQiAqLworCWlmICh0eXBlICE9IFRZUEVfRVZFTlQpIHsKIAkJLyogU2VlIHNlY3Rpb24gNC45LjIuMSBhbmQgNi40LjQuMSAqLwotCQlwcmV2LT50cmJzW1RSQlNfUEVSX1NFR01FTlQtMV0ubGluay5jb250cm9sIHw9CisJCXJpbmctPmxhc3Rfc2VnLT50cmJzW1RSQlNfUEVSX1NFR01FTlQgLSAxXS5saW5rLmNvbnRyb2wgfD0KIAkJCWNwdV90b19sZTMyKExJTktfVE9HR0xFKTsKLQkJeGhjaV9kYmcoeGhjaSwgIldyb3RlIGxpbmsgdG9nZ2xlIGZsYWcgdG8iCi0JCQkJIiBzZWdtZW50ICVwICh2aXJ0dWFsKSwgMHglbGx4IChETUEpXG4iLAotCQkJCXByZXYsICh1bnNpZ25lZCBsb25nIGxvbmcpcHJldi0+ZG1hKTsKIAl9Ci0JeGhjaV9pbml0aWFsaXplX3JpbmdfaW5mbyhyaW5nKTsKKwl4aGNpX2luaXRpYWxpemVfcmluZ19pbmZvKHJpbmcsIGN5Y2xlX3N0YXRlKTsKIAlyZXR1cm4gcmluZzsKIAogZmFpbDoKQEAgLTIzMSwyMyArMjkwLDY0IEBACiAgKiBwb2ludGVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByaW5nLgogICovCiBzdGF0aWMgdm9pZCB4aGNpX3JlaW5pdF9jYWNoZWRfcmluZyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCi0JCXN0cnVjdCB4aGNpX3JpbmcgKnJpbmcsIGJvb2wgaXNvYykKKwkJCXN0cnVjdCB4aGNpX3JpbmcgKnJpbmcsIHVuc2lnbmVkIGludCBjeWNsZV9zdGF0ZSwKKwkJCWVudW0geGhjaV9yaW5nX3R5cGUgdHlwZSkKIHsKIAlzdHJ1Y3QgeGhjaV9zZWdtZW50CSpzZWcgPSByaW5nLT5maXJzdF9zZWc7CisJaW50IGk7CisKIAlkbyB7CiAJCW1lbXNldChzZWctPnRyYnMsIDAsCiAJCQkJc2l6ZW9mKHVuaW9uIHhoY2lfdHJiKSpUUkJTX1BFUl9TRUdNRU5UKTsKKwkJaWYgKGN5Y2xlX3N0YXRlID09IDApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBUUkJTX1BFUl9TRUdNRU5UOyBpKyspCisJCQkJc2VnLT50cmJzW2ldLmxpbmsuY29udHJvbCB8PSBUUkJfQ1lDTEU7CisJCX0KIAkJLyogQWxsIGVuZHBvaW50IHJpbmdzIGhhdmUgbGluayBUUkJzICovCi0JCXhoY2lfbGlua19zZWdtZW50cyh4aGNpLCBzZWcsIHNlZy0+bmV4dCwgMSwgaXNvYyk7CisJCXhoY2lfbGlua19zZWdtZW50cyh4aGNpLCBzZWcsIHNlZy0+bmV4dCwgdHlwZSk7CiAJCXNlZyA9IHNlZy0+bmV4dDsKIAl9IHdoaWxlIChzZWcgIT0gcmluZy0+Zmlyc3Rfc2VnKTsKLQl4aGNpX2luaXRpYWxpemVfcmluZ19pbmZvKHJpbmcpOworCXJpbmctPnR5cGUgPSB0eXBlOworCXhoY2lfaW5pdGlhbGl6ZV9yaW5nX2luZm8ocmluZywgY3ljbGVfc3RhdGUpOwogCS8qIHRkIGxpc3Qgc2hvdWxkIGJlIGVtcHR5IHNpbmNlIGFsbCBVUkJzIGhhdmUgYmVlbiBjYW5jZWxsZWQsCiAJICogYnV0IGp1c3QgaW4gY2FzZS4uLgogCSAqLwogCUlOSVRfTElTVF9IRUFEKCZyaW5nLT50ZF9saXN0KTsKIH0KIAorLyoKKyAqIEV4cGFuZCBhbiBleGlzdGluZyByaW5nLgorICogTG9vayBmb3IgYSBjYWNoZWQgcmluZyBvciBhbGxvY2F0ZSBhIG5ldyByaW5nIHdoaWNoIGhhcyBzYW1lIHNlZ21lbnQgbnVtYmVycworICogYW5kIGxpbmsgdGhlIHR3byByaW5ncy4KKyAqLworaW50IHhoY2lfcmluZ19leHBhbnNpb24oc3RydWN0IHhoY2lfaGNkICp4aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nLAorCQkJCXVuc2lnbmVkIGludCBudW1fdHJicywgZ2ZwX3QgZmxhZ3MpCit7CisJc3RydWN0IHhoY2lfc2VnbWVudAkqZmlyc3Q7CisJc3RydWN0IHhoY2lfc2VnbWVudAkqbGFzdDsKKwl1bnNpZ25lZCBpbnQJCW51bV9zZWdzOworCXVuc2lnbmVkIGludAkJbnVtX3NlZ3NfbmVlZGVkOworCWludAkJCXJldDsKKworCW51bV9zZWdzX25lZWRlZCA9IChudW1fdHJicyArIChUUkJTX1BFUl9TRUdNRU5UIC0gMSkgLSAxKSAvCisJCQkJKFRSQlNfUEVSX1NFR01FTlQgLSAxKTsKKworCS8qIEFsbG9jYXRlIG51bWJlciBvZiBzZWdtZW50cyB3ZSBuZWVkZWQsIG9yIGRvdWJsZSB0aGUgcmluZyBzaXplICovCisJbnVtX3NlZ3MgPSByaW5nLT5udW1fc2VncyA+IG51bV9zZWdzX25lZWRlZCA/CisJCQlyaW5nLT5udW1fc2VncyA6IG51bV9zZWdzX25lZWRlZDsKKworCXJldCA9IHhoY2lfYWxsb2Nfc2VnbWVudHNfZm9yX3JpbmcoeGhjaSwgJmZpcnN0LCAmbGFzdCwKKwkJCW51bV9zZWdzLCByaW5nLT5jeWNsZV9zdGF0ZSwgcmluZy0+dHlwZSwgZmxhZ3MpOworCWlmIChyZXQpCisJCXJldHVybiAtRU5PTUVNOworCisJeGhjaV9saW5rX3JpbmdzKHhoY2ksIHJpbmcsIGZpcnN0LCBsYXN0LCBudW1fc2Vncyk7CisJeGhjaV9kYmcoeGhjaSwgInJpbmcgZXhwYW5zaW9uIHN1Y2NlZWQsIG5vdyBoYXMgJWQgc2VnbWVudHNcbiIsCisJCQlyaW5nLT5udW1fc2Vncyk7CisKKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSBDVFhfU0laRShfaGNjKSAoSENDXzY0QllURV9DT05URVhUKF9oY2MpID8gNjQgOiAzMikKIAogc3RhdGljIHN0cnVjdCB4aGNpX2NvbnRhaW5lcl9jdHggKnhoY2lfYWxsb2NfY29udGFpbmVyX2N0eChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCkBAIC01NDIsNyArNjQyLDcgQEAKIAkgKi8KIAlmb3IgKGN1cl9zdHJlYW0gPSAxOyBjdXJfc3RyZWFtIDwgbnVtX3N0cmVhbXM7IGN1cl9zdHJlYW0rKykgewogCQlzdHJlYW1faW5mby0+c3RyZWFtX3JpbmdzW2N1cl9zdHJlYW1dID0KLQkJCXhoY2lfcmluZ19hbGxvYyh4aGNpLCAxLCB0cnVlLCBmYWxzZSwgbWVtX2ZsYWdzKTsKKwkJCXhoY2lfcmluZ19hbGxvYyh4aGNpLCAyLCAxLCBUWVBFX1NUUkVBTSwgbWVtX2ZsYWdzKTsKIAkJY3VyX3JpbmcgPSBzdHJlYW1faW5mby0+c3RyZWFtX3JpbmdzW2N1cl9zdHJlYW1dOwogCQlpZiAoIWN1cl9yaW5nKQogCQkJZ290byBjbGVhbnVwX3JpbmdzOwpAQCAtODU3LDcgKzk1Nyw3IEBACiAJfQogCiAJLyogQWxsb2NhdGUgZW5kcG9pbnQgMCByaW5nICovCi0JZGV2LT5lcHNbMF0ucmluZyA9IHhoY2lfcmluZ19hbGxvYyh4aGNpLCAxLCB0cnVlLCBmYWxzZSwgZmxhZ3MpOworCWRldi0+ZXBzWzBdLnJpbmcgPSB4aGNpX3JpbmdfYWxsb2MoeGhjaSwgMiwgMSwgVFlQRV9DVFJMLCBmbGFncyk7CiAJaWYgKCFkZXYtPmVwc1swXS5yaW5nKQogCQlnb3RvIGZhaWw7CiAKQEAgLTEyOTUsMjQgKzEzOTUsMTYgQEAKIAlzdHJ1Y3QgeGhjaV9yaW5nICplcF9yaW5nOwogCXVuc2lnbmVkIGludCBtYXhfcGFja2V0OwogCXVuc2lnbmVkIGludCBtYXhfYnVyc3Q7CisJZW51bSB4aGNpX3JpbmdfdHlwZSB0eXBlOwogCXUzMiBtYXhfZXNpdF9wYXlsb2FkOwogCiAJZXBfaW5kZXggPSB4aGNpX2dldF9lbmRwb2ludF9pbmRleCgmZXAtPmRlc2MpOwogCWVwX2N0eCA9IHhoY2lfZ2V0X2VwX2N0eCh4aGNpLCB2aXJ0X2Rldi0+aW5fY3R4LCBlcF9pbmRleCk7CiAKKwl0eXBlID0gdXNiX2VuZHBvaW50X3R5cGUoJmVwLT5kZXNjKTsKIAkvKiBTZXQgdXAgdGhlIGVuZHBvaW50IHJpbmcgKi8KLQkvKgotCSAqIElzb2Nocm9ub3VzIGVuZHBvaW50IHJpbmcgbmVlZHMgYmlnZ2VyIHNpemUgYmVjYXVzZSBvbmUgaXNvYyBVUkIKLQkgKiBjYXJyaWVzIG11bHRpcGxlIHBhY2tldHMgYW5kIGl0IHdpbGwgaW5zZXJ0IG11bHRpcGxlIHRkcyB0byB0aGUKLQkgKiByaW5nLgotCSAqIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggZHluYW1pYyByaW5nIHJlc2l6aW5nIGluIHRoZSBmdXR1cmUuCi0JICovCi0JaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoJmVwLT5kZXNjKSkKLQkJdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ubmV3X3JpbmcgPQotCQkJeGhjaV9yaW5nX2FsbG9jKHhoY2ksIDgsIHRydWUsIHRydWUsIG1lbV9mbGFncyk7Ci0JZWxzZQotCQl2aXJ0X2Rldi0+ZXBzW2VwX2luZGV4XS5uZXdfcmluZyA9Ci0JCQl4aGNpX3JpbmdfYWxsb2MoeGhjaSwgMSwgdHJ1ZSwgZmFsc2UsIG1lbV9mbGFncyk7CisJdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ubmV3X3JpbmcgPQorCQl4aGNpX3JpbmdfYWxsb2MoeGhjaSwgMiwgMSwgdHlwZSwgbWVtX2ZsYWdzKTsKIAlpZiAoIXZpcnRfZGV2LT5lcHNbZXBfaW5kZXhdLm5ld19yaW5nKSB7CiAJCS8qIEF0dGVtcHQgdG8gdXNlIHRoZSByaW5nIGNhY2hlICovCiAJCWlmICh2aXJ0X2Rldi0+bnVtX3JpbmdzX2NhY2hlZCA9PSAwKQpAQCAtMTMyMiw3ICsxNDE0LDcgQEAKIAkJdmlydF9kZXYtPnJpbmdfY2FjaGVbdmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWRdID0gTlVMTDsKIAkJdmlydF9kZXYtPm51bV9yaW5nc19jYWNoZWQtLTsKIAkJeGhjaV9yZWluaXRfY2FjaGVkX3JpbmcoeGhjaSwgdmlydF9kZXYtPmVwc1tlcF9pbmRleF0ubmV3X3JpbmcsCi0JCQl1c2JfZW5kcG9pbnRfeGZlcl9pc29jKCZlcC0+ZGVzYykgPyB0cnVlIDogZmFsc2UpOworCQkJCQkxLCB0eXBlKTsKIAl9CiAJdmlydF9kZXYtPmVwc1tlcF9pbmRleF0uc2tpcCA9IGZhbHNlOwogCWVwX3JpbmcgPSB2aXJ0X2Rldi0+ZXBzW2VwX2luZGV4XS5uZXdfcmluZzsKQEAgLTE2OTcsNiArMTc4OSw3IEBACiAJeGhjaV9kYmcoeGhjaSwgIkZyZWVkIGV2ZW50IHJpbmdcbiIpOwogCiAJeGhjaS0+Y21kX3JpbmdfcmVzZXJ2ZWRfdHJicyA9IDA7CisKIAlpZiAoeGhjaS0+Y21kX3JpbmcpCiAJCXhoY2lfcmluZ19mcmVlKHhoY2ksIHhoY2ktPmNtZF9yaW5nKTsKIAl4aGNpLT5jbWRfcmluZyA9IE5VTEw7CkBAIC0yMTY1LDcgKzIyNTgsNyBAQAogCXVuc2lnbmVkIGludAl2YWwsIHZhbDI7CiAJdTY0CQl2YWxfNjQ7CiAJc3RydWN0IHhoY2lfc2VnbWVudAkqc2VnOwotCXUzMiBwYWdlX3NpemU7CisJdTMyIHBhZ2Vfc2l6ZSwgdGVtcDsKIAlpbnQgaTsKIAogCXBhZ2Vfc2l6ZSA9IHhoY2lfcmVhZGwoeGhjaSwgJnhoY2ktPm9wX3JlZ3MtPnBhZ2Vfc2l6ZSk7CkBAIC0yMjQzLDcgKzIzMzYsNyBAQAogCQlnb3RvIGZhaWw7CiAKIAkvKiBTZXQgdXAgdGhlIGNvbW1hbmQgcmluZyB0byBoYXZlIG9uZSBzZWdtZW50cyBmb3Igbm93LiAqLwotCXhoY2ktPmNtZF9yaW5nID0geGhjaV9yaW5nX2FsbG9jKHhoY2ksIDEsIHRydWUsIGZhbHNlLCBmbGFncyk7CisJeGhjaS0+Y21kX3JpbmcgPSB4aGNpX3JpbmdfYWxsb2MoeGhjaSwgMSwgMSwgVFlQRV9DT01NQU5ELCBmbGFncyk7CiAJaWYgKCF4aGNpLT5jbWRfcmluZykKIAkJZ290byBmYWlsOwogCXhoY2lfZGJnKHhoY2ksICJBbGxvY2F0ZWQgY29tbWFuZCByaW5nIGF0ICVwXG4iLCB4aGNpLT5jbWRfcmluZyk7CkBAIC0yMjc0LDcgKzIzNjcsNyBAQAogCSAqIHRoZSBldmVudCByaW5nIHNlZ21lbnQgdGFibGUgKEVSU1QpLiAgU2VjdGlvbiA0LjkuMy4KIAkgKi8KIAl4aGNpX2RiZyh4aGNpLCAiLy8gQWxsb2NhdGluZyBldmVudCByaW5nXG4iKTsKLQl4aGNpLT5ldmVudF9yaW5nID0geGhjaV9yaW5nX2FsbG9jKHhoY2ksIEVSU1RfTlVNX1NFR1MsIGZhbHNlLCBmYWxzZSwKKwl4aGNpLT5ldmVudF9yaW5nID0geGhjaV9yaW5nX2FsbG9jKHhoY2ksIEVSU1RfTlVNX1NFR1MsIDEsIFRZUEVfRVZFTlQsCiAJCQkJCQlmbGFncyk7CiAJaWYgKCF4aGNpLT5ldmVudF9yaW5nKQogCQlnb3RvIGZhaWw7CkBAIC0yMzQ4LDYgKzI0NDEsMTUgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZ4aGNpLT5scG1fZmFpbGVkX2RldnMpOwogCisJLyogRW5hYmxlIFVTQiAzLjAgZGV2aWNlIG5vdGlmaWNhdGlvbnMgZm9yIGZ1bmN0aW9uIHJlbW90ZSB3YWtlLCB3aGljaAorCSAqIGlzIG5lY2Vzc2FyeSBmb3IgYWxsb3dpbmcgVVNCIDMuMCBkZXZpY2VzIHRvIGRvIHJlbW90ZSB3YWtldXAgZnJvbQorCSAqIFUzIChkZXZpY2Ugc3VzcGVuZCkuCisJICovCisJdGVtcCA9IHhoY2lfcmVhZGwoeGhjaSwgJnhoY2ktPm9wX3JlZ3MtPmRldl9ub3RpZmljYXRpb24pOworCXRlbXAgJj0gfkRFVl9OT1RFX01BU0s7CisJdGVtcCB8PSBERVZfTk9URV9GV0FLRTsKKwl4aGNpX3dyaXRlbCh4aGNpLCB0ZW1wLCAmeGhjaS0+b3BfcmVncy0+ZGV2X25vdGlmaWNhdGlvbik7CisKIAlyZXR1cm4gMDsKIAogZmFpbDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwppbmRleCBkYWY1NzU0Li4xOWU4OTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCkBAIC0zMjksNyArMzI5LDcgQEAKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmeGhjaV9wY2lfZHJpdmVyKTsKIH0KIAotdm9pZCBfX2V4aXQgeGhjaV91bnJlZ2lzdGVyX3BjaSh2b2lkKQordm9pZCB4aGNpX3VucmVnaXN0ZXJfcGNpKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ4aGNpX3BjaV9kcml2ZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBsYXQuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI4ODQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiB4aGNpLXBsYXQuYyAtIHhIQ0kgaG9zdCBjb250cm9sbGVyIGRyaXZlciBwbGF0Zm9ybSBCdXMgR2x1ZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20KKyAqIEF1dGhvcjogU2ViYXN0aWFuIEFuZHJ6ZWogU2lld2lvciA8YmlnZWFzeUBsaW51dHJvbml4LmRlPgorICoKKyAqIEEgbG90IG9mIGNvZGUgYm9ycm93ZWQgZnJvbSB0aGUgTGludXggeEhDSSBkcml2ZXIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAieGhjaS5oIgorI2luY2x1ZGUgInhoY2ktY29tY2VydG8yMDAwLmgiCisKKworCitzdGF0aWMgdm9pZCB4aGNpX3BsYXRfcXVpcmtzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHhoY2lfaGNkICp4aGNpKQoreworCS8qCisJICogQXMgb2Ygbm93IHBsYXRmb3JtIGRyaXZlcnMgZG9uJ3QgcHJvdmlkZSBNU0kgc3VwcG9ydCBzbyB3ZSBlbnN1cmUKKwkgKiBoZXJlIHRoYXQgdGhlIGdlbmVyaWMgY29kZSBkb2VzIG5vdCB0cnkgdG8gbWFrZSBhIHBjaV9kZXYgZnJvbSBvdXIKKwkgKiBkZXYgc3RydWN0IGluIG9yZGVyIHRvIHNldHVwIE1TSQorCSAqLworCXhoY2ktPnF1aXJrcyB8PSBYSENJX0JST0tFTl9NU0k7Cit9CisKKy8qIGNhbGxlZCBkdXJpbmcgcHJvYmUoKSBhZnRlciBjaGlwIHJlc2V0IGNvbXBsZXRlcyAqLworc3RhdGljIGludCB4aGNpX3BsYXRfc2V0dXAoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlyZXR1cm4geGhjaV9nZW5fc2V0dXAoaGNkLCB4aGNpX3BsYXRfcXVpcmtzKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgeGhjaV9wbGF0X3hoY2lfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbiA9CQkieGhjaS1oY2QiLAorCS5wcm9kdWN0X2Rlc2MgPQkJInhIQ0kgSG9zdCBDb250cm9sbGVyIiwKKwkuaGNkX3ByaXZfc2l6ZSA9CXNpemVvZihzdHJ1Y3QgeGhjaV9oY2QgKiksCisKKwkvKgorCSAqIGdlbmVyaWMgaGFyZHdhcmUgbGlua2FnZQorCSAqLworCS5pcnEgPQkJCXhoY2lfaXJxLAorCS5mbGFncyA9CQlIQ0RfTUVNT1JZIHwgSENEX1VTQjMgfCBIQ0RfU0hBUkVELAorCisJLyoKKwkgKiBiYXNpYyBsaWZlY3ljbGUgb3BlcmF0aW9ucworCSAqLworCS5yZXNldCA9CQl4aGNpX3BsYXRfc2V0dXAsCisJLnN0YXJ0ID0JCXhoY2lfcnVuLAorCS5zdG9wID0JCQl4aGNpX3N0b3AsCisJLnNodXRkb3duID0JCXhoY2lfc2h1dGRvd24sCisKKwkvKgorCSAqIG1hbmFnaW5nIGkvbyByZXF1ZXN0cyBhbmQgYXNzb2NpYXRlZCBkZXZpY2UgcmVzb3VyY2VzCisJICovCisJLnVyYl9lbnF1ZXVlID0JCXhoY2lfdXJiX2VucXVldWUsCisJLnVyYl9kZXF1ZXVlID0JCXhoY2lfdXJiX2RlcXVldWUsCisJLmFsbG9jX2RldiA9CQl4aGNpX2FsbG9jX2RldiwKKwkuZnJlZV9kZXYgPQkJeGhjaV9mcmVlX2RldiwKKwkuYWxsb2Nfc3RyZWFtcyA9CXhoY2lfYWxsb2Nfc3RyZWFtcywKKwkuZnJlZV9zdHJlYW1zID0JCXhoY2lfZnJlZV9zdHJlYW1zLAorCS5hZGRfZW5kcG9pbnQgPQkJeGhjaV9hZGRfZW5kcG9pbnQsCisJLmRyb3BfZW5kcG9pbnQgPQl4aGNpX2Ryb3BfZW5kcG9pbnQsCisJLmVuZHBvaW50X3Jlc2V0ID0JeGhjaV9lbmRwb2ludF9yZXNldCwKKwkuY2hlY2tfYmFuZHdpZHRoID0JeGhjaV9jaGVja19iYW5kd2lkdGgsCisJLnJlc2V0X2JhbmR3aWR0aCA9CXhoY2lfcmVzZXRfYmFuZHdpZHRoLAorCS5hZGRyZXNzX2RldmljZSA9CXhoY2lfYWRkcmVzc19kZXZpY2UsCisJLnVwZGF0ZV9odWJfZGV2aWNlID0JeGhjaV91cGRhdGVfaHViX2RldmljZSwKKwkucmVzZXRfZGV2aWNlID0JCXhoY2lfZGlzY292ZXJfb3JfcmVzZXRfZGV2aWNlLAorCisJLyoKKwkgKiBzY2hlZHVsaW5nIHN1cHBvcnQKKwkgKi8KKwkuZ2V0X2ZyYW1lX251bWJlciA9CXhoY2lfZ2V0X2ZyYW1lLAorCisJLyogUm9vdCBodWIgc3VwcG9ydCAqLworCS5odWJfY29udHJvbCA9CQl4aGNpX2h1Yl9jb250cm9sLAorCS5odWJfc3RhdHVzX2RhdGEgPQl4aGNpX2h1Yl9zdGF0dXNfZGF0YSwKKyNpZmRlZiBDT05GSUdfUE0JCisJLmJ1c19zdXNwZW5kID0JCWNvbWNlcnRvX3hoY2lfYnVzX3N1c3BlbmQsCisJLmJ1c19yZXN1bWUgPQkJY29tY2VydG9feGhjaV9idXNfcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IHhoY2lfcGxhdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBoY19kcml2ZXIJKmRyaXZlcjsKKwlzdHJ1Y3QgeGhjaV9oY2QJCSp4aGNpOworCXN0cnVjdCByZXNvdXJjZSAgICAgICAgICpyZXM7CisJc3RydWN0IHVzYl9oY2QJCSpoY2Q7CisJaW50CQkJcmV0OworCWludAkJCWlycTsKKworCXByaW50ayhLRVJOX0lORk8gIiMjICVzXG4iLF9fZnVuY19fKTsKKworCWlmICh1c2JfZGlzYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBEbyB0aGUgUGxhdGZvcm0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb25zICovCisJY29tY2VydG9fc3RhcnRfeGhjaSgpOworCisJZHJpdmVyID0gJnhoY2lfcGxhdF94aGNpX2RyaXZlcjsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwloY2QgPSB1c2JfY3JlYXRlX2hjZChkcml2ZXIsICZwZGV2LT5kZXYsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKKwlpZiAoIWhjZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloY2QtPnJzcmNfc3RhcnQgPSByZXMtPnN0YXJ0OworCWhjZC0+cnNyY19sZW4gPSByZXNvdXJjZV9zaXplKHJlcyk7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sCisJCQkJZHJpdmVyLT5kZXNjcmlwdGlvbikpIHsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAiY29udHJvbGxlciBhbHJlYWR5IGluIHVzZVxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBwdXRfaGNkOworCX0KKworCWhjZC0+cmVncyA9IGlvcmVtYXAoaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKKwlpZiAoIWhjZC0+cmVncykgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJlcnJvciBtYXBwaW5nIG1lbW9yeVxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gcmVsZWFzZV9tZW1fcmVnaW9uOworCX0KKyNpZiAxCisJd3JpdGVsKHJlYWRsKGhjZC0+cmVncyArIDB4YzIwMCkgJiAweDdGRkZGRkZGLCBoY2QtPnJlZ3MgKyAweGMyMDApOworCXdyaXRlbChyZWFkbChoY2QtPnJlZ3MgKyAweGMyYzApICYgMHg3RkZGRkZGRiwgaGNkLT5yZWdzICsgMHhjMmMwKTsKKwl3cml0ZWwoMHg1RGMxMTAwMCwgaGNkLT5yZWdzICsgMHhjMTEwKTsKKyNlbmRpZgorCisJcmV0ID0gdXNiX2FkZF9oY2QoaGNkLCBpcnEsIElSUUZfU0hBUkVEKTsKKwlpZiAocmV0KQorCQlnb3RvIHVubWFwX3JlZ2lzdGVyczsKKworCS8qIFVTQiAyLjAgcm9vdGh1YiBpcyBzdG9yZWQgaW4gdGhlIHBsYXRmb3JtX2RldmljZSBub3cuICovCisJaGNkID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXhoY2kgPSBoY2RfdG9feGhjaShoY2QpOworCXhoY2ktPnNoYXJlZF9oY2QgPSB1c2JfY3JlYXRlX3NoYXJlZF9oY2QoZHJpdmVyLCAmcGRldi0+ZGV2LAorCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIGhjZCk7CisJaWYgKCF4aGNpLT5zaGFyZWRfaGNkKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZGVhbGxvY191c2IyX2hjZDsKKwl9CisKKwkvKgorCSAqIFNldCB0aGUgeEhDSSBwb2ludGVyIGJlZm9yZSB4aGNpX3BsYXRfc2V0dXAoKSAoYWthIGhjZF9kcml2ZXIucmVzZXQpCisJICogaXMgY2FsbGVkIGJ5IHVzYl9hZGRfaGNkKCkuCisJICovCisJKigoc3RydWN0IHhoY2lfaGNkICoqKSB4aGNpLT5zaGFyZWRfaGNkLT5oY2RfcHJpdikgPSB4aGNpOworCisJcmV0ID0gdXNiX2FkZF9oY2QoeGhjaS0+c2hhcmVkX2hjZCwgaXJxLCBJUlFGX1NIQVJFRCk7CisJaWYgKHJldCkKKwkJZ290byBwdXRfdXNiM19oY2Q7CisKKwlyZXR1cm4gMDsKKworcHV0X3VzYjNfaGNkOgorCXVzYl9wdXRfaGNkKHhoY2ktPnNoYXJlZF9oY2QpOworCitkZWFsbG9jX3VzYjJfaGNkOgorCXVzYl9yZW1vdmVfaGNkKGhjZCk7CisKK3VubWFwX3JlZ2lzdGVyczoKKwlpb3VubWFwKGhjZC0+cmVncyk7CisKK3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24oaGNkLT5yc3JjX3N0YXJ0LCBoY2QtPnJzcmNfbGVuKTsKKworcHV0X2hjZDoKKwl1c2JfcHV0X2hjZChoY2QpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4aGNpX3BsYXRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZAkqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgeGhjaV9oY2QJKnhoY2kgPSBoY2RfdG9feGhjaShoY2QpOworCisJdXNiX3JlbW92ZV9oY2QoeGhjaS0+c2hhcmVkX2hjZCk7CisJdXNiX3B1dF9oY2QoeGhjaS0+c2hhcmVkX2hjZCk7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCWlvdW5tYXAoaGNkLT5yZWdzKTsKKwl1c2JfcHV0X2hjZChoY2QpOworCisJLyogRG8gdGhlIFBsYXRmb3JtIHNwZWNpZmljIHNodXRkb3duICovCisJY29tY2VydG9fc3RvcF94aGNpKCk7CisKKwlrZnJlZSh4aGNpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB1c2JfeGhjaV9kcml2ZXIgPSB7CisJLnByb2JlCT0geGhjaV9wbGF0X3Byb2JlLAorCS5yZW1vdmUJPSB4aGNpX3BsYXRfcmVtb3ZlLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lID0gInhoY2ktaGNkIiwKKwl9LAorfTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06eGhjaS1oY2QiKTsKKworaW50IHhoY2lfcmVnaXN0ZXJfcGxhdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnVzYl94aGNpX2RyaXZlcik7Cit9CisKK3ZvaWQgeGhjaV91bnJlZ2lzdGVyX3BsYXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdXNiX3hoY2lfZHJpdmVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCmluZGV4IGZiMDk4MWUuLjFlNGIxMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwpAQCAtMTQzLDIyICsxNDMsMjYgQEAKICAqIFNlZSBDeWNsZSBiaXQgcnVsZXMuIFNXIGlzIHRoZSBjb25zdW1lciBmb3IgdGhlIGV2ZW50IHJpbmcgb25seS4KICAqIERvbid0IG1ha2UgYSByaW5nIGZ1bGwgb2YgbGluayBUUkJzLiAgVGhhdCB3b3VsZCBiZSBkdW1iIGFuZCB0aGlzIHdvdWxkIGxvb3AuCiAgKi8KLXN0YXRpYyB2b2lkIGluY19kZXEoc3RydWN0IHhoY2lfaGNkICp4aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nLCBib29sIGNvbnN1bWVyKQorc3RhdGljIHZvaWQgaW5jX2RlcShzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB4aGNpX3JpbmcgKnJpbmcpCiB7Ci0JdW5pb24geGhjaV90cmIgKm5leHQgPSArKyhyaW5nLT5kZXF1ZXVlKTsKKwl1bmlvbiB4aGNpX3RyYiAqbmV4dDsKIAl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsKIAogCXJpbmctPmRlcV91cGRhdGVzKys7CisKKwkvKiBJZiB0aGlzIGlzIG5vdCBldmVudCByaW5nLCB0aGVyZSBpcyBvbmUgbW9yZSB1c2FibGUgVFJCICovCisJaWYgKHJpbmctPnR5cGUgIT0gVFlQRV9FVkVOVCAmJgorCQkJIWxhc3RfdHJiKHhoY2ksIHJpbmcsIHJpbmctPmRlcV9zZWcsIHJpbmctPmRlcXVldWUpKQorCQlyaW5nLT5udW1fdHJic19mcmVlKys7CisJbmV4dCA9ICsrKHJpbmctPmRlcXVldWUpOworCiAJLyogVXBkYXRlIHRoZSBkZXF1ZXVlIHBvaW50ZXIgZnVydGhlciBpZiB0aGF0IHdhcyBhIGxpbmsgVFJCIG9yIHdlJ3JlIGF0CiAJICogdGhlIGVuZCBvZiBhbiBldmVudCByaW5nIHNlZ21lbnQgKHdoaWNoIGRvZXNuJ3QgaGF2ZSBsaW5rIFRSQlMpCiAJICovCiAJd2hpbGUgKGxhc3RfdHJiKHhoY2ksIHJpbmcsIHJpbmctPmRlcV9zZWcsIG5leHQpKSB7Ci0JCWlmIChjb25zdW1lciAmJiBsYXN0X3RyYl9vbl9sYXN0X3NlZyh4aGNpLCByaW5nLCByaW5nLT5kZXFfc2VnLCBuZXh0KSkgeworCQlpZiAocmluZy0+dHlwZSA9PSBUWVBFX0VWRU5UICYmCWxhc3RfdHJiX29uX2xhc3Rfc2VnKHhoY2ksCisJCQkJcmluZywgcmluZy0+ZGVxX3NlZywgbmV4dCkpIHsKIAkJCXJpbmctPmN5Y2xlX3N0YXRlID0gKHJpbmctPmN5Y2xlX3N0YXRlID8gMCA6IDEpOwotCQkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkKLQkJCQl4aGNpX2RiZyh4aGNpLCAiVG9nZ2xlIGN5Y2xlIHN0YXRlIGZvciByaW5nICVwID0gJWlcbiIsCi0JCQkJCQlyaW5nLAotCQkJCQkJKHVuc2lnbmVkIGludCkgcmluZy0+Y3ljbGVfc3RhdGUpOwogCQl9CiAJCXJpbmctPmRlcV9zZWcgPSByaW5nLT5kZXFfc2VnLT5uZXh0OwogCQlyaW5nLT5kZXF1ZXVlID0gcmluZy0+ZGVxX3NlZy0+dHJiczsKQEAgLTE4NSwxMyArMTg5LDE3IEBACiAgKgkJCXByZXBhcmVfdHJhbnNmZXIoKT8KICAqLwogc3RhdGljIHZvaWQgaW5jX2VucShzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB4aGNpX3JpbmcgKnJpbmcsCi0JCWJvb2wgY29uc3VtZXIsIGJvb2wgbW9yZV90cmJzX2NvbWluZywgYm9vbCBpc29jKQorCQkJYm9vbCBtb3JlX3RyYnNfY29taW5nKQogewogCXUzMiBjaGFpbjsKIAl1bmlvbiB4aGNpX3RyYiAqbmV4dDsKIAl1bnNpZ25lZCBsb25nIGxvbmcgYWRkcjsKIAogCWNoYWluID0gbGUzMl90b19jcHUocmluZy0+ZW5xdWV1ZS0+Z2VuZXJpYy5maWVsZFszXSkgJiBUUkJfQ0hBSU47CisJLyogSWYgdGhpcyBpcyBub3QgZXZlbnQgcmluZywgdGhlcmUgaXMgb25lIGxlc3MgdXNhYmxlIFRSQiAqLworCWlmIChyaW5nLT50eXBlICE9IFRZUEVfRVZFTlQgJiYKKwkJCSFsYXN0X3RyYih4aGNpLCByaW5nLCByaW5nLT5lbnFfc2VnLCByaW5nLT5lbnF1ZXVlKSkKKwkJcmluZy0+bnVtX3RyYnNfZnJlZS0tOwogCW5leHQgPSArKyhyaW5nLT5lbnF1ZXVlKTsKIAogCXJpbmctPmVucV91cGRhdGVzKys7CkBAIC0xOTksNDIgKzIwNywzOCBAQAogCSAqIHRoZSBlbmQgb2YgYW4gZXZlbnQgcmluZyBzZWdtZW50ICh3aGljaCBkb2Vzbid0IGhhdmUgbGluayBUUkJTKQogCSAqLwogCXdoaWxlIChsYXN0X3RyYih4aGNpLCByaW5nLCByaW5nLT5lbnFfc2VnLCBuZXh0KSkgewotCQlpZiAoIWNvbnN1bWVyKSB7Ci0JCQlpZiAocmluZyAhPSB4aGNpLT5ldmVudF9yaW5nKSB7Ci0JCQkJLyoKLQkJCQkgKiBJZiB0aGUgY2FsbGVyIGRvZXNuJ3QgcGxhbiBvbiBlbnF1ZXVlaW5nIG1vcmUKLQkJCQkgKiBURHMgYmVmb3JlIHJpbmdpbmcgdGhlIGRvb3JiZWxsLCB0aGVuIHdlCi0JCQkJICogZG9uJ3Qgd2FudCB0byBnaXZlIHRoZSBsaW5rIFRSQiB0byB0aGUKLQkJCQkgKiBoYXJkd2FyZSBqdXN0IHlldC4gIFdlJ2xsIGdpdmUgdGhlIGxpbmsgVFJCCi0JCQkJICogYmFjayBpbiBwcmVwYXJlX3JpbmcoKSBqdXN0IGJlZm9yZSB3ZSBlbnF1ZXVlCi0JCQkJICogdGhlIFREIGF0IHRoZSB0b3Agb2YgdGhlIHJpbmcuCi0JCQkJICovCi0JCQkJaWYgKCFjaGFpbiAmJiAhbW9yZV90cmJzX2NvbWluZykKLQkJCQkJYnJlYWs7CisJCWlmIChyaW5nLT50eXBlICE9IFRZUEVfRVZFTlQpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgY2FsbGVyIGRvZXNuJ3QgcGxhbiBvbiBlbnF1ZXVlaW5nIG1vcmUKKwkJCSAqIFREcyBiZWZvcmUgcmluZ2luZyB0aGUgZG9vcmJlbGwsIHRoZW4gd2UKKwkJCSAqIGRvbid0IHdhbnQgdG8gZ2l2ZSB0aGUgbGluayBUUkIgdG8gdGhlCisJCQkgKiBoYXJkd2FyZSBqdXN0IHlldC4gIFdlJ2xsIGdpdmUgdGhlIGxpbmsgVFJCCisJCQkgKiBiYWNrIGluIHByZXBhcmVfcmluZygpIGp1c3QgYmVmb3JlIHdlIGVucXVldWUKKwkJCSAqIHRoZSBURCBhdCB0aGUgdG9wIG9mIHRoZSByaW5nLgorCQkJICovCisJCQlpZiAoIWNoYWluICYmICFtb3JlX3RyYnNfY29taW5nKQorCQkJCWJyZWFrOwogCi0JCQkJLyogSWYgd2UncmUgbm90IGRlYWxpbmcgd2l0aCAwLjk1IGhhcmR3YXJlIG9yCi0JCQkJICogaXNvYyByaW5ncyBvbiBBTUQgMC45NiBob3N0LAotCQkJCSAqIGNhcnJ5IG92ZXIgdGhlIGNoYWluIGJpdCBvZiB0aGUgcHJldmlvdXMgVFJCCi0JCQkJICogKHdoaWNoIG1heSBtZWFuIHRoZSBjaGFpbiBiaXQgaXMgY2xlYXJlZCkuCi0JCQkJICovCi0JCQkJaWYgKCEoaXNvYyAmJiAoeGhjaS0+cXVpcmtzICYgWEhDSV9BTURfMHg5Nl9IT1NUKSkKKwkJCS8qIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggMC45NSBoYXJkd2FyZSBvcgorCQkJICogaXNvYyByaW5ncyBvbiBBTUQgMC45NiBob3N0LAorCQkJICogY2Fycnkgb3ZlciB0aGUgY2hhaW4gYml0IG9mIHRoZSBwcmV2aW91cyBUUkIKKwkJCSAqICh3aGljaCBtYXkgbWVhbiB0aGUgY2hhaW4gYml0IGlzIGNsZWFyZWQpLgorCQkJICovCisJCQlpZiAoIShyaW5nLT50eXBlID09IFRZUEVfSVNPQyAmJgorCQkJCQkoeGhjaS0+cXVpcmtzICYgWEhDSV9BTURfMHg5Nl9IT1NUKSkKIAkJCQkJCSYmICF4aGNpX2xpbmtfdHJiX3F1aXJrKHhoY2kpKSB7Ci0JCQkJCW5leHQtPmxpbmsuY29udHJvbCAmPQotCQkJCQkJY3B1X3RvX2xlMzIoflRSQl9DSEFJTik7Ci0JCQkJCW5leHQtPmxpbmsuY29udHJvbCB8PQotCQkJCQkJY3B1X3RvX2xlMzIoY2hhaW4pOwotCQkJCX0KLQkJCQkvKiBHaXZlIHRoaXMgbGluayBUUkIgdG8gdGhlIGhhcmR3YXJlICovCi0JCQkJd21iKCk7Ci0JCQkJbmV4dC0+bGluay5jb250cm9sIF49IGNwdV90b19sZTMyKFRSQl9DWUNMRSk7CisJCQkJbmV4dC0+bGluay5jb250cm9sICY9CisJCQkJCWNwdV90b19sZTMyKH5UUkJfQ0hBSU4pOworCQkJCW5leHQtPmxpbmsuY29udHJvbCB8PQorCQkJCQljcHVfdG9fbGUzMihjaGFpbik7CiAJCQl9CisJCQkvKiBHaXZlIHRoaXMgbGluayBUUkIgdG8gdGhlIGhhcmR3YXJlICovCisJCQl3bWIoKTsKKwkJCW5leHQtPmxpbmsuY29udHJvbCBePSBjcHVfdG9fbGUzMihUUkJfQ1lDTEUpOworCiAJCQkvKiBUb2dnbGUgdGhlIGN5Y2xlIGJpdCBhZnRlciB0aGUgbGFzdCByaW5nIHNlZ21lbnQuICovCiAJCQlpZiAobGFzdF90cmJfb25fbGFzdF9zZWcoeGhjaSwgcmluZywgcmluZy0+ZW5xX3NlZywgbmV4dCkpIHsKIAkJCQlyaW5nLT5jeWNsZV9zdGF0ZSA9IChyaW5nLT5jeWNsZV9zdGF0ZSA/IDAgOiAxKTsKLQkJCQlpZiAoIWluX2ludGVycnVwdCgpKQotCQkJCQl4aGNpX2RiZyh4aGNpLCAiVG9nZ2xlIGN5Y2xlIHN0YXRlIGZvciByaW5nICVwID0gJWlcbiIsCi0JCQkJCQkJcmluZywKLQkJCQkJCQkodW5zaWduZWQgaW50KSByaW5nLT5jeWNsZV9zdGF0ZSk7CiAJCQl9CiAJCX0KIAkJcmluZy0+ZW5xX3NlZyA9IHJpbmctPmVucV9zZWctPm5leHQ7CkBAIC0yNDUsNTUgKzI0OSwyMyBAQAogfQogCiAvKgotICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3Mgcm9vbSB0byBlbnF1ZXVlIG51bV90cmJzIG9uIHRoZSByaW5nLiAgU2VlIHJ1bGVzCi0gKiBhYm92ZS4KLSAqIEZJWE1FOiB0aGlzIHdvdWxkIGJlIHNpbXBsZXIgYW5kIGZhc3RlciBpZiB3ZSBqdXN0IGtlcHQgdHJhY2sgb2YgdGhlIG51bWJlcgotICogb2YgZnJlZSBUUkJzIGluIGEgcmluZy4KKyAqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIHJvb20gdG8gZW5xdWV1ZSBudW1fdHJicyBvbiB0aGUgcmluZyBhbmQgbWFrZSBzdXJlCisgKiBlbnF1ZXVlIHBvaW50ZXIgd2lsbCBub3QgYWR2YW5jZSBpbnRvIGRlcXVldWUgc2VnbWVudC4gU2VlIHJ1bGVzIGFib3ZlLgogICovCi1zdGF0aWMgaW50IHJvb21fb25fcmluZyhzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB4aGNpX3JpbmcgKnJpbmcsCitzdGF0aWMgaW5saW5lIGludCByb29tX29uX3Jpbmcoc3RydWN0IHhoY2lfaGNkICp4aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nLAogCQl1bnNpZ25lZCBpbnQgbnVtX3RyYnMpCiB7Ci0JaW50IGk7Ci0JdW5pb24geGhjaV90cmIgKmVucSA9IHJpbmctPmVucXVldWU7Ci0Jc3RydWN0IHhoY2lfc2VnbWVudCAqZW5xX3NlZyA9IHJpbmctPmVucV9zZWc7Ci0Jc3RydWN0IHhoY2lfc2VnbWVudCAqY3VyX3NlZzsKLQl1bnNpZ25lZCBpbnQgbGVmdF9vbl9yaW5nOworCWludCBudW1fdHJic19pbl9kZXFfc2VnOwogCi0JLyogSWYgd2UgYXJlIGN1cnJlbnRseSBwb2ludGluZyB0byBhIGxpbmsgVFJCLCBhZHZhbmNlIHRoZQotCSAqIGVucXVldWUgcG9pbnRlciBiZWZvcmUgY2hlY2tpbmcgZm9yIHNwYWNlICovCi0Jd2hpbGUgKGxhc3RfdHJiKHhoY2ksIHJpbmcsIGVucV9zZWcsIGVucSkpIHsKLQkJZW5xX3NlZyA9IGVucV9zZWctPm5leHQ7Ci0JCWVucSA9IGVucV9zZWctPnRyYnM7Ci0JfQorCWlmIChyaW5nLT5udW1fdHJic19mcmVlIDwgbnVtX3RyYnMpCisJCXJldHVybiAwOwogCi0JLyogQ2hlY2sgaWYgcmluZyBpcyBlbXB0eSAqLwotCWlmIChlbnEgPT0gcmluZy0+ZGVxdWV1ZSkgewotCQkvKiBDYW4ndCB1c2UgbGluayB0cmJzICovCi0JCWxlZnRfb25fcmluZyA9IFRSQlNfUEVSX1NFR01FTlQgLSAxOwotCQlmb3IgKGN1cl9zZWcgPSBlbnFfc2VnLT5uZXh0OyBjdXJfc2VnICE9IGVucV9zZWc7Ci0JCQkJY3VyX3NlZyA9IGN1cl9zZWctPm5leHQpCi0JCQlsZWZ0X29uX3JpbmcgKz0gVFJCU19QRVJfU0VHTUVOVCAtIDE7Ci0KLQkJLyogQWx3YXlzIG5lZWQgb25lIFRSQiBmcmVlIGluIHRoZSByaW5nLiAqLwotCQlsZWZ0X29uX3JpbmcgLT0gMTsKLQkJaWYgKG51bV90cmJzID4gbGVmdF9vbl9yaW5nKSB7Ci0JCQl4aGNpX3dhcm4oeGhjaSwgIk5vdCBlbm91Z2ggcm9vbSBvbiByaW5nOyAiCi0JCQkJCSJuZWVkICV1IFRSQnMsICV1IFRSQnMgbGVmdFxuIiwKLQkJCQkJbnVtX3RyYnMsIGxlZnRfb25fcmluZyk7CisJaWYgKHJpbmctPnR5cGUgIT0gVFlQRV9DT01NQU5EICYmIHJpbmctPnR5cGUgIT0gVFlQRV9FVkVOVCkgeworCQludW1fdHJic19pbl9kZXFfc2VnID0gcmluZy0+ZGVxdWV1ZSAtIHJpbmctPmRlcV9zZWctPnRyYnM7CisJCWlmIChyaW5nLT5udW1fdHJic19mcmVlIDwgbnVtX3RyYnMgKyBudW1fdHJic19pbl9kZXFfc2VnKQogCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7CiAJfQotCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGFuIGV4dHJhIGVtcHR5IFRSQiBhdmFpbGFibGUgKi8KLQlmb3IgKGkgPSAwOyBpIDw9IG51bV90cmJzOyArK2kpIHsKLQkJaWYgKGVucSA9PSByaW5nLT5kZXF1ZXVlKQotCQkJcmV0dXJuIDA7Ci0JCWVucSsrOwotCQl3aGlsZSAobGFzdF90cmIoeGhjaSwgcmluZywgZW5xX3NlZywgZW5xKSkgewotCQkJZW5xX3NlZyA9IGVucV9zZWctPm5leHQ7Ci0JCQllbnEgPSBlbnFfc2VnLT50cmJzOwotCQl9Ci0JfQorCiAJcmV0dXJuIDE7CiB9CiAKQEAgLTU2MCwxMiArNTMyLDkgQEAKIAkJCQkJY3B1X3RvX2xlMzIoVFJCX0NZQ0xFKTsKIAkJCWN1cl90cmItPmdlbmVyaWMuZmllbGRbM10gfD0gY3B1X3RvX2xlMzIoCiAJCQkJVFJCX1RZUEUoVFJCX1RSX05PT1ApKTsKLQkJCXhoY2lfZGJnKHhoY2ksICJDYW5jZWwgVFJCICVwICgweCVsbHggZG1hKSAiCi0JCQkJCSJpbiBzZWcgJXAgKDB4JWxseCBkbWEpXG4iLAotCQkJCQljdXJfdHJiLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXhoY2lfdHJiX3ZpcnRfdG9fZG1hKGN1cl9zZWcsIGN1cl90cmIpLAotCQkJCQljdXJfc2VnLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWN1cl9zZWctPmRtYSk7CisJCQl4aGNpX2RiZyh4aGNpLCAiVFJCIHRvIG5vb3AgYXQgb2Zmc2V0IDB4JWxseFxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJeGhjaV90cmJfdmlydF90b19kbWEoY3VyX3NlZywgY3VyX3RyYikpOwogCQl9CiAJCWlmIChjdXJfdHJiID09IGN1cl90ZC0+bGFzdF90cmIpCiAJCQlicmVhazsKQEAgLTcwNSw5ICs2NzQsOSBAQAogCSAqLwogCWxpc3RfZm9yX2VhY2goZW50cnksICZlcC0+Y2FuY2VsbGVkX3RkX2xpc3QpIHsKIAkJY3VyX3RkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHhoY2lfdGQsIGNhbmNlbGxlZF90ZF9saXN0KTsKLQkJeGhjaV9kYmcoeGhjaSwgIkNhbmNlbGxpbmcgVEQgc3RhcnRpbmcgYXQgJXAsIDB4JWxseCAoZG1hKS5cbiIsCi0JCQkJY3VyX3RkLT5maXJzdF90cmIsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl4aGNpX3RyYl92aXJ0X3RvX2RtYShjdXJfdGQtPnN0YXJ0X3NlZywgY3VyX3RkLT5maXJzdF90cmIpKTsKKwkJeGhjaV9kYmcoeGhjaSwgIlJlbW92aW5nIGNhbmNlbGVkIFREIHN0YXJ0aW5nIGF0IDB4JWxseCAoZG1hKS5cbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl4aGNpX3RyYl92aXJ0X3RvX2RtYSgKKwkJCQkJY3VyX3RkLT5zdGFydF9zZWcsIGN1cl90ZC0+Zmlyc3RfdHJiKSk7CiAJCWVwX3JpbmcgPSB4aGNpX3VyYl90b190cmFuc2Zlcl9yaW5nKHhoY2ksIGN1cl90ZC0+dXJiKTsKIAkJaWYgKCFlcF9yaW5nKSB7CiAJCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gdW5sZXNzIGEgZHJpdmVyIGlzIG11Y2tpbmcKQEAgLTkwMyw2ICs4NzIsNDMgQEAKIAl4aGNpX2RiZyh4aGNpLCAieEhDSSBob3N0IGNvbnRyb2xsZXIgaXMgZGVhZC5cbiIpOwogfQogCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9yaW5nX2Zvcl9zZXRfZGVxX2NvbXBsZXRpb24oc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCQlzdHJ1Y3QgeGhjaV92aXJ0X2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgeGhjaV9yaW5nICplcF9yaW5nLAorCQl1bnNpZ25lZCBpbnQgZXBfaW5kZXgpCit7CisJdW5pb24geGhjaV90cmIgKmRlcXVldWVfdGVtcDsKKwlpbnQgbnVtX3RyYnNfZnJlZV90ZW1wOworCWJvb2wgcmV2ZXJ0ID0gZmFsc2U7CisKKwludW1fdHJic19mcmVlX3RlbXAgPSBlcF9yaW5nLT5udW1fdHJic19mcmVlOworCWRlcXVldWVfdGVtcCA9IGVwX3JpbmctPmRlcXVldWU7CisKKwl3aGlsZSAoZXBfcmluZy0+ZGVxdWV1ZSAhPSBkZXYtPmVwc1tlcF9pbmRleF0ucXVldWVkX2RlcV9wdHIpIHsKKwkJLyogV2UgaGF2ZSBtb3JlIHVzYWJsZSBUUkJzICovCisJCWVwX3JpbmctPm51bV90cmJzX2ZyZWUrKzsKKwkJZXBfcmluZy0+ZGVxdWV1ZSsrOworCQlpZiAobGFzdF90cmIoeGhjaSwgZXBfcmluZywgZXBfcmluZy0+ZGVxX3NlZywKKwkJCQllcF9yaW5nLT5kZXF1ZXVlKSkgeworCQkJaWYgKGVwX3JpbmctPmRlcXVldWUgPT0KKwkJCQkJZGV2LT5lcHNbZXBfaW5kZXhdLnF1ZXVlZF9kZXFfcHRyKQorCQkJCWJyZWFrOworCQkJZXBfcmluZy0+ZGVxX3NlZyA9IGVwX3JpbmctPmRlcV9zZWctPm5leHQ7CisJCQllcF9yaW5nLT5kZXF1ZXVlID0gZXBfcmluZy0+ZGVxX3NlZy0+dHJiczsKKwkJfQorCQlpZiAoZXBfcmluZy0+ZGVxdWV1ZSA9PSBkZXF1ZXVlX3RlbXApIHsKKwkJCXJldmVydCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChyZXZlcnQpIHsKKwkJeGhjaV9kYmcoeGhjaSwgIlVuYWJsZSB0byBmaW5kIG5ldyBkZXF1ZXVlIHBvaW50ZXJcbiIpOworCQllcF9yaW5nLT5udW1fdHJic19mcmVlID0gbnVtX3RyYnNfZnJlZV90ZW1wOworCX0KK30KKwogLyoKICAqIFdoZW4gd2UgZ2V0IGEgY29tcGxldGlvbiBmb3IgYSBTZXQgVHJhbnNmZXIgUmluZyBEZXF1ZXVlIFBvaW50ZXIgY29tbWFuZCwKICAqIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHNldCBkZXEgcGVuZGluZyBmbGFnIGluIHRoZSBlbmRwb2ludCByaW5nIHN0YXRlLCBzbyB0aGF0CkBAIC05ODQsOCArOTkwLDggQEAKIAkJCS8qIFVwZGF0ZSB0aGUgcmluZydzIGRlcXVldWUgc2VnbWVudCBhbmQgZGVxdWV1ZSBwb2ludGVyCiAJCQkgKiB0byByZWZsZWN0IHRoZSBuZXcgcG9zaXRpb24uCiAJCQkgKi8KLQkJCWVwX3JpbmctPmRlcV9zZWcgPSBkZXYtPmVwc1tlcF9pbmRleF0ucXVldWVkX2RlcV9zZWc7Ci0JCQllcF9yaW5nLT5kZXF1ZXVlID0gZGV2LT5lcHNbZXBfaW5kZXhdLnF1ZXVlZF9kZXFfcHRyOworCQkJdXBkYXRlX3JpbmdfZm9yX3NldF9kZXFfY29tcGxldGlvbih4aGNpLCBkZXYsCisJCQkJZXBfcmluZywgZXBfaW5kZXgpOwogCQl9IGVsc2UgewogCQkJeGhjaV93YXJuKHhoY2ksICJNaXNtYXRjaCBiZXR3ZWVuIGNvbXBsZXRlZCBTZXQgVFIgRGVxICIKIAkJCQkJIlB0ciBjb21tYW5kICYgeEhDSSBpbnRlcm5hbCBzdGF0ZS5cbiIpOwpAQCAtMTE5Niw3ICsxMjAyLDcgQEAKIAkJeGhjaS0+ZXJyb3JfYml0bWFzayB8PSAxIDw8IDY7CiAJCWJyZWFrOwogCX0KLQlpbmNfZGVxKHhoY2ksIHhoY2ktPmNtZF9yaW5nLCBmYWxzZSk7CisJaW5jX2RlcSh4aGNpLCB4aGNpLT5jbWRfcmluZyk7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV92ZW5kb3JfZXZlbnQoc3RydWN0IHhoY2lfaGNkICp4aGNpLApAQCAtMTI0OCw2ICsxMjU0LDI4IEBACiAJcmV0dXJuIG51bV9zaW1pbGFyX3NwZWVkX3BvcnRzOwogfQogCisjaWYgMAorc3RhdGljIHZvaWQgaGFuZGxlX2RldmljZV9ub3RpZmljYXRpb24oc3RydWN0IHhoY2lfaGNkICp4aGNpLAorCQl1bmlvbiB4aGNpX3RyYiAqZXZlbnQpCit7CisJdTMyIHNsb3RfaWQ7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisKKwlzbG90X2lkID0gVFJCX1RPX1NMT1RfSUQoZXZlbnQtPmdlbmVyaWMuZmllbGRbM10pOworCWlmICgheGhjaS0+ZGV2c1tzbG90X2lkXSkgeworCQl4aGNpX3dhcm4oeGhjaSwgIkRldmljZSBOb3RpZmljYXRpb24gZXZlbnQgZm9yICIKKwkJCQkidW51c2VkIHNsb3QgJXVcbiIsIHNsb3RfaWQpOworCQlyZXR1cm47CisJfQorCisJeGhjaV9kYmcoeGhjaSwgIkRldmljZSBXYWtlIE5vdGlmaWNhdGlvbiBldmVudCBmb3Igc2xvdCBJRCAldVxuIiwKKwkJCXNsb3RfaWQpOworCXVkZXYgPSB4aGNpLT5kZXZzW3Nsb3RfaWRdLT51ZGV2OworCWlmICh1ZGV2ICYmIHVkZXYtPnBhcmVudCkKKwkJdXNiX3dha2V1cF9ub3RpZmljYXRpb24odWRldi0+cGFyZW50LCB1ZGV2LT5wb3J0bnVtKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBoYW5kbGVfcG9ydF9zdGF0dXMoc3RydWN0IHhoY2lfaGNkICp4aGNpLAogCQl1bmlvbiB4aGNpX3RyYiAqZXZlbnQpCiB7CkBAIC0xMzMyLDcgKzEzNjAsMTQgQEAKIAkJfQogCiAJCWlmIChERVZfU1VQRVJTUEVFRCh0ZW1wKSkgewotCQkJeGhjaV9kYmcoeGhjaSwgInJlc3VtZSBTUyBwb3J0ICVkXG4iLCBwb3J0X2lkKTsKKwkJCXhoY2lfZGJnKHhoY2ksICJyZW1vdGUgd2FrZSBTUyBwb3J0ICVkXG4iLCBwb3J0X2lkKTsKKwkJCS8qIFNldCBhIGZsYWcgdG8gc2F5IHRoZSBwb3J0IHNpZ25hbGVkIHJlbW90ZSB3YWtldXAsCisJCQkgKiBzbyB3ZSBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBlbmQgb2YKKwkJCSAqIGRldmljZSBhbmQgaG9zdCBpbml0aWF0ZWQgcmVzdW1lLgorCQkJICovCisJCQlidXNfc3RhdGUtPnBvcnRfcmVtb3RlX3dha2V1cCB8PSAxIDw8IGZha2VkX3BvcnRfaW5kZXg7CisJCQl4aGNpX3Rlc3RfYW5kX2NsZWFyX2JpdCh4aGNpLCBwb3J0X2FycmF5LAorCQkJCQlmYWtlZF9wb3J0X2luZGV4LCBQT1JUX1BMQyk7CiAJCQl4aGNpX3NldF9saW5rX3N0YXRlKHhoY2ksIHBvcnRfYXJyYXksIGZha2VkX3BvcnRfaW5kZXgsCiAJCQkJCQlYREVWX1UwKTsKIAkJCXNsb3RfaWQgPSB4aGNpX2ZpbmRfc2xvdF9pZF9ieV9wb3J0KGhjZCwgeGhjaSwKQEAgLTEzNTYsMTMgKzEzOTEsNDAgQEAKIAkJfQogCX0KIAorI2lmIDAKKwlpZiAoKHRlbXAgJiBQT1JUX1BMQykgJiYgKHRlbXAgJiBQT1JUX1BMU19NQVNLKSA9PSBYREVWX1UwICYmCisJCQlERVZfU1VQRVJTUEVFRCh0ZW1wKSkgeworCQl4aGNpX2RiZyh4aGNpLCAicmVzdW1lIFNTIHBvcnQgJWQgZmluaXNoZWRcbiIsIHBvcnRfaWQpOworCQkvKiBXZSd2ZSBqdXN0IGJyb3VnaHQgdGhlIGRldmljZSBpbnRvIFUwIHRocm91Z2ggZWl0aGVyIHRoZQorCQkgKiBSZXN1bWUgc3RhdGUgYWZ0ZXIgYSBkZXZpY2UgcmVtb3RlIHdha2V1cCwgb3IgdGhyb3VnaCB0aGUKKwkJICogVTNFeGl0IHN0YXRlIGFmdGVyIGEgaG9zdC1pbml0aWF0ZWQgcmVzdW1lLiAgSWYgaXQncyBhIGRldmljZQorCQkgKiBpbml0aWF0ZWQgcmVtb3RlIHdha2UsIGRvbid0IHBhc3MgdXAgdGhlIGxpbmsgc3RhdGUgY2hhbmdlLAorCQkgKiBzbyB0aGUgcm9vdGh1YiBiZWhhdmlvciBpcyBjb25zaXN0ZW50IHdpdGggZXh0ZXJuYWwKKwkJICogVVNCIDMuMCBodWIgYmVoYXZpb3IuCisJCSAqLworCQlzbG90X2lkID0geGhjaV9maW5kX3Nsb3RfaWRfYnlfcG9ydChoY2QsIHhoY2ksCisJCQkJZmFrZWRfcG9ydF9pbmRleCArIDEpOworCQlpZiAoc2xvdF9pZCAmJiB4aGNpLT5kZXZzW3Nsb3RfaWRdKQorCQkJeGhjaV9yaW5nX2RldmljZSh4aGNpLCBzbG90X2lkKTsKKwkJaWYgKGJ1c19zdGF0ZS0+cG9ydF9yZW1vdGVfd2FrZXVwICYmICgxIDw8IGZha2VkX3BvcnRfaW5kZXgpKSB7CisJCQlidXNfc3RhdGUtPnBvcnRfcmVtb3RlX3dha2V1cCAmPQorCQkJCX4oMSA8PCBmYWtlZF9wb3J0X2luZGV4KTsKKwkJCXhoY2lfdGVzdF9hbmRfY2xlYXJfYml0KHhoY2ksIHBvcnRfYXJyYXksCisJCQkJCWZha2VkX3BvcnRfaW5kZXgsIFBPUlRfUExDKTsKKwkJCXVzYl93YWtldXBfbm90aWZpY2F0aW9uKGhjZC0+c2VsZi5yb290X2h1YiwKKwkJCQkJZmFrZWRfcG9ydF9pbmRleCArIDEpOworCQkJYm9ndXNfcG9ydF9zdGF0dXMgPSB0cnVlOworCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorI2VuZGlmCiAJaWYgKGhjZC0+c3BlZWQgIT0gSENEX1VTQjMpCiAJCXhoY2lfdGVzdF9hbmRfY2xlYXJfYml0KHhoY2ksIHBvcnRfYXJyYXksIGZha2VkX3BvcnRfaW5kZXgsCiAJCQkJCVBPUlRfUExDKTsKIAogY2xlYW51cDoKIAkvKiBVcGRhdGUgZXZlbnQgcmluZyBkZXF1ZXVlIHBvaW50ZXIgYmVmb3JlIGRyb3BwaW5nIHRoZSBsb2NrICovCi0JaW5jX2RlcSh4aGNpLCB4aGNpLT5ldmVudF9yaW5nLCB0cnVlKTsKKwlpbmNfZGVxKHhoY2ksIHhoY2ktPmV2ZW50X3JpbmcpOwogCiAJLyogRG9uJ3QgbWFrZSB0aGUgVVNCIGNvcmUgcG9sbCB0aGUgcm9vdGh1YiBpZiB3ZSBnb3QgYSBiYWQgcG9ydCBzdGF0dXMKIAkgKiBjaGFuZ2UgZXZlbnQuICBCZXNpZGVzLCBhdCB0aGF0IHBvaW50IHdlIGNhbid0IHRlbGwgd2hpY2ggcm9vdGh1YgpAQCAtMTU1Nyw4ICsxNjE5LDggQEAKIAkJfSBlbHNlIHsKIAkJCS8qIFVwZGF0ZSByaW5nIGRlcXVldWUgcG9pbnRlciAqLwogCQkJd2hpbGUgKGVwX3JpbmctPmRlcXVldWUgIT0gdGQtPmxhc3RfdHJiKQotCQkJCWluY19kZXEoeGhjaSwgZXBfcmluZywgZmFsc2UpOwotCQkJaW5jX2RlcSh4aGNpLCBlcF9yaW5nLCBmYWxzZSk7CisJCQkJaW5jX2RlcSh4aGNpLCBlcF9yaW5nKTsKKwkJCWluY19kZXEoeGhjaSwgZXBfcmluZyk7CiAJCX0KIAogdGRfY2xlYW51cDoKQEAgLTE2MjgsNyArMTY5MCw2IEBACiAJZXBfY3R4ID0geGhjaV9nZXRfZXBfY3R4KHhoY2ksIHhkZXYtPm91dF9jdHgsIGVwX2luZGV4KTsKIAl0cmJfY29tcF9jb2RlID0gR0VUX0NPTVBfQ09ERShsZTMyX3RvX2NwdShldmVudC0+dHJhbnNmZXJfbGVuKSk7CiAKLQl4aGNpX2RlYnVnX3RyYih4aGNpLCB4aGNpLT5ldmVudF9yaW5nLT5kZXF1ZXVlKTsKIAlzd2l0Y2ggKHRyYl9jb21wX2NvZGUpIHsKIAljYXNlIENPTVBfU1VDQ0VTUzoKIAkJaWYgKGV2ZW50X3RyYiA9PSBlcF9yaW5nLT5kZXF1ZXVlKSB7CkBAIC0xNjQ0LDcgKzE3MDUsNiBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ09NUF9TSE9SVF9UWDoKLQkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiBzaG9ydCB0cmFuc2ZlciBvbiBjb250cm9sIGVwXG4iKTsKIAkJaWYgKHRkLT51cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykKIAkJCSpzdGF0dXMgPSAtRVJFTU9URUlPOwogCQllbHNlCkBAIC0xODEzLDggKzE4NzMsOCBAQAogCiAJLyogVXBkYXRlIHJpbmcgZGVxdWV1ZSBwb2ludGVyICovCiAJd2hpbGUgKGVwX3JpbmctPmRlcXVldWUgIT0gdGQtPmxhc3RfdHJiKQotCQlpbmNfZGVxKHhoY2ksIGVwX3JpbmcsIGZhbHNlKTsKLQlpbmNfZGVxKHhoY2ksIGVwX3JpbmcsIGZhbHNlKTsKKwkJaW5jX2RlcSh4aGNpLCBlcF9yaW5nKTsKKwlpbmNfZGVxKHhoY2ksIGVwX3JpbmcpOwogCiAJcmV0dXJuIGZpbmlzaF90ZCh4aGNpLCB0ZCwgTlVMTCwgZXZlbnQsIGVwLCBzdGF0dXMsIHRydWUpOwogfQpAQCAtMTk1NSw2ICsyMDE1LDE2IEBACiAJeGRldiA9IHhoY2ktPmRldnNbc2xvdF9pZF07CiAJaWYgKCF4ZGV2KSB7CiAJCXhoY2lfZXJyKHhoY2ksICJFUlJPUiBUcmFuc2ZlciBldmVudCBwb2ludGVkIHRvIGJhZCBzbG90XG4iKTsKKwkJeGhjaV9lcnIoeGhjaSwgIkAlMDE2bGx4ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgeGhjaV90cmJfdmlydF90b19kbWEoCisJCQkJIHhoY2ktPmV2ZW50X3JpbmctPmRlcV9zZWcsCisJCQkJIHhoY2ktPmV2ZW50X3JpbmctPmRlcXVldWUpLAorCQkJIGxvd2VyXzMyX2JpdHMobGU2NF90b19jcHUoZXZlbnQtPmJ1ZmZlcikpLAorCQkJIHVwcGVyXzMyX2JpdHMobGU2NF90b19jcHUoZXZlbnQtPmJ1ZmZlcikpLAorCQkJIGxlMzJfdG9fY3B1KGV2ZW50LT50cmFuc2Zlcl9sZW4pLAorCQkJIGxlMzJfdG9fY3B1KGV2ZW50LT5mbGFncykpOworCQl4aGNpX2RiZyh4aGNpLCAiRXZlbnQgcmluZzpcbiIpOworCQl4aGNpX2RlYnVnX3NlZ21lbnQoeGhjaSwgeGhjaS0+ZXZlbnRfcmluZy0+ZGVxX3NlZyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTk2OCw2ICsyMDM4LDE2IEBACiAJICAgIEVQX1NUQVRFX0RJU0FCTEVEKSB7CiAJCXhoY2lfZXJyKHhoY2ksICJFUlJPUiBUcmFuc2ZlciBldmVudCBmb3IgZGlzYWJsZWQgZW5kcG9pbnQgIgogCQkJCSJvciBpbmNvcnJlY3Qgc3RyZWFtIHJpbmdcbiIpOworCQl4aGNpX2Vycih4aGNpLCAiQCUwMTZsbHggJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKSB4aGNpX3RyYl92aXJ0X3RvX2RtYSgKKwkJCQkgeGhjaS0+ZXZlbnRfcmluZy0+ZGVxX3NlZywKKwkJCQkgeGhjaS0+ZXZlbnRfcmluZy0+ZGVxdWV1ZSksCisJCQkgbG93ZXJfMzJfYml0cyhsZTY0X3RvX2NwdShldmVudC0+YnVmZmVyKSksCisJCQkgdXBwZXJfMzJfYml0cyhsZTY0X3RvX2NwdShldmVudC0+YnVmZmVyKSksCisJCQkgbGUzMl90b19jcHUoZXZlbnQtPnRyYW5zZmVyX2xlbiksCisJCQkgbGUzMl90b19jcHUoZXZlbnQtPmZsYWdzKSk7CisJCXhoY2lfZGJnKHhoY2ksICJFdmVudCByaW5nOlxuIik7CisJCXhoY2lfZGVidWdfc2VnbWVudCh4aGNpLCB4aGNpLT5ldmVudF9yaW5nLT5kZXFfc2VnKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0yMDAxLDcgKzIwODEsNyBAQAogCQl4aGNpX2RiZyh4aGNpLCAiU3RvcHBlZCBvbiBOby1vcCBvciBMaW5rIFRSQlxuIik7CiAJCWJyZWFrOwogCWNhc2UgQ09NUF9TVEFMTDoKLQkJeGhjaV93YXJuKHhoY2ksICJXQVJOOiBTdGFsbGVkIGVuZHBvaW50XG4iKTsKKwkJeGhjaV9kYmcoeGhjaSwgIlN0YWxsZWQgZW5kcG9pbnRcbiIpOwogCQllcC0+ZXBfc3RhdGUgfD0gRVBfSEFMVEVEOwogCQlzdGF0dXMgPSAtRVBJUEU7CiAJCWJyZWFrOwpAQCAtMjAxMSwxMSArMjA5MSwxMSBAQAogCQlicmVhazsKIAljYXNlIENPTVBfU1BMSVRfRVJSOgogCWNhc2UgQ09NUF9UWF9FUlI6Ci0JCXhoY2lfd2Fybih4aGNpLCAiV0FSTjogdHJhbnNmZXIgZXJyb3Igb24gZW5kcG9pbnRcbiIpOworCQl4aGNpX2RiZyh4aGNpLCAiVHJhbnNmZXIgZXJyb3Igb24gZW5kcG9pbnRcbiIpOwogCQlzdGF0dXMgPSAtRVBST1RPOwogCQlicmVhazsKIAljYXNlIENPTVBfQkFCQkxFOgotCQl4aGNpX3dhcm4oeGhjaSwgIldBUk46IGJhYmJsZSBlcnJvciBvbiBlbmRwb2ludFxuIik7CisJCXhoY2lfZGJnKHhoY2ksICJCYWJibGUgZXJyb3Igb24gZW5kcG9pbnRcbiIpOwogCQlzdGF0dXMgPSAtRU9WRVJGTE9XOwogCQlicmVhazsKIAljYXNlIENPTVBfREJfRVJSOgpAQCAtMjE5MSw3ICsyMjcxLDcgQEAKIAkJICogV2lsbCByb2xsIGJhY2sgdG8gY29udGludWUgcHJvY2VzcyBtaXNzZWQgdGRzLgogCQkgKi8KIAkJaWYgKHRyYl9jb21wX2NvZGUgPT0gQ09NUF9NSVNTRURfSU5UIHx8ICFlcC0+c2tpcCkgewotCQkJaW5jX2RlcSh4aGNpLCB4aGNpLT5ldmVudF9yaW5nLCB0cnVlKTsKKwkJCWluY19kZXEoeGhjaSwgeGhjaS0+ZXZlbnRfcmluZyk7CiAJCX0KIAogCQlpZiAocmV0KSB7CkBAIC0yMjg1LDYgKzIzNjUsMTEgQEAKIAkJZWxzZQogCQkJdXBkYXRlX3B0cnMgPSAwOwogCQlicmVhazsKKyNpZiAwCisJY2FzZSBUUkJfVFlQRShUUkJfREVWX05PVEUpOgorCQloYW5kbGVfZGV2aWNlX25vdGlmaWNhdGlvbih4aGNpLCBldmVudCk7CisJCWJyZWFrOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJaWYgKChsZTMyX3RvX2NwdShldmVudC0+ZXZlbnRfY21kLmZsYWdzKSAmIFRSQl9UWVBFX0JJVE1BU0spID49CiAJCSAgICBUUkJfVFlQRSg0OCkpCkBAIC0yMzAzLDcgKzIzODgsNyBAQAogCiAJaWYgKHVwZGF0ZV9wdHJzKQogCQkvKiBVcGRhdGUgU1cgZXZlbnQgcmluZyBkZXF1ZXVlIHBvaW50ZXIgKi8KLQkJaW5jX2RlcSh4aGNpLCB4aGNpLT5ldmVudF9yaW5nLCB0cnVlKTsKKwkJaW5jX2RlcSh4aGNpLCB4aGNpLT5ldmVudF9yaW5nKTsKIAogCS8qIEFyZSB0aGVyZSBtb3JlIGl0ZW1zIG9uIHRoZSBldmVudCByaW5nPyAgQ2FsbGVyIHdpbGwgY2FsbCB1cyBhZ2FpbiB0bwogCSAqIGNoZWNrLgpAQCAtMjM1NCw3ICsyNDM5LDcgQEAKIAkvKiBGSVhNRSB3aGVuIE1TSS1YIGlzIHN1cHBvcnRlZCBhbmQgdGhlcmUgYXJlIG11bHRpcGxlIHZlY3RvcnMgKi8KIAkvKiBDbGVhciB0aGUgTVNJLVggZXZlbnQgaW50ZXJydXB0IHN0YXR1cyAqLwogCi0JaWYgKGhjZC0+aXJxICE9IC0xKSB7CisJaWYgKGhjZC0+aXJxKSB7CiAJCXUzMiBpcnFfcGVuZGluZzsKIAkJLyogQWNrbm93bGVkZ2UgdGhlIFBDSSBpbnRlcnJ1cHQgKi8KIAkJaXJxX3BlbmRpbmcgPSB4aGNpX3JlYWRsKHhoY2ksICZ4aGNpLT5pcl9zZXQtPmlycV9wZW5kaW5nKTsKQEAgLTI0MDYsMTcgKzI0OTEsNyBAQAogCiBpcnFyZXR1cm5fdCB4aGNpX21zaV9pcnEoaW50IGlycSwgc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKLQlpcnFyZXR1cm5fdCByZXQ7Ci0Jc3RydWN0IHhoY2lfaGNkICp4aGNpOwotCi0JeGhjaSA9IGhjZF90b194aGNpKGhjZCk7Ci0Jc2V0X2JpdChIQ0RfRkxBR19TQVdfSVJRLCAmaGNkLT5mbGFncyk7Ci0JaWYgKHhoY2ktPnNoYXJlZF9oY2QpCi0JCXNldF9iaXQoSENEX0ZMQUdfU0FXX0lSUSwgJnhoY2ktPnNoYXJlZF9oY2QtPmZsYWdzKTsKLQotCXJldCA9IHhoY2lfaXJxKGhjZCk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiB4aGNpX2lycShoY2QpOwogfQogCiAvKioqKgkJRW5kcG9pbnQgUmluZyBPcGVyYXRpb25zCSoqKiovCkBAIC0yNDI5LDcgKzI1MDQsNyBAQAogICoJCQlwcmVwYXJlX3RyYW5zZmVyKCk/CiAgKi8KIHN0YXRpYyB2b2lkIHF1ZXVlX3RyYihzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB4aGNpX3JpbmcgKnJpbmcsCi0JCWJvb2wgY29uc3VtZXIsIGJvb2wgbW9yZV90cmJzX2NvbWluZywgYm9vbCBpc29jLAorCQlib29sIG1vcmVfdHJic19jb21pbmcsCiAJCXUzMiBmaWVsZDEsIHUzMiBmaWVsZDIsIHUzMiBmaWVsZDMsIHUzMiBmaWVsZDQpCiB7CiAJc3RydWN0IHhoY2lfZ2VuZXJpY190cmIgKnRyYjsKQEAgLTI0MzksNyArMjUxNCw3IEBACiAJdHJiLT5maWVsZFsxXSA9IGNwdV90b19sZTMyKGZpZWxkMik7CiAJdHJiLT5maWVsZFsyXSA9IGNwdV90b19sZTMyKGZpZWxkMyk7CiAJdHJiLT5maWVsZFszXSA9IGNwdV90b19sZTMyKGZpZWxkNCk7Ci0JaW5jX2VucSh4aGNpLCByaW5nLCBjb25zdW1lciwgbW9yZV90cmJzX2NvbWluZywgaXNvYyk7CisJaW5jX2VucSh4aGNpLCByaW5nLCBtb3JlX3RyYnNfY29taW5nKTsKIH0KIAogLyoKQEAgLTI0NDcsOCArMjUyMiwxMCBAQAogICogRklYTUUgYWxsb2NhdGUgc2VnbWVudHMgaWYgdGhlIHJpbmcgaXMgZnVsbC4KICAqLwogc3RhdGljIGludCBwcmVwYXJlX3Jpbmcoc3RydWN0IHhoY2lfaGNkICp4aGNpLCBzdHJ1Y3QgeGhjaV9yaW5nICplcF9yaW5nLAotCQl1MzIgZXBfc3RhdGUsIHVuc2lnbmVkIGludCBudW1fdHJicywgYm9vbCBpc29jLCBnZnBfdCBtZW1fZmxhZ3MpCisJCXUzMiBlcF9zdGF0ZSwgdW5zaWduZWQgaW50IG51bV90cmJzLCBnZnBfdCBtZW1fZmxhZ3MpCiB7CisJdW5zaWduZWQgaW50IG51bV90cmJzX25lZWRlZDsKKwogCS8qIE1ha2Ugc3VyZSB0aGUgZW5kcG9pbnQgaGFzIGJlZW4gYWRkZWQgdG8geEhDIHNjaGVkdWxlICovCiAJc3dpdGNoIChlcF9zdGF0ZSkgewogCWNhc2UgRVBfU1RBVEVfRElTQUJMRUQ6CkBAIC0yNDc2LDExICsyNTUzLDI1IEBACiAJCSAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKCFyb29tX29uX3JpbmcoeGhjaSwgZXBfcmluZywgbnVtX3RyYnMpKSB7Ci0JCS8qIEZJWE1FIGFsbG9jYXRlIG1vcmUgcm9vbSAqLwotCQl4aGNpX2Vycih4aGNpLCAiRVJST1Igbm8gcm9vbSBvbiBlcCByaW5nXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCisJd2hpbGUgKDEpIHsKKwkJaWYgKHJvb21fb25fcmluZyh4aGNpLCBlcF9yaW5nLCBudW1fdHJicykpCisJCQlicmVhazsKKworCQlpZiAoZXBfcmluZyA9PSB4aGNpLT5jbWRfcmluZykgeworCQkJeGhjaV9lcnIoeGhjaSwgIkRvIG5vdCBzdXBwb3J0IGV4cGFuZCBjb21tYW5kIHJpbmdcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQl4aGNpX2RiZyh4aGNpLCAiRVJST1Igbm8gcm9vbSBvbiBlcCByaW5nLCAiCisJCQkJCSJ0cnkgcmluZyBleHBhbnNpb25cbiIpOworCQludW1fdHJic19uZWVkZWQgPSBudW1fdHJicyAtIGVwX3JpbmctPm51bV90cmJzX2ZyZWU7CisJCWlmICh4aGNpX3JpbmdfZXhwYW5zaW9uKHhoY2ksIGVwX3JpbmcsIG51bV90cmJzX25lZWRlZCwKKwkJCQkJbWVtX2ZsYWdzKSkgeworCQkJeGhjaV9lcnIoeGhjaSwgIlJpbmcgZXhwYW5zaW9uIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX07CiAKIAlpZiAoZW5xdWV1ZV9pc19saW5rX3RyYihlcF9yaW5nKSkgewogCQlzdHJ1Y3QgeGhjaV9yaW5nICpyaW5nID0gZXBfcmluZzsKQEAgLTI0OTIsOCArMjU4Myw5IEBACiAJCQkvKiBJZiB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIDAuOTUgaGFyZHdhcmUgb3IgaXNvYyByaW5ncwogCQkJICogb24gQU1EIDAuOTYgaG9zdCwgY2xlYXIgdGhlIGNoYWluIGJpdC4KIAkJCSAqLwotCQkJaWYgKCF4aGNpX2xpbmtfdHJiX3F1aXJrKHhoY2kpICYmICEoaXNvYyAmJgotCQkJCQkoeGhjaS0+cXVpcmtzICYgWEhDSV9BTURfMHg5Nl9IT1NUKSkpCisJCQlpZiAoIXhoY2lfbGlua190cmJfcXVpcmsoeGhjaSkgJiYKKwkJCQkJIShyaW5nLT50eXBlID09IFRZUEVfSVNPQyAmJgorCQkJCQkgKHhoY2ktPnF1aXJrcyAmIFhIQ0lfQU1EXzB4OTZfSE9TVCkpKQogCQkJCW5leHQtPmxpbmsuY29udHJvbCAmPSBjcHVfdG9fbGUzMih+VFJCX0NIQUlOKTsKIAkJCWVsc2UKIAkJCQluZXh0LT5saW5rLmNvbnRyb2wgfD0gY3B1X3RvX2xlMzIoVFJCX0NIQUlOKTsKQEAgLTI1MDQsMTEgKzI1OTYsNiBAQAogCQkJLyogVG9nZ2xlIHRoZSBjeWNsZSBiaXQgYWZ0ZXIgdGhlIGxhc3QgcmluZyBzZWdtZW50LiAqLwogCQkJaWYgKGxhc3RfdHJiX29uX2xhc3Rfc2VnKHhoY2ksIHJpbmcsIHJpbmctPmVucV9zZWcsIG5leHQpKSB7CiAJCQkJcmluZy0+Y3ljbGVfc3RhdGUgPSAocmluZy0+Y3ljbGVfc3RhdGUgPyAwIDogMSk7Ci0JCQkJaWYgKCFpbl9pbnRlcnJ1cHQoKSkgewotCQkJCQl4aGNpX2RiZyh4aGNpLCAicXVldWVfdHJiOiBUb2dnbGUgY3ljbGUgIgotCQkJCQkJInN0YXRlIGZvciByaW5nICVwID0gJWlcbiIsCi0JCQkJCQlyaW5nLCAodW5zaWduZWQgaW50KXJpbmctPmN5Y2xlX3N0YXRlKTsKLQkJCQl9CiAJCQl9CiAJCQlyaW5nLT5lbnFfc2VnID0gcmluZy0+ZW5xX3NlZy0+bmV4dDsKIAkJCXJpbmctPmVucXVldWUgPSByaW5nLT5lbnFfc2VnLT50cmJzOwpAQCAtMjUyNiw3ICsyNjEzLDYgQEAKIAkJdW5zaWduZWQgaW50IG51bV90cmJzLAogCQlzdHJ1Y3QgdXJiICp1cmIsCiAJCXVuc2lnbmVkIGludCB0ZF9pbmRleCwKLQkJYm9vbCBpc29jLAogCQlnZnBfdCBtZW1fZmxhZ3MpCiB7CiAJaW50IHJldDsKQEAgLTI1NDQsNyArMjYzMCw3IEBACiAKIAlyZXQgPSBwcmVwYXJlX3JpbmcoeGhjaSwgZXBfcmluZywKIAkJCSAgIGxlMzJfdG9fY3B1KGVwX2N0eC0+ZXBfaW5mbykgJiBFUF9TVEFURV9NQVNLLAotCQkJICAgbnVtX3RyYnMsIGlzb2MsIG1lbV9mbGFncyk7CisJCQkgICBudW1fdHJicywgbWVtX2ZsYWdzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0yNTgwLDEwICsyNjY2LDggQEAKIAludW1fc2dzID0gdXJiLT5udW1fbWFwcGVkX3NnczsKIAl0ZW1wID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOwogCi0JeGhjaV9kYmcoeGhjaSwgImNvdW50IHNnIGxpc3QgdHJiczogXG4iKTsKIAludW1fdHJicyA9IDA7CiAJZm9yX2VhY2hfc2codXJiLT5zZywgc2csIG51bV9zZ3MsIGkpIHsKLQkJdW5zaWduZWQgaW50IHByZXZpb3VzX3RvdGFsX3RyYnMgPSBudW1fdHJiczsKIAkJdW5zaWduZWQgaW50IGxlbiA9IHNnX2RtYV9sZW4oc2cpOwogCiAJCS8qIFNjYXR0ZXIgZ2F0aGVyIGxpc3QgZW50cmllcyBtYXkgY3Jvc3MgNjRLQiBib3VuZGFyaWVzICovCkBAIC0yNTk4LDIyICsyNjgyLDExIEBACiAJCQludW1fdHJicysrOwogCQkJcnVubmluZ190b3RhbCArPSBUUkJfTUFYX0JVRkZfU0laRTsKIAkJfQotCQl4aGNpX2RiZyh4aGNpLCAiIHNnICMlZDogZG1hID0gJSNsbHgsIGxlbiA9ICUjeCAoJWQpLCBudW1fdHJicyA9ICVkXG4iLAotCQkJCWksICh1bnNpZ25lZCBsb25nIGxvbmcpc2dfZG1hX2FkZHJlc3Moc2cpLAotCQkJCWxlbiwgbGVuLCBudW1fdHJicyAtIHByZXZpb3VzX3RvdGFsX3RyYnMpOwotCiAJCWxlbiA9IG1pbl90KGludCwgbGVuLCB0ZW1wKTsKIAkJdGVtcCAtPSBsZW47CiAJCWlmICh0ZW1wID09IDApCiAJCQlicmVhazsKIAl9Ci0JeGhjaV9kYmcoeGhjaSwgIlxuIik7Ci0JaWYgKCFpbl9pbnRlcnJ1cHQoKSkKLQkJeGhjaV9kYmcoeGhjaSwgImVwICUjeCAtIHVyYiBsZW4gPSAlZCwgc2dsaXN0IHVzZWQsICIKLQkJCQkibnVtX3RyYnMgPSAlZFxuIiwKLQkJCQl1cmItPmVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MsCi0JCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotCQkJCW51bV90cmJzKTsKIAlyZXR1cm4gbnVtX3RyYnM7CiB9CiAKQEAgLTI2ODcsNyArMjc2MCw3IEBACiAJCQkJdXJiLT5kZXYtPnNwZWVkID09IFVTQl9TUEVFRF9GVUxMKQogCQkJdXJiLT5pbnRlcnZhbCAvPSA4OwogCX0KLQlyZXR1cm4geGhjaV9xdWV1ZV9idWxrX3R4KHhoY2ksIEdGUF9BVE9NSUMsIHVyYiwgc2xvdF9pZCwgZXBfaW5kZXgpOworCXJldHVybiB4aGNpX3F1ZXVlX2J1bGtfdHgoeGhjaSwgbWVtX2ZsYWdzLCB1cmIsIHNsb3RfaWQsIGVwX2luZGV4KTsKIH0KIAogLyoKQEAgLTI3NjcsNyArMjg0MCw3IEBACiAKIAl0cmJfYnVmZl9sZW4gPSBwcmVwYXJlX3RyYW5zZmVyKHhoY2ksIHhoY2ktPmRldnNbc2xvdF9pZF0sCiAJCQllcF9pbmRleCwgdXJiLT5zdHJlYW1faWQsCi0JCQludW1fdHJicywgdXJiLCAwLCBmYWxzZSwgbWVtX2ZsYWdzKTsKKwkJCW51bV90cmJzLCB1cmIsIDAsIG1lbV9mbGFncyk7CiAJaWYgKHRyYl9idWZmX2xlbiA8IDApCiAJCXJldHVybiB0cmJfYnVmZl9sZW47CiAKQEAgLTI3OTksOCArMjg3Miw2IEBACiAJdHJiX2J1ZmZfbGVuID0gbWluX3QoaW50LCB0cmJfYnVmZl9sZW4sIHRoaXNfc2dfbGVuKTsKIAlpZiAodHJiX2J1ZmZfbGVuID4gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKQogCQl0cmJfYnVmZl9sZW4gPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGg7Ci0JeGhjaV9kYmcoeGhjaSwgIkZpcnN0IGxlbmd0aCB0byB4ZmVyIGZyb20gMXN0IHNnbGlzdCBlbnRyeSA9ICV1XG4iLAotCQkJdHJiX2J1ZmZfbGVuKTsKIAogCWZpcnN0X3RyYiA9IHRydWU7CiAJLyogUXVldWUgdGhlIGZpcnN0IFRSQiwgZXZlbiBpZiBpdCdzIHplcm8tbGVuZ3RoICovCkBAIC0yODMyLDExICsyOTAzLDYgQEAKIAkJaWYgKHVzYl91cmJfZGlyX2luKHVyYikpCiAJCQlmaWVsZCB8PSBUUkJfSVNQOwogCi0JCXhoY2lfZGJnKHhoY2ksICIgc2cgZW50cnk6IGRtYSA9ICUjeCwgbGVuID0gJSN4ICglZCksICIKLQkJCQkiNjRLQiBib3VuZGFyeSBhdCAlI3gsIGVuZCBkbWEgPSAlI3hcbiIsCi0JCQkJKHVuc2lnbmVkIGludCkgYWRkciwgdHJiX2J1ZmZfbGVuLCB0cmJfYnVmZl9sZW4sCi0JCQkJKHVuc2lnbmVkIGludCkgKGFkZHIgKyBUUkJfTUFYX0JVRkZfU0laRSkgJiB+KFRSQl9NQVhfQlVGRl9TSVpFIC0gMSksCi0JCQkJKHVuc2lnbmVkIGludCkgYWRkciArIHRyYl9idWZmX2xlbik7CiAJCWlmIChUUkJfTUFYX0JVRkZfU0laRSAtCiAJCQkJKGFkZHIgJiAoVFJCX01BWF9CVUZGX1NJWkUgLSAxKSkgPCB0cmJfYnVmZl9sZW4pIHsKIAkJCXhoY2lfd2Fybih4aGNpLCAiV0FSTjogc2cgZG1hIHhmZXIgY3Jvc3NlcyA2NEtCIGJvdW5kYXJpZXMhXG4iKTsKQEAgLTI4NjIsNyArMjkyOCw3IEBACiAJCQltb3JlX3RyYnNfY29taW5nID0gdHJ1ZTsKIAkJZWxzZQogCQkJbW9yZV90cmJzX2NvbWluZyA9IGZhbHNlOwotCQlxdWV1ZV90cmIoeGhjaSwgZXBfcmluZywgZmFsc2UsIG1vcmVfdHJic19jb21pbmcsIGZhbHNlLAorCQlxdWV1ZV90cmIoeGhjaSwgZXBfcmluZywgbW9yZV90cmJzX2NvbWluZywKIAkJCQlsb3dlcl8zMl9iaXRzKGFkZHIpLAogCQkJCXVwcGVyXzMyX2JpdHMoYWRkciksCiAJCQkJbGVuZ3RoX2ZpZWxkLApAQCAtMjk0MiwxOCArMzAwOCw5IEBACiAJfQogCS8qIEZJWE1FOiB0aGlzIGRvZXNuJ3QgZGVhbCB3aXRoIFVSQl9aRVJPX1BBQ0tFVCAtIG5lZWQgb25lIG1vcmUgKi8KIAotCWlmICghaW5faW50ZXJydXB0KCkpCi0JCXhoY2lfZGJnKHhoY2ksICJlcCAlI3ggLSB1cmIgbGVuID0gJSN4ICglZCksICIKLQkJCQkiYWRkciA9ICUjbGx4LCBudW1fdHJicyA9ICVkXG4iLAotCQkJCXVyYi0+ZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywKLQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCQkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdXJiLT50cmFuc2Zlcl9kbWEsCi0JCQkJbnVtX3RyYnMpOwotCiAJcmV0ID0gcHJlcGFyZV90cmFuc2Zlcih4aGNpLCB4aGNpLT5kZXZzW3Nsb3RfaWRdLAogCQkJZXBfaW5kZXgsIHVyYi0+c3RyZWFtX2lkLAotCQkJbnVtX3RyYnMsIHVyYiwgMCwgZmFsc2UsIG1lbV9mbGFncyk7CisJCQludW1fdHJicywgdXJiLCAwLCBtZW1fZmxhZ3MpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zMDI1LDcgKzMwODIsNyBAQAogCQkJbW9yZV90cmJzX2NvbWluZyA9IHRydWU7CiAJCWVsc2UKIAkJCW1vcmVfdHJic19jb21pbmcgPSBmYWxzZTsKLQkJcXVldWVfdHJiKHhoY2ksIGVwX3JpbmcsIGZhbHNlLCBtb3JlX3RyYnNfY29taW5nLCBmYWxzZSwKKwkJcXVldWVfdHJiKHhoY2ksIGVwX3JpbmcsIG1vcmVfdHJic19jb21pbmcsCiAJCQkJbG93ZXJfMzJfYml0cyhhZGRyKSwKIAkJCQl1cHBlcl8zMl9iaXRzKGFkZHIpLAogCQkJCWxlbmd0aF9maWVsZCwKQEAgLTMwNzEsOSArMzEyOCw2IEBACiAJaWYgKCF1cmItPnNldHVwX3BhY2tldCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIWluX2ludGVycnVwdCgpKQotCQl4aGNpX2RiZyh4aGNpLCAiUXVldWVpbmcgY3RybCB0eCBmb3Igc2xvdCBpZCAlZCwgZXAgJWRcbiIsCi0JCQkJc2xvdF9pZCwgZXBfaW5kZXgpOwogCS8qIDEgVFJCIGZvciBzZXR1cCwgMSBmb3Igc3RhdHVzICovCiAJbnVtX3RyYnMgPSAyOwogCS8qCkBAIC0zMDg1LDcgKzMxMzksNyBAQAogCQludW1fdHJicysrOwogCXJldCA9IHByZXBhcmVfdHJhbnNmZXIoeGhjaSwgeGhjaS0+ZGV2c1tzbG90X2lkXSwKIAkJCWVwX2luZGV4LCB1cmItPnN0cmVhbV9pZCwKLQkJCW51bV90cmJzLCB1cmIsIDAsIGZhbHNlLCBtZW1fZmxhZ3MpOworCQkJbnVtX3RyYnMsIHVyYiwgMCwgbWVtX2ZsYWdzKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzExOCw3ICszMTcyLDcgQEAKIAkJfQogCX0KIAotCXF1ZXVlX3RyYih4aGNpLCBlcF9yaW5nLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsCisJcXVldWVfdHJiKHhoY2ksIGVwX3JpbmcsIHRydWUsCiAJCSAgc2V0dXAtPmJSZXF1ZXN0VHlwZSB8IHNldHVwLT5iUmVxdWVzdCA8PCA4IHwgbGUxNl90b19jcHUoc2V0dXAtPndWYWx1ZSkgPDwgMTYsCiAJCSAgbGUxNl90b19jcHUoc2V0dXAtPndJbmRleCkgfCBsZTE2X3RvX2NwdShzZXR1cC0+d0xlbmd0aCkgPDwgMTYsCiAJCSAgVFJCX0xFTig4KSB8IFRSQl9JTlRSX1RBUkdFVCgwKSwKQEAgLTMxMzgsNyArMzE5Miw3IEBACiAJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA+IDApIHsKIAkJaWYgKHNldHVwLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKQogCQkJZmllbGQgfD0gVFJCX0RJUl9JTjsKLQkJcXVldWVfdHJiKHhoY2ksIGVwX3JpbmcsIGZhbHNlLCB0cnVlLCBmYWxzZSwKKwkJcXVldWVfdHJiKHhoY2ksIGVwX3JpbmcsIHRydWUsCiAJCQkJbG93ZXJfMzJfYml0cyh1cmItPnRyYW5zZmVyX2RtYSksCiAJCQkJdXBwZXJfMzJfYml0cyh1cmItPnRyYW5zZmVyX2RtYSksCiAJCQkJbGVuZ3RoX2ZpZWxkLApAQCAtMzE1NCw3ICszMjA4LDcgQEAKIAkJZmllbGQgPSAwOwogCWVsc2UKIAkJZmllbGQgPSBUUkJfRElSX0lOOwotCXF1ZXVlX3RyYih4aGNpLCBlcF9yaW5nLCBmYWxzZSwgZmFsc2UsIGZhbHNlLAorCXF1ZXVlX3RyYih4aGNpLCBlcF9yaW5nLCBmYWxzZSwKIAkJCTAsCiAJCQkwLAogCQkJVFJCX0lOVFJfVEFSR0VUKDApLApAQCAtMzI2NSwxNSArMzMxOSw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICghaW5faW50ZXJydXB0KCkpCi0JCXhoY2lfZGJnKHhoY2ksICJlcCAlI3ggLSB1cmIgbGVuID0gJSN4ICglZCksIgotCQkJCSIgYWRkciA9ICUjbGx4LCBudW1fdGRzID0gJWRcbiIsCi0JCQkJdXJiLT5lcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzLAotCQkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl1cmItPnRyYW5zZmVyX2RtYSwKLQkJCQludW1fdGRzKTsKLQogCXN0YXJ0X2FkZHIgPSAodTY0KSB1cmItPnRyYW5zZmVyX2RtYTsKIAlzdGFydF90cmIgPSAmZXBfcmluZy0+ZW5xdWV1ZS0+Z2VuZXJpYzsKIAlzdGFydF9jeWNsZSA9IGVwX3JpbmctPmN5Y2xlX3N0YXRlOwpAQCAtMzMwMyw4ICszMzQ4LDcgQEAKIAkJdHJic19wZXJfdGQgPSBjb3VudF9pc29jX3RyYnNfbmVlZGVkKHhoY2ksIHVyYiwgaSk7CiAKIAkJcmV0ID0gcHJlcGFyZV90cmFuc2Zlcih4aGNpLCB4aGNpLT5kZXZzW3Nsb3RfaWRdLCBlcF9pbmRleCwKLQkJCQl1cmItPnN0cmVhbV9pZCwgdHJic19wZXJfdGQsIHVyYiwgaSwgdHJ1ZSwKLQkJCQltZW1fZmxhZ3MpOworCQkJCXVyYi0+c3RyZWFtX2lkLCB0cmJzX3Blcl90ZCwgdXJiLCBpLCBtZW1fZmxhZ3MpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKGkgPT0gMCkKIAkJCQlyZXR1cm4gcmV0OwpAQCAtMzM3NCw3ICszNDE4LDcgQEAKIAkJCQlyZW1haW5kZXIgfAogCQkJCVRSQl9JTlRSX1RBUkdFVCgwKTsKIAotCQkJcXVldWVfdHJiKHhoY2ksIGVwX3JpbmcsIGZhbHNlLCBtb3JlX3RyYnNfY29taW5nLCB0cnVlLAorCQkJcXVldWVfdHJiKHhoY2ksIGVwX3JpbmcsIG1vcmVfdHJic19jb21pbmcsCiAJCQkJbG93ZXJfMzJfYml0cyhhZGRyKSwKIAkJCQl1cHBlcl8zMl9iaXRzKGFkZHIpLAogCQkJCWxlbmd0aF9maWVsZCwKQEAgLTM0MjEsNiArMzQ2NSw3IEBACiAJZXBfcmluZy0+ZW5xdWV1ZSA9IHVyYl9wcml2LT50ZFswXS0+Zmlyc3RfdHJiOwogCWVwX3JpbmctPmVucV9zZWcgPSB1cmJfcHJpdi0+dGRbMF0tPnN0YXJ0X3NlZzsKIAllcF9yaW5nLT5jeWNsZV9zdGF0ZSA9IHN0YXJ0X2N5Y2xlOworCWVwX3JpbmctPm51bV90cmJzX2ZyZWUgPSBlcF9yaW5nLT5udW1fdHJic19mcmVlX3RlbXA7CiAJdXNiX2hjZF91bmxpbmtfdXJiX2Zyb21fZXAoYnVzX3RvX2hjZCh1cmItPmRldi0+YnVzKSwgdXJiKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzQ1Nyw3ICszNTAyLDcgQEAKIAkgKiBEbyBub3QgaW5zZXJ0IGFueSB0ZCBvZiB0aGUgdXJiIHRvIHRoZSByaW5nIGlmIHRoZSBjaGVjayBmYWlsZWQuCiAJICovCiAJcmV0ID0gcHJlcGFyZV9yaW5nKHhoY2ksIGVwX3JpbmcsIGxlMzJfdG9fY3B1KGVwX2N0eC0+ZXBfaW5mbykgJiBFUF9TVEFURV9NQVNLLAotCQkJICAgbnVtX3RyYnMsIHRydWUsIG1lbV9mbGFncyk7CisJCQkgICBudW1fdHJicywgbWVtX2ZsYWdzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNDkzLDcgKzM1MzgsOSBAQAogCQkJCXVyYi0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCkKIAkJCXVyYi0+aW50ZXJ2YWwgLz0gODsKIAl9Ci0JcmV0dXJuIHhoY2lfcXVldWVfaXNvY190eCh4aGNpLCBHRlBfQVRPTUlDLCB1cmIsIHNsb3RfaWQsIGVwX2luZGV4KTsKKwllcF9yaW5nLT5udW1fdHJic19mcmVlX3RlbXAgPSBlcF9yaW5nLT5udW1fdHJic19mcmVlOworCisJcmV0dXJuIHhoY2lfcXVldWVfaXNvY190eCh4aGNpLCBtZW1fZmxhZ3MsIHVyYiwgc2xvdF9pZCwgZXBfaW5kZXgpOwogfQogCiAvKioqKgkJQ29tbWFuZCBSaW5nIE9wZXJhdGlvbnMJCSoqKiovCkBAIC0zNTE2LDcgKzM1NjMsNyBAQAogCQlyZXNlcnZlZF90cmJzKys7CiAKIAlyZXQgPSBwcmVwYXJlX3JpbmcoeGhjaSwgeGhjaS0+Y21kX3JpbmcsIEVQX1NUQVRFX1JVTk5JTkcsCi0JCQlyZXNlcnZlZF90cmJzLCBmYWxzZSwgR0ZQX0FUT01JQyk7CisJCQlyZXNlcnZlZF90cmJzLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0IDwgMCkgewogCQl4aGNpX2Vycih4aGNpLCAiRVJSOiBObyByb29tIGZvciBjb21tYW5kIG9uIGNvbW1hbmQgcmluZ1xuIik7CiAJCWlmIChjb21tYW5kX211c3Rfc3VjY2VlZCkKQEAgLTM1MjQsOCArMzU3MSw4IEBACiAJCQkJCSJ1bmZhaWxhYmxlIGNvbW1hbmRzIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlxdWV1ZV90cmIoeGhjaSwgeGhjaS0+Y21kX3JpbmcsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZpZWxkMSwgZmllbGQyLAotCQkJZmllbGQzLAlmaWVsZDQgfCB4aGNpLT5jbWRfcmluZy0+Y3ljbGVfc3RhdGUpOworCXF1ZXVlX3RyYih4aGNpLCB4aGNpLT5jbWRfcmluZywgZmFsc2UsIGZpZWxkMSwgZmllbGQyLCBmaWVsZDMsCisJCQlmaWVsZDQgfCB4aGNpLT5jbWRfcmluZy0+Y3ljbGVfc3RhdGUpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCmluZGV4IDA1ZjgyZTkuLjRhY2ZlMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCkBAIC0xMDYsNiArMTA2LDkgQEAKIAkJCVNUU19IQUxULCBTVFNfSEFMVCwgWEhDSV9NQVhfSEFMVF9VU0VDKTsKIAlpZiAoIXJldCkKIAkJeGhjaS0+eGhjX3N0YXRlIHw9IFhIQ0lfU1RBVEVfSEFMVEVEOworCWVsc2UKKwkJeGhjaV93YXJuKHhoY2ksICJIb3N0IG5vdCBoYWx0ZWQgYWZ0ZXIgJXUgbWljcm9zZWNvbmRzLlxuIiwKKwkJCQlYSENJX01BWF9IQUxUX1VTRUMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIwMCwxNCArMjAzLDE0IEBACiAKIAlyZXQgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKIAlpZiAocmV0KSB7Ci0JCXhoY2lfZXJyKHhoY2ksICJmYWlsZWQgdG8gYWxsb2NhdGUgTVNJIGVudHJ5XG4iKTsKKwkJeGhjaV9kYmcoeGhjaSwgImZhaWxlZCB0byBhbGxvY2F0ZSBNU0kgZW50cnlcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgKGlycV9oYW5kbGVyX3QpeGhjaV9tc2lfaXJxLAogCQkJCTAsICJ4aGNpX2hjZCIsIHhoY2lfdG9faGNkKHhoY2kpKTsKIAlpZiAocmV0KSB7Ci0JCXhoY2lfZXJyKHhoY2ksICJkaXNhYmxlIE1TSSBpbnRlcnJ1cHRcbiIpOworCQl4aGNpX2RiZyh4aGNpLCAiZGlzYWJsZSBNU0kgaW50ZXJydXB0XG4iKTsKIAkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwogCX0KIApAQCAtMjI0LDEzICsyMjcsMTMgQEAKIAlpbnQgcmV0OwogCiAJLyogcmV0dXJuIGlmIHVzaW5nIGxlZ2FjeSBpbnRlcnJ1cHQgKi8KLQlpZiAoeGhjaV90b19oY2QoeGhjaSktPmlycSA+PSAwKQorCWlmICh4aGNpX3RvX2hjZCh4aGNpKS0+aXJxID4gMCkKIAkJcmV0dXJuOwogCiAJcmV0ID0geGhjaV9mcmVlX21zaSh4aGNpKTsKIAlpZiAoIXJldCkKIAkJcmV0dXJuOwotCWlmIChwZGV2LT5pcnEgPj0gMCkKKwlpZiAocGRldi0+aXJxID4gMCkKIAkJZnJlZV9pcnEocGRldi0+aXJxLCB4aGNpX3RvX2hjZCh4aGNpKSk7CiAKIAlyZXR1cm47CkBAIC0yNzAsNyArMjczLDcgQEAKIAogCXJldCA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCB4aGNpLT5tc2l4X2VudHJpZXMsIHhoY2ktPm1zaXhfY291bnQpOwogCWlmIChyZXQpIHsKLQkJeGhjaV9lcnIoeGhjaSwgIkZhaWxlZCB0byBlbmFibGUgTVNJLVhcbiIpOworCQl4aGNpX2RiZyh4aGNpLCAiRmFpbGVkIHRvIGVuYWJsZSBNU0ktWFxuIik7CiAJCWdvdG8gZnJlZV9lbnRyaWVzOwogCX0KIApAQCAtMjg2LDcgKzI4OSw3IEBACiAJcmV0dXJuIHJldDsKIAogZGlzYWJsZV9tc2l4OgotCXhoY2lfZXJyKHhoY2ksICJkaXNhYmxlIE1TSS1YIGludGVycnVwdFxuIik7CisJeGhjaV9kYmcoeGhjaSwgImRpc2FibGUgTVNJLVggaW50ZXJydXB0XG4iKTsKIAl4aGNpX2ZyZWVfaXJxKHhoY2kpOwogCXBjaV9kaXNhYmxlX21zaXgocGRldik7CiBmcmVlX2VudHJpZXM6CkBAIC0zNDEsNyArMzQ0LDcgQEAKIAkvKiB1bnJlZ2lzdGVyIHRoZSBsZWdhY3kgaW50ZXJydXB0ICovCiAJaWYgKGhjZC0+aXJxKQogCQlmcmVlX2lycShoY2QtPmlycSwgaGNkKTsKLQloY2QtPmlycSA9IC0xOworCWhjZC0+aXJxID0gMDsKIAogCXJldCA9IHhoY2lfc2V0dXBfbXNpeCh4aGNpKTsKIAlpZiAocmV0KQpAQCAtMzQ5LDcgKzM1Miw3IEBACiAJCXJldCA9IHhoY2lfc2V0dXBfbXNpKHhoY2kpOwogCiAJaWYgKCFyZXQpCi0JCS8qIGhjZC0+aXJxIGlzIC0xLCB3ZSBoYXZlIE1TSSAqLworCQkvKiBoY2QtPmlycSBpcyAwLCB3ZSBoYXZlIE1TSSAqLwogCQlyZXR1cm4gMDsKIAogCWlmICghcGRldi0+aXJxKSB7CkBAIC03MzAsNiArNzMzLDcgQEAKIAlyaW5nLT5lbnFfc2VnID0gcmluZy0+ZGVxX3NlZzsKIAlyaW5nLT5lbnF1ZXVlID0gcmluZy0+ZGVxdWV1ZTsKIAorCXJpbmctPm51bV90cmJzX2ZyZWUgPSByaW5nLT5udW1fc2VncyAqIChUUkJTX1BFUl9TRUdNRU5UIC0gMSkgLSAxOwogCS8qCiAJICogUmluZyBpcyBub3cgemVyb2VkLCBzbyB0aGUgSFcgc2hvdWxkIGxvb2sgZm9yIGNoYW5nZSBvZiBvd25lcnNoaXAKIAkgKiB3aGVuIHRoZSBjeWNsZSBiaXQgaXMgc2V0IHRvIDEuCkBAIC0xMzM5LDkgKzEzNDMsNiBAQAogCQlnb3RvIGRvbmU7CiAJfQogCi0JeGhjaV9kYmcoeGhjaSwgIkNhbmNlbCBVUkIgJXBcbiIsIHVyYik7Ci0JeGhjaV9kYmcoeGhjaSwgIkV2ZW50IHJpbmc6XG4iKTsKLQl4aGNpX2RlYnVnX3JpbmcoeGhjaSwgeGhjaS0+ZXZlbnRfcmluZyk7CiAJZXBfaW5kZXggPSB4aGNpX2dldF9lbmRwb2ludF9pbmRleCgmdXJiLT5lcC0+ZGVzYyk7CiAJZXAgPSAmeGhjaS0+ZGV2c1t1cmItPmRldi0+c2xvdF9pZF0tPmVwc1tlcF9pbmRleF07CiAJZXBfcmluZyA9IHhoY2lfdXJiX3RvX3RyYW5zZmVyX3JpbmcoeGhjaSwgdXJiKTsKQEAgLTEzNTAsMTIgKzEzNTEsMTggQEAKIAkJZ290byBkb25lOwogCX0KIAotCXhoY2lfZGJnKHhoY2ksICJFbmRwb2ludCByaW5nOlxuIik7Ci0JeGhjaV9kZWJ1Z19yaW5nKHhoY2ksIGVwX3JpbmcpOwotCiAJdXJiX3ByaXYgPSB1cmItPmhjcHJpdjsKKwlpID0gdXJiX3ByaXYtPnRkX2NudDsKKwlpZiAoaSA8IHVyYl9wcml2LT5sZW5ndGgpCisJCXhoY2lfZGJnKHhoY2ksICJDYW5jZWwgVVJCICVwLCBkZXYgJXMsIGVwIDB4JXgsICIKKwkJCQkic3RhcnRpbmcgYXQgb2Zmc2V0IDB4JWxseFxuIiwKKwkJCQl1cmIsIHVyYi0+ZGV2LT5kZXZwYXRoLAorCQkJCXVyYi0+ZXAtPmRlc2MuYkVuZHBvaW50QWRkcmVzcywKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSB4aGNpX3RyYl92aXJ0X3RvX2RtYSgKKwkJCQkJdXJiX3ByaXYtPnRkW2ldLT5zdGFydF9zZWcsCisJCQkJCXVyYl9wcml2LT50ZFtpXS0+Zmlyc3RfdHJiKSk7CiAKLQlmb3IgKGkgPSB1cmJfcHJpdi0+dGRfY250OyBpIDwgdXJiX3ByaXYtPmxlbmd0aDsgaSsrKSB7CisJZm9yICg7IGkgPCB1cmJfcHJpdi0+bGVuZ3RoOyBpKyspIHsKIAkJdGQgPSB1cmJfcHJpdi0+dGRbaV07CiAJCWxpc3RfYWRkX3RhaWwoJnRkLT5jYW5jZWxsZWRfdGRfbGlzdCwgJmVwLT5jYW5jZWxsZWRfdGRfbGlzdCk7CiAJfQpAQCAtMzYxMiwyNiArMzYxOSwzOCBAQAogCTMwMDAsIDQwMDAsIDUwMDAsIDYwMDAsIDcwMDAsIDgwMDAsIDkwMDAsIDEwMDAwfTsKIAogLyogQ2FsY3VsYXRlIEhJUkQvQkVTTCBmb3IgVVNCMiBQT1JUUE1TQyovCi1zdGF0aWMgaW50IHhoY2lfY2FsY3VsYXRlX2hpcmRfYmVzbChpbnQgdTJkZWwsIGJvb2wgdXNlX2Jlc2wpCitzdGF0aWMgaW50IHhoY2lfY2FsY3VsYXRlX2hpcmRfYmVzbChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCisJCQkJCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewotCWludCBoaXJkOworCWludCB1MmRlbCwgYmVzbCwgYmVzbF9ob3N0OworCWludCBiZXNsX2RldmljZSA9IDA7CisJdTMyIGZpZWxkOwogCi0JaWYgKHVzZV9iZXNsKSB7Ci0JCWZvciAoaGlyZCA9IDA7IGhpcmQgPCAxNjsgaGlyZCsrKSB7Ci0JCQlpZiAoeGhjaV9iZXNsX2VuY29kaW5nW2hpcmRdID49IHUyZGVsKQorCXUyZGVsID0gSENTX1UyX0xBVEVOQ1koeGhjaS0+aGNzX3BhcmFtczMpOworCWZpZWxkID0gbGUzMl90b19jcHUodWRldi0+Ym9zLT5leHRfY2FwLT5ibUF0dHJpYnV0ZXMpOworCisJaWYgKGZpZWxkICYgVVNCX0JFU0xfU1VQUE9SVCkgeworCQlmb3IgKGJlc2xfaG9zdCA9IDA7IGJlc2xfaG9zdCA8IDE2OyBiZXNsX2hvc3QrKykgeworCQkJaWYgKHhoY2lfYmVzbF9lbmNvZGluZ1tiZXNsX2hvc3RdID49IHUyZGVsKQogCQkJCWJyZWFrOwogCQl9CisJCS8qIFVzZSBiYXNlbGluZSBCRVNMIHZhbHVlIGFzIGRlZmF1bHQgKi8KKwkJaWYgKGZpZWxkICYgVVNCX0JFU0xfQkFTRUxJTkVfVkFMSUQpCisJCQliZXNsX2RldmljZSA9IFVTQl9HRVRfQkVTTF9CQVNFTElORShmaWVsZCk7CisJCWVsc2UgaWYgKGZpZWxkICYgVVNCX0JFU0xfREVFUF9WQUxJRCkKKwkJCWJlc2xfZGV2aWNlID0gVVNCX0dFVF9CRVNMX0RFRVAoZmllbGQpOwogCX0gZWxzZSB7CiAJCWlmICh1MmRlbCA8PSA1MCkKLQkJCWhpcmQgPSAwOworCQkJYmVzbF9ob3N0ID0gMDsKIAkJZWxzZQotCQkJaGlyZCA9ICh1MmRlbCAtIDUxKSAvIDc1ICsgMTsKLQotCQlpZiAoaGlyZCA+IDE1KQotCQkJaGlyZCA9IDE1OworCQkJYmVzbF9ob3N0ID0gKHUyZGVsIC0gNTEpIC8gNzUgKyAxOwogCX0KIAotCXJldHVybiBoaXJkOworCWJlc2wgPSBiZXNsX2hvc3QgKyBiZXNsX2RldmljZTsKKwlpZiAoYmVzbCA+IDE1KQorCQliZXNsID0gMTU7CisKKwlyZXR1cm4gYmVzbDsKIH0KIAogc3RhdGljIGludCB4aGNpX3VzYjJfc29mdHdhcmVfbHBtX3Rlc3Qoc3RydWN0IHVzYl9oY2QgKmhjZCwKQEAgLTM2NDQsNyArMzY2Myw3IEBACiAJdTMyCQl0ZW1wLCBkZXZfaWQ7CiAJdW5zaWduZWQgaW50CXBvcnRfbnVtOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0JaW50CQl1MmRlbCwgaGlyZDsKKwlpbnQJCWhpcmQ7CiAJaW50CQlyZXQ7CiAKIAlpZiAoaGNkLT5zcGVlZCA9PSBIQ0RfVVNCMyB8fCAheGhjaS0+c3dfbHBtX3N1cHBvcnQgfHwKQEAgLTM2OTAsMTIgKzM3MDksNyBAQAogCSAqIEhJUkQgb3IgQkVTTCBzaG91bGUgYmUgdXNlZC4gU2VlIFVTQjIuMCBMUE0gZXJyYXRhLgogCSAqLwogCXBtX2FkZHIgPSBwb3J0X2FycmF5W3BvcnRfbnVtXSArIDE7Ci0JdTJkZWwgPSBIQ1NfVTJfTEFURU5DWSh4aGNpLT5oY3NfcGFyYW1zMyk7Ci0JaWYgKGxlMzJfdG9fY3B1KHVkZXYtPmJvcy0+ZXh0X2NhcC0+Ym1BdHRyaWJ1dGVzKSAmICgxIDw8IDIpKQotCQloaXJkID0geGhjaV9jYWxjdWxhdGVfaGlyZF9iZXNsKHUyZGVsLCAxKTsKLQllbHNlCi0JCWhpcmQgPSB4aGNpX2NhbGN1bGF0ZV9oaXJkX2Jlc2wodTJkZWwsIDApOwotCisJaGlyZCA9IHhoY2lfY2FsY3VsYXRlX2hpcmRfYmVzbCh4aGNpLCB1ZGV2KTsKIAl0ZW1wID0gUE9SVF9MMURTKHVkZXYtPnNsb3RfaWQpIHwgUE9SVF9ISVJEKGhpcmQpOwogCXhoY2lfd3JpdGVsKHhoY2ksIHRlbXAsIHBtX2FkZHIpOwogCkBAIC0zNzc0LDcgKzM3ODgsNyBAQAogCXUzMgkJdGVtcDsKIAl1bnNpZ25lZCBpbnQJcG9ydF9udW07CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKLQlpbnQJCXUyZGVsLCBoaXJkOworCWludAkJaGlyZDsKIAogCWlmIChoY2QtPnNwZWVkID09IEhDRF9VU0IzIHx8ICF4aGNpLT5od19scG1fc3VwcG9ydCB8fAogCQkJIXVkZXYtPmxwbV9jYXBhYmxlKQpAQCAtMzc5NywxMSArMzgxMSw3IEBACiAJeGhjaV9kYmcoeGhjaSwgIiVzIHBvcnQgJWQgVVNCMiBoYXJkd2FyZSBMUE1cbiIsCiAJCQllbmFibGUgPyAiZW5hYmxlIiA6ICJkaXNhYmxlIiwgcG9ydF9udW0pOwogCi0JdTJkZWwgPSBIQ1NfVTJfTEFURU5DWSh4aGNpLT5oY3NfcGFyYW1zMyk7Ci0JaWYgKGxlMzJfdG9fY3B1KHVkZXYtPmJvcy0+ZXh0X2NhcC0+Ym1BdHRyaWJ1dGVzKSAmICgxIDw8IDIpKQotCQloaXJkID0geGhjaV9jYWxjdWxhdGVfaGlyZF9iZXNsKHUyZGVsLCAxKTsKLQllbHNlCi0JCWhpcmQgPSB4aGNpX2NhbGN1bGF0ZV9oaXJkX2Jlc2wodTJkZWwsIDApOworCWhpcmQgPSB4aGNpX2NhbGN1bGF0ZV9oaXJkX2Jlc2woeGhjaSwgdWRldik7CiAKIAlpZiAoZW5hYmxlKSB7CiAJCXRlbXAgJj0gflBPUlRfSElSRF9NQVNLOwpAQCAtMzk2Miw3ICszOTcyLDggQEAKIAlpbnQJCQlyZXR2YWw7CiAJdTMyCQkJdGVtcDsKIAotCWhjZC0+c2VsZi5zZ190YWJsZXNpemUgPSBUUkJTX1BFUl9TRUdNRU5UIC0gMjsKKwkvKiBBY2NlcHQgYXJiaXRyYXJpbHkgbG9uZyBzY2F0dGVyLWdhdGhlciBsaXN0cyAqLworCWhjZC0+c2VsZi5zZ190YWJsZXNpemUgPSB+MDsKIAogCWlmICh1c2JfaGNkX2lzX3ByaW1hcnlfaGNkKGhjZCkpIHsKIAkJeGhjaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4aGNpX2hjZCksIEdGUF9LRVJORUwpOwpAQCAtNDA1Nyw2ICs0MDY4LDExIEBACiAJCXByaW50ayhLRVJOX0RFQlVHICJQcm9ibGVtIHJlZ2lzdGVyaW5nIFBDSSBkcml2ZXIuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQorCXJldHZhbCA9IHhoY2lfcmVnaXN0ZXJfcGxhdCgpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJQcm9ibGVtIHJlZ2lzdGVyaW5nIHBsYXRmb3JtIGRyaXZlci4iKTsKKwkJZ290byB1bnJlZ19wY2k7CisJfQogCS8qCiAJICogQ2hlY2sgdGhlIGNvbXBpbGVyIGdlbmVyYXRlZCBzaXplcyBvZiBzdHJ1Y3R1cmVzIHRoYXQgbXVzdCBiZSBsYWlkCiAJICogb3V0IGluIHNwZWNpZmljIHdheXMgZm9yIGhhcmR3YXJlIGFjY2Vzcy4KQEAgLTQwNzYsMTEgKzQwOTIsMTUgQEAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCB4aGNpX3J1bl9yZWdzKSAhPSAoOCs4KjEyOCkqMzIvOCk7CiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgeGhjaV9kb29yYmVsbF9hcnJheSkgIT0gMjU2KjMyLzgpOwogCXJldHVybiAwOwordW5yZWdfcGNpOgorCXhoY2lfdW5yZWdpc3Rlcl9wY2koKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogbW9kdWxlX2luaXQoeGhjaV9oY2RfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB4aGNpX2hjZF9jbGVhbnVwKHZvaWQpCiB7CiAJeGhjaV91bnJlZ2lzdGVyX3BjaSgpOworCXhoY2lfdW5yZWdpc3Rlcl9wbGF0KCk7CiB9CiBtb2R1bGVfZXhpdCh4aGNpX2hjZF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKaW5kZXggN2E1NjgwNS4uZWMyOTQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLmgKQEAgLTEyMzEsMTAgKzEyMzEsNyBAQAogLyogQWxsb3cgdHdvIGNvbW1hbmRzICsgYSBsaW5rIFRSQiwgYWxvbmcgd2l0aCBhbnkgcmVzZXJ2ZWQgY29tbWFuZCBUUkJzICovCiAjZGVmaW5lIE1BWF9SU1ZEX0NNRF9UUkJTCShUUkJTX1BFUl9TRUdNRU5UIC0gMykKICNkZWZpbmUgU0VHTUVOVF9TSVpFCQkoVFJCU19QRVJfU0VHTUVOVCoxNikKLS8qIFNFR01FTlRfU0hJRlQgc2hvdWxkIGJlIGxvZzIoU0VHTUVOVF9TSVpFKS4KLSAqIENoYW5nZSB0aGlzIGlmIHlvdSBjaGFuZ2UgVFJCU19QRVJfU0VHTUVOVCEKLSAqLwotI2RlZmluZSBTRUdNRU5UX1NISUZUCQkxMAorI2RlZmluZSBTRUdNRU5UX1NISUZUCQkoX19mZnMoU0VHTUVOVF9TSVpFKSkKIC8qIFRSQiBidWZmZXIgcG9pbnRlcnMgY2FuJ3QgY3Jvc3MgNjRLQiBib3VuZGFyaWVzICovCiAjZGVmaW5lIFRSQl9NQVhfQlVGRl9TSElGVAkJMTYKICNkZWZpbmUgVFJCX01BWF9CVUZGX1NJWkUJKDEgPDwgVFJCX01BWF9CVUZGX1NISUZUKQpAQCAtMTI2MSw4ICsxMjU4LDE5IEBACiAJaW50IG5ld19jeWNsZV9zdGF0ZTsKIH07CiAKK2VudW0geGhjaV9yaW5nX3R5cGUgeworCVRZUEVfQ1RSTCA9IDAsCisJVFlQRV9JU09DLAorCVRZUEVfQlVMSywKKwlUWVBFX0lOVFIsCisJVFlQRV9TVFJFQU0sCisJVFlQRV9DT01NQU5ELAorCVRZUEVfRVZFTlQsCit9OworCiBzdHJ1Y3QgeGhjaV9yaW5nIHsKIAlzdHJ1Y3QgeGhjaV9zZWdtZW50CSpmaXJzdF9zZWc7CisJc3RydWN0IHhoY2lfc2VnbWVudAkqbGFzdF9zZWc7CiAJdW5pb24gIHhoY2lfdHJiCQkqZW5xdWV1ZTsKIAlzdHJ1Y3QgeGhjaV9zZWdtZW50CSplbnFfc2VnOwogCXVuc2lnbmVkIGludAkJZW5xX3VwZGF0ZXM7CkBAIC0xMjc3LDYgKzEyODUsMTAgQEAKIAkgKi8KIAl1MzIJCQljeWNsZV9zdGF0ZTsKIAl1bnNpZ25lZCBpbnQJCXN0cmVhbV9pZDsKKwl1bnNpZ25lZCBpbnQJCW51bV9zZWdzOworCXVuc2lnbmVkIGludAkJbnVtX3RyYnNfZnJlZTsKKwl1bnNpZ25lZCBpbnQJCW51bV90cmJzX2ZyZWVfdGVtcDsKKwllbnVtIHhoY2lfcmluZ190eXBlCXR5cGU7CiAJYm9vbAkJCWxhc3RfdGRfd2FzX3Nob3J0OwogfTsKIApAQCAtMTM1Miw2ICsxMzY0LDcgQEAKIAkvKiBwb3J0cyBzdXNwZW5kIHN0YXR1cyBhcnJheXMgLSBtYXggMzEgcG9ydHMgZm9yIFVTQjIsIDE1IGZvciBVU0IzICovCiAJdTMyCQkJcG9ydF9jX3N1c3BlbmQ7CiAJdTMyCQkJc3VzcGVuZGVkX3BvcnRzOworCXUzMgkJCXBvcnRfcmVtb3RlX3dha2V1cDsKIAl1bnNpZ25lZCBsb25nCQlyZXN1bWVfZG9uZVtVU0JfTUFYQ0hJTERSRU5dOwogfTsKIApAQCAtMTM2Myw3ICsxMzc2LDcgQEAKIAkJcmV0dXJuIDE7CiB9CiAKLS8qIFRoZXJlIGlzIG9uZSBlaGNpX2hjaSBzdHJ1Y3R1cmUgcGVyIGNvbnRyb2xsZXIgKi8KKy8qIFRoZXJlIGlzIG9uZSB4aGNpX2hjZCBzdHJ1Y3R1cmUgcGVyIGNvbnRyb2xsZXIgKi8KIHN0cnVjdCB4aGNpX2hjZCB7CiAJc3RydWN0IHVzYl9oY2QgKm1haW5faGNkOwogCXN0cnVjdCB1c2JfaGNkICpzaGFyZWRfaGNkOwpAQCAtMTYxOCw2ICsxNjMxLDggQEAKIAkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXAsCiAJCWdmcF90IG1lbV9mbGFncyk7CiB2b2lkIHhoY2lfcmluZ19mcmVlKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwgc3RydWN0IHhoY2lfcmluZyAqcmluZyk7CitpbnQgeGhjaV9yaW5nX2V4cGFuc2lvbihzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksIHN0cnVjdCB4aGNpX3JpbmcgKnJpbmcsCisJCQkJdW5zaWduZWQgaW50IG51bV90cmJzLCBnZnBfdCBmbGFncyk7CiB2b2lkIHhoY2lfZnJlZV9vcl9jYWNoZV9lbmRwb2ludF9yaW5nKHN0cnVjdCB4aGNpX2hjZCAqeGhjaSwKIAkJc3RydWN0IHhoY2lfdmlydF9kZXZpY2UgKnZpcnRfZGV2LAogCQl1bnNpZ25lZCBpbnQgZXBfaW5kZXgpOwpAQCAtMTY1Nyw2ICsxNjcyLDE3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgeGhjaV91bnJlZ2lzdGVyX3BjaSh2b2lkKSB7fQogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19VU0JfWEhDSV9QTEFURk9STSkgXAorCXx8IGRlZmluZWQoQ09ORklHX1VTQl9YSENJX1BMQVRGT1JNX01PRFVMRSkKK2ludCB4aGNpX3JlZ2lzdGVyX3BsYXQodm9pZCk7Cit2b2lkIHhoY2lfdW5yZWdpc3Rlcl9wbGF0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHhoY2lfcmVnaXN0ZXJfcGxhdCh2b2lkKQoreyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHhoY2lfdW5yZWdpc3Rlcl9wbGF0KHZvaWQpCit7ICB9CisjZW5kaWYKKwogLyogeEhDSSBob3N0IGNvbnRyb2xsZXIgZ2x1ZSAqLwogdHlwZWRlZiB2b2lkICgqeGhjaV9nZXRfcXVpcmtzX3QpKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHhoY2lfaGNkICopOwogdm9pZCB4aGNpX3F1aWVzY2Uoc3RydWN0IHhoY2lfaGNkICp4aGNpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZwppbmRleCA3OWZkNjA2Li5hZDc4MThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKKysrIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCkBAIC0zNDMsNiArMzQzLDE3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpbXgyX3dkdC4KIAorY29uZmlnIENPTUNFUlRPX1dBVENIRE9HCisJdHJpc3RhdGUgIkNvbWNlcnRvIFdhdGNoZG9nIgorCWRlcGVuZHMgb24gQVJDSF9DT01DRVJUTworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgd2F0Y2hkb2cgdGltZXIgaW4KKwkgIENvbWNlcnRvIGRldmljZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGJlIGJ1aWx0IGFzIGEgbW9kdWxlIGJ5IGNob29zaW5nIE0uCisJICBUaGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNvbWNlcnRvX3dkdAorCisKICMgQVZSMzIgQXJjaGl0ZWN0dXJlCiAKIGNvbmZpZyBBVDMyQVA3MDBYX1dEVApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZSBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggZmU4OTNlOS4uMGZmYmI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCkBAIC01Myw2ICs1Myw3IEBACiBvYmotJChDT05GSUdfTlVDOTAwX1dBVENIRE9HKSArPSBudWM5MDBfd2R0Lm8KIG9iai0kKENPTkZJR19UUzcyWFhfV0FUQ0hET0cpICs9IHRzNzJ4eF93ZHQubwogb2JqLSQoQ09ORklHX0lNWDJfV0RUKSArPSBpbXgyX3dkdC5vCitvYmotJChDT05GSUdfQ09NQ0VSVE9fV0FUQ0hET0cpICs9IGNvbWNlcnRvX3dkdC5vCiAKICMgQVZSMzIgQXJjaGl0ZWN0dXJlCiBvYmotJChDT05GSUdfQVQzMkFQNzAwWF9XRFQpICs9IGF0MzJhcDcwMHhfd2R0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvY29tY2VydG9fd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2NvbWNlcnRvX3dkdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OWFlYjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL2NvbWNlcnRvX3dkdC5jCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogIGRyaXZlcnMvY2hhci93YXRjaGRvZy9jb21jZXJ0b193ZHQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSwyMDEzIE1pbmRzcGVlZCBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxtYWNoL3dkdC5oPgorI2luY2x1ZGUgPG1hY2gvcmVzZXQuaD4KKworI2RlZmluZSBXRFRfTkFNRQkJCQkJImNvbWNlcnRvX3dkdCIKKyNkZWZpbmUgV0RUX0RFRkFVTFRfVElNRU9VVAkJCQk1CisjZGVmaW5lIFdEVF9NQVhfVElNRU9VVAkJCQkJKDB4ZmZmZmZmZmYgLyBDT01DRVJUT19BSEJDTEspCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIENPTUNFUlRPX0FIQkNMSzsKK3N0YXRpYyBpbnQgd2RfaGVhcnRiZWF0ID0gV0RUX0RFRkFVTFRfVElNRU9VVDsKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfYXhpOworCittb2R1bGVfcGFyYW0od2RfaGVhcnRiZWF0LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3ZF9oZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXQgaW4gc2Vjb25kcy4gKGRlZmF1bHQ9Il9fTU9EVUxFX1NUUklORyhXRFRfREVGQVVMVF9USU1FT1VUKSAiKSIpOworCisjaWZkZWYgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCittb2R1bGVfcGFyYW0obm93YXlvdXQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vd2F5b3V0LCAiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSAiKSIpOworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvbWNlcnRvX3dkdF9idXN5Oworc3RhdGljIGNoYXIgZXhwZWN0X2Nsb3NlOworc3RhdGljIHNwaW5sb2NrX3Qgd2R0X2xvY2s7CisKKy8qCisgKiBJbmZvcm0gd2hldGhlciB0aGUgYm9vdCB3YXMgY2F1c2VkIGJ5IEFYSSB3YXRjaGRvZyBvciBub3QuCisgKiBJZiB0aGUgYm9vdCB3YXMgY2F1c2VkIGJ5IEFYSSBXRFQsIHRoZSBXRCBzdGF0dXMgaXMgY2xlYXJlZCBmcm9tCisgKiByZXNldCBjb250cm9sIHJlZ2lzdGVyLgorICovCitzdGF0aWMgaW50IGNvbWNlcnRvX3dkdF9yc3Rfc3RhdHVzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3ZHRfbG9jaywgZmxhZ3MpOworCisJaWYoX19yYXdfcmVhZGwoR05STF9ERVZJQ0VfU1RBVFVTKSAmIEFYSV9XRF9SU1RfQUNUSVZBVEVEKSB7CisJCV9fcmF3X3dyaXRlbChXRF9TVEFUVVNfQ0xSIHwgX19yYXdfcmVhZGwoREVWSUNFX1JTVF9DTlRSTCksIERFVklDRV9SU1RfQ05UUkwpOworCQlyZXQgPSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndkdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU2V0IGEgbmV3IGhlYXJ0YmVhdCB2YWx1ZSBmb3IgdGhlIHdhdGNoZG9nIGRldmljZS4gSWYgdGhlIGhlYXJ0YmVhdCB2YWx1ZSBpcworICogaW5jb3JyZWN0IHdlIGtlZXAgdGhlIG9sZCB2YWx1ZSBhbmQgcmV0dXJuIC1FSU5WQUwuIElmIHN1Y2Nlc3NmdWxsIHdlIHJldHVybiAwLgorICovCitzdGF0aWMgaW50IGNvbWNlcnRvX3dkdF9zZXRfaGVhcnRiZWF0KGludCB0KQoreworCWlmICh0IDwgMSB8fCB0ID4gV0RUX01BWF9USU1FT1VUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdkX2hlYXJ0YmVhdCA9IHQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSB3ZF9oZWFydGJlYXQgdG8gaGlnaCBib3VuZCByZWdpc3Rlci4KKyAqLworc3RhdGljIHZvaWQgY29tY2VydG9fd2R0X3NldF90aW1lb3V0KHZvaWQpCit7CisJX19yYXdfd3JpdGVsKHdkX2hlYXJ0YmVhdCAqIENPTUNFUlRPX0FIQkNMSywgQ09NQ0VSVE9fVElNRVJfV0RUX0hJR0hfQk9VTkQpOworfQorCisvKgorICogRGlzYWJsZSB0aGUgd2F0Y2hkb2cuCisgKi8KK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3dkdF9zdG9wKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgd2R0X2NvbnRyb2w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2R0X2xvY2ssIGZsYWdzKTsKKworCXdkdF9jb250cm9sID0gX19yYXdfcmVhZGwoQ09NQ0VSVE9fVElNRVJfV0RUX0NPTlRST0wpOworCisJX19yYXdfd3JpdGVsKHdkdF9jb250cm9sICYgfkNPTUNFUlRPX1RJTUVSX1dEVF9DT05UUk9MX1RJTUVSX0VOQUJMRSwgQ09NQ0VSVE9fVElNRVJfV0RUX0NPTlRST0wpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2R0X2xvY2ssIGZsYWdzKTsKKworCWNvbWNlcnRvX3dkdF9zZXRfdGltZW91dCgpOworfQorCisvKgorICogRW5hYmxlIHRoZSB3YXRjaGRvZy4KKyAqLworc3RhdGljIHZvaWQgY29tY2VydG9fd2R0X3N0YXJ0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgd2R0X2NvbnRyb2w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2R0X2xvY2ssIGZsYWdzKTsKKworCXdkdF9jb250cm9sID0gX19yYXdfcmVhZGwoQ09NQ0VSVE9fVElNRVJfV0RUX0NPTlRST0wpOworCisJX19yYXdfd3JpdGVsKHdkdF9jb250cm9sIHwgQ09NQ0VSVE9fVElNRVJfV0RUX0NPTlRST0xfVElNRVJfRU5BQkxFLCBDT01DRVJUT19USU1FUl9XRFRfQ09OVFJPTCk7CisKKwljb21jZXJ0b19yc3RfY250cmxfc2V0KEFYSV9XRF9SU1RfRU4pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2R0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIERpc2FibGUgV0RUIGFuZDoKKyAqIC0gc2V0IG1heC4gcG9zc2libGUgdGltZW91dCB0byBhdm9pZCByZXNldCwgaXQgY2FuIG9jY3VyCisgKiBzaW5jZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUgY291bGQgYmUgYmlnZ2VyIHRoZW4KKyAqIGhpZ2ggYm91bmQgb25lIGF0IHRoZSBtb21lbnQKKyAqIEZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGF0IHN0YXJ0ICh3aGlsZSBjb25maWd1cmF0aW9uKSwKKyAqIGFuZCBpdCdzIHNhZmUgbm90IHRvIGRpc2FibGUvZW5hYmxlIElSUXMuCisgKi8KK3N0YXRpYyB2b2lkIGNvbWNlcnRvX3dkdF9jb25maWcodm9pZCkKK3sKKwljb21jZXJ0b193ZHRfc3RvcCgpOworCisJX19yYXdfd3JpdGVsKH4wLCBDT01DRVJUT19USU1FUl9XRFRfSElHSF9CT1VORCk7CQkJLyogd3JpdGUgbWF4IHRpbW91dCAqLworfQorCisvKgorICogV2F0Y2hkb2cgZGV2aWNlIGlzIG9wZW5lZCwgYW5kIHdhdGNoZG9nIHN0YXJ0cyBydW5uaW5nLgorICovCitzdGF0aWMgaW50IGNvbWNlcnRvX3dkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZjb21jZXJ0b193ZHRfYnVzeSkpCisJCXJldHVybiAtRUJVU1k7CisKKwljb21jZXJ0b193ZHRfc2V0X3RpbWVvdXQoKTsKKwljb21jZXJ0b193ZHRfc3RhcnQoKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIHdhdGNoZG9nIGRldmljZS4KKyAqIElmIENPTkZJR19XQVRDSERPR19OT1dBWU9VVCBpcyBOT1QgZGVmaW5lZCBhbmQgZXhwZWN0X2Nsb3NlID09IDQyCisgKiBpLmUuIG1hZ2ljIGNoYXIgJ1YnIGhhcyBiZWVuIHBhc3NlZCB3aGlsZSB3cml0ZSgpIHRoZW4gdGhlIHdhdGNoZG9nCisgKiBpcyBhbHNvIGRpc2FibGVkLgorICovCitzdGF0aWMgaW50IGNvbWNlcnRvX3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJY29tY2VydG9fd2R0X3N0b3AoKTsJLyogZGlzYWJsZSB0aGUgd2F0Y2hkb2cgd2hlbiBmaWxlIGlzIGNsb3NlZCAqLworCQljbGVhcl9iaXQoMCwgJmNvbWNlcnRvX3dkdF9idXN5KTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUICIlczogY2xvc2VkIHVuZXhwZWN0ZWRseS4gV0RUIHdpbGwgbm90IHN0b3AhXG4iLCBXRFRfTkFNRSk7CisJfQorCisJZXhwZWN0X2Nsb3NlID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhhbmRsZSBjb21tYW5kcyBmcm9tIHVzZXItc3BhY2UuCisgKi8KK3N0YXRpYyBsb25nIGNvbWNlcnRvX3dkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdWludCBjbWQsIHVsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwlpbnQgbmV3X3ZhbHVlOworCWludCBlcnI7CisJc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIGNvbWNlcnRvX3dkdF9pbmZvID0geworCQkub3B0aW9ucyA9IAlXRElPRl9TRVRUSU1FT1VUIHwKKwkJCQlXRElPRl9NQUdJQ0NMT1NFIHwKKwkJCQlXRElPRl9LRUVQQUxJVkVQSU5HLAorCQkuZmlybXdhcmVfdmVyc2lvbiA9IDEsCisJfTsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJY29tY2VydG9fd2R0X3NldF90aW1lb3V0KCk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlzdHJuY3B5KGNvbWNlcnRvX3dkdF9pbmZvLmlkZW50aXR5LCBXRFRfTkFNRSwgc2l6ZW9mKGNvbWNlcnRvX3dkdF9pbmZvLmlkZW50aXR5KSk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNvbWNlcnRvX3dkdF9pbmZvLCBzaXplb2YoY29tY2VydG9fd2R0X2luZm8pKSAhPSAwKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBlcnI7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX1NFVFRJTUVPVVQ6CisJCWlmIChnZXRfdXNlcihuZXdfdmFsdWUsIHApKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBlcnI7CisJCX0KKworCQlpZiAoY29tY2VydG9fd2R0X3NldF9oZWFydGJlYXQobmV3X3ZhbHVlKSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJY29tY2VydG9fd2R0X3NldF90aW1lb3V0KCk7CisKKwkJcmV0dXJuIHB1dF91c2VyKHdkX2hlYXJ0YmVhdCwgcCk7CisJCWJyZWFrOworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIod2RfaGVhcnRiZWF0LCBwKTsKKwkJYnJlYWs7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKGNvbWNlcnRvX3dkdF9yc3Rfc3RhdHVzKCksIHApOworCQlicmVhazsKKworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaWYgKGdldF91c2VyKG5ld192YWx1ZSwgcCkpIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWlmIChuZXdfdmFsdWUgJiBXRElPU19ESVNBQkxFQ0FSRCkKKwkJCWNvbWNlcnRvX3dkdF9zdG9wKCk7CisKKwkJaWYgKG5ld192YWx1ZSAmIFdESU9TX0VOQUJMRUNBUkQpCisJCQljb21jZXJ0b193ZHRfc3RhcnQoKTsKKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9JT0NUTENNRDsKKwkJZ290byBlcnI7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFBhdCB0aGUgd2F0Y2hkb2cgd2hlbmV2ZXIgZGV2aWNlIGlzIHdyaXR0ZW4gdG8uCisgKi8KK3N0YXRpYyBzc2l6ZV90IGNvbWNlcnRvX3dkdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGxlbikgeworCQlpZiAoIW5vd2F5b3V0KSB7CisJCQlzaXplX3QgaTsKKwkJCWNoYXIgYzsKKworCQkJLyogaW4gY2FzZSBpdCB3YXMgc2V0IGxvbmcgYWdvICovCisJCQlleHBlY3RfY2xvc2UgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpICE9IGxlbjsgaSsrKSB7CisJCQkJaWYgKGdldF91c2VyKGMsIGJ1ZiArIGkpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKworCQljb21jZXJ0b193ZHRfc2V0X3RpbWVvdXQoKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb21jZXJ0b193ZHRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnVubG9ja2VkX2lvY3RsCT0gY29tY2VydG9fd2R0X2lvY3RsLAorCS5vcGVuCQk9IGNvbWNlcnRvX3dkdF9vcGVuLAorCS5yZWxlYXNlCT0gY29tY2VydG9fd2R0X3JlbGVhc2UsCisJLndyaXRlCQk9IGNvbWNlcnRvX3dkdF93cml0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBjb21jZXJ0b193ZHRfbWlzY2RldiA9IHsKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gV0RUX05BTUUsCisJLmZvcHMJCT0gJmNvbWNlcnRvX3dkdF9mb3BzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY29tY2VydG9fd2R0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJlczsKKworCWlmIChjb21jZXJ0b193ZHRfbWlzY2Rldi5wYXJlbnQpCisJCXJldHVybiAtRUJVU1k7CisKKwljbGtfYXhpID0gY2xrX2dldChOVUxMLCAiYXhpIik7CisKKwlpZiAoSVNfRVJSKGNsa19heGkpKXsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIG9idGFpbiBheGkgY2xvY2s6ICVsZFxuIixfX2Z1bmNfXyxQVFJfRVJSKGNsa19heGkpKTsKKwkJLyogU3lzdGVtIGNhbm5vdCBwcm9jZWVkIGZyb20gaGVyZSAqLworCQlCVUcoKTsKKwl9CisKKwlyZXMgPSBjbGtfZW5hYmxlKGNsa19heGkpOworCWlmIChyZXMpeworCQlwcl9lcnIoIiVzOiBheGkgY2xvY2sgZmFpbGVkIHRvIGVuYWJsZTpcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfY2xrOworCX0KKworCUNPTUNFUlRPX0FIQkNMSyA9IGNsa19nZXRfcmF0ZShjbGtfYXhpKTsKKworCWNvbWNlcnRvX3dkdF9taXNjZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJY29tY2VydG9fd2R0X2NvbmZpZygpOworCisJcmVzID0gbWlzY19yZWdpc3RlcigmY29tY2VydG9fd2R0X21pc2NkZXYpOworCWlmIChyZXMpCisJCWdvdG8gZXJyX21pc2M7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogc3VwcG9ydCByZWdpc3RlcmVkXG4iLCBXRFRfTkFNRSk7CisKKyAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgaGVhcnRiZWF0IHZhbHVlIGlzIHdpdGhpbiByYW5nZTsgaWYgbm90IHJlc2V0IHRvIHRoZSBkZWZhdWx0ICovCisgICAgICAgIGlmIChjb21jZXJ0b193ZHRfc2V0X2hlYXJ0YmVhdCh3ZF9oZWFydGJlYXQpKSB7CisgICAgICAgICAgICAgICAgY29tY2VydG9fd2R0X3NldF9oZWFydGJlYXQoV0RUX0RFRkFVTFRfVElNRU9VVCk7CisKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICIlczogd2RfaGVhcnRiZWF0IHZhbHVlIGlzIG91dCBvZiByYW5nZTogMS4uJWx1LCB1c2luZyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdEVF9OQU1FLCBXRFRfTUFYX1RJTUVPVVQsIFdEVF9ERUZBVUxUX1RJTUVPVVQpOworICAgICAgICB9CisKKwlyZXR1cm4gMDsKKworZXJyX21pc2M6CisJY2xrX2Rpc2FibGUoY2xrX2F4aSk7CitlcnJfY2xrOgorCWNsa19wdXQoY2xrX2F4aSk7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBjb21jZXJ0b193ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJlczsKKworCisJY2xrX2Rpc2FibGUoY2xrX2F4aSk7CisJY2xrX3B1dChjbGtfYXhpKTsKKwlyZXMgPSBtaXNjX2RlcmVnaXN0ZXIoJmNvbWNlcnRvX3dkdF9taXNjZGV2KTsKKwlpZiAoIXJlcykKKwkJY29tY2VydG9fd2R0X21pc2NkZXYucGFyZW50ID0gTlVMTDsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNvbWNlcnRvX3dkdF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGNvbWNlcnRvX3dkdF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZXhpdF9wKGNvbWNlcnRvX3dkdF9yZW1vdmUpLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IFdEVF9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgY29tY2VydG9fd2R0X2luaXQodm9pZCkKK3sKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJndkdF9sb2NrKTsKKworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmNvbWNlcnRvX3dkdF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY29tY2VydG9fd2R0X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmY29tY2VydG9fd2R0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNvbWNlcnRvX3dkdF9pbml0KTsKK21vZHVsZV9leGl0KGNvbWNlcnRvX3dkdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWluZHNwZWVkIFRlY2hub2xvZ2llcywgSW5jLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXYXRjaGRvZyBkcml2ZXIgZm9yIENvbWNlcnRvIDIwMDAgZGV2aWNlcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZmlsZS5jIGIvZnMvYnRyZnMvZmlsZS5jCmluZGV4IDk3ZmJlOTMuLmE2YTkxMjkgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2ZpbGUuYworKysgYi9mcy9idHJmcy9maWxlLmMKQEAgLTMwLDYgKzMwLDE2IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSU1QUk9WRURfU1BMSUNFKQorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fU1BMSUNFX1VTRV9NRE1BKQorI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNlbmRpZgorI2VuZGlmCisKICNpbmNsdWRlICJjdHJlZS5oIgogI2luY2x1ZGUgImRpc2staW8uaCIKICNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgpAQCAtMTcxOCw2ICsxNzI4LDE3MyBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19JTVBST1ZFRF9TUExJQ0UpCitzdGF0aWMgc3NpemVfdCBidHJmc19zcGxpY2VfZnJvbV9zb2NrZXQoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJCWxvZmZfdCBfX3VzZXIgKnBwb3MsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmRlbnRyeShmaWxlKS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOworCXN0cnVjdCBrdmVjICppb3YgPSBOVUxMOworCXN0cnVjdCBtc2doZHIgbXNnOworCWxvbmcgcmVjdnRpbWVvOworCXNzaXplX3QgY29waWVkID0gMDsKKwlzaXplX3Qgb2Zmc2V0LCBvZmZzZXRfdG1wOworCWludCBudW1fcGFnZXMsIGRpcnR5X3BhZ2VzOworCWludCBlcnIgPSAwOworCWxvZmZfdCBzdGFydF9wb3M7CisJbG9mZl90IHBvcyA9IGZpbGUtPmZfcG9zOworCWludCBpOworCXVuc2lnbmVkIGNvdW50X3RtcCA9IGNvdW50OworCisjZGVmaW5lIEVSUk9SX09VVCBkbyB7bXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7IGdvdG8gb3V0O30gd2hpbGUoMCkKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJaWYgKHBwb3MgJiYgY29weV9mcm9tX3VzZXIoJnBvcywgcHBvcywgc2l6ZW9mIHBvcykpCisJCXJldHVybiAtRUZBVUxUOworCW9mZnNldCA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwludW1fcGFnZXMgPSAob2Zmc2V0ICsgY291bnQgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9VU0VfTURNQSkKKwlpZiAobnVtX3BhZ2VzID4gTURNQV9PVVRCT1VORF9CVUZfREVTQykKKwkJRVJST1JfT1VUOworI2VuZGlmCisJc3RhcnRfcG9zID0gcm91bmRfZG93bihwb3MsIHJvb3QtPnNlY3RvcnNpemUpOworCisJaWYgKCEocGFnZXMgPSBrbWFsbG9jKG51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX0tFUk5FTCkpIHx8CisJCSEoaW92ID0ga21hbGxvYyhudW1fcGFnZXMgKiBzaXplb2YoKmlvdiksIEdGUF9LRVJORUwpKSkKKwkJRVJST1JfT1VUOworCisJdmZzX2NoZWNrX2Zyb3plbihpbm9kZS0+aV9zYiwgU0JfRlJFRVpFX1dSSVRFKTsKKwljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKKworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKworCWlmICgoZXJyID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgJnBvcywgJmNvdW50LAorCQkJCQlTX0lTQkxLKGlub2RlLT5pX21vZGUpKSkpCisJCUVSUk9SX09VVDsKKworCWlmICgoZXJyID0gZmlsZV9yZW1vdmVfc3VpZChmaWxlKSkpCisJCUVSUk9SX09VVDsKKworCWlmIChyb290LT5mc19pbmZvLT5mc19zdGF0ZSAmIEJUUkZTX1NVUEVSX0ZMQUdfRVJST1IpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSAtRVJPRlM7CisJCUVSUk9SX09VVDsKKwl9CisKKwlpZiAoKGVyciA9IGJ0cmZzX3VwZGF0ZV90aW1lKGZpbGUpKSkKKwkJRVJST1JfT1VUOworCisJQlRSRlNfSShpbm9kZSktPnNlcXVlbmNlKys7CisJaWYgKHN0YXJ0X3BvcyA+IGlfc2l6ZV9yZWFkKGlub2RlKSAmJgorCQkoZXJyID0gYnRyZnNfY29udF9leHBhbmQoaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSwgc3RhcnRfcG9zKSkpCisJCUVSUk9SX09VVDsKKworCWlmICgoZXJyID0gYnRyZnNfZGVsYWxsb2NfcmVzZXJ2ZV9zcGFjZShpbm9kZSwKKwkJCQkJbnVtX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQpKSkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmICgoZXJyID0gcHJlcGFyZV9wYWdlcyhyb290LCBmaWxlLCBwYWdlcywgbnVtX3BhZ2VzLAorCQkJCQlwb3MsIHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZULAorCQkJCQljb3VudCwgZmFsc2UpKSkgeworCQlidHJmc19kZWxhbGxvY19yZWxlYXNlX3NwYWNlKGlub2RlLAorCQkJCQludW1fcGFnZXMgPDwgUEFHRV9DQUNIRV9TSElGVCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJZm9yIChpID0gMCwgb2Zmc2V0X3RtcCA9IG9mZnNldDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJCXVuc2lnbmVkIGJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0X3RtcDsKKworCQlpZiAoYnl0ZXMgPiBjb3VudF90bXApCisJCQlieXRlcyA9IGNvdW50X3RtcDsKKwkJaW92W2ldLmlvdl9iYXNlID0ga21hcChwYWdlc1tpXSkgKyBvZmZzZXRfdG1wOworCQlpb3ZbaV0uaW92X2xlbiA9IGJ5dGVzOworCQlvZmZzZXRfdG1wID0gMDsKKwkJY291bnRfdG1wIC09IGJ5dGVzOworCX0KKworICAgICAgICAvKiBJT1YgaXMgcmVhZHksIHJlY2VpdmUgdGhlIGRhdGUgZnJvbSBzb2NrZXQgbm93ICovCisJbXNnLm1zZ19uYW1lID0gTlVMTDsKKwltc2cubXNnX25hbWVsZW4gPSAwOworCW1zZy5tc2dfaW92ID0gKHN0cnVjdCBpb3ZlYyAqKSZpb3ZbMF07CisJbXNnLm1zZ19pb3ZsZW4gPSBudW1fcGFnZXM7CisJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MgPSBNU0dfS0VSTlNQQUNFOworCisJcmVjdnRpbWVvID0gc29jay0+c2stPnNrX3JjdnRpbWVvOworCXNvY2stPnNrLT5za19yY3Z0aW1lbyA9IDggKiBIWjsKKwljb3BpZWQgPSBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCBpb3YsIG51bV9wYWdlcywgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19XQUlUQUxMIHwgTVNHX05PQ0FUQ0hTSUcpOworCXNvY2stPnNrLT5za19yY3Z0aW1lbyA9IHJlY3Z0aW1lbzsKKworCWlmIChjb3BpZWQgPCAwKSB7CisJCWVyciA9IGNvcGllZDsKKwkJY29waWVkID0gMDsKKwl9CisKKwkvKiBGSVhNRToKKwkgKiBUaGUgZm9sbG93aW5nIHJlc3VsdHMgaW4gYXQgbGVhc3Qgb25lIGRpcnR5X3BhZ2UgZXZlbiBmb3IgY29waWVkPT0wCisJICogdW5sZXNzIG9mZnNldD09MCwgYnV0IG90aGVyd2lzZSB0aGUgZmlyIHBhZ2Ugd291bGQgYmUgY29ycnVwdGVkCisJICogZm9yIGFuIHVua25vd24gcmVhc29uLgorCSAqLworCWRpcnR5X3BhZ2VzID0gKGNvcGllZCArIG9mZnNldCArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+CisJCQkJCVBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspCisJCWt1bm1hcChwYWdlc1tpXSk7CisJaWYgKGRpcnR5X3BhZ2VzIDwgbnVtX3BhZ2VzKSB7CisJCWlmICgxfHxkaXJ0eV9wYWdlcykgeworCQkJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CisJCQlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cysrOworCQkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKKwkJfQorCQlidHJmc19kZWxhbGxvY19yZWxlYXNlX3NwYWNlKGlub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudW1fcGFnZXMgLSBkaXJ0eV9wYWdlcykgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX0NBQ0hFX1NISUZUKTsKKwl9CisKKwlpZiAoZGlydHlfcGFnZXMpIHsKKwkJaWYgKChlcnIgPSBidHJmc19kaXJ0eV9wYWdlcyhyb290LCBpbm9kZSwgcGFnZXMsCisJCQkJCWRpcnR5X3BhZ2VzLCBwb3MsIGNvcGllZCwgTlVMTCkpKSB7CisJCQlidHJmc19kZWxhbGxvY19yZWxlYXNlX3NwYWNlKGlub2RlLAorCQkJCQlkaXJ0eV9wYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJCWJ0cmZzX2Ryb3BfcGFnZXMocGFnZXMsIG51bV9wYWdlcyk7CisJCQlnb3RvIG91dF9mcmVlOworICAgICAgICAgICAgICAgIH0KKwl9CisKKwlidHJmc19kcm9wX3BhZ2VzKHBhZ2VzLCBudW1fcGFnZXMpOworCWNvbmRfcmVzY2hlZCgpOworCisJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZF9ucihpbm9kZS0+aV9tYXBwaW5nLCBkaXJ0eV9wYWdlcyk7CisJaWYgKGRpcnR5X3BhZ2VzIDwgKHJvb3QtPmxlYWZzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpICsgMSkKKwkJYnRyZnNfYnRyZWVfYmFsYW5jZV9kaXJ0eShyb290LCAxKTsKKworCXBvcyArPSBjb3BpZWQ7CisKK291dF9mcmVlOgorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKGNvcGllZCA+IDApIHsKKwkJZmlsZS0+Zl9wb3MgPSBwb3M7CisJCWlmIChwcG9zICYmIGNvcHlfdG9fdXNlcihwcG9zLCAmcG9zLCBzaXplb2YgKnBwb3MpKQorCQkJZXJyID0gLUVGQVVMVDsKKwl9CisKKwlCVFJGU19JKGlub2RlKS0+bGFzdF90cmFucyA9IHJvb3QtPmZzX2luZm8tPmdlbmVyYXRpb24gKyAxOworCWlmIChjb3BpZWQgPiAwIHx8IGVyciA9PSAtRUlPQ0JRVUVVRUQpCisJCWVyciA9IGdlbmVyaWNfd3JpdGVfc3luYyhmaWxlLCBwb3MsIGNvcGllZCk7CitvdXQ6CisJa2ZyZWUoaW92KTsKKwlrZnJlZShwYWdlcyk7CisJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IE5VTEw7CisKKwlyZXR1cm4gZXJyID8gZXJyIDogY29waWVkOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgZmluZF9kZXNpcmVkX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgKm9mZnNldCwgaW50IG9yaWdpbikKIHsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwpAQCAtMTg3OSw2ICsyMDU2LDkgQEAKIAkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKIAkuYWlvX3JlYWQgICAgICAgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0lNUFJPVkVEX1NQTElDRSkKKwkuc3BsaWNlX2Zyb21fc29ja2V0CT0gYnRyZnNfc3BsaWNlX2Zyb21fc29ja2V0LAorI2VuZGlmCiAJLmFpb193cml0ZQk9IGJ0cmZzX2ZpbGVfYWlvX3dyaXRlLAogCS5tbWFwCQk9IGJ0cmZzX2ZpbGVfbW1hcCwKIAkub3BlbgkJPSBnZW5lcmljX2ZpbGVfb3BlbiwKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCAxNjBjZDJmLi40Nzk4MmY1IDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC02MjQsNyArNjI0LDcgQEAKIAkJICogd2hlbiB0aGUgb2xkIGFuZCBuZXcgcmVnaW9ucyBvdmVybGFwIGNsZWFyIGZyb20gbmV3X2VuZC4KIAkJICovCiAJCWZyZWVfcGdkX3JhbmdlKCZ0bGIsIG5ld19lbmQsIG9sZF9lbmQsIG5ld19lbmQsCi0JCQl2bWEtPnZtX25leHQgPyB2bWEtPnZtX25leHQtPnZtX3N0YXJ0IDogMCk7CisJCQl2bWEtPnZtX25leHQgPyB2bWEtPnZtX25leHQtPnZtX3N0YXJ0IDogbW0tPnRhc2tfc2l6ZSk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogb3RoZXJ3aXNlLCBjbGVhbiBmcm9tIG9sZF9zdGFydDsgdGhpcyBpcyBkb25lIHRvIG5vdCB0b3VjaApAQCAtNjMzLDcgKzYzMyw3IEBACiAJCSAqIGZvciB0aGUgb3RoZXJzIGl0cyBqdXN0IGEgbGl0dGxlIGZhc3Rlci4KIAkJICovCiAJCWZyZWVfcGdkX3JhbmdlKCZ0bGIsIG9sZF9zdGFydCwgb2xkX2VuZCwgbmV3X2VuZCwKLQkJCXZtYS0+dm1fbmV4dCA/IHZtYS0+dm1fbmV4dC0+dm1fc3RhcnQgOiAwKTsKKwkJCXZtYS0+dm1fbmV4dCA/IHZtYS0+dm1fbmV4dC0+dm1fc3RhcnQgOiBtbS0+dGFza19zaXplKTsKIAl9CiAJdGxiX2ZpbmlzaF9tbXUoJnRsYiwgbmV3X2VuZCwgb2xkX2VuZCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmlsZS5jIGIvZnMvZXh0NC9maWxlLmMKaW5kZXggY2I3MGYxOC4uZDllZTBmZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9maWxlLmMKKysrIGIvZnMvZXh0NC9maWxlLmMKQEAgLTI0Myw3ICsyNDMsMTEgQEAKIAkucmVsZWFzZQk9IGV4dDRfcmVsZWFzZV9maWxlLAogCS5mc3luYwkJPSBleHQ0X3N5bmNfZmlsZSwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSU1QUk9WRURfU1BMSUNFKQorCS5zcGxpY2Vfd3JpdGUJPSBjb21jZXJ0b19maWxlX3NwbGljZV93cml0ZSwKKyNlbHNlCiAJLnNwbGljZV93cml0ZQk9IGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUsCisjZW5kaWYKIAkuZmFsbG9jYXRlCT0gZXh0NF9mYWxsb2NhdGUsCiB9OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggYTA3MTM0OC4uMGE2ZWVmZiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtMzEwNyw2ICszMTA3LDEwIEBACiAJZXh0NF9ncm91cF90CQlpLCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKIAlpbnQJCQlzLCBqLCBjb3VudCA9IDA7CiAKKwlpZiAoIUVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0JJR0FMTE9DKSkKKwkJcmV0dXJuIChleHQ0X2JnX2hhc19zdXBlcihzYiwgZ3JwKSArIGV4dDRfYmdfbnVtX2dkYihzYiwgZ3JwKSArCisJCQlzYmktPnNfaXRiX3Blcl9ncm91cCArIDIpOworCiAJZmlyc3RfYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKwogCQkoZ3JwICogRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSk7CiAJbGFzdF9ibG9jayA9IGZpcnN0X2Jsb2NrICsgRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDE7CmRpZmYgLS1naXQgYS9mcy9mY250bC5jIGIvZnMvZmNudGwuYwppbmRleCAyMjc2NGM3Li4wZmZlNjFmIDEwMDY0NAotLS0gYS9mcy9mY250bC5jCisrKyBiL2ZzL2ZjbnRsLmMKQEAgLTE0Miw2ICsxNDIsNyBAQAogCX0KIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTChzeXNfZHVwKTsKIAogI2RlZmluZSBTRVRGTF9NQVNLIChPX0FQUEVORCB8IE9fTk9OQkxPQ0sgfCBPX05ERUxBWSB8IE9fRElSRUNUIHwgT19OT0FUSU1FKQogCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9zY2FuLmMgYi9mcy9qZmZzMi9zY2FuLmMKaW5kZXggZTMwMjRlZC4uMDQxMDlmOSAxMDA2NDQKLS0tIGEvZnMvamZmczIvc2Nhbi5jCisrKyBiL2ZzL2pmZnMyL3NjYW4uYwpAQCAtMjIsNiArMjIsMTAgQEAKIAogI2RlZmluZSBERUZBVUxUX0VNUFRZX1NDQU5fU0laRSAyNTYKIAorI2lmIGRlZmluZWQgQ09ORklHX01URF9OQU5EX0NPTUNFUlRPCisjZGVmaW5lIEJJVF9GTElQX1RPTEVSRU5DRQk3CisjZW5kaWYKKwogI2RlZmluZSBub2lzeV9wcmludGsobm9pc2UsIGFyZ3MuLi4pIGRvIHsgXAogCWlmICgqKG5vaXNlKSkgeyBcCiAJCXByaW50ayhLRVJOX05PVElDRSBhcmdzKTsgXApAQCAtNjQsNiArNjgsMTcgQEAKIAkJcmV0dXJuIERFRkFVTFRfRU1QVFlfU0NBTl9TSVpFOwogfQogCisjaWYgZGVmaW5lZCBDT05GSUdfTVREX05BTkRfQ09NQ0VSVE8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY291bnRfemVyb19iaXRzKCB1aW50MzJfdCB2YWx1ZSkgeworCXVpbnQzMl90IG51bV96ZXJvcyA9IDA7CisJc2l6ZV90IGk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZiB2YWx1ZTsgKytpLCB2YWx1ZSA+Pj0gMSkgeworCQlpZiAoKHZhbHVlICYgMSkgPT0gMCkKKwkJCSsrbnVtX3plcm9zOworCX0KK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IGZpbGVfZGlydHkoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIpCiB7CiAJaW50IHJldDsKQEAgLTU4OSw2ICs2MDQsMzQgQEAKIAkJZWxzZQogCQkJcmV0dXJuIEJMS19TVEFURV9BTExGRjsJLyogT0sgdG8gZXJhc2UgaWYgYWxsIGJsb2NrcyBhcmUgbGlrZSB0aGlzICovCiAJfQorCisjaWYgZGVmaW5lZCBDT05GSUdfTVREX05BTkRfQ09NQ0VSVE8KKwllbHNlIGlmIChjbGVhbm1hcmtlcmZvdW5kKSB7CisJCQlvZnMgPSAwOworCQkJdWludDMyX3QgbnVtX3plcm9zID0gMDsKKwkJCXdoaWxlKChvZnMgPCBtYXhfb2ZzKSAmJiAobnVtX3plcm9zIDwgQklUX0ZMSVBfVE9MRVJFTkNFKSkgeworCQkJCWlmICghKCoodWludDMyX3QgKikoJmJ1ZltvZnNdKSA9PSAweEZGRkZGRkZGKSkKKwkJCQkJbnVtX3plcm9zID0gY291bnRfemVyb19iaXRzKCoodWludDMyX3QgKikoJmJ1ZltvZnNdKSk7CisJCQkJb2ZzICs9IDQ7CisJCQl9CisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSCisJCWlmICgobnVtX3plcm9zIDwgQklUX0ZMSVBfVE9MRVJFTkNFKSAmJiBqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKKwkJCS8qIHNjYW4gb29iLCB0YWtlIGNhcmUgb2YgY2xlYW5tYXJrZXIgKi8KKwkJCWludCByZXQgPSBqZmZzMl9jaGVja19vb2JfZW1wdHkoYywgamViLCBjbGVhbm1hcmtlcmZvdW5kKTsKKwkJCUQyKHByaW50ayhLRVJOX05PVElDRSAiamZmczJfY2hlY2tfb29iX2VtcHR5IHJldHVybmVkICVkXG4iLHJldCkpOworCQkJc3dpdGNoIChyZXQpIHsKKwkJCWNhc2UgMDoJCXJldHVybiBjbGVhbm1hcmtlcmZvdW5kID8gQkxLX1NUQVRFX0NMRUFOTUFSS0VSIDogQkxLX1NUQVRFX0FMTEZGOworCQkJY2FzZSAxOiAJcmV0dXJuIEJMS19TVEFURV9BTExESVJUWTsKKwkJCWRlZmF1bHQ6IAlyZXR1cm4gcmV0OworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dXJuIEJMS19TVEFURV9BTExESVJUWTsKKwkJfQorI2VuZGlmCisKKwl9CisjZW5kaWYKKwogCWlmIChvZnMpIHsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZyZWUgc3BhY2UgYXQgJTA4eCBlbmRzIGF0ICUwOHhcbiIsIGplYi0+b2Zmc2V0LAogCQkJICBqZWItPm9mZnNldCArIG9mcykpOwpkaWZmIC0tZ2l0IGEvZnMvc3BsaWNlLmMgYi9mcy9zcGxpY2UuYwppbmRleCAwMTRmY2I0Li4zYjBkNjMyIDEwMDY0NAotLS0gYS9mcy9zcGxpY2UuYworKysgYi9mcy9zcGxpY2UuYwpAQCAtMzIsNiArMzIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KIAogLyoKICAqIEF0dGVtcHQgdG8gc3RlYWwgYSBwYWdlIGZyb20gYSBwaXBlIGJ1ZmZlci4gVGhpcyBzaG91bGQgcGVyaGFwcyBnbyBpbnRvCkBAIC0zMzUsNyArMzQwLDExIEBACiAJLyoKIAkgKiBMb29rdXAgdGhlIChob3BlZnVsbHkpIGZ1bGwgcmFuZ2Ugb2YgcGFnZXMgd2UgbmVlZC4KIAkgKi8KKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fU1BMSUNFX1JFQURfTk9DT05USUcKKwlzcGQubnJfcGFnZXMgPSBmaW5kX2dldF9wYWdlcyhtYXBwaW5nLCBpbmRleCwgbnJfcGFnZXMsIHNwZC5wYWdlcyk7CisjZWxzZQogCXNwZC5ucl9wYWdlcyA9IGZpbmRfZ2V0X3BhZ2VzX2NvbnRpZyhtYXBwaW5nLCBpbmRleCwgbnJfcGFnZXMsIHNwZC5wYWdlcyk7CisjZW5kaWYKIAlpbmRleCArPSBzcGQubnJfcGFnZXM7CiAKIAkvKgpAQCAtODQwLDYgKzg0OSwzODAgQEAKIH0KIEVYUE9SVF9TWU1CT0woc3BsaWNlX2Zyb21fcGlwZV9mZWVkKTsKIAorCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSU1QUk9WRURfU1BMSUNFKQorI2lmICFkZWZpbmVkKENPTkZJR19DT01DRVJUT19TUExJQ0VfVVNFX01ETUEpCisjZGVmaW5lIE1TUERfU1BMSUNFX05VTV9ETUEJCTEwMAorI2Vsc2UKKyNkZWZpbmUgTVNQRF9TUExJQ0VfTlVNX0RNQQkJTURNQV9PVVRCT1VORF9CVUZfREVTQworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19TUExJQ0VfUFJPRikKK3Vuc2lnbmVkIGludCBlbmFibGVfc3BsaWNlX3Byb2YgPSAwOworI2VuZGlmCisKK2ludCBjb21jZXJ0b19zcGxpY2VfZnJvbV9waXBlX2ZlZWQoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IHNwbGljZV9kZXNjICpzZCkKK3sKKwlzdHJ1Y3QgcGFnZSAqKm1zcGRfc3BsaWNlX3BhZ2VzOworCXZvaWQgKiptc3BkX3NwbGljZV9mc2RhdGE7CisJc3RydWN0IHBpcGVfYnVmZmVyICpidWY7CisJY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wczsKKwlpbnQgcmV0LCByZXQyID0gMCwgcmVtYWluaW5nOworCXVuc2lnbmVkIGludCBjdXJidWYsIG5yYnVmcywgbGVuLCBucmJ1ZnNfbGVuLCBkb25lOworCWxvZmZfdCBwb3MsIG9mZnNldDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHNkLT51LmZpbGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKipwYWdlOworCXZvaWQgKipmc2RhdGE7CisJdW5zaWduZWQgaW50IHNpemU7CisjaWYgIWRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9VU0VfTURNQSkKKwl1bnNpZ25lZCBpbnQgYnVmX2xlbiwgYnVmX29mZnNldDsKKwljaGFyICpzcmMsICpkc3Q7CisjZWxzZQorCXN0cnVjdCBjb21jZXJ0b19kbWFfc2cgKnNnOworI2VuZGlmCisKKwlzaXplID0gKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSArIHNpemVvZih2b2lkICopKSAqIE1TUERfU1BMSUNFX05VTV9ETUE7CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19TUExJQ0VfVVNFX01ETUEpCisJc2l6ZSA9IEFMSUdOKHNpemUsIDgpICsgc2l6ZW9mKHN0cnVjdCBjb21jZXJ0b19kbWFfc2cpOworI2VuZGlmCisKKwltc3BkX3NwbGljZV9wYWdlcyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc3BkX3NwbGljZV9wYWdlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc3BkX3NwbGljZV9mc2RhdGEgPSAodm9pZCAqKikobXNwZF9zcGxpY2VfcGFnZXMgKyBNU1BEX1NQTElDRV9OVU1fRE1BKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9VU0VfTURNQSkKKwlzZyA9IChzdHJ1Y3QgY29tY2VydG9fZG1hX3NnICopKG1zcGRfc3BsaWNlX2ZzZGF0YSArIE1TUERfU1BMSUNFX05VTV9ETUEpOworCXNnID0gUFRSX0FMSUdOKHNnLCA4KTsKKyNlbmRpZgorCitzdGFydDoKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19TUExJQ0VfVVNFX01ETUEpCisJY29tY2VydG9fZG1hX3NnX2luaXQoc2cpOworI2VuZGlmCisKKwkvL0NvbXB1dGUgbGVuZ3RoIHRvIHRyYW5zZmVyIChpbiBieXRlcyksIGFuZCBtYWtlIHN1cmUgZGF0YSBpcyB0aGVyZQorCW5yYnVmc19sZW4gPSAwOworCW5yYnVmcyA9IHBpcGUtPm5yYnVmczsKKwljdXJidWYgPSBwaXBlLT5jdXJidWY7CisJd2hpbGUgKG5yYnVmcykgeworCQlidWYgPSBwaXBlLT5idWZzICsgY3VyYnVmOworCisJCXJldCA9IGJ1Zi0+b3BzLT5jb25maXJtKHBpcGUsIGJ1Zik7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogYnVmLT5vcHMtPmNvbmZpcm0oKSBmYWlsZWQoJWQpXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCWlmIChyZXQgPT0gLUVOT0RBVEEpCisJCQkJcmV0ID0gMDsKKwkJCWdvdG8gZXJyOworCQl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19TUExJQ0VfVVNFX01ETUEpCisJCS8vIElzIHRoZXJlIGEgcmlzayBvZiBnZXR0aW5nIHRoZSBzYW1lIHBhZ2UgbW9yZSB0aGFuIG9uY2UgKHNldmVyYWwgYnVmZmVycyBpbiBhIHNpbmdsZSBwYWdlKT8KKwkJcmV0ID0gY29tY2VydG9fZG1hX3NnX2FkZF9pbnB1dChzZywgcGFnZV9hZGRyZXNzKGJ1Zi0+cGFnZSkgKyBidWYtPm9mZnNldCwgYnVmLT5sZW4sIDApOworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG91dCBvZiBpbnB1dCBiZGVzY3NcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOyAvL1dlIHdpbGwgdHJhbnNmZXIgd2hhdCB3ZSBjb3VsZCB1cCB0byB0aGUgcHJldmlvdXMgYnVmZmVyLCBiYXNlZCBvbiBucmJ1ZnNfbGVuCisJCX0KKyNlbmRpZgorCisJCW5yYnVmc19sZW4gKz0gYnVmLT5sZW47CisKKwkJaWYgKG5yYnVmc19sZW4gPiBzZC0+dG90YWxfbGVuKSB7CisJCQlucmJ1ZnNfbGVuID0gc2QtPnRvdGFsX2xlbjsKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gLSAyIGJlY2F1c2UgZmlyc3QgYW5kIGxhc3QgcGFnZXMgY291bGQgYmUgYWxtb3N0IGVtcHR5IGRlcGVuZGluZyBvbiBhbGlnbm1lbnQKKwkJaWYgKG5yYnVmc19sZW4gPiAoTVNQRF9TUExJQ0VfTlVNX0RNQSAtIDIpKlBBR0VfQ0FDSEVfU0laRSkgeworCQkJbnJidWZzX2xlbiA9IChNU1BEX1NQTElDRV9OVU1fRE1BIC0gMikqUEFHRV9DQUNIRV9TSVpFOworCQkJYnJlYWs7CisJCX0KKwkJY3VyYnVmID0gKGN1cmJ1ZiArIDEpICYgKHBpcGUtPmJ1ZmZlcnMgLSAxKTsKKwkJbnJidWZzLS07CisJfQorCisJaWYgKHVubGlrZWx5KG5yYnVmc19sZW4gPT0gMCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5yYnVmc19sZW4gPT0gMFxuIiwgX19mdW5jX18pOworCQlyZXQgPSAwOworCQlnb3RvIGVycjsKKwl9CisKKy8vCXByaW50aygiQkxBIG5yYnVmc19sZW46ICVkXG4iLCBucmJ1ZnNfbGVuKTsKKworCS8qIEFsbG9jYXRlIGFzIG1hbnkgZGVzdGluYXRpb25zIHBhZ2VzIGFzIG5lZWRlZC4KKwkgKiBGaXJzdCBhbmQgbGFzdCBwYWdlcyBhcmUgbGlrZWx5IG5vdCB0byBiZSBmaWxsZWQsIGJ1dCB0aGUgb25lcyBpbi1iZXR3ZWVuIHdpbGwuCisJICogSWYgc29tZSBhbGxvY2F0aW9ucyBmYWlsLCBmaW5pc2ggdGhlIHdvcmsgb24gdGhlIGFsbG9jYXRlZCBwYWdlcy4KKwkgKi8KKwlwYWdlID0gJm1zcGRfc3BsaWNlX3BhZ2VzWzBdOworCWZzZGF0YSA9ICZtc3BkX3NwbGljZV9mc2RhdGFbMF07CisKKwlwb3MgPSBzZC0+cG9zOworCW9mZnNldCA9IHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJbGVuID0gbnJidWZzX2xlbjsKKworCWlmIChsaWtlbHkobGVuICsgb2Zmc2V0ID4gUEFHRV9DQUNIRV9TSVpFKSkKKwkJbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OworCisJcmV0ID0gcGFnZWNhY2hlX3dyaXRlX2JlZ2luKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLAorCQkJQU9QX0ZMQUdfVU5JTlRFUlJVUFRJQkxFLCBwYWdlLCBmc2RhdGEpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIGVycjsJCS8vIFdlIGZhaWxlZCBlYXJseSwgc28gd2Ugc3RpbGwgaGF2ZSBhbiBlYXN5IHdheSBvdXQKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9VU0VfTURNQSkKKwljb21jZXJ0b19kbWFfc2dfYWRkX291dHB1dChzZywgcGFnZV9hZGRyZXNzKCpwYWdlKSArIG9mZnNldCwgbGVuLCAxKTsgLy9Eb24ndCBjaGVjayByZXN1bHQgc2luY2Ugd2Ugc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5IGF0IHRoaXMgcG9pbnQKKyNlbmRpZgorCisJcG9zICs9IGxlbjsKKwlyZW1haW5pbmcgPSBucmJ1ZnNfbGVuIC0gbGVuOworCXBhZ2UrKzsKKwlmc2RhdGErKzsKKworCXdoaWxlIChyZW1haW5pbmcgPiBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJcmV0ID0gcGFnZWNhY2hlX3dyaXRlX2JlZ2luKGZpbGUsIG1hcHBpbmcsIHBvcywgUEFHRV9DQUNIRV9TSVpFLAorCQkJCUFPUF9GTEFHX1VOSU5URVJSVVBUSUJMRSwgcGFnZSwgZnNkYXRhKTsKKworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCWdvdG8gd3JpdGVfYmVnaW5fZG9uZTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9VU0VfTURNQSkKKwkJcmV0ID0gY29tY2VydG9fZG1hX3NnX2FkZF9vdXRwdXQoc2csIHBhZ2VfYWRkcmVzcygqcGFnZSksIFBBR0VfQ0FDSEVfU0laRSwgMSk7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQlwYWdlY2FjaGVfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgUEFHRV9DQUNIRV9TSVpFLCAwLCAqcGFnZSwgKmZzZGF0YSk7CisJCQlnb3RvIHdyaXRlX2JlZ2luX2RvbmU7CisJCX0KKyNlbmRpZgorCQlwb3MgKz0gUEFHRV9DQUNIRV9TSVpFOworCQlyZW1haW5pbmcgLT0gUEFHRV9DQUNIRV9TSVpFOworCQlwYWdlKys7CisJCWZzZGF0YSsrOworCX0KKworCWlmIChyZW1haW5pbmcpIHsKKwkJcmV0ID0gcGFnZWNhY2hlX3dyaXRlX2JlZ2luKGZpbGUsIG1hcHBpbmcsIHBvcywgcmVtYWluaW5nLAorCQkJCQkJQU9QX0ZMQUdfVU5JTlRFUlJVUFRJQkxFLCBwYWdlLCBmc2RhdGEpOworCisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJZ290byB3cml0ZV9iZWdpbl9kb25lOworCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fU1BMSUNFX1VTRV9NRE1BKQorCQlyZXQgPSBjb21jZXJ0b19kbWFfc2dfYWRkX291dHB1dChzZywgcGFnZV9hZGRyZXNzKCpwYWdlKSwgcmVtYWluaW5nLCAxKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCXBhZ2VjYWNoZV93cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCByZW1haW5pbmcsIDAsICpwYWdlLCAqZnNkYXRhKTsKKwkJCWdvdG8gd3JpdGVfYmVnaW5fZG9uZTsKKwkJfQorI2VuZGlmCisJCXJlbWFpbmluZyA9IDA7CisJfQorCit3cml0ZV9iZWdpbl9kb25lOgorCS8vIENvdWxkbid0IGFsbG9jYXRlIGFsbCBwYWdlcyBvciBiZGVzY3MsIHNvIHVwZGF0ZSB0aGUgdG90YWwgbGVuZ3RoIGFjY29yZGluZ2x5CisJaWYgKHVubGlrZWx5KHJlbWFpbmluZykpCisJCW5yYnVmc19sZW4gPSBucmJ1ZnNfbGVuIC0gcmVtYWluaW5nOworCisJLy9Ob3cgZG8gdGhlIGNvcGllcworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9VU0VfTURNQSkKKworCWNvbWNlcnRvX2RtYV9nZXQoKTsKKworCWNvbWNlcnRvX2RtYV9zZ19zZXR1cChzZywgbnJidWZzX2xlbik7CisKKwljb21jZXJ0b19kbWFfc3RhcnQoKTsKKwljb21jZXJ0b19kbWFfd2FpdCgpOworCWNvbWNlcnRvX2RtYV9wdXQoKTsKKworCWNvbWNlcnRvX2RtYV9zZ19jbGVhbnVwKHNnLCBucmJ1ZnNfbGVuKTsKKyNlbHNlCisJcmVtYWluaW5nID0gbnJidWZzX2xlbjsKKwljdXJidWYgPSBwaXBlLT5jdXJidWY7CisJYnVmID0gcGlwZS0+YnVmcyArIGN1cmJ1ZjsKKwlidWZfbGVuID0gYnVmLT5sZW47CisJYnVmX29mZnNldCA9IGJ1Zi0+b2Zmc2V0OworCXNyYyA9IGJ1Zi0+b3BzLT5tYXAocGlwZSwgYnVmLCAxKTsKKwlwb3MgPSBzZC0+cG9zOworCW9mZnNldCA9IHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJcGFnZSA9ICZtc3BkX3NwbGljZV9wYWdlc1swXTsKKwlkc3QgPSBrbWFwX2F0b21pYygqcGFnZSwgS01fVVNFUjEpOworCisJd2hpbGUgKHJlbWFpbmluZykgeworCQlsZW4gPSByZW1haW5pbmc7CisJCWlmIChsZW4gKyBvZmZzZXQgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCQlsZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CisJCWlmIChsZW4gPiBidWZfbGVuKQorCQkJbGVuID0gYnVmX2xlbjsKKworCQltZW1jcHkoZHN0ICsgb2Zmc2V0LCBzcmMgKyBidWZfb2Zmc2V0LCBsZW4pOworCisJCWJ1Zl9sZW4gLT0gbGVuOworCQlidWZfb2Zmc2V0ICs9IGxlbjsKKwkJcmVtYWluaW5nIC09IGxlbjsKKwkJcG9zICs9IGxlbjsKKwkJb2Zmc2V0ID0gcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKKworCQlpZiAoIW9mZnNldCkgeworCQkJLyogRklYTUUgaWYgdGhpcyB3YXMgdGhlIGxhc3QgcGFnZSB3ZSBzaG91bGQgc3RpbGwgZmx1c2gvdW5tYXAsIGV2ZW4gaWYgaXQncyBub3QgYSBmdWxsIHBhZ2UgKi8KKwkJCS8qIC4uLiBhY3R1YWxseSBpdCBsb29rcyBvaywgdGhlIHVubWFwIGlzIGRvbmUgb3V0c2lkZSB0aGUgbG9vcCAqLworCQkJZmx1c2hfZGNhY2hlX3BhZ2UoKnBhZ2UpOworCQkJa3VubWFwX2F0b21pYyhkc3QsIEtNX1VTRVIxKTsKKwkJCWlmIChyZW1haW5pbmcpIHsKKwkJCQlwYWdlKys7CisJCQkJZHN0ID0ga21hcF9hdG9taWMoKnBhZ2UsIEtNX1VTRVIxKTsKKwkJCX0KKwkJfQorCisJCWlmICghYnVmX2xlbikgeworCQkJYnVmLT5vcHMtPnVubWFwKHBpcGUsIGJ1Ziwgc3JjKTsKKwkJCWlmIChyZW1haW5pbmcpIHsKKwkJCQljdXJidWYgPSAoY3VyYnVmICsgMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpOworCQkJCWJ1ZiA9IHBpcGUtPmJ1ZnMgKyBjdXJidWY7CisJCQkJYnVmX2xlbiA9IGJ1Zi0+bGVuOworCQkJCWJ1Zl9vZmZzZXQgPSBidWYtPm9mZnNldDsKKwkJCQlzcmMgPSBidWYtPm9wcy0+bWFwKHBpcGUsIGJ1ZiwgMSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAob2Zmc2V0KSB7CisJCWZsdXNoX2RjYWNoZV9wYWdlKCpwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhkc3QsIEtNX1VTRVIxKTsKKwl9CisKKwlpZiAoYnVmX2xlbikKKwkJYnVmLT5vcHMtPnVubWFwKHBpcGUsIGJ1Ziwgc3JjKTsKKyNlbmRpZgorCisKKwkvL2xvb3Agb24gd3JpdGVfZW5kLCB1cGRhdGUgc2QgZmllbGRzCisJcGFnZSA9ICZtc3BkX3NwbGljZV9wYWdlc1swXTsKKwlmc2RhdGEgPSAmbXNwZF9zcGxpY2VfZnNkYXRhWzBdOworCW9mZnNldCA9IHNkLT5wb3MgJiB+UEFHRV9DQUNIRV9NQVNLOworCXBvcyA9IHNkLT5wb3M7CisJcmVtYWluaW5nID0gbnJidWZzX2xlbjsKKwlsZW4gPSBucmJ1ZnNfbGVuOworCWRvbmUgPSAwOworCisJaWYgKGxpa2VseShsZW4gKyBvZmZzZXQgPiBQQUdFX0NBQ0hFX1NJWkUpKQorCQlsZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CisKKwlyZXQgPSBwYWdlY2FjaGVfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBsZW4sCisJCQkqcGFnZSwgKmZzZGF0YSk7CisKKwkvKiBJbiBjYXNlIG9mIGVycm9yIG9yIHNob3J0IHdyaXRlIHdlIG5lZWQgdG8gcmVwb3J0IGVycm9yIHRvIHRoZSBjYWxsZXIgKi8KKwkvKiBJZiB0aGVyZSB3YXMgYWxyZWFkeSBhIHByZXZpb3VzIGVycm9yLCBqdXN0IGNvbnRpbnVlIGRvaW5nIHRoZSBwYWdlY2FjaGVfd3JpdGVfZW5kKCkgY2xlYW51cCAqLworCS8qIE90aGVyd2lzZSBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IGJ5dGVzIHdlIGhhdmUgc3VjY2VmdWxseSB3cml0dGVuIGFuZCB0aGF0IGFuIGVycm9yIGhhcHBlbmVkICovCisJaWYgKHVubGlrZWx5KHJldCAhPSBsZW4pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIG9uIHdyaXRlX2VuZCwgY29udGludWluZyB3aXRoIG90aGVyIGJ1ZmZlcnNcbiIpOworCisJCS8qIE9ubHkgcmVwb3J0IGVycm9yIHRvIGNhbGxlciBpZiBub3RoaW5nIGhhcyBiZWVuIGRvbmUgKi8KKwkJcmV0MiA9IHJldDsKKwkJbnJidWZzX2xlbiA9IChyZXQgPiAwKSA/IHJldDogMDsKKwl9CisKKwlwb3MgKz0gbGVuOworCWRvbmUgKz0gbGVuOworCXJlbWFpbmluZyAtPSBsZW47CisKKwlwYWdlKys7CisJZnNkYXRhKys7CisKKwl3aGlsZSAocmVtYWluaW5nID4gUEFHRV9DQUNIRV9TSVpFKSB7CisJCXJldCA9IHBhZ2VjYWNoZV93cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCBQQUdFX0NBQ0hFX1NJWkUsIFBBR0VfQ0FDSEVfU0laRSwKKwkJCQkqcGFnZSwgKmZzZGF0YSk7CisKKwkJaWYgKHVubGlrZWx5KChyZXQgIT0gUEFHRV9DQUNIRV9TSVpFKSAmJiAhcmV0MikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIG9uIHdyaXRlX2VuZCwgY29udGludWluZyB3aXRoIG90aGVyIGJ1ZmZlcnNcbiIpOworCisJCQlucmJ1ZnNfbGVuID0gZG9uZTsKKworCQkJaWYgKHJldCA+PSAwKQorCQkJCW5yYnVmc19sZW4gKz0gcmV0OworCisJCQlyZXQyID0gbnJidWZzX2xlbjsKKwkJfQorCisJCXBvcyArPSBQQUdFX0NBQ0hFX1NJWkU7CisJCWRvbmUgKz0gUEFHRV9DQUNIRV9TSVpFOworCQlyZW1haW5pbmcgLT0gUEFHRV9DQUNIRV9TSVpFOworCisJCXBhZ2UrKzsKKwkJZnNkYXRhKys7CisJfQorCisJaWYgKHJlbWFpbmluZykgeworCQlyZXQgPSBwYWdlY2FjaGVfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgcmVtYWluaW5nLCByZW1haW5pbmcsCisJCQkJCSpwYWdlLCAqZnNkYXRhKTsKKworCQlpZiAodW5saWtlbHkoKHJldCAhPSByZW1haW5pbmcpICYmICFyZXQyKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgb24gd3JpdGVfZW5kLCBjb250aW51aW5nIHdpdGggb3RoZXIgYnVmZmVyc1xuIik7CisKKwkJCW5yYnVmc19sZW4gPSBkb25lOworCisJCQlpZiAocmV0ID49IDApCisJCQkJbnJidWZzX2xlbiArPSByZXQ7CisKKwkJCXJldDIgPSBucmJ1ZnNfbGVuOworCQl9CisJfQorCisJc2QtPm51bV9zcGxpY2VkICs9IG5yYnVmc19sZW47CisJc2QtPmxlbiAtPSBucmJ1ZnNfbGVuOworCXNkLT5wb3MgKz0gbnJidWZzX2xlbjsKKwlzZC0+dG90YWxfbGVuIC09IG5yYnVmc19sZW47CisKKwkvL2xvb3Agb24gcGlwZSBidWZmZXJzIHRvIHJlbGVhc2UgdGhlbQorCXJlbWFpbmluZyA9IG5yYnVmc19sZW47CisJYnVmID0gcGlwZS0+YnVmcyArIHBpcGUtPmN1cmJ1ZjsKKworCXdoaWxlIChyZW1haW5pbmcgJiYgKHJlbWFpbmluZyA+PSBidWYtPmxlbikpIHsKKwkJb3BzID0gYnVmLT5vcHM7CisKKwkJcmVtYWluaW5nIC09IGJ1Zi0+bGVuOworCQlidWYtPmxlbiA9IDA7CisJCWJ1Zi0+b3BzID0gTlVMTDsKKwkJb3BzLT5yZWxlYXNlKHBpcGUsIGJ1Zik7CisJCXBpcGUtPm5yYnVmcy0tOworCQlwaXBlLT5jdXJidWYgPSAocGlwZS0+Y3VyYnVmICsgMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpOworCQlidWYgPSBwaXBlLT5idWZzICsgcGlwZS0+Y3VyYnVmOworCX0KKworCS8vIExhc3QgYnVmZmVyLCBtaWdodCBub3QgYmUgZW1wdHkKKwlpZiAocmVtYWluaW5nKSB7CisJCWJ1Zi0+bGVuIC09IHJlbWFpbmluZzsKKwkJYnVmLT5vZmZzZXQgKz0gcmVtYWluaW5nOworCX0KKworCWlmIChwaXBlLT5pbm9kZSkKKwkJc2QtPm5lZWRfd2FrZXVwID0gdHJ1ZTsKKworCWlmICghc2QtPnRvdGFsX2xlbikgeworCQlrZnJlZShtc3BkX3NwbGljZV9wYWdlcyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXQyKSB7CisJCWlmIChyZXQyID4gMCkKKwkJCXJldCA9IDA7CisJCWVsc2UKKwkJCXJldCA9IHJldDI7CisKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHBpcGUtPm5yYnVmcykKKwkJZ290byBzdGFydDsKKworCXJldCA9IDE7CisKK2VycjoKKwlrZnJlZShtc3BkX3NwbGljZV9wYWdlcyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChjb21jZXJ0b19zcGxpY2VfZnJvbV9waXBlX2ZlZWQpOworI2VuZGlmCisKIC8qKgogICogc3BsaWNlX2Zyb21fcGlwZV9uZXh0IC0gd2FpdCBmb3Igc29tZSBkYXRhIHRvIHNwbGljZSBmcm9tCiAgKiBAcGlwZToJcGlwZSB0byBzcGxpY2UgZnJvbQpAQCAtMTA0Miw2ICsxNDI1LDExMyBAQAogCiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUpOwogCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fU1BMSUNFX1BST0YpCit1bnNpZ25lZCBpbnQgc3BsaWNld190aW1lX2NvdW50ZXJbMjU2XTsKK3Vuc2lnbmVkIGludCBzcGxpY2V3X3JlcXRpbWVfY291bnRlclsyNTZdOwordW5zaWduZWQgaW50IHNwbGljZXdfZGF0YV9jb3VudGVyWzI1Nl07CitzdGF0aWMgc3RydWN0IHRpbWV2YWwgbGFzdF9zcGxpY2V3OwordW5zaWduZWQgaW50IGluaXRfc3BsaWNld19wcm9mID0gMDsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSU1QUk9WRURfU1BMSUNFKQorc3NpemVfdAorY29tY2VydG9fZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IGZpbGUgKm91dCwKKwkJCSAgbG9mZl90ICpwcG9zLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBvdXQtPmZfbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgc3BsaWNlX2Rlc2Mgc2QgPSB7CisJCS50b3RhbF9sZW4gPSBsZW4sCisJCS5mbGFncyA9IGZsYWdzLAorCQkucG9zID0gKnBwb3MsCisJCS51LmZpbGUgPSBvdXQsCisJfTsKKwlzc2l6ZV90IHJldDsKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19TUExJQ0VfUFJPRikKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJaW50IGRpZmZfdGltZV9tczsKKyNlbmRpZgorCisJcGlwZV9sb2NrKHBpcGUpOworCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fU1BMSUNFX1BST0YpCisJaWYgKGVuYWJsZV9zcGxpY2VfcHJvZikgeworCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJCWlmIChpbml0X3NwbGljZXdfcHJvZikgeworCQkJZGlmZl90aW1lX21zID0gKChub3cudHZfc2VjIC0gbGFzdF9zcGxpY2V3LnR2X3NlYykgKiAxMDAwKSArICgobm93LnR2X3VzZWMgLSBsYXN0X3NwbGljZXcudHZfdXNlYykgLyAxMDAwKTsKKwkJCWlmIChkaWZmX3RpbWVfbXMgPCAxMDAwKSB7CisJCQkJc3BsaWNld190aW1lX2NvdW50ZXJbZGlmZl90aW1lX21zID4+IDNdKys7CisJCQl9CisJCQllbHNlIHsKKwkJCQlzcGxpY2V3X3RpbWVfY291bnRlclsyNTVdKys7CisJCQl9CisJCX0KKwkJbGFzdF9zcGxpY2V3ID0gbm93OworCQlpZiAobGVuIDwgKDEgPDwyMSkpCisJCQlzcGxpY2V3X2RhdGFfY291bnRlclsobGVuID4+IDEzKSAmIDB4RkZdKys7CisJCWVsc2UKKwkJCXNwbGljZXdfZGF0YV9jb3VudGVyWzI1NV0rKzsKKwl9CisjZW5kaWYKKworCXNwbGljZV9mcm9tX3BpcGVfYmVnaW4oJnNkKTsKKwlkbyB7CisJCXJldCA9IHNwbGljZV9mcm9tX3BpcGVfbmV4dChwaXBlLCAmc2QpOworCQlpZiAocmV0IDw9IDApCisJCQlicmVhazsKKworCQltdXRleF9sb2NrX25lc3RlZCgmaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfQ0hJTEQpOworCQlyZXQgPSBmaWxlX3JlbW92ZV9zdWlkKG91dCk7CisJCWlmICghcmV0KSB7CisJCQlmaWxlX3VwZGF0ZV90aW1lKG91dCk7CisJCQlyZXQgPSBjb21jZXJ0b19zcGxpY2VfZnJvbV9waXBlX2ZlZWQocGlwZSwgJnNkKTsKKwkJfQorCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwl9IHdoaWxlIChyZXQgPiAwKTsKKwlzcGxpY2VfZnJvbV9waXBlX2VuZChwaXBlLCAmc2QpOworCisJcGlwZV91bmxvY2socGlwZSk7CisKKwlpZiAoc2QubnVtX3NwbGljZWQpCisJCXJldCA9IHNkLm51bV9zcGxpY2VkOworCisJaWYgKHJldCA+IDApIHsKKwkJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKKwkJaW50IGVycjsKKworCQlucl9wYWdlcyA9IChyZXQgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJCWVyciA9IGdlbmVyaWNfd3JpdGVfc3luYyhvdXQsICpwcG9zLCByZXQpOworCQlpZiAoZXJyKQorCQkJcmV0ID0gZXJyOworCQllbHNlCisJCQkqcHBvcyArPSByZXQ7CisJCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWRfbnIobWFwcGluZywgbnJfcGFnZXMpOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9QUk9GKQorCWlmIChlbmFibGVfc3BsaWNlX3Byb2YpIHsKKwkJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCQkKKwkJZGlmZl90aW1lX21zID0gKChub3cudHZfc2VjIC0gbGFzdF9zcGxpY2V3LnR2X3NlYykgKiAxMDAwKSArICgobm93LnR2X3VzZWMgLSBsYXN0X3NwbGljZXcudHZfdXNlYykgLyAxMDAwKTsKKwkJaWYgKGRpZmZfdGltZV9tcyA8IDEwMDApIHsvL0Rvbid0IHJlY29yZCB1c2VsZXNzIGRhdGEKKwkJCXNwbGljZXdfcmVxdGltZV9jb3VudGVyW2RpZmZfdGltZV9tcyA+PiAzXSsrOworCQl9CisJCWVsc2UKKwkJCXNwbGljZXdfcmVxdGltZV9jb3VudGVyWzI1NV0rKzsKKworCQlpZighaW5pdF9zcGxpY2V3X3Byb2YpCisJCQlpbml0X3NwbGljZXdfcHJvZiA9IDE7CisKKwkJbGFzdF9zcGxpY2V3ID0gbm93OworCX0KKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woY29tY2VydG9fZmlsZV9zcGxpY2Vfd3JpdGUpOworI2VuZGlmCisKIHN0YXRpYyBpbnQgd3JpdGVfcGlwZV9idWYoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IHBpcGVfYnVmZmVyICpidWYsCiAJCQkgIHN0cnVjdCBzcGxpY2VfZGVzYyAqc2QpCiB7CkBAIC0xNjkyLDMwICsyMTgyLDM5IEBACiAJCWludCwgZmRfb3V0LCBsb2ZmX3QgX191c2VyICosIG9mZl9vdXQsCiAJCXNpemVfdCwgbGVuLCB1bnNpZ25lZCBpbnQsIGZsYWdzKQogewotCWxvbmcgZXJyb3I7Ci0Jc3RydWN0IGZpbGUgKmluLCAqb3V0OworCWludCBlcnJvciA9IC1FQkFERjsKKwlzdHJ1Y3QgZmlsZSAqaW4sICpvdXQgPSBOVUxMOwogCWludCBmcHV0X2luLCBmcHV0X291dDsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gTlVMTDsKIAogCWlmICh1bmxpa2VseSghbGVuKSkKIAkJcmV0dXJuIDA7CiAKLQllcnJvciA9IC1FQkFERjsKLQlpbiA9IGZnZXRfbGlnaHQoZmRfaW4sICZmcHV0X2luKTsKLQlpZiAoaW4pIHsKLQkJaWYgKGluLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlvdXQgPSBmZ2V0X2xpZ2h0KGZkX291dCwgJmZwdXRfb3V0KTsKLQkJCWlmIChvdXQpIHsKLQkJCQlpZiAob3V0LT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCQkJZXJyb3IgPSBkb19zcGxpY2UoaW4sIG9mZl9pbiwKLQkJCQkJCQkgIG91dCwgb2ZmX291dCwKLQkJCQkJCQkgIGxlbiwgZmxhZ3MpOwotCQkJCWZwdXRfbGlnaHQob3V0LCBmcHV0X291dCk7Ci0JCQl9Ci0JCX0KKwlpZiAoIShvdXQgPSBmZ2V0X2xpZ2h0KGZkX291dCwgJmZwdXRfb3V0KSkpCisJCXJldHVybiAtRUJBREY7CiAKKwlpZiAoIShvdXQtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJZ290byBvdXQ7CisKKwkvKiBDaGVjayBpZiBmZF9pbiBpcyBhIHNvY2tldCB3aGlsZSBvdXRfZmQgaXMgTk9UIGEgcGlwZS4gKi8KKwlpZiAoIWdldF9waXBlX2luZm8ob3V0KSAmJgorCQkoc29jayA9IHNvY2tmZF9sb29rdXAoZmRfaW4sICZlcnJvcikpKSB7CisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSU1QUk9WRURfU1BMSUNFKQorCQlpZiAoc29jay0+c2sgJiYgb3V0LT5mX29wLT5zcGxpY2VfZnJvbV9zb2NrZXQpCisJCQllcnJvciA9IG91dC0+Zl9vcC0+c3BsaWNlX2Zyb21fc29ja2V0KG91dCwgc29jaywKKwkJCQkJCQkJb2ZmX291dCwgbGVuKTsKKyNlbmRpZgorCQlmcHV0KHNvY2stPmZpbGUpOworCX0gZWxzZQorCXsKKwkJaWYgKCEoaW4gPSBmZ2V0X2xpZ2h0KGZkX2luLCAmZnB1dF9pbikpKQorCQkJZ290byBvdXQ7CisJCWlmICgoaW4tPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJZXJyb3IgPSBkb19zcGxpY2UoaW4sIG9mZl9pbiwgb3V0LCBvZmZfb3V0LCBsZW4sIGZsYWdzKTsKIAkJZnB1dF9saWdodChpbiwgZnB1dF9pbik7CiAJfQotCitvdXQ6CisJZnB1dF9saWdodChvdXQsIGZwdXRfb3V0KTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE3MjUsNyArMjIyNCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgaXBpcGVfcHJlcChzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCS8qCiAJICogQ2hlY2sgLT5ucmJ1ZnMgd2l0aG91dCB0aGUgaW5vZGUgbG9jayBmaXJzdC4gVGhpcyBmdW5jdGlvbgpAQCAtMTczNCw3ICsyMjMzLDYgQEAKIAlpZiAocGlwZS0+bnJidWZzKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IDA7CiAJcGlwZV9sb2NrKHBpcGUpOwogCiAJd2hpbGUgKCFwaXBlLT5ucmJ1ZnMpIHsKQEAgLTE3NjMsNyArMjI2MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgb3BpcGVfcHJlcChzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAogCS8qCiAJICogQ2hlY2sgLT5ucmJ1ZnMgd2l0aG91dCB0aGUgaW5vZGUgbG9jayBmaXJzdC4gVGhpcyBmdW5jdGlvbgpAQCAtMTc3Miw3ICsyMjcwLDYgQEAKIAlpZiAocGlwZS0+bnJidWZzIDwgcGlwZS0+YnVmZmVycykKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSAwOwogCXBpcGVfbG9jayhwaXBlKTsKIAogCXdoaWxlIChwaXBlLT5ucmJ1ZnMgPj0gcGlwZS0+YnVmZmVycykgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oIGIvaW5jbHVkZS9saW51eC9iYWNraW5nLWRldi5oCmluZGV4IGIxMDM4YmQuLmExNjVhYjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmFja2luZy1kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JhY2tpbmctZGV2LmgKQEAgLTEwOCw2ICsxMDgsMTAgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kaXI7CiAJc3RydWN0IGRlbnRyeSAqZGVidWdfc3RhdHM7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCXVuc2lnbmVkIGludCBjcHUwX2JpbmQ7CisjZW5kaWYKIH07CiAKIGludCBiZGlfaW5pdChzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0b3BzLmggYi9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oCmluZGV4IGZjOGEzZmYuLmQ3NTZkOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaXRvcHMuaApAQCAtMjYsNiArMjYsMjMgQEAKIAkgICAgIChiaXQpIDwgKHNpemUpOyBcCiAJICAgICAoYml0KSA9IGZpbmRfbmV4dF9iaXQoKGFkZHIpLCAoc2l6ZSksIChiaXQpICsgMSkpCiAKKy8qIHNhbWUgYXMgZm9yX2VhY2hfc2V0X2JpdCgpIGJ1dCB1c2UgYml0IGFzIHZhbHVlIHRvIHN0YXJ0IHdpdGggKi8KKyNkZWZpbmUgZm9yX2VhY2hfc2V0X2JpdF9mcm9tKGJpdCwgYWRkciwgc2l6ZSkgXAorCWZvciAoKGJpdCkgPSBmaW5kX25leHRfYml0KChhZGRyKSwgKHNpemUpLCAoYml0KSk7ICAgICAgXAorCQkoYml0KSA8IChzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCShiaXQpID0gZmluZF9uZXh0X2JpdCgoYWRkciksIChzaXplKSwgKGJpdCkgKyAxKSkKKworI2RlZmluZSBmb3JfZWFjaF9jbGVhcl9iaXQoYml0LCBhZGRyLCBzaXplKSBcCisJZm9yICgoYml0KSA9IGZpbmRfZmlyc3RfemVyb19iaXQoKGFkZHIpLCAoc2l6ZSkpOyAgICAgICBcCisJCShiaXQpIDwgKHNpemUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJKGJpdCkgPSBmaW5kX25leHRfemVyb19iaXQoKGFkZHIpLCAoc2l6ZSksIChiaXQpICsgMSkpCisKKy8qIHNhbWUgYXMgZm9yX2VhY2hfY2xlYXJfYml0KCkgYnV0IHVzZSBiaXQgYXMgdmFsdWUgdG8gc3RhcnQgd2l0aCAqLworI2RlZmluZSBmb3JfZWFjaF9jbGVhcl9iaXRfZnJvbShiaXQsIGFkZHIsIHNpemUpIFwKKwlmb3IgKChiaXQpID0gZmluZF9uZXh0X3plcm9fYml0KChhZGRyKSwgKHNpemUpLCAoYml0KSk7IFwKKwkJKGJpdCkgPCAoc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoYml0KSA9IGZpbmRfbmV4dF96ZXJvX2JpdCgoYWRkciksIChzaXplKSwgKGJpdCkgKyAxKSkKKwkJCiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgZ2V0X2JpdG1hc2tfb3JkZXIodW5zaWduZWQgaW50IGNvdW50KQogewogCWludCBvcmRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYzJrLWRldmZyZXEuaCBiL2luY2x1ZGUvbGludXgvYzJrLWRldmZyZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFlOTVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jMmstZGV2ZnJlcS5oCkBAIC0wLDAgKzEsMTM3IEBACisjaWZuZGVmIF9DMktfREVWRlJFUV9ICisjZGVmaW5lIF9DMktfREVWRlJFUV9ICisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb3BwLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnJlcS5oPgorCisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorCisjZGVmaW5lIEMyS19ERVZGUkVRX0RFQlVHCisjaWZkZWYgQzJLX0RFVkZSRVFfREVCVUcKKyAgICAgICAgI2RlZmluZSBjMmtfZGV2ZnJlcV9kZWJ1ZyhmbXQsIGFyZy4uLikgICBwcmludGsoZm10LCAjI2FyZykKKyNlbHNlCisgICAgICAgICNkZWZpbmUgYzJrX2RldmZyZXFfZGVidWcoZm10LCBhcmcuLi4pICAgICA7CisjZW5kaWYKKworI2RlZmluZSBDMktfREVWRlJFUV9VU0VfS1RJTUUKK3R5cGVkZWYgc3RydWN0IGRldmZyZXFfcGVyZl9jb3VudGVycyB7CisjaWZkZWYgQzJLX0RFVkZSRVFfVVNFX0tUSU1FCisJa3RpbWVfdCBmZW50cnlfdGltZTsgLyoga3RpbWUgYXQgdGhlIGVucnR5IG9mIGEgZnVuYyAqLworCWt0aW1lX3Qgc3RhcnRfdGltZTsgLyogc3RhcnRpbmcga3RpbWUgZm9yIGV2ZXJ5IGJ1c3kvdG90YWwgXAorCQkJICAgICBsb2FkIGNhbCBpbiB0aGUgbGFzdCB4IHNlY29uZHMqLworCWt0aW1lX3QgcHJldl9jb3VudDsgLyogcHJldiBrdGltZSBjb3VudCAqLworCXM2NCBidXN5X3RpbWU7IC8qIHRvdGFsIGV4ZWN1dGlvbiBrdGltZSBjb3VudCBpbiB0aGUgbGFzdCBcCisJCQkgICAgICB4IHNlY29uZHMgKi8KKyNlbHNlCisJdW5zaWduZWQgbG9uZyBmZW50cnlfdGltZTsgLyogamlmZmllcyBhdCB0aGUgZW5ydHkgb2YgYSBmdW5jICovCisJdW5zaWduZWQgbG9uZyBzdGFydF90aW1lOyAvKiBzdGFydGluZyBqaWZmaWVzIGZvciBldmVyeSBidXN5L3RvdGFsIFwKKwkJCQkJICAgICBsb2FkIGNhbCBpbiB0aGUgbGFzdCB4IHNlY29uZHMqLworCXVuc2lnbmVkIGxvbmcgcHJldl9jb3VudDsgLyogbGFzdCBqaWZmaWVzIGNvdW50ICovCisJdW5zaWduZWQgbG9uZyBidXN5X3RpbWU7IC8qIHRvdGFsIGV4ZWN1dGlvbiBqaWZmaWVzIGNvdW50IGluIHRoZSBsYXN0IFwKKwkJCQkgICAgICB4IHNlY29uZHMgKi8KKyNlbmRpZgorfWRldmZyZXFfY291bnRlcnM7CisKK3N0cnVjdCBjMmtfZGV2ZnJlcV9vcHBfdGFibGUgeworCXVuc2lnbmVkIGludCBpZHg7CisJdW5zaWduZWQgbG9uZyBmcmVxOyAvKiBNSHogKi8KKwl1bnNpZ25lZCBsb25nIHZvbHQ7IC8qIHVWb2x0ICovCit9OworCitzdHJ1Y3QgYzJrX2RldmZyZXFfZGF0YXsKKwlkZXZmcmVxX2NvdW50ZXJzICpkcGM7IAorCXN0cnVjdCBkZXZpY2UgKmRldjsgLyogcHJvdmlkZWQgYnkgZHJpdmVyICovCisJc3RydWN0IHJlZ3VsYXRvciAqdmRkX2ludDsgLyogaWYgbm90IHByb3ZpZGVkIGJ5IGRyaXZlciwgdXNlIGRlZmF1bHQgKi8KKwlzdHJ1Y3Qgb3BwICpjdXJyX29wcDsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnBtX25vdGlmaWVyOyAvKiBpZiBub3QgcHJvdmlkZWQgYnkgZHJpdmVyLCB1c2UgZGVmYXVsdCAqLworCXN0cnVjdCBjMmtfZGV2ZnJlcV9vcHBfdGFibGUgKm9wcF90YWJsZTsgLyogcHJvdmlkZWQgYnkgZHJpdmVyICovCisJc3RydWN0IGRldmZyZXFfZGV2X3Byb2ZpbGUgKmRldmZyZXFfcHJvZmlsZTsgLyogcHJvdmlkZWQgYnkgZHJpdmVyICovCisJY29uc3Qgc3RydWN0IGRldmZyZXFfZ292ZXJub3IgKmdvdjsgLyogcHJvdmlkZWQgYnkgZHJpdmVyICovCisJc3RydWN0IGNsayAqY2xrOworCWludCAoKnNldF9mcmVxKShzdHJ1Y3QgYzJrX2RldmZyZXFfZGF0YSAqZGF0YSwgdW5zaWduZWQgbG9uZyAqZnJlcSk7CisKKwlpbnQgZGlzYWJsZWQ7CisJdW5zaWduZWQgbG9uZyBtYXhfZnJlcTsKKwl1bnNpZ25lZCBsb25nIG1pbl9mcmVxOworCXN0cnVjdCBtdXRleCBsb2NrOworfTsKKworI2lmZGVmIEMyS19ERVZGUkVRX1VTRV9LVElNRQorLyogdXNpbmcga3RpbWUgKi8KKwkjZGVmaW5lIGRldmZyZXFfZnVuY19zdGFydChkYykgZG8ge1wKKwkJKGRjKS0+ZmVudHJ5X3RpbWUgPSBrdGltZV9nZXQoKTtcCisJfXdoaWxlKDApCisKKwkjZGVmaW5lIGRldmZyZXFfZnVuY19lbmQoZGMpIGRvIHtcCisJCShkYyktPnByZXZfY291bnQgPSBrdGltZV9nZXQoKTtcCisJCShkYyktPmJ1c3lfdGltZSArPSBrdGltZV90b19ucyhrdGltZV9zdWIoKGRjKS0+cHJldl9jb3VudCwgXAorCQkJCQkoZGMpLT5mZW50cnlfdGltZSkpO1wKKwl9d2hpbGUoMCkKKworCSNkZWZpbmUgbW9kdWxlX2J1c3lfdGltZShkYykJKChkYyktPmJ1c3lfdGltZSkKKworCSNkZWZpbmUgbW9kdWxlX2J1c3lfcGx1c19ub3RfYnVzeV90aW1lKGRjKSBcCisJCWt0aW1lX3RvX25zKGt0aW1lX3N1YihrdGltZV9nZXQoKSwgKGRjKS0+c3RhcnRfdGltZSkpCisKKwkjZGVmaW5lIGRldmZyZXFfcmVzZXRfY291bnRlcnMoZGMpIGRvIHsgXAorCQkoZGMpLT5zdGFydF90aW1lID0ga3RpbWVfZ2V0KCk7XAorCX13aGlsZSgwKQorI2Vsc2UKKwkjZGVmaW5lIGRldmZyZXFfZnVuY19zdGFydChkYykgXAorCQkoZGMpLT5mZW50cnlfdGltZSA9IGppZmZpZXMKKworCSNkZWZpbmUgZGV2ZnJlcV9mdW5fZW5kKGRjKSBkbyB7IFwKKwkJKGRjKS0+cHJldl9jb3VudCA9IChqaWZmaWVzKS0oKGRjKS0+ZmVudHJ5X3RpbWUpO1wKKwkJKGRjKS0+YnVzeV90aW1lICs9IChkYyktPnByZXZfY291bnQ7XAorCX13aGlsZSgwKQorCisJI2RlZmluZSBtb2R1bGVfYnVzeV90aW1lKGRjKSBcCisJCWppZmZpZXNfdG9fdXNlY3MoKGRjKS0+YnVzeV90aW1lKQorCisJI2RlZmluZSBtb2R1bGVfYnVzeV9wbHVzX25vdF9idXN5X3RpbWUoZGMpIFwKKwkJamlmZmllc190b191c2VjcygoKGppZmZpZXMpIC0gKGRjKS0+c3RhcnRfdGltZSkpCisKKwkjZGVmaW5lIGRldmZyZXFfcmVzZXRfY291bnRlcnMoZGMpIGRvIHsgXAorCQkoZGMpLT5mZW50cnlfdGltZSA9IDBVTDsgXAorCQkoZGMpLT5wcmV2X2NvdW50ID0gMFVMOyBcCisJCShkYyktPmJ1c3lfdGltZSA9IDBVTDsgXAorCQkoZGMpLT5zdGFydF90aW1lID0gamlmZmllcztcCisJfXdoaWxlKDApCisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyBpbnQgZGV2ZnJlcV9jb3VudGVyc19pbml0KHN0cnVjdCBjMmtfZGV2ZnJlcV9kYXRhICpkYXRhKQoreworCWRldmZyZXFfY291bnRlcnMgKipkYyA9ICZkYXRhLT5kcGM7CisKKwkqZGMgPSBremFsbG9jKHNpemVvZiAoZGV2ZnJlcV9jb3VudGVycyksIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoZGMgPT0gTlVMTCkgeworCSAgICAgICAgcHJpbnRrICgiJXM6IENhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmZyZXFfY291bnRlcnMuXG4iXAorCQkJLCBfX2Z1bmNfXyk7CisJICAgICAgICByZXR1cm4gLUVOT01FTTsKKwl9CisKKyNpZmRlZiBDMktfREVWRlJFUV9VU0VfS1RJTUUKKwkoKmRjKS0+c3RhcnRfdGltZSA9IGt0aW1lX2dldCgpOworI2Vsc2UKKwkoKmRjKS0+ZmVudHJ5X3RpbWUgPSAwVUw7CisJKCpkYyktPnByZXZfY291bnQgPSAwVUw7CisJKCpkYyktPmJ1c3lfdGltZSA9IDBVTDsKKwkoKmRjKS0+c3RhcnRfdGltZSA9IGppZmZpZXM7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitleHRlcm4gaW50IGMya19kcml2ZXJfZGV2ZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjMmtfZGV2ZnJlcV9kYXRhICpkYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyeXB0b2Rldi5oIGIvaW5jbHVkZS9saW51eC9jcnlwdG9kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTg1MDgyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9jcnlwdG9kZXYuaApAQCAtMCwwICsxLDU2MSBAQAorLyoJJEZyZWVCU0Q6IHNyYy9zeXMvb3BlbmNyeXB0by9jcnlwdG9kZXYuaCx2IDEuMjUgMjAwNy8wNS8wOSAxOTozNzowMiBnbm4gRXhwICQJKi8KKy8qCSRPcGVuQlNEOiBjcnlwdG9kZXYuaCx2IDEuMzEgMjAwMi8wNi8xMSAxMToxNDoyOSBiZWNrIEV4cCAkCSovCisKKy8qLQorICogTGludXggcG9ydCBkb25lIGJ5IERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkX21jY3VsbG91Z2hAbWNhZmVlLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIERhdmlkIE1jQ3VsbG91Z2gKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IEludGVsIENvcnBvcmF0aW9uLgorICogVGhlIGxpY2Vuc2UgYW5kIG9yaWdpbmFsIGF1dGhvciBhcmUgbGlzdGVkIGJlbG93LgorICoKKyAqIFRoZSBhdXRob3Igb2YgdGhpcyBjb2RlIGlzIEFuZ2Vsb3MgRC4gS2Vyb215dGlzIChhbmdlbG9zQGNpcy51cGVubi5lZHUpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBTYW0gTGVmZmxlciwgRXJybm8gQ29uc3VsdGluZworICoKKyAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiBieSBBbmdlbG9zIEQuIEtlcm9teXRpcyBpbiBBdGhlbnMsIEdyZWVjZSwgaW4KKyAqIEZlYnJ1YXJ5IDIwMDAuIE5ldHdvcmsgU2VjdXJpdHkgVGVjaG5vbG9naWVzIEluYy4gKE5TVEkpIGtpbmRseQorICogc3VwcG9ydGVkIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwIEFuZ2Vsb3MgRC4gS2Vyb215dGlzCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIGFuZCBtb2RpZnkgdGhpcyBzb2Z0d2FyZSB3aXRoIG9yIHdpdGhvdXQgZmVlCisgKiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIGVudGlyZSBub3RpY2UgaXMgaW5jbHVkZWQgaW4KKyAqIGFsbCBzb3VyY2UgY29kZSBjb3BpZXMgb2YgYW55IHNvZnR3YXJlIHdoaWNoIGlzIG9yIGluY2x1ZGVzIGEgY29weSBvcgorICogbW9kaWZpY2F0aW9uIG9mIHRoaXMgc29mdHdhcmUuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBCRUlORyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRZLiBJTiBQQVJUSUNVTEFSLCBOT05FIE9GIFRIRSBBVVRIT1JTIE1BS0VTIEFOWQorICogUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVFkgT0YgQU5ZIEtJTkQgQ09OQ0VSTklORyBUSEUKKyAqIE1FUkNIQU5UQUJJTElUWSBPRiBUSElTIFNPRlRXQVJFIE9SIElUUyBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUgorICogUFVSUE9TRS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlbyBkZSBSYWFkdAorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogRWZmb3J0IHNwb25zb3JlZCBpbiBwYXJ0IGJ5IHRoZSBEZWZlbnNlIEFkdmFuY2VkIFJlc2VhcmNoIFByb2plY3RzCisgKiBBZ2VuY3kgKERBUlBBKSBhbmQgQWlyIEZvcmNlIFJlc2VhcmNoIExhYm9yYXRvcnksIEFpciBGb3JjZQorICogTWF0ZXJpZWwgQ29tbWFuZCwgVVNBRiwgdW5kZXIgYWdyZWVtZW50IG51bWJlciBGMzA2MDItMDEtMi0wNTM3LgorICoKKyAqLworCisjaWZuZGVmIF9DUllQVE9fQ1JZUFRPX0hfCisjZGVmaW5lIF9DUllQVE9fQ1JZUFRPX0hfCisKKyNpZiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8ICFkZWZpbmVkKF9fR0xJQkNfXykgfHwgKF9fR0xJQkNfXyA8IDIpCisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNlbmRpZgorCisKKy8qIFNvbWUgaW5pdGlhbCB2YWx1ZXMgKi8KKyNkZWZpbmUgQ1JZUFRPX0RSSVZFUlNfSU5JVElBTAk0CisjZGVmaW5lIENSWVBUT19TV19TRVNTSU9OUwkzMgorCisvKiBIYXNoIHZhbHVlcyAqLworI2RlZmluZSBOVUxMX0hBU0hfTEVOCQkwCisjZGVmaW5lIE1ENV9IQVNIX0xFTgkJMTYKKyNkZWZpbmUgU0hBMV9IQVNIX0xFTgkJMjAKKyNkZWZpbmUgUklQRU1EMTYwX0hBU0hfTEVOCTIwCisjZGVmaW5lIFNIQTJfMjU2X0hBU0hfTEVOCTMyCisjZGVmaW5lIFNIQTJfMzg0X0hBU0hfTEVOCTQ4CisjZGVmaW5lIFNIQTJfNTEyX0hBU0hfTEVOCTY0CisjZGVmaW5lIE1ENV9LUERLX0hBU0hfTEVOCTE2CisjZGVmaW5lIFNIQTFfS1BES19IQVNIX0xFTgkyMAorLyogTWF4aW11bSBoYXNoIGFsZ29yaXRobSByZXN1bHQgbGVuZ3RoICovCisjZGVmaW5lIEhBU0hfTUFYX0xFTgkJU0hBMl81MTJfSEFTSF9MRU4gLyogS2VlcCB0aGlzIHVwZGF0ZWQgKi8KKworLyogSE1BQyB2YWx1ZXMgKi8KKyNkZWZpbmUgTlVMTF9ITUFDX0JMT0NLX0xFTgkJCTEKKyNkZWZpbmUgTUQ1X0hNQUNfQkxPQ0tfTEVOCQkJNjQKKyNkZWZpbmUgU0hBMV9ITUFDX0JMT0NLX0xFTgkJCTY0CisjZGVmaW5lIFJJUEVNRDE2MF9ITUFDX0JMT0NLX0xFTgk2NAorI2RlZmluZSBTSEEyXzI1Nl9ITUFDX0JMT0NLX0xFTgkJNjQKKyNkZWZpbmUgU0hBMl8zODRfSE1BQ19CTE9DS19MRU4JCTEyOAorI2RlZmluZSBTSEEyXzUxMl9ITUFDX0JMT0NLX0xFTgkJMTI4CisvKiBNYXhpbXVtIEhNQUMgYmxvY2sgbGVuZ3RoICovCisjZGVmaW5lIEhNQUNfTUFYX0JMT0NLX0xFTgkJU0hBMl81MTJfSE1BQ19CTE9DS19MRU4gLyogS2VlcCB0aGlzIHVwZGF0ZWQgKi8KKyNkZWZpbmUgSE1BQ19JUEFEX1ZBTAkJCTB4MzYKKyNkZWZpbmUgSE1BQ19PUEFEX1ZBTAkJCTB4NUMKKworLyogRW5jcnlwdGlvbiBhbGdvcml0aG0gYmxvY2sgc2l6ZXMgKi8KKyNkZWZpbmUgTlVMTF9CTE9DS19MRU4JCQkxCisjZGVmaW5lIERFU19CTE9DS19MRU4JCQk4CisjZGVmaW5lIERFUzNfQkxPQ0tfTEVOCQkJOAorI2RlZmluZSBCTE9XRklTSF9CTE9DS19MRU4JCTgKKyNkZWZpbmUgU0tJUEpBQ0tfQkxPQ0tfTEVOCQk4CisjZGVmaW5lIENBU1QxMjhfQkxPQ0tfTEVOCQk4CisjZGVmaW5lIFJJSk5EQUVMMTI4X0JMT0NLX0xFTgkxNgorI2RlZmluZSBBRVNfQkxPQ0tfTEVOCQkJUklKTkRBRUwxMjhfQkxPQ0tfTEVOCisjZGVmaW5lIENBTUVMTElBX0JMT0NLX0xFTgkJMTYKKyNkZWZpbmUgQVJDNF9CTE9DS19MRU4JCQkxCisjZGVmaW5lIEVBTEdfTUFYX0JMT0NLX0xFTgkJQUVTX0JMT0NLX0xFTiAvKiBLZWVwIHRoaXMgdXBkYXRlZCAqLworCisvKiBFbmNyeXB0aW9uIGFsZ29yaXRobSBtaW4gYW5kIG1heCBrZXkgc2l6ZXMgKi8KKyNkZWZpbmUgTlVMTF9NSU5fS0VZX0xFTgkJMAorI2RlZmluZSBOVUxMX01BWF9LRVlfTEVOCQkwCisjZGVmaW5lIERFU19NSU5fS0VZX0xFTgkJCTgKKyNkZWZpbmUgREVTX01BWF9LRVlfTEVOCQkJOAorI2RlZmluZSBERVMzX01JTl9LRVlfTEVOCQkyNAorI2RlZmluZSBERVMzX01BWF9LRVlfTEVOCQkyNAorI2RlZmluZSBCTE9XRklTSF9NSU5fS0VZX0xFTgk0CisjZGVmaW5lIEJMT1dGSVNIX01BWF9LRVlfTEVOCTU2CisjZGVmaW5lIFNLSVBKQUNLX01JTl9LRVlfTEVOCTEwCisjZGVmaW5lIFNLSVBKQUNLX01BWF9LRVlfTEVOCTEwCisjZGVmaW5lIENBU1QxMjhfTUlOX0tFWV9MRU4JCTUKKyNkZWZpbmUgQ0FTVDEyOF9NQVhfS0VZX0xFTgkJMTYKKyNkZWZpbmUgUklKTkRBRUwxMjhfTUlOX0tFWV9MRU4JMTYKKyNkZWZpbmUgUklKTkRBRUwxMjhfTUFYX0tFWV9MRU4JMzIKKyNkZWZpbmUgQUVTX01JTl9LRVlfTEVOCQkJUklKTkRBRUwxMjhfTUlOX0tFWV9MRU4KKyNkZWZpbmUgQUVTX01BWF9LRVlfTEVOCQkJUklKTkRBRUwxMjhfTUFYX0tFWV9MRU4KKyNkZWZpbmUgQ0FNRUxMSUFfTUlOX0tFWV9MRU4JMTYKKyNkZWZpbmUgQ0FNRUxMSUFfTUFYX0tFWV9MRU4JMzIKKyNkZWZpbmUgQVJDNF9NSU5fS0VZX0xFTgkJMQorI2RlZmluZSBBUkM0X01BWF9LRVlfTEVOCQkyNTYKKworLyogTWF4IHNpemUgb2YgZGF0YSB0aGF0IGNhbiBiZSBwcm9jZXNzZWQgKi8KKyNkZWZpbmUgQ1JZUFRPX01BWF9EQVRBX0xFTgkJNjQqMTAyNCAtIDEKKworI2RlZmluZSBDUllQVE9fQUxHT1JJVEhNX01JTgkxCisjZGVmaW5lIENSWVBUT19ERVNfQ0JDCQkJMQorI2RlZmluZSBDUllQVE9fM0RFU19DQkMJCQkyCisjZGVmaW5lIENSWVBUT19CTEZfQ0JDCQkJMworI2RlZmluZSBDUllQVE9fQ0FTVF9DQkMJCQk0CisjZGVmaW5lIENSWVBUT19TS0lQSkFDS19DQkMJCTUKKyNkZWZpbmUgQ1JZUFRPX01ENV9ITUFDCQkJNgorI2RlZmluZSBDUllQVE9fU0hBMV9ITUFDCQk3CisjZGVmaW5lIENSWVBUT19SSVBFTUQxNjBfSE1BQwk4CisjZGVmaW5lIENSWVBUT19NRDVfS1BESwkJCTkKKyNkZWZpbmUgQ1JZUFRPX1NIQTFfS1BESwkJMTAKKyNkZWZpbmUgQ1JZUFRPX1JJSk5EQUVMMTI4X0NCQwkxMSAvKiAxMjggYml0IGJsb2Nrc2l6ZSAqLworI2RlZmluZSBDUllQVE9fQUVTX0NCQwkJCTExIC8qIDEyOCBiaXQgYmxvY2tzaXplIC0tIHRoZSBzYW1lIGFzIGFib3ZlICovCisjZGVmaW5lIENSWVBUT19BUkM0CQkJCTEyCisjZGVmaW5lIENSWVBUT19NRDUJCQkJMTMKKyNkZWZpbmUgQ1JZUFRPX1NIQTEJCQkJMTQKKyNkZWZpbmUgQ1JZUFRPX05VTExfSE1BQwkJMTUKKyNkZWZpbmUgQ1JZUFRPX05VTExfQ0JDCQkJMTYKKyNkZWZpbmUgQ1JZUFRPX0RFRkxBVEVfQ09NUAkJMTcgLyogRGVmbGF0ZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gKi8KKyNkZWZpbmUgQ1JZUFRPX1NIQTJfMjU2X0hNQUMJMTgKKyNkZWZpbmUgQ1JZUFRPX1NIQTJfMzg0X0hNQUMJMTkKKyNkZWZpbmUgQ1JZUFRPX1NIQTJfNTEyX0hNQUMJMjAKKyNkZWZpbmUgQ1JZUFRPX0NBTUVMTElBX0NCQwkJMjEKKyNkZWZpbmUgQ1JZUFRPX1NIQTJfMjU2CQkJMjIKKyNkZWZpbmUgQ1JZUFRPX1NIQTJfMzg0CQkJMjMKKyNkZWZpbmUgQ1JZUFRPX1NIQTJfNTEyCQkJMjQKKyNkZWZpbmUgQ1JZUFRPX1JJUEVNRDE2MAkJMjUKKyNkZWZpbmUJQ1JZUFRPX0xaU19DT01QCQkJMjYKKyNkZWZpbmUgQ1JZUFRPX0VTUF9SRkMyNDA2IAkJMjcKKy8vI2RlZmluZSBDUllQVE9fRVNQX1JGQzI0MDZfVFJBTlNQT1JUIDIwCisjZGVmaW5lIENSWVBUT19FU1BfUkZDNDMwMyAgCQkyOAorI2RlZmluZSBDUllQVE9fRVNQNF9SRkM0MzAzICAJCTI4CisjZGVmaW5lIENSWVBUT19FU1A2X1JGQzQzMDMgIAkJMjkKKyNkZWZpbmUgQ1JZUFRPX0FICQkJMzAKKyNkZWZpbmUgQ1JZUFRPX0FINAkJCTMwCisjZGVmaW5lIENSWVBUT19BSDYJCQkzMQorI2RlZmluZSBDUllQVE9fU0hBMl9ITUFDCQkzMiAvKlRPRE8gaXMgaXQgYSBkdXBsaWNhdGUgZW50cnkqLworI2RlZmluZSBDUllQVE9fQUxHT1JJVEhNX01BWAkJMzIgLyogS2VlcCB1cGRhdGVkIC0gc2VlIGJlbG93ICovCisKKy8qIEFsZ29yaXRobSBmbGFncyAqLworI2RlZmluZSBDUllQVE9fQUxHX0ZMQUdfU1VQUE9SVEVECTB4MDEgLyogQWxnb3JpdGhtIGlzIHN1cHBvcnRlZCAqLworI2RlZmluZSBDUllQVE9fQUxHX0ZMQUdfUk5HX0VOQUJMRQkweDAyIC8qIEhhcyBIVyBSTkcgZm9yIERIL0RTQSAqLworI2RlZmluZSBDUllQVE9fQUxHX0ZMQUdfRFNBX1NIQQkJMHgwNCAvKiBDYW4gZG8gU0hBIG9uIG1zZyAqLworCisvKgorICogQ3J5cHRvIGRyaXZlci9kZXZpY2UgZmxhZ3MuICBUaGV5IGNhbiBzZXQgaW4gdGhlIGNyaWQKKyAqIHBhcmFtZXRlciB3aGVuIGNyZWF0aW5nIGEgc2Vzc2lvbiBvciBzdWJtaXR0aW5nIGEga2V5CisgKiBvcCB0byBhZmZlY3QgdGhlIGRldmljZS9kcml2ZXIgYXNzaWduZWQuICBJZiBuZWl0aGVyCisgKiBvZiB0aGVzZSBhcmUgc3BlY2lmaWVkIHRoZW4gdGhlIGNyaWQgaXMgYXNzdW1lZCB0byBob2xkCisgKiB0aGUgZHJpdmVyIGlkIG9mIGFuIGV4aXN0aW5nIChhbmQgc3VpdGFibGUpIGRldmljZSB0aGF0CisgKiBtdXN0IGJlIHVzZWQgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdC4KKyAqLworI2RlZmluZSBDUllQVE9fRkxBR19IQVJEV0FSRQkweDAxMDAwMDAwCS8qIGhhcmR3YXJlIGFjY2VsZXJhdGVkICovCisjZGVmaW5lIENSWVBUT19GTEFHX1NPRlRXQVJFCTB4MDIwMDAwMDAJLyogc29mdHdhcmUgaW1wbGVtZW50YXRpb24gKi8KKworLyogTkI6IGRlcHJlY2F0ZWQgKi8KK3N0cnVjdCBzZXNzaW9uX29wIHsKKwl1X2ludDMyX3QJY2lwaGVyOwkJLyogaWUuIENSWVBUT19ERVNfQ0JDICovCisJdV9pbnQzMl90CW1hYzsJCS8qIGllLiBDUllQVE9fTUQ1X0hNQUMgKi8KKworCXVfaW50MzJfdAlrZXlsZW47CQkvKiBjaXBoZXIga2V5ICovCisJY2FkZHJfdAkJa2V5OworCWludAkJbWFja2V5bGVuOwkvKiBtYWMga2V5ICovCisJY2FkZHJfdAkJbWFja2V5OworCisgIAl1X2ludDMyX3QJc2VzOwkJLyogcmV0dXJuczogc2Vzc2lvbiAjICovIAorfTsKKworc3RydWN0IHNlc3Npb24yX29wIHsKKwl1X2ludDMyX3QJY2lwaGVyOwkJLyogaWUuIENSWVBUT19ERVNfQ0JDICovCisJdV9pbnQzMl90CW1hYzsJCS8qIGllLiBDUllQVE9fTUQ1X0hNQUMgKi8KKworCXVfaW50MzJfdAlrZXlsZW47CQkvKiBjaXBoZXIga2V5ICovCisJY2FkZHJfdAkJa2V5OworCWludAkJbWFja2V5bGVuOwkvKiBtYWMga2V5ICovCisJY2FkZHJfdAkJbWFja2V5OworCisgIAl1X2ludDMyX3QJc2VzOwkJLyogcmV0dXJuczogc2Vzc2lvbiAjICovIAorCWludAkJY3JpZDsJCS8qIGRyaXZlciBpZCArIGZsYWdzIChydykgKi8KKwlpbnQJCXBhZFs0XTsJCS8qIGZvciBmdXR1cmUgZXhwYW5zaW9uICovCit9OworCitzdHJ1Y3QgY3J5cHRfb3AgeworCXVfaW50MzJfdAlzZXM7CisJdV9pbnQxNl90CW9wOwkJLyogaS5lLiBDT1BfRU5DUllQVCAqLworI2RlZmluZSBDT1BfTk9ORQkwCisjZGVmaW5lIENPUF9FTkNSWVBUCTEKKyNkZWZpbmUgQ09QX0RFQ1JZUFQJMgorCXVfaW50MTZfdAlmbGFnczsKKyNkZWZpbmUJQ09QX0ZfQkFUQ0gJMHgwMDA4CQkvKiBCYXRjaCBvcCBpZiBwb3NzaWJsZSAqLworCXVfaW50CQlsZW47CisJY2FkZHJfdAkJc3JjLCBkc3Q7CS8qIGJlY29tZSBpb3ZbXSBpbnNpZGUga2VybmVsICovCisJY2FkZHJfdAkJbWFjOwkJLyogbXVzdCBiZSBiaWcgZW5vdWdoIGZvciBjaG9zZW4gTUFDICovCisJY2FkZHJfdAkJaXY7Cit9OworCisvKgorICogUGFyYW1ldGVycyBmb3IgbG9va2luZyB1cCBhIGNyeXB0byBkcml2ZXIvZGV2aWNlIGJ5CisgKiBkZXZpY2UgbmFtZSBvciBieSBpZC4gIFRoZSBsYXR0ZXIgYXJlIHJldHVybmVkIGZvcgorICogY3JlYXRlZCBzZXNzaW9ucyAoY3JpZCkgYW5kIGNvbXBsZXRlZCBrZXkgb3BlcmF0aW9ucy4KKyAqLworc3RydWN0IGNyeXB0X2ZpbmRfb3AgeworCWludAkJY3JpZDsJCS8qIGRyaXZlciBpZCArIGZsYWdzICovCisJY2hhcgkJbmFtZVszMl07CS8qIGRldmljZS9kcml2ZXIgbmFtZSAqLworfTsKKworLyogYmlnbnVtIHBhcmFtZXRlciwgaW4gcGFja2VkIGJ5dGVzLCAuLi4gKi8KK3N0cnVjdCBjcnBhcmFtIHsKKwljYWRkcl90CQljcnBfcDsKKwl1X2ludAkJY3JwX25iaXRzOworfTsKKworI2RlZmluZSBDUktfTUFYUEFSQU0JOAorCitzdHJ1Y3QgY3J5cHRfa29wIHsKKwl1X2ludAkJY3JrX29wOwkJLyogaWUuIENSS19NT0RfRVhQIG9yIG90aGVyICovCisJdV9pbnQJCWNya19zdGF0dXM7CS8qIHJldHVybiBzdGF0dXMgKi8KKwl1X3Nob3J0CQljcmtfaXBhcmFtczsJLyogIyBvZiBpbnB1dCBwYXJhbWV0ZXJzICovCisJdV9zaG9ydAkJY3JrX29wYXJhbXM7CS8qICMgb2Ygb3V0cHV0IHBhcmFtZXRlcnMgKi8KKwl1X2ludAkJY3JrX2NyaWQ7CS8qIE5COiBvbmx5IHVzZWQgYnkgQ0lPQ0tFWTIgKHJ3KSAqLworCXN0cnVjdCBjcnBhcmFtCWNya19wYXJhbVtDUktfTUFYUEFSQU1dOworfTsKKyNkZWZpbmUgQ1JLX0FMR09SSVRNX01JTgkwCisjZGVmaW5lIENSS19NT0RfRVhQCQkwCisjZGVmaW5lIENSS19NT0RfRVhQX0NSVAkJMQorI2RlZmluZSBDUktfRFNBX1NJR04JCTIKKyNkZWZpbmUgQ1JLX0RTQV9WRVJJRlkJCTMKKyNkZWZpbmUgQ1JLX0RIX0NPTVBVVEVfS0VZCTQKKyNkZWZpbmUgQ1JLX0FMR09SSVRITV9NQVgJNCAvKiBLZWVwIHVwZGF0ZWQgLSBzZWUgYmVsb3cgKi8KKworI2RlZmluZSBDUkZfTU9EX0VYUAkJKDEgPDwgQ1JLX01PRF9FWFApCisjZGVmaW5lIENSRl9NT0RfRVhQX0NSVAkJKDEgPDwgQ1JLX01PRF9FWFBfQ1JUKQorI2RlZmluZSBDUkZfRFNBX1NJR04JCSgxIDw8IENSS19EU0FfU0lHTikKKyNkZWZpbmUgQ1JGX0RTQV9WRVJJRlkJCSgxIDw8IENSS19EU0FfVkVSSUZZKQorI2RlZmluZSBDUkZfREhfQ09NUFVURV9LRVkJKDEgPDwgQ1JLX0RIX0NPTVBVVEVfS0VZKQorCisvKgorICogZG9uZSBhZ2FpbnN0IG9wZW4gb2YgL2Rldi9jcnlwdG8sIHRvIGdldCBhIGNsb25lZCBkZXNjcmlwdG9yLgorICogUGxlYXNlIHVzZSBGX1NFVEZEIGFnYWluc3QgdGhlIGNsb25lZCBkZXNjcmlwdG9yLgorICovCisjZGVmaW5lIENSSU9HRVQJCV9JT1dSKCdjJywgMTAwLCB1X2ludDMyX3QpCisjZGVmaW5lIENSSU9BU1lNRkVBVAlDSU9DQVNZTUZFQVQKKyNkZWZpbmUgQ1JJT0ZJTkRERVYJQ0lPQ0ZJTkRERVYKKworLyogdGhlIGZvbGxvd2luZyBhcmUgZG9uZSBhZ2FpbnN0IHRoZSBjbG9uZWQgZGVzY3JpcHRvciAqLworI2RlZmluZSBDSU9DR1NFU1NJT04JX0lPV1IoJ2MnLCAxMDEsIHN0cnVjdCBzZXNzaW9uX29wKQorI2RlZmluZSBDSU9DRlNFU1NJT04JX0lPVygnYycsIDEwMiwgdV9pbnQzMl90KQorI2RlZmluZSBDSU9DQ1JZUFQJX0lPV1IoJ2MnLCAxMDMsIHN0cnVjdCBjcnlwdF9vcCkKKyNkZWZpbmUgQ0lPQ0tFWQkJX0lPV1IoJ2MnLCAxMDQsIHN0cnVjdCBjcnlwdF9rb3ApCisjZGVmaW5lIENJT0NBU1lNRkVBVAlfSU9SKCdjJywgMTA1LCB1X2ludDMyX3QpCisjZGVmaW5lIENJT0NHU0VTU0lPTjIJX0lPV1IoJ2MnLCAxMDYsIHN0cnVjdCBzZXNzaW9uMl9vcCkKKyNkZWZpbmUgQ0lPQ0tFWTIJX0lPV1IoJ2MnLCAxMDcsIHN0cnVjdCBjcnlwdF9rb3ApCisjZGVmaW5lIENJT0NGSU5EREVWCV9JT1dSKCdjJywgMTA4LCBzdHJ1Y3QgY3J5cHRfZmluZF9vcCkKKworc3RydWN0IGNyeXB0b3RzdGF0IHsKKwlzdHJ1Y3QgdGltZXNwZWMJYWNjOwkJLyogdG90YWwgYWNjdW11bGF0ZWQgdGltZSAqLworCXN0cnVjdCB0aW1lc3BlYwltaW47CQkvKiBtaW4gdGltZSAqLworCXN0cnVjdCB0aW1lc3BlYwltYXg7CQkvKiBtYXggdGltZSAqLworCXVfaW50MzJfdAljb3VudDsJCS8qIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgKi8KK307CisKK3N0cnVjdCBjcnlwdG9zdGF0cyB7CisJdV9pbnQzMl90CWNzX29wczsJCS8qIHN5bW1ldHJpYyBjcnlwdG8gb3BzIHN1Ym1pdHRlZCAqLworCXVfaW50MzJfdAljc19lcnJzOwkvKiBzeW1tZXRyaWMgY3J5cHRvIG9wcyB0aGF0IGZhaWxlZCAqLworCXVfaW50MzJfdAljc19rb3BzOwkvKiBhc3ltZXRyaWMva2V5IG9wcyBzdWJtaXR0ZWQgKi8KKwl1X2ludDMyX3QJY3Nfa2VycnM7CS8qIGFzeW1ldHJpYy9rZXkgb3BzIHRoYXQgZmFpbGVkICovCisJdV9pbnQzMl90CWNzX2ludHJzOwkvKiBjcnlwdG8gc3dpIHRocmVhZCBhY3RpdmF0aW9ucyAqLworCXVfaW50MzJfdAljc19yZXRzOwkvKiBjcnlwdG8gcmV0dXJuIHRocmVhZCBhY3RpdmF0aW9ucyAqLworCXVfaW50MzJfdAljc19ibG9ja3M7CS8qIHN5bW1ldHJpYyBvcCBkcml2ZXIgYmxvY2sgKi8KKwl1X2ludDMyX3QJY3Nfa2Jsb2NrczsJLyogc3ltbWV0cmljIG9wIGRyaXZlciBibG9jayAqLworCS8qCisJICogV2hlbiBDUllQVE9fVElNSU5HIGlzIGRlZmluZWQgYXQgY29tcGlsZSB0aW1lIGFuZCB0aGUKKwkgKiBzeXNjdGwgZGVidWcuY3J5cHRvIGlzIHNldCB0byAxLCB0aGUgY3J5cHRvIHN5c3RlbSB3aWxsCisJICogYWNjdW11bGF0ZSBzdGF0aXN0aWNzIGFib3V0IGhvdyBsb25nIGl0IHRha2VzIHRvIHByb2Nlc3MKKwkgKiBjcnlwdG8gcmVxdWVzdHMgYXQgdmFyaW91cyBwb2ludHMgZHVyaW5nIHByb2Nlc3NpbmcuCisJICovCisJc3RydWN0IGNyeXB0b3RzdGF0IGNzX2ludm9rZTsJLyogY3J5cHRvX2RpcHNhdGNoIC0+IGNyeXB0b19pbnZva2UgKi8KKwlzdHJ1Y3QgY3J5cHRvdHN0YXQgY3NfZG9uZTsJLyogY3J5cHRvX2ludm9rZSAtPiBjcnlwdG9fZG9uZSAqLworCXN0cnVjdCBjcnlwdG90c3RhdCBjc19jYjsJLyogY3J5cHRvX2RvbmUgLT4gY2FsbGJhY2sgKi8KKwlzdHJ1Y3QgY3J5cHRvdHN0YXQgY3NfZmluaXM7CS8qIGNhbGxiYWNrIC0+IGNhbGxiYWNrIHJldHVybiAqLworCisJdV9pbnQzMl90CWNzX2Ryb3BzOwkJLyogY3J5cHRvIG9wcyBkcm9wcGVkIGR1ZSB0byBjb25nZXN0aW9uICovCit9OworCisjaWZkZWYgX19LRVJORUxfXworCisvKiBTdGFuZGFyZCBpbml0aWFsaXphdGlvbiBzdHJ1Y3R1cmUgYmVnaW5uaW5nICovCitzdHJ1Y3QgY3J5cHRvaW5pIHsKKwlpbnQJCWNyaV9hbGc7CS8qIEFsZ29yaXRobSB0byB1c2UgKi8KKwlpbnQJCWNyaV9mbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlpbnQJCWNyaV9tbGVuOwkvKiBOdW1iZXIgb2YgYnl0ZXMgd2Ugd2FudCBmcm9tIHRoZQorCQkJCQkgICBlbnRpcmUgaGFzaC4gMCBtZWFucyBhbGwuICovCisJCQlpbnQJCQljcmlfa2xlbjsJLyogS2V5IGxlbmd0aCwgaW4gYml0cyAqLworCQkJY2FkZHJfdAkJY3JpX2tleTsJLyoga2V5IHRvIHVzZSAqLworCQkJdV9pbnQ4X3QJY3JpX2l2W0VBTEdfTUFYX0JMT0NLX0xFTl07CS8qIElWIHRvIHVzZSAqLworCQl9IGNyaV9hbGc7CisJCXN0cnVjdCB7CisJCQl1X2ludDMyX3QgYmFzZWFsZzsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiB0dW5fc291cmNlOworCQkJc3RydWN0IHNvY2thZGRyX2luIHR1bl9kZXN0aW5hdGlvbjsKKwkJCWludCB0dW5fZGZfbW9kZTsKKwkJCWludCB0dW5fZHNfbW9kZTsKKwkJIAlpbnQgdHVuX3R0bF92YWx1ZTsKKwkJIAlpbnQgdHVuX3JlcGxheV93aW5kb3dzaXplOworCQkgCWludCBzcGl2YWx1ZSA7CisJCSAJaW50IHJlcGxheWluaXQ7ICAvKiBzZXQgdG8gMCB0byBkaXNhYmxlIHJlcGxheSBvbiByZWNlaXZlICovCisJCSAJdV9pbnQ2NF90IHRpbWVfaGFyZF9saWZldGltZTsKKwkJIAl1X2ludDY0X3QgdGltZV9zb2Z0X2xpZmV0aW1lOworCQkgCXVfaW50NjRfdCBieXRlX2hhcmRfbGlmZXRpbWU7CisJCSAJdV9pbnQ2NF90IGJ5dGVfc29mdF9saWZldGltZTsKKwkJfSBjcmlfcGFjazsJCisJfSB1OworCXN0cnVjdCBjcnlwdG9pbmkgKmNyaV9uZXh0OworfTsKKyNkZWZpbmUgY3JpX21sZW4JCXUuY3JpX2FsZy5jcmlfbWxlbgorI2RlZmluZSBjcmlfa2xlbgkJdS5jcmlfYWxnLmNyaV9rbGVuCisjZGVmaW5lIGNyaV9rZXkJCQl1LmNyaV9hbGcuY3JpX2tleQorI2RlZmluZSBjcmlfaXYJCQl1LmNyaV9hbGcuY3JpX2l2CisjZGVmaW5lIGNyaXBfYmFzZWFsZwkJCXUuY3JpX3BhY2suYmFzZWFsZworI2RlZmluZSBjcmlwX3R1bl9zb3VyY2UgCQl1LmNyaV9wYWNrLnR1bl9zb3VyY2UKKyNkZWZpbmUgY3JpcF90dW5fZGVzdGluYXRpb24JdS5jcmlfcGFjay50dW5fZGVzdGluYXRpb24KKyNkZWZpbmUgY3JpcF90dW5fZGZfbW9kZQkJdS5jcmlfcGFjay50dW5fZGZfbW9kZQorI2RlZmluZSBjcmlwX3R1bl9kc19tb2RlCXUuY3JpX3BhY2sudHVuX2RzX21vZGUKKyNkZWZpbmUgY3JpcF90dW5fdHRsX3ZhbHVlCXUuY3JpX3BhY2sudHVuX3R0bF92YWx1ZQorI2RlZmluZSBjcmlwX3R1bl9yZXBsYXlfd2luZG93c2l6ZSB1LmNyaV9wYWNrLnR1bl9yZXBsYXlfd2luZG93c2l6ZQorI2RlZmluZSBjcmlwX3NwaXZhbHVlIAkJdS5jcmlfcGFjay5zcGl2YWx1ZQorI2RlZmluZSBjcmlwX3JlcGxheWluaXQJCXUuY3JpX3BhY2sucmVwbGF5aW5pdAorI2RlZmluZSBjcmlwX3RpbWVfaGFyZF9saWZldGltZSAJIHUuY3JpX3BhY2sudGltZV9oYXJkX2xpZmV0aW1lCisjZGVmaW5lIGNyaXBfdGltZV9zb2Z0X2xpZmV0aW1lIAkgdS5jcmlfcGFjay50aW1lX3NvZnRfbGlmZXRpbWUKKyNkZWZpbmUgY3JpcF9ieXRlX2hhcmRfbGlmZXRpbWUgCSB1LmNyaV9wYWNrLmJ5dGVfaGFyZF9saWZldGltZQorI2RlZmluZSBjcmlwX2J5dGVfc29mdF9saWZldGltZSAJIHUuY3JpX3BhY2suYnl0ZV9zb2Z0X2xpZmV0aW1lCisKKy8qIERlc2NyaWJlIGJvdW5kYXJpZXMgb2YgYSBzaW5nbGUgY3J5cHRvIG9wZXJhdGlvbiAqLworc3RydWN0IGNyeXB0b2Rlc2MgeworCWludAkJY3JkX3NraXA7CS8qIEhvdyBtYW55IGJ5dGVzIHRvIGlnbm9yZSBmcm9tIHN0YXJ0ICovCisJaW50CQljcmRfbGVuOwkvKiBIb3cgbWFueSBieXRlcyB0byBwcm9jZXNzICovCisJaW50CQljcmRfaW5qZWN0OwkvKiBXaGVyZSB0byBpbmplY3QgcmVzdWx0cywgaWYgYXBwbGljYWJsZSAqLworCWludAkJY3JkX2ZsYWdzOworCisjZGVmaW5lIENSRF9GX0VOQ1JZUFQJCTB4MDEJLyogU2V0IHdoZW4gZG9pbmcgZW5jcnlwdGlvbiAqLworI2RlZmluZSBDUkRfRl9JVl9QUkVTRU5UCTB4MDIJLyogV2hlbiBlbmNyeXB0aW5nLCBJViBpcyBhbHJlYWR5IGluCisJCQkJCSAgIHBsYWNlLCBzbyBkb24ndCBjb3B5LiAqLworI2RlZmluZSBDUkRfRl9JVl9FWFBMSUNJVAkweDA0CS8qIElWIGV4cGxpY2l0bHkgcHJvdmlkZWQgKi8KKyNkZWZpbmUgQ1JEX0ZfRFNBX1NIQV9ORUVERUQJMHgwOAkvKiBDb21wdXRlIFNIQS0xIG9mIGJ1ZmZlciBmb3IgRFNBICovCisjZGVmaW5lIENSRF9GX0tFWV9FWFBMSUNJVAkweDEwCS8qIEtleSBleHBsaWNpdGx5IHByb3ZpZGVkICovCisjZGVmaW5lIENSRF9GX0NPTVAJCTB4MGYgICAgLyogU2V0IHdoZW4gZG9pbmcgY29tcHJlc3Npb24gKi8KKworCXN0cnVjdCBjcnlwdG9pbmkJQ1JEX0lOSTsgLyogSW5pdGlhbGl6YXRpb24vY29udGV4dCBkYXRhICovCisjZGVmaW5lIGNyZF9pdgkJQ1JEX0lOSS5jcmlfaXYKKyNkZWZpbmUgY3JkX2tleQkJQ1JEX0lOSS5jcmlfa2V5CisjZGVmaW5lIGNyZF9hbGcJCUNSRF9JTkkuY3JpX2FsZworI2RlZmluZSBjcmRfa2xlbglDUkRfSU5JLmNyaV9rbGVuCisjZGVmaW5lIGNyZF9tbGVuCUNSRF9JTkkuY3JpX21sZW4KKworCXN0cnVjdCBjcnlwdG9kZXNjICpjcmRfbmV4dDsKK307CisKKy8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIGNvbXBsZXRlIG9wZXJhdGlvbiAqLworc3RydWN0IGNyeXB0b3AgeworCXN0cnVjdCBsaXN0X2hlYWQgY3JwX25leHQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgY3JwX3dhaXRxOworCisJdV9pbnQ2NF90CWNycF9zaWQ7CS8qIFNlc3Npb24gSUQgKi8KKwlpbnQJCWNycF9pbGVuOwkvKiBJbnB1dCBkYXRhIHRvdGFsIGxlbmd0aCAqLworCWludAkJY3JwX29sZW47CS8qIFJlc3VsdCB0b3RhbCBsZW5ndGggKi8KKworCWludAkJY3JwX2V0eXBlOwkvKgorCQkJCQkgKiBFcnJvciB0eXBlICh6ZXJvIG1lYW5zIG5vIGVycm9yKS4KKwkJCQkJICogQWxsIGVycm9yIGNvZGVzIGV4Y2VwdCBFQUdBSU4KKwkJCQkJICogaW5kaWNhdGUgcG9zc2libGUgZGF0YSBjb3JydXB0aW9uIChhcyBpbiwKKwkJCQkJICogdGhlIGRhdGEgaGF2ZSBiZWVuIHRvdWNoZWQpLiBPbiBhbGwKKwkJCQkJICogZXJyb3JzLCB0aGUgY3JwX3NpZCBtYXkgaGF2ZSBjaGFuZ2VkCisJCQkJCSAqIChyZXNldCB0byBhIG5ldyBvbmUpLCBzbyB0aGUgY2FsbGVyCisJCQkJCSAqIHNob3VsZCBhbHdheXMgY2hlY2sgYW5kIHVzZSB0aGUgbmV3CisJCQkJCSAqIHZhbHVlIG9uIGZ1dHVyZSByZXF1ZXN0cy4KKwkJCQkJICovCisJaW50CQljcnBfZmxhZ3M7CisKKyNkZWZpbmUgQ1JZUFRPX0ZfU0tCVUYJCTB4MDAwMQkvKiBJbnB1dC9vdXRwdXQgYXJlIHNrYnVmIGNoYWlucyAqLworI2RlZmluZSBDUllQVE9fRl9JT1YJCTB4MDAwMgkvKiBJbnB1dC9vdXRwdXQgYXJlIHVpbyAqLworI2RlZmluZSBDUllQVE9fRl9SRUwJCTB4MDAwNAkvKiBNdXN0IHJldHVybiBkYXRhIGluIHNhbWUgcGxhY2UgKi8KKyNkZWZpbmUgQ1JZUFRPX0ZfQkFUQ0gJCTB4MDAwOAkvKiBCYXRjaCBvcCBpZiBwb3NzaWJsZSAqLworI2RlZmluZSBDUllQVE9fRl9DQklNTQkJMHgwMDEwCS8qIERvIGNhbGxiYWNrIGltbWVkaWF0ZWx5ICovCisjZGVmaW5lIENSWVBUT19GX0RPTkUJCTB4MDAyMAkvKiBPcGVyYXRpb24gY29tcGxldGVkICovCisjZGVmaW5lIENSWVBUT19GX0NCSUZTWU5DCTB4MDA0MAkvKiBEbyBDQklNTSBpZiBvcCBpcyBzeW5jaHJvbm91cyAqLworCisJY2FkZHJfdAkJY3JwX2J1ZjsJLyogRGF0YSB0byBiZSBwcm9jZXNzZWQgKi8KKwljYWRkcl90CQljcnBfb3V0X2J1ZjsJLyogQ3J5cHRvIFJlc3VsdCBCdWZmZXIgKi8KKwljYWRkcl90CQljcnBfb3BhcXVlOwkvKiBPcGFxdWUgcG9pbnRlciwgcGFzc2VkIGFsb25nICovCisJc3RydWN0IGNyeXB0b2Rlc2MgKmNycF9kZXNjOwkvKiBMaW5rZWQgbGlzdCBvZiBwcm9jZXNzaW5nIGRlc2NyaXB0b3JzICovCisKKwlpbnQgKCpjcnBfY2FsbGJhY2spKHN0cnVjdCBjcnlwdG9wICopOyAvKiBDYWxsYmFjayBmdW5jdGlvbiAqLworfTsKK2VudW0gY3J5cHRvX3BhY2tldF9yZXR1cm5fY29kZSB7CisJCUNSWVBUT19PSz0wLAorCQlDUllQVE9fU09GVF9UVEwgPSAyLAorIAkJQ1JZUFRPX0hBUkRfVFRMLAorIAkJQ1JZUFRPX1NBX0lOQUNUSVZFLAorIAkJQ1JZUFRPX1JFUExBWSwKKyAJCUNSWVBUT19JQ1ZfRkFJTCwKKyAJCUNSWVBUT19TRVFfUk9MTCwKKyAJCUNSWVBUT19NRU1fRVJST1IsCisgCQlDUllQVE9fVkVSU19FUlJPUiwKKyAJCUNSWVBUT19QUk9UX0VSUk9SLAorIAkJQ1JZUFRPX1BZTERfRVJST1IsCisgCQlDUllQVE9fUEFEX0VSUk9SIAorfTsKKworZW51bSBjcnlwdG9fYWNjZWxfdHlwZSB7CisgICAgICAgICAgICAgICAgICBDUllQVE9fUEFDS0VUICA9MHgyLCAgICAvKiBPUiB0b2dldGhlciBkZXNpcmVkIGJpdHMgKi8KKyAgICAgICAgICAgICAgICAgIENSWVBUT19IQVJEV0FSRT0weDEsCisgICAgICAgICAgICAgICAgICBDUllQVE9fU09GVFdBUkU9MHgwCit9OworCitlbnVtIGNyeXB0b19mbGFncyB7CisgICAgICAgICAgICAgICAgICBDUllQVE9fRU5DUllQVD0weDEsIAkvLyBzYW1lIGZvciBlbmNhcCAoT0NGIGwyKQorICAgICAgICAgICAgICAgICAgQ1JZUFRPX0RFQ1JZUFQ9MHgyLAkJLy8gc2FtZSBmb3IgZGVjYXAgKE9DRiBsMikKKyAgICAgICAgICAgICAgICAgIENSWVBUT19NQUNfR0VOPTB4NCwKKyAgICAgICAgICAgICAgICAgIENSWVBUT19NQUNfQ0hFQ0s9MHgwOCwKKyAgICAgICAgICAgICAgICAgIENSWVBUT19DT01QUkVTU19TTUFMTEVSPTB4MTAsCisgICAgICAgICAgICAgICAgICBDUllQVE9fQ09NUFJFU1NfQklHR0VSPTB4MjAKK307CisKKyNkZWZpbmUgQ1JZUFRPX0JVRl9DT05USUcJMHgwCisjZGVmaW5lIENSWVBUT19CVUZfSU9WCQkweDEKKyNkZWZpbmUgQ1JZUFRPX0JVRl9TS0JVRgkJMHgyCisKKyNkZWZpbmUgQ1JZUFRPX09QX0RFQ1JZUFQJMHgwCisjZGVmaW5lIENSWVBUT19PUF9FTkNSWVBUCTB4MQorCisvKgorICogSGludHMgcGFzc2VkIHRvIHByb2Nlc3MgbWV0aG9kcy4KKyAqLworI2RlZmluZSBDUllQVE9fSElOVF9NT1JFCTB4MQkvKiBtb3JlIG9wcyBjb21pbmcgc2hvcnRseSAqLworCitzdHJ1Y3QgY3J5cHRrb3AgeworCXN0cnVjdCBsaXN0X2hlYWQga3JwX25leHQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qga3JwX3dhaXRxOworCisJaW50CQlrcnBfZmxhZ3M7CisjZGVmaW5lIENSWVBUT19LRl9ET05FCQkweDAwMDEJLyogT3BlcmF0aW9uIGNvbXBsZXRlZCAqLworI2RlZmluZSBDUllQVE9fS0ZfQ0JJTU0JCTB4MDAwMgkvKiBEbyBjYWxsYmFjayBpbW1lZGlhdGVseSAqLworCisJdV9pbnQJCWtycF9vcDsJCS8qIGllLiBDUktfTU9EX0VYUCBvciBvdGhlciAqLworCXVfaW50CQlrcnBfc3RhdHVzOwkvKiByZXR1cm4gc3RhdHVzICovCisJdV9zaG9ydAkJa3JwX2lwYXJhbXM7CS8qICMgb2YgaW5wdXQgcGFyYW1ldGVycyAqLworCXVfc2hvcnQJCWtycF9vcGFyYW1zOwkvKiAjIG9mIG91dHB1dCBwYXJhbWV0ZXJzICovCisJdV9pbnQJCWtycF9jcmlkOwkvKiBkZXNpcmVkIGRldmljZSwgZXRjLiAqLworCXVfaW50MzJfdAlrcnBfaGlkOworCXN0cnVjdCBjcnBhcmFtCWtycF9wYXJhbVtDUktfTUFYUEFSQU1dOwkvKiBrdm0gKi8KKwlpbnQJCSgqa3JwX2NhbGxiYWNrKShzdHJ1Y3QgY3J5cHRrb3AgKik7Cit9OworCisjaW5jbHVkZSA8bGludXgvb2NmLWNvbXBhdC5oPgorCisvKgorICogU2Vzc2lvbiBpZHMgYXJlIDY0IGJpdHMuICBUaGUgbG93ZXIgMzIgYml0cyBjb250YWluIGEgImxvY2FsIGlkIiB3aGljaAorICogaXMgYSBkcml2ZXItcHJpdmF0ZSBzZXNzaW9uIGlkZW50aWZpZXIuICBUaGUgdXBwZXIgMzIgYml0cyBjb250YWluIGEKKyAqICJoYXJkd2FyZSBpZCIgdXNlZCBieSB0aGUgY29yZSBjcnlwdG8gY29kZSB0byBpZGVudGlmeSB0aGUgZHJpdmVyIGFuZAorICogYSBjb3B5IG9mIHRoZSBkcml2ZXIncyBjYXBhYmlsaXRpZXMgdGhhdCBjYW4gYmUgdXNlZCBieSBjbGllbnQgY29kZSB0bworICogb3B0aW1pemUgb3BlcmF0aW9uLgorICovCisjZGVmaW5lIENSWVBUT19TRVNJRDJISUQoX3NpZCkJKCgoX3NpZCkgPj4gMzIpICYgMHgwMGZmZmZmZikKKyNkZWZpbmUgQ1JZUFRPX1NFU0lEMkNBUFMoX3NpZCkJKCgoX3NpZCkgPj4gMzIpICYgMHhmZjAwMDAwMCkKKyNkZWZpbmUgQ1JZUFRPX1NFU0lEMkxJRChfc2lkKQkoKCh1X2ludDMyX3QpIChfc2lkKSkgJiAweGZmZmZmZmZmKQorCitleHRlcm4JaW50IGNyeXB0b19uZXdzZXNzaW9uKHVfaW50NjRfdCAqc2lkLCBzdHJ1Y3QgY3J5cHRvaW5pICpjcmksIGludCBoYXJkKTsKK2V4dGVybglpbnQgY3J5cHRvX2ZyZWVzZXNzaW9uKHVfaW50NjRfdCBzaWQpOworI2RlZmluZSBDUllQVE9DQVBfRl9IQVJEV0FSRQlDUllQVE9fRkxBR19IQVJEV0FSRQorI2RlZmluZSBDUllQVE9DQVBfRl9TT0ZUV0FSRQlDUllQVE9fRkxBR19TT0ZUV0FSRQorI2RlZmluZSBDUllQVE9DQVBfRl9TWU5DCTB4MDQwMDAwMDAJLyogb3BlcmF0ZXMgc3luY2hyb25vdXNseSAqLworZXh0ZXJuCWludDMyX3QgY3J5cHRvX2dldF9kcml2ZXJpZChkZXZpY2VfdCBkZXYsIGludCBmbGFncyk7CitleHRlcm4JaW50IGNyeXB0b19maW5kX2RyaXZlcihjb25zdCBjaGFyICopOworZXh0ZXJuCWRldmljZV90IGNyeXB0b19maW5kX2RldmljZV9ieWhpZChpbnQgaGlkKTsKK2V4dGVybglpbnQgY3J5cHRvX2dldGNhcHMoaW50IGhpZCk7CitleHRlcm4JaW50IGNyeXB0b19yZWdpc3Rlcih1X2ludDMyX3QgZHJpdmVyaWQsIGludCBhbGcsIHVfaW50MTZfdCBtYXhvcGxlbiwKKwkgICAgdV9pbnQzMl90IGZsYWdzKTsKK2V4dGVybglpbnQgY3J5cHRvX2tyZWdpc3Rlcih1X2ludDMyX3QsIGludCwgdV9pbnQzMl90KTsKK2V4dGVybglpbnQgY3J5cHRvX3VucmVnaXN0ZXIodV9pbnQzMl90IGRyaXZlcmlkLCBpbnQgYWxnKTsKK2V4dGVybglpbnQgY3J5cHRvX3VucmVnaXN0ZXJfYWxsKHVfaW50MzJfdCBkcml2ZXJpZCk7CitleHRlcm4JaW50IGNyeXB0b19kaXNwYXRjaChzdHJ1Y3QgY3J5cHRvcCAqY3JwKTsKK2V4dGVybglpbnQgY3J5cHRvX2tkaXNwYXRjaChzdHJ1Y3QgY3J5cHRrb3AgKik7CisjZGVmaW5lIENSWVBUT19TWU1RCTB4MQorI2RlZmluZSBDUllQVE9fQVNZTVEJMHgyCitleHRlcm4JaW50IGNyeXB0b191bmJsb2NrKHVfaW50MzJfdCwgaW50KTsKK2V4dGVybgl2b2lkIGNyeXB0b19kb25lKHN0cnVjdCBjcnlwdG9wICpjcnApOworZXh0ZXJuCXZvaWQgY3J5cHRvX2tkb25lKHN0cnVjdCBjcnlwdGtvcCAqKTsKK2V4dGVybglpbnQgY3J5cHRvX2dldGZlYXQoaW50ICopOworCitleHRlcm4Jdm9pZCBjcnlwdG9fZnJlZXJlcShzdHJ1Y3QgY3J5cHRvcCAqY3JwKTsKK2V4dGVybglzdHJ1Y3QgY3J5cHRvcCAqY3J5cHRvX2dldHJlcShpbnQgbnVtKTsKKworZXh0ZXJuICBpbnQgY3J5cHRvX3VzZXJjcnlwdG87ICAgICAgLyogdXNlcmxhbmQgbWF5IGRvIGNyeXB0byByZXF1ZXN0cyAqLworZXh0ZXJuICBpbnQgY3J5cHRvX3VzZXJhc3ltY3J5cHRvOyAgLyogdXNlcmxhbmQgbWF5IGRvIGFzeW0gY3J5cHRvIHJlcXMgKi8KK2V4dGVybiAgaW50IGNyeXB0b19kZXZhbGxvd3NvZnQ7ICAgIC8qIG9ubHkgdXNlIGhhcmR3YXJlIGNyeXB0byAqLworCisvKgorICogcmFuZG9tIG51bWJlciBzdXBwb3J0LCAgY3J5cHRvX3VucmVnaXN0ZXJfYWxsIHdpbGwgdW5yZWdpc3RlcgorICovCitleHRlcm4gaW50IGNyeXB0b19ycmVnaXN0ZXIodV9pbnQzMl90IGRyaXZlcmlkLAorCQlpbnQgKCpyZWFkX3JhbmRvbSkodm9pZCAqYXJnLCB1X2ludDMyX3QgKmJ1ZiwgaW50IGxlbiksIHZvaWQgKmFyZyk7CitleHRlcm4gaW50IGNyeXB0b19ydW5yZWdpc3Rlcl9hbGwodV9pbnQzMl90IGRyaXZlcmlkKTsKKworLyoKKyAqIENyeXB0by1yZWxhdGVkIHV0aWxpdHkgcm91dGluZXMgdXNlZCBtYWlubHkgYnkgZHJpdmVycy4KKyAqCisgKiBYWFggdGhlc2UgZG9uJ3QgcmVhbGx5IGJlbG9uZyBoZXJlOyBidXQgZm9yIG5vdyB0aGV5J3JlCisgKiAgICAga2VwdCBhcGFydCBmcm9tIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCisgKi8KK3N0cnVjdCB1aW87CitleHRlcm4Jdm9pZCBjdWlvX2NvcHlkYXRhKHN0cnVjdCB1aW8qIHVpbywgaW50IG9mZiwgaW50IGxlbiwgY2FkZHJfdCBjcCk7CitleHRlcm4Jdm9pZCBjdWlvX2NvcHliYWNrKHN0cnVjdCB1aW8qIHVpbywgaW50IG9mZiwgaW50IGxlbiwgY2FkZHJfdCBjcCk7CitleHRlcm4Jc3RydWN0IGlvdmVjICpjdWlvX2dldHB0cihzdHJ1Y3QgdWlvICp1aW8sIGludCBsb2MsIGludCAqb2ZmKTsKKworZXh0ZXJuCXZvaWQgY3J5cHRvX2NvcHliYWNrKGludCBmbGFncywgY2FkZHJfdCBidWYsIGludCBvZmYsIGludCBzaXplLAorCSAgICBjYWRkcl90IGluKTsKK2V4dGVybgl2b2lkIGNyeXB0b19jb3B5ZGF0YShpbnQgZmxhZ3MsIGNhZGRyX3QgYnVmLCBpbnQgb2ZmLCBpbnQgc2l6ZSwKKwkgICAgY2FkZHJfdCBvdXQpOworZXh0ZXJuCWludCBjcnlwdG9fYXBwbHkoaW50IGZsYWdzLCBjYWRkcl90IGJ1ZiwgaW50IG9mZiwgaW50IGxlbiwKKwkgICAgaW50ICgqZikodm9pZCAqLCB2b2lkICosIHVfaW50KSwgdm9pZCAqYXJnKTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfQ1JZUFRPX0NSWVBUT19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IDI5YjYzNTMuLjI1NzNiMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTQxMCw2ICs0MTAsOSBAQAogc3RydWN0IHZtX2FyZWFfc3RydWN0Owogc3RydWN0IHZmc21vdW50Owogc3RydWN0IGNyZWQ7CisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSU1QUk9WRURfU1BMSUNFKQorc3RydWN0IHNvY2tldDsKKyNlbmRpZgogCiBleHRlcm4gdm9pZCBfX2luaXQgaW5vZGVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBpbm9kZV9pbml0X2Vhcmx5KHZvaWQpOwpAQCAtMTYxNSw2ICsxNjE4LDEwIEBACiAJaW50ICgqZmxvY2spIChzdHJ1Y3QgZmlsZSAqLCBpbnQsIHN0cnVjdCBmaWxlX2xvY2sgKik7CiAJc3NpemVfdCAoKnNwbGljZV93cml0ZSkoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogCXNzaXplX3QgKCpzcGxpY2VfcmVhZCkoc3RydWN0IGZpbGUgKiwgbG9mZl90ICosIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0lNUFJPVkVEX1NQTElDRSkKKwlzc2l6ZV90ICgqc3BsaWNlX2Zyb21fc29ja2V0KShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgICAgIGxvZmZfdCBfX3VzZXIgKnBwb3MsIHNpemVfdCBjb3VudCk7CisjZW5kaWYKIAlpbnQgKCpzZXRsZWFzZSkoc3RydWN0IGZpbGUgKiwgbG9uZywgc3RydWN0IGZpbGVfbG9jayAqKik7CiAJbG9uZyAoKmZhbGxvY2F0ZSkoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgb2Zmc2V0LAogCQkJICBsb2ZmX3QgbGVuKTsKQEAgLTI0MzQsNiArMjQ0MSwxMCBAQAogCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBzc2l6ZV90IGdlbmVyaWNfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLAogCQlzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0lNUFJPVkVEX1NQTElDRSkKK2V4dGVybiBzc2l6ZV90IGNvbWNlcnRvX2ZpbGVfc3BsaWNlX3dyaXRlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwKKwkJc3RydWN0IGZpbGUgKiwgbG9mZl90ICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKKyNlbmRpZgogZXh0ZXJuIHNzaXplX3QgZ2VuZXJpY19zcGxpY2Vfc2VuZHBhZ2Uoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKIAkJc3RydWN0IGZpbGUgKm91dCwgbG9mZl90ICosIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncyk7CiBleHRlcm4gbG9uZyBkb19zcGxpY2VfZGlyZWN0KHN0cnVjdCBmaWxlICppbiwgbG9mZl90ICpwcG9zLCBzdHJ1Y3QgZmlsZSAqb3V0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZnAuaCBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKaW5kZXggM2E3NmZhZi4uZTM3MWIwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZnAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dmcC5oCkBAIC0xNDEsNyArMTQxLDEyIEBACiAvKiBGbGFnIC0gaW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlciB3aWxsIGJlIHN1aXRhYmxlIGZvciBETUEuICBJZ25vcmVkIG9uIHNvbWUKICAgIHBsYXRmb3JtcywgdXNlZCBhcyBhcHByb3ByaWF0ZSBvbiBvdGhlcnMgKi8KIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1pPTkVfRE1BX05DTkIpCisjZGVmaW5lIEdGUF9ETUEJCV9fR0ZQX0RNQTMyCisjZGVmaW5lIEdGUF9ETUFfTkNOQglfX0dGUF9ETUEKKyNlbHNlCiAjZGVmaW5lIEdGUF9ETUEJCV9fR0ZQX0RNQQorI2VuZGlmCiAKIC8qIDRHQiBETUEgb24gc29tZSBwbGF0Zm9ybXMgKi8KICNkZWZpbmUgR0ZQX0RNQTMyCV9fR0ZQX0RNQTMyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmLmggYi9pbmNsdWRlL2xpbnV4L2lmLmgKaW5kZXggZGIyMGJkNC4uZDg0OThmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZi5oCisrKyBiL2luY2x1ZGUvbGludXgvaWYuaApAQCAtNTIsNiArNTIsOSBAQAogI2RlZmluZSBJRkZfRE9STUFOVAkweDIwMDAwCQkvKiBkcml2ZXIgc2lnbmFscyBkb3JtYW50CSovCiAKICNkZWZpbmUgSUZGX0VDSE8JMHg0MDAwMAkJLyogZWNobyBzZW50IHBhY2tldHMJCSovCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9DT01DRVJUTykKKyNkZWZpbmUgSUZGX1dJRklfT0ZMRCAJMHg4MDAwMAkJLyogT2ZmbG9hZCBpbnRlcmZhY2UJCSovCisjZW5kaWYKIAogI2RlZmluZSBJRkZfVk9MQVRJTEUJKElGRl9MT09QQkFDS3xJRkZfUE9JTlRPUE9JTlR8SUZGX0JST0FEQ0FTVHxJRkZfRUNIT3xcCiAJCUlGRl9NQVNURVJ8SUZGX1NMQVZFfElGRl9SVU5OSU5HfElGRl9MT1dFUl9VUHxJRkZfRE9STUFOVCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfYXJwLmggYi9pbmNsdWRlL2xpbnV4L2lmX2FycC5oCmluZGV4IDZkNzIyZjQuLjVlNzdhYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfYXJwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9hcnAuaApAQCAtOTIsNiArOTIsOCBAQAogI2RlZmluZSBBUlBIUkRfUEhPTkVUX1BJUEUgODIxCQkvKiBQaG9OZXQgcGlwZSBoZWFkZXIJCSovCiAjZGVmaW5lIEFSUEhSRF9DQUlGCTgyMgkJLyogQ0FJRiBtZWRpYSB0eXBlCQkqLwogCisjZGVmaW5lIEFSUEhSRF9JUFY2X0lQVjZfVFVOTkVMICAgQVJQSFJEX0VUSEVSIAorCiAjZGVmaW5lIEFSUEhSRF9WT0lECSAgMHhGRkZGCS8qIFZvaWQgdHlwZSwgbm90aGluZyBpcyBrbm93biAqLwogI2RlZmluZSBBUlBIUkRfTk9ORQkgIDB4RkZGRQkvKiB6ZXJvIGhlYWRlciBsZW5ndGggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaCBiL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKaW5kZXggZGQzZjIwMS4uN2E4YmIyNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oCkBAIC0xMDYsNiArMTA2LDIyIEBACiB0eXBlZGVmIGludCBicl9zaG91bGRfcm91dGVfaG9va190KHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGJyX3Nob3VsZF9yb3V0ZV9ob29rX3QgX19yY3UgKmJyX3Nob3VsZF9yb3V0ZV9ob29rOwogCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9DT01DRVJUTykKK3N0cnVjdCBicmV2ZW50X2ZkYl91cGRhdGV7CisJY2hhciAqIG1hY19hZGRyOworCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2OworfTsKKworZW51bSBicmV2ZW50X25vdGlmX3R5cGUgeworCUJSRVZFTlRfUE9SVF9ET1dOID0gMSwJLyogYXJnIGlzIHN0cnVjdCBuZXRfZGV2aWNlIHB0ciAqLworCUJSRVZFTlRfRkRCX1VQREFURQkvKiBhcmcgaXMgc3RydWN0IGJyZXZlbnRfZmRiX3VwZGF0ZSBwdHIgKi8KK307CisKK2ludCByZWdpc3Rlcl9icmV2ZW50X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworaW50IHVucmVnaXN0ZXJfYnJldmVudF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2ludCBjYWxsX2JyZXZlbnRfbm90aWZpZXJzKHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2KTsKKyNlbmRpZgorCiAjZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmggYi9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKaW5kZXggZTQ3MzAwMy4uZTg1ZGU3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaApAQCAtMzQsNiArMzQsNyBAQAogI2RlZmluZSBFVEhfREFUQV9MRU4JMTUwMAkJLyogTWF4LiBvY3RldHMgaW4gcGF5bG9hZAkgKi8KICNkZWZpbmUgRVRIX0ZSQU1FX0xFTgkxNTE0CQkvKiBNYXguIG9jdGV0cyBpbiBmcmFtZSBzYW5zIEZDUyAqLwogI2RlZmluZSBFVEhfRkNTX0xFTgk0CQkvKiBPY3RldHMgaW4gdGhlIEZDUwkJICovCisjZGVmaW5lIEVUSF9JUEhMRU4gICAgICAyICAgICAgICAgICAgICAgLyogRXRoZXJJUCBoZWFkZXIgbGVuZ3RoICAgICAgICAgKi8KIAogLyoKICAqCVRoZXNlIGFyZSB0aGUgZGVmaW5lZCBFdGhlcm5ldCBQcm90b2NvbCBJRCdzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9wcHAuaCBiL2luY2x1ZGUvbGludXgvaWZfcHBwLmgKaW5kZXggYzlhZDM4My4uMzhmMGQ3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9wcHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3BwcC5oCkBAIC0xNjEsNiArMTYxLDkgQEAKICNkZWZpbmUgUFBQSU9DQVRUQ0hBTglfSU9XKCd0JywgNTYsIGludCkJLyogYXR0YWNoIHRvIHBwcCBjaGFubmVsICovCiAjZGVmaW5lIFBQUElPQ0dDSEFOCV9JT1IoJ3QnLCA1NSwgaW50KQkvKiBnZXQgcHBwIGNoYW5uZWwgbnVtYmVyICovCiAjZGVmaW5lIFBQUElPQ0dMMlRQU1RBVFMgX0lPUigndCcsIDU0LCBzdHJ1Y3QgcHBwb2wydHBfaW9jX3N0YXRzKQorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0ZQKQorI2RlZmluZSBQUFBJT0NTRlBQSURMRQlfSU9XKCd0JywgNTMsIHN0cnVjdCBwcHBfaWRsZSkJLyogU2V0IHRoZSBGUFAgc3RhdHMgKi8KKyNlbmRpZgogCiAjZGVmaW5lIFNJT0NHUFBQU1RBVFMgICAoU0lPQ0RFVlBSSVZBVEUgKyAwKQogI2RlZmluZSBTSU9DR1BQUFZFUiAgICAgKFNJT0NERVZQUklWQVRFICsgMSkJLyogTkVWRVIgY2hhbmdlIHRoaXMhISAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaCBiL2luY2x1ZGUvbGludXgvaWZfdHVubmVsLmgKaW5kZXggMTZiOTJkMC4uOTQ1M2VjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl90dW5uZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3R1bm5lbC5oCkBAIC0yMSw2ICsyMSwxMCBAQAogI2RlZmluZSBTSU9DQURENlJEICAgICAgKFNJT0NERVZQUklWQVRFICsgOSkKICNkZWZpbmUgU0lPQ0RFTDZSRCAgICAgIChTSU9DREVWUFJJVkFURSArIDEwKQogI2RlZmluZSBTSU9DQ0hHNlJEICAgICAgKFNJT0NERVZQUklWQVRFICsgMTEpCisjZGVmaW5lIFNJT0NHRVQ0UkQgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyAxMikgIAorI2RlZmluZSBTSU9DQURENFJEICAgICAgKFNJT0NERVZQUklWQVRFICsgMTMpIAorI2RlZmluZSBTSU9DREVMNFJEICAgICAgKFNJT0NERVZQUklWQVRFICsgMTQpCisjZGVmaW5lIFNJT0NDSEc0UkQgICAgICAoU0lPQ0RFVlBSSVZBVEUgKyAxNSkKIAogI2RlZmluZSBHUkVfQ1NVTQlfX2NwdV90b19iZTE2KDB4ODAwMCkKICNkZWZpbmUgR1JFX1JPVVRJTkcJX19jcHVfdG9fYmUxNigweDQwMDApCkBAIC02Myw2ICs2NywyMCBAQAogCV9fdTE2CQkJcmVsYXlfcHJlZml4bGVuOwogfTsKIAorLyogaXA2IHRubCA0cmQgcGFybSAtc3RhcnQgICovIAorc3RydWN0IGlwNl90bmxfNHJkIHsKKyAgICAgICBfX2JlMzIgICAgICAgICAgICAgICAgICBwcmVmaXg7CisgICAgICAgc3RydWN0IGluNl9hZGRyICAgICAgICAgcmVsYXlfcHJlZml4OworICAgICAgIHN0cnVjdCBpbjZfYWRkciAgICAgICAgIHJlbGF5X3N1ZmZpeDsKKyAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBwcmVmaXhsZW47CisgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgcmVsYXlfcHJlZml4bGVuOworICAgICAgIF9fdTE2ICAgICAgICAgICAgICAgICAgIHJlbGF5X3N1ZmZpeGxlbjsKKyAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBwc2lkX29mZnNldGxlbjsKKyAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICBlYWJpdF9sZW47CisgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgZW50cnlfbnVtOworfTsKKy8qIGlwNiB0bmwgNHJkIHBhcm0gLWVuZCAgKi8gCisKIGVudW0gewogCUlGTEFfR1JFX1VOU1BFQywKIAlJRkxBX0dSRV9MSU5LLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbi5oIGIvaW5jbHVkZS9saW51eC9pbi5oCmluZGV4IDAxMTI5YzAuLjM0MjI3NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2luLmgKQEAgLTQxLDYgKzQxLDcgQEAKICAgSVBQUk9UT19FU1AgPSA1MCwgICAgICAgICAgICAvKiBFbmNhcHN1bGF0aW9uIFNlY3VyaXR5IFBheWxvYWQgcHJvdG9jb2wgKi8KICAgSVBQUk9UT19BSCA9IDUxLCAgICAgICAgICAgICAvKiBBdXRoZW50aWNhdGlvbiBIZWFkZXIgcHJvdG9jb2wgICAgICAgKi8KICAgSVBQUk9UT19CRUVUUEggPSA5NCwJICAgICAgIC8qIElQIG9wdGlvbiBwc2V1ZG8gaGVhZGVyIGZvciBCRUVUICovCisgIElQUFJPVE9fRVRIRVJJUCA9IDk3LCAgICAgICAgLyogSVAgb3B0aW9uIGZvciBFdGhlcklQIHR1bm5lbCAocmZjIDMzNzgpICovCiAgIElQUFJPVE9fUElNICAgID0gMTAzLAkJLyogUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0CSovCiAKICAgSVBQUk9UT19DT01QICAgPSAxMDgsICAgICAgICAgICAgICAgIC8qIENvbXByZXNzaW9uIEhlYWRlciBwcm90b2NvbCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcDZfdHVubmVsLmggYi9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaAppbmRleCBiZjIyYjAzLi41NTRlMjRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwNl90dW5uZWwuaApAQCAtMzEsNCArMzEsNTEgQEAKIAlzdHJ1Y3QgaW42X2FkZHIgcmFkZHI7CS8qIHJlbW90ZSB0dW5uZWwgZW5kLXBvaW50IGFkZHJlc3MgKi8KIH07CiAKKworc3RydWN0IGlwNl80cmRfbWFwX21zZyB7CisgICAgICAgX191MzIgcmVzZXQ7CisgICAgICAgX191MzIgaWZpbmRleDsKKyAgICAgICBfX2JlMzIgcHJlZml4OworICAgICAgIF9fdTE2IHByZWZpeGxlbjsKKyAgICAgICBzdHJ1Y3QgaW42X2FkZHIgcmVsYXlfcHJlZml4OworICAgICAgIHN0cnVjdCBpbjZfYWRkciByZWxheV9zdWZmaXg7CisgICAgICAgX191MTYgcmVsYXlfcHJlZml4bGVuOworICAgICAgIF9fdTE2IHJlbGF5X3N1ZmZpeGxlbjsKKyAgICAgICBfX3UxNiBwc2lkX29mZnNldGxlbjsKKyAgICAgICBfX3UxNiBlYWJpdF9sZW47CisgICAgICAgX191MTYgZW50cnlfbnVtOworfTsKKworc3RydWN0IGlwNl90bmxfNHJkX21hcF9ydWxlIHsKKyAgICAgICBfX2JlMzIgcHJlZml4OworICAgICAgIF9fdTE2IHByZWZpeGxlbjsKKyAgICAgICBzdHJ1Y3QgaW42X2FkZHIgcmVsYXlfcHJlZml4OworICAgICAgIHN0cnVjdCBpbjZfYWRkciByZWxheV9zdWZmaXg7CisgICAgICAgX191MTYgcmVsYXlfcHJlZml4bGVuOworICAgICAgIF9fdTE2IHJlbGF5X3N1ZmZpeGxlbjsKKyAgICAgICBfX3UxNiBwc2lkX29mZnNldGxlbjsKKyAgICAgICBfX3UxNiBlYWJpdF9sZW47CisgICAgICAgX191MTYgZW50cnlfbnVtOworICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgbXJfbGlzdDsKK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCitzdHJ1Y3QgaXA2X3RubF80cmRfcGFybSB7CisgICAgICAgX19iZTMyIHByZWZpeDsKKyAgICAgICBzdHJ1Y3QgaW42X2FkZHIgcmVsYXlfcHJlZml4OworICAgICAgIHN0cnVjdCBpbjZfYWRkciByZWxheV9zdWZmaXg7CisgICAgICAgX191MTYgcHJlZml4bGVuOworICAgICAgIF9fdTE2IHJlbGF5X3ByZWZpeGxlbjsKKyAgICAgICBfX3UxNiByZWxheV9zdWZmaXhsZW47CisgICAgICAgX19iZTMyIGxhZGRyNDsKKyAgICAgICBfX3UxNiBwb3J0X3NldF9pZDsKKyAgICAgICBfX3UxNiBwb3J0X3NldF9pZF9sZW47CisgICAgICAgX191MTYgcHNpZF9vZmZzZXRsZW47CisgICAgICAgX191MTYgZWFiaXRfbGVuOworCisgICAgICAgc3RydWN0IGxpc3RfaGVhZCBtYXBfbGlzdDsKKyAgICAgICByd2xvY2tfdCBtYXBfbG9jazsKK307CisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pc2NkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCmluZGV4IGM0MWQ3MjcuLjI0YjczYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIEFQT0xMT19NT1VTRV9NSU5PUgk3CiAjZGVmaW5lIFBDMTEwUEFEX01JTk9SCQk5CiAvKiNkZWZpbmUgQURCX01PVVNFX01JTk9SCTEwCUZJWE1FIE9CU09MRVRFICovCisjZGVmaW5lIENSWVBUT0RFVl9NSU5PUgkJNzAJLyogL2Rldi9jcnlwdG8gKi8KICNkZWZpbmUgV0FUQ0hET0dfTUlOT1IJCTEzMAkvKiBXYXRjaGRvZyB0aW1lciAgICAgKi8KICNkZWZpbmUgVEVNUF9NSU5PUgkJMTMxCS8qIFRlbXBlcmF0dXJlIFNlbnNvciAqLwogI2RlZmluZSBSVENfTUlOT1IJCTEzNQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKaW5kZXggYWU0NTFmOC4uYjExNDAxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCkBAIC0xMDA1LDYgKzEwMDUsMTEgQEAKIAkvKiBtYXNrIG9mIGZlYXR1cmVzIGluaGVyaXRhYmxlIGJ5IFZMQU4gZGV2aWNlcyAqLwogCXUzMgkJCXZsYW5fZmVhdHVyZXM7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0NPTUNFUlRPKQorCS8qIFRoaXMgaXMgcG9pbnRpbmcgdG8gbmV0d29yayBkZXZpY2UgdGhhdCBvZmZsb2FkIFdpRmkgZGF0YSB0byBQRkUgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAJKndpZmlfb2ZmbG9hZF9kZXY7CisjZW5kaWYKKwogCS8qIE5ldCBkZXZpY2UgZmVhdHVyZSBiaXRzOyBpZiB5b3UgY2hhbmdlIHNvbWV0aGluZywKIAkgKiBhbHNvIHVwZGF0ZSBuZXRkZXZfZmVhdHVyZXNfc3RyaW5nc1tdIGluIGV0aHRvb2wuYyAqLwogCkBAIC0xNjIwLDYgKzE2MjUsOSBAQAogZXh0ZXJuIGludAkJZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQJCWRldl9kaXNhYmxlX2xybyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQJCWRldl9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IpOworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pCitleHRlcm4gaW50IAkJb3JpZ2luYWxfZGV2X3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisjZW5kaWYKIGV4dGVybiBpbnQJCXJlZ2lzdGVyX25ldGRldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkCQl1bnJlZ2lzdGVyX25ldGRldmljZV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CkBAIC0yMDQ4LDYgKzIwNTYsOSBAQAogZXh0ZXJuIGludAkJbmV0aWZfcngoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CQluZXRpZl9yeF9uaShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQJCW5ldGlmX3JlY2VpdmVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pCitleHRlcm4gaW50ICAgICAgICAgICAgICBjYXB0dXJlX3JlY2VpdmVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOworI2VuZGlmCiBleHRlcm4gZ3JvX3Jlc3VsdF90CWRldl9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGdyb19yZXN1bHRfdAluYXBpX3NrYl9maW5pc2goZ3JvX3Jlc3VsdF90IHJldCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQKaW5kZXggYTFiNDEwYy4uZTkxYzExOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL0tidWlsZApAQCAtNDUsNiArNDUsNyBAQAogaGVhZGVyLXkgKz0geHRfaGVscGVyLmgKIGhlYWRlci15ICs9IHh0X2lwcmFuZ2UuaAogaGVhZGVyLXkgKz0geHRfaXB2cy5oCitoZWFkZXIteSArPSB4dF9sYXllcjcuaAogaGVhZGVyLXkgKz0geHRfbGVuZ3RoLmgKIGhlYWRlci15ICs9IHh0X2xpbWl0LmgKIGhlYWRlci15ICs9IHh0X21hYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKaW5kZXggMGQzZGQ2Ni4uM2NhMWY0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaApAQCAtODMsNiArODMsMTYgQEAKIAkvKiBDb25udHJhY2sgaXMgYSBmYWtlIHVudHJhY2tlZCBlbnRyeSAqLwogCUlQU19VTlRSQUNLRURfQklUID0gMTIsCiAJSVBTX1VOVFJBQ0tFRCA9ICgxIDw8IElQU19VTlRSQUNLRURfQklUKSwKKworCS8qIENvbm5lY3Rpb24gIGNhbm5vdCBleHBpcmUgKi8KKwlJUFNfUEVSTUFORU5UX0JJVCA9IDEzLAorCUlQU19QRVJNQU5FTlQgPSAoMSA8PCBJUFNfUEVSTUFORU5UX0JJVCksCisKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fRlAKKwkvKiBDb25uZWN0aW9uIGlzIGFzc3VyZWQgYnkgRFBJIGFwcGxpY2F0aW9uICovCisJSVBTX0RQSV9BTExPV0VEX0JJVCA9IDE0LAorCUlQU19EUElfQUxMT1dFRCA9ICgxIDw8IElQU19EUElfQUxMT1dFRF9CSVQpLAorI2VuZGlmCiB9OwogCiAvKiBDb25uZWN0aW9uIHRyYWNraW5nIGV2ZW50IHR5cGVzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmgKaW5kZXggZGViZjFhZS4uZmIwZGQ5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaApAQCAtNDMsNiArNDMsOCBAQAogCUNUQV9aT05FLAogCUNUQV9TRUNDVFgsCiAJQ1RBX1RJTUVTVEFNUCwKKwlDVEFfQ09NQ0VSVE9fRlBfT1JJRywKKwlDVEFfQ09NQ0VSVE9fRlBfUkVQTFksCiAJX19DVEFfTUFYCiB9OwogI2RlZmluZSBDVEFfTUFYIChfX0NUQV9NQVggLSAxKQpAQCAtMTkwLDQgKzE5MiwxMyBAQAogfTsKICNkZWZpbmUgQ1RBX1NFQ0NUWF9NQVggKF9fQ1RBX1NFQ0NUWF9NQVggLSAxKQogCitlbnVtIGN0YXR0cl9jb21jZXJ0b19mcCB7CisJQ1RBX0NPTUNFUlRPX0ZQX1VOU1BFQywKKwlDVEFfQ09NQ0VSVE9fRlBfTUFSSywKKwlDVEFfQ09NQ0VSVE9fRlBfSUZJTkRFWCwKKwlDVEFfQ09NQ0VSVE9fRlBfSUlGLAorCV9fQ1RBX0NPTUNFUlRPX0ZQX01BWAorfTsKKyNkZWZpbmUgQ1RBX0NPTUNFUlRPX0ZQX01BWCAoX19DVEFfQ09NQ0VSVE9fRlBfTUFYIC0gMSkKKwogI2VuZGlmIC8qIF9JUENPTk5UUkFDS19ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L25mX25hdC5oCmluZGV4IDdhODYxZDAuLmE3Mjc1YjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9uZl9uYXQuaApAQCAtNyw2ICs3LDcgQEAKICNkZWZpbmUgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCAyCiAjZGVmaW5lIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00gNAogI2RlZmluZSBJUF9OQVRfUkFOR0VfUEVSU0lTVEVOVCA4CisjZGVmaW5lIElQX05BVF9SQU5HRV80UkRfTkFQVCAxNgogCiAvKiBUaGUgcHJvdG9jb2wtc3BlY2lmaWMgbWFuaXB1bGFibGUgcGFydHMgb2YgdGhlIHR1cGxlLiAqLwogdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY2L0tidWlsZCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvS2J1aWxkCmluZGV4IGJkMDk1YmMuLmI4OGMwMDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvS2J1aWxkCkBAIC0xLDYgKzEsNyBAQAogaGVhZGVyLXkgKz0gaXA2X3RhYmxlcy5oCiBoZWFkZXIteSArPSBpcDZ0X0hMLmgKIGhlYWRlci15ICs9IGlwNnRfTE9HLmgKK2hlYWRlci15ICs9IGlwNnRfTlBULmgKIGhlYWRlci15ICs9IGlwNnRfUkVKRUNULmgKIGhlYWRlci15ICs9IGlwNnRfYWguaAogaGVhZGVyLXkgKz0gaXA2dF9mcmFnLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9OUFQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2dF9OUFQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzYzMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X05QVC5oCkBAIC0wLDAgKzEsMTYgQEAKKyNpZm5kZWYgX19ORVRGSUxURVJfSVA2VF9OUFQKKyNkZWZpbmUgX19ORVRGSUxURVJfSVA2VF9OUFQKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisKK3N0cnVjdCBpcDZ0X25wdF90Z2luZm8geworCXVuaW9uIG5mX2luZXRfYWRkcglzcmNfcGZ4OworCXVuaW9uIG5mX2luZXRfYWRkcglkc3RfcGZ4OworCV9fdTgJCQlzcmNfcGZ4X2xlbjsKKwlfX3U4CQkJZHN0X3BmeF9sZW47CisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwlfX3N1bTE2CQkJYWRqdXN0bWVudDsKK307CisKKyNlbmRpZiAvKiBfX05FVEZJTFRFUl9JUDZUX05QVCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAppbmRleCA4Mzc0ZDI5Li42ZjY1ZTEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaApAQCAtMjYsOCArMjYsMjMgQEAKICNkZWZpbmUgTkVUTElOS19FQ1JZUFRGUwkxOQogI2RlZmluZSBORVRMSU5LX1JETUEJCTIwCiAjZGVmaW5lIE5FVExJTktfQ1JZUFRPCQkyMQkvKiBDcnlwdG8gbGF5ZXIgKi8KKyNkZWZpbmUgTkVUTElOS19GRiAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgTkVUTElOS19WT1AgICAgICAgICAgICAgMzEKKyNkZWZpbmUgTkVUTElOS19LRVkgICAgICAgICAgICAgMzIKKyNkZWZpbmUgTkVUTElOS19MMkZMT1cgICAgICAgICAgMzMKIAotI2RlZmluZSBNQVhfTElOS1MgMzIJCQorI2RlZmluZSBORVRMSU5LX1ZPSVAJCTM0CisjZGVmaW5lIE5FVExJTktfRFRBTQkJMzUKKyNkZWZpbmUgTkVUTElOS19NQ0gJCTM2CisjZGVmaW5lIE5FVExJTktfQ09ORklHCQkzNworI2RlZmluZSBORVRMSU5LX0dFTlBMQVkJCTM4CisjZGVmaW5lIE5FVExJTktfQ09NQURFQlVHCTM5CisjZGVmaW5lIE5FVExJTktfRUVQUk9NCQk0MAorI2RlZmluZSBORVRMSU5LX1NTNwkJNDEKKyNkZWZpbmUgTkVUTElOS19EU1IJCTQyCisjZGVmaW5lIE5FVExJTktfTU1JCQk0MworCisjZGVmaW5lIE1BWF9MSU5LUyA0NAogCiBzdHJ1Y3Qgc29ja2FkZHJfbmwgewogCV9fa2VybmVsX3NhX2ZhbWlseV90CW5sX2ZhbWlseTsJLyogQUZfTkVUTElOSwkqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vY2YtY29tcGF0LmggYi9pbmNsdWRlL2xpbnV4L29jZi1jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQxMjIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9vY2YtY29tcGF0LmgKQEAgLTAsMCArMSwzNzIgQEAKKyNpZm5kZWYgX0JTRF9DT01QQVRfSF8KKyNkZWZpbmUgX0JTRF9DT01QQVRfSF8gMQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogUHJvdmlkZSBjb21wYXQgcm91dGluZXMgZm9yIG9sZGVyIGxpbnV4IGtlcm5lbHMgYW5kIEJTRCBrZXJuZWxzCisgKgorICogV3JpdHRlbiBieSBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZF9tY2N1bGxvdWdoQG1jYWZlZS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRfbWNjdWxsb3VnaEBtY2FmZWUuY29tPgorICoKKyAqIExJQ0VOU0UgVEVSTVMKKyAqCisgKiBUaGUgZnJlZSBkaXN0cmlidXRpb24gYW5kIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGluIGJvdGggc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm0gaXMgYWxsb3dlZCAod2l0aCBvciB3aXRob3V0IGNoYW5nZXMpIHByb3ZpZGVkIHRoYXQ6CisgKgorICogICAxLiBkaXN0cmlidXRpb25zIG9mIHRoaXMgc291cmNlIGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKKyAqCisgKiAgIDIuIGRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgYXNzb2NpYXRlZCBtYXRlcmlhbHM7CisgKgorICogICAzLiB0aGUgY29weXJpZ2h0IGhvbGRlcidzIG5hbWUgaXMgbm90IHVzZWQgdG8gZW5kb3JzZSBwcm9kdWN0cworICogICAgICBidWlsdCB1c2luZyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHByb3ZpZGVkIHRoYXQgdGhpcyBub3RpY2UgaXMgcmV0YWluZWQgaW4gZnVsbCwgdGhpcyBmaWxlCisgKiBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcHBseSBJTlNURUFEIE9GIHRob3NlIGdpdmVuIGFib3ZlLgorICoKKyAqIERJU0NMQUlNRVIKKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcyBpcycgd2l0aCBubyBleHBsaWNpdCBvciBpbXBsaWVkIHdhcnJhbnRpZXMKKyAqIGluIHJlc3BlY3Qgb2YgaXRzIHByb3BlcnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjb3JyZWN0bmVzcworICogYW5kL29yIGZpdG5lc3MgZm9yIHB1cnBvc2UuCisgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDM4KSAmJiAhZGVmaW5lZChBVVRPQ09ORl9JTkNMVURFRCkKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNlbmRpZgorCisvKgorICogZmFrZSBzb21lIEJTRCBkcml2ZXIgaW50ZXJmYWNlIHN0dWZmIHNwZWNpZmljYWxseSBmb3IgT0NGIHVzZQorICovCisKK3R5cGVkZWYgc3RydWN0IG9jZl9kZXZpY2UgKmRldmljZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50ICgqY3J5cHRvZGV2X25ld3Nlc3Npb24pKGRldmljZV90IGRldiwgdV9pbnQzMl90ICpzaWRwLCBzdHJ1Y3QgY3J5cHRvaW5pICpjcmkpOworCWludCAoKmNyeXB0b2Rldl9mcmVlc2Vzc2lvbikoZGV2aWNlX3QgZGV2LCB1X2ludDY0X3QgdGlkKTsKKwlpbnQgKCpjcnlwdG9kZXZfcHJvY2VzcykoZGV2aWNlX3QgZGV2LCBzdHJ1Y3QgY3J5cHRvcCAqY3JwLCBpbnQgaGludCk7CisJaW50ICgqY3J5cHRvZGV2X2twcm9jZXNzKShkZXZpY2VfdCBkZXYsIHN0cnVjdCBjcnlwdGtvcCAqa3JwLCBpbnQgaGludCk7Cit9IGRldmljZV9tZXRob2RfdDsKKyNkZWZpbmUgREVWTUVUSE9EKGlkLCBmdW5jKQlpZDogZnVuYworCitzdHJ1Y3Qgb2NmX2RldmljZSB7CisJY2hhciBuYW1lWzMyXTsJCS8qIHRoZSBkcml2ZXIgbmFtZSAqLworCWNoYXIgbmFtZXVuaXRbMzJdOwkvKiB0aGUgZHJpdmVyIG5hbWUgKyBIVyBpbnN0YW5jZSAqLworCWludCAgdW5pdDsKKwlkZXZpY2VfbWV0aG9kX3QJbWV0aG9kczsKKwl2b2lkICpzb2Z0YzsKK307CisKKyNkZWZpbmUgQ1JZUFRPREVWX05FV1NFU1NJT04oZGV2LCBzaWQsIGNyaSkgXAorCSgoKihkZXYpLT5tZXRob2RzLmNyeXB0b2Rldl9uZXdzZXNzaW9uKShkZXYsc2lkLGNyaSkpCisjZGVmaW5lIENSWVBUT0RFVl9GUkVFU0VTU0lPTihkZXYsIHNpZCkgXAorCSgoKihkZXYpLT5tZXRob2RzLmNyeXB0b2Rldl9mcmVlc2Vzc2lvbikoZGV2LCBzaWQpKQorI2RlZmluZSBDUllQVE9ERVZfUFJPQ0VTUyhkZXYsIGNycCwgaGludCkgXAorCSgoKihkZXYpLT5tZXRob2RzLmNyeXB0b2Rldl9wcm9jZXNzKShkZXYsIGNycCwgaGludCkpCisjZGVmaW5lIENSWVBUT0RFVl9LUFJPQ0VTUyhkZXYsIGtycCwgaGludCkgXAorCSgoKihkZXYpLT5tZXRob2RzLmNyeXB0b2Rldl9rcHJvY2VzcykoZGV2LCBrcnAsIGhpbnQpKQorCisjZGVmaW5lIGRldmljZV9nZXRfbmFtZShkZXYpCSgoZGV2KS0+bmFtZSkKKyNkZWZpbmUgZGV2aWNlX2dldF9uYW1ldW5pdChkZXYpCSgoZGV2KS0+bmFtZXVuaXQpCisjZGVmaW5lIGRldmljZV9nZXRfdW5pdChkZXYpCSgoZGV2KS0+dW5pdCkKKyNkZWZpbmUgZGV2aWNlX2dldF9zb2Z0YyhkZXYpCSgoZGV2KS0+c29mdGMpCisKKyNkZWZpbmUJc29mdGNfZGV2aWNlX2RlY2wgXAorCQlzdHJ1Y3Qgb2NmX2RldmljZSBfZGV2aWNlOyBcCisJCWRldmljZV90CisKKyNkZWZpbmUJc29mdGNfZGV2aWNlX2luaXQoX3NjLCBfbmFtZSwgX3VuaXQsIF9tZXRob2RzKSBcCisJaWYgKDEpIHtcCisJc3RybmNweSgoX3NjKS0+X2RldmljZS5uYW1lLCBfbmFtZSwgc2l6ZW9mKChfc2MpLT5fZGV2aWNlLm5hbWUpIC0gMSk7IFwKKwlzbnByaW50ZigoX3NjKS0+X2RldmljZS5uYW1ldW5pdCwgc2l6ZW9mKChfc2MpLT5fZGV2aWNlLm5hbWUpLCAiJXMlZCIsIF9uYW1lLCBfdW5pdCk7IFwKKwkoX3NjKS0+X2RldmljZS51bml0ID0gX3VuaXQ7IFwKKwkoX3NjKS0+X2RldmljZS5tZXRob2RzID0gX21ldGhvZHM7IFwKKwkoX3NjKS0+X2RldmljZS5zb2Z0YyA9ICh2b2lkICopIF9zYzsgXAorCSooZGV2aWNlX3QgKikoKHNvZnRjX2dldF9kZXZpY2UoX3NjKSkrMSkgPSAmKF9zYyktPl9kZXZpY2U7IFwKKwl9IGVsc2UKKworI2RlZmluZQlzb2Z0Y19nZXRfZGV2aWNlKF9zYykJKCYoX3NjKS0+X2RldmljZSkKKworLyoKKyAqIGlvbWVtIHN1cHBvcnQgZm9yIDIuNCBhbmQgMi42IGtlcm5lbHMKKyAqLworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKyNkZWZpbmUgb2NmX2lvbWVtX3QJdW5zaWduZWQgbG9uZworCisvKgorICogaW1wbGVtZW50IHNpbXBsZSB3b3JrcXVldWUgbGlrZSBzdXBwb3J0IGZvciBvbGRlciBrZXJuZWxzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RxdWV1ZS5oPgorCisjZGVmaW5lIHdvcmtfc3RydWN0IHRxX3N0cnVjdAorCisjZGVmaW5lIElOSVRfV09SSyh3cCwgZnAsIGFwKSBcCisJZG8geyBcCisJCSh3cCktPnN5bmMgPSAwOyBcCisJCSh3cCktPnJvdXRpbmUgPSAoZnApOyBcCisJCSh3cCktPmRhdGEgPSAoYXApOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBzY2hlZHVsZV93b3JrKHdwKSBcCisJZG8geyBcCisJCXF1ZXVlX3Rhc2soKHdwKSwgJnRxX2ltbWVkaWF0ZSk7IFwKKwkJbWFya19iaChJTU1FRElBVEVfQkgpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBmbHVzaF9zY2hlZHVsZWRfd29yaygpCXJ1bl90YXNrX3F1ZXVlKCZ0cV9pbW1lZGlhdGUpCisKKyNlbHNlCisjZGVmaW5lIG9jZl9pb21lbV90CXZvaWQgX19pb21lbSAqCisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2VuZGlmCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDI2KQorI2luY2x1ZGUgPGxpbnV4L2ZkdGFibGUuaD4KKyNlbGlmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMSkKKyNkZWZpbmUgZmlsZXNfZmR0YWJsZShmaWxlcykJKGZpbGVzKQorI2VuZGlmCisKKyNpZmRlZiBNT0RVTEVfUEFSTQorI3VuZGVmIG1vZHVsZV9wYXJhbQkvKiBqdXN0IGluIGNhc2UgKi8KKyNkZWZpbmUJbW9kdWxlX3BhcmFtKGEsYixjKQkJTU9EVUxFX1BBUk0oYSwiaSIpCisjZW5kaWYKKworI2RlZmluZSBiemVybyhzLGwpCQltZW1zZXQocywwLGwpCisjZGVmaW5lIGJjb3B5KHMsZCxsKQltZW1jcHkoZCxzLGwpCisjZGVmaW5lIGJjbXAoeCwgeSwgbCkJbWVtY21wKHgseSxsKQorCisjZGVmaW5lIE1JTih4LHkpCSgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCisKKyNkZWZpbmUgZGV2aWNlX3ByaW50ZihkZXYsIGEuLi4pICh7IFwKKwkJCQlwcmludGsoIiVzOiAiLCBkZXZpY2VfZ2V0X25hbWV1bml0KGRldikpOyBwcmludGsoYSk7IFwKKwkJCX0pCisKKyN1bmRlZiBwcmludGYKKyNkZWZpbmUgcHJpbnRmKGZtdC4uLikJcHJpbnRrKGZtdCkKKworI2RlZmluZSBLQVNTRVJUKGMscCkJaWYgKCEoYykpIHsgcHJpbnRrIHAgOyB9IGVsc2UKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorI2RlZmluZSBvY2ZfZGFlbW9uaXplKHN0cikgXAorCWRhZW1vbml6ZSgpOyBcCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnbWFza19sb2NrKTsgXAorCXNpZ2VtcHR5c2V0KCZjdXJyZW50LT5ibG9ja2VkKTsgXAorCXJlY2FsY19zaWdwZW5kaW5nKGN1cnJlbnQpOyBcCisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdtYXNrX2xvY2spOyBcCisJc3ByaW50ZihjdXJyZW50LT5jb21tLCBzdHIpOworI2Vsc2UKKyNkZWZpbmUgb2NmX2RhZW1vbml6ZShzdHIpIGRhZW1vbml6ZShzdHIpOworI2VuZGlmCisKKyNkZWZpbmUJVEFJTFFfSU5TRVJUX1RBSUwocSxkLG0pIGxpc3RfYWRkX3RhaWwoJihkKS0+bSwgKHEpKQorI2RlZmluZQlUQUlMUV9FTVBUWShxKQlsaXN0X2VtcHR5KHEpCisjZGVmaW5lCVRBSUxRX0ZPUkVBQ0godiwgcSwgbSkgbGlzdF9mb3JfZWFjaF9lbnRyeSh2LCBxLCBtKQorCisjZGVmaW5lIHJlYWRfcmFuZG9tKHAsbCkgZ2V0X3JhbmRvbV9ieXRlcyhwLGwpCisKKyNkZWZpbmUgREVMQVkoeCkJKCh4KSA+IDIwMDAgPyBtZGVsYXkoKHgpLzEwMDApIDogdWRlbGF5KHgpKQorI2RlZmluZSBzdHJ0b3VsIHNpbXBsZV9zdHJ0b3VsCisKKyNkZWZpbmUgcGNpX2dldF92ZW5kb3IoZGV2KQkoKGRldiktPnZlbmRvcikKKyNkZWZpbmUgcGNpX2dldF9kZXZpY2UoZGV2KQkoKGRldiktPmRldmljZSkKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorI2RlZmluZSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soZGV2LCBtYXNrKSAoMCkKKyNlbmRpZgorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkKKyNkZWZpbmUgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1IHBjaV9kbWFfc3luY19zaW5nbGUKKyNlbmRpZgorCisjaWZuZGVmIERNQV8zMkJJVF9NQVNLCisjZGVmaW5lIERNQV8zMkJJVF9NQVNLICAweDAwMDAwMDAwZmZmZmZmZmZVTEwKKyNlbmRpZgorCisjaWZuZGVmIGh0b2xlMzIKKyNkZWZpbmUgaHRvbGUzMih4KQljcHVfdG9fbGUzMih4KQorI2VuZGlmCisjaWZuZGVmIGh0b2JlMzIKKyNkZWZpbmUgaHRvYmUzMih4KQljcHVfdG9fYmUzMih4KQorI2VuZGlmCisjaWZuZGVmIGh0b2xlMTYKKyNkZWZpbmUgaHRvbGUxNih4KQljcHVfdG9fbGUxNih4KQorI2VuZGlmCisjaWZuZGVmIGh0b2JlMTYKKyNkZWZpbmUgaHRvYmUxNih4KQljcHVfdG9fYmUxNih4KQorI2VuZGlmCisKKy8qIG9sZGVyIGtlcm5lbHMgZG9uJ3QgaGF2ZSB0aGVzZSAqLworCisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2lmICFkZWZpbmVkKElSUV9OT05FKSAmJiAhZGVmaW5lZChJUlFfUkVUVkFMKQorI2RlZmluZSBJUlFfTk9ORQorI2RlZmluZSBJUlFfSEFORExFRAorI2RlZmluZSBJUlFfV0FLRV9USFJFQUQKKyNkZWZpbmUgSVJRX1JFVFZBTAorI2RlZmluZSBpcnFyZXR1cm5fdCB2b2lkCit0eXBlZGVmIGlycXJldHVybl90ICgqaXJxX2hhbmRsZXJfdCkoaW50IGlycSwgdm9pZCAqYXJnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZW5kaWYKKyNpZm5kZWYgSVJRRl9TSEFSRUQKKyNkZWZpbmUgSVJRRl9TSEFSRUQJU0FfU0hJUlEKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApCisjIGRlZmluZSBzdHJsY3B5KGRlc3Qsc3JjLGxlbikgXAorCQkoe3N0cm5jcHkoZGVzdCxzcmMsKGxlbiktMSk7ICgoY2hhciAqKWRlc3QpWyhsZW4pLTFdID0gJ1wwJzsgfSkKKyNlbmRpZgorCisjaWZuZGVmIE1BWF9FUlJOTworI2RlZmluZSBNQVhfRVJSTk8JNDA5NQorI2VuZGlmCisjaWZuZGVmIElTX0VSUl9WQUxVRQorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsNSkKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNlbmRpZgorI2lmbmRlZiBJU19FUlJfVkFMVUUKKyNkZWZpbmUgSVNfRVJSX1ZBTFVFKHgpICgodW5zaWduZWQgbG9uZykoeCkgPj0gKHVuc2lnbmVkIGxvbmcpLU1BWF9FUlJOTykKKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBjb21tb24gZGVidWcgZm9yIGFsbAorICovCisjaWYgMQorI2RlZmluZSBkcHJpbnRrKGEuLi4pCWRvIHsgaWYgKGRlYnVnKSBwcmludGsoYSk7IH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoYS4uLikKKyNlbmRpZgorCisjaWZuZGVmIFNMQUJfQVRPTUlDCisvKiBDaGFuZ2VkIGluIDIuNi4yMCwgbXVzdCB1c2UgR0ZQX0FUT01JQyBub3cgKi8KKyNkZWZpbmUJU0xBQl9BVE9NSUMJR0ZQX0FUT01JQworI2VuZGlmCisKKy8qCisgKiBuZWVkIHNvbWUgYWRkaXRpb25hbCBzdXBwb3J0IGZvciBvbGRlciBrZXJuZWxzICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDIpCisjZGVmaW5lIHBjaV9yZWdpc3Rlcl9kcml2ZXJfY29tcGF0KGRyaXZlciwgcmMpIFwKKwlkbyB7IFwKKwkJaWYgKChyYykgPiAwKSB7IFwKKwkJCShyYykgPSAwOyBcCisJCX0gZWxzZSBpZiAocmMgPT0gMCkgeyBcCisJCQkocmMpID0gLUVOT0RFVjsgXAorCQl9IGVsc2UgeyBcCisJCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyKTsgXAorCQl9IFwKKwl9IHdoaWxlICgwKQorI2VsaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorI2RlZmluZSBwY2lfcmVnaXN0ZXJfZHJpdmVyX2NvbXBhdChkcml2ZXIscmMpICgocmMpID0gKHJjKSA8IDAgPyAocmMpIDogMCkKKyNlbHNlCisjZGVmaW5lIHBjaV9yZWdpc3Rlcl9kcml2ZXJfY29tcGF0KGRyaXZlcixyYykKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDI0KQorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vc2NhdHRlcmxpc3QuaD4KKworc3RhdGljIGlubGluZSB2b2lkIHNnX3NldF9wYWdlKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXNnLT5wYWdlID0gcGFnZTsKKwlzZy0+b2Zmc2V0ID0gb2Zmc2V0OworCXNnLT5sZW5ndGggPSBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc2dfdmlydChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnKQoreworCXJldHVybiBwYWdlX2FkZHJlc3Moc2ctPnBhZ2UpICsgc2ctPm9mZnNldDsKK30KKworI2RlZmluZSBzZ19pbml0X3RhYmxlKHNnLCBuKQorCisjZGVmaW5lIHNnX21hcmtfZW5kKHNnKQorCisjZW5kaWYKKworI2lmbmRlZiBsYXRlX2luaXRjYWxsCisjZGVmaW5lIGxhdGVfaW5pdGNhbGwoaW5pdCkgbW9kdWxlX2luaXQoaW5pdCkKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDQpIHx8ICFkZWZpbmVkKENPTkZJR19TTVApCisjZGVmaW5lIG9jZl9mb3JfZWFjaF9jcHUoY3B1KSBmb3IgKChjcHUpID0gMDsgKGNwdSkgPT0gMDsgKGNwdSkrKykKKyNlbHNlCisjZGVmaW5lIG9jZl9mb3JfZWFjaF9jcHUoY3B1KSBmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMjcpCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNkZWZpbmUJa2lsbF9wcm9jKHAscyx2KQlzZW5kX3NpZyhzLGZpbmRfdGFza19ieV92cGlkKHApLDApCisjZW5kaWYKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsNiw0KQorCitzdHJ1Y3Qgb2NmX3RocmVhZCB7CisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworCWludAkJCQkJKCpmdW5jKSh2b2lkICphcmcpOworCXZvaWQJCQkJKmFyZzsKK307CisKKy8qIHRocmVhZCBzdGFydHVwIGhlbHBlciBmdW5jICovCitzdGF0aWMgaW5saW5lIGludCBvY2ZfcnVuX3RocmVhZCh2b2lkICphcmcpCit7CisJc3RydWN0IG9jZl90aHJlYWQgKnQgPSAoc3RydWN0IG9jZl90aHJlYWQgKikgYXJnOworCWlmICghdCkKKwkJcmV0dXJuIC0xOyAvKiB2ZXJ5IGJhZCAqLworCXQtPnRhc2sgPSBjdXJyZW50OworCWRhZW1vbml6ZSgpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ21hc2tfbG9jayk7CisJc2lnZW1wdHlzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOworCXJlY2FsY19zaWdwZW5kaW5nKGN1cnJlbnQpOworCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnbWFza19sb2NrKTsKKwlyZXR1cm4gKCp0LT5mdW5jKSh0LT5hcmcpOworfQorCisjZGVmaW5lIGt0aHJlYWRfY3JlYXRlKGYsYSxmbXQuLi4pIFwKKwkoeyBcCisJCXN0cnVjdCBvY2ZfdGhyZWFkIHQ7IFwKKwkJcGlkX3QgcDsgXAorCQl0LnRhc2sgPSBOVUxMOyBcCisJCXQuZnVuYyA9IChmKTsgXAorCQl0LmFyZyA9IChhKTsgXAorCQlwID0ga2VybmVsX3RocmVhZChvY2ZfcnVuX3RocmVhZCwgJnQsIENMT05FX0ZTfENMT05FX0ZJTEVTKTsgXAorCQl3aGlsZSAocCAhPSAocGlkX3QpIC0xICYmIHQudGFzayA9PSBOVUxMKSBcCisJCQlzY2hlZHVsZSgpOyBcCisJCWlmICh0LnRhc2spIFwKKwkJCXNucHJpbnRmKHQudGFzay0+Y29tbSwgc2l6ZW9mKHQudGFzay0+Y29tbSksIGZtdCk7IFwKKwkJKHQudGFzayk7IFwKKwl9KQorCisjZGVmaW5lIGt0aHJlYWRfYmluZCh0LGNwdSkJLyoqLworCisjZGVmaW5lIGt0aHJlYWRfc2hvdWxkX3N0b3AoKQkoc3RyY21wKGN1cnJlbnQtPmNvbW0sICJzdG9wcGluZyIpID09IDApCisKKyNkZWZpbmUga3RocmVhZF9zdG9wKHQpIFwKKwkoeyBcCisJCXN0cmNweSgodCktPmNvbW0sICJzdG9wcGluZyIpOyBcCisJCWtpbGxfcHJvYygodCktPnBpZCwgU0lHVEVSTSwgMSk7IFwKKwkJZG8geyBcCisJCQlzY2hlZHVsZSgpOyBcCisJCX0gd2hpbGUgKGtpbGxfcHJvYygodCktPnBpZCwgU0lHVEVSTSwgMSkgPT0gMCk7IFwKKwl9KQorCisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNlbmRpZgorCisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigzLDIsMCkKKyNkZWZpbmUJc2tiX2ZyYWdfcGFnZSh4KQkoKHgpLT5wYWdlKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2VuZGlmIC8qIF9CU0RfQ09NUEFUX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mLmggYi9pbmNsdWRlL2xpbnV4L29mLmgKaW5kZXggNDk0ODU1Mi4uN2IzZWQ4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZi5oCisrKyBiL2luY2x1ZGUvbGludXgvb2YuaApAQCAtMzM2LDYgKzMzNiwyMiBAQAogI2RlZmluZSBvZl9tYXRjaF9ub2RlKF9tYXRjaGVzLCBfbm9kZSkJTlVMTAogI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCisvKioKKyogb2ZfcHJvcGVydHlfcmVhZF9ib29sIC0gRmluZGZyb20gYSBwcm9wZXJ0eQorKiBAbnA6ICAgICAgICAgZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KKyogQHByb3BuYW1lOiAgIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgorKgorKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZS4KKyogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBleGlzdCBmYWxzZSBvdGhlcndpc2UuCisqLworc3RhdGljIGlubGluZSBib29sIG9mX3Byb3BlcnR5X3JlYWRfYm9vbChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkJCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIHByb3BuYW1lLCBOVUxMKTsKKworCXJldHVybiBwcm9wID8gdHJ1ZSA6IGZhbHNlOworfQorCiBzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQkgICAgICAgdTMyICpvdXRfdmFsdWUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaCBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCmluZGV4IGU5MGE2NzMuLjM1ZmY1MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCkBAIC0xMDQsNiArMTA0LDkgQEAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0ZBSUxVUkUKIAlQR19od3BvaXNvbiwJCS8qIGhhcmR3YXJlIHBvaXNvbmVkIHBhZ2UuIERvbid0IHRvdWNoICovCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUkFJRF9aRVJPX0NPUFkKKyAgICAgICAgUEdfY29uc3RhbnQsICAgICAgICAgICAgLyogY29uc3QgcGFnZSBub3QgbW9kaWZpZWQgZHVyaW5nIHJhaWQ1IGlvICovCisjZW5kaWYKICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKIAlQR19jb21wb3VuZF9sb2NrLAogI2VuZGlmCkBAIC0xOTMsNiArMTk2LDE2IEBACiAKIHN0cnVjdCBwYWdlOwkvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCiAKKyNpZmRlZiBDT05GSUdfUkFJRF9aRVJPX0NPUFkKKyNkZWZpbmUgUGFnZUNvbnN0YW50KHBhZ2UpIHRlc3RfYml0KFBHX2NvbnN0YW50LCAmKHBhZ2UpLT5mbGFncykKKyNkZWZpbmUgU2V0UGFnZUNvbnN0YW50KHBhZ2UpIHNldF9iaXQoUEdfY29uc3RhbnQsICYocGFnZSktPmZsYWdzKQorI2RlZmluZSBDbGVhclBhZ2VDb25zdGFudChwYWdlKSBjbGVhcl9iaXQoUEdfY29uc3RhbnQsICYocGFnZS0+ZmxhZ3MpKQorI2RlZmluZSBUZXN0U2V0UGFnZUNvbnN0YW50KHBhZ2UpIHRlc3RfYW5kX3NldF9iaXQoUEdfY29uc3RhbnQsICYocGFnZSktPmZsYWdzKQorZXh0ZXJuIHZvaWQgY2xlYXJfcGFnZV9jb25zdGFudChzdHJ1Y3QgcGFnZSAqcGFnZSk7CisjZW5kaWYKKworCisKIFRFU1RQQUdFRkxBRyhMb2NrZWQsIGxvY2tlZCkKIFBBR0VGTEFHKEVycm9yLCBlcnJvcikgVEVTVENMRUFSRkxBRyhFcnJvciwgZXJyb3IpCiBQQUdFRkxBRyhSZWZlcmVuY2VkLCByZWZlcmVuY2VkKSBURVNUQ0xFQVJGTEFHKFJlZmVyZW5jZWQsIHJlZmVyZW5jZWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bma2V5djIuaCBiL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCmluZGV4IDBiODBjODAuLjA0NTY2NjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCisrKyBiL2luY2x1ZGUvbGludXgvcGZrZXl2Mi5oCkBAIC0yNjgsNiArMjY4LDcgQEAKICNkZWZpbmUgU0FEQl9TQUZMQUdTX05PUE1UVURJU0MJMHgyMDAwMDAwMAogI2RlZmluZSBTQURCX1NBRkxBR1NfREVDQVBfRFNDUAkweDQwMDAwMDAwCiAjZGVmaW5lIFNBREJfU0FGTEFHU19OT0VDTgkweDgwMDAwMDAwCisjZGVmaW5lIFNBREJfU0FGTEFHU19FU04JMHgwMTAwMDAwMAogCiAvKiBTZWN1cml0eSBBc3NvY2lhdGlvbiBzdGF0ZXMgKi8KICNkZWZpbmUgU0FEQl9TQVNUQVRFX0xBUlZBTAkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oIGIvaW5jbHVkZS9saW51eC9yYW5kb20uaAppbmRleCA4Zjc0NTM4Li4wZmYzMWE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhbmRvbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFuZG9tLmgKQEAgLTM0LDYgKzM0LDMwIEBACiAvKiBDbGVhciB0aGUgZW50cm9weSBwb29sIGFuZCBhc3NvY2lhdGVkIGNvdW50ZXJzLiAgKFN1cGVydXNlciBvbmx5LikgKi8KICNkZWZpbmUgUk5EQ0xFQVJQT09MCV9JTyggJ1InLCAweDA2ICkKIAorI2lmZGVmIENPTkZJR19GSVBTX1JORworCisvKiBTaXplIG9mIHNlZWQgdmFsdWUgLSBlcXVhbCB0byBBRVMgYmxvY2tzaXplICovCisjZGVmaW5lIEFFU19CTE9DS19TSVpFX0JZVEVTCTE2CisjZGVmaW5lIFNFRURfU0laRV9CWVRFUwkJCUFFU19CTE9DS19TSVpFX0JZVEVTCisvKiBTaXplIG9mIEFFUyBrZXkgKi8KKyNkZWZpbmUgS0VZX1NJWkVfQllURVMJCTE2CisKKy8qIGlvY3RsKCkgc3RydWN0dXJlIHVzZWQgYnkgRklQUyAxNDAtMiBUZXN0cyAqLworc3RydWN0IHJhbmRfZmlwc190ZXN0IHsKKwl1bnNpZ25lZCBjaGFyIGtleVtLRVlfU0laRV9CWVRFU107CQkJLyogSW5wdXQgKi8KKwl1bnNpZ25lZCBjaGFyIGRhdGV0aW1lW1NFRURfU0laRV9CWVRFU107CS8qIElucHV0ICovCisJdW5zaWduZWQgY2hhciBzZWVkW1NFRURfU0laRV9CWVRFU107CQkvKiBJbnB1dCAqLworCXVuc2lnbmVkIGNoYXIgcmVzdWx0W1NFRURfU0laRV9CWVRFU107CQkvKiBPdXRwdXQgKi8KK307CisKKy8qIEZJUFMgMTQwLTIgUk5HIFZhcmlhYmxlIFNlZWQgVGVzdC4gKFN1cGVydXNlciBvbmx5LikgKi8KKyNkZWZpbmUgUk5ERklQU1ZTVAlfSU9XUignUicsIDB4MTAsIHN0cnVjdCByYW5kX2ZpcHNfdGVzdCkKKworLyogRklQUyAxNDAtMiBSTkcgTW9udGUgQ2FybG8gVGVzdC4gKFN1cGVydXNlciBvbmx5LikgKi8KKyNkZWZpbmUgUk5ERklQU01DVAlfSU9XUignUicsIDB4MTEsIHN0cnVjdCByYW5kX2ZpcHNfdGVzdCkKKworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfRklQU19STkcgKi8KKwogc3RydWN0IHJhbmRfcG9vbF9pbmZvIHsKIAlpbnQJZW50cm9weV9jb3VudDsKIAlpbnQJYnVmX3NpemU7CkBAIC01NCw2ICs3OCwxMCBAQAogCQkJCSB1bnNpZ25lZCBpbnQgdmFsdWUpOwogZXh0ZXJuIHZvaWQgYWRkX2ludGVycnVwdF9yYW5kb21uZXNzKGludCBpcnEpOwogCitleHRlcm4gdm9pZCByYW5kb21faW5wdXRfd29yZHMoX191MzIgKmJ1Ziwgc2l6ZV90IHdvcmRjb3VudCwgaW50IGVudF9jb3VudCk7CitleHRlcm4gaW50IHJhbmRvbV9pbnB1dF93YWl0KHZvaWQpOworI2RlZmluZSBIQVNfUkFORE9NX0lOUFVUX1dBSVQgMQorCiBleHRlcm4gdm9pZCBnZXRfcmFuZG9tX2J5dGVzKHZvaWQgKmJ1ZiwgaW50IG5ieXRlcyk7CiB2b2lkIGdlbmVyYXRlX3JhbmRvbV91dWlkKHVuc2lnbmVkIGNoYXIgdXVpZF9vdXRbMTZdKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydGMvcnRjLWMyay5oIGIvaW5jbHVkZS9saW51eC9ydGMvcnRjLWMyay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDdhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3J0Yy9ydGMtYzJrLmgKQEAgLTAsMCArMSwyNCBAQAorCisvKgorCVJFR0lTVEVSIE9GRlNFVF9BRERSRVNTIFIvVyBERVNDUklQVElPTiBSRVNFVCBWQUxVRQorKi8KKworI2RlZmluZQlDMktfUlRDX1JUQ0NPTiAwWDAwIC8qIFIvVyBSVEMgQ09OVFJPTCBSRUdJU1RFUiAwWDAwICovCisjZGVmaW5lCUMyS19SVENfUlRDQUxNIDBYMDQgLyogUi9XIFJUQyBBTEFSTSBDT05UUk9MIFJFR0lTVEVSIDBYMDAgKi8KKyNkZWZpbmUJQzJLX1JUQ19BTE1TRUMgMFgwOCAvKiBSL1cgQUxBUk0gU0VDT05EIERBVEEgUkVHSVNURVIgMFgwMCAqLworI2RlZmluZQlDMktfUlRDX0FMTU1JTiAwWDBDIC8qIFIvVyBBTEFSTSBNSU5VVEUgREFUQSBSRUdJU1RFUiAwWDAwICovCisjZGVmaW5lCUMyS19SVENfQUxNSE9VUiAwWDEwIC8qIFIvVyBBTEFSTSBIT1VSIERBVEEgUkVHSVNURVIgMFgwMCAqLworI2RlZmluZQlDMktfUlRDX0FMTURBVEUgMFgxNCAvKiBSL1cgQUxBUk0gREFURSBEQVRBIFJFR0lTVEVSIDBYMDAgKi8KKyNkZWZpbmUJQzJLX1JUQ19BTE1EQVkgMFgxOCAvKiBSL1cgQUxBUk0gREFZIE9GIFdFRUsgREFUQSBSRUdJU1RFUiAwWDAwICovCisjZGVmaW5lCUMyS19SVENfQUxNTU9OIDBYMUMgLyogUi9XIEFMQVJNIE1PTlRIIERBVEEgUkVHSVNURVIgMFgwMCAqLworI2RlZmluZQlDMktfUlRDX0FMTVlFQVIgMFgyMCAvKiBSL1cgQUxBUk0gWUVBUiBEQVRBIFJFR0lTVEVSIDBYMDAgKi8KKyNkZWZpbmUJQzJLX1JUQ19CQ0RTRUMgMFgyNCAvKiBSL1cgQkNEIFNFQ09ORCBSRUdJU1RFUiAqLworI2RlZmluZQlDMktfUlRDX0JDRE1JTiAwWDI4IC8qIFIvVyBCQ0QgTUlOVVRFIFJFR0lTVEVSICovCisjZGVmaW5lCUMyS19SVENfQkNESE9VUiAwWDJDIC8qIFIvVyBCQ0QgSE9VUiBSRUdJU1RFUiAqLworI2RlZmluZQlDMktfUlRDX0JDRERBVEUgMFgzMCAvKiBSL1cgQkNEIERBVEUgUkVHSVNURVIgKi8KKyNkZWZpbmUJQzJLX1JUQ19CQ0REQVkgMFgzNCAvKiBSL1cgQkNEIERBWSBPRiBXRUVLIFJFR0lTVEVSICovCisjZGVmaW5lCUMyS19SVENfQkNETU9OIDBYMzggLyogUi9XIEJDRCBNT05USCBSRUdJU1RFUiAqLworI2RlZmluZQlDMktfUlRDX0JDRFlFQVIgMFgzQyAvKiBSL1cgQkNEIFlFQVIgUkVHSVNURVIgKi8KKyNkZWZpbmUJQzJLX1JUQ19SVENJTSAwWDQwIC8qIFIvVyBSVEMgSU5URVJSVVBUIE1PREUgUkVHSVNURVIgMFgwMCAqLworI2RlZmluZQlDMktfUlRDX1JUQ1BFTkQgMFg0NCAvKiBSL1cgUlRDIElOVEVSUlVQVCBQRU5ESU5HIFJFR0lTVEVSIDBYMDAgKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKaW5kZXggOGU4NzJlYS4uNmMyZmIyZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCkBAIC0xMTksNyArMTE5LDEyIEBACiAjZGVmaW5lIFJUTV9HRVREQ0IgUlRNX0dFVERDQgogCVJUTV9TRVREQ0IsCiAjZGVmaW5lIFJUTV9TRVREQ0IgUlRNX1NFVERDQgotCisgICAgICAgUlRNX05FVzRSRCA9IDgwLAorI2RlZmluZSBSVE1fTkVXNFJEICAgICAgUlRNX05FVzRSRAorICAgICAgIFJUTV9ERUw0UkQsCisjZGVmaW5lIFJUTV9ERUw0UkQgICAgICBSVE1fREVMNFJECisgICAgICAgUlRNX0dFVDRSRCwKKyNkZWZpbmUgUlRNX0dFVDRSRCAgICAgIFJUTV9HRVQ0UkQKIAlfX1JUTV9NQVgsCiAjZGVmaW5lIFJUTV9NQVgJCSgoKF9fUlRNX01BWCArIDMpICYgfjMpIC0gMSkKIH07CkBAIC02MjEsNiArNjI2LDkgQEAKIAkJCXUzMiBncm91cCwgc3RydWN0IG5sbXNnaGRyICpubGgsIGdmcF90IGZsYWdzKTsKIGV4dGVybiB2b2lkIHJ0bmxfc2V0X3NrX2VycihzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBncm91cCwgaW50IGVycm9yKTsKIGV4dGVybiBpbnQgcnRuZXRsaW5rX3B1dF9tZXRyaWNzKHN0cnVjdCBza19idWZmICpza2IsIHUzMiAqbWV0cmljcyk7CisjaWZkZWYgQ09ORklHX0FSQ0hfQ09NQ0VSVE8KK2V4dGVybiBpbnQgcnRuZXRsaW5rX3B1dF9tZXRyaWNzXzIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyICptZXRyaWNzLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOworI2VuZGlmCiBleHRlcm4gaW50IHJ0bmxfcHV0X2NhY2hlaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCiAJCQkgICAgICB1MzIgaWQsIHUzMiB0cywgdTMyIHRzYWdlLCBsb25nIGV4cGlyZXMsCiAJCQkgICAgICB1MzIgZXJyb3IpOwpAQCAtNzQyLDYgKzc1MCw3IEBACiAgICAJX19ydGFfcmVzZXJ2ZShza2IsIGF0dHJ0eXBlLCBhdHRybGVuKTsgfSkKIAogZXh0ZXJuIHZvaWQgcnRtc2dfaWZpbmZvKGludCB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFuZ2UpOworZXh0ZXJuIHZvaWQgX19ydG1zZ19pZmluZm8oaW50IHR5cGUsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYW5nZSwgZ2ZwX3QgZmxhZ3MpOwogCiAvKiBSVE5MIGlzIHVzZWQgYXMgYSBnbG9iYWwgbG9jayBmb3IgYWxsIGNoYW5nZXMgdG8gbmV0d29yayBjb25maWd1cmF0aW9uICAqLwogZXh0ZXJuIHZvaWQgcnRubF9sb2NrKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggNTNkYzdlNy4uNGI0MmViNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC00MTQsNiArNDE0LDkgQEAKIAlrbWVtY2hlY2tfYml0ZmllbGRfZW5kKGZsYWdzMSk7CiAJX19iZTE2CQkJcHJvdG9jb2w7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJX191MzIJCQlpcHNlY19vZmZsb2FkOworI2VuZGlmCiAJdm9pZAkJCSgqZGVzdHJ1Y3Rvcikoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQogCXN0cnVjdCBuZl9jb25udHJhY2sJKm5mY3Q7CkBAIC00NjgsNiArNDcxLDExIEBACiAJc2tfYnVmZl9kYXRhX3QJCWVuZDsKIAl1bnNpZ25lZCBjaGFyCQkqaGVhZCwKIAkJCQkqZGF0YTsKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19DVVNUT01fU0tCX0xBWU9VVCkKKwl1bnNpZ25lZCBjaGFyIAkJKm1zcGRfZGF0YTsKKwlfX3UzMiAJCQltc3BkX2xlbjsKKwlfX3UzMiAJCQltc3BkX29mc3Q7CisjZW5kaWYKIAl1bnNpZ25lZCBpbnQJCXRydWVzaXplOwogCWF0b21pY190CQl1c2VyczsKIH07CkBAIC01NTAsNiArNTU4LDE3IEBACiAJcmV0dXJuIF9fYWxsb2Nfc2tiKHNpemUsIHByaW9yaXR5LCAxLCBOVU1BX05PX05PREUpOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9DT01DRVJUTykKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqX19hbGxvY19za2JfaGVhZGVyKHVuc2lnbmVkIGludCBzaXplLCB2b2lkKiBkYXRhLCBnZnBfdCBnZnBfbWFzaywKKwkJCSAgICBpbnQgZmNsb25lLCBpbnQgbm9kZSk7CitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICphbGxvY19za2JfaGVhZGVyKHVuc2lnbmVkIGludCBzaXplLCAKKwkJCQkJdm9pZCogZGF0YSwKKwkJCQkJZ2ZwX3QgcHJpb3JpdHkpCit7CisJcmV0dXJuIF9fYWxsb2Nfc2tiX2hlYWRlcihzaXplLCBkYXRhLCBwcmlvcml0eSwgMCwgTlVNQV9OT19OT0RFKTsKK30KKyNlbmRpZgorCiBleHRlcm4gdm9pZCBza2JfcmVjeWNsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBib29sIHNrYl9yZWN5Y2xlX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsIGludCBza2Jfc2l6ZSk7CiAKQEAgLTIwODUsNiArMjEwNCwxMSBAQAogZXh0ZXJuIGludAkgICAgICAgc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKmZyb20sCiAJCQkJCSAgICAgICBpbnQgb2Zmc2V0LCBzdHJ1Y3QgaW92ZWMgKnRvLAogCQkJCQkgICAgICAgaW50IHNpemUpOworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0lNUFJPVkVEX1NQTElDRSkKK2V4dGVybiBpbnQJICAgICAgIHNrYl9jb3B5X2RhdGFncmFtX3RvX2tlcm5lbF9pb3ZlYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSwKKwkJCQkJICAgICAgIGludCBvZmZzZXQsIHN0cnVjdCBpb3ZlYyAqdG8sCisJCQkJCSAgICAgICBpbnQgc2l6ZSk7CisjZW5kaWYKIGV4dGVybiBpbnQJICAgICAgIHNrYl9jb3B5X2FuZF9jc3VtX2RhdGFncmFtX2lvdmVjKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCQkJaW50IGhsZW4sCiAJCQkJCQkJc3RydWN0IGlvdmVjICppb3YpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCmluZGV4IGQwMGUwYmEuLjMzNGYzODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKQEAgLTE0OCw3ICsxNDgsNyBAQAogCQlyZXR1cm4gTlVMTDsKIGZvdW5kOgogI2lmZGVmIENPTkZJR19aT05FX0RNQQotCQlpZiAoZmxhZ3MgJiBHRlBfRE1BKQorCQlpZiAoZmxhZ3MgJiBfX0dGUF9ETUEpCiAJCQljYWNoZXAgPSBtYWxsb2Nfc2l6ZXNbaV0uY3NfZG1hY2FjaGVwOwogCQllbHNlCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc29ja2V0LmggYi9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCmluZGV4IGFkOTE5ZTAuLmNlMTJhYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc29ja2V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaApAQCAtMTk1LDcgKzE5NSwxMCBAQAogI2RlZmluZSBBRl9DQUlGCQkzNwkvKiBDQUlGIHNvY2tldHMJCQkqLwogI2RlZmluZSBBRl9BTEcJCTM4CS8qIEFsZ29yaXRobSBzb2NrZXRzCQkqLwogI2RlZmluZSBBRl9ORkMJCTM5CS8qIE5GQyBzb2NrZXRzCQkJKi8KLSNkZWZpbmUgQUZfTUFYCQk0MAkvKiBGb3Igbm93Li4gKi8KKyNkZWZpbmUgQUZfQ09NQQkJNDAJLyogQ09NQSBzb2NrZXRzCQkJKi8KKyNkZWZpbmUgQUZfTUFYCQk0MQkvKiBGb3Igbm93Li4gKi8KKworCiAKIC8qIFByb3RvY29sIGZhbWlsaWVzLCBzYW1lIGFzIGFkZHJlc3MgZmFtaWxpZXMuICovCiAjZGVmaW5lIFBGX1VOU1BFQwlBRl9VTlNQRUMKQEAgLTIzOCw4ICsyNDEsMTAgQEAKICNkZWZpbmUgUEZfQ0FJRgkJQUZfQ0FJRgogI2RlZmluZSBQRl9BTEcJCUFGX0FMRwogI2RlZmluZSBQRl9ORkMJCUFGX05GQworI2RlZmluZSBQRl9DT01BCQlBRl9DT01BCiAjZGVmaW5lIFBGX01BWAkJQUZfTUFYCiAKKwogLyogTWF4aW11bSBxdWV1ZSBsZW5ndGggc3BlY2lmaWFibGUgYnkgbGlzdGVuLiAgKi8KICNkZWZpbmUgU09NQVhDT05OCTEyOAogCkBAIC0yNjYsNiArMjcxLDEwIEBACiAjZGVmaW5lIE1TR19NT1JFCTB4ODAwMAkvKiBTZW5kZXIgd2lsbCBzZW5kIG1vcmUgKi8KICNkZWZpbmUgTVNHX1dBSVRGT1JPTkUJMHgxMDAwMAkvKiByZWN2bW1zZygpOiBibG9jayB1bnRpbCAxKyBwYWNrZXRzIGF2YWlsICovCiAjZGVmaW5lIE1TR19TRU5EUEFHRV9OT1RMQVNUIDB4MjAwMDAgLyogc2VuZHBhZ2UoKSBpbnRlcm5hbCA6IG5vdCB0aGUgbGFzdCBwYWdlICovCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fSU1QUk9WRURfU1BMSUNFKQorI2RlZmluZSBNU0dfS0VSTlNQQUNFICAgMHg0MDAwMAorI2RlZmluZSBNU0dfTk9DQVRDSFNJRwkweDgwMDAwCisjZW5kaWYKICNkZWZpbmUgTVNHX0VPRiAgICAgICAgIE1TR19GSU4KIAogI2RlZmluZSBNU0dfQ01TR19DTE9FWEVDIDB4NDAwMDAwMDAJLyogU2V0IGNsb3NlX29uX2V4aXQgZm9yIGZpbGUKQEAgLTMzMiw2ICszNDEsOSBAQAogCQkJICAgICBpbnQgb2Zmc2V0LCBpbnQgbGVuKTsKIGV4dGVybiBpbnQgbW92ZV9hZGRyX3RvX2tlcm5lbCh2b2lkIF9fdXNlciAqdWFkZHIsIGludCB1bGVuLCBzdHJ1Y3Qgc29ja2FkZHIgKmthZGRyKTsKIGV4dGVybiBpbnQgcHV0X2Ntc2coc3RydWN0IG1zZ2hkciosIGludCBsZXZlbCwgaW50IHR5cGUsIGludCBsZW4sIHZvaWQgKmRhdGEpOworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0lNUFJPVkVEX1NQTElDRSkKK2V4dGVybiB2b2lkIG1lbWNweV90b2tlcm5lbGlvdmVjKHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBjaGFyICprZGF0YSwgaW50IGxlbik7CisjZW5kaWYKIAogc3RydWN0IHRpbWVzcGVjOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9jb21jZXJ0b19zcGkuaCBiL2luY2x1ZGUvbGludXgvc3BpL2NvbWNlcnRvX3NwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjVkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9jb21jZXJ0b19zcGkuaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL3NwaS9idXNzZXMvY29tY2VydG9fc3BpLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpZm5kZWYgX0NPTUNFUlRPX1NQSV9ICisjZGVmaW5lIF9DT01DRVJUT19TUElfSAorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKy8vI2luY2x1ZGUgPGFzbS1hcm0vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIGNvbWNlcnRvX1NQSV9OQU1FICJjb21jZXJ0b19zcGkiCisKKyNkZWZpbmUgQ0ZHX0haX0NMT0NLICAgICAgICAgICAgMTY1MDAwMDAwICAgICAgIC8qIDE2NSBNSHogKi8KKyNkZWZpbmUgU1BJX0JBU0VBRERSICAgICAgICAgICAgQ09NQ0VSVE9fQVBCX1NQSV9CQVNFCisKKyNkZWZpbmUgU1BJX0JBVURSX01JTiAgICAgICAgICAgMgorI2RlZmluZSBTUElfQkFVRFJfTUFYICAgICAgICAgICAweEZGRkUKKyNkZWZpbmUgU1BJX1NQRUVEX01BWCAgICAgICAgICAgKDQqMTAwMCoxMDAwKQorI2RlZmluZSBTUElfU1BFRURfTUlOICAgICAgICAgICAwIC8qbmVlZCB0byBiZSBjYWxjdWxhdGVkIHVzaW5nIGMyayBwbGwgYnVzIGNsb2NrKi8KKyNkZWZpbmUgU1BJX0ZSQU1FX1NJWkVfTUlOICAgICAgNAorI2RlZmluZSBTUElfRlJBTUVfU0laRV9NQVggICAgICAxNgorI2RlZmluZSBTUElfQ0hJUF9TRUxFQ1RfTUFYICAgICAxNQorCitzdHJ1Y3QgY29tY2VydG9fc3BpX3BsYXRmb3JtIHsKKyAgICBpbnQgICAgICpjaGlwc2VsZWN0OworICAgIGludCAgIG51bV9jaGlwc2VsZWN0OworICAgIHU4ICBiaXRzX3Blcl93b3JkOworICAgIHU4IG51bV9kZXZpY2VzOworICAgIHVuc2lnbmVkIGxvbmcgbWluX3NjX3JhdGU7ICAgICAgLyogbWF4aW11bSBzdXBwb3J0ZWQgc2VyaWFsIGNsb2NrIHJhdGUgKGluIE1IeikgKi8KKyAgICB1bnNpZ25lZCBsb25nIG1heF9zY19yYXRlOyAgICAgIC8qIG1pbmltdW0gc3VwcG9ydGVkIHNlcmlhbCBjbG9jayByYXRlIChpbiBNSHopICovCisKKyAgICB1OCBtYXhfZnM7ICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gc3VwcG9ydGVkIGZyYW1lIHNpemUgKGluIGJpdHMpICovCisgICAgdTggbWluX2ZzOyAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIHN1cHBvcnRlZCBmcmFtZSBzaXplIChpbiBiaXRzKSAqLworCisgICAgdTE2IG1heF9uZnJhbWU7ICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIHN1cHBvcnRlZCB0cmFuc2ZlciBmcmFtZSBudW1iZXIgKi8KKyAgICB1MTYgbWluX25mcmFtZTsgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gc3VwcG9ydGVkIHRyYW5zZmVyIGZyYW1lIG51bWJlciAqLworCisgICAgdTE2IGNzX21zazsKKyAgICB1bnNpZ25lZCBsb25nIGNsb2NrX3JhdGU7CisKKyAgICBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmRldmljZXM7Cit9OworCitzdHJ1Y3QgY29tY2VydG9fdHJhbnNmZXIKK3sKKyAgICB1OCAqd2J1ZjsKKyAgICB1bnNpZ25lZCBpbnQgd2xlbjsKKworICAgIHU4ICpyYnVmOworICAgIHVuc2lnbmVkIGludCBybGVuOworCisgICAgdTggbW9kZTsKKworICAgIHUzMiBjdHJscjA7CisKKyAgICB1OCBiaXRzX3Blcl93b3JkOworICAgIHUzMiBiYXVkcjsKKyAgICB1MzIgc2VyOworCisgICAgdTggZnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cmFuc2ZlciBmcmFtZSBzaXplIChpbiBiaXRzKSAqLworfTsKKworc3RydWN0IHNwaV9jbGllbnRfY29uZgoreworICAgIHUxNiBjc19tc2s7ICAgICAgICAgICAgICAgICAgICAgLyogY2hpcCBzZWxlY3QgbWFzayBmb3IgdGhpcyBjbGllbnQgKi8KKyAgICB1OCBzY19wb2xhcml0eTsgICAgICAgICAgICAgICAgIC8qIHNlcmlhbCBjbG9jayBwb2xhcml0eSAqLworICAgIHU4IHNjX3BoYXNlOyAgICAgICAgICAgICAgICAgICAgLyogc2VyaWFsIGNsb2NrIHBoYXNlICovCisgICAgdW5zaWduZWQgbG9uZyBzY19yYXRlOyAgICAgICAgICAvKiBzZXJpYWwgY2xvY2sgcmF0ZSAoaW4gTUh6KSovCisgICAgdTggY3NfZGVsYXk7ICAgICAgICAgICAgICAgICAgICAvKiBjaGlwIHNlbGVjdCBkZWFzc2VydCB0aW1lIChpbiBzZXJpYWwgY2xvY2sgY3ljbGVzKSAqLworfTsKKworI2RlZmluZSBDT01DRVJUT19TUElfQ1RSTFIwICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBDT01DRVJUT19TUElfQ1RSTFIxICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBDT01DRVJUT19TUElfU1NJRU5SICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBDT01DRVJUT19TUElfTVdDUiAgICAgICAgICAgICAgICAgMHgwQworI2RlZmluZSBDT01DRVJUT19TUElfU0VSICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBDT01DRVJUT19TUElfQkFVRFIgICAgICAgICAgICAgICAgMHgxNAorI2RlZmluZSBDT01DRVJUT19TUElfVFhGVExSICAgICAgICAgICAgICAgMHgxOAorI2RlZmluZSBDT01DRVJUT19TUElfUlhGVExSICAgICAgICAgICAgICAgMHgxQworI2RlZmluZSBDT01DRVJUT19TUElfVFhGTFIgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBDT01DRVJUT19TUElfUlhGTFIgICAgICAgICAgICAgICAgMHgyNAorI2RlZmluZSBDT01DRVJUT19TUElfU1IgICAgICAgICAgICAgICAgICAgMHgyOAorI2RlZmluZSBDT01DRVJUT19TUElfSU1SICAgICAgICAgICAgICAgICAgMHgyQworI2RlZmluZSBDT01DRVJUT19TUElfSVNSICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBDT01DRVJUT19TUElfUklTUiAgICAgICAgICAgICAgICAgMHgzNAorI2RlZmluZSBDT01DRVJUT19TUElfVFhPSUNSICAgICAgICAgICAgICAgMHgzOAorI2RlZmluZSBDT01DRVJUT19TUElfUlhPSUNSICAgICAgICAgICAgICAgMHgzQworI2RlZmluZSBDT01DRVJUT19TUElfUlhVSUNSICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBDT01DRVJUT19TUElfTVNUSUNSICAgICAgICAgICAgICAgMHg0NAorI2RlZmluZSBDT01DRVJUT19TUElfSUNSICAgICAgICAgICAgICAgICAgMHg0OAorI2RlZmluZSBDT01DRVJUT19TUElfSURSICAgICAgICAgICAgICAgICAgMHg1OAorI2RlZmluZSBDT01DRVJUT19TUElfRFIgICAgICAgICAgICAgICAgICAgMHg2MAorCisKKy8qIFNSIC0gc3RhdHVzIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgQlVTWQkJKDE8PDApCS8qIFNTSSBidXN5IGZsYWcsIHNlcmlhbCB0cmFuc2ZlciBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBURk5GCQkoMTw8MSkJLyogVHJhbnNtaXQgRklGTyBub3QgZnVsbCAqLworI2RlZmluZSBURkUJCSgxPDwyKQkvKiBUcmFuc21pdCBGSUZPIGVtcHR5ICovCisjZGVmaW5lIFJGTkUJCSgxPDwzKQkvKiBSZWNlaXZlIEZJRk8gbm90IGVtcHR5ICovCisjZGVmaW5lIFJGRgkJKDE8PDQpCS8qIFJlY2VpdmUgRklGTyBmdWxsICovCisjZGVmaW5lIFRYRQkJKDE8PDUpCS8qIFRyYW5zbWlzc2lvbiBlcnJvciAqLworI2RlZmluZSBEQ09MCQkoMTw8NikJLyogRGF0YSBjb2xsaXNpb24gZXJyb3IgKi8KKworLyogSW50ZXJydXB0IHN0YXR1cyBhZnRlciBiZWluZyBtYXNrZWQgKi8KKyNkZWZpbmUgVFhFSVMJCSgxPDwwKQkvKiBUcmFuc21pdCBGSUZPIGVtcHR5IGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgVFhPSVMJCSgxPDwxKQkvKiBUcmFuc21pdCBGSUZPIG92ZXJmbG93IGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgUlhVSVMJCSgxPDwyKQkvKiBSZWNlaXZlIEZJRk8gdW5kZXJmbG93IGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgUlhPSVMJCSgxPDwzKQkvKiBSZWNlaXZlIEZJRk8gb3ZlcmZsb3cgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSWEZJUwkJKDE8PDQpCS8qIFJlY2VpdmUgRklGTyBmdWxsIGludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgTVNUSVMJCSgxPDw1KQkvKiBNdWx0aS1NYXN0ZXIgY29udGVudGlvbiBpbnRlcnJ1cHQgc3RhdHVzICovCisKKy8qIEludGVycnVwdCBzdGF0dXMgYmVmb3JlIGJlaW5nIG1hc2tlZCAqLworI2RlZmluZSBUWEVJUgkJKDE8PDApCS8qIFRyYW5zbWl0IEZJRk8gZW1wdHkgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBUWE9JUgkJKDE8PDEpCS8qIFRyYW5zbWl0IEZJRk8gb3ZlcmZsb3cgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSWFVJUgkJKDE8PDIpCS8qIFJlY2VpdmUgRklGTyB1bmRlcmZsb3cgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSWE9JUgkJKDE8PDMpCS8qIFJlY2VpdmUgRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFJYRklSCQkoMTw8NCkJLyogUmVjZWl2ZSBGSUZPIGZ1bGwgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBNU1RJUgkJKDE8PDUpCS8qIE11bHRpLU1hc3RlciBjb250ZW50aW9uIGludGVycnVwdCBzdGF0dXMgKi8KKworCisvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLworI2RlZmluZSBUWEVJTQkJKDE8PDApCS8qIFRyYW5zbWl0IEZJRk8gZW1wdHkgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBUWE9JTQkJKDE8PDEpCS8qIFRyYW5zbWl0IEZJRk8gb3ZlcmZsb3cgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSWFVJTQkJKDE8PDIpCS8qIFJlY2VpdmUgRklGTyB1bmRlcmZsb3cgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBSWE9JTQkJKDE8PDMpCS8qIFJlY2VpdmUgRklGTyBvdmVyZmxvdyBpbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFJYRklNCQkoMTw8NCkJLyogUmVjZWl2ZSBGSUZPIGZ1bGwgaW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBNU1RJTQkJKDE8PDUpCS8qIE11bHRpLU1hc3RlciBjb250ZW50aW9uIGludGVycnVwdCBzdGF0dXMgKi8KKworCisjZGVmaW5lIFNQSV9UUkFOU0ZFUl9NT0RFX1dSSVRFX09OTFkJMHgwMQorI2RlZmluZSBTUElfVFJBTlNGRVJfTU9ERV9SRUFEX09OTFkJMHgwMgorI2RlZmluZSBTUElfVFJBTlNGRVJfTU9ERV9XUklURV9SRUFECTB4MDMKKwordHlwZWRlZiB1OAl1NDsKKworc3RydWN0IHNwaV9sb2NhbF90cmFuc2ZlcgoreworCXU4ICp3YnVmOworCXVuc2lnbmVkIGludCB3bGVuOworCisJdTggKnJidWY7CisJdW5zaWduZWQgaW50IHJsZW47CisKKwl1OCBtb2RlOworCisJdTggZnM7CQkJCS8qIHRyYW5zZmVyIGZyYW1lIHNpemUgKGluIGJpdHMpICovCit9OworCitzdHJ1Y3Qgc3BpX2FkYXB0ZXJfY2FwcworeworCXVuc2lnbmVkIGxvbmcgbWluX3NjX3JhdGU7CS8qIG1heGltdW0gc3VwcG9ydGVkIHNlcmlhbCBjbG9jayByYXRlIChpbiBNSHopICovCisJdW5zaWduZWQgbG9uZyBtYXhfc2NfcmF0ZTsJLyogbWluaW11bSBzdXBwb3J0ZWQgc2VyaWFsIGNsb2NrIHJhdGUgKGluIE1IeikgKi8KKworCXU4IG1heF9mczsJCQkvKiBtYXhpbXVtIHN1cHBvcnRlZCBmcmFtZSBzaXplIChpbiBiaXRzKSAqLworCXU4IG1pbl9mczsJCQkvKiBtaW5pbXVtIHN1cHBvcnRlZCBmcmFtZSBzaXplIChpbiBiaXRzKSAqLworCisJdTE2IGNzX21zazsJCQkvKiBtYXNrIG9mIHN1cHBvcnRlZCBjaGlwIHNlbGVjdHMgKi8KKworCXUxNiBtYXhfbmZyYW1lOwkJCS8qIG1heGltdW0gc3VwcG9ydGVkIHRyYW5zZmVyIGZyYW1lIG51bWJlciAqLworCXUxNiBtaW5fbmZyYW1lOwkJCS8qIG1pbmltdW0gc3VwcG9ydGVkIHRyYW5zZmVyIGZyYW1lIG51bWJlciAqLworfTsKKworc3RydWN0IHNwaV9jbGllbnRfY29uZmlnCit7CisJdTE2IGNzX21zazsJCQkvKiBjaGlwIHNlbGVjdCBtYXNrIGZvciB0aGlzIGNsaWVudCAqLworCXU4IHNjX3BvbGFyaXR5OwkJCS8qIHNlcmlhbCBjbG9jayBwb2xhcml0eSAqLworCXU4IHNjX3BoYXNlOwkJCS8qIHNlcmlhbCBjbG9jayBwaGFzZSAqLworCXVuc2lnbmVkIGxvbmcgc2NfcmF0ZTsJCS8qIHNlcmlhbCBjbG9jayByYXRlIChpbiBNSHopKi8KKwl1OCBjc19kZWxheTsJCQkvKiBjaGlwIHNlbGVjdCBkZWFzc2VydCB0aW1lIChpbiBzZXJpYWwgY2xvY2sgY3ljbGVzKSAqLworfTsKKworLyogQSBTUEkgYnVzIGFkYXB0ZXIgaW5zdGFuY2UgKi8KK3N0cnVjdCBzcGlfYWRhcHRlcgoreworCWNoYXIgKm5hbWU7CisKKwlpbnQgKCpkb190cmFuc2Zlcikoc3RydWN0IHNwaV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc3BpX2xvY2FsX3RyYW5zZmVyICp0cmFuc2Zlciwgc3RydWN0IHNwaV9jbGllbnRfY29uZmlnICpjb25maWcpOworCisJdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBsb25nIG1lbWJhc2U7CisJdW5zaWduZWQgbG9uZyBjbG9ja19yYXRlOwkKKworCXN0cnVjdCBsaXN0X2hlYWQgY2xpZW50czsKKworCXN0cnVjdCBzcGlfYWRhcHRlcl9jYXBzIGNhcHM7CisKKwlzdHJ1Y3Qgc3BpX21hc3RlciAgICAgICBtYXN0ZXI7Cit9OworCisvKiBBIFNQSSBkZXZpY2UgaW5zdGFuY2UgKi8KK3N0cnVjdCBzcGlfY2xpZW50Cit7CisJc3RydWN0IHNwaV9jbGllbnRfY29uZmlnIGNvbmZpZzsKKwlzdHJ1Y3Qgc3BpX2FkYXB0ZXIgKmFkYXB0ZXI7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisvL2ludCBzcGlfd3JpdGVyZWFkX21lbShzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1OCBmcywgdTggKnJidWZmZXIsIGludCBybGVuLCB1OCAqd2J1ZmZlciwgaW50IHdsZW4pOworaW50IHNwaV93cml0ZXJlYWRfbWVtKHN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlciwgdTggZnMsIHU4ICpyYnVmZmVyLCBpbnQgcmxlbiwgdTggKndidWZmZXIsIGludCB3bGVuKTsKKworCisjZW5kaWYgLyogX0NPTUNFUlRPX1NQSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9kZXNpZ253YXJlLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9kZXNpZ253YXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwMzM1YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL2Rlc2lnbndhcmUuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogZGVzaWdud2FyZS5oIC0gcGxhdGZvcm0gZ2x1ZSBmb3IgdGhlIFN5bm9wc3lzIERlc2lnbldhcmUgU1BJIGNvbnRyb2xsZXIKKyAqLworCisjZGVmaW5lICAgICAgICBDTEtfTkFNRSAgICAgICAxMAorI2RlZmluZSAgICAgICAgVFhfRklGT19ERVBUSCAgOAorI2RlZmluZSAgICAgICAgUlhfRklGT19ERVBUSCAgOAorCitzdHJ1Y3Qgc3BpX2NvbnRyb2xsZXJfcGRhdGEgeworCWludCB1c2VfZG1hOworCWludCBudW1fY2hpcHNlbGVjdHM7CisJaW50IGJ1c19udW07CisJdTMyIG1heF9mcmVxOworCWNoYXIgY2xrX25hbWVbQ0xLX05BTUVdOworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpMi9zcGkuaCBiL2luY2x1ZGUvbGludXgvc3BpMi9zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2JhMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zcGkyL3NwaS5oCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvc3BpLmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSBNaW5kc3BlZWQgVGVjaG5vbG9naWVzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKyNpZm5kZWYgX1NQSV9ICisjZGVmaW5lIF9TUElfSAorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjZW5kaWYKKworI2RlZmluZSBTUElfVFJBTlNGRVJfTU9ERV9XUklURV9PTkxZCTB4MDEKKyNkZWZpbmUgU1BJX1RSQU5TRkVSX01PREVfUkVBRF9PTkxZCTB4MDIKKyNkZWZpbmUgU1BJX1RSQU5TRkVSX01PREVfV1JJVEVfUkVBRAkweDAzCisKK3R5cGVkZWYgdTgJdTQ7CisKK3N0cnVjdCBzcGlfdHJhbnNmZXIKK3sKKwl1OCAqd2J1ZjsKKwl1bnNpZ25lZCBpbnQgd2xlbjsKKworCXU4ICpyYnVmOworCXVuc2lnbmVkIGludCBybGVuOworCisJdTggbW9kZTsKKworCXU4IGZzOwkJCQkvKiB0cmFuc2ZlciBmcmFtZSBzaXplIChpbiBiaXRzKSAqLworfTsKKworc3RydWN0IHNwaV9hZGFwdGVyX2NhcHMKK3sKKwl1bnNpZ25lZCBsb25nIG1pbl9zY19yYXRlOwkvKiBtYXhpbXVtIHN1cHBvcnRlZCBzZXJpYWwgY2xvY2sgcmF0ZSAoaW4gTUh6KSAqLworCXVuc2lnbmVkIGxvbmcgbWF4X3NjX3JhdGU7CS8qIG1pbmltdW0gc3VwcG9ydGVkIHNlcmlhbCBjbG9jayByYXRlIChpbiBNSHopICovCisKKwl1OCBtYXhfZnM7CQkJLyogbWF4aW11bSBzdXBwb3J0ZWQgZnJhbWUgc2l6ZSAoaW4gYml0cykgKi8KKwl1OCBtaW5fZnM7CQkJLyogbWluaW11bSBzdXBwb3J0ZWQgZnJhbWUgc2l6ZSAoaW4gYml0cykgKi8KKworCXUxNiBjc19tc2s7CQkJLyogbWFzayBvZiBzdXBwb3J0ZWQgY2hpcCBzZWxlY3RzICovCisKKwl1MTYgbWF4X25mcmFtZTsJCQkvKiBtYXhpbXVtIHN1cHBvcnRlZCB0cmFuc2ZlciBmcmFtZSBudW1iZXIgKi8KKwl1MTYgbWluX25mcmFtZTsJCQkvKiBtaW5pbXVtIHN1cHBvcnRlZCB0cmFuc2ZlciBmcmFtZSBudW1iZXIgKi8KK307CisKK3N0cnVjdCBzcGlfY2xpZW50X2NvbmZpZworeworCXUxNiBjc19tc2s7CQkJLyogY2hpcCBzZWxlY3QgbWFzayBmb3IgdGhpcyBjbGllbnQgKi8KKwl1OCBzY19wb2xhcml0eTsJCQkvKiBzZXJpYWwgY2xvY2sgcG9sYXJpdHkgKi8KKwl1OCBzY19waGFzZTsJCQkvKiBzZXJpYWwgY2xvY2sgcGhhc2UgKi8KKwl1bnNpZ25lZCBsb25nIHNjX3JhdGU7CQkvKiBzZXJpYWwgY2xvY2sgcmF0ZSAoaW4gTUh6KSovCisJdTggY3NfZGVsYXk7CQkJLyogY2hpcCBzZWxlY3QgZGVhc3NlcnQgdGltZSAoaW4gc2VyaWFsIGNsb2NrIGN5Y2xlcykgKi8KKwl1bnNpZ25lZCBsb25nIGJhX2RlbGF5OyAJLyogYnVzIGFjY2VzcyBkZWxheSwgaW4gdXMgKi8KK307CisKKy8qIEEgU1BJIGJ1cyBhZGFwdGVyIGluc3RhbmNlICovCitzdHJ1Y3Qgc3BpX2FkYXB0ZXIKK3sKKwljaGFyICpuYW1lOworCisJaW50ICgqZG9fdHJhbnNmZXIpKHN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnNmZXIsIHN0cnVjdCBzcGlfY2xpZW50X2NvbmZpZyAqY29uZmlnKTsKKworCXZvaWQgKmRhdGE7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorCXN0cnVjdCBkZXZpY2UgZGV2OworI2VuZGlmCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBsaXN0X2hlYWQgY2xpZW50czsKKworCXN0cnVjdCBzcGlfYWRhcHRlcl9jYXBzIGNhcHM7CisKKwlpbnQgYnVzX251bTsKKworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qIEEgU1BJIGRldmljZSBpbnN0YW5jZSAqLworc3RydWN0IHNwaV9jbGllbnQKK3sKKwlzdHJ1Y3Qgc3BpX2NsaWVudF9jb25maWcgY29uZmlnOworCisJc3RydWN0IHNwaV9kcml2ZXIgKmRyaXZlcjsKKworCXN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlcjsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisJc3RydWN0IGRldmljZSBkZXY7CisjZWxzZQorCXZvaWQgKmRhdGE7CisjZW5kaWYKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisvKiBBIFNQSSBkZXZpY2UgZHJpdmVyICovCitzdHJ1Y3Qgc3BpX2RyaXZlciB7CisJY2hhciAqbmFtZTsKKworCWludCAoKmF0dGFjaF9hZGFwdGVyKShzdHJ1Y3Qgc3BpX2FkYXB0ZXIgKmFkYXB0ZXIpOworCWludCAoKmRldGFjaF9jbGllbnQpKHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQpOworI2lmZGVmIENPTkZJR19QTQorCWludCAoKnN1c3BlbmQpKHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50KTsKKyNlbmRpZgorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKKyNlbmRpZgorCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzaG9ydCBidXNfaWQ7Cit9OworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwwKQorc3RhdGljIGlubGluZSB2b2lkICpzcGlfZ2V0X2NsaWVudGRhdGEgKHN0cnVjdCBzcGlfY2xpZW50ICpkZXYpCit7CisJcmV0dXJuIGRldl9nZXRfZHJ2ZGF0YSAoJmRldi0+ZGV2KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNwaV9zZXRfY2xpZW50ZGF0YSAoc3RydWN0IHNwaV9jbGllbnQgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlkZXZfc2V0X2RydmRhdGEgKCZkZXYtPmRldiwgZGF0YSk7IAorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3BpX2dldF9jbGllbnRkYXRhIChzdHJ1Y3Qgc3BpX2NsaWVudCAqZGV2KQoreworCXJldHVybiAodm9pZCAqKSBkZXYtPmRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfc2V0X2NsaWVudGRhdGEgKHN0cnVjdCBzcGlfY2xpZW50ICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2LT5kYXRhID0gZGF0YTsKK30KKyNlbmRpZgorCitpbnQgc3BpX2FkZF9hZGFwdGVyKHN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlcik7CitpbnQgc3BpX2RlbF9hZGFwdGVyKHN0cnVjdCBzcGlfYWRhcHRlciAqYWRhcHRlcik7CisKK2ludCBzcGlfYWRkX2RyaXZlcihzdHJ1Y3Qgc3BpX2RyaXZlciAqZHJpdmVyKTsKK2ludCBzcGlfZGVsX2RyaXZlcihzdHJ1Y3Qgc3BpX2RyaXZlciAqZHJpdmVyKTsKKworaW50IHNwaV9hdHRhY2hfY2xpZW50KHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQpOworaW50IHNwaV9kZXRhY2hfY2xpZW50KHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQpOworCitpbnQgc3BpX3dyaXRlX21lbShzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1OCBmcywgdTggKmJ1ZmZlciwgaW50IGxlbik7CitpbnQgc3BpX3dyaXRlX3NpbmdsZShzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1OCBmcywgdTE2IHZhbHVlKTsKKworaW50IHNwaV93cml0ZW4oc3RydWN0IHNwaV9jbGllbnQgKmNsaWVudCwgdTQgdmFsdWUpOworaW50IHNwaV93cml0ZWIoc3RydWN0IHNwaV9jbGllbnQgKmNsaWVudCwgdTggdmFsdWUpOworaW50IHNwaV93cml0ZXcoc3RydWN0IHNwaV9jbGllbnQgKmNsaWVudCwgdTE2IHZhbHVlKTsKKworaW50IHNwaV9yZWFkX21lbShzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1OCBmcywgdTggKmJ1ZmZlciwgaW50IGxlbik7CitpbnQgc3BpX3JlYWRfc2luZ2xlKHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQsIHU4IGZzLCB1MTYgKnZhbHVlKTsKK2ludCBzcGlfd3JpdGVyZWFkX21lbShzdHJ1Y3Qgc3BpX2NsaWVudCAqY2xpZW50LCB1OCBmcywgdTggKnJidWZmZXIsIGludCBybGVuLCB1OCAqd2J1ZmZlciwgaW50IHdsZW4pOworCitpbnQgc3BpX3JlYWRuKHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQsIHU0ICp2YWx1ZSk7CitpbnQgc3BpX3JlYWRiKHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQsIHU4ICp2YWx1ZSk7CitpbnQgc3BpX3JlYWR3KHN0cnVjdCBzcGlfY2xpZW50ICpjbGllbnQsIHUxNiAqdmFsdWUpOworCisjZW5kaWYgLyogX1NQSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9mbG93LmggYi9pbmNsdWRlL25ldC9mbG93LmgKaW5kZXggMmE3ZWVmZC4uMmI0YWRiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZmxvdy5oCisrKyBiL2luY2x1ZGUvbmV0L2Zsb3cuaApAQCAtMjEyLDkgKzIxMiwxNyBAQAogCQlzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBmbG93aSAqa2V5LCB1MTYgZmFtaWx5LAogCQl1OCBkaXIsIHN0cnVjdCBmbG93X2NhY2hlX29iamVjdCAqb2xkb2JqLCB2b2lkICpjdHgpOwogCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorZXh0ZXJuIHN0cnVjdCBmbG93X2NhY2hlX29iamVjdCAqZmxvd19jYWNoZV9sb29rdXAoCisJCXN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IGZsb3dpICprZXksIHUxNiBmYW1pbHksCisJCXU4IGRpciwgdTggKm5ld19mbG93LCBmbG93X3Jlc29sdmVfdCByZXNvbHZlciwgdm9pZCAqY3R4KTsKK2V4dGVybiB2b2lkIGZsb3dfY2FjaGVfcmVtb3ZlKAorCQkJCWNvbnN0IHN0cnVjdCBmbG93aSAqZmwsIHVuc2lnbmVkIHNob3J0IGZhbWlseSwgdW5zaWduZWQgc2hvcnQgZGlyKTsKKyNlbHNlCiBleHRlcm4gc3RydWN0IGZsb3dfY2FjaGVfb2JqZWN0ICpmbG93X2NhY2hlX2xvb2t1cCgKIAkJc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmtleSwgdTE2IGZhbWlseSwKIAkJdTggZGlyLCBmbG93X3Jlc29sdmVfdCByZXNvbHZlciwgdm9pZCAqY3R4KTsKKyNlbmRpZgogCiBleHRlcm4gdm9pZCBmbG93X2NhY2hlX2ZsdXNoKHZvaWQpOwogZXh0ZXJuIHZvaWQgZmxvd19jYWNoZV9mbHVzaF9kZWZlcnJlZCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwLmggYi9pbmNsdWRlL25ldC9pcC5oCmluZGV4IGVjYTBlZjcuLjY2MTZiYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwLmgKKysrIGIvaW5jbHVkZS9uZXQvaXAuaApAQCAtNDA4LDYgKzQwOCw3IEBACiAJSVBfREVGUkFHX1ZTX0ZXRCwKIAlJUF9ERUZSQUdfQUZfUEFDS0VULAogCUlQX0RFRlJBR19NQUNWTEFOLAorCUlQX0RFRlJBR19JUDZfVE5MXzRSRCAvKiBVc2VkIHRvIHN1cHBvcnQgUG9zdCBGcmFnbWVudGF0aW9uIGZvciA0bzYgdHVubmVscyAqLwogfTsKIAogaW50IGlwX2RlZnJhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgdXNlcik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfdHVubmVsLmggYi9pbmNsdWRlL25ldC9pcDZfdHVubmVsLmgKaW5kZXggZmM3M2U2Ni4uNjgyMDVkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXA2X3R1bm5lbC5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl90dW5uZWwuaApAQCAtMTksNiArMTksMTAgQEAKIAlzdHJ1Y3QgZmxvd2kgZmw7CS8qIGZsb3dpIHRlbXBsYXRlIGZvciB4bWl0ICovCiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0X2NhY2hlOyAgICAvKiBjYWNoZWQgZHN0ICovCiAJdTMyIGRzdF9jb29raWU7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwl1MzIgZ2VuaWQ7CisjZW5kaWYKKyAgICAgICBzdHJ1Y3QgaXA2X3RubF80cmRfcGFybSBpcDRyZDsgLyogNHJkIHBhcmFtZXRlcnMgZm9yIHRoZSB0dW5uZWwgKi8gCiB9OwogCiAvKiBUdW5uZWwgZW5jYXBzdWxhdGlvbiBsaW1pdCBkZXN0aW5hdGlvbiBzdWItb3B0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKaW5kZXggMGI2YTNlOC4uMmEzOTY4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaApAQCAtMTAwLDYgKzEwMCwxNCBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9jb25udHJhY2tfaXB2NC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9jb25udHJhY2tfaXB2Ni5oPgogCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRlApCitzdHJ1Y3QgY29tY2VydG9fZnBfaW5mbyB7CisJaW50IGlmaW5kZXg7CisJaW50IGlpZjsKKwl1MzIgbWFyazsKK307CisjZW5kaWYKKwogc3RydWN0IG5mX2Nvbm4gewogCS8qIFVzYWdlIGNvdW50IGluIGhlcmUgaXMgMSBmb3IgaGFzaCB0YWJsZS9kZXN0cnVjdCB0aW1lciwgMSBwZXIgc2tiLAogICAgICAgICAgICBwbHVzIDEgZm9yIGFueSBjb25uZWN0aW9uKHMpIHdlIGFyZSBgbWFzdGVyJyBmb3IgKi8KQEAgLTEyOCw2ICsxMzYsMTAgQEAKIAl1X2ludDMyX3Qgc2VjbWFyazsKICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRlApCisJc3RydWN0IGNvbWNlcnRvX2ZwX2luZm8gZnBfaW5mb1tJUF9DVF9ESVJfTUFYXTsKKyNlbmRpZgorCiAJLyogRXh0ZW5zaW9ucyAqLwogCXN0cnVjdCBuZl9jdF9leHQgKmV4dDsKICNpZmRlZiBDT05GSUdfTkVUX05TCkBAIC0zMzEsNiArMzQzLDkgQEAKIAogc3RydWN0IGtlcm5lbF9wYXJhbTsKIAorZXh0ZXJuIGludCBuZl9jb25udHJhY2tfc2V0X2RwaV9hbGxvd19yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gaW50IG5mX2Nvbm50cmFja19zZXRfZHBpX2FsbG93X2FuZF9tYXJrKHN0cnVjdCBza19idWZmICpza2IsIGludCBtYXJrKTsKKwogZXh0ZXJuIGludCBuZl9jb25udHJhY2tfc2V0X2hhc2hzaXplKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApOwogZXh0ZXJuIHVuc2lnbmVkIGludCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7CiBleHRlcm4gdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19tYXg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oCmluZGV4IGFjZWQwODUuLmY4ZmIyNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oCkBAIC03Niw0ICs3Niw4IEBACiAKIGV4dGVybiBzcGlubG9ja190IG5mX2Nvbm50cmFja19sb2NrIDsKIAorI2lmZGVmIENPTkZJR19DT01DRVJUT19GUAorI2RlZmluZSBDT01DRVJUT19QRVJNQU5FTlRfVElNRU9VVAkxMDAwCisjZW5kaWYKKwogI2VuZGlmIC8qIF9ORl9DT05OVFJBQ0tfQ09SRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaAppbmRleCBhODhmYjY5Li5lYTZmOGE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAl1MTYgY3RtYXNrOwkJLyogYml0bWFzayBvZiBjdCBldmVudHMgdG8gYmUgZGVsaXZlcmVkICovCiAJdTE2IGV4cG1hc2s7CQkvKiBiaXRtYXNrIG9mIGV4cGVjdCBldmVudHMgdG8gYmUgZGVsaXZlcmVkICovCiAJdTMyIHBpZDsJCS8qIG5ldGxpbmsgcGlkIG9mIGRlc3Ryb3llciAqLworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldG5zL3hmcm0uaCBiL2luY2x1ZGUvbmV0L25ldG5zL3hmcm0uaAppbmRleCA3NDhmOTFmLi4xOTI5NWU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRucy94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMveGZybS5oCkBAIC0yNyw2ICsyNyw5IEBACiAJc3RydWN0IGhsaXN0X2hlYWQJKnN0YXRlX2J5ZHN0OwogCXN0cnVjdCBobGlzdF9oZWFkCSpzdGF0ZV9ieXNyYzsKIAlzdHJ1Y3QgaGxpc3RfaGVhZAkqc3RhdGVfYnlzcGk7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCXN0cnVjdCBobGlzdF9oZWFkCSpzdGF0ZV9ieWg7CisjZW5kaWYKIAl1bnNpZ25lZCBpbnQJCXN0YXRlX2htYXNrOwogCXVuc2lnbmVkIGludAkJc3RhdGVfbnVtOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlzdGF0ZV9oYXNoX3dvcms7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC91ZHAuaCBiL2luY2x1ZGUvbmV0L3VkcC5oCmluZGV4IDNiMjg1ZjQuLjAwOWM2YjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3VkcC5oCisrKyBiL2luY2x1ZGUvbmV0L3VkcC5oCkBAIC0xOTEsNiArMTkxLDkgQEAKIGV4dGVybiBpbnQgdWRwX2xpYl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCSAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4sCiAJCQkgICAgICBpbnQgKCpwdXNoX3BlbmRpbmdfZnJhbWVzKShzdHJ1Y3Qgc29jayAqKSk7CitleHRlcm4gaW50IAl1ZHA2X2xpYl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuLAorCQkJCSAgIGludCAoKnB1c2hfcGVuZGluZ19mcmFtZXMpKHN0cnVjdCBzb2NrICopKTsKIGV4dGVybiBzdHJ1Y3Qgc29jayAqdWRwNF9saWJfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgX19iZTMyIHNhZGRyLCBfX2JlMTYgc3BvcnQsCiAJCQkJICAgIF9fYmUzMiBkYWRkciwgX19iZTE2IGRwb3J0LAogCQkJCSAgICBpbnQgZGlmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3hmcm0uaCBiL2luY2x1ZGUvbmV0L3hmcm0uaAppbmRleCBiMjAzZTE0Li5hZGQ5MWMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQveGZybS5oCkBAIC0xMzcsNyArMTM3LDEwIEBACiAJfTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlieXNyYzsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlieXNwaTsKLQorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAJYnloOworCXUxNgkJCWhhbmRsZTsKKyNlbmRpZgogCWF0b21pY190CQlyZWZjbnQ7CiAJc3BpbmxvY2tfdAkJbG9jazsKIApAQCAtMjI5LDYgKzIzMiwxMSBAQAogCS8qIFByaXZhdGUgZGF0YSBvZiB0aGlzIHRyYW5zZm9ybWVyLCBmb3JtYXQgaXMgb3BhcXVlLAogCSAqIGludGVycHJldGVkIGJ5IHhmcm1fdHlwZSBtZXRob2RzLiAqLwogCXZvaWQJCQkqZGF0YTsKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJIC8qIEludGVuZGVkIGRpcmVjdGlvbiBvZiB0aGlzIHN0YXRlLCB1c2VkIGZvciBvZmZsb2FkaW5nICovCisJaW50CWRpcjsKKwlpbnQJb2ZmbG9hZGVkOwkKKyNlbmRpZgogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0ICp4c19uZXQoc3RydWN0IHhmcm1fc3RhdGUgKngpCkBAIC0yNDcsNiArMjU1LDEzIEBACiAJWEZSTV9TVEFURV9FWFBJUkVELAogCVhGUk1fU1RBVEVfREVBRAogfTsKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCitlbnVtIHsKKwkgWEZSTV9TVEFURV9ESVJfVU5LTk9XTiwKKwkgWEZSTV9TVEFURV9ESVJfSU4sCisJIFhGUk1fU1RBVEVfRElSX09VVCwKK307CisjZW5kaWYKIAogLyogY2FsbGJhY2sgc3RydWN0dXJlIHBhc3NlZCBmcm9tIGVpdGhlciBuZXRsaW5rIG9yIHBma2V5ICovCiBzdHJ1Y3Qga21fZXZlbnQgewpAQCAtMjk5LDYgKzMxNCw5IEBACiAKIGV4dGVybiBpbnQgeGZybV9wb2xpY3lfcmVnaXN0ZXJfYWZpbmZvKHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbyk7CiBleHRlcm4gaW50IHhmcm1fcG9saWN5X3VucmVnaXN0ZXJfYWZpbmZvKHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbyk7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorZXh0ZXJuIHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKnhmcm1fcG9saWN5X2dldF9hZmluZm8odW5zaWduZWQgc2hvcnQgZmFtaWx5KTsKKyNlbmRpZgogZXh0ZXJuIHZvaWQga21fcG9saWN5X25vdGlmeShzdHJ1Y3QgeGZybV9wb2xpY3kgKnhwLCBpbnQgZGlyLCBjb25zdCBzdHJ1Y3Qga21fZXZlbnQgKmMpOwogZXh0ZXJuIHZvaWQga21fc3RhdGVfbm90aWZ5KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBjb25zdCBzdHJ1Y3Qga21fZXZlbnQgKmMpOwogCkBAIC05NTgsNiArOTc2LDM1IEBACiAJc3RydWN0IHhmcm1fc3RhdGUJKnh2ZWNbWEZSTV9NQVhfREVQVEhdOwogfTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKK3N0cnVjdCB4ZnJtX2lucHV0X3NoYXJlZAoreworCXN0cnVjdCBza19idWZmIAkJKnNrYjsKKwlpbnQgCQkJeGZybV9uciwgZmlyc3QsIHhmcm1fZW5jYXA7CisJc3RydWN0IHhmcm1fc3RhdGUgCSp4ZnJtX3ZlY1tYRlJNX01BWF9ERVBUSF07CisJX191MTYgCQkJZW5jYXBfdHlwZTsKKwlpbnQgCQkJZGVjYXBzOworCXUzMgkJCXNlcSwgc3BpOworCXVuc2lnbmVkIGludCAgIG5ob2ZmOworCWludCAJCQluZXh0aGRyOworCWludCAJCQkoKmNhbGxiYWNrKShzdHJ1Y3QgeGZybV9pbnB1dF9zaGFyZWQgKnNoKTsKKwlhdG9taWNfdAkJcmVmY250OworfTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgeGZybV9zaGFyZWRfZ2V0KHN0cnVjdCB4ZnJtX2lucHV0X3NoYXJlZCAqc2gpCit7CisJYXRvbWljX2luYygmc2gtPnJlZmNudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZnJtX3NoYXJlZF9wdXQoc3RydWN0IHhmcm1faW5wdXRfc2hhcmVkICpzaCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2gtPnJlZmNudCkpIHsKKwkJa2ZyZWUoc2gpOworCX0KK30KKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIGludCBzZWNwYXRoX2V4aXN0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogI2lmZGVmIENPTkZJR19YRlJNCkBAIC0xNDY5LDYgKzE1MTYsMTAgQEAKIGV4dGVybiBpbnQgeGZybTRfdHVubmVsX2RlcmVnaXN0ZXIoc3RydWN0IHhmcm1fdHVubmVsICpoYW5kbGVyLCB1bnNpZ25lZCBzaG9ydCBmYW1pbHkpOwogZXh0ZXJuIGludCB4ZnJtNl9leHRyYWN0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBpbnQgeGZybTZfZXh0cmFjdF9pbnB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisvKiBOQVQtVCBjaGFuZ2VzIFN0YXJ0ICovCitleHRlcm4gaW50IHhmcm02X3Jjdl9lbmNhcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmV4dGhkciwgX19iZTMyIHNwaSwKKwkJCSAgIGludCBlbmNhcF90eXBlKTsKKy8qIE5BVC1UIGNoYW5nZXMgRW5kICovCiBleHRlcm4gaW50IHhmcm02X3Jjdl9zcGkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5leHRoZHIsIF9fYmUzMiBzcGkpOwogZXh0ZXJuIGludCB4ZnJtNl90cmFuc3BvcnRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IsIGludCBhc3luYyk7CiBleHRlcm4gaW50IHhmcm02X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTE0ODcsMTIgKzE1MzgsMjEgQEAKIAogI2lmZGVmIENPTkZJR19YRlJNCiBleHRlcm4gaW50IHhmcm00X3VkcF9lbmNhcF9yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgeGZybTZfdWRwX2VuY2FwX3JjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGludCB4ZnJtX3VzZXJfcG9saWN5KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHU4IF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCB4ZnJtX3VzZXJfcG9saWN5KHN0cnVjdCBzb2NrICpzaywgaW50IG9wdG5hbWUsIHU4IF9fdXNlciAqb3B0dmFsLCBpbnQgb3B0bGVuKQogewogIAlyZXR1cm4gLUVOT1BST1RPT1BUOwogfSAKKy8qIE5BVC1UIGNoYW5nZXMgU3RhcnQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHhmcm02X3VkcF9lbmNhcF9yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIHNob3VsZCBub3QgaGFwcGVuICovCisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisvKiBOQVQtVCBjaGFuZ2VzIEVuZCAqLwogCiBzdGF0aWMgaW5saW5lIGludCB4ZnJtNF91ZHBfZW5jYXBfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9rc3lzZnMuYyBiL2tlcm5lbC9rc3lzZnMuYwppbmRleCA0ZTMxNmUxLi4yMmI0OTliIDEwMDY0NAotLS0gYS9rZXJuZWwva3N5c2ZzLmMKKysrIGIva2VybmVsL2tzeXNmcy5jCkBAIC0xNDEsNiArMTQxLDQ4NCBAQAogfQogS0VSTkVMX0FUVFJfUk8oZnNjYXBzKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX01ETUFfUFJPRikKK2V4dGVybiB1bnNpZ25lZCBpbnQgbWRtYV90aW1lX2NvdW50ZXJbMjU2XTsgLy8gMTYgLT4gNDAwMCB1cworZXh0ZXJuIHVuc2lnbmVkIGludCBtZG1hX3JlcXRpbWVfY291bnRlclsyNTZdOyAvLyAxNiAtPiA0MDAwIHVzCitleHRlcm4gdW5zaWduZWQgaW50IG1kbWFfZGF0YV9jb3VudGVyWzI1Nl07CitleHRlcm4gdW5zaWduZWQgaW50IGluaXRfbWRtYV9wcm9mOworZXh0ZXJuIHVuc2lnbmVkIGludCBlbmFibGVfbWRtYV9wcm9mOworCitzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19tZG1hX3Byb2ZfZW5hYmxlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgbjsKKwlidWZbMF0gPSAnXDAnOworCW4gPSAwOworCWlmIChlbmFibGVfbWRtYV9wcm9mKQorCQluICs9IHNwcmludGYoYnVmLCAiTURNQSBwcm9maWxpbmcgaXMgZW5hYmxlZFxuIik7CisJZWxzZQorCQluICs9IHNwcmludGYoYnVmLCAiTURNQSBwcm9maWxpbmcgaXMgZGlzYWJsZWRcbiIpOworCisJcmV0dXJuIChuICsgMSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvbWNlcnRvX21kbWFfcHJvZl9lbmFibGVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCBlbmFibGU7CisKKwlpZiAoa3N0cnRvdWludChidWYsIDAsICZlbmFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChlbmFibGUgPiAwKQorCQllbmFibGVfbWRtYV9wcm9mID0gMTsKKwllbHNlCisJCWVuYWJsZV9tZG1hX3Byb2YgPSAwOworCisJcmV0dXJuIGNvdW50OworfQorS0VSTkVMX0FUVFJfUlcoY29tY2VydG9fbWRtYV9wcm9mX2VuYWJsZSk7CisKK3N0YXRpYyBzc2l6ZV90IGNvbWNlcnRvX21kbWFfcmVxdGltaW5nX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgbjsKKworCWJ1ZlswXSA9ICdcMCc7CisJbiA9IDA7CisJbiArPSBzcHJpbnRmKGJ1ZiwgIkhpc3RvZ3JhbSBvZiBtZG1hIHJlcXVlc3QgdGltZVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU1OyBpKyspCisJeworCQlpZiAobWRtYV9yZXF0aW1lX2NvdW50ZXJbaV0pIHsKKwkJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiJWQgaW4gWyVkLSVkXSB1c1xuIiwgbWRtYV9yZXF0aW1lX2NvdW50ZXJbaV0sIGkgPDwgNCwgKGkgKyAxKSA8PCA0KTsKKwkJCW1kbWFfcmVxdGltZV9jb3VudGVyW2ldID0gMDsKKwkJfQorCX0KKwlpZiAobWRtYV9yZXF0aW1lX2NvdW50ZXJbMjU1XSkgeworCQluICs9IHNwcmludGYoYnVmICsgbiwgIiVkID49ICVkIHVzXG4iLCBtZG1hX3JlcXRpbWVfY291bnRlclsyNTVdLCAyNTUgPDwgNCk7CisJCW1kbWFfcmVxdGltZV9jb3VudGVyWzI1NV0gPSAwOworCX0KKwlyZXR1cm4gKG4gKyAxKTsKK30KK0tFUk5FTF9BVFRSX1JPKGNvbWNlcnRvX21kbWFfcmVxdGltaW5nKTsKKworc3RhdGljIHNzaXplX3QgY29tY2VydG9fbWRtYV90aW1pbmdfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBpOworCWludCBuOworCisJaW5pdF9tZG1hX3Byb2YgPSAwOworCWJ1ZlswXSA9ICdcMCc7CisJbiA9IDA7CisJbiArPSBzcHJpbnRmKGJ1ZiwgIkhpc3RvZ3JhbSBvZiBpbnRlciBtZG1hIHJlcXVlc3QgdGltZVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU1OyBpKyspCisJeworCQlpZiAobWRtYV90aW1lX2NvdW50ZXJbaV0pIHsKKwkJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiJWQgaW4gWyVkLSVkXSB1c1xuIiwgbWRtYV90aW1lX2NvdW50ZXJbaV0sIGkgPDwgNCwgKGkgKyAxKSA8PCA0KTsKKwkJCW1kbWFfdGltZV9jb3VudGVyW2ldID0gMDsKKwkJfQorCX0KKwlpZiAobWRtYV90aW1lX2NvdW50ZXJbMjU1XSkgeworCQluICs9IHNwcmludGYoYnVmICsgbiwgIiVkID49ICVkIHVzXG4iLCBtZG1hX3RpbWVfY291bnRlclsyNTVdLCAyNTUgPDwgNCk7CisJCW1kbWFfdGltZV9jb3VudGVyWzI1NV0gPSAwOworCX0KKwlyZXR1cm4gKG4gKyAxKTsKK30KK0tFUk5FTF9BVFRSX1JPKGNvbWNlcnRvX21kbWFfdGltaW5nKTsKKworc3RhdGljIHNzaXplX3QgY29tY2VydG9fbWRtYV9kYXRhX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgbjsKKworCWJ1ZlswXSA9ICdcMCc7CisJbiA9IDA7CisJbiArPSBzcHJpbnRmKGJ1ZiwgIkhpc3RvZ3JhbSBvZiBtZG1hIGRhdGEgbGVuZ3RoICh1cCB0byAxTSlcbiIpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwl7CisJCWlmIChtZG1hX2RhdGFfY291bnRlcltpXSkgeworCQkJbiArPSBzcHJpbnRmKGJ1ZiArIG4sICIlZCBpbiBbJWQtJWRdIEtCXG4iLCBtZG1hX2RhdGFfY291bnRlcltpXSwgaSA8PCAoMTMgLSAxMCksIChpICsgMSkgPDwgKDEzIC0gMTApKTsKKwkJCW1kbWFfZGF0YV9jb3VudGVyW2ldID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gKG4gKyAxKTsKK30KK0tFUk5FTF9BVFRSX1JPKGNvbWNlcnRvX21kbWFfZGF0YSk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9QUk9GKQorZXh0ZXJuIHVuc2lnbmVkIGludCBzcGxpY2V3X3RpbWVfY291bnRlclsyNTZdOyAvLyA0IG1zIC0+IDFTCitleHRlcm4gdW5zaWduZWQgaW50IHNwbGljZXdfcmVxdGltZV9jb3VudGVyWzI1Nl07IC8vIDQgbXMgLT4gMVMKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3BsaWNld19kYXRhX2NvdW50ZXJbMjU2XTsgCitleHRlcm4gdW5zaWduZWQgaW50IGluaXRfc3BsaWNld19wcm9mOyAKK2V4dGVybiB1bnNpZ25lZCBpbnQgZW5hYmxlX3NwbGljZV9wcm9mOworc3RhdGljIHNzaXplX3QgY29tY2VydG9fc3BsaWNlX3Byb2ZfZW5hYmxlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgbjsKKwlidWZbMF0gPSAnXDAnOworCW4gPSAwOworCWlmIChlbmFibGVfc3BsaWNlX3Byb2YpCisJCW4gKz0gc3ByaW50ZihidWYsICJTcGxpY2UgcHJvZmlsaW5nIGlzIGVuYWJsZWRcbiIpOworCWVsc2UKKwkJbiArPSBzcHJpbnRmKGJ1ZiwgIlNwbGljZSBwcm9maWxpbmcgaXMgZGlzYWJsZWRcbiIpOworCisJcmV0dXJuIChuICsgMSk7Cit9CitzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19zcGxpY2VfcHJvZl9lbmFibGVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCBlbmFibGU7CisKKwlpZiAoa3N0cnRvdWludChidWYsIDAsICZlbmFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChlbmFibGUgPiAwKQorCQllbmFibGVfc3BsaWNlX3Byb2YgPSAxOworCWVsc2UKKwkJZW5hYmxlX3NwbGljZV9wcm9mID0gMDsKKworCXJldHVybiBjb3VudDsKK30KK0tFUk5FTF9BVFRSX1JXKGNvbWNlcnRvX3NwbGljZV9wcm9mX2VuYWJsZSk7CitzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19zcGxpY2V3X3JlcXRpbWluZ19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGk7CisJaW50IG47CisKKwlidWZbMF0gPSAnXDAnOworCW4gPSAwOworCW4gKz0gc3ByaW50ZihidWYsICJIaXN0b2dyYW0gb2Ygc3BsaWNlIHdyaXRlIHRpbWUgKHVwIHRvIDEgc2VjIG90aGVyd2lzZSBkYXRlIGlzIGRpc2NhcmRlZClcbiIpOworCisJZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKQorCXsKKwkJaWYgKHNwbGljZXdfcmVxdGltZV9jb3VudGVyW2ldKSB7CisJCQluICs9IHNwcmludGYoYnVmICsgbiwgIiVkIGluIFslZC0lZF0gbXNcbiIsIHNwbGljZXdfcmVxdGltZV9jb3VudGVyW2ldLCAoaSAqIDgpLCAoaSAqIDgpICsgOCk7CisJCQlzcGxpY2V3X3JlcXRpbWVfY291bnRlcltpXSA9IDA7CisJCX0KKwl9CisJaWYgKHNwbGljZXdfcmVxdGltZV9jb3VudGVyWzI1NV0pIHsKKwkJbiArPSBzcHJpbnRmKGJ1ZiArIG4sICIlZCA+IDEgc2Vjb25kXG4iLCBzcGxpY2V3X3JlcXRpbWVfY291bnRlclsyNTVdKTsKKwkJc3BsaWNld19yZXF0aW1lX2NvdW50ZXJbMjU1XSA9IDA7CisJfQorCXJldHVybiAobiArIDEpOworfQorS0VSTkVMX0FUVFJfUk8oY29tY2VydG9fc3BsaWNld19yZXF0aW1pbmcpOworc3RhdGljIHNzaXplX3QgY29tY2VydG9fc3BsaWNld190aW1pbmdfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBpOworCWludCBuOworCisJaW5pdF9zcGxpY2V3X3Byb2YgPSAwOworCWJ1ZlswXSA9ICdcMCc7CisJbiA9IDA7CisJbiArPSBzcHJpbnRmKGJ1ZiwgIkhpc3RvZ3JhbSBvZiBpbnRlciBzcGxpY2Ugd3JpdGUgdGltZSAodXAgdG8gMSBzZWMgb3RoZXJ3aXNlIGRhdGUgaXMgZGlzY2FyZGVkKVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU1OyBpKyspCisJeworCQlpZiAoc3BsaWNld190aW1lX2NvdW50ZXJbaV0pIHsKKwkJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiJWQgaW4gWyVkLSVkXSBtc1xuIiwgc3BsaWNld190aW1lX2NvdW50ZXJbaV0sIChpICogOCksIChpICogOCkgKyA4KTsKKwkJCXNwbGljZXdfdGltZV9jb3VudGVyW2ldID0gMDsKKwkJfQorCX0KKwlpZiAoc3BsaWNld190aW1lX2NvdW50ZXJbMjU1XSkgeworIAkJbiArPSBzcHJpbnRmKGJ1ZiArIG4sICIlZCA+IDEgc2Vjb25kXG4iLCBzcGxpY2V3X3RpbWVfY291bnRlclsyNTVdKTsKKwkJc3BsaWNld190aW1lX2NvdW50ZXJbMjU1XSA9IDA7CisJfQorCXJldHVybiAobiArIDEpOworfQorS0VSTkVMX0FUVFJfUk8oY29tY2VydG9fc3BsaWNld190aW1pbmcpOworc3RhdGljIHNzaXplX3QgY29tY2VydG9fc3BsaWNld19kYXRhX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgbjsKKworCWJ1ZlswXSA9ICdcMCc7CisJbiA9IDA7CisJbiArPSBzcHJpbnRmKGJ1ZiwgIkhpc3RvZ3JhbSBvZiBzcGxpY2Ugd3JpdGUgZGF0YSBsZW5ndGggKHVwIHRvIDFNKVxuIik7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCXsKKwkJaWYgKHNwbGljZXdfZGF0YV9jb3VudGVyW2ldKSB7CisJCQluICs9IHNwcmludGYoYnVmICsgbiwgIiVkIGluIFslZC0lZF0gS0JcbiIsIHNwbGljZXdfZGF0YV9jb3VudGVyW2ldLCAoaSAqIDgpLCAoaSAqIDgpICsgOCk7CisJCQlzcGxpY2V3X2RhdGFfY291bnRlcltpXSA9IDA7CisJCX0KKwl9CisJcmV0dXJuIChuICsgMSk7Cit9CitLRVJORUxfQVRUUl9STyhjb21jZXJ0b19zcGxpY2V3X2RhdGEpOworCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3BsaWNlcl90aW1lX2NvdW50ZXJbMjU2XTsgLy8gNCBtcyAtPiAxUworZXh0ZXJuIHVuc2lnbmVkIGludCBzcGxpY2VyX3JlcXRpbWVfY291bnRlclsyNTZdOyAvLyA0IG1zIC0+IDFTCitleHRlcm4gdW5zaWduZWQgaW50IHNwbGljZXJfZGF0YV9jb3VudGVyWzI1Nl07IAorZXh0ZXJuIHVuc2lnbmVkIGludCBzcGxpY2VyX3RjcF9yc29ja19jb3VudGVyWzY0XTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaW5pdF9zcGxpY2VyX3Byb2Y7IAorc3RhdGljIHNzaXplX3QgY29tY2VydG9fc3BsaWNlcl9yZXF0aW1pbmdfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBpOworCWludCBuOworCisJYnVmWzBdID0gJ1wwJzsKKwluID0gMDsKKwluICs9IHNwcmludGYoYnVmLCAiSGlzdG9ncmFtIG9mIHNwbGljZSByZWFkIHRpbWVcbiIpOworCisJZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKQorCXsKKwkJaWYgKHNwbGljZXJfcmVxdGltZV9jb3VudGVyW2ldKSB7CisJCQluICs9IHNwcmludGYoYnVmICsgbiwgIiVkIGluIFslZC0lZF0gbXNcbiIsIHNwbGljZXJfcmVxdGltZV9jb3VudGVyW2ldLCAoaSAqIDgpLCAoaSAqIDgpICsgOCk7CisJCQlzcGxpY2VyX3JlcXRpbWVfY291bnRlcltpXSA9IDA7CisJCX0KKwl9CisJaWYgKHNwbGljZXJfcmVxdGltZV9jb3VudGVyWzI1NV0pIHsKKwkgCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiJWQgPiAxIHNlY29uZFxuIiwgc3BsaWNlcl9yZXF0aW1lX2NvdW50ZXJbMjU1XSk7CisJCXNwbGljZXJfcmVxdGltZV9jb3VudGVyWzI1NV0gPSAwOworCX0KKwlyZXR1cm4gKG4gKyAxKTsKK30KK0tFUk5FTF9BVFRSX1JPKGNvbWNlcnRvX3NwbGljZXJfcmVxdGltaW5nKTsKK3N0YXRpYyBzc2l6ZV90IGNvbWNlcnRvX3NwbGljZXJfdGltaW5nX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgbjsKKworCWluaXRfc3BsaWNlcl9wcm9mID0gMDsKKwlidWZbMF0gPSAnXDAnOworCW4gPSAwOworCW4gKz0gc3ByaW50ZihidWYsICJIaXN0b2dyYW0gb2YgaW50ZXIgc3BsaWNlIHJlYWQgdGltZVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU1OyBpKyspCisJeworCQlpZiAoc3BsaWNlcl90aW1lX2NvdW50ZXJbaV0pIHsKKwkJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiJWQgaW4gWyVkLSVkXSBtc1xuIiwgc3BsaWNlcl90aW1lX2NvdW50ZXJbaV0sIChpICogOCksIChpICogOCkgKyA4KTsKKwkJCXNwbGljZXJfdGltZV9jb3VudGVyW2ldID0gMDsKKwkJfQorCX0KKwlpZiAoc3BsaWNlcl90aW1lX2NvdW50ZXJbMjU1XSkgeworIAkJbiArPSBzcHJpbnRmKGJ1ZiArIG4sICIlZCA+IDEgc2Vjb25kXG4iLCBzcGxpY2VyX3RpbWVfY291bnRlclsyNTVdKTsKKwkJc3BsaWNlcl90aW1lX2NvdW50ZXJbMjU1XSA9IDA7CisJfQorCXJldHVybiAobiArIDEpOworfQorS0VSTkVMX0FUVFJfUk8oY29tY2VydG9fc3BsaWNlcl90aW1pbmcpOworc3RhdGljIHNzaXplX3QgY29tY2VydG9fc3BsaWNlcl9kYXRhX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwlpbnQgbjsKKworCWJ1ZlswXSA9ICdcMCc7CisJbiA9IDA7CisJbiArPSBzcHJpbnRmKGJ1ZiwgIkhpc3RvZ3JhbSBvZiBzcGxpY2UgcmVhZCBkYXRhIGxlbmd0aCAodXAgdG8gMU0pXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJeworCQlpZiAoc3BsaWNlcl9kYXRhX2NvdW50ZXJbaV0pIHsKKwkJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiJWQgaW4gWyVkLSVkXSBLQlxuIiwgc3BsaWNlcl9kYXRhX2NvdW50ZXJbaV0sIChpICogOCksIChpICogOCkgKyA4KTsKKwkJCXNwbGljZXJfZGF0YV9jb3VudGVyW2ldID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gKG4gKyAxKTsKK30KK0tFUk5FTF9BVFRSX1JPKGNvbWNlcnRvX3NwbGljZXJfZGF0YSk7CitzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19zcGxpY2VyX3RjcF9yc29ja19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGk7CisJaW50IG47CisKKwlidWZbMF0gPSAnXDAnOworCW4gPSAwOworCW4gKz0gc3ByaW50ZihidWYsICJIaXN0b2dyYW0gb2YgVENQIHJlY2VpdmUgcXVldWUgc2l6ZSB3aGVuIHNwbGljZSByZWFkIGlzIHBlcmZvcm1lZFxuIik7CisJZm9yIChpID0gMDsgaSA8IDYzOyBpKyspCisJeworCQlpZiAoc3BsaWNlcl90Y3BfcnNvY2tfY291bnRlcltpXSkgeworCQkJbiArPSBzcHJpbnRmKGJ1ZiArIG4sICIlZCBpbiBbJWQtJWRdIEtCXG4iLCBzcGxpY2VyX3RjcF9yc29ja19jb3VudGVyW2ldLCAoaSAqIDY0KSwgKGkgKiA2NCkgKyA2NCk7CisJCQlzcGxpY2VyX3RjcF9yc29ja19jb3VudGVyW2ldID0gMDsKKwkJfQorCX0KKwlpZiAoc3BsaWNlcl90Y3BfcnNvY2tfY291bnRlcltpXSkgeworCQkJbiArPSBzcHJpbnRmKGJ1ZiArIG4sICIlZCA+PSAlZCBLQlxuIiwgc3BsaWNlcl90Y3BfcnNvY2tfY291bnRlcltpXSwgKGkgKiA2NCkpOworCQkJc3BsaWNlcl90Y3BfcnNvY2tfY291bnRlcltpXSA9IDA7CisJfQorCXJldHVybiAobiArIDEpOworfQorS0VSTkVMX0FUVFJfUk8oY29tY2VydG9fc3BsaWNlcl90Y3BfcnNvY2spOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19BSENJX1BST0YpCisKKyNpbmNsdWRlICIuLi9kcml2ZXJzL2F0YS9haGNpLmgiCisKK3N0YXRpYyBzc2l6ZV90IGNvbWNlcnRvX2FoY2lfcHJvZl9lbmFibGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBuOworCWJ1ZlswXSA9ICdcMCc7CisJbiA9IDA7CisJaWYgKGVuYWJsZV9haGNpX3Byb2YpCisJCW4gKz0gc3ByaW50ZihidWYsICJBSENJIHByb2ZpbGluZyBpcyBlbmFibGVkXG4iKTsKKwllbHNlCisJCW4gKz0gc3ByaW50ZihidWYsICJBSENJIHByb2ZpbGluZyBpcyBkaXNhYmxlZFxuIik7CisKKwlyZXR1cm4gKG4gKyAxKTsKK30KK3N0YXRpYyBzc2l6ZV90IGNvbWNlcnRvX2FoY2lfcHJvZl9lbmFibGVfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCBlbmFibGU7CisKKwlpZiAoa3N0cnRvdWludChidWYsIDAsICZlbmFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChlbmFibGUgPiAwKQorCQllbmFibGVfYWhjaV9wcm9mID0gMTsKKwllbHNlCisJCWVuYWJsZV9haGNpX3Byb2YgPSAwOworCisJcmV0dXJuIGNvdW50OworfQorS0VSTkVMX0FUVFJfUlcoY29tY2VydG9fYWhjaV9wcm9mX2VuYWJsZSk7CitzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19haGNpX3RpbWluZ19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IGksIG4sIHA7CisKKwlidWZbMF0gPSAnXDAnOworCW4gPSAwOworCW4gKz0gc3ByaW50ZihidWYsICJIaXN0b2dyYW0gb2YgYWhjaSBpbnRlciByZXF1ZXN0IHRpbWUgKHVzKVxuIik7CisKKwlmb3IgKHAgPSAwOyBwIDwgTUFYX0FIQ0lfUE9SVFM7IHArKykgeworCQlzdHJ1Y3QgYWhjaV9wb3J0X3N0YXRzICpzdGF0cyA9ICZhaGNpX3BvcnRfc3RhdHNbcF07CisKKwkJbiArPSBzcHJpbnRmKGJ1ZiArIG4sICJBSENJIFBvcnQgJWRcbiIsIHApOworCisJCXN0YXRzLT5pbml0X3Byb2YgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQklOUyAtIDE7IGkrKykKKwkJeworCQkJaWYgKHN0YXRzLT50aW1lX2NvdW50ZXJbaV0pIHsKKwkJCQluICs9IHNwcmludGYoYnVmICsgbiwgIiU4ZCBpbiBbJTVkLSU1ZF1cbiIsIHN0YXRzLT50aW1lX2NvdW50ZXJbaV0sIGkgPDwgVVNfU0hJRlQsIChpICsgMSkgPDwgVVNfU0hJRlQpOworCQkJCXN0YXRzLT50aW1lX2NvdW50ZXJbaV0gPSAwOworCQkJfQorCQl9CisKKwkJaWYgKHN0YXRzLT50aW1lX2NvdW50ZXJbTUFYX0JJTlMgLSAxXSkgeworCQkgCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiJWQgPiAlZCB1c1xuIiwgc3RhdHMtPnRpbWVfY291bnRlcltNQVhfQklOUyAtIDFdLCAoTUFYX0JJTlMgLSAxKSA8PCBVU19TSElGVCk7CisJCQlzdGF0cy0+dGltZV9jb3VudGVyW01BWF9CSU5TIC0gMV0gPSAwOworCQl9CisJfQorCisJcmV0dXJuIChuICsgMSk7Cit9CitLRVJORUxfQVRUUl9STyhjb21jZXJ0b19haGNpX3RpbWluZyk7CitzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19haGNpX2RhdGFfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWludCBpLCBuLCBwOworCisJYnVmWzBdID0gJ1wwJzsKKwluID0gMDsKKwluICs9IHNwcmludGYoYnVmLCAiSGlzdG9ncmFtIG9mIGFoY2kgcmVxdWVzdHMgZGF0YSBsZW5ndGggKEtpQilcbiIpOworCisJZm9yIChwID0gMDsgcCA8IE1BWF9BSENJX1BPUlRTOyBwKyspIHsKKwkJc3RydWN0IGFoY2lfcG9ydF9zdGF0cyAqc3RhdHMgPSAmYWhjaV9wb3J0X3N0YXRzW3BdOworCisJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiQUhDSSBQb3J0ICVkXG4iLCBwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JJTlM7IGkrKykKKwkJeworCQkJaWYgKHN0YXRzLT5kYXRhX2NvdW50ZXJbaV0pIHsKKwkJCQluICs9IHNwcmludGYoYnVmICsgbiwgIiU4ZCBpbiBbJTNkLSUzZF1cbiIsIHN0YXRzLT5kYXRhX2NvdW50ZXJbaV0sIChpIDw8IEJZVEVfU0hJRlQpIC8gMTAyNCwgKChpICsgMSkgPDwgQllURV9TSElGVCkgLyAxMDI0KTsKKwkJCQlzdGF0cy0+ZGF0YV9jb3VudGVyW2ldID0gMDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAobiArIDEpOworfQorS0VSTkVMX0FUVFJfUk8oY29tY2VydG9fYWhjaV9kYXRhKTsKKworCitleHRlcm4gc3RydWN0IGFoY2lfcG9ydF9zdGF0cyBhaGNpX3BvcnRfc3RhdHNbTUFYX0FIQ0lfUE9SVFNdOworc3RhdGljIHNzaXplX3QgY29tY2VydG9fYWhjaV9xY19yYXRlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaSwgbiwgcDsKKwl1bnNpZ25lZCBpbnQgbWVhbl9yYXRlLCB0b3RhbF9rYjsKKworCWJ1ZlswXSA9ICdcMCc7CisJbiA9IDA7CisJbiArPSBzcHJpbnRmKGJ1ZiwgIkhpc3RvZ3JhbSBvZiBBSENJIHJlcXVlc3RzIHJhdGUgY29tcGxldGlvbiAoTWlCIE1pQi9zKTpcbiIpOworCisJZm9yIChwID0gMDsgcCA8IE1BWF9BSENJX1BPUlRTOyBwKyspIHsKKwkJc3RydWN0IGFoY2lfcG9ydF9zdGF0cyAqc3RhdHMgPSAmYWhjaV9wb3J0X3N0YXRzW3BdOworCisJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiQUhDSSBQb3J0ICVkXG4iLCBwKTsKKwkJdG90YWxfa2IgPSAwOworCQltZWFuX3JhdGUgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQklOUzsgaSsrKQorCQl7CisJCQlpZiAoc3RhdHMtPnJhdGVfY291bnRlcltpXSkgeworCQkJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiJThkIGluIFslM2QtJTNkXVxuIiwgc3RhdHMtPnJhdGVfY291bnRlcltpXSAvIDEwMjQsIGkgPDwgUkFURV9TSElGVCwgKGkgKyAxKSA8PCBSQVRFX1NISUZUKTsKKwkJCQltZWFuX3JhdGUgKz0gc3RhdHMtPnJhdGVfY291bnRlcltpXSAqICgoKDIgKiBpICsgMSkgPDwgUkFURV9TSElGVCkgLyAyKTsKKwkJCQl0b3RhbF9rYiArPSBzdGF0cy0+cmF0ZV9jb3VudGVyW2ldOworCQkJCXN0YXRzLT5yYXRlX2NvdW50ZXJbaV0gPSAwOworCQkJfQorCQl9CisJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiXG4iKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0FIQ0lfU0xPVFM7IGkrKykgeworCQkJaWYgKHN0YXRzLT5wZW5kaW5nX2NvdW50ZXJbaV0pIHsKKwkJCQluICs9IHNwcmludGYoYnVmICsgbiwgIiU4ZCBpbiBbJTJkXVxuIiwgc3RhdHMtPnBlbmRpbmdfY291bnRlcltpXSwgaSk7CisJCQkJc3RhdHMtPnBlbmRpbmdfY291bnRlcltpXSA9IDA7CisJCQl9CisJCX0KKworCQlpZiAodG90YWxfa2IpIHsKKwkJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiTWVhbjogJWQgTWlCL3MgZm9yICVkIE1pQlxuIiwgbWVhbl9yYXRlIC8gdG90YWxfa2IsIHRvdGFsX2tiIC8gMTAyNCk7CisJCQluICs9IHNwcmludGYoYnVmICsgbiwgIk1heCBpc3N1ZXMgaW4gYSByb3cgOiAlZCBcblxuIiwgc3RhdHMtPm5iX3BlbmRpbmdfbWF4KTsKKwkJfQorCisJCXN0YXRzLT5uYl9wZW5kaW5nX21heCA9IDA7CisJfQorCisJcmV0dXJuIChuICsgMSk7Cit9CitLRVJORUxfQVRUUl9STyhjb21jZXJ0b19haGNpX3FjX3JhdGUpOworCisKK2V4dGVybiB1bnNpZ25lZCBpbnQgYWhjaV9xY19ub19mcmVlX3Nsb3Q7CitzdGF0aWMgc3NpemVfdCBjb21jZXJ0b19haGNpX3FjX25vX2ZyZWVfc2xvdF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaW50IG4sIHA7CisKKwlidWZbMF0gPSAnXDAnOworCW4gPSAwOworCisJZm9yIChwID0gMDsgcCA8IE1BWF9BSENJX1BPUlRTOyBwKyspIHsKKwkJc3RydWN0IGFoY2lfcG9ydF9zdGF0cyAqc3RhdHMgPSAmYWhjaV9wb3J0X3N0YXRzW3BdOworCisJCW4gKz0gc3ByaW50ZihidWYgKyBuLCAiQUhDSSBQb3J0ICVkIG5vX2ZyZWVfc2xvdCBjb3VudDogJWRcbiIsIHAsIHN0YXRzLT5ub19mcmVlX3Nsb3QpOworCisJCXN0YXRzLT5ub19mcmVlX3Nsb3QgPSAwOworCX0KKworCXJldHVybiAobiArIDEpOworfQorS0VSTkVMX0FUVFJfUk8oY29tY2VydG9fYWhjaV9xY19ub19mcmVlX3Nsb3QpOworI2VuZGlmCisKIC8qCiAgKiBNYWtlIC9zeXMva2VybmVsL25vdGVzIGdpdmUgdGhlIHJhdyBjb250ZW50cyBvZiBvdXIga2VybmVsIC5ub3RlcyBzZWN0aW9uLgogICovCkBAIC0xODIsNiArNjYwLDI5IEBACiAJJmtleGVjX2NyYXNoX3NpemVfYXR0ci5hdHRyLAogCSZ2bWNvcmVpbmZvX2F0dHIuYXR0ciwKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX01ETUFfUFJPRikKKwkmY29tY2VydG9fbWRtYV9wcm9mX2VuYWJsZV9hdHRyLmF0dHIsCisJJmNvbWNlcnRvX21kbWFfdGltaW5nX2F0dHIuYXR0ciwKKwkmY29tY2VydG9fbWRtYV9yZXF0aW1pbmdfYXR0ci5hdHRyLAorCSZjb21jZXJ0b19tZG1hX2RhdGFfYXR0ci5hdHRyLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fU1BMSUNFX1BST0YpCisJJmNvbWNlcnRvX3NwbGljZV9wcm9mX2VuYWJsZV9hdHRyLmF0dHIsCisJJmNvbWNlcnRvX3NwbGljZXdfdGltaW5nX2F0dHIuYXR0ciwKKwkmY29tY2VydG9fc3BsaWNld19yZXF0aW1pbmdfYXR0ci5hdHRyLAorCSZjb21jZXJ0b19zcGxpY2V3X2RhdGFfYXR0ci5hdHRyLAorCSZjb21jZXJ0b19zcGxpY2VyX3RpbWluZ19hdHRyLmF0dHIsCisJJmNvbWNlcnRvX3NwbGljZXJfcmVxdGltaW5nX2F0dHIuYXR0ciwKKwkmY29tY2VydG9fc3BsaWNlcl9kYXRhX2F0dHIuYXR0ciwKKwkmY29tY2VydG9fc3BsaWNlcl90Y3BfcnNvY2tfYXR0ci5hdHRyLAorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fQUhDSV9QUk9GKQorCSZjb21jZXJ0b19haGNpX3Byb2ZfZW5hYmxlX2F0dHIuYXR0ciwKKwkmY29tY2VydG9fYWhjaV90aW1pbmdfYXR0ci5hdHRyLAorCSZjb21jZXJ0b19haGNpX2RhdGFfYXR0ci5hdHRyLAorCSZjb21jZXJ0b19haGNpX3FjX3JhdGVfYXR0ci5hdHRyLAorCSZjb21jZXJ0b19haGNpX3FjX25vX2ZyZWVfc2xvdF9hdHRyLmF0dHIsCisjZW5kaWYKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcGlkLmMgYi9rZXJuZWwvcGlkLmMKaW5kZXggZmE1ZjcyMi4uMmJmNDlmZCAxMDA2NDQKLS0tIGEva2VybmVsL3BpZC5jCisrKyBiL2tlcm5lbC9waWQuYwpAQCAtNDI4LDYgKzQyOCw3IEBACiB7CiAJcmV0dXJuIGZpbmRfdGFza19ieV9waWRfbnModm5yLCBjdXJyZW50LT5uc3Byb3h5LT5waWRfbnMpOwogfQorRVhQT1JUX1NZTUJPTChmaW5kX3Rhc2tfYnlfdnBpZCk7CiAKIHN0cnVjdCBwaWQgKmdldF90YXNrX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGVudW0gcGlkX3R5cGUgdHlwZSkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9LY29uZmlnIGIva2VybmVsL3Bvd2VyL0tjb25maWcKaW5kZXggZGViNTQ2MS4uZDRjNTY5MiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL0tjb25maWcKKysrIGIva2VybmVsL3Bvd2VyL0tjb25maWcKQEAgLTE0OCw2ICsxNDgsMTUgQEAKIAlZb3UgcHJvYmFibHkgd2FudCB0byBoYXZlIHlvdXIgc3lzdGVtJ3MgUlRDIGRyaXZlciBzdGF0aWNhbGx5CiAJbGlua2VkLCBlbnN1cmluZyB0aGF0IGl0J3MgYXZhaWxhYmxlIHdoZW4gdGhpcyB0ZXN0IHJ1bnMuCiAKK2NvbmZpZyBQTV9TWVNGU19NQU5VQUwKKwlib29sICJEcml2ZXIgbW9kZWwgL3N5cy9kZXZpY2VzLy4uLi9wb3dlci9zdGF0ZSBmaWxlcyIKKwlkZXBlbmRzIG9uIFBNIAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwlUaGUgZHJpdmVyIG1vZGVsIHN0YXJ0ZWQgb3V0IHdpdGggYSBzeXNmcyBmaWxlIGludGVuZGVkIHRvIHByb3ZpZGUKKwlhIHVzZXJzcGFjZSBob29rIGZvciBkZXZpY2UgcG93ZXIgbWFuYWdlbWVudC4gQnkgdGhpcyBob29rIE5vbiBDUFUgCisJZGV2aWNlcyBjYW4gYmUgcHV0IGluIHBvd2VyIG9mZiBzdGF0ZS4gCisKIGNvbmZpZyBDQU5fUE1fVFJBQ0UKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBQTV9ERUJVRyAmJiBQTV9TTEVFUApkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggMzZlMGYwOS4uYmI5OThjYyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bWFjaC9jb21jZXJ0by0yMDAwL3BtLmg+CiAKICNpbmNsdWRlICJwb3dlci5oIgogCkBAIC0zMDYsNiArMzA3LDI4IEBACiAKIHBvd2VyX2F0dHIoc3RhdGUpOwogCisjaWZkZWYgQ09ORklHX0FSQ0hfTTg2WFhYCitzdGF0aWMgc3NpemVfdCBiaXRtYXNrX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsdWU9YzJrX3BtX2JpdG1hc2tfc2hvdygpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwiJTAyeFxuIix2YWx1ZSk7CisKK30KKworc3RhdGljIHNzaXplX3QgYml0bWFza19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXZhbHVlPXNpbXBsZV9zdHJ0b3VsKGJ1ZixOVUxMLDE2KTsKKwkvKiBTdG9yZSB0aGUgQml0bWFzayB2YWx1ZSBpbiB0aGUgR2xvYmFsIFZhcmlhYmxlICovCisJYzJrX3BtX2JpdG1hc2tfc3RvcmUodmFsdWUpOworCXJldHVybiBuOworCit9Citwb3dlcl9hdHRyKGJpdG1hc2spOworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIC8qCiAgKiBUaGUgJ3dha2V1cF9jb3VudCcgYXR0cmlidXRlLCBhbG9uZyB3aXRoIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBpbgpAQCAtNDA0LDYgKzQyNyw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICogZ1tdID0gewogCSZzdGF0ZV9hdHRyLmF0dHIsCisjaWZkZWYgQ09ORklHX0FSQ0hfTTg2WFhYCisJJmJpdG1hc2tfYXR0ci5hdHRyLAorI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BNX1RSQUNFCiAJJnBtX3RyYWNlX2F0dHIuYXR0ciwKIAkmcG1fdHJhY2VfZGV2X21hdGNoX2F0dHIuYXR0ciwKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCmluZGV4IGFmNDhmYWEuLmYzMWQ2NTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKKysrIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwpAQCAtMTcxLDE1ICsxNzEsMTYgQEAKIAogCWFyY2hfc3VzcGVuZF9kaXNhYmxlX2lycXMoKTsKIAlCVUdfT04oIWlycXNfZGlzYWJsZWQoKSk7Ci0KLQllcnJvciA9IHN5c2NvcmVfc3VzcGVuZCgpOworCS8qIEZJWE1FIHN5c2NvcmUgc3VzcGVuZC9yZXN1bWUgaXMgbm90IHdvcmtpbmcgZm9yIEhHVyBidWlsZCAqLworCS8vZXJyb3IgPSBzeXNjb3JlX3N1c3BlbmQoKTsKKwllcnJvciA9IDA7CiAJaWYgKCFlcnJvcikgewogCQkqd2FrZXVwID0gcG1fd2FrZXVwX3BlbmRpbmcoKTsKIAkJaWYgKCEoc3VzcGVuZF90ZXN0KFRFU1RfQ09SRSkgfHwgKndha2V1cCkpIHsKIAkJCWVycm9yID0gc3VzcGVuZF9vcHMtPmVudGVyKHN0YXRlKTsKIAkJCWV2ZW50c19jaGVja19lbmFibGVkID0gZmFsc2U7CiAJCX0KLQkJc3lzY29yZV9yZXN1bWUoKTsKKwkJLy9zeXNjb3JlX3Jlc3VtZSgpOwogCX0KIAogCWFyY2hfc3VzcGVuZF9lbmFibGVfaXJxcygpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggMmM3MWQ5MS4uZTM0Y2MzNyAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC0yMDIsNyArMjAyLDExIEBACiAgKiB3ZSB3YW50IHRvIGhhbmRsZSBzb2Z0aXJxcyBhcyBzb29uIGFzIHBvc3NpYmxlLCBidXQgdGhleQogICogc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGxvY2sgdXAgdGhlIGJveC4KICAqLworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pCisjZGVmaW5lIE1BWF9TT0ZUSVJRX1JFU1RBUlQgMgorI2Vsc2UKICNkZWZpbmUgTUFYX1NPRlRJUlFfUkVTVEFSVCAxMAorI2VuZGlmCiAKIGFzbWxpbmthZ2Ugdm9pZCBfX2RvX3NvZnRpcnEodm9pZCkKIHsKZGlmZiAtLWdpdCBhL21tL2JhY2tpbmctZGV2LmMgYi9tbS9iYWNraW5nLWRldi5jCmluZGV4IDJiNDlkZDIuLjA0NjI4OTEgMTAwNjQ0Ci0tLSBhL21tL2JhY2tpbmctZGV2LmMKKysrIGIvbW0vYmFja2luZy1kZXYuYwpAQCAtMjI1LDEyICsyMjUsNDAgQEAKIH0KIEJESV9TSE9XKG1heF9yYXRpbywgYmRpLT5tYXhfcmF0aW8pCiAKKyNpZmRlZiBDT05GSUdfQVJDSF9NODZYWFgKK3N0YXRpYyBzc2l6ZV90IGNwdTBfYmluZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGZsYWc7CisKKwlmbGFnID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJaWYgKGZsYWcpCisJCWJkaS0+Y3B1MF9iaW5kID0gMTsKKwllbHNlCisJCWJkaS0+Y3B1MF9iaW5kID0gMDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgY3B1MF9iaW5kX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCit7CisJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRS0xLCAiJWRcbiIsIGJkaS0+Y3B1MF9iaW5kKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9NODZYWFggKi8KKwogI2RlZmluZSBfX0FUVFJfUlcoYXR0cikgX19BVFRSKGF0dHIsIDA2NDQsIGF0dHIjI19zaG93LCBhdHRyIyNfc3RvcmUpCiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBiZGlfZGV2X2F0dHJzW10gPSB7CiAJX19BVFRSX1JXKHJlYWRfYWhlYWRfa2IpLAogCV9fQVRUUl9SVyhtaW5fcmF0aW8pLAogCV9fQVRUUl9SVyhtYXhfcmF0aW8pLAorI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCV9fQVRUUl9SVyhjcHUwX2JpbmQpLAorI2VuZGlmCiAJX19BVFRSX05VTEwsCiB9OwogCkBAIC00NzgsNiArNTA2LDEwIEBACiAJCQkJd3JpdGViYWNrX2lub2Rlc193YigmYmRpLT53YiwgMTAyNCwKIAkJCQkJCSAgICBXQl9SRUFTT05fRk9SS0VSX1RIUkVBRCk7CiAJCQl9IGVsc2UgeworI2lmZGVmIENPTkZJR19BUkNIX004NlhYWAorCQkJCWlmIChiZGktPmNwdTBfYmluZCkKKwkJCQkJa3RocmVhZF9iaW5kKHRhc2ssIDApOworI2VuZGlmCiAJCQkJLyoKIAkJCQkgKiBUaGUgc3BpbmxvY2sgbWFrZXMgc3VyZSB3ZSBkbyBub3QgbG9zZQogCQkJCSAqIHdha2UtdXBzIHdoZW4gcmFjaW5nIHdpdGggJ2JkaV9xdWV1ZV93b3JrKCknLgpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDU1Njg1OGMuLmUzMTAyNjMgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTI4LDYgKzI4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpZmRlZiBDT05GSUdfUkFJRF9aRVJPX0NPUFkKKyNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CisjZW5kaWYKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CkBAIC02MDksMTAgKzYxMiwyNyBAQAogCQlCVUcoKTsKIAogCXNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCk7CisKKyNpZmRlZiBDT05GSUdfUkFJRF9aRVJPX0NPUFkKKwljbGVhcl9wYWdlX2NvbnN0YW50KHBhZ2UpOworI2VuZGlmCisKIAl3YWtlX3VwX3BhZ2UocGFnZSwgUEdfd3JpdGViYWNrKTsKIH0KIEVYUE9SVF9TWU1CT0woZW5kX3BhZ2Vfd3JpdGViYWNrKTsKIAorI2lmZGVmIENPTkZJR19SQUlEX1pFUk9fQ09QWQordm9pZCBjbGVhcl9wYWdlX2NvbnN0YW50KHN0cnVjdCBwYWdlICpwYWdlKQoreworICAgICAgIGlmIChQYWdlQ29uc3RhbnQocGFnZSkpIHsKKyAgICAgICAgICAgICAgIENsZWFyUGFnZUNvbnN0YW50KHBhZ2UpOworICAgICAgICAgICAgICAgU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworICAgICAgIH0KK30KK0VYUE9SVF9TWU1CT0woY2xlYXJfcGFnZV9jb25zdGFudCk7CisjZW5kaWYKKworCiAvKioKICAqIF9fbG9ja19wYWdlIC0gZ2V0IGEgbG9jayBvbiB0aGUgcGFnZSwgYXNzdW1pbmcgd2UgbmVlZCB0byBzbGVlcCB0byBnZXQgaXQKICAqIEBwYWdlOiB0aGUgcGFnZSB0byBsb2NrCmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggZWFlOTBhZi4uNmUxMmM1ZiAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtMTg4Niw3ICsxODg2LDcgQEAKIAl1bm1hcF92bWFzKCZ0bGIsIHZtYSwgc3RhcnQsIGVuZCwgJm5yX2FjY291bnRlZCwgTlVMTCk7CiAJdm1fdW5hY2N0X21lbW9yeShucl9hY2NvdW50ZWQpOwogCWZyZWVfcGd0YWJsZXMoJnRsYiwgdm1hLCBwcmV2ID8gcHJldi0+dm1fZW5kIDogRklSU1RfVVNFUl9BRERSRVNTLAotCQkJCSBuZXh0ID8gbmV4dC0+dm1fc3RhcnQgOiAwKTsKKwkJCQkgbmV4dCA/IG5leHQtPnZtX3N0YXJ0IDogbW0tPnRhc2tfc2l6ZSk7CiAJdGxiX2ZpbmlzaF9tbXUoJnRsYiwgc3RhcnQsIGVuZCk7CiB9CiAKQEAgLTIyNjEsNyArMjI2MSw3IEBACiAJZW5kID0gdW5tYXBfdm1hcygmdGxiLCB2bWEsIDAsIC0xLCAmbnJfYWNjb3VudGVkLCBOVUxMKTsKIAl2bV91bmFjY3RfbWVtb3J5KG5yX2FjY291bnRlZCk7CiAKLQlmcmVlX3BndGFibGVzKCZ0bGIsIHZtYSwgRklSU1RfVVNFUl9BRERSRVNTLCAwKTsKKwlmcmVlX3BndGFibGVzKCZ0bGIsIHZtYSwgRklSU1RfVVNFUl9BRERSRVNTLCBtbS0+dGFza19zaXplKTsKIAl0bGJfZmluaXNoX21tdSgmdGxiLCAwLCBlbmQpOwogCiAJLyoKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCAwNjVkYmU4Li5iN2I4OThkIDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0xNjY4LDYgKzE2NjgsMTEgQEAKIAkJCSFjcHVzZXRfem9uZV9hbGxvd2VkX3NvZnR3YWxsKHpvbmUsIGdmcF9tYXNrKSkKIAkJCQljb250aW51ZTsKIAorI2lmZGVmIENPTkZJR19DT01DRVJUT19aT05FX0RNQV9OQ05CCisJCWlmICghKGdmcF9tYXNrICYgX19HRlBfRE1BKSAmJiAoem9uZV9pZHgoem9uZSkgPT0gWk9ORV9ETUEpKQorCQkJY29udGludWU7CisjZW5kaWYKKwogCQlCVUlMRF9CVUdfT04oQUxMT0NfTk9fV0FURVJNQVJLUyA8IE5SX1dNQVJLKTsKIAkJaWYgKCEoYWxsb2NfZmxhZ3MgJiBBTExPQ19OT19XQVRFUk1BUktTKSkgewogCQkJdW5zaWduZWQgbG9uZyBtYXJrOwpkaWZmIC0tZ2l0IGEvbW0vc2xhYi5jIGIvbW0vc2xhYi5jCmluZGV4IGNkM2FiOTMuLjhiZmZhOTcgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTc0OSw3ICs3NDksNyBAQAogCSAqIGZvciBsYXJnZSBrbWFsbG9jIGNhbGxzIHJlcXVpcmVkLgogCSAqLwogI2lmZGVmIENPTkZJR19aT05FX0RNQQotCWlmICh1bmxpa2VseShnZnBmbGFncyAmIEdGUF9ETUEpKQorCWlmICh1bmxpa2VseShnZnBmbGFncyAmIF9fR0ZQX0RNQSkpCiAJCXJldHVybiBjc2l6ZXAtPmNzX2RtYWNhY2hlcDsKICNlbmRpZgogCXJldHVybiBjc2l6ZXAtPmNzX2NhY2hlcDsKQEAgLTI0NDUsNyArMjQ0NSw4IEBACiAJY2FjaGVwLT5mbGFncyA9IGZsYWdzOwogCWNhY2hlcC0+Z2ZwZmxhZ3MgPSAwOwogCWlmIChDT05GSUdfWk9ORV9ETUFfRkxBRyAmJiAoZmxhZ3MgJiBTTEFCX0NBQ0hFX0RNQSkpCi0JCWNhY2hlcC0+Z2ZwZmxhZ3MgfD0gR0ZQX0RNQTsKKwkJY2FjaGVwLT5nZnBmbGFncyB8PSBfX0dGUF9ETUE7CisKIAljYWNoZXAtPmJ1ZmZlcl9zaXplID0gc2l6ZTsKIAljYWNoZXAtPnJlY2lwcm9jYWxfYnVmZmVyX3NpemUgPSByZWNpcHJvY2FsX3ZhbHVlKHNpemUpOwogCkBAIC0yNzkxLDEwICsyNzkyLDEwIEBACiBzdGF0aWMgdm9pZCBrbWVtX2ZsYWdjaGVjayhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBmbGFncykKIHsKIAlpZiAoQ09ORklHX1pPTkVfRE1BX0ZMQUcpIHsKLQkJaWYgKGZsYWdzICYgR0ZQX0RNQSkKLQkJCUJVR19PTighKGNhY2hlcC0+Z2ZwZmxhZ3MgJiBHRlBfRE1BKSk7CisJCWlmIChmbGFncyAmIF9fR0ZQX0RNQSkKKwkJCUJVR19PTighKGNhY2hlcC0+Z2ZwZmxhZ3MgJiBfX0dGUF9ETUEpKTsKIAkJZWxzZQotCQkJQlVHX09OKGNhY2hlcC0+Z2ZwZmxhZ3MgJiBHRlBfRE1BKTsKKwkJCUJVR19PTihjYWNoZXAtPmdmcGZsYWdzICYgX19HRlBfRE1BKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnIuYyBiL25ldC9icmlkZ2UvYnIuYwppbmRleCBmMjBjNGZkLi5lOTJhYTg0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyLmMKKysrIGIvbmV0L2JyaWRnZS9ici5jCkBAIC0xMDAsNiArMTAwLDYwIEBACiAJYnJfZmRiX2ZpbmkoKTsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pCitzdGF0aWMgQVRPTUlDX05PVElGSUVSX0hFQUQoYnJldmVudF9ub3RpZl9jaGFpbik7CisKKy8qKgorICoJcmVnaXN0ZXJfYnJldmVudF9ub3RpZmllciAtIHJlZ2lzdGVyIGEgbmV0ZXZlbnQgbm90aWZpZXIgYmxvY2sKKyAqCUBuYjogbm90aWZpZXIKKyAqCisgKglSZWdpc3RlciBhIG5vdGlmaWVyIHRvIGJlIGNhbGxlZCB3aGVuIGEgYnJpZGdlIGV2ZW50IG9jY3Vycy4KKyAqCVRoZSBub3RpZmllciBwYXNzZWQgaXMgbGlua2VkIGludG8gdGhlIGtlcm5lbCBzdHJ1Y3R1cmVzIGFuZCBtdXN0CisgKglub3QgYmUgcmV1c2VkIHVudGlsIGl0IGhhcyBiZWVuIHVucmVnaXN0ZXJlZC4gQSBuZWdhdGl2ZSBlcnJubyBjb2RlCisgKglpcyByZXR1cm5lZCBvbiBhIGZhaWx1cmUuCisgKi8KK2ludCByZWdpc3Rlcl9icmV2ZW50X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJaW50IGVycjsKKworCWVyciA9IGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmYnJldmVudF9ub3RpZl9jaGFpbiwgbmIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICoJdW5yZWdpc3Rlcl9icmV2ZW50X25vdGlmaWVyIC0gdW5yZWdpc3RlciBhIG5ldGV2ZW50IG5vdGlmaWVyIGJsb2NrCisgKglAbmI6IG5vdGlmaWVyCisgKgorICoJVW5yZWdpc3RlciBhIG5vdGlmaWVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBieQorICoJcmVnaXN0ZXJfbmVpZ2hfbm90aWZpZXIoKS4gVGhlIG5vdGlmaWVyIGlzIHVubGlua2VkIGludG8gdGhlCisgKglrZXJuZWwgc3RydWN0dXJlcyBhbmQgbWF5IHRoZW4gYmUgcmV1c2VkLiBBIG5lZ2F0aXZlIGVycm5vIGNvZGUKKyAqCWlzIHJldHVybmVkIG9uIGEgZmFpbHVyZS4KKyAqLworCitpbnQgdW5yZWdpc3Rlcl9icmV2ZW50X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZicmV2ZW50X25vdGlmX2NoYWluLCBuYik7Cit9CisKKy8qKgorICoJY2FsbF9icmV2ZW50X25vdGlmaWVycyAtIGNhbGwgYWxsIG5ldGV2ZW50IG5vdGlmaWVyIGJsb2NrcworICogICAgICBAdmFsOiB2YWx1ZSBwYXNzZWQgdW5tb2RpZmllZCB0byBub3RpZmllciBmdW5jdGlvbgorICogICAgICBAdjogICBwb2ludGVyIHBhc3NlZCB1bm1vZGlmaWVkIHRvIG5vdGlmaWVyIGZ1bmN0aW9uCisgKgorICoJQ2FsbCBhbGwgbmVpZ2hib3VyIG5vdGlmaWVyIGJsb2Nrcy4gIFBhcmFtZXRlcnMgYW5kIHJldHVybiB2YWx1ZQorICoJYXJlIGFzIGZvciBub3RpZmllcl9jYWxsX2NoYWluKCkuCisgKi8KKworaW50IGNhbGxfYnJldmVudF9ub3RpZmllcnModW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnYpCit7CisJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZicmV2ZW50X25vdGlmX2NoYWluLCB2YWwsIHYpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9icmV2ZW50X25vdGlmaWVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfYnJldmVudF9ub3RpZmllcik7CitFWFBPUlRfU1lNQk9MX0dQTChjYWxsX2JyZXZlbnRfbm90aWZpZXJzKTsKKyNlbmRpZgorCiBtb2R1bGVfaW5pdChicl9pbml0KQogbW9kdWxlX2V4aXQoYnJfZGVpbml0KQogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9mZGIuYyBiL25ldC9icmlkZ2UvYnJfZmRiLmMKaW5kZXggYzhlNzg2MS4uM2FlMTIyZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9mZGIuYworKysgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCkBAIC0xOCw2ICsxOCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0NPTUNFUlRPKQorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0zMiw2ICszNiwxMSBAQAogCiBzdGF0aWMgdTMyIGZkYl9zYWx0IF9fcmVhZF9tb3N0bHk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0NPTUNFUlRPKQorCWludCgqYnJfZmRiX2Nhbl9leHBpcmUpKHVuc2lnbmVkIGNoYXIgKm1hY19hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSA9IE5VTEw7CisJREVGSU5FX1NQSU5MT0NLKGJyX2ZkYl9jYl9sb2NrKTsKKyNlbmRpZgorCiBpbnQgX19pbml0IGJyX2ZkYl9pbml0KHZvaWQpCiB7CiAJYnJfZmRiX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImJyaWRnZV9mZGJfY2FjaGUiLApAQCAtNDIsNiArNTEsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWdldF9yYW5kb21fYnl0ZXMoJmZkYl9zYWx0LCBzaXplb2YoZmRiX3NhbHQpKTsKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0NPTUNFUlRPKQorCXNwaW5fbG9ja19pbml0KCZicl9mZGJfY2JfbG9jayk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQyLDYgKzE1NCwxNSBAQAogCQkJdW5zaWduZWQgbG9uZyB0aGlzX3RpbWVyOwogCQkJaWYgKGYtPmlzX3N0YXRpYykKIAkJCQljb250aW51ZTsKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0NPTUNFUlRPKQorCQkJCXNwaW5fbG9jaygmYnJfZmRiX2NiX2xvY2spOworCQkJCWlmKGJyX2ZkYl9jYW5fZXhwaXJlICYmICEoKmJyX2ZkYl9jYW5fZXhwaXJlKShmLT5hZGRyLmFkZHIsIGYtPmRzdC0+ZGV2KSl7CisJCQkJCWYtPnVwZGF0ZWQgPSBqaWZmaWVzOworCQkJCQlzcGluX3VubG9jaygmYnJfZmRiX2NiX2xvY2spOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2soJmJyX2ZkYl9jYl9sb2NrKTsKKyNlbmRpZgogCQkJdGhpc190aW1lciA9IGYtPnVwZGF0ZWQgKyBkZWxheTsKIAkJCWlmICh0aW1lX2JlZm9yZV9lcSh0aGlzX3RpbWVyLCBqaWZmaWVzKSkKIAkJCQlmZGJfZGVsZXRlKGYpOwpAQCAtNDE4LDcgKzQzOSwxOSBAQAogCQkJCQkib3duIGFkZHJlc3MgYXMgc291cmNlIGFkZHJlc3NcbiIsCiAJCQkJCXNvdXJjZS0+ZGV2LT5uYW1lKTsKIAkJfSBlbHNlIHsKLQkJCS8qIGZhc3RwYXRoOiB1cGRhdGUgb2YgZXhpc3RpbmcgZW50cnkgKi8KKwkJCQkvKiBmYXN0cGF0aDogdXBkYXRlIG9mIGV4aXN0aW5nIGVudHJ5ICovCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9DT01DRVJUTykKKwkJCQlpZiAoZmRiLT5kc3QgIT0gc291cmNlKSB7CisJCQkJCXN0cnVjdCBicmV2ZW50X2ZkYl91cGRhdGUgZmRiX3VwZGF0ZTsKKworCQkJCQlmZGJfdXBkYXRlLmRldiA9IHNvdXJjZS0+ZGV2OworCQkJCQlmZGJfdXBkYXRlLm1hY19hZGRyID0gZmRiLT5hZGRyLmFkZHI7CisJCQkJCS8vRklYTUUKKwkJCQkJLy9fX3J0bXNnX2lmaW5mbyhSVE1fTkVXTElOSywgYnItPmRldiwgMCwgR0ZQX0FUT01JQyk7CisJCQkJCS8vRklYTUUKKwkJCQkJY2FsbF9icmV2ZW50X25vdGlmaWVycyhCUkVWRU5UX0ZEQl9VUERBVEUsICZmZGJfdXBkYXRlKTsKKwkJCQl9CisjZW5kaWYKIAkJCWZkYi0+ZHN0ID0gc291cmNlOwogCQkJZmRiLT51cGRhdGVkID0gamlmZmllczsKIAkJfQpAQCAtNDM0LDYgKzQ2NywyNCBAQAogCX0KIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pCit2b2lkIGJyX2ZkYl9yZWdpc3Rlcl9jYW5fZXhwaXJlX2NiKGludCgqY2IpKHVuc2lnbmVkIGNoYXIgKm1hY19hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSkKK3sKKyAgICAgICAgc3Bpbl9sb2NrX2JoKCZicl9mZGJfY2JfbG9jayk7CisgICAgICAgIGJyX2ZkYl9jYW5fZXhwaXJlID0gY2I7CisgICAgICAgIHNwaW5fdW5sb2NrX2JoKCZicl9mZGJfY2JfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKGJyX2ZkYl9yZWdpc3Rlcl9jYW5fZXhwaXJlX2NiKTsKKwordm9pZCBicl9mZGJfZGVyZWdpc3Rlcl9jYW5fZXhwaXJlX2NiKCkKK3sKKyAgICAgICAgc3Bpbl9sb2NrX2JoKCZicl9mZGJfY2JfbG9jayk7CisgICAgICAgIGJyX2ZkYl9jYW5fZXhwaXJlID0gTlVMTDsKKyAgICAgICAgc3Bpbl91bmxvY2tfYmgoJmJyX2ZkYl9jYl9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woYnJfZmRiX2RlcmVnaXN0ZXJfY2FuX2V4cGlyZV9jYik7CisjZW5kaWYKKwogc3RhdGljIGludCBmZGJfdG9fbnVkKGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZmRiKQogewogCWlmIChmZGItPmlzX2xvY2FsKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMgYi9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYwppbmRleCA2OWUwYzhmLi5lYjYwMmI5IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYworKysgYi9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYwpAQCAtNDMsNyArNDMsMTEgQEAKIHsKIAkvKiBpcF9mcmFnbWVudCBkb2Vzbid0IGNvcHkgdGhlIE1BQyBoZWFkZXIgKi8KIAlpZiAobmZfYnJpZGdlX21heWJlX2NvcHlfaGVhZGVyKHNrYikgfHwKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJICAgIChwYWNrZXRfbGVuZ3RoKHNrYikgPiBza2ItPmRldi0+bXR1ICYmICFza2JfaXNfZ3NvKHNrYikgJiYgKCFza2ItPmlwc2VjX29mZmxvYWQpKSkgeworI2Vsc2UKIAkgICAgKHBhY2tldF9sZW5ndGgoc2tiKSA+IHNrYi0+ZGV2LT5tdHUgJiYgIXNrYl9pc19nc28oc2tiKSkpIHsKKyNlbmRpZgogCQlrZnJlZV9za2Ioc2tiKTsKIAl9IGVsc2UgewogCQlza2JfcHVzaChza2IsIEVUSF9ITEVOKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaW5wdXQuYyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwppbmRleCA5ODhjMzAwLi5iNDU3ZmQ3IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMKKysrIGIvbmV0L2JyaWRnZS9icl9pbnB1dC5jCkBAIC03MCw2ICs3MCwxMCBAQAogCiAJQlJfSU5QVVRfU0tCX0NCKHNrYiktPmJyZGV2ID0gYnItPmRldjsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pCisJc2tiLT5jYls0XSA9IDA7CisjZW5kaWYKKwogCS8qIFRoZSBwYWNrZXQgc2tiMiBnb2VzIHRvIHRoZSBsb2NhbCBob3N0IChOVUxMIHRvIHNraXApLiAqLwogCXNrYjIgPSBOVUxMOwogCkBAIC0xMDgsNiArMTEyLDEwIEBACiAJaWYgKHNrYikgewogCQlpZiAoZHN0KSB7CiAJCQlkc3QtPnVzZWQgPSBqaWZmaWVzOworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pCisJCQkvKiBVc2VkIGJ5IEFCTSBtb2R1bGUgKi8KKwkJCXNrYi0+Y2JbNF0gPSAxOworI2VuZGlmCiAJCQlicl9mb3J3YXJkKGRzdC0+ZHN0LCBza2IsIHNrYjIpOwogCQl9IGVsc2UKIAkJCWJyX2Zsb29kX2ZvcndhcmQoYnIsIHNrYiwgc2tiMik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCmluZGV4IDRkNmZiNjIuLjRjNmRiYmQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCisrKyBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCkBAIC0zNTksNiArMzU5LDEwIEBACiBleHRlcm4gdm9pZCBicl9mZGJfdXBkYXRlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAkJCSAgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqc291cmNlLAogCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyKTsKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0NPTUNFUlRPKQorCWV4dGVybiB2b2lkIGJyX2ZkYl9yZWdpc3Rlcl9jYW5fZXhwaXJlX2NiKGludCgqY2IpKHVuc2lnbmVkIGNoYXIgKm1hY19hZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KSk7IAorCWV4dGVybiB2b2lkIGJyX2ZkYl9kZXJlZ2lzdGVyX2Nhbl9leHBpcmVfY2Iodm9pZCk7CisjZW5kaWYgCiBleHRlcm4gaW50IGJyX2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiBleHRlcm4gaW50IGJyX2ZkYl9hZGQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZyk7CiBleHRlcm4gaW50IGJyX2ZkYl9kZWxldGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsIHZvaWQgKmFyZyk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jIGIvbmV0L2JyaWRnZS9icl9zdHBfaWYuYwppbmRleCAxOTMwOGUzLi40M2Q2N2FhIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N0cF9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwX2lmLmMKQEAgLTEyMSw2ICsxMjEsMTAgQEAKIAogCWlmIChicl9pc19yb290X2JyaWRnZShicikgJiYgIXdhc3Jvb3QpCiAJCWJyX2JlY29tZV9yb290X2JyaWRnZShicik7CisKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0NPTUNFUlRPKQorCWNhbGxfYnJldmVudF9ub3RpZmllcnMoQlJFVkVOVF9QT1JUX0RPV04sIHAtPmRldik7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgYnJfc3RwX3N0YXJ0KHN0cnVjdCBuZXRfYnJpZGdlICpicikKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2RhdGFncmFtLmMgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCmluZGV4IDY4YmJmOWYuLjYyNGI2YjggMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2RhdGFncmFtLmMKKysrIGIvbmV0L2NvcmUvZGF0YWdyYW0uYwpAQCAtMTI4LDYgKzEyOCwxODggQEAKIAlnb3RvIG91dDsKIH0KIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0lNUFJPVkVEX1NQTElDRSkKKy8qCisgKglza2JfY29weV9kYXRhZ3JhbV90b19rZXJuZWxfaW92ZWMgLSBDb3B5IGEgZGF0YWdyYW0gdG8gYSBrZXJuZWwgaW92ZWMgc3RydWN0dXJlLgorICoJQHNrYjogYnVmZmVyIHRvIGNvcHkKKyAqCUBvZmZzZXQ6IG9mZnNldCBpbiB0aGUgYnVmZmVyIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbQorICoJQHRvOiBpbyB2ZWN0b3IgdG8gY29weSB0bworICoJQGxlbjogYW1vdW50IG9mIGRhdGEgdG8gY29weSBmcm9tIGJ1ZmZlciB0byBpb3ZlYworICoKKyAqCU5vdGU6IHRoZSBpb3ZlYyBpcyBtb2RpZmllZCBkdXJpbmcgdGhlIGNvcHkuCisgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9VU0VfTURNQSkKK2ludCBza2JfY29weV9kYXRhZ3JhbV90b19rZXJuZWxfaW92ZWNfc29mdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgIHN0cnVjdCBpb3ZlYyAqdG8sIGludCBsZW4pCisjZWxzZQoraW50IHNrYl9jb3B5X2RhdGFncmFtX3RvX2tlcm5lbF9pb3ZlYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgIHN0cnVjdCBpb3ZlYyAqdG8sIGludCBsZW4pCisjZW5kaWYKK3sKKwlpbnQgaSwgZnJhZ2xlbiwgZW5kID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OworCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCituZXh0X3NrYjoKKwlmcmFnbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlpID0gLTE7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgc3RhcnQgPSBlbmQ7CisKKwkJaWYgKChlbmQgKz0gZnJhZ2xlbikgPiBvZmZzZXQpIHsKKwkJCWludCBjb3B5ID0gZW5kIC0gb2Zmc2V0OworCQkJaW50IG8gPSBvZmZzZXQgLSBzdGFydDsKKworCQkJaWYgKGNvcHkgPiBsZW4pCisJCQkJY29weSA9IGxlbjsKKwkJCWlmIChpID09IC0xKQorCQkJCW1lbWNweV90b2tlcm5lbGlvdmVjKHRvLCBza2ItPmRhdGEgKyBvLCBjb3B5KTsKKwkJCWVsc2UgeworCQkJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNrYl9mcmFnX3BhZ2UoZnJhZyk7CisJCQkJdm9pZCAqcCA9IGttYXAocGFnZSkgKyBmcmFnLT5wYWdlX29mZnNldCArIG87CisJCQkJbWVtY3B5X3Rva2VybmVsaW92ZWModG8sIHAsIGNvcHkpOworCQkJCWt1bm1hcChwYWdlKTsKKwkJCX0KKworCQkJaWYgKCEobGVuIC09IGNvcHkpKQorCQkJCXJldHVybiAwOworCQkJb2Zmc2V0ICs9IGNvcHk7CisJCX0KKwkJaWYgKCsraSA+PSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzKQorCQkJYnJlYWs7CisJCWZyYWdsZW4gPSBza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldLnNpemU7CisJfQorCWlmIChuZXh0KSB7CisJCXNrYiA9IG5leHQ7CisJCUJVR19PTihza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCk7CisJCW5leHQgPSBza2ItPm5leHQ7CisJCWdvdG8gbmV4dF9za2I7CisJfQorCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19TUExJQ0VfVVNFX01ETUEpCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvZG1hLmg+CitpbnQgc2tiX2NvcHlfZGF0YWdyYW1fdG9fa2VybmVsX2lvdmVjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsCisJCQkJICAgICAgc3RydWN0IGlvdmVjICp0bywgaW50IGxlbikKK3sKKwlpbnQgaSwgcmV0LCBmcmFnbGVuLCBjb3B5LCBvLCBlbmQgPSAwOworCXN0cnVjdCBza19idWZmICpuZXh0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CisKKwlzdHJ1Y3QgY29tY2VydG9fZG1hX3NnICpzZzsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgdG90YWxfbGVuLCBpbnB1dF9sZW47CisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJdG90YWxfbGVuID0gbGVuOworCQorCXNpemUgPSBzaXplb2Yoc3RydWN0IGNvbWNlcnRvX2RtYV9zZyk7CisJc2cgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOworCWlmICghc2cpCisJCXJldHVybiBza2JfY29weV9kYXRhZ3JhbV90b19rZXJuZWxfaW92ZWNfc29mdCAoc2tiLCBvZmZzZXQsIHRvLCBsZW4pOworCisJY29tY2VydG9fZG1hX3NnX2luaXQoc2cpOworCituZXh0X3NrYjoKKwlmcmFnbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlpID0gLTE7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgc3RhcnQgPSBlbmQ7CisKKwkJaWYgKChlbmQgKz0gZnJhZ2xlbikgPiBvZmZzZXQpIHsKK2N1cnJlbnRfZnJhZzoKKwkJCWNvcHkgPSBlbmQgLSBvZmZzZXQ7CisJCQlvID0gb2Zmc2V0IC0gc3RhcnQ7CisKKwkJCWlmIChjb3B5ID4gbGVuKQorCQkJCWNvcHkgPSBsZW47CisJCQkKKwkJCS8vIHByZXBhcmluZyBpbnB1dAorCQkJaWYgKGkgPT0gLTEpIHsKKwkJCQlyZXQgPSBjb21jZXJ0b19kbWFfc2dfYWRkX2lucHV0KHNnLCBza2ItPmRhdGEgKyBvLCBjb3B5LCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiX2ZyYWdfdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQkJCXN0cnVjdCBwYWdlICpwYWdlID0gc2tiX2ZyYWdfcGFnZShmcmFnKTsKKwkJCQl2b2lkICpwID0gcGFnZV9hZGRyZXNzKHBhZ2UpICsgZnJhZy0+cGFnZV9vZmZzZXQgKyBvOworCQkJCXJldCA9IGNvbWNlcnRvX2RtYV9zZ19hZGRfaW5wdXQoc2csIHAsIGNvcHksIDApOworCQkJfQorCQkJaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKKwkJCQlsZW4gLT0gY29weTsKKwkJCQlvZmZzZXQgKz0gY29weTsKKwkJCX0KKworCQkJaWYgKChsZW4gPT0gMCkgfHwgdW5saWtlbHkocmV0KSkKKwkJCXsKKwkJCQlpbnB1dF9sZW4gPSB0b3RhbF9sZW4gLSBsZW47CisJCQkJbGVuID0gaW5wdXRfbGVuOworCQkJCS8vcHJlcGFyaW5nIG91dHB1dAorCQkJCXdoaWxlIChsZW4gPiAwKSB7CisJCQkJCWlmICh0by0+aW92X2xlbikgeworCQkJCQkJaW50IGNvcHkgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHRvLT5pb3ZfbGVuLCBsZW4pOworCisJCQkJCQlyZXQgPSBjb21jZXJ0b19kbWFfc2dfYWRkX291dHB1dChzZywgdG8tPmlvdl9iYXNlLCBjb3B5LCAxKTsKKwkJCQkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkJCQkJLyogbm8gY2xlYW4gd2F5IG91dCwgYnV0IHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB0aGUgd2F5CisJCQkJCQkJICogc2tiX2NvcHlfZGF0YWdyYW1fdG9fa2VybmVsX2lvdmVjIGlzIGNhbGxlZCBjdXJyZW50bHkuCisJCQkJCQkJICovCisJCQkJCQkJY29tY2VydG9fZG1hX3NnX2NsZWFudXAoc2csIGlucHV0X2xlbik7CisJCQkJCQkJa2ZyZWUoc2cpOworCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJfQorCQkJCQkJbGVuIC09IGNvcHk7CisJCQkJCQl0by0+aW92X2Jhc2UgKz0gY29weTsKKwkJCQkJCXRvLT5pb3ZfbGVuIC09IGNvcHk7CisJCQkJCX0KKwkJCQkJaWYgKHRvLT5pb3ZfbGVuID09IDApCisJCQkJCQl0bysrOworCQkJCX0KKworCQkJCS8vbGV0J3MgcnVuIHRoZSBkbWEgb3BlcmF0aW9uCisJCQkJY29tY2VydG9fZG1hX2dldCgpOworCQkJCWNvbWNlcnRvX2RtYV9zZ19zZXR1cChzZywgaW5wdXRfbGVuKTsKKwkJCQljb21jZXJ0b19kbWFfc3RhcnQoKTsKKwkJCQljb21jZXJ0b19kbWFfd2FpdCgpOworCQkJCWNvbWNlcnRvX2RtYV9wdXQoKTsKKwkJCQljb21jZXJ0b19kbWFfc2dfY2xlYW51cChzZywgaW5wdXRfbGVuKTsKKworCQkJCXRvdGFsX2xlbiA9IHRvdGFsX2xlbiAtIGlucHV0X2xlbjsKKwkJCQlpZiAodG90YWxfbGVuKSB7Ly8gWWVzID0+IGxhc3QgaW5wdXQgZnJhZ21lbnQgZmFpbGVkLCBhZGQgaXQgYWdhaW4KKwkJCQkJY29tY2VydG9fZG1hX3NnX2luaXQoc2cpOworCQkJCQlnb3RvIGN1cnJlbnRfZnJhZzsKKwkJCQl9IGVsc2UgeyAvL0V2ZXJ5dGhpbmcgY29waWVkLCBleGl0IHN1Y2Nlc3NmdWxseQorCQkJCQlrZnJlZShzZyk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJfQorCQl9CisJCWlmICgrK2kgPj0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncykKKwkJCWJyZWFrOworCQlmcmFnbGVuID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXS5zaXplOworCX0KKwlpZiAobmV4dCkgeworCQlza2IgPSBuZXh0OworCQlCVUdfT04oc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3QpOworCQluZXh0ID0gc2tiLT5uZXh0OworCQlnb3RvIG5leHRfc2tiOworCX0KKworCWNvbWNlcnRvX2RtYV9zZ19jbGVhbnVwKHNnLCB0b3RhbF9sZW4gLSBsZW4pOworCWtmcmVlKHNnKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKyNlbmRpZgorI2VuZGlmCisKIC8qKgogICoJX19za2JfcmVjdl9kYXRhZ3JhbSAtIFJlY2VpdmUgYSBkYXRhZ3JhbSBza2J1ZmYKICAqCUBzazogc29ja2V0CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IDU3Mzg2NTQuLjM1YWMyZjYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0yNDYwLDYgKzI0NjAsMTYgQEAKICAqLwogaW50IGRldl9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IpCiB7CisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9DT01DRVJUTykKKwlpZiAoc2tiLT5kZXYtPmZsYWdzICYgSUZGX1dJRklfT0ZMRCkKKwkJc2tiLT5kZXYgPSBza2ItPmRldi0+d2lmaV9vZmZsb2FkX2RldjsKKworCXJldHVybiBvcmlnaW5hbF9kZXZfcXVldWVfeG1pdChza2IpOworfQorCitpbnQgb3JpZ2luYWxfZGV2X3F1ZXVlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNlbmRpZgogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CiAJc3RydWN0IFFkaXNjICpxOwpAQCAtMjUzOSw2ICsyNTQ5LDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGRldl9xdWV1ZV94bWl0KTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pCitFWFBPUlRfU1lNQk9MKG9yaWdpbmFsX2Rldl9xdWV1ZV94bWl0KTsKKyNlbmRpZgorCiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAkJCVJlY2VpdmVyIHJvdXRpbmVzCkBAIC0zMzY3LDYgKzMzODEsNTIgQEAKIH0KIEVYUE9SVF9TWU1CT0wobmV0aWZfcmVjZWl2ZV9za2IpOwogCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9DT01DRVJUTykKK2ludCBjYXB0dXJlX3JlY2VpdmVfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisgICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpudWxsX29yX29yaWcgPSBOVUxMOworICAgICAgICBzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLCAqcHRfcHJldjsKKyAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2OworICAgICAgICBpbnQgcmV0ID0gTkVUX1JYX0RST1A7CisKKwlpZiAoIW5ldGRldl90c3RhbXBfcHJlcXVldWUpCisJCW5ldF90aW1lc3RhbXBfY2hlY2soc2tiKTsKKworICAgICAgICBpZiAoIXNrYi0+c2tiX2lpZikKKyAgICAgICAgICAgICAgICBza2ItPnNrYl9paWYgPSBza2ItPmRldi0+aWZpbmRleDsKKworICAgICAgICBza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKyAgICAgICAgc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwlza2JfcmVzZXRfbWFjX2xlbihza2IpOworCisgICAgICAgIHB0X3ByZXYgPSBOVUxMOworICAgICAgICBvcmlnX2RldiA9IHNrYi0+ZGV2OworCisgICAgICAgIHJjdV9yZWFkX2xvY2soKTsKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHR5cGUsICZwdHlwZV9hbGwsIGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXB0eXBlLT5kZXYgfHwgcHR5cGUtPmRldiA9PSBza2ItPmRldikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0X3ByZXYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGRlbGl2ZXJfc2tiKHNrYiwgcHRfcHJldiwgb3JpZ19kZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgcHRfcHJldiA9IHB0eXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwdF9wcmV2KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcHRfcHJldi0+ZnVuYyhza2IsIHNrYi0+ZGV2LCBwdF9wcmV2LCBvcmlnX2Rldik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAga2ZyZWVfc2tiKHNrYik7CisgICAgICAgICAgICAgICAgLyogSmFtYWwsIG5vdyB5b3Ugd2lsbCBub3QgYWJsZSB0byBlc2NhcGUgZXhwbGFpbmluZworICAgICAgICAgICAgICAgICAqIG1lIGhvdyB5b3Ugd2VyZSBnb2luZyB0byB1c2UgdGhpcy4gOi0pCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0ID0gTkVUX1JYX0RST1A7CisgICAgICAgIH0KKyAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCk7CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woY2FwdHVyZV9yZWNlaXZlX3NrYik7CisjZW5kaWYKKwogLyogTmV0d29yayBkZXZpY2UgaXMgZ29pbmcgYXdheSwgZmx1c2ggYW55IHBhY2tldHMgc3RpbGwgcGVuZGluZwogICogQ2FsbGVkIHdpdGggaXJxcyBkaXNhYmxlZC4KICAqLwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmxvdy5jIGIvbmV0L2NvcmUvZmxvdy5jCmluZGV4IGUzMThjN2UuLmEwZTllYWEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Zsb3cuYworKysgYi9uZXQvY29yZS9mbG93LmMKQEAgLTIyLDYgKzIyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxuZXQvZmxvdy5oPgorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKyNpbmNsdWRlIDxuZXQveGZybS5oPgorI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KIApAQCAtMzYsNiArMzksMTAgQEAKIAl1MzIJCQkJZ2VuaWQ7CiAJc3RydWN0IGZsb3dpCQkJa2V5OwogCXN0cnVjdCBmbG93X2NhY2hlX29iamVjdAkqb2JqZWN0OworI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwl1OAkJCQlmbGFnczsKKwkjZGVmaW5lIEZMT1dfQ0FDSEVfRkxBR19JUFNFQ19PRkZMT0FEIDB4MDEKKyNlbmRpZgogfTsKIAogc3RydWN0IGZsb3dfY2FjaGVfcGVyY3B1IHsKQEAgLTQ0LDYgKzUxLDkgQEAKIAl1MzIJCQkJaGFzaF9ybmQ7CiAJaW50CQkJCWhhc2hfcm5kX3JlY2FsYzsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJCWZsdXNoX3Rhc2tsZXQ7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkJZmxvd2NhY2hlX3JlbV90YXNrbGV0OworI2VuZGlmCiB9OwogCiBzdHJ1Y3QgZmxvd19mbHVzaF9pbmZvIHsKQEAgLTYxLDYgKzcxLDE2IEBACiAJc3RydWN0IHRpbWVyX2xpc3QJCXJuZF90aW1lcjsKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCitzdHJ1Y3QgZmxvd19yZW1vdmVfaW5mbyB7CisJc3RydWN0IGZsb3dfY2FjaGUJCSpjYWNoZTsKKwlzdHJ1Y3QgZmxvd2kJCQkqa2V5OworCXVuc2lnbmVkIHNob3J0CQkJZmFtaWx5OworCXVuc2lnbmVkIHNob3J0CQkJZGlyOworCWF0b21pY190CQkJY3B1bGVmdDsKKwlzdHJ1Y3QgY29tcGxldGlvbgkJY29tcGxldGlvbjsKK307CisjZW5kaWYKIGF0b21pY190IGZsb3dfY2FjaGVfZ2VuaWQgPSBBVE9NSUNfSU5JVCgwKTsKIEVYUE9SVF9TWU1CT0woZmxvd19jYWNoZV9nZW5pZCk7CiBzdGF0aWMgc3RydWN0IGZsb3dfY2FjaGUgZmxvd19jYWNoZV9nbG9iYWw7CkBAIC03Miw2ICs5MiwxMCBAQAogI2RlZmluZSBmbG93X2NhY2hlX2hhc2hfc2l6ZShjYWNoZSkJKDEgPDwgKGNhY2hlKS0+aGFzaF9zaGlmdCkKICNkZWZpbmUgRkxPV19IQVNIX1JORF9QRVJJT0QJCSgxMCAqIDYwICogSFopCiAKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCitleHRlcm4gaW50IGlwc2VjX25sa2V5X2Zsb3dfcmVtb3ZlKHN0cnVjdCBmbG93aSAqZmwsIHUxNiBmYW1pbHksIHUxNiBkaXIpOworI2VuZGlmCisKIHN0YXRpYyB2b2lkIGZsb3dfY2FjaGVfbmV3X2hhc2hybmQodW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGZsb3dfY2FjaGUgKmZjID0gKHZvaWQgKikgYXJnOwpAQCAtMTEwLDggKzEzNCwxNCBAQAogCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmZmxvd19jYWNoZV9nY19saXN0LCAmZ2NfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJmZsb3dfY2FjaGVfZ2NfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmNlLCBuLCAmZ2NfbGlzdCwgdS5nY19saXN0KQorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmY2UsIG4sICZnY19saXN0LCB1LmdjX2xpc3QpIHsKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJCS8qY2FsbCBubF9rZXlfZmxvd19yZW1vdmUqLworCQlpZiAoZmNlLT5mbGFncyAmIEZMT1dfQ0FDSEVfRkxBR19JUFNFQ19PRkZMT0FEKQorCQkJaXBzZWNfbmxrZXlfZmxvd19yZW1vdmUoJmZjZS0+a2V5LCBmY2UtPmZhbWlseSwgZmNlLT5kaXIpOworI2VuZGlmCiAJCWZsb3dfZW50cnlfa2lsbChmY2UpOworCX0KIH0KIHN0YXRpYyBERUNMQVJFX1dPUksoZmxvd19jYWNoZV9nY193b3JrLCBmbG93X2NhY2hlX2djX3Rhc2spOwogCkBAIC0yMDQsOSArMjM0LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCitzdHJ1Y3QgZmxvd19jYWNoZV9vYmplY3QgKgorZmxvd19jYWNoZV9sb29rdXAoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmtleSwgdTE2IGZhbWlseSwgdTggZGlyLAorCQkJdTggKm5ld19mbG93LCBmbG93X3Jlc29sdmVfdCByZXNvbHZlciwgdm9pZCAqY3R4KQorI2Vsc2UKIHN0cnVjdCBmbG93X2NhY2hlX29iamVjdCAqCiBmbG93X2NhY2hlX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBmbG93aSAqa2V5LCB1MTYgZmFtaWx5LCB1OCBkaXIsCiAJCSAgZmxvd19yZXNvbHZlX3QgcmVzb2x2ZXIsIHZvaWQgKmN0eCkKKyNlbmRpZgogewogCXN0cnVjdCBmbG93X2NhY2hlICpmYyA9ICZmbG93X2NhY2hlX2dsb2JhbDsKIAlzdHJ1Y3QgZmxvd19jYWNoZV9wZXJjcHUgKmZjcDsKQEAgLTIxNiw2ICsyNTIsMTEgQEAKIAlzaXplX3Qga2V5c2l6ZTsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIAorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwlpZiAobmV3X2Zsb3cpCisJCSpuZXdfZmxvdyA9IDA7CisjZW5kaWYKKwogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlmY3AgPSB0aGlzX2NwdV9wdHIoZmMtPnBlcmNwdSk7CiAKQEAgLTI4MSw4ICszMjIsMTUgQEAKIAlmbG8gPSByZXNvbHZlcihuZXQsIGtleSwgZmFtaWx5LCBkaXIsIGZsbywgY3R4KTsKIAlpZiAoZmxlKSB7CiAJCWZsZS0+Z2VuaWQgPSBhdG9taWNfcmVhZCgmZmxvd19jYWNoZV9nZW5pZCk7Ci0JCWlmICghSVNfRVJSKGZsbykpCisJCWlmICghSVNfRVJSKGZsbykpIHsKIAkJCWZsZS0+b2JqZWN0ID0gZmxvOworI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwkJCWlmIChuZXdfZmxvdykgeworCQkJCSpuZXdfZmxvdyA9IDE7CisJCQkJZmxlLT5mbGFncyB8PSBGTE9XX0NBQ0hFX0ZMQUdfSVBTRUNfT0ZGTE9BRDsKKwkJCX0KKyNlbmRpZgorCQl9CiAJCWVsc2UKIAkJCWZsZS0+Z2VuaWQtLTsKIAl9IGVsc2UgewpAQCAtMzU4LDYgKzQwNiw4MyBAQAogCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorc3RhdGljIHZvaWQgZmxvd19jYWNoZV9yZW1vdmVfcGVyX2NwdSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBmbG93X3JlbW92ZV9pbmZvKiBpbmZvID0gZGF0YTsKKwlpbnQgY3B1OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdGFza2xldDsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwl0YXNrbGV0ID0gJnBlcl9jcHVfcHRyKGluZm8tPmNhY2hlLT5wZXJjcHUsIGNwdSktPmZsb3djYWNoZV9yZW1fdGFza2xldDsKKwl0YXNrbGV0LT5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaW5mbzsKKwl0YXNrbGV0X3NjaGVkdWxlKHRhc2tsZXQpOworfQorCit2b2lkIGZsb3dfY2FjaGVfcmVtb3ZlX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKSAKK3sKKwlzdHJ1Y3QgZmxvd19yZW1vdmVfaW5mbyogaW5mbyA9IChzdHJ1Y3QgZmxvd19yZW1vdmVfaW5mbyopIGRhdGE7CisJc3RydWN0IGZsb3dfY2FjaGUgKmZjID0gJmZsb3dfY2FjaGVfZ2xvYmFsOworCXN0cnVjdCBmbG93X2NhY2hlX3BlcmNwdSAqZmNwOworCXN0cnVjdCBmbG93X2NhY2hlX2VudHJ5ICpmbGU7CisJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OworCXNpemVfdCBrZXlzaXplOworCXVuc2lnbmVkIGludCBoYXNoOworCXN0cnVjdCBmbG93aSAqa2V5ID0gaW5mby0+a2V5OworCXVuc2lnbmVkIHNob3J0IGZhbWlseSA9IGluZm8tPmZhbWlseTsKKwl1bnNpZ25lZCBzaG9ydCBkaXIgPSBpbmZvLT5kaXI7CisKKwlmY3AgPSB0aGlzX2NwdV9wdHIoZmMtPnBlcmNwdSk7CisJCisJa2V5c2l6ZSA9IGZsb3dfa2V5X3NpemUoZmFtaWx5KTsKKwlpZiAoIWtleXNpemUpCisJCWdvdG8gbm9jYWNoZTsKKworCWhhc2ggPSBmbG93X2hhc2hfY29kZShmYywgZmNwLCBrZXksIGtleXNpemUpOworCQorCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZsZSwgZW50cnksICZmY3AtPmhhc2hfdGFibGVbaGFzaF0sIHUuaGxpc3QpIHsKKwkJaWYoKGZsZS0+ZmFtaWx5ID09IGZhbWlseSkgJiYgKGZsZS0+ZGlyID09IGRpcikgJiYgKGZsb3dfa2V5X2NvbXBhcmUoJmZsZS0+a2V5LCBrZXksIGtleXNpemUpID09IDApKSB7CisJCQlobGlzdF9kZWwoJmZsZS0+dS5obGlzdCk7CisJCQlmbG93X2VudHJ5X2tpbGwoZmxlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCQkKK25vY2FjaGU6CQorCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZpbmZvLT5jcHVsZWZ0KSkKKwkJY29tcGxldGUoJmluZm8tPmNvbXBsZXRpb24pOworCXJldHVybjsKK30KKwordm9pZCBmbG93X2NhY2hlX3JlbW92ZShjb25zdCBzdHJ1Y3QgZmxvd2kgKmtleSwKKwkJCXVuc2lnbmVkIHNob3J0IGZhbWlseSwgdW5zaWduZWQgc2hvcnQgZGlyKQoreworCXN0cnVjdCBmbG93X3JlbW92ZV9pbmZvIGluZm87CisJc3RhdGljIERFRklORV9NVVRFWChmbG93X3JlbV9zZW0pOworCisJLyogRG9uJ3Qgd2FudCBjcHVzIGdvaW5nIGRvd24gb3IgdXAgZHVyaW5nIHRoaXMuICovCisJZ2V0X29ubGluZV9jcHVzKCk7CisJbXV0ZXhfbG9jaygmZmxvd19yZW1fc2VtKTsKKwlpbmZvLmNhY2hlID0gJmZsb3dfY2FjaGVfZ2xvYmFsOworCWluZm8ua2V5ID0gKHN0cnVjdCBmbG93aSopa2V5OworCS8vbWVtY3B5KCZpbmZvLmtleSwga2V5LCBzaXplb2Yoc3RydWN0IGZsb3dpKSk7CisJaW5mby5mYW1pbHkgPSBmYW1pbHk7CisJaW5mby5kaXIgPSBkaXI7CisgICAgICAgIGF0b21pY19zZXQoJmluZm8uY3B1bGVmdCwgbnVtX29ubGluZV9jcHVzKCkpOworICAgICAgICBpbml0X2NvbXBsZXRpb24oJmluZm8uY29tcGxldGlvbik7CisKKyAgICAgICAgbG9jYWxfYmhfZGlzYWJsZSgpOworCXNtcF9jYWxsX2Z1bmN0aW9uKGZsb3dfY2FjaGVfcmVtb3ZlX3Blcl9jcHUsICZpbmZvLCAxKTsKKwlmbG93X2NhY2hlX3JlbW92ZV90YXNrbGV0KCh1bnNpZ25lZCBsb25nKSZpbmZvKTsKKyAgICAgICAgbG9jYWxfYmhfZW5hYmxlKCk7CisKKyAgICAgICAgd2FpdF9mb3JfY29tcGxldGlvbigmaW5mby5jb21wbGV0aW9uKTsKKyAgICAgICAgbXV0ZXhfdW5sb2NrKCZmbG93X3JlbV9zZW0pOworICAgICAgICBwdXRfb25saW5lX2NwdXMoKTsKK30KKworI2VuZGlmCisKIHN0YXRpYyB2b2lkIGZsb3dfY2FjaGVfZmx1c2hfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJZmxvd19jYWNoZV9mbHVzaCgpOwpAQCAtMzg0LDYgKzUwOSw5IEBACiAJCWZjcC0+aGFzaF9ybmRfcmVjYWxjID0gMTsKIAkJZmNwLT5oYXNoX2NvdW50ID0gMDsKIAkJdGFza2xldF9pbml0KCZmY3AtPmZsdXNoX3Rhc2tsZXQsIGZsb3dfY2FjaGVfZmx1c2hfdGFza2xldCwgMCk7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCQl0YXNrbGV0X2luaXQoJmZjcC0+Zmxvd2NhY2hlX3JlbV90YXNrbGV0LCBmbG93X2NhY2hlX3JlbW92ZV90YXNrbGV0LCAwKTsKKyNlbmRpZgogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL2lvdmVjLmMgYi9uZXQvY29yZS9pb3ZlYy5jCmluZGV4IGM0MGYyN2UuLjY2NjVjMGMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2lvdmVjLmMKKysrIGIvbmV0L2NvcmUvaW92ZWMuYwpAQCAtMTI0LDYgKzEyNCwyOCBAQAogfQogRVhQT1JUX1NZTUJPTChtZW1jcHlfdG9pb3ZlY2VuZCk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19JTVBST1ZFRF9TUExJQ0UpCisvKgorICoJSW4ga2VybmVsIGNvcHkgdG8gaW92ZWMuIFJldHVybnMgLUVGQVVMVCBvbiBlcnJvci4KKyAqCisgKglOb3RlOiB0aGlzIG1vZGlmaWVzIHRoZSBvcmlnaW5hbCBpb3ZlYy4KKyAqLwordm9pZCBtZW1jcHlfdG9rZXJuZWxpb3ZlYyhzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgY2hhciAqa2RhdGEsIGludCBsZW4pCit7CisJd2hpbGUgKGxlbiA+IDApIHsKKwkJaWYgKGlvdi0+aW92X2xlbikgeworCQkJaW50IGNvcHkgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGlvdi0+aW92X2xlbiwgbGVuKTsKKwkJCW1lbWNweShpb3YtPmlvdl9iYXNlLCBrZGF0YSwgY29weSk7CisJCQlsZW4gLT0gY29weTsKKwkJCWtkYXRhICs9IGNvcHk7CisJCQlpb3YtPmlvdl9iYXNlICs9IGNvcHk7CisJCQlpb3YtPmlvdl9sZW4gLT0gY29weTsKKwkJfQorCQlpb3YrKzsKKwl9Cit9CisjZW5kaWYKKwogLyoKICAqCUNvcHkgaW92ZWMgdG8ga2VybmVsLiBSZXR1cm5zIC1FRkFVTFQgb24gZXJyb3IuCiAgKgpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwppbmRleCA3YWFmYWVkLi5mYmE1OGI4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZWlnaGJvdXIuYworKysgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwpAQCAtMTEzOCw2ICsxMTM4LDEwIEBACiAJCQkJCQkgbmVpZ2gtPnBhcm1zLT5yZWFjaGFibGVfdGltZSA6CiAJCQkJCQkgMCkpKTsKIAkJbmVpZ2gtPm51ZF9zdGF0ZSA9IG5ldzsKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fRlAKKwkJaWYgKChvbGQgJiAoTlVEX1NUQUxFIHwgTlVEX0RFTEFZIHwgTlVEX1BST0JFKSkgJiYgKG5ldyAmIE5VRF9SRUFDSEFCTEUpKQorCQkJbm90aWZ5ID0gMTsKKyNlbmRpZgogCX0KIAogCWlmIChsbGFkZHIgIT0gbmVpZ2gtPmhhKSB7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9ydG5ldGxpbmsuYyBiL25ldC9jb3JlL3J0bmV0bGluay5jCmluZGV4IDJlZjg1OWEuLjQwM2EyNTMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3J0bmV0bGluay5jCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC02MjIsNyArNjIyLDQwIEBACiAJcmV0dXJuIC1FTVNHU0laRTsKIH0KIEVYUE9SVF9TWU1CT0wocnRuZXRsaW5rX3B1dF9tZXRyaWNzKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9DT01DRVJUTworaW50IHJ0bmV0bGlua19wdXRfbWV0cmljc18yKHN0cnVjdCBza19idWZmICpza2IsIHUzMiAqbWV0cmljcywgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQoreworCXN0cnVjdCBubGF0dHIgKm14OworCWludCBpLCB2YWxpZCA9IDA7CiAKKwlteCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgUlRBX01FVFJJQ1MpOworCWlmIChteCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlRBWF9NQVg7IGkrKykgeworCQlpZiAobWV0cmljc1tpXSkgeworCQkJdmFsaWQrKzsKKwkJCU5MQV9QVVRfVTMyKHNrYiwgaSsxLCBtZXRyaWNzW2ldKTsKKwkJfQorCQllbHNlIGlmICgoaSArIDEpID09IFJUQVhfTVRVKXsKKwkJCXZhbGlkKys7CisJCQlOTEFfUFVUX1UzMihza2IsIGkrMSwgZHN0X210dShkc3QpKTsKKwkJfQorCX0KKworCWlmICghdmFsaWQpIHsKKwkJbmxhX25lc3RfY2FuY2VsKHNrYiwgbXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gbmxhX25lc3RfZW5kKHNrYiwgbXgpOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxhX25lc3RfY2FuY2VsKHNrYiwgbXgpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CitFWFBPUlRfU1lNQk9MKHJ0bmV0bGlua19wdXRfbWV0cmljc18yKTsKKyNlbmRpZgogaW50IHJ0bmxfcHV0X2NhY2hlaW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBpZCwKIAkJICAgICAgIHUzMiB0cywgdTMyIHRzYWdlLCBsb25nIGV4cGlyZXMsIHUzMiBlcnJvcikKIHsKQEAgLTE5MDIsMTQgKzE5MzUsMTQgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKLXZvaWQgcnRtc2dfaWZpbmZvKGludCB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFuZ2UpCit2b2lkIF9fcnRtc2dfaWZpbmZvKGludCB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFuZ2UsIGdmcF90IGZsYWdzKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnIgPSAtRU5PQlVGUzsKIAlzaXplX3QgaWZfaW5mb19zaXplOwogCi0Jc2tiID0gbmxtc2dfbmV3KChpZl9pbmZvX3NpemUgPSBpZl9ubG1zZ19zaXplKGRldikpLCBHRlBfS0VSTkVMKTsKKwlza2IgPSBubG1zZ19uZXcoKGlmX2luZm9fc2l6ZSA9IGlmX25sbXNnX3NpemUoZGV2KSksIGZsYWdzKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCkBAIC0xOTIyLDEyICsxOTU1LDI0IEBACiAJCWtmcmVlX3NrYihza2IpOwogCQlnb3RvIGVycm91dDsKIAl9Ci0JcnRubF9ub3RpZnkoc2tiLCBuZXQsIDAsIFJUTkxHUlBfTElOSywgTlVMTCwgR0ZQX0tFUk5FTCk7CisJcnRubF9ub3RpZnkoc2tiLCBuZXQsIDAsIFJUTkxHUlBfTElOSywgTlVMTCwgZmxhZ3MpOwogCXJldHVybjsKIGVycm91dDoKIAlpZiAoZXJyIDwgMCkKIAkJcnRubF9zZXRfc2tfZXJyKG5ldCwgUlROTEdSUF9MSU5LLCBlcnIpOwogfQorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfQ09NQ0VSVE8pCitFWFBPUlRfU1lNQk9MKF9fcnRtc2dfaWZpbmZvKTsKKyNlbmRpZgorCit2b2lkIHJ0bXNnX2lmaW5mbyhpbnQgdHlwZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhbmdlKQoreworCV9fcnRtc2dfaWZpbmZvKHR5cGUsIGRldiwgY2hhbmdlLCBHRlBfS0VSTkVMKTsKK30KKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19GUCkKK0VYUE9SVF9TWU1CT0wocnRtc2dfaWZpbmZvKTsKKyNlbmRpZgorCiAKIC8qIFByb3RlY3RlZCBieSBSVE5MIHNlbXBhaG9yZS4gICovCiBzdGF0aWMgc3RydWN0IHJ0YXR0ciAqKnJ0YV9idWY7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IGFmOWMzYzYuLmQzMjU5NDEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC0yMTgsNiArMjE4LDEwIEBACiAJc2tiLT5tYWNfaGVhZGVyID0gfjBVOwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19DVVNUT01fU0tCX0xBWU9VVCkKKwlza2ItPm1zcGRfZGF0YSA9IE5VTEw7CisJc2tiLT5tc3BkX2xlbiA9IDA7CisjZW5kaWYKIAkvKiBtYWtlIHN1cmUgd2UgaW5pdGlhbGl6ZSBzaGluZm8gc2VxdWVudGlhbGx5ICovCiAJc2hpbmZvID0gc2tiX3NoaW5mbyhza2IpOwogCW1lbXNldChzaGluZm8sIDAsIG9mZnNldG9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8sIGRhdGFyZWYpKTsKQEAgLTI0NCw2ICsyNDgsOTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woX19hbGxvY19za2IpOwogCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9DT01DRVJUTykKKy8qKgorICoJX19hbGxvY19za2JfaGVhZGVyCS0JYWxsb2NhdGUgYSBuZXR3b3JrIGJ1ZmZlcgorICoJQHNpemU6IHNpemUgdG8gYWxsb2NhdGUKKyAqCUBnZnBfbWFzazogYWxsb2NhdGlvbiBtYXNrCisgKglAZmNsb25lOiBhbGxvY2F0ZSBmcm9tIGZjbG9uZSBjYWNoZSBpbnN0ZWFkIG9mIGhlYWQgY2FjaGUKKyAqCQlhbmQgYWxsb2NhdGUgYSBjbG9uZWQgKGNoaWxkKSBza2IKKyAqCisgKglBbGxvY2F0ZSBhIG5ldyAmc2tfYnVmZi4gVGhlIHJldHVybmVkIGJ1ZmZlciBoYXMgbm8gaGVhZHJvb20gYW5kIGEKKyAqCXRhaWwgcm9vbSBvZiBzaXplIGJ5dGVzLiBUaGUgb2JqZWN0IGhhcyBhIHJlZmVyZW5jZSBjb3VudCBvZiBvbmUuCisgKglUaGUgcmV0dXJuIGlzIHRoZSBidWZmZXIuIE9uIGEgZmFpbHVyZSB0aGUgcmV0dXJuIGlzICVOVUxMLgorICoKKyAqCUJ1ZmZlcnMgbWF5IG9ubHkgYmUgYWxsb2NhdGVkIGZyb20gaW50ZXJydXB0cyB1c2luZyBhIEBnZnBfbWFzayBvZgorICoJJUdGUF9BVE9NSUMuCisgKi8KK3N0cnVjdCBza19idWZmICpfX2FsbG9jX3NrYl9oZWFkZXIodW5zaWduZWQgaW50IHNpemUsIHZvaWQgKmRhdGEsIGdmcF90IGdmcF9tYXNrLAorCQkJICAgIGludCBmY2xvbmUsIGludCBub2RlKQoreworCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZTsKKwlzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWNhY2hlID0gZmNsb25lID8gc2tidWZmX2ZjbG9uZV9jYWNoZSA6IHNrYnVmZl9oZWFkX2NhY2hlOworCisJaWYgKHNpemUgPD0gU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKSkgeworCQlza2IgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBHZXQgdGhlIEhFQUQgKi8KKwlza2IgPSBrbWVtX2NhY2hlX2FsbG9jX25vZGUoY2FjaGUsIGdmcF9tYXNrICYgfl9fR0ZQX0RNQSwgbm9kZSk7CisJaWYgKCFza2IpCisJCWdvdG8gb3V0OworCXByZWZldGNodyhza2IpOworCisJLyoga21hbGxvYyBtaWdodCBnaXZlIHVzIG1vcmUgcm9vbSB0aGFuIHJlcXVlc3RlZC4KKwkgKiBQdXQgc2tiX3NoYXJlZF9pbmZvIGV4YWN0bHkgYXQgdGhlIGVuZCBvZiBhbGxvY2F0ZWQgem9uZSwKKwkgKiB0byBhbGxvdyBtYXggcG9zc2libGUgZmlsbGluZyBiZWZvcmUgcmVhbGxvY2F0aW9uLgorCSAqLworCXNpemUgPSBTS0JfV0lUSF9PVkVSSEVBRChrc2l6ZShkYXRhKSk7CisJcHJlZmV0Y2h3KGRhdGEgKyBzaXplKTsKKworCS8qCisJICogT25seSBjbGVhciB0aG9zZSBmaWVsZHMgd2UgbmVlZCB0byBjbGVhciwgbm90IHRob3NlIHRoYXQgd2Ugd2lsbAorCSAqIGFjdHVhbGx5IGluaXRpYWxpc2UgYmVsb3cuIEhlbmNlLCBkb24ndCBwdXQgYW55IG1vcmUgZmllbGRzIGFmdGVyCisJICogdGhlIHRhaWwgcG9pbnRlciBpbiBzdHJ1Y3Qgc2tfYnVmZiEKKwkgKi8KKwltZW1zZXQoc2tiLCAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgdGFpbCkpOworCS8qIEFjY291bnQgZm9yIGFsbG9jYXRlZCBtZW1vcnkgOiBza2IgKyBza2ItPmhlYWQgKi8KKwlza2ItPnRydWVzaXplID0gU0tCX1RSVUVTSVpFKHNpemUpOworCWF0b21pY19zZXQoJnNrYi0+dXNlcnMsIDEpOworCXNrYi0+aGVhZCA9IGRhdGE7CisJc2tiLT5kYXRhID0gZGF0YTsKKwlza2JfcmVzZXRfdGFpbF9wb2ludGVyKHNrYik7CisJc2tiLT5lbmQgPSBza2ItPnRhaWwgKyBzaXplOworI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAorCXNrYi0+bWFjX2hlYWRlciA9IH4wVTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fQ1VTVE9NX1NLQl9MQVlPVVQpCisJc2tiLT5tc3BkX2RhdGEgPSBOVUxMOworCXNrYi0+bXNwZF9sZW4gPSAwOworI2VuZGlmCisKKwkvKiBtYWtlIHN1cmUgd2UgaW5pdGlhbGl6ZSBzaGluZm8gc2VxdWVudGlhbGx5ICovCisJc2hpbmZvID0gc2tiX3NoaW5mbyhza2IpOworCW1lbXNldChzaGluZm8sIDAsIG9mZnNldG9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8sIGRhdGFyZWYpKTsKKwlhdG9taWNfc2V0KCZzaGluZm8tPmRhdGFyZWYsIDEpOworCWttZW1jaGVja19hbm5vdGF0ZV92YXJpYWJsZShzaGluZm8tPmRlc3RydWN0b3JfYXJnKTsKKworCWlmIChmY2xvbmUpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmNoaWxkID0gc2tiICsgMTsKKwkJYXRvbWljX3QgKmZjbG9uZV9yZWYgPSAoYXRvbWljX3QgKikgKGNoaWxkICsgMSk7CisKKwkJa21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKGNoaWxkLCBmbGFnczEpOworCQlrbWVtY2hlY2tfYW5ub3RhdGVfYml0ZmllbGQoY2hpbGQsIGZsYWdzMik7CisJCXNrYi0+ZmNsb25lID0gU0tCX0ZDTE9ORV9PUklHOworCQlhdG9taWNfc2V0KGZjbG9uZV9yZWYsIDEpOworCisJCWNoaWxkLT5mY2xvbmUgPSBTS0JfRkNMT05FX1VOQVZBSUxBQkxFOworCX0KK291dDoKKwlyZXR1cm4gc2tiOworfQorRVhQT1JUX1NZTUJPTChfX2FsbG9jX3NrYl9oZWFkZXIpOworI2VuZGlmCisKIC8qKgogICoJX19uZXRkZXZfYWxsb2Nfc2tiIC0gYWxsb2NhdGUgYW4gc2tidWZmIGZvciByeCBvbiBhIHNwZWNpZmljIGRldmljZQogICoJQGRldjogbmV0d29yayBkZXZpY2UgdG8gcmVjZWl2ZSBvbgpAQCAtMzU2LDYgKzQ0NywxMyBAQAogCQkJc2tiX2Ryb3BfZnJhZ2xpc3Qoc2tiKTsKIAogCQlrZnJlZShza2ItPmhlYWQpOworCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fQ1VTVE9NX1NLQl9MQVlPVVQpCisJCWlmIChza2ItPm1zcGRfZGF0YSkgeworCQkJa2ZyZWUoc2tiLT5tc3BkX2RhdGEpOworCQkJc2tiLT5tc3BkX2RhdGEgPSBOVUxMOworCQl9CisjZW5kaWYKIAl9CiB9CiAKQEAgLTQ5Nyw2ICs1OTUsOSBAQAogewogCXN0cnVjdCBza2Jfc2hhcmVkX2luZm8gKnNoaW5mbzsKIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0NVU1RPTV9TS0JfTEFZT1VUKQorCVdBUk5fT04oc2tiLT5tc3BkX2xlbik7CisjZW5kaWYKIAlza2JfcmVsZWFzZV9oZWFkX3N0YXRlKHNrYik7CiAKIAlzaGluZm8gPSBza2Jfc2hpbmZvKHNrYik7CkBAIC01NDYsNiArNjQ3LDkgQEAKICNpZmRlZiBDT05GSUdfWEZSTQogCW5ldy0+c3AJCQk9IHNlY3BhdGhfZ2V0KG9sZC0+c3ApOwogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorICAgICAgICBuZXctPmlwc2VjX29mZmxvYWQgICAgICA9IG9sZC0+aXBzZWNfb2ZmbG9hZDsKKyNlbmRpZgogCW1lbWNweShuZXctPmNiLCBvbGQtPmNiLCBzaXplb2Yob2xkLT5jYikpOwogCW5ldy0+Y3N1bQkJPSBvbGQtPmNzdW07CiAJbmV3LT5sb2NhbF9kZgkJPSBvbGQtPmxvY2FsX2RmOwpAQCAtNTgzLDYgKzY4NywyNCBAQAogewogI2RlZmluZSBDKHgpIG4tPnggPSBza2ItPngKIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0NVU1RPTV9TS0JfTEFZT1VUKQorCWlmIChza2ItPm1zcGRfZGF0YSkgeworCQlpZiAoc2tiLT5tc3BkX2xlbikgeworCQkJaW50IG9mc3QgPSBza2ItPmxlbiAtIHNrYi0+bXNwZF9sZW47CisKKwkJCW1lbWNweShza2ItPmRhdGEgKyBvZnN0LCBza2ItPm1zcGRfZGF0YSArIHNrYi0+bXNwZF9vZnN0LCBza2ItPm1zcGRfbGVuKTsKKwkJCXNrYi0+bXNwZF9sZW4gPSAwOworCQl9CisKKwkJV0FSTl9PTihza2Jfc2hhcmVkKHNrYikpOworCisJCWlmICghc2tiX3NoYXJlZChza2IpKSB7CisJCQlrZnJlZShza2ItPm1zcGRfZGF0YSk7CisJCQlza2ItPm1zcGRfZGF0YSA9IE5VTEw7CisJCX0KKwl9CisjZW5kaWYKKwogCW4tPm5leHQgPSBuLT5wcmV2ID0gTlVMTDsKIAluLT5zayA9IE5VTEw7CiAJX19jb3B5X3NrYl9oZWFkZXIobiwgc2tiKTsKQEAgLTYwMSw2ICs3MjMsMTMgQEAKIAlDKHRydWVzaXplKTsKIAlhdG9taWNfc2V0KCZuLT51c2VycywgMSk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19DVVNUT01fU0tCX0xBWU9VVCkKKwlXQVJOX09OKHNrYi0+bXNwZF9kYXRhKTsKKwlDKG1zcGRfZGF0YSk7CisJQyhtc3BkX2xlbik7CisJQyhtc3BkX29mc3QpOworI2VuZGlmCisKIAlhdG9taWNfaW5jKCYoc2tiX3NoaW5mbyhza2IpLT5kYXRhcmVmKSk7CiAJc2tiLT5jbG9uZWQgPSAxOwogCkBAIC03NzcsNiArOTA2LDI0IEBACiAJaWYgKCFuKQogCQlyZXR1cm4gTlVMTDsKIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0NVU1RPTV9TS0JfTEFZT1VUKQorCWlmIChza2ItPm1zcGRfZGF0YSkgeworCQlpZiAoc2tiLT5tc3BkX2xlbikgeworCQkJaW50IG9mc3QgPSBza2ItPmxlbiAtIHNrYi0+bXNwZF9sZW47CisKKwkJCW1lbWNweShza2ItPmRhdGEgKyBvZnN0LCBza2ItPm1zcGRfZGF0YSArIHNrYi0+bXNwZF9vZnN0LCBza2ItPm1zcGRfbGVuKTsKKwkJCSgoc3RydWN0IHNrX2J1ZmYgKilza2IpLT5tc3BkX2xlbiA9IDA7CisJCX0KKworCQlXQVJOX09OKHNrYl9zaGFyZWQoc2tiKSk7CisKKwkJaWYgKCFza2Jfc2hhcmVkKHNrYikpIHsKKwkJCWtmcmVlKHNrYi0+bXNwZF9kYXRhKTsKKwkJCSgoc3RydWN0IHNrX2J1ZmYgKilza2IpLT5tc3BkX2RhdGEgPSBOVUxMOworCQl9CisJfQorI2VuZGlmCisKIAkvKiBTZXQgdGhlIGRhdGEgcG9pbnRlciAqLwogCXNrYl9yZXNlcnZlKG4sIGhlYWRlcmxlbik7CiAJLyogU2V0IHRoZSB0YWlsIHBvaW50ZXIgYW5kIGxlbmd0aCAqLwpAQCAtODA4LDYgKzk1NSwxMCBAQAogCXVuc2lnbmVkIGludCBzaXplID0gc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQ7CiAJc3RydWN0IHNrX2J1ZmYgKm4gPSBhbGxvY19za2Ioc2l6ZSwgZ2ZwX21hc2spOwogCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fQ1VTVE9NX1NLQl9MQVlPVVQpCisJV0FSTl9PTihza2ItPm1zcGRfbGVuKTsKKyNlbmRpZgorCiAJaWYgKCFuKQogCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvS2NvbmZpZyBiL25ldC9pcHY0L0tjb25maWcKaW5kZXggY2JiNTA1Yi4uYjc4NzE0OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvS2NvbmZpZworKysgYi9uZXQvaXB2NC9LY29uZmlnCkBAIC0zMzksNiArMzM5LDEyIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKK2NvbmZpZyBJTkVUX0lQU0VDX09GRkxPQUQKKwlib29sICJJUHNlYyBGYXN0IFBhdGggUHJvY2Vzc2luZyBvZmZsb2FkIgorCWRlcGVuZHMgb24gKElORVRfRVNQIHx8IElORVRfQUgpICYmIENPTUNFUlRPX0ZQCisJCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIElQc2VjIEZhc3QgUGF0aCBvZmZsb2FkLgorCiBjb25maWcgSU5FVF9JUENPTVAKIAl0cmlzdGF0ZSAiSVA6IElQQ29tcCB0cmFuc2Zvcm1hdGlvbiIKIAlzZWxlY3QgSU5FVF9YRlJNX1RVTk5FTApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvTWFrZWZpbGUgYi9uZXQvaXB2NC9NYWtlZmlsZQppbmRleCBmMmRjNjljLi4zYWQ2M2U2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9NYWtlZmlsZQpAQCAtMjIsNyArMjIsOCBAQAogb2JqLSQoQ09ORklHX05FVF9JUEdSRSkgKz0gaXBfZ3JlLm8KIG9iai0kKENPTkZJR19TWU5fQ09PS0lFUykgKz0gc3luY29va2llcy5vCiBvYmotJChDT05GSUdfSU5FVF9BSCkgKz0gYWg0Lm8KLW9iai0kKENPTkZJR19JTkVUX0VTUCkgKz0gZXNwNC5vCisjb2JqLSQoQ09ORklHX0lORVRfRVNQKSArPSBlc3A0Lm8KK29iai0kKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpICs9IGVzcDQubwogb2JqLSQoQ09ORklHX0lORVRfSVBDT01QKSArPSBpcGNvbXAubwogb2JqLSQoQ09ORklHX0lORVRfWEZSTV9UVU5ORUwpICs9IHhmcm00X3R1bm5lbC5vCiBvYmotJChDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCkgKz0geGZybTRfbW9kZV9iZWV0Lm8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKaW5kZXggMGJjOTVmMy4uZmVkZjA1MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKQEAgLTIzOCw3ICsyMzgsMTMgQEAKIAkJcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKIAl9CiAjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkKKwlpZiAoKHNrYi0+aXBzZWNfb2ZmbG9hZCA9PSAwKSAmJgorCQlza2ItPmxlbiA+IGlwX3NrYl9kc3RfbXR1KHNrYikgJiYgIXNrYl9pc19nc28oc2tiKSkKKyNlbHNlCiAJaWYgKHNrYi0+bGVuID4gaXBfc2tiX2RzdF9tdHUoc2tiKSAmJiAhc2tiX2lzX2dzbyhza2IpKQorI2VuZGlmCiAJCXJldHVybiBpcF9mcmFnbWVudChza2IsIGlwX2ZpbmlzaF9vdXRwdXQyKTsKIAllbHNlCiAJCXJldHVybiBpcF9maW5pc2hfb3V0cHV0Mihza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIuYwppbmRleCA0ZjQ3ZTA2Li4wYWI2MDlkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIuYwpAQCAtODEsNiArODEsMTYgQEAKIAogCWlmIChJUENCKHNrYiktPmZsYWdzICYgSVBTS0JfWEZSTV9UUkFOU0ZPUk1FRCkKIAkJcmV0dXJuIDA7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJLyogTWluZHNwZWVkIGFkZGVkIFdBOiByZXF1aXJlZCB0byBzdXBwb3J0IDRvNiBpcHNlYyBvZmZsb2FkICovCisJaWYoc2tiLT5pcHNlY19vZmZsb2FkKQorCXsKKwkJaWYgKElQNkNCKHNrYiktPmZsYWdzICYgSVA2U0tCX1hGUk1fVFJBTlNGT1JNRUQpCisJCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwogCWlmICh4ZnJtX2RlY29kZV9zZXNzaW9uKHNrYiwgJmZsLCBBRl9JTkVUKSA8IDApCiAJCXJldHVybiAtMTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19jb21tb24uYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fY29tbW9uLmMKaW5kZXggYTNkOTk3Ni4uOTg2YTI5OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19jb21tb24uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2NvbW1vbi5jCkBAIC04MywxNCArODMsMTIzIEBACiAJZWxzZQogCQlvZmYgPSAqcm92ZXI7CiAKLQlmb3IgKGkgPSAwOyA7ICsrb2ZmKSB7Ci0JCSpwb3J0cHRyID0gaHRvbnMobWluICsgb2ZmICUgcmFuZ2Vfc2l6ZSk7Ci0JCWlmICgrK2kgIT0gcmFuZ2Vfc2l6ZSAmJiBuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQotCQkJY29udGludWU7Ci0JCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pKQotCQkJKnJvdmVyID0gb2ZmOwotCQlyZXR1cm47Ci0JfQorICAgICAgIC8qIDRyZCBzcGVjaWZpYyByYW5nZSBOQVBUIC0gc3RhcnQgKi8KKyAgICAgICBpZiAoKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV80UkRfTkFQVCkgJiYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSl7CisgICAgICAgICAgICAgICBfX2JlMTYgZml4X3BvcnQ7CisgICAgICAgICAgICAgICBfX2JlMTYgcG9ydF9taW4sIHBvcnRfbWF4OworICAgICAgICAgICAgICAgdV9pbnQxNl90IHBvcnRfc2V0X2lkOworICAgICAgICAgICAgICAgdV9pbnQxNl90IG1iaXRsZW4gICA9IDAgOworICAgICAgICAgICAgICAgdV9pbnQxNl90IG9mZnNldGxlbiA9IDAgOworICAgICAgICAgICAgICAgdV9pbnQxNl90IHBzaWRsZW4gICA9IDAgOworICAgICAgICAgICAgICAgdV9pbnQxNl90IHJhbmdlX3RvdGFsX3NpemUgPSAwIDsKKyAgICAgICAgICAgICAgIHVfaW50MTZfdCBvZmZzZXRfNHJkOworICAgICAgICAgICAgICAgdV9pbnQxNl90IG9fc3RhdGU7CisgICAgICAgICAgICAgICB1X2ludDE2X3QgbV9zdGF0ZTsKKworICAgICAgICAgICAgICAgdV9pbnQxNl90IG9mZnNldF9taW47CisgICAgICAgICAgICAgICB1X2ludDE2X3Qgb2Zmc2V0X21heDsKKyAgICAgICAgICAgICAgIHVfaW50MTZfdCBvZmZzZXRfY250OworICAgICAgICAgICAgICAgdV9pbnQxNl90IG1iaXRfY250OworCisgICAgICAgICAgICAgICAjIGRlZmluZSBNQVhCSVRMRU4gMTYKKyAgICAgICAgICAgICAgIHBvcnRfbWluID0gbnRvaHMocmFuZ2UtPm1pbi5hbGwpOworICAgICAgICAgICAgICAgcG9ydF9tYXggPSBudG9ocyhyYW5nZS0+bWF4LmFsbCk7CisKKyAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IE1BWEJJVExFTjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYoICgocG9ydF9taW4gPj4gaSkgJiAweDAwMDEpID09ICgocG9ydF9tYXggPj4gaSkgJiAweDAwMDEpICl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNpZGxlbisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iaXRsZW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBmb3IoIDsgaSA8IE1BWEJJVExFTjsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYoICgocG9ydF9taW4gPj4gaSkgJiAweDAwMDEpID09ICgocG9ydF9tYXggPj4gaSkgJiAweDAwMDEpICl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNpZGxlbisrOworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgb2Zmc2V0bGVuID0gTUFYQklUTEVOIC0gcHNpZGxlbiAtIG1iaXRsZW47CisKKyAgICAgICAgICAgICAgIGlmKChwc2lkbGVuID09IDApIHx8IChtYml0bGVuID09IDApKXsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogRVJST1IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiNHJkIHBhcmFtZXRlciBJTlZBTElEIik7CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIHBvcnRfc2V0X2lkID0gKHBvcnRfbWluICYgcG9ydF9tYXgpID4+IG1iaXRsZW47CisKKyAgICAgICAgICAgICAgIGlmKCBvZmZzZXRsZW4gKXsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYocG9ydF9taW4gPCA0MDk2KXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihvZmZzZXRsZW4gPiA0KXsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWluID0gMHgxMDAwID4+IChwc2lkbGVuICsgbWJpdGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWF4ID0gKDEgPDwgb2Zmc2V0bGVuKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfY250ID0gb2Zmc2V0X21heCAtIG9mZnNldF9taW4gKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJpdF9jbnQgPSAxIDw8IG1iaXRsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV90b3RhbF9zaXplID0gb2Zmc2V0X2NudCAqIG1iaXRfY250OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X21pbiA9IDB4MDAwMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF9jbnQgPSAoMSA8PCBvZmZzZXRsZW4pIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iaXRfY250ID0gMSA8PCBtYml0bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfdG90YWxfc2l6ZSA9IG9mZnNldF9jbnQgKiBtYml0X2NudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWluID0gMHgwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF9jbnQgPSAxIDw8IG9mZnNldGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYml0X2NudCA9IDEgPDwgbWJpdGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV90b3RhbF9zaXplID0gb2Zmc2V0X2NudCAqIG1iaXRfY250OworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VfdG90YWxfc2l6ZSA9ICggMSA8PCBtYml0bGVuICkgOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyA7ICsrb2ZmKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0XzRyZCA9IG9mZiAlIHJhbmdlX3RvdGFsX3NpemUgOworCisgICAgICAgICAgICAgICAgICAgICAgIGlmICggbWJpdGxlbiAhPSAwICl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb19zdGF0ZSA9IG9mZnNldF80cmQgLyAoIDEgPDwgbWJpdGxlbiApIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXRlID0gb2Zmc2V0XzRyZCAlICggMSA8PCBtYml0bGVuICkgOworICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvX3N0YXRlID0gb2Zmc2V0XzRyZCAvICggMSA8PCBtYml0bGVuICkgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUgPSAwIDsKKyAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgIGZpeF9wb3J0ID0gKCggb2Zmc2V0X21pbiArIG9fc3RhdGUgKSA8PCAoIG1iaXRsZW4gKyBwc2lkbGVuICkpOworICAgICAgICAgICAgICAgICAgICAgICBmaXhfcG9ydCB8PSAoIHBvcnRfc2V0X2lkIDw8IG1iaXRsZW4gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgZml4X3BvcnQgfD0gbV9zdGF0ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAqcG9ydHB0ciA9IGh0b25zKGZpeF9wb3J0KTsKKworICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCsraSAhPSByYW5nZV90b3RhbF9zaXplKSAmJiBuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fSU5GTyAiZml4X3BvcnQgPSAlZCAiLGZpeF9wb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICB9IC8qIDRyZCBzcGVjaWZpYyByYW5nZSBOQVBUIC0gZW5kICovCisgICAgICAgZWxzZXsKKworCSAgICAgICBmb3IgKGkgPSAwOyA7ICsrb2ZmKSB7CisJCSAgICAgICAqcG9ydHB0ciA9IGh0b25zKG1pbiArIG9mZiAlIHJhbmdlX3NpemUpOworCQkgICAgICAgaWYgKCsraSAhPSByYW5nZV9zaXplICYmIG5mX25hdF91c2VkX3R1cGxlKHR1cGxlLCBjdCkpCisJCQkgICAgICAgY29udGludWU7CisJCSAgICAgICBpZiAoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKSkKKwkJCSAgICAgICAqcm92ZXIgPSBvZmY7CisJCSAgICAgICByZXR1cm47CisJICAgICAgIH0KKyAgICAgICB9CiAJcmV0dXJuOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3Byb3RvX3VuaXF1ZV90dXBsZSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yb3V0ZS5jIGIvbmV0L2lwdjQvcm91dGUuYwppbmRleCA5NGNkYmM1Li4zNDI3ZjlkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yb3V0ZS5jCisrKyBiL25ldC9pcHY0L3JvdXRlLmMKQEAgLTMwMTMsNyArMzAxMywxMSBAQAogCWlmIChydC0+cnRfZHN0ICE9IHJ0LT5ydF9nYXRld2F5KQogCQlOTEFfUFVUX0JFMzIoc2tiLCBSVEFfR0FURVdBWSwgcnQtPnJ0X2dhdGV3YXkpOwogCisjaWZkZWYgQ09ORklHX0FSQ0hfQ09NQ0VSVE8KKwlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzXzIoc2tiLCBkc3RfbWV0cmljc19wdHIoJnJ0LT5kc3QpLCAmcnQtPmRzdCkgPCAwKQorI2Vsc2UKIAlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgZHN0X21ldHJpY3NfcHRyKCZydC0+ZHN0KSkgPCAwKQorI2VuZGlmCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJaWYgKHJ0LT5ydF9tYXJrKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCAxMWJhOTIyLi4xMzJlOWZkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtNTk0LDcgKzU5NCwxNSBAQAogCiAJcmV0dXJuIHRjcF9yZWFkX3NvY2soc2ssICZyZF9kZXNjLCB0Y3Bfc3BsaWNlX2RhdGFfcmVjdik7CiB9Ci0KKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19TUExJQ0VfUFJPRikKK3Vuc2lnbmVkIGludCBzcGxpY2VyX3RpbWVfY291bnRlclsyNTZdOwordW5zaWduZWQgaW50IHNwbGljZXJfcmVxdGltZV9jb3VudGVyWzI1Nl07Cit1bnNpZ25lZCBpbnQgc3BsaWNlcl9kYXRhX2NvdW50ZXJbMjU2XTsKK3Vuc2lnbmVkIGludCBzcGxpY2VyX3RjcF9yc29ja19jb3VudGVyWzY0XTsKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbCBsYXN0X3NwbGljZXI7Cit1bnNpZ25lZCBpbnQgaW5pdF9zcGxpY2VyX3Byb2YgPSAwOworZXh0ZXJuIHVuc2lnbmVkIGludCBlbmFibGVfc3BsaWNlX3Byb2Y7CisjZW5kaWYKIC8qKgogICogIHRjcF9zcGxpY2VfcmVhZCAtIHNwbGljZSBkYXRhIGZyb20gVENQIHNvY2tldCB0byBhIHBpcGUKICAqIEBzb2NrOglzb2NrZXQgdG8gc3BsaWNlIGZyb20KQEAgLTYyMCw3ICs2MjgsMjggQEAKIAlsb25nIHRpbWVvOwogCXNzaXplX3Qgc3BsaWNlZDsKIAlpbnQgcmV0OworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9QUk9GKQorCXN0cnVjdCB0aW1ldmFsIG5vdzsKKwlpbnQgZGlmZl90aW1lX21zOwogCisJaWYgKGVuYWJsZV9zcGxpY2VfcHJvZikgeworCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CisJCWlmIChpbml0X3NwbGljZXJfcHJvZikgeworCQkJZGlmZl90aW1lX21zID0gKChub3cudHZfc2VjIC0gbGFzdF9zcGxpY2VyLnR2X3NlYykgKiAxMDAwKSArICgobm93LnR2X3VzZWMgLSBsYXN0X3NwbGljZXIudHZfdXNlYykgLyAxMDAwKTsKKwkJCWlmIChkaWZmX3RpbWVfbXMgPCAxMDAwKSB7CisJCQkJc3BsaWNlcl90aW1lX2NvdW50ZXJbZGlmZl90aW1lX21zID4+IDNdKys7CisJCQl9CisJCQllbHNlIHsKKwkJCQlzcGxpY2VyX3RpbWVfY291bnRlclsyNTVdKys7CisJCQl9CisJCX0KKwkJaWYgKGxlbiA8ICgxIDw8MjEpKQorCQkJc3BsaWNlcl9kYXRhX2NvdW50ZXJbKGxlbiA+PiAxMykgJiAweEZGXSsrOworCQllbHNlCisJCQlzcGxpY2VyX2RhdGFfY291bnRlclsyNTVdKys7CisJCWxhc3Rfc3BsaWNlciA9IG5vdzsKKwl9CisjZW5kaWYKIAlzb2NrX3Jwc19yZWNvcmRfZmxvdyhzayk7CiAJLyoKIAkgKiBXZSBjYW4ndCBzZWVrIG9uIGEgc29ja2V0IGlucHV0CkBAIC02MzEsNyArNjYwLDE4IEBACiAJcmV0ID0gc3BsaWNlZCA9IDA7CiAKIAlsb2NrX3NvY2soc2spOworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9QUk9GKQorCS8qIE5lZWQgbG9ja2VkIHNvY2tldCovCisJaWYgKGVuYWJsZV9zcGxpY2VfcHJvZikgeworCQljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwkJaW50IHJzb2NrX3FzaXplID0gdHAtPnJjdl9ueHQgLSB0cC0+Y29waWVkX3NlcTsKIAorCQlpZiAocnNvY2tfcXNpemUgPCAoNCAqIDEwMjQgKiAxMDI0KSkKKwkJCXNwbGljZXJfdGNwX3Jzb2NrX2NvdW50ZXJbKHJzb2NrX3FzaXplID4+IDE2KSAmIDB4M0ZdKys7CisJCWVsc2UKKwkJCXNwbGljZXJfdGNwX3Jzb2NrX2NvdW50ZXJbNjNdKys7CisJfQorI2VuZGlmCiAJdGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBzb2NrLT5maWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiAJd2hpbGUgKHRzcy5sZW4pIHsKIAkJcmV0ID0gX190Y3Bfc3BsaWNlX3JlYWQoc2ssICZ0c3MpOwpAQCAtNjg0LDYgKzcyNCwyMyBAQAogCiAJcmVsZWFzZV9zb2NrKHNrKTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX1NQTElDRV9QUk9GKQorCWlmIChlbmFibGVfc3BsaWNlX3Byb2YpIHsKKwkJZG9fZ2V0dGltZW9mZGF5KCZub3cpOworCisJCWRpZmZfdGltZV9tcyA9ICgobm93LnR2X3NlYyAtIGxhc3Rfc3BsaWNlci50dl9zZWMpICogMTAwMCkgKyAoKG5vdy50dl91c2VjIC0gbGFzdF9zcGxpY2VyLnR2X3VzZWMpIC8gMTAwMCk7CisJCWlmIChkaWZmX3RpbWVfbXMgPCAxMDAwKSB7Ly9Eb24ndCByZWNvcmQgdXNlbGVzcyBkYXRhCisJCQlzcGxpY2VyX3JlcXRpbWVfY291bnRlcltkaWZmX3RpbWVfbXMgPj4gM10rKzsKKwkJfQorCQllbHNlCisJCQlzcGxpY2VyX3JlcXRpbWVfY291bnRlclsyNTVdKys7CisKKwkJaWYoIWluaXRfc3BsaWNlcl9wcm9mKQorCQkJaW5pdF9zcGxpY2VyX3Byb2YgPSAxOworCisJCWxhc3Rfc3BsaWNlciA9IG5vdzsKKwl9CisjZW5kaWYKIAlpZiAoc3BsaWNlZCkKIAkJcmV0dXJuIHNwbGljZWQ7CiAKQEAgLTE0NTksNiArMTUxNiwyMyBAQAogCWRvIHsKIAkJdTMyIG9mZnNldDsKIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0lNUFJPVkVEX1NQTElDRSkKKwkJaWYgKGZsYWdzICYgTVNHX05PQ0FUQ0hTSUcpIHsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmIChzaWdpc21lbWJlcigmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIFNJR1FVSVQpIHx8CisJCQkJICAgIHNpZ2lzbWVtYmVyKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgU0lHQUJSVCkgfHwKKwkJCQkgICAgc2lnaXNtZW1iZXIoJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBTSUdLSUxMKSB8fAorCQkJCSAgICBzaWdpc21lbWJlcigmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIFNJR1RFUk0pIHx8CisJCQkJICAgIHNpZ2lzbWVtYmVyKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgU0lHU1RPUCkpIHsKKworCQkJCQlpZiAoY29waWVkKQorCQkJCQkJYnJlYWs7CisJCQkJCWNvcGllZCA9IHRpbWVvID8gc29ja19pbnRyX2Vycm5vKHRpbWVvKSA6IC1FQUdBSU47CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisjZW5kaWYKIAkJLyogQXJlIHdlIGF0IHVyZ2VudCBkYXRhPyBTdG9wIGlmIHdlIGhhdmUgcmVhZCBhbnl0aGluZyBvciBoYXZlIFNJR1VSRyBwZW5kaW5nLiAqLwogCQlpZiAodHAtPnVyZ19kYXRhICYmIHRwLT51cmdfc2VxID09ICpzZXEpIHsKIAkJCWlmIChjb3BpZWQpCkBAIC0xNjg3LDggKzE3NjEsMTYgQEAKIAkJCX0gZWxzZQogI2VuZGlmCiAJCQl7Ci0JCQkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBvZmZzZXQsCi0JCQkJCQltc2ctPm1zZ19pb3YsIHVzZWQpOworI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0lNUFJPVkVEX1NQTElDRSkKKwkJCQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfS0VSTlNQQUNFKQorCQkJCXsKKwkJCQkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1fdG9fa2VybmVsX2lvdmVjKHNrYiwKKwkJCQkJCQlvZmZzZXQsIG1zZy0+bXNnX2lvdiwgdXNlZCk7CisJCQkJfQkJCQkKKwkJCQllbHNlCisjZW5kaWYKKwkJCQkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBvZmZzZXQsCisJCQkJCQkJbXNnLT5tc2dfaW92LCB1c2VkKTsKIAkJCQlpZiAoZXJyKSB7CiAJCQkJCS8qIEV4Y2VwdGlvbi4gQmFpbG91dCEgKi8KIAkJCQkJaWYgKCFjb3BpZWQpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF90dW5uZWwuYyBiL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCmluZGV4IDgyODA2NDUuLjJiODlmMGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCisrKyBiL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCkBAIC0zLDYgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKICAqLwogCisKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvS2NvbmZpZyBiL25ldC9pcHY2L0tjb25maWcKaW5kZXggMzZkNzQzNy4uYTM0OGNmOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvS2NvbmZpZworKysgYi9uZXQvaXB2Ni9LY29uZmlnCkBAIC05NCw2ICs5NCwxMiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCitjb25maWcgSU5FVDZfSVBTRUNfT0ZGTE9BRAorCWJvb2wgIklQc2VjIElQdjYgRmFzdCBQYXRoIFByb2Nlc3Npbmcgb2ZmbG9hZCIKKwlkZXBlbmRzIG9uIChJTkVUNl9FU1AgJiYgQ09NQ0VSVE9fRlApCisJCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIElQc2VjIElQdjYgRmFzdCBQYXRoIG9mZmxvYWQuCisKIGNvbmZpZyBJTkVUNl9JUENPTVAKIAl0cmlzdGF0ZSAiSVB2NjogSVBDb21wIHRyYW5zZm9ybWF0aW9uIgogCXNlbGVjdCBJTkVUNl9YRlJNX1RVTk5FTApAQCAtMjIyLDYgKzIyOCwxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgSVBWNl9FVEhFUklQCisJdHJpc3RhdGUgIkV0aGVySVAgb3ZlciBJUHY2OiBFdGhlcklQLWluLUlQdjYgdHVubmVsIgorCWRlcGVuZHMgb24gSVBWNgorCXNlbGVjdCBJTkVUNl9UVU5ORUwKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciBFdGhlcklQLWluLUlQdjYgdHVubmVscyBkZXNjcmliZWQgaW4gUkZDIDMzNzguCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBJUFY2X01ST1VURQogCWJvb2wgIklQdjY6IG11bHRpY2FzdCByb3V0aW5nIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gSVBWNiAmJiBFWFBFUklNRU5UQUwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L01ha2VmaWxlIGIvbmV0L2lwdjYvTWFrZWZpbGUKaW5kZXggMDQ5ZjM1ZS4uMDhkZTM1YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvTWFrZWZpbGUKKysrIGIvbmV0L2lwdjYvTWFrZWZpbGUKQEAgLTIzLDcgKzIzLDggQEAKIGlwdjYtb2JqcyArPSAkKGlwdjYteSkKIAogb2JqLSQoQ09ORklHX0lORVQ2X0FIKSArPSBhaDYubwotb2JqLSQoQ09ORklHX0lORVQ2X0VTUCkgKz0gZXNwNi5vCisjb2JqLSQoQ09ORklHX0lORVQ2X0VTUCkgKz0gZXNwNi5vCitvYmotJChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkgKz0gZXNwNi5vCiBvYmotJChDT05GSUdfSU5FVDZfSVBDT01QKSArPSBpcGNvbXA2Lm8KIG9iai0kKENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCkgKz0geGZybTZfdHVubmVsLm8KIG9iai0kKENPTkZJR19JTkVUNl9UVU5ORUwpICs9IHR1bm5lbDYubwpAQCAtMzYsNiArMzcsNyBAQAogCiBvYmotJChDT05GSUdfSVBWNl9TSVQpICs9IHNpdC5vCiBvYmotJChDT05GSUdfSVBWNl9UVU5ORUwpICs9IGlwNl90dW5uZWwubworb2JqLSQoQ09ORklHX0lQVjZfRVRIRVJJUCkgKz0gZXRoaXBpcDYubwogCiBvYmoteSArPSBhZGRyY29uZl9jb3JlLm8gZXh0aGRyc19jb3JlLm8KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXNwNi5jIGIvbmV0L2lwdjYvZXNwNi5jCmluZGV4IDY1ZGQ1NDMuLjBiOWUxNDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2VzcDYuYworKysgYi9uZXQvaXB2Ni9lc3A2LmMKQEAgLTEzOCwxMSArMTM4LDI2IEBACiAJa2ZyZWUoRVNQX1NLQl9DQihza2IpLT50bXApOwogCXhmcm1fb3V0cHV0X3Jlc3VtZShza2IsIGVycik7CiB9CitzdGF0aWMgdm9pZCB1ZHBfdjZfc2VuZF9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHY2aGRyICppcHY2aD1pcHY2X2hkcihza2IpOworCXN0cnVjdCB1ZHBoZHIgKnVoPXVkcF9oZHIoc2tiKTsKKwl1aC0+Y2hlY2sgPSB+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2aC0+c2FkZHIsICZpcHY2aC0+ZGFkZHIsIHNrYi0+bGVuLAorCQkJSVBQUk9UT19VRFAsIDApOworCXNrYi0+Y3N1bV9zdGFydCA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmhlYWQ7CisJc2tiLT5jc3VtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB1ZHBoZHIsIGNoZWNrKTsKKwlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1BBUlRJQUw7CisKKwlpZiAodWgtPmNoZWNrID09IDApCisJCXVoLT5jaGVjayA9IENTVU1fTUFOR0xFRF8wOworCit9CiAKIHN0YXRpYyBpbnQgZXNwNl9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgaXBfZXNwX2hkciAqZXNwaDsKKwlzdHJ1Y3QgdWRwaGRyICp1aD1OVUxMOwogCXN0cnVjdCBjcnlwdG9fYWVhZCAqYWVhZDsKIAlzdHJ1Y3QgYWVhZF9naXZjcnlwdF9yZXF1ZXN0ICpyZXE7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKQEAgLTIyOCwxMyArMjQzLDQ2IEBACiAJZXNwaCA9IGlwX2VzcF9oZHIoc2tiKTsKIAkqc2tiX21hY19oZWFkZXIoc2tiKSA9IElQUFJPVE9fRVNQOwogCisJLyogTkFULVQgY2hhbmdlcyBTdGFydCAqLworCS8qIHRoaXMgaXMgbm9uLU5VTEwgb25seSB3aXRoIFVEUCBFbmNhcHN1bGF0aW9uICovCisJaWYgKHgtPmVuY2FwKSB7CisJCXN0cnVjdCB4ZnJtX2VuY2FwX3RtcGwgKmVuY2FwID0geC0+ZW5jYXA7CisJCV9fYmUzMiAqdWRwZGF0YTMyOworCQlfX2JlMTYgc3BvcnQsIGRwb3J0OworCQlpbnQgZW5jYXBfdHlwZTsKKwkJc3Bpbl9sb2NrX2JoKCZ4LT5sb2NrKTsKKwkJc3BvcnQgPSBlbmNhcC0+ZW5jYXBfc3BvcnQ7CisJCWRwb3J0ID0gZW5jYXAtPmVuY2FwX2Rwb3J0OworCQllbmNhcF90eXBlID0gZW5jYXAtPmVuY2FwX3R5cGU7CisJCXNwaW5fdW5sb2NrX2JoKCZ4LT5sb2NrKTsKKwkJdWggPSAoc3RydWN0IHVkcGhkciAqKWVzcGg7CisJCXVoLT5zb3VyY2UgPSBzcG9ydDsKKwkJdWgtPmRlc3QgPSBkcG9ydDsKKwkJdWgtPmxlbiA9IGh0b25zKHNrYi0+bGVuIC0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSk7CisJCXVoLT5jaGVjayA9IDA7CisKKwkJc3dpdGNoIChlbmNhcF90eXBlKSB7CisJCQlkZWZhdWx0OgorCQkJY2FzZSBVRFBfRU5DQVBfRVNQSU5VRFA6CisJCQkJZXNwaCA9IChzdHJ1Y3QgaXBfZXNwX2hkciAqKSh1aCArIDEpOworCQkJCWJyZWFrOworCQkJY2FzZSBVRFBfRU5DQVBfRVNQSU5VRFBfTk9OX0lLRToKKwkJCQl1ZHBkYXRhMzIgPSAoX19iZTMyICopKHVoICsgMSk7CisJCQkJdWRwZGF0YTMyWzBdID0gdWRwZGF0YTMyWzFdID0gMDsKKwkJCQllc3BoID0gKHN0cnVjdCBpcF9lc3BfaGRyICopKHVkcGRhdGEzMiArIDIpOworCQkJCWJyZWFrOworCQl9CisJCSpza2JfbWFjX2hlYWRlcihza2IpID0gSVBQUk9UT19VRFA7CisJfQorCisKIAllc3BoLT5zcGkgPSB4LT5pZC5zcGk7CiAJZXNwaC0+c2VxX25vID0gaHRvbmwoWEZSTV9TS0JfQ0Ioc2tiKS0+c2VxLm91dHB1dC5sb3cpOwogCiAJc2dfaW5pdF90YWJsZShzZywgbmZyYWdzKTsKIAlza2JfdG9fc2d2ZWMoc2tiLCBzZywKLQkJICAgICBlc3BoLT5lbmNfZGF0YSArIGNyeXB0b19hZWFkX2l2c2l6ZShhZWFkKSAtIHNrYi0+ZGF0YSwKLQkJICAgICBjbGVuICsgYWxlbik7CisJCQllc3BoLT5lbmNfZGF0YSArIGNyeXB0b19hZWFkX2l2c2l6ZShhZWFkKSAtIHNrYi0+ZGF0YSwKKwkJCWNsZW4gKyBhbGVuKTsKIAogCWlmICgoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX0VTTikpIHsKIAkJc2dfaW5pdF90YWJsZShhc2csIDMpOwpAQCAtMjQ5LDcgKzI5Nyw3IEBACiAJYWVhZF9naXZjcnlwdF9zZXRfY3J5cHQocmVxLCBzZywgc2csIGNsZW4sIGl2KTsKIAlhZWFkX2dpdmNyeXB0X3NldF9hc3NvYyhyZXEsIGFzZywgYXNzb2NsZW4pOwogCWFlYWRfZ2l2Y3J5cHRfc2V0X2dpdihyZXEsIGVzcGgtPmVuY19kYXRhLAotCQkJICAgICAgWEZSTV9TS0JfQ0Ioc2tiKS0+c2VxLm91dHB1dC5sb3cpOworCQkJWEZSTV9TS0JfQ0Ioc2tiKS0+c2VxLm91dHB1dC5sb3cpOwogCiAJRVNQX1NLQl9DQihza2IpLT50bXAgPSB0bXA7CiAJZXJyID0gY3J5cHRvX2FlYWRfZ2l2ZW5jcnlwdChyZXEpOwpAQCAtMjU5LDYgKzMwNywxMyBAQAogCWlmIChlcnIgPT0gLUVCVVNZKQogCQllcnIgPSBORVRfWE1JVF9EUk9QOwogCisKKwkvKiBOQVQtVCBjaGFuZ2VzIFN0YXJ0ICovCisJaWYgKHgtPmVuY2FwKSB7CisJCXVkcF92Nl9zZW5kX2NoZWNrKHNrYik7CisJfQorCS8qIE5BVC1UIGNoYW5nZXMgRW5kICovCisKIAlrZnJlZSh0bXApOwogCiBlcnJvcjoKQEAgLTI2Nyw2ICszMjIsNyBAQAogCiBzdGF0aWMgaW50IGVzcF9pbnB1dF9kb25lMihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZXJyKQogeworCXN0cnVjdCBpcHY2aGRyICppcHY2aDsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeCA9IHhmcm1faW5wdXRfc3RhdGUoc2tiKTsKIAlzdHJ1Y3QgZXNwX2RhdGEgKmVzcCA9IHgtPmRhdGE7CiAJc3RydWN0IGNyeXB0b19hZWFkICphZWFkID0gZXNwLT5hZWFkOwpAQCAtMjg5LDExICszNDUsNDggQEAKIAlwYWRsZW4gPSBuZXh0aGRyWzBdOwogCWlmIChwYWRsZW4gKyAyICsgYWxlbiA+PSBlbGVuKSB7CiAJCUxJTUlUX05FVERFQlVHKEtFUk5fV0FSTklORyAiaXBzZWMgZXNwIHBhY2tldCBpcyBnYXJiYWdlICIKLQkJCSAgICAgICAicGFkbGVuPSVkLCBlbGVuPSVkXG4iLCBwYWRsZW4gKyAyLCBlbGVuIC0gYWxlbik7CisJCQkJInBhZGxlbj0lZCwgZWxlbj0lZFxuIiwgcGFkbGVuICsgMiwgZWxlbiAtIGFsZW4pOwogCQlnb3RvIG91dDsKIAl9CiAKIAkvKiAuLi4gY2hlY2sgcGFkZGluZyBiaXRzIGhlcmUuIFNpbGx5LiA6LSkgKi8KKwkvKiBOQVQtVCBjaGFuZ2VzIFN0YXJ0ICovCisJaXB2NmggPSBpcHY2X2hkcihza2IpOworCWlmICh4LT5lbmNhcCkgeworCQlzdHJ1Y3QgeGZybV9lbmNhcF90bXBsICplbmNhcCA9IHgtPmVuY2FwOworCQlzdHJ1Y3QgdWRwaGRyICp1aCA9ICh2b2lkICopKHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgaGRyX2xlbik7CisKKwkJLyogMSkgaWYgdGhlIE5BVC1UIHBlZXIncyBJUCBvciBwb3J0IGNoYW5nZWQgdGhlbgorCQkgKiAgICBhZHZlcnRpemUgdGhlIGNoYW5nZSB0byB0aGUga2V5aW5nIGRhZW1vbi4KKwkJICogICAgVGhpcyBpcyBhbiBpbmJvdW5kIFNBLCBzbyBqdXN0IGNvbXBhcmUKKwkJICogICAgU1JDIHBvcnRzLgorCQkgKi8KKwkJaWYgKG1lbWNtcCgmaXB2NmgtPnNhZGRyLCB4LT5wcm9wcy5zYWRkci5hNiAsc2l6ZW9mKGlwdjZoLT5zYWRkcikpIHx8CisJCQkJdWgtPnNvdXJjZSAhPSBlbmNhcC0+ZW5jYXBfc3BvcnQpIHsKKwkJCXhmcm1fYWRkcmVzc190IGlwYWRkcjsKKwkJCW1lbWNweShpcGFkZHIuYTYsICZpcHY2aC0+c2FkZHIsIHNpemVvZihpcGFkZHIuYTYpKTsKKwkJCWttX25ld19tYXBwaW5nKHgsICZpcGFkZHIsIHVoLT5zb3VyY2UpOworCQkJLyogWFhYOiBwZXJoYXBzIGFkZCBhbiBleHRyYQorCQkJICogcG9saWN5IGNoZWNrIGhlcmUsIHRvIHNlZQorCQkJICogaWYgd2Ugc2hvdWxkIGFsbG93IG9yCisJCQkgKiByZWplY3QgYSBwYWNrZXQgZnJvbSBhCisJCQkgKiBkaWZmZXJlbnQgc291cmNlCisJCQkgKiBhZGRyZXNzL3BvcnQuCisJCQkgKi8KKwkJfQorCisJCS8qCisJCSAqIDIpIGlnbm9yZSBVRFAvVENQIGNoZWNrc3VtcyBpbiBjYXNlCisJCSAqICAgIG9mIE5BVC1UIGluIFRyYW5zcG9ydCBNb2RlLCBvcgorCQkgKiAgICBwZXJmb3JtIG90aGVyIHBvc3QtcHJvY2Vzc2luZyBmaXhlcworCQkgKiAgICBhcyBwZXIgZHJhZnQtaWV0Zi1pcHNlYy11ZHAtZW5jYXBzLTA2LAorCQkgKiAgICBzZWN0aW9uIDMuMS4yCisJCSAqLworCQlpZiAoeC0+cHJvcHMubW9kZSA9PSBYRlJNX01PREVfVFJBTlNQT1JUIHx8IHgtPnByb3BzLm1vZGUgPT0gWEZSTV9NT0RFX0JFRVQpIAorCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKworCX0KKwkvKk5BVC1UIGNoYW5nZXMgRW5kKi8KIAogCXBza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gYWxlbiAtIHBhZGxlbiAtIDIpOwogCV9fc2tiX3B1bGwoc2tiLCBobGVuKTsKQEAgLTU3Nyw4ICs2NzAsOCBAQAogCXUzMiBhbGlnbjsKIAlpbnQgZXJyOwogCi0JaWYgKHgtPmVuY2FwKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkvL2lmICh4LT5lbmNhcCkKKwkvLwlyZXR1cm4gLUVJTlZBTDsKIAogCWVzcCA9IGt6YWxsb2Moc2l6ZW9mKCplc3ApLCBHRlBfS0VSTkVMKTsKIAlpZiAoZXNwID09IE5VTEwpCkBAIC02MTUsNiArNzA4LDIyIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCisJLyogTkFULVQgIGNoYW5nZXMgU3RhcnQgKi8KKwlpZiAoeC0+ZW5jYXApIHsKKwkJc3RydWN0IHhmcm1fZW5jYXBfdG1wbCAqZW5jYXAgPSB4LT5lbmNhcDsKKwkJc3dpdGNoIChlbmNhcC0+ZW5jYXBfdHlwZSkgeworCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJY2FzZSBVRFBfRU5DQVBfRVNQSU5VRFA6CisJCQl4LT5wcm9wcy5oZWFkZXJfbGVuICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJCWJyZWFrOworCQljYXNlIFVEUF9FTkNBUF9FU1BJTlVEUF9OT05fSUtFOgorCQkJeC0+cHJvcHMuaGVhZGVyX2xlbiArPSBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyAyICogc2l6ZW9mKHUzMikgKiA0OworCQkJYnJlYWs7CisJCX0KKwl9CisJLyogTkFULVQgY2hhbmdlcyBFbmQgKi8KKwogCWFsaWduID0gQUxJR04oY3J5cHRvX2FlYWRfYmxvY2tzaXplKGFlYWQpLCA0KTsKIAlpZiAoZXNwLT5wYWRsZW4pCiAJCWFsaWduID0gbWF4X3QodTMyLCBhbGlnbiwgZXNwLT5wYWRsZW4pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXRoaXBpcDYuYyBiL25ldC9pcHY2L2V0aGlwaXA2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3NjVjNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY2L2V0aGlwaXA2LmMKQEAgLTAsMCArMSwxNTk0IEBACisvKgorICogCUV0aGVySVAgdHVubmVsIG92ZXIgSVB2NiBsaW5rCisgKglJUHY2IHR1bm5lbGluZyBkZXZpY2UKKyAqCUxpbnV4IElORVQ2IGltcGxlbWVudGF0aW9uCisgKgorICoJQXV0aG9yczoKKyAqCVZpbGxlIE51b3J2YWxhCQk8dm51b3J2YWxAdGNzLmh1dC5maT4KKyAqCVlhc3V5dWtpIEtvemFrYWkJPGtvemFrYWlAbGludXgtaXB2Ni5vcmc+CisgKgorICogICAgICBCYXNlZCBvbjoKKyAqICAgICAgbGludXgvbmV0L2lwdjYvaXA2X3R1bm5lbC5jLCBsaW51eC9uZXQvaXB2Ni9zaXQuYyBhbmQgbGludXgvbmV0L2lwdjQvaXBpcC5jCisgKgorICogICAgICBSRkMgMzM3OAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAgICAgIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdHVubmVsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWNtcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JvdXRlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKyNpbmNsdWRlIDxuZXQvaWNtcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgorI2luY2x1ZGUgPG5ldC9pcDZfdHVubmVsLmg+CisjaW5jbHVkZSA8bmV0L3hmcm0uaD4KKyNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KKworTU9EVUxFX0FVVEhPUigiVmlsbGUgTnVvcnZhbGEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRXRoZXJJUC1pbi1JUHY2IHR1bm5lbGluZyBkZXZpY2UiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBFVEhFUklQX1ZFUlNJT04gICAgICAgMHgzMDAwCisKKyNkZWZpbmUgSVBWNl9UTkxfRl9UT1NfVE9fVEMgIDEyOAorI2RlZmluZSBJUFY2X1RMVl9URUxfRFNUX1NJWkUgOAorCisjaWZkZWYgRVRISVBJUDZfVE5MX0RFQlVHCisjZGVmaW5lIEVUSElQSVA2X1ROTF9UUkFDRSh4Li4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6IiB4ICJcbiIsIF9fZnVuY19fKQorI2Vsc2UKKyNkZWZpbmUgRVRISVBJUDZfVE5MX1RSQUNFKHguLi4pIGRvIHs7fSB3aGlsZSgwKQorI2VuZGlmCisKKyNkZWZpbmUgSVBWNl9UQ0xBU1NfTUFTSyAoSVBWNl9GTE9XSU5GT19NQVNLICYgfklQVjZfRkxPV0xBQkVMX01BU0spCisjZGVmaW5lIElQVjZfVENMQVNTX1NISUZUIDIwCisKKyNkZWZpbmUgSEFTSF9TSVpFICAzMgorCisjZGVmaW5lIEhBU0goYWRkcikgKChfX2ZvcmNlIHUzMikoKGFkZHIpLT5zNl9hZGRyMzJbMF0gXiAoYWRkciktPnM2X2FkZHIzMlsxXSBeIFwKKwkJICAgICAoYWRkciktPnM2X2FkZHIzMlsyXSBeIChhZGRyKS0+czZfYWRkcjMyWzNdKSAmIFwKKwkJICAgIChIQVNIX1NJWkUgLSAxKSkKKworc3RhdGljIHZvaWQgZXRoaXBpcDZfZmJfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBldGhpcGlwNl90bmxfZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBldGhpcGlwNl90bmxfZGV2X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMgaW50IGV0aGlwaXA2X3RubF9uZXRfaWQgX19yZWFkX21vc3RseTsKK3N0cnVjdCBpcDZfdG5sX25ldCB7CisJLyogdGhlIElQdjYgdHVubmVsIGZhbGxiYWNrIGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpmYl90bmxfZGV2OworCS8qIGxpc3RzIGZvciBzdG9yaW5nIHR1bm5lbHMgaW4gdXNlICovCisJc3RydWN0IGlwNl90bmwgKnRubHNfcl9sW0hBU0hfU0laRV07CisJc3RydWN0IGlwNl90bmwgKnRubHNfd2NbMV07CisJc3RydWN0IGlwNl90bmwgKip0bmxzWzJdOworfTsKKworLyoKKyAqIExvY2tpbmcgOiBoYXNoIHRhYmxlcyBhcmUgcHJvdGVjdGVkIGJ5IFJDVSBhbmQgYSBzcGlubG9jaworICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGV0aGlwaXA2X3RubF9sb2NrKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfdG5sX2RzdF9jaGVjayhzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSB0LT5kc3RfY2FjaGU7CisKKwlpZiAoZHN0ICYmIGRzdC0+b2Jzb2xldGUgJiYKKwkgICAgZHN0LT5vcHMtPmNoZWNrKGRzdCwgdC0+ZHN0X2Nvb2tpZSkgPT0gTlVMTCkgeworCQl0LT5kc3RfY2FjaGUgPSBOVUxMOworCQlkc3RfcmVsZWFzZShkc3QpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXA2X3RubF9kc3RfcmVzZXQoc3RydWN0IGlwNl90bmwgKnQpCit7CisJZHN0X3JlbGVhc2UodC0+ZHN0X2NhY2hlKTsKKwl0LT5kc3RfY2FjaGUgPSBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXA2X3RubF9kc3Rfc3RvcmUoc3RydWN0IGlwNl90bmwgKnQsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKSBkc3Q7CisJdC0+ZHN0X2Nvb2tpZSA9IHJ0LT5ydDZpX25vZGUgPyBydC0+cnQ2aV9ub2RlLT5mbl9zZXJudW0gOiAwOworCWRzdF9yZWxlYXNlKHQtPmRzdF9jYWNoZSk7CisJdC0+ZHN0X2NhY2hlID0gZHN0OworfQorCisvKioKKyAqIGV0aGlwaXA2X3RubF9sb29rdXAgLSBmZXRjaCB0dW5uZWwgbWF0Y2hpbmcgdGhlIGVuZC1wb2ludCBhZGRyZXNzZXMKKyAqICAgQHJlbW90ZTogdGhlIGFkZHJlc3Mgb2YgdGhlIHR1bm5lbCBleGl0LXBvaW50CisgKiAgIEBsb2NhbDogdGhlIGFkZHJlc3Mgb2YgdGhlIHR1bm5lbCBlbnRyeS1wb2ludAorICoKKyAqIFJldHVybjoKKyAqICAgdHVubmVsIG1hdGNoaW5nIGdpdmVuIGVuZC1wb2ludHMgaWYgZm91bmQsCisgKiAgIGVsc2UgZmFsbGJhY2sgdHVubmVsIGlmIGl0cyBkZXZpY2UgaXMgdXAsCisgKiAgIGVsc2UgJU5VTEwKKyAqKi8KKworI2RlZmluZSBmb3JfZWFjaF9ldGhpcDZfdHVubmVsX3JjdShzdGFydCkgXAorCWZvciAodCA9IHJjdV9kZXJlZmVyZW5jZShzdGFydCk7IHQ7IHQgPSByY3VfZGVyZWZlcmVuY2UodC0+bmV4dCkpCisKK3N0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqCitldGhpcGlwNl90bmxfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGluNl9hZGRyICpyZW1vdGUsIHN0cnVjdCBpbjZfYWRkciAqbG9jYWwpCit7CisJdW5zaWduZWQgaDAgPSBIQVNIKHJlbW90ZSk7CisJdW5zaWduZWQgaDEgPSBIQVNIKGxvY2FsKTsKKwlzdHJ1Y3QgaXA2X3RubCAqdDsKKwlzdHJ1Y3QgaXA2X3RubF9uZXQgKmlwNm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGV0aGlwaXA2X3RubF9uZXRfaWQpOworCisJZm9yX2VhY2hfZXRoaXA2X3R1bm5lbF9yY3UoaXA2bi0+dG5sc19yX2xbaDAgXiBoMV0pIHsKKwkJaWYgKGlwdjZfYWRkcl9lcXVhbChsb2NhbCwgJnQtPnBhcm1zLmxhZGRyKSAmJgorCQkgICAgaXB2Nl9hZGRyX2VxdWFsKHJlbW90ZSwgJnQtPnBhcm1zLnJhZGRyKSAmJgorCQkgICAgKHQtPmRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQkJcmV0dXJuIHQ7CisJfQorCXQgPSByY3VfZGVyZWZlcmVuY2UoaXA2bi0+dG5sc193Y1swXSk7CisJaWYgKHQgJiYgKHQtPmRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQlyZXR1cm4gdDsKKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGV0aGlwaXA2X3RubF9idWNrZXQgLSBnZXQgaGVhZCBvZiBsaXN0IG1hdGNoaW5nIGdpdmVuIHR1bm5lbCBwYXJhbWV0ZXJzCisgKiAgIEBwOiBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdHVubmVsIGVuZC1wb2ludHMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgZXRoaXBpcDZfdG5sX2J1Y2tldCgpIHJldHVybnMgdGhlIGhlYWQgb2YgdGhlIGxpc3QgbWF0Y2hpbmcgdGhlCisgKiAgICZzdHJ1Y3QgaW42X2FkZHIgZW50cmllcyBsYWRkciBhbmQgcmFkZHIgaW4gQHAuCisgKgorICogUmV0dXJuOiBoZWFkIG9mIElQdjYgdHVubmVsIGxpc3QKKyAqKi8KKworc3RhdGljIHN0cnVjdCBpcDZfdG5sICoqCitldGhpcGlwNl90bmxfYnVja2V0KHN0cnVjdCBpcDZfdG5sX25ldCAqaXA2biwgc3RydWN0IGlwNl90bmxfcGFybSAqcCkKK3sKKwlzdHJ1Y3QgaW42X2FkZHIgKnJlbW90ZSA9ICZwLT5yYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgKmxvY2FsID0gJnAtPmxhZGRyOworCXVuc2lnbmVkIGggPSAwOworCWludCBwcmlvID0gMDsKKworCWlmICghaXB2Nl9hZGRyX2FueShyZW1vdGUpIHx8ICFpcHY2X2FkZHJfYW55KGxvY2FsKSkgeworCQlwcmlvID0gMTsKKwkJaCA9IEhBU0gocmVtb3RlKSBeIEhBU0gobG9jYWwpOworCX0KKwlyZXR1cm4gJmlwNm4tPnRubHNbcHJpb11baF07Cit9CisKKy8qKgorICogZXRoaXBpcDZfdG5sX2xpbmsgLSBhZGQgdHVubmVsIHRvIGhhc2ggdGFibGUKKyAqICAgQHQ6IHR1bm5lbCB0byBiZSBhZGRlZAorICoqLworCitzdGF0aWMgdm9pZAorZXRoaXBpcDZfdG5sX2xpbmsoc3RydWN0IGlwNl90bmxfbmV0ICppcDZuLCBzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqKnRwID0gZXRoaXBpcDZfdG5sX2J1Y2tldChpcDZuLCAmdC0+cGFybXMpOworCisJc3Bpbl9sb2NrX2JoKCZldGhpcGlwNl90bmxfbG9jayk7CisJdC0+bmV4dCA9ICp0cDsKKwlyY3VfYXNzaWduX3BvaW50ZXIoKnRwLCB0KTsKKwlzcGluX3VubG9ja19iaCgmZXRoaXBpcDZfdG5sX2xvY2spOworfQorCisvKioKKyAqIGV0aGlwaXA2X3RubF91bmxpbmsgLSByZW1vdmUgdHVubmVsIGZyb20gaGFzaCB0YWJsZQorICogICBAdDogdHVubmVsIHRvIGJlIHJlbW92ZWQKKyAqKi8KKworc3RhdGljIHZvaWQKK2V0aGlwaXA2X3RubF91bmxpbmsoc3RydWN0IGlwNl90bmxfbmV0ICppcDZuLCBzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqKnRwOworCisJZm9yICh0cCA9IGV0aGlwaXA2X3RubF9idWNrZXQoaXA2biwgJnQtPnBhcm1zKTsgKnRwOyB0cCA9ICYoKnRwKS0+bmV4dCkgeworCQlpZiAodCA9PSAqdHApIHsKKwkJCXNwaW5fbG9ja19iaCgmZXRoaXBpcDZfdG5sX2xvY2spOworCQkJKnRwID0gdC0+bmV4dDsKKwkJCXNwaW5fdW5sb2NrX2JoKCZldGhpcGlwNl90bmxfbG9jayk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqCisgKiBpcDZfdG5sX2NyZWF0ZSgpIC0gY3JlYXRlIGEgbmV3IHR1bm5lbAorICogICBAcDogdHVubmVsIHBhcmFtZXRlcnMKKyAqICAgQHB0OiBwb2ludGVyIHRvIG5ldyB0dW5uZWwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgQ3JlYXRlIHR1bm5lbCBtYXRjaGluZyBnaXZlbiBwYXJhbWV0ZXJzLgorICoKKyAqIFJldHVybjoKKyAqICAgY3JlYXRlZCB0dW5uZWwgb3IgTlVMTAorICoqLworCitzdGF0aWMgc3RydWN0IGlwNl90bmwgKmlwNl90bmxfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGlwNl90bmxfcGFybSAqcCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBpcDZfdG5sICp0OworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJaW50IGVycjsKKwlzdHJ1Y3QgaXA2X3RubF9uZXQgKmlwNm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGV0aGlwaXA2X3RubF9uZXRfaWQpOworCisJaWYgKHAtPm5hbWVbMF0pCisJCXN0cmxjcHkobmFtZSwgcC0+bmFtZSwgSUZOQU1TSVopOworCWVsc2UKKwkJc3ByaW50ZihuYW1lLCAiZXRoaXBpcDZ0bmwlJWQiKTsKKworCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YgKCp0KSwgbmFtZSwgZXRoaXBpcDZfdG5sX2Rldl9zZXR1cCk7CisJaWYgKGRldiA9PSBOVUxMKQorCQlnb3RvIGZhaWxlZDsKKworCWRldl9uZXRfc2V0KGRldiwgbmV0KTsKKworCWlmIChzdHJjaHIobmFtZSwgJyUnKSkgeworCQlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBuYW1lKSA8IDApCisJCQlnb3RvIGZhaWxlZF9mcmVlOworCX0KKworCXQgPSBuZXRkZXZfcHJpdihkZXYpOworCXQtPnBhcm1zID0gKnA7CisKKwlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldmljZShkZXYpKSA8IDApCisJCWdvdG8gZmFpbGVkX2ZyZWU7CisKKwlkZXZfaG9sZChkZXYpOworCWV0aGlwaXA2X3RubF9saW5rKGlwNm4sIHQpOworCXJldHVybiB0OworCitmYWlsZWRfZnJlZToKKwlmcmVlX25ldGRldihkZXYpOworZmFpbGVkOgorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGV0aGlwaXA2X3RubF9sb2NhdGUgLSBmaW5kIG9yIGNyZWF0ZSB0dW5uZWwgbWF0Y2hpbmcgZ2l2ZW4gcGFyYW1ldGVycworICogICBAcDogdHVubmVsIHBhcmFtZXRlcnMKKyAqICAgQGNyZWF0ZTogIT0gMCBpZiBhbGxvd2VkIHRvIGNyZWF0ZSBuZXcgdHVubmVsIGlmIG5vIG1hdGNoIGZvdW5kCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIGV0aGlwaXA2X3RubF9sb2NhdGUoKSBmaXJzdCB0cmllcyB0byBsb2NhdGUgYW4gZXhpc3RpbmcgdHVubmVsCisgKiAgIGJhc2VkIG9uIEBwYXJtcy4gSWYgdGhpcyBpcyB1bnN1Y2Nlc3NmdWwsIGJ1dCBAY3JlYXRlIGlzIHNldCBhIG5ldworICogICB0dW5uZWwgZGV2aWNlIGlzIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQgZm9yIHVzZS4KKyAqCisgKiBSZXR1cm46CisgKiAgIG1hdGNoaW5nIHR1bm5lbCBvciBOVUxMCisgKiovCisKK3N0YXRpYyBzdHJ1Y3QgaXA2X3RubCAqZXRoaXBpcDZfdG5sX2xvY2F0ZShzdHJ1Y3QgbmV0ICpuZXQsCisJCXN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAsIGludCBjcmVhdGUpCit7CisJc3RydWN0IGluNl9hZGRyICpyZW1vdGUgPSAmcC0+cmFkZHI7CisJc3RydWN0IGluNl9hZGRyICpsb2NhbCA9ICZwLT5sYWRkcjsKKwlzdHJ1Y3QgaXA2X3RubCAqdDsKKwlzdHJ1Y3QgaXA2X3RubF9uZXQgKmlwNm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGV0aGlwaXA2X3RubF9uZXRfaWQpOworCisJZm9yICh0ID0gKmV0aGlwaXA2X3RubF9idWNrZXQoaXA2biwgcCk7IHQ7IHQgPSB0LT5uZXh0KSB7CisJCWlmIChpcHY2X2FkZHJfZXF1YWwobG9jYWwsICZ0LT5wYXJtcy5sYWRkcikgJiYKKwkJICAgIGlwdjZfYWRkcl9lcXVhbChyZW1vdGUsICZ0LT5wYXJtcy5yYWRkcikpCisJCQlyZXR1cm4gdDsKKwl9CisJaWYgKCFjcmVhdGUpCisJCXJldHVybiBOVUxMOworCXJldHVybiBpcDZfdG5sX2NyZWF0ZShuZXQsIHApOworfQorCisvKioKKyAqIGV0aGlwaXA2X3RubF9kZXZfdW5pbml0IC0gdHVubmVsIGRldmljZSB1bmluaXRpYWxpemVyCisgKiAgIEBkZXY6IHRoZSBkZXZpY2UgdG8gYmUgZGVzdHJveWVkCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIGV0aGlwaXA2X3RubF9kZXZfdW5pbml0KCkgcmVtb3ZlcyB0dW5uZWwgZnJvbSBpdHMgbGlzdAorICoqLworCitzdGF0aWMgdm9pZAorZXRoaXBpcDZfdG5sX2Rldl91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOworCXN0cnVjdCBpcDZfdG5sX25ldCAqaXA2biA9IG5ldF9nZW5lcmljKG5ldCwgZXRoaXBpcDZfdG5sX25ldF9pZCk7CisKKwlpZiAoZGV2ID09IGlwNm4tPmZiX3RubF9kZXYpIHsKKwkJc3Bpbl9sb2NrX2JoKCZldGhpcGlwNl90bmxfbG9jayk7CisJCWlwNm4tPnRubHNfd2NbMF0gPSBOVUxMOworCQlzcGluX3VubG9ja19iaCgmZXRoaXBpcDZfdG5sX2xvY2spOworCX0gZWxzZSB7CisJCWV0aGlwaXA2X3RubF91bmxpbmsoaXA2biwgdCk7CisJfQorCWlwNl90bmxfZHN0X3Jlc2V0KHQpOworCWRldl9wdXQoZGV2KTsKK30KKworLyoqCisgKiBwYXJzZV90dmxfdG5sX2VuY19saW0gLSBoYW5kbGUgZW5jYXBzdWxhdGlvbiBsaW1pdCBvcHRpb24KKyAqICAgQHNrYjogcmVjZWl2ZWQgc29ja2V0IGJ1ZmZlcgorICoKKyAqIFJldHVybjoKKyAqICAgMCBpZiBub25lIHdhcyBmb3VuZCwKKyAqICAgZWxzZSBpbmRleCB0byBlbmNhcHN1bGF0aW9uIGxpbWl0CisgKiovCisKK3N0YXRpYyBfX3UxNgorcGFyc2VfdGx2X3RubF9lbmNfbGltKHN0cnVjdCBza19idWZmICpza2IsIF9fdTggKiByYXcpCit7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gKHN0cnVjdCBpcHY2aGRyICopIHJhdzsKKwlfX3U4IG5leHRoZHIgPSBpcHY2aC0+bmV4dGhkcjsKKwlfX3UxNiBvZmYgPSBzaXplb2YgKCppcHY2aCk7CisKKwl3aGlsZSAoaXB2Nl9leHRfaGRyKG5leHRoZHIpICYmIG5leHRoZHIgIT0gTkVYVEhEUl9OT05FKSB7CisJCV9fdTE2IG9wdGxlbiA9IDA7CisJCXN0cnVjdCBpcHY2X29wdF9oZHIgKmhkcjsKKwkJaWYgKHJhdyArIG9mZiArIHNpemVvZiAoKmhkcikgPiBza2ItPmRhdGEgJiYKKwkJICAgICFwc2tiX21heV9wdWxsKHNrYiwgcmF3IC0gc2tiLT5kYXRhICsgb2ZmICsgc2l6ZW9mICgqaGRyKSkpCisJCQlicmVhazsKKworCQloZHIgPSAoc3RydWN0IGlwdjZfb3B0X2hkciAqKSAocmF3ICsgb2ZmKTsKKwkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9GUkFHTUVOVCkgeworCQkJc3RydWN0IGZyYWdfaGRyICpmcmFnX2hkciA9IChzdHJ1Y3QgZnJhZ19oZHIgKikgaGRyOworCQkJaWYgKGZyYWdfaGRyLT5mcmFnX29mZikKKwkJCQlicmVhazsKKwkJCW9wdGxlbiA9IDg7CisJCX0gZWxzZSBpZiAobmV4dGhkciA9PSBORVhUSERSX0FVVEgpIHsKKwkJCW9wdGxlbiA9IChoZHItPmhkcmxlbiArIDIpIDw8IDI7CisJCX0gZWxzZSB7CisJCQlvcHRsZW4gPSBpcHY2X29wdGxlbihoZHIpOworCQl9CisJCWlmIChuZXh0aGRyID09IE5FWFRIRFJfREVTVCkgeworCQkJX191MTYgaSA9IG9mZiArIDI7CisJCQl3aGlsZSAoMSkgeworCQkJCXN0cnVjdCBpcHY2X3Rsdl90bmxfZW5jX2xpbSAqdGVsOworCisJCQkJLyogTm8gbW9yZSByb29tIGZvciBlbmNhcHN1bGF0aW9uIGxpbWl0ICovCisJCQkJaWYgKGkgKyBzaXplb2YgKCp0ZWwpID4gb2ZmICsgb3B0bGVuKQorCQkJCQlicmVhazsKKworCQkJCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikgJnJhd1tpXTsKKwkJCQkvKiByZXR1cm4gaW5kZXggb2Ygb3B0aW9uIGlmIGZvdW5kIGFuZCB2YWxpZCAqLworCQkJCWlmICh0ZWwtPnR5cGUgPT0gSVBWNl9UTFZfVE5MX0VOQ0FQX0xJTUlUICYmCisJCQkJICAgIHRlbC0+bGVuZ3RoID09IDEpCisJCQkJCXJldHVybiBpOworCQkJCS8qIGVsc2UganVtcCB0byBuZXh0IG9wdGlvbiAqLworCQkJCWlmICh0ZWwtPnR5cGUpCisJCQkJCWkgKz0gdGVsLT5sZW5ndGggKyAyOworCQkJCWVsc2UKKwkJCQkJaSsrOworCQkJfQorCQl9CisJCW5leHRoZHIgPSBoZHItPm5leHRoZHI7CisJCW9mZiArPSBvcHRsZW47CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGV0aGlwaXA2X3RubF9lcnIgLSB0dW5uZWwgZXJyb3IgaGFuZGxlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBldGhpcGlwNl90bmxfZXJyKCkgc2hvdWxkIGhhbmRsZSBlcnJvcnMgaW4gdGhlIHR1bm5lbCBhY2NvcmRpbmcKKyAqICAgdG8gdGhlIHNwZWNpZmljYXRpb25zIGluIFJGQyAyNDczLgorICoqLworCitzdGF0aWMgaW50CitldGhpcGlwNl90bmxfZXJyKHN0cnVjdCBza19idWZmICpza2IsIF9fdTggaXBwcm90bywgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCisJICAgIHU4ICp0eXBlLCB1OCAqY29kZSwgaW50ICptc2csIF9fdTMyICppbmZvLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IChzdHJ1Y3QgaXB2NmhkciAqKSBza2ItPmRhdGE7CisJc3RydWN0IGlwNl90bmwgKnQ7CisJaW50IHJlbF9tc2cgPSAwOworCXU4IHJlbF90eXBlID0gSUNNUFY2X0RFU1RfVU5SRUFDSDsKKwl1OCByZWxfY29kZSA9IElDTVBWNl9BRERSX1VOUkVBQ0g7CisJX191MzIgcmVsX2luZm8gPSAwOworCV9fdTE2IGxlbjsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCS8qIElmIHRoZSBwYWNrZXQgZG9lc24ndCBjb250YWluIHRoZSBvcmlnaW5hbCBJUHY2IGhlYWRlciB3ZSBhcmUKKwkgICBpbiB0cm91YmxlIHNpbmNlIHdlIG1pZ2h0IG5lZWQgdGhlIHNvdXJjZSBhZGRyZXNzIGZvciBmdXJ0aGVyCisJICAgcHJvY2Vzc2luZyBvZiB0aGUgZXJyb3IuICovCisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKCh0ID0gZXRoaXBpcDZfdG5sX2xvb2t1cChkZXZfbmV0KHNrYi0+ZGV2KSwgJmlwdjZoLT5kYWRkciwKKwkJCQkJJmlwdjZoLT5zYWRkcikpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJaWYgKHQtPnBhcm1zLnByb3RvICE9IGlwcHJvdG8gJiYgdC0+cGFybXMucHJvdG8gIT0gMCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAwOworCisJc3dpdGNoICgqdHlwZSkgeworCQlfX3UzMiB0ZWxpOworCQlzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKnRlbDsKKwkJX191MzIgbXR1OworCWNhc2UgSUNNUFY2X0RFU1RfVU5SRUFDSDoKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiJXM6IFBhdGggdG8gZGVzdGluYXRpb24gaW52YWxpZCAiCisJCQkgICAgICAgIm9yIGluYWN0aXZlIVxuIiwgdC0+cGFybXMubmFtZSk7CisJCXJlbF9tc2cgPSAxOworCQlicmVhazsKKwljYXNlIElDTVBWNl9USU1FX0VYQ0VFRDoKKwkJaWYgKCgqY29kZSkgPT0gSUNNUFY2X0VYQ19IT1BMSU1JVCkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICIlczogVG9vIHNtYWxsIGhvcCBsaW1pdCBvciAiCisJCQkJICAgICAgICJyb3V0aW5nIGxvb3AgaW4gdHVubmVsIVxuIiwKKwkJCQkgICAgICAgdC0+cGFybXMubmFtZSk7CisJCQlyZWxfbXNnID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIElDTVBWNl9QQVJBTVBST0I6CisJCXRlbGkgPSAwOworCQlpZiAoKCpjb2RlKSA9PSBJQ01QVjZfSERSX0ZJRUxEKQorCQkJdGVsaSA9IHBhcnNlX3Rsdl90bmxfZW5jX2xpbShza2IsIHNrYi0+ZGF0YSk7CisKKwkJaWYgKHRlbGkgJiYgdGVsaSA9PSAqaW5mbyAtIDIpIHsKKwkJCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikgJnNrYi0+ZGF0YVt0ZWxpXTsKKwkJCWlmICh0ZWwtPmVuY2FwX2xpbWl0ID09IDApIHsKKwkJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSAgICAgICAiJXM6IFRvbyBzbWFsbCBlbmNhcHN1bGF0aW9uICIKKwkJCQkJICAgICAgICJsaW1pdCBvciByb3V0aW5nIGxvb3AgaW4gIgorCQkJCQkgICAgICAgInR1bm5lbCFcbiIsIHQtPnBhcm1zLm5hbWUpOworCQkJCXJlbF9tc2cgPSAxOworCQkJfQorCQl9IGVsc2UgaWYgKG5ldF9yYXRlbGltaXQoKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogUmVjaXBpZW50IHVuYWJsZSB0byBwYXJzZSB0dW5uZWxlZCAiCisJCQkgICAgICAgInBhY2tldCFcbiAiLCB0LT5wYXJtcy5uYW1lKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElDTVBWNl9QS1RfVE9PQklHOgorCQltdHUgPSAqaW5mbyAtIG9mZnNldDsKKwkJaWYgKG10dSA8IElQVjZfTUlOX01UVSkKKwkJCW10dSA9IElQVjZfTUlOX01UVTsKKwkJdC0+ZGV2LT5tdHUgPSBtdHU7CisKKwkJaWYgKChsZW4gPSBzaXplb2YgKCppcHY2aCkgKyBudG9ocyhpcHY2aC0+cGF5bG9hZF9sZW4pKSA+IG10dSkgeworCQkJcmVsX3R5cGUgPSBJQ01QVjZfUEtUX1RPT0JJRzsKKwkJCXJlbF9jb2RlID0gMDsKKwkJCXJlbF9pbmZvID0gbXR1OworCQkJcmVsX21zZyA9IDE7CisJCX0KKwkJYnJlYWs7CisJfQorCisJKnR5cGUgPSByZWxfdHlwZTsKKwkqY29kZSA9IHJlbF9jb2RlOworCSppbmZvID0gcmVsX2luZm87CisJKm1zZyA9IHJlbF9tc2c7CisKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitpcDRldGhpcGlwNl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCisJICAgdTggdHlwZSwgdTggY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCit7CisJaW50IHJlbF9tc2cgPSAwOworCXU4IHJlbF90eXBlID0gdHlwZTsKKwl1OCByZWxfY29kZSA9IGNvZGU7CisJX191MzIgcmVsX2luZm8gPSBudG9obChpbmZvKTsKKwlpbnQgZXJyOworCXN0cnVjdCBza19idWZmICpza2IyOworCXN0cnVjdCBpcGhkciAqZWlwaDsKKwlzdHJ1Y3QgZmxvd2kgZmw7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisKKwllcnIgPSBldGhpcGlwNl90bmxfZXJyKHNrYiwgSVBQUk9UT19JUElQLCBvcHQsICZyZWxfdHlwZSwgJnJlbF9jb2RlLAorCQkJICAmcmVsX21zZywgJnJlbF9pbmZvLCBvZmZzZXQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHJlbF9tc2cgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHJlbF90eXBlKSB7CisJY2FzZSBJQ01QVjZfREVTVF9VTlJFQUNIOgorCQlpZiAocmVsX2NvZGUgIT0gSUNNUFY2X0FERFJfVU5SRUFDSCkKKwkJCXJldHVybiAwOworCQlyZWxfdHlwZSA9IElDTVBfREVTVF9VTlJFQUNIOworCQlyZWxfY29kZSA9IElDTVBfSE9TVF9VTlJFQUNIOworCQlicmVhazsKKwljYXNlIElDTVBWNl9QS1RfVE9PQklHOgorCQlpZiAocmVsX2NvZGUgIT0gMCkKKwkJCXJldHVybiAwOworCQlyZWxfdHlwZSA9IElDTVBfREVTVF9VTlJFQUNIOworCQlyZWxfY29kZSA9IElDTVBfRlJBR19ORUVERUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIG9mZnNldCArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSkKKwkJcmV0dXJuIDA7CisKKwlza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IyKQorCQlyZXR1cm4gMDsKKworCXNrYl9kc3RfZHJvcChza2IyKTsKKworCXNrYl9wdWxsKHNrYjIsIG9mZnNldCk7CisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOworCWVpcGggPSBpcF9oZHIoc2tiMik7CisKKwkvKiBUcnkgdG8gZ3Vlc3MgaW5jb21pbmcgaW50ZXJmYWNlICovCisJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CisJZmwudS5pcDQuZGFkZHIgPSBlaXBoLT5zYWRkcjsKKwlmbC5mbG93aV90b3MgPSBSVF9UT1MoZWlwaC0+dG9zKTsKKwlmbC5mbG93aV9wcm90byA9IElQUFJPVE9fSVBJUDsKKwlydCA9IGlwX3JvdXRlX291dHB1dF9rZXkoZGV2X25ldChza2ItPmRldiksICZmbC51LmlwNCk7CisJaWYgKElTX0VSUihydCkpCisJCWdvdG8gb3V0OworCisJc2tiMi0+ZGV2ID0gcnQtPmRzdC5kZXY7CisKKwkvKiByb3V0ZSAiaW5jb21pbmciIHBhY2tldCAqLworCWlmIChydC0+cnRfZmxhZ3MgJiBSVENGX0xPQ0FMKSB7CisJCWlwX3J0X3B1dChydCk7CisJCWZsLnUuaXA0LmRhZGRyID0gZWlwaC0+ZGFkZHI7CisJCWZsLnUuaXA0LnNhZGRyID0gZWlwaC0+c2FkZHI7CisJCWZsLmZsb3dpX3RvcyA9IGVpcGgtPnRvczsKKwkJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfa2V5KGRldl9uZXQoc2tiLT5kZXYpLCAmZmwudS5pcDQpOworCQlpZiAoSVNfRVJSKHJ0KSkKKwkJCWdvdG8gb3V0OworCQlpZiAocnQtPmRzdC5kZXYtPnR5cGUgIT0gQVJQSFJEX1RVTk5FTCkgeworCQkJaXBfcnRfcHV0KHJ0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNrYl9kc3Rfc2V0KHNrYjIsIChzdHJ1Y3QgZHN0X2VudHJ5ICopcnQpOworCX0gZWxzZSB7CisJCWlwX3J0X3B1dChydCk7CisJCWlmIChpcF9yb3V0ZV9pbnB1dChza2IyLCBlaXBoLT5kYWRkciwgZWlwaC0+c2FkZHIsIGVpcGgtPnRvcywKKwkJCQkgICBza2IyLT5kZXYpIHx8CisJCSAgICBza2JfZHN0KHNrYjIpLT5kZXYtPnR5cGUgIT0gQVJQSFJEX1RVTk5FTCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIGNoYW5nZSBtdHUgb24gdGhpcyByb3V0ZSAqLworCWlmIChyZWxfdHlwZSA9PSBJQ01QX0RFU1RfVU5SRUFDSCAmJiByZWxfY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVEKSB7CisJCWlmIChyZWxfaW5mbyA+IGRzdF9tdHUoc2tiX2RzdChza2IyKSkpCisJCQlnb3RvIG91dDsKKworCQlza2JfZHN0KHNrYjIpLT5vcHMtPnVwZGF0ZV9wbXR1KHNrYl9kc3Qoc2tiMiksIHJlbF9pbmZvKTsKKwl9CisKKwlpY21wX3NlbmQoc2tiMiwgcmVsX3R5cGUsIHJlbF9jb2RlLCBodG9ubChyZWxfaW5mbykpOworCitvdXQ6CisJa2ZyZWVfc2tiKHNrYjIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpcDZldGhpcGlwNl9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCisJICAgdTggdHlwZSwgdTggY29kZSwgaW50IG9mZnNldCwgX19iZTMyIGluZm8pCit7CisJaW50IHJlbF9tc2cgPSAwOworCXU4IHJlbF90eXBlID0gdHlwZTsKKwl1OCByZWxfY29kZSA9IGNvZGU7CisJX191MzIgcmVsX2luZm8gPSBudG9obChpbmZvKTsKKwlpbnQgZXJyOworCisJZXJyID0gZXRoaXBpcDZfdG5sX2Vycihza2IsIElQUFJPVE9fSVBWNiwgb3B0LCAmcmVsX3R5cGUsICZyZWxfY29kZSwKKwkJCSAgJnJlbF9tc2csICZyZWxfaW5mbywgb2Zmc2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChyZWxfbXNnICYmIHBza2JfbWF5X3B1bGwoc2tiLCBvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkgeworCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCisJCWlmICghc2tiMikKKwkJCXJldHVybiAwOworCisJCXNrYl9kc3RfZHJvcChza2IyKTsKKwkJc2tiX3B1bGwoc2tiMiwgb2Zmc2V0KTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYjIpOworCisJCS8qIFRyeSB0byBndWVzcyBpbmNvbWluZyBpbnRlcmZhY2UgKi8KKwkJcnQgPSBydDZfbG9va3VwKGRldl9uZXQoc2tiLT5kZXYpLCAmaXB2Nl9oZHIoc2tiMiktPnNhZGRyLAorCQkJCU5VTEwsIDAsIDApOworCisJCWlmIChydCAmJiBydC0+cnQ2aV9kZXYpCisJCQlza2IyLT5kZXYgPSBydC0+cnQ2aV9kZXY7CisKKwkJaWNtcHY2X3NlbmQoc2tiMiwgcmVsX3R5cGUsIHJlbF9jb2RlLCByZWxfaW5mbyk7CisKKwkJaWYgKHJ0KQorCQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOworCisJCWtmcmVlX3NrYihza2IyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXA0ZXRoaXBpcDZfZHNjcF9lY25fZGVjYXBzdWxhdGUoc3RydWN0IGlwNl90bmwgKnQsCisJCQkJCXN0cnVjdCBpcHY2aGRyICppcHY2aCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfX3U4IGRzZmllbGQgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZoKSAmIH5JTkVUX0VDTl9NQVNLOworCisJaWYgKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1JDVl9EU0NQX0NPUFkpCisJCWlwdjRfY2hhbmdlX2RzZmllbGQoaXBfaGRyKHNrYiksIElORVRfRUNOX01BU0ssIGRzZmllbGQpOworCisJaWYgKElORVRfRUNOX2lzX2NlKGRzZmllbGQpKQorCQlJUF9FQ05fc2V0X2NlKGlwX2hkcihza2IpKTsKK30KKworc3RhdGljIHZvaWQgaXA2ZXRoaXBpcDZfZHNjcF9lY25fZGVjYXBzdWxhdGUoc3RydWN0IGlwNl90bmwgKnQsCisJCQkJCXN0cnVjdCBpcHY2aGRyICppcHY2aCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfUkNWX0RTQ1BfQ09QWSkKKwkJaXB2Nl9jb3B5X2RzY3AoaXB2Nl9nZXRfZHNmaWVsZChpcHY2aCksIGlwdjZfaGRyKHNrYikpOworCisJaWYgKElORVRfRUNOX2lzX2NlKGlwdjZfZ2V0X2RzZmllbGQoaXB2NmgpKSkKKwkJSVA2X0VDTl9zZXRfY2UoaXB2Nl9oZHIoc2tiKSk7Cit9CisKKy8qIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2soKSAqLworc3RhdGljIGlubGluZSBpbnQgaXA2X3RubF9yY3ZfY3RsKHN0cnVjdCBpcDZfdG5sICp0KQoreworCXN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAgPSAmdC0+cGFybXM7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldCh0LT5kZXYpOworCisJaWYgKHAtPmZsYWdzICYgSVA2X1ROTF9GX0NBUF9SQ1YpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmxkZXYgPSBOVUxMOworCisJCWlmIChwLT5saW5rKQorCQkJbGRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KG5ldCwgcC0+bGluayk7CisKKwkJaWYgKChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZwLT5sYWRkcikgfHwKKwkJICAgICBsaWtlbHkoaXB2Nl9jaGtfYWRkcihuZXQsICZwLT5sYWRkciwgbGRldiwgMCkpKSAmJgorCQkgICAgbGlrZWx5KCFpcHY2X2Noa19hZGRyKG5ldCwgJnAtPnJhZGRyLCBOVUxMLCAwKSkpCisJCQlyZXQgPSAxOworCisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZXRoaXBpcDZfdG5sX3JjdiAtIGRlY2Fwc3VsYXRlIElQdjYgcGFja2V0IGFuZCByZXRyYW5zbWl0IGl0IGxvY2FsbHkKKyAqICAgQHNrYjogcmVjZWl2ZWQgc29ja2V0IGJ1ZmZlcgorICogICBAcHJvdG9jb2w6IGV0aGVybmV0IHByb3RvY29sIElECisgKiAgIEBkc2NwX2Vjbl9kZWNhcHN1bGF0ZTogdGhlIGZ1bmN0aW9uIHRvIGRlY2Fwc3VsYXRlIERTQ1AgY29kZSBhbmQgRUNOCisgKgorICogUmV0dXJuOiAwCisgKiovCitzdGF0aWMgaW50IGV0aGlwaXA2X3RubF9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MTYgcHJvdG9jb2wsCisJCSAgICAgICBfX3U4IGlwcHJvdG8sCisJCSAgICAgICB2b2lkICgqZHNjcF9lY25fZGVjYXBzdWxhdGUpKHN0cnVjdCBpcDZfdG5sICp0LAorCQkJCQkJICAgIHN0cnVjdCBpcHY2aGRyICppcHY2aCwKKwkJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSkKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqdDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSBpcHY2X2hkcihza2IpOworCisJX191MTYgKmV0aGVyaXBfdmVyOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgRVRIX0lQSExFTitFVEhfSExFTikpCisJCWdvdG8gZGlzY2FyZDsKKwkKKwlldGhlcmlwX3ZlciA9IChfX3UxNiAqKXNrYi0+ZGF0YTsKKwlpZiAoKmV0aGVyaXBfdmVyICE9IGh0b25zKEVUSEVSSVBfVkVSU0lPTikpIAorCQlnb3RvIGRpc2NhcmQ7CisJCisJcmN1X3JlYWRfbG9jaygpOworCisJaWYgKCh0ID0gZXRoaXBpcDZfdG5sX2xvb2t1cChkZXZfbmV0KHNrYi0+ZGV2KSwgJmlwdjZoLT5zYWRkciwKKwkJCQkJJmlwdjZoLT5kYWRkcikpICE9IE5VTEwpIHsKKwkJaWYgKHQtPnBhcm1zLnByb3RvICE9IGlwcHJvdG8gJiYgdC0+cGFybXMucHJvdG8gIT0gMCkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKworCQkvKiBDaGVjayB0aGUgeGZybSBwb2xpY3kgZm9yIGRlY3J5cHRlZCBwYWNrZXRzICovCisJCWlmIChza2ItPnNwICYmICF4ZnJtNl9wb2xpY3lfY2hlY2soTlVMTCwgWEZSTV9QT0xJQ1lfSU4sIHNrYikpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJZ290byBkaXNjYXJkOworCQl9CisKKwkJaWYgKCFpcDZfdG5sX3Jjdl9jdGwodCkpIHsKKwkJCXQtPmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlnb3RvIGRpc2NhcmQ7CisJCX0KKwkJc2VjcGF0aF9yZXNldChza2IpOworCQlza2JfcHVsbChza2IsIEVUSF9JUEhMRU4pOworCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKKwkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisKKworCQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHN0cnVjdCBpbmV0Nl9za2JfcGFybSkpOworCQlza2ItPmRldiA9IHQtPmRldjsKKwkJc2tiX2RzdF9kcm9wKHNrYik7CisJCW5mX3Jlc2V0KHNrYik7CisKKwkJZHNjcF9lY25fZGVjYXBzdWxhdGUodCwgaXB2NmgsIHNrYik7CisKKwkJdC0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCXQtPmRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCW5ldGlmX3J4KHNrYik7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gMDsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKK2Rpc2NhcmQ6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXA0ZXRoaXBpcDZfcmN2KHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGV0aGlwaXA2X3RubF9yY3Yoc2tiLCBFVEhfUF9JUCwgSVBQUk9UT19FVEhFUklQLAorCQkJICAgaXA0ZXRoaXBpcDZfZHNjcF9lY25fZGVjYXBzdWxhdGUpOworfQorCitzdGF0aWMgaW50IGlwNmV0aGlwaXA2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBldGhpcGlwNl90bmxfcmN2KHNrYiwgRVRIX1BfSVBWNiwgSVBQUk9UT19FVEhFUklQLAorCQkJICAgaXA2ZXRoaXBpcDZfZHNjcF9lY25fZGVjYXBzdWxhdGUpOworfQorCitzdHJ1Y3QgaXB2Nl90ZWxfdHhvcHRpb24geworCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyBvcHM7CisJX191OCBkc3Rfb3B0WzhdOworfTsKKworc3RhdGljIHZvaWQgaW5pdF90ZWxfdHhvcHQoc3RydWN0IGlwdjZfdGVsX3R4b3B0aW9uICpvcHQsIF9fdTggZW5jYXBfbGltaXQpCit7CisJbWVtc2V0KG9wdCwgMCwgc2l6ZW9mKHN0cnVjdCBpcHY2X3RlbF90eG9wdGlvbikpOworCisJb3B0LT5kc3Rfb3B0WzJdID0gSVBWNl9UTFZfVE5MX0VOQ0FQX0xJTUlUOworCW9wdC0+ZHN0X29wdFszXSA9IDE7CisJb3B0LT5kc3Rfb3B0WzRdID0gZW5jYXBfbGltaXQ7CisJb3B0LT5kc3Rfb3B0WzVdID0gSVBWNl9UTFZfUEFETjsKKwlvcHQtPmRzdF9vcHRbNl0gPSAxOworCisJb3B0LT5vcHMuZHN0MG9wdCA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopIG9wdC0+ZHN0X29wdDsKKwlvcHQtPm9wcy5vcHRfbmZsZW4gPSA4OworfQorCisvKioKKyAqIGV0aGlwaXA2X3RubF9hZGRyX2NvbmZsaWN0IC0gY29tcGFyZSBwYWNrZXQgYWRkcmVzc2VzIHRvIHR1bm5lbCdzIG93bgorICogICBAdDogdGhlIG91dGdvaW5nIHR1bm5lbCBkZXZpY2UKKyAqICAgQGhkcjogSVB2NiBoZWFkZXIgZnJvbSB0aGUgaW5jb21pbmcgcGFja2V0CisgKgorICogRGVzY3JpcHRpb246CisgKiAgIEF2b2lkIHRyaXZpYWwgdHVubmVsaW5nIGxvb3AgYnkgY2hlY2tpbmcgdGhhdCB0dW5uZWwgZXhpdC1wb2ludAorICogICBkb2Vzbid0IG1hdGNoIHNvdXJjZSBvZiBpbmNvbWluZyBwYWNrZXQuCisgKgorICogUmV0dXJuOgorICogICAxIGlmIGNvbmZsaWN0LAorICogICAwIGVsc2UKKyAqKi8KKworc3RhdGljIGlubGluZSBpbnQKK2V0aGlwaXA2X3RubF9hZGRyX2NvbmZsaWN0KHN0cnVjdCBpcDZfdG5sICp0LCBzdHJ1Y3QgaXB2NmhkciAqaGRyKQoreworCXJldHVybiBpcHY2X2FkZHJfZXF1YWwoJnQtPnBhcm1zLnJhZGRyLCAmaGRyLT5zYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV0aGlwaXA2X3RubF94bWl0X2N0bChzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKwlzdHJ1Y3QgaXA2X3RubF9wYXJtICpwID0gJnQtPnBhcm1zOworCWludCByZXQgPSAwOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQodC0+ZGV2KTsKKworCWlmIChwLT5mbGFncyAmIElQNl9UTkxfRl9DQVBfWE1JVCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqbGRldiA9IE5VTEw7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlpZiAocC0+bGluaykKKwkJCWxkZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIHAtPmxpbmspOworCisJCWlmICh1bmxpa2VseSghaXB2Nl9jaGtfYWRkcihuZXQsICZwLT5sYWRkciwgbGRldiwgMCkpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlcyB4bWl0OiBMb2NhbCBhZGRyZXNzIG5vdCB5ZXQgY29uZmlndXJlZCFcbiIsCisJCQkgICAgICAgcC0+bmFtZSk7CisJCWVsc2UgaWYgKCFpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZwLT5yYWRkcikgJiYKKwkJCSB1bmxpa2VseShpcHY2X2Noa19hZGRyKG5ldCwgJnAtPnJhZGRyLCBOVUxMLCAwKSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzIHhtaXQ6IFJvdXRpbmcgbG9vcCEgIgorCQkJICAgICAgICJSZW1vdGUgYWRkcmVzcyBmb3VuZCBvbiB0aGlzIG5vZGUhXG4iLAorCQkJICAgICAgIHAtPm5hbWUpOworCQllbHNlCisJCQlyZXQgPSAxOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKy8qKgorICogZXRoaXBpcDZfdG5sX3htaXQyIC0gZW5jYXBzdWxhdGUgcGFja2V0IGFuZCBzZW5kCisgKiAgIEBza2I6IHRoZSBvdXRnb2luZyBzb2NrZXQgYnVmZmVyCisgKiAgIEBkZXY6IHRoZSBvdXRnb2luZyB0dW5uZWwgZGV2aWNlCisgKiAgIEBkc2ZpZWxkOiBkc2NwIGNvZGUgZm9yIG91dGVyIGhlYWRlcgorICogICBAZmw6IGZsb3cgb2YgdHVubmVsZWQgcGFja2V0CisgKiAgIEBlbmNhcF9saW1pdDogZW5jYXBzdWxhdGlvbiBsaW1pdAorICogICBAcG10dTogUGF0aCBNVFUgaXMgc3RvcmVkIGlmIHBhY2tldCBpcyB0b28gYmlnCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIEJ1aWxkIG5ldyBoZWFkZXIgYW5kIGRvIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiB0aGUgcGFja2V0IGJlZm9yZSBzZW5kaW5nCisgKiAgIGl0LgorICoKKyAqIFJldHVybjoKKyAqICAgMCBvbiBzdWNjZXNzCisgKiAgIC0xIGZhaWwKKyAqICAgJS1FTVNHU0laRSBtZXNzYWdlIHRvbyBiaWcuIHJldHVybiBtdHUgaW4gdGhpcyBjYXNlLgorICoqLworCitzdGF0aWMgaW50IGV0aGlwaXA2X3RubF94bWl0MihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgX191OCBkc2ZpZWxkLAorCQkJIHN0cnVjdCBmbG93aSAqZmwsCisJCQkgaW50IGVuY2FwX2xpbWl0LAorCQkJIF9fdTMyICpwbXR1KQoreworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnQtPmRldi0+c3RhdHM7CisJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKKwlzdHJ1Y3QgaXB2Nl90ZWxfdHhvcHRpb24gb3B0OworCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdGRldjsKKwlpbnQgbXR1OworCXVuc2lnbmVkIGludCBtYXhfaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCXU4IHByb3RvOworCWludCBlcnIgPSAtMTsKKwlpbnQgcGt0X2xlbjsKKwlfX3UxNiAqZXRoZXJpcF92ZXI7CisKKwlpZiAoKChkc3QgPSBpcDZfdG5sX2RzdF9jaGVjayh0KSkgIT0gTlVMTCkgCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAmJiAodC0+Z2VuaWQgPT0gYXRvbWljX3JlYWQoJmZsb3dfY2FjaGVfZ2VuaWQpKQorI2VuZGlmCisgICAgICAgICAgICApIHsKKwkJZHN0X2hvbGQoZHN0KTsKKyAgICAgICAgfSBlbHNlIHsKKwkJZHN0ID0gaXA2X3JvdXRlX291dHB1dChuZXQsIE5VTEwsICZmbC0+dS5pcDYpOworCisJCWlmKGRzdC0+ZXJyb3IpCisJCQlnb3RvIHR4X2Vycl9saW5rX2ZhaWx1cmU7CisJCWRzdCA9IHhmcm1fbG9va3VwKG5ldCwgZHN0LCBmbCwgTlVMTCwgMCk7CisJCWlmKElTX0VSUihkc3QpKQorCQl7CisJCQllcnIgPSBQVFJfRVJSKGRzdCk7CisJCQlkc3QgPSBOVUxMOworCQkJZ290byB0eF9lcnJfbGlua19mYWlsdXJlOworCQl9CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwkJdC0+Z2VuaWQgPSBhdG9taWNfcmVhZCgmZmxvd19jYWNoZV9nZW5pZCk7CisjZW5kaWYKKyAgICAgICAgfQorCisJLyogZG9ub3QgYWxsb3cgd2lmaSBzcGVjaWZpYyBwa3RzIHRvIGJlIGJyaWRnZWQsCisgICAgICAgICAqIGlzIHRoZXJlIGFueSBiZXR0ZXIgd2h5IHRvIGlkZW50aWZ5IHRoaXMgY29uZGl0aW9uISEhIAorICAgICAgICAgKiBpZiAoc2tiLT5sZW4gPCA0Mikgc29tZSB0aGluZyBsaWtlIHRoaXMuLi4gCisgICAgICAgICAqIEZvciByZWd1bGFyIGV0aGVybmV0IHBrdHMsIGlwaGRyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIDRieXRlcywKKyAgICAgICAgICogc28gb25lIHdheSBpcyB0byBjaGVjayB0aGUgYWRkcmVzcyBhbGlnbm1lbnQgKi8KKwlpZiAoISgodW5zaWduZWQgaW50KXNrYi0+ZGF0YSAmIDB4MykpIHsKKwkJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkgCWdvdG8gdHhfZXJyX2RzdF9yZWxlYXNlOworCX0KKworCXRkZXYgPSBkc3QtPmRldjsKKworCWlmICh0ZGV2ID09IGRldikgeworCQlzdGF0cy0+Y29sbGlzaW9ucysrOworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogTG9jYWwgcm91dGluZyBsb29wIGRldGVjdGVkIVxuIiwKKwkJCSAgICAgICB0LT5wYXJtcy5uYW1lKTsKKwkJZ290byB0eF9lcnJfZHN0X3JlbGVhc2U7CisJfQorCW10dSA9IGRzdF9tdHUoZHN0KSAtIChzaXplb2YgKCppcHY2aCkgKyBFVEhfSVBITEVOICsgRVRIX0hMRU4pOworCWlmIChlbmNhcF9saW1pdCA+PSAwKSB7CisJCW1heF9oZWFkcm9vbSArPSA4OworCQltdHUgLT0gODsKKwl9CisJaWYgKG10dSA8IElQVjZfTUlOX01UVSkKKwkJbXR1ID0gSVBWNl9NSU5fTVRVOworCWlmIChza2JfZHN0KHNrYikpCisJCXNrYl9kc3Qoc2tiKS0+b3BzLT51cGRhdGVfcG10dShza2JfZHN0KHNrYiksIG10dSk7CisKKwkvKgorCSAqIE9rYXksIG5vdyBzZWUgaWYgd2UgY2FuIHN0dWZmIGl0IGluIHRoZSBidWZmZXIgYXMtaXMuCisJICovCisJbWF4X2hlYWRyb29tICs9IExMX1JFU0VSVkVEX1NQQUNFKHRkZXYpOworCisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgbWF4X2hlYWRyb29tIHx8IHNrYl9zaGFyZWQoc2tiKSB8fAorCSAgICAoc2tiX2Nsb25lZChza2IpICYmICFza2JfY2xvbmVfd3JpdGFibGUoc2tiLCAwKSkpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7CisKKwkJaWYgKCEobmV3X3NrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgbWF4X2hlYWRyb29tKSkpCisJCQlnb3RvIHR4X2Vycl9kc3RfcmVsZWFzZTsKKworCQlpZiAoc2tiLT5zaykKKwkJCXNrYl9zZXRfb3duZXJfdyhuZXdfc2tiLCBza2ItPnNrKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IG5ld19za2I7CisJfQorCXNrYl9kc3RfZHJvcChza2IpOworCXNrYl9kc3Rfc2V0KHNrYiwgZHN0X2Nsb25lKGRzdCkpOworCisJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKKwlJUDZDQihza2IpLT5uaG9mZiA9IG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBuZXh0aGRyKTsKKworCWV0aGVyaXBfdmVyICA9IChfX3UxNiAqKXNrYl9wdXNoKHNrYiwgRVRIX0lQSExFTik7CisJKmV0aGVyaXBfdmVyID0gaHRvbnMoRVRIRVJJUF9WRVJTSU9OKTsKKworCXByb3RvID0gZmwtPmZsb3dpX3Byb3RvOworCWlmIChlbmNhcF9saW1pdCA+PSAwKSB7CisJCWluaXRfdGVsX3R4b3B0KCZvcHQsIGVuY2FwX2xpbWl0KTsKKwkJaXB2Nl9wdXNoX25mcmFnX29wdHMoc2tiLCAmb3B0Lm9wcywgJnByb3RvLCBOVUxMKTsKKwl9CisJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwlpcHY2aCA9IGlwdjZfaGRyKHNrYik7CisJKihfX2JlMzIqKWlwdjZoID0gZmwtPnUuaXA2LmZsb3dsYWJlbCB8IGh0b25sKDB4NjAwMDAwMDApOworCS8vZHNmaWVsZCA9IElORVRfRUNOX2VuY2Fwc3VsYXRlKDAsIGRzZmllbGQpOworCS8vaXB2Nl9jaGFuZ2VfZHNmaWVsZChpcHY2aCwgfklORVRfRUNOX01BU0ssIGRzZmllbGQpOworCWlwdjZoLT5ob3BfbGltaXQgPSB0LT5wYXJtcy5ob3BfbGltaXQ7CisJaXB2NmgtPm5leHRoZHIgPSBwcm90bzsKKwlpcHY2X2FkZHJfY29weSgmaXB2NmgtPnNhZGRyLCAmZmwtPnUuaXA2LnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmaXB2NmgtPmRhZGRyLCAmZmwtPnUuaXA2LmRhZGRyKTsKKwluZl9yZXNldChza2IpOworCXBrdF9sZW4gPSBza2ItPmxlbjsKKwlza2ItPmxvY2FsX2RmID0gMTsKKwllcnIgPSBpcDZfbG9jYWxfb3V0KHNrYik7CisKKwlpZiAobmV0X3htaXRfZXZhbChlcnIpID09IDApIHsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IHBrdF9sZW47CisJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJfSBlbHNlIHsKKwkJc3RhdHMtPnR4X2Vycm9ycysrOworCQlzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMrKzsKKwl9CisJaXA2X3RubF9kc3Rfc3RvcmUodCwgZHN0KTsKKwlyZXR1cm4gMDsKK3R4X2Vycl9saW5rX2ZhaWx1cmU6CisJc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzKys7CisJZHN0X2xpbmtfZmFpbHVyZShza2IpOwordHhfZXJyX2RzdF9yZWxlYXNlOgorCWRzdF9yZWxlYXNlKGRzdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fZXRoaXBpcDZfdG5sX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZsb3dpIGZsOworCV9fdTMyIG10dSA9IDA7CisJaW50IGVycjsKKworCW1lbWNweSgmZmwsICZ0LT5mbCwgc2l6ZW9mIChmbCkpOworCWZsLmZsb3dpX3Byb3RvID0gSVBQUk9UT19FVEhFUklQOworCisJZXJyID0gZXRoaXBpcDZfdG5sX3htaXQyKHNrYiwgZGV2LCAwLCAmZmwsIC0xLCAmbXR1KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJLyogWFhYOiBzZW5kIElDTVAgZXJyb3IgZXZlbiBpZiBERiBpcyBub3Qgc2V0LiAqLworCQlpZiAoZXJyID09IC1FTVNHU0laRSkgeworCQkJaWNtcF9zZW5kKHNrYiwgSUNNUF9ERVNUX1VOUkVBQ0gsIElDTVBfRlJBR19ORUVERUQsIGh0b25sKG10dSkpOworCQl9CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lwNGV0aGlwaXA2X3RubF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpcGhkciAgKmlwaCA9IGlwX2hkcihza2IpOworCWludCBlbmNhcF9saW1pdCA9IC0xOworCXN0cnVjdCBmbG93aSBmbDsKKwlfX3U4IGRzZmllbGQ7CisJX191MzIgbXR1ID0gMDsKKwlpbnQgZXJyOworCisKKwltZW1jcHkoJmZsLCAmdC0+ZmwsIHNpemVvZiAoZmwpKTsKKwlmbC5mbG93aV9wcm90byA9IElQUFJPVE9fRVRIRVJJUDsKKworCWRzZmllbGQgPSBpcHY0X2dldF9kc2ZpZWxkKGlwaCk7CisKKworCWVyciA9IGV0aGlwaXA2X3RubF94bWl0Mihza2IsIGRldiwgZHNmaWVsZCwgJmZsLCBlbmNhcF9saW1pdCwgJm10dSk7CisJaWYgKGVyciAhPSAwKSB7CisJCS8qIFhYWDogc2VuZCBJQ01QIGVycm9yIGV2ZW4gaWYgREYgaXMgbm90IHNldC4gKi8KKwkJaWYgKGVyciA9PSAtRU1TR1NJWkUpCisJCQlpY21wX3NlbmQoc2tiLCBJQ01QX0RFU1RfVU5SRUFDSCwgSUNNUF9GUkFHX05FRURFRCwgCisJCQkJaHRvbmwobXR1KSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lwNmV0aGlwaXA2X3RubF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpcHY2aGRyICppcHY2aCA9IGlwdjZfaGRyKHNrYik7CisJaW50IGVuY2FwX2xpbWl0ID0gLTE7CisJLy9fX3UxNiBvZmZzZXQ7CisJc3RydWN0IGZsb3dpIGZsOworCV9fdTggZHNmaWVsZDsKKwlfX3UzMiBtdHUgPSAwOworCWludCBlcnI7CisKKwltZW1jcHkoJmZsLCAmdC0+ZmwsIHNpemVvZiAoZmwpKTsKKwlmbC5mbG93aV9wcm90byA9IElQUFJPVE9fRVRIRVJJUDsKKworCWRzZmllbGQgPSBpcHY2X2dldF9kc2ZpZWxkKGlwdjZoKTsKKworCWVyciA9IGV0aGlwaXA2X3RubF94bWl0Mihza2IsIGRldiwgZHNmaWVsZCwgJmZsLCBlbmNhcF9saW1pdCwgJm10dSk7CisJaWYgKGVyciAhPSAwKSB7CisJCWlmIChlcnIgPT0gLUVNU0dTSVpFKQorCQkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEtUX1RPT0JJRywgMCwgbXR1KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgbmV0ZGV2X3R4X3QKK2V0aGlwaXA2X3RubF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZ0LT5kZXYtPnN0YXRzOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKKwljYXNlIGh0b25zKEVUSF9QX0lQKToKKwkJcmV0ID0gaXA0ZXRoaXBpcDZfdG5sX3htaXQoc2tiLCBkZXYpOworCQlicmVhazsKKwljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgorCQlyZXQgPSBpcDZldGhpcGlwNl90bmxfeG1pdChza2IsIGRldik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IF9fZXRoaXBpcDZfdG5sX3htaXQoc2tiLCBkZXYpOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byB0eF9lcnI7CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCit0eF9lcnI6CisJc3RhdHMtPnR4X2Vycm9ycysrOworCXN0YXRzLT50eF9kcm9wcGVkKys7CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIHZvaWQgaXA2X3RubF9zZXRfY2FwKHN0cnVjdCBpcDZfdG5sICp0KQoreworCXN0cnVjdCBpcDZfdG5sX3Bhcm0gKnAgPSAmdC0+cGFybXM7CisJaW50IGx0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJnAtPmxhZGRyKTsKKwlpbnQgcnR5cGUgPSBpcHY2X2FkZHJfdHlwZSgmcC0+cmFkZHIpOworCisJcC0+ZmxhZ3MgJj0gfihJUDZfVE5MX0ZfQ0FQX1hNSVR8SVA2X1ROTF9GX0NBUF9SQ1YpOworCisJaWYgKGx0eXBlICYgKElQVjZfQUREUl9VTklDQVNUfElQVjZfQUREUl9NVUxUSUNBU1QpICYmCisJICAgIHJ0eXBlICYgKElQVjZfQUREUl9VTklDQVNUfElQVjZfQUREUl9NVUxUSUNBU1QpICYmCisJICAgICEoKGx0eXBlfHJ0eXBlKSAmIElQVjZfQUREUl9MT09QQkFDSykgJiYKKwkgICAgKCEoKGx0eXBlfHJ0eXBlKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpIHx8IHAtPmxpbmspKSB7CisJCWlmIChsdHlwZSZJUFY2X0FERFJfVU5JQ0FTVCkKKwkJCXAtPmZsYWdzIHw9IElQNl9UTkxfRl9DQVBfWE1JVDsKKwkJaWYgKHJ0eXBlJklQVjZfQUREUl9VTklDQVNUKQorCQkJcC0+ZmxhZ3MgfD0gSVA2X1ROTF9GX0NBUF9SQ1Y7CisJfQorfQorCitzdGF0aWMgdm9pZCBldGhpcGlwNl90bmxfbGlua19jb25maWcoc3RydWN0IGlwNl90bmwgKnQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHQtPmRldjsKKwlzdHJ1Y3QgaXA2X3RubF9wYXJtICpwID0gJnQtPnBhcm1zOworCXN0cnVjdCBmbG93aSAqZmwgPSAmdC0+Zmw7CisJc3RydWN0IG5ldF9kZXZpY2UgKmxkZXYgPSBOVUxMOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQodC0+ZGV2KTsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCAmcC0+bGFkZHIsIGRldi0+YWRkcl9sZW4pOworCS8qIE1ha2Ugc3VyZSB0aGF0IGRldl9hZGRyIGlzIG5pdGhlciBtY2FzdCBub3IgYWxsIHplcm9zICovCisJZGV2LT5kZXZfYWRkclswXSAmPSAweGZlOworCWRldi0+ZGV2X2FkZHJbMF0gfD0gMHgyOworCisJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmcC0+cmFkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKworCS8qIFNldCB1cCBmbG93aSB0ZW1wbGF0ZSAqLworCWlwdjZfYWRkcl9jb3B5KCZmbC0+dS5pcDYuc2FkZHIsICZwLT5sYWRkcik7CisJaXB2Nl9hZGRyX2NvcHkoJmZsLT51LmlwNi5kYWRkciwgJnAtPnJhZGRyKTsKKwlmbC0+Zmxvd2lfb2lmID0gcC0+bGluazsKKwkvL2ZsLT51LmlwNi5mbG93bGFiZWwgPSAwOyAKKworCWlmICghKHAtPmZsYWdzJklQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpKQorCQlmbC0+dS5pcDYuZmxvd2xhYmVsIHw9IElQVjZfVENMQVNTX01BU0sgJiBwLT5mbG93aW5mbzsKKwlpZiAoIShwLT5mbGFncyZJUDZfVE5MX0ZfVVNFX09SSUdfRkxPV0xBQkVMKSkKKwkJZmwtPnUuaXA2LmZsb3dsYWJlbCB8PSBJUFY2X0ZMT1dMQUJFTF9NQVNLICYgcC0+Zmxvd2luZm87CisKKwlpcDZfdG5sX3NldF9jYXAodCk7CisKKwlpZiAocC0+ZmxhZ3MmSVA2X1ROTF9GX0NBUF9YTUlUICYmIHAtPmZsYWdzJklQNl9UTkxfRl9DQVBfUkNWKQorCQlkZXYtPmZsYWdzIHw9IElGRl9QT0lOVE9QT0lOVDsKKwllbHNlCisJCWRldi0+ZmxhZ3MgJj0gfklGRl9QT0lOVE9QT0lOVDsKKworCWRldi0+aWZsaW5rID0gcC0+bGluazsKKworCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgbXR1ICBvZiB0dW5uZWwgd2l0aCBpdCdzIHBhcmVudCBpbnRlcmZhY2UKKwltdHUgKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKHAtPmxpbmspCisJeworCQlsZGV2ID0gZGV2X2dldF9ieV9pbmRleF9yY3UobmV0LCBwLT5saW5rKTsKKwkJaWYgKGxkZXYpCisJCQlkZXYtPm10dSA9IGxkZXYtPm10dTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAocC0+ZmxhZ3MgJiBJUDZfVE5MX0ZfQ0FQX1hNSVQpIHsKKwkJaW50IHN0cmljdCA9IChpcHY2X2FkZHJfdHlwZSgmcC0+cmFkZHIpICYKKwkJCSAgICAgIChJUFY2X0FERFJfTVVMVElDQVNUfElQVjZfQUREUl9MSU5LTE9DQUwpKTsKKworCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gcnQ2X2xvb2t1cChkZXZfbmV0KGRldiksCisJCQkJCQkgJnAtPnJhZGRyLCAmcC0+bGFkZHIsCisJCQkJCQkgcC0+bGluaywgc3RyaWN0KTsKKworCQlpZiAocnQgPT0gTlVMTCkKKwkJCXJldHVybjsKKworCQlpZiAocnQtPnJ0NmlfZGV2KSB7CisJCQlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IHJ0LT5ydDZpX2Rldi0+aGFyZF9oZWFkZXJfbGVuICsKKwkJCQlzaXplb2YgKHN0cnVjdCBpcHY2aGRyKTsKKworCQkJZGV2LT5tdHUgPSBydC0+cnQ2aV9kZXYtPm10dTsgLy9UbyBtYWtlIGJyaWRnZSBoYXBweQorCisJCQlpZiAoZGV2LT5tdHUgPCBJUFY2X01JTl9NVFUpCisJCQkJZGV2LT5tdHUgPSBJUFY2X01JTl9NVFU7CisJCX0KKwkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOworCX0KK30KKworLyoqCisgKiBldGhpcGlwNl90bmxfY2hhbmdlIC0gdXBkYXRlIHRoZSB0dW5uZWwgcGFyYW1ldGVycworICogICBAdDogdHVubmVsIHRvIGJlIGNoYW5nZWQKKyAqICAgQHA6IHR1bm5lbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgZXRoaXBpcDZfdG5sX2NoYW5nZSgpIHVwZGF0ZXMgdGhlIHR1bm5lbCBwYXJhbWV0ZXJzCisgKiovCisKK3N0YXRpYyBpbnQKK2V0aGlwaXA2X3RubF9jaGFuZ2Uoc3RydWN0IGlwNl90bmwgKnQsIHN0cnVjdCBpcDZfdG5sX3Bhcm0gKnApCit7CisJaXB2Nl9hZGRyX2NvcHkoJnQtPnBhcm1zLmxhZGRyLCAmcC0+bGFkZHIpOworCWlwdjZfYWRkcl9jb3B5KCZ0LT5wYXJtcy5yYWRkciwgJnAtPnJhZGRyKTsKKwl0LT5wYXJtcy5mbGFncyA9IHAtPmZsYWdzOworCXQtPnBhcm1zLmhvcF9saW1pdCA9IHAtPmhvcF9saW1pdDsKKwl0LT5wYXJtcy5lbmNhcF9saW1pdCA9IHAtPmVuY2FwX2xpbWl0OworCXQtPnBhcm1zLmZsb3dpbmZvID0gcC0+Zmxvd2luZm87CisJdC0+cGFybXMubGluayA9IHAtPmxpbms7CisJdC0+cGFybXMucHJvdG8gPSBwLT5wcm90bzsKKwlpcDZfdG5sX2RzdF9yZXNldCh0KTsKKwlldGhpcGlwNl90bmxfbGlua19jb25maWcodCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZWh0aXBpcDZfdG5sX2lvY3RsIC0gY29uZmlndXJlIGlwdjYgdHVubmVscyBmcm9tIHVzZXJzcGFjZQorICogICBAZGV2OiB2aXJ0dWFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdHVubmVsCisgKiAgIEBpZnI6IHBhcmFtZXRlcnMgcGFzc2VkIGZyb20gdXNlcnNwYWNlCisgKiAgIEBjbWQ6IGNvbW1hbmQgdG8gYmUgcGVyZm9ybWVkCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIGV0aGlwaXA2X3RubF9pb2N0bCgpIGlzIHVzZWQgZm9yIG1hbmFnaW5nIElQdjYgdHVubmVscworICogICBmcm9tIHVzZXJzcGFjZS4KKyAqCisgKiAgIFRoZSBwb3NzaWJsZSBjb21tYW5kcyBhcmUgdGhlIGZvbGxvd2luZzoKKyAqICAgICAlU0lPQ0dFVFRVTk5FTDogZ2V0IHR1bm5lbCBwYXJhbWV0ZXJzIGZvciBkZXZpY2UKKyAqICAgICAlU0lPQ0FERFRVTk5FTDogYWRkIHR1bm5lbCBtYXRjaGluZyBnaXZlbiB0dW5uZWwgcGFyYW1ldGVycworICogICAgICVTSU9DQ0hHVFVOTkVMOiBjaGFuZ2UgdHVubmVsIHBhcmFtZXRlcnMgdG8gdGhvc2UgZ2l2ZW4KKyAqICAgICAlU0lPQ0RFTFRVTk5FTDogZGVsZXRlIHR1bm5lbAorICoKKyAqICAgVGhlIGZhbGxiYWNrIGRldmljZSAiZXRoaXBpcDZ0bmwwIiwgY3JlYXRlZCBkdXJpbmcgbW9kdWxlCisgKiAgIGluaXRpYWxpemF0aW9uLCBjYW4gYmUgdXNlZCBmb3IgY3JlYXRpbmcgb3RoZXIgdHVubmVsIGRldmljZXMuCisgKgorICogUmV0dXJuOgorICogICAwIG9uIHN1Y2Nlc3MsCisgKiAgICUtRUZBVUxUIGlmIHVuYWJsZSB0byBjb3B5IGRhdGEgdG8gb3IgZnJvbSB1c2Vyc3BhY2UsCisgKiAgICUtRVBFUk0gaWYgY3VycmVudCBwcm9jZXNzIGhhc24ndCAlQ0FQX05FVF9BRE1JTiBzZXQKKyAqICAgJS1FSU5WQUwgaWYgcGFzc2VkIHR1bm5lbCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLAorICogICAlLUVFWElTVCBpZiBjaGFuZ2luZyBhIHR1bm5lbCdzIHBhcmFtZXRlcnMgd291bGQgY2F1c2UgYSBjb25mbGljdAorICogICAlLUVOT0RFViBpZiBhdHRlbXB0aW5nIHRvIGNoYW5nZSBvciBkZWxldGUgYSBub25leGlzdGluZyBkZXZpY2UKKyAqKi8KKworc3RhdGljIGludAorZXRoaXBpcDZfdG5sX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBpcDZfdG5sX3Bhcm0gcDsKKwlzdHJ1Y3QgaXA2X3RubCAqdCA9IE5VTEw7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOworCXN0cnVjdCBpcDZfdG5sX25ldCAqaXA2biA9IG5ldF9nZW5lcmljKG5ldCwgZXRoaXBpcDZfdG5sX25ldF9pZCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU0lPQ0dFVFRVTk5FTDoKKwkJaWYgKGRldiA9PSBpcDZuLT5mYl90bmxfZGV2KSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YgKHApKSkgeworCQkJCWVyciA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0ID0gZXRoaXBpcDZfdG5sX2xvY2F0ZShuZXQsICZwLCAwKTsKKwkJfQorCQlpZiAodCA9PSBOVUxMKQorCQkJdCA9IG5ldGRldl9wcml2KGRldik7CisJCW1lbWNweSgmcCwgJnQtPnBhcm1zLCBzaXplb2YgKHApKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgJnAsIHNpemVvZiAocCkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCWNhc2UgU0lPQ0FERFRVTk5FTDoKKwljYXNlIFNJT0NDSEdUVU5ORUw6CisJCWVyciA9IC1FUEVSTTsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJYnJlYWs7CisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcCwgaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEsIHNpemVvZiAocCkpKQorCQkJYnJlYWs7CisJCWVyciA9IC1FSU5WQUw7CisJCWlmIChwLnByb3RvICE9IElQUFJPVE9fRVRIRVJJUCAmJiBwLnByb3RvICE9IDApCisJCQlicmVhazsKKwkJdCA9IGV0aGlwaXA2X3RubF9sb2NhdGUobmV0LCAmcCwgY21kID09IFNJT0NBRERUVU5ORUwpOworCQlpZiAoZGV2ICE9IGlwNm4tPmZiX3RubF9kZXYgJiYgY21kID09IFNJT0NDSEdUVU5ORUwpIHsKKwkJCWlmICh0ICE9IE5VTEwpIHsKKwkJCQlpZiAodC0+ZGV2ICE9IGRldikgeworCQkJCQllcnIgPSAtRUVYSVNUOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQkJZXRoaXBpcDZfdG5sX3VubGluayhpcDZuLCB0KTsKKwkJCWVyciA9IGV0aGlwaXA2X3RubF9jaGFuZ2UodCwgJnApOworCQkJZXRoaXBpcDZfdG5sX2xpbmsoaXA2biwgdCk7CisJCQluZXRkZXZfc3RhdGVfY2hhbmdlKGRldik7CisJCX0KKwkJaWYgKHQpIHsKKwkJCWVyciA9IDA7CisJCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCAmdC0+cGFybXMsIHNpemVvZiAocCkpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisKKwkJfSBlbHNlCisJCQllcnIgPSAoY21kID09IFNJT0NBRERUVU5ORUwgPyAtRU5PQlVGUyA6IC1FTk9FTlQpOworCQlicmVhazsKKwljYXNlIFNJT0NERUxUVU5ORUw6CisJCWVyciA9IC1FUEVSTTsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJYnJlYWs7CisKKwkJaWYgKGRldiA9PSBpcDZuLT5mYl90bmxfZGV2KSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZwLCBpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgc2l6ZW9mIChwKSkpCisJCQkJYnJlYWs7CisJCQllcnIgPSAtRU5PRU5UOworCQkJaWYgKCh0ID0gZXRoaXBpcDZfdG5sX2xvY2F0ZShuZXQsICZwLCAwKSkgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCWVyciA9IC1FUEVSTTsKKwkJCWlmICh0LT5kZXYgPT0gaXA2bi0+ZmJfdG5sX2RldikKKwkJCQlicmVhazsKKwkJCWRldiA9IHQtPmRldjsKKwkJfQorCQllcnIgPSAwOworCQl1bnJlZ2lzdGVyX25ldGRldmljZShkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGV0aGlwaXA2X3RubF9jaGFuZ2VfbXR1IC0gY2hhbmdlIG10dSBtYW51YWxseSBmb3IgdHVubmVsIGRldmljZQorICogICBAZGV2OiB2aXJ0dWFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdHVubmVsCisgKiAgIEBuZXdfbXR1OiB0aGUgbmV3IG10dQorICoKKyAqIFJldHVybjoKKyAqICAgMCBvbiBzdWNjZXNzLAorICogICAlLUVJTlZBTCBpZiBtdHUgdG9vIHNtYWxsCisgKiovCisKK3N0YXRpYyBpbnQKK2V0aGlwaXA2X3RubF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCWlmIChuZXdfbXR1IDwgSVBWNl9NSU5fTVRVKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXRoaXBpcDZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aGlwaXA2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpcDZfdG5sX25ldGRldl9vcHMgPSB7CisJLm5kb19pbml0ID0gZXRoaXBpcDZfdG5sX2Rldl9pbml0LAorCS5uZG9fdW5pbml0ID0gZXRoaXBpcDZfdG5sX2Rldl91bmluaXQsCisJLm5kb19zdGFydF94bWl0ID0gZXRoaXBpcDZfdG5sX3htaXQsCisJLm5kb19kb19pb2N0bCA9IGV0aGlwaXA2X3RubF9pb2N0bCwKKwkubmRvX2NoYW5nZV9tdHUgPSBldGhpcGlwNl90bmxfY2hhbmdlX210dSwKKwkubmRvX29wZW4gPSBldGhpcGlwNl9vcGVuLAorCS5uZG9fc3RvcCA9IGV0aGlwaXA2X3N0b3AsIAorfTsKKworLyoqCisgKiBldGhpcGlwNl90bmxfZGV2X3NldHVwIC0gc2V0dXAgdmlydHVhbCB0dW5uZWwgZGV2aWNlCisgKiAgIEBkZXY6IHZpcnR1YWwgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0dW5uZWwKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgSW5pdGlhbGl6ZSBmdW5jdGlvbiBwb2ludGVycyBhbmQgZGV2aWNlIHBhcmFtZXRlcnMKKyAqKi8KKworc3RhdGljIHZvaWQgZXRoaXBpcDZfdG5sX2Rldl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWRldi0+bmV0ZGV2X29wcyA9ICZpcDZfdG5sX25ldGRldl9vcHM7CisJZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CisKKwlkZXYtPnR5cGUgPSBBUlBIUkRfSVBWNl9JUFY2X1RVTk5FTDsKKwlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IExMX01BWF9IRUFERVIgKyBzaXplb2YgKHN0cnVjdCBpcHY2aGRyKTsKKwlkZXYtPm10dSA9IEVUSF9EQVRBX0xFTiAtIHNpemVvZiAoc3RydWN0IGlwdjZoZHIpIC0gRVRIX0lQSExFTiAtIEVUSF9ITEVOOworCWRldi0+ZmxhZ3MgfD0gSUZGX05PQVJQOworCisJaWYgKGlwdjZfYWRkcl90eXBlKCZ0LT5wYXJtcy5yYWRkcikgJiBJUFY2X0FERFJfVU5JQ0FTVCkKKwkJZGV2LT5mbGFncyB8PSBJRkZfUE9JTlRPUE9JTlQ7CisJZGV2LT5pZmxpbmsgPSAwOyAKKworCWRldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsgLy9UbyBtYWtlIGJyaWRnZSBoYXBweSB3aGlsZSBhZGRpbmcgZXRoZXJpcCBpZmFjZSB0byBicmlkZ2UKKwlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTkVUTlNfTE9DQUw7Cit9CisKKworLyoqCisgKiBldGhpcGlwNl90bmxfZGV2X2luaXRfZ2VuIC0gZ2VuZXJhbCBpbml0aWFsaXplciBmb3IgYWxsIHR1bm5lbCBkZXZpY2VzCisgKiAgIEBkZXY6IHZpcnR1YWwgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0dW5uZWwKKyAqKi8KKworc3RhdGljIGlubGluZSB2b2lkCitldGhpcGlwNl90bmxfZGV2X2luaXRfZ2VuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXQtPmRldiA9IGRldjsKKwlzdHJjcHkodC0+cGFybXMubmFtZSwgZGV2LT5uYW1lKTsKK30KKworLyoqCisgKiBldGhpcGlwNl90bmxfZGV2X2luaXQgLSBpbml0aWFsaXplciBmb3IgYWxsIG5vbiBmYWxsYmFjayB0dW5uZWwgZGV2aWNlcworICogICBAZGV2OiB2aXJ0dWFsIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdHVubmVsCisgKiovCisKK3N0YXRpYyBpbnQgZXRoaXBpcDZfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOworCWV0aGlwaXA2X3RubF9kZXZfaW5pdF9nZW4oZGV2KTsKKwlldGhpcGlwNl90bmxfbGlua19jb25maWcodCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBldGhpcGlwNl9mYl90bmxfZGV2X2luaXQgLSBpbml0aWFsaXplciBmb3IgZmFsbGJhY2sgdHVubmVsIGRldmljZQorICogICBAZGV2OiBmYWxsYmFjayBkZXZpY2UKKyAqCisgKiBSZXR1cm46IDAKKyAqKi8KKworc3RhdGljIHZvaWQgZXRoaXBpcDZfZmJfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlzdHJ1Y3QgaXA2X3RubF9uZXQgKmlwNm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGV0aGlwaXA2X3RubF9uZXRfaWQpOworCisJZXRoaXBpcDZfdG5sX2Rldl9pbml0X2dlbihkZXYpOworCXQtPnBhcm1zLnByb3RvID0gSVBQUk9UT19FVEhFUklQOworCWRldl9ob2xkKGRldik7CisJaXA2bi0+dG5sc193Y1swXSA9IHQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeGZybTZfdHVubmVsIGlwNGV0aGlwaXA2X2hhbmRsZXIgPSB7CisJLmhhbmRsZXIJPSBpcDRldGhpcGlwNl9yY3YsCisJLmVycl9oYW5kbGVyCT0gaXA0ZXRoaXBpcDZfZXJyLAorCS5wcmlvcml0eQk9CTMsCit9OworCitzdGF0aWMgc3RydWN0IHhmcm02X3R1bm5lbCBpcDZldGhpcGlwNl9oYW5kbGVyID0geworCS5oYW5kbGVyCT0gaXA2ZXRoaXBpcDZfcmN2LAorCS5lcnJfaGFuZGxlcgk9IGlwNmV0aGlwaXA2X2VyciwKKwkucHJpb3JpdHkJPQkzLAorfTsKKworc3RhdGljIHZvaWQgZXRoaXBpcDZfdG5sX2Rlc3Ryb3lfdHVubmVscyhzdHJ1Y3QgaXA2X3RubF9uZXQgKmlwNm4pCit7CisJaW50IGg7CisJc3RydWN0IGlwNl90bmwgKnQ7CisJTElTVF9IRUFEKGxpc3QpOworCisJZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CisJCXQgPSBpcDZuLT50bmxzX3JfbFtoXTsKKwkJd2hpbGUgKHQgIT0gTlVMTCkgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfcXVldWUodC0+ZGV2LCAmbGlzdCk7CisJCQl0ID0gdC0+bmV4dDsKKwkJfQorCX0KKworCXQgPSBpcDZuLT50bmxzX3djWzBdOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX3F1ZXVlKHQtPmRldiwgJmxpc3QpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX21hbnkoJmxpc3QpOworfQorCitzdGF0aWMgaW50IGV0aGlwaXA2X3RubF9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJc3RydWN0IGlwNl90bmxfbmV0ICppcDZuID0gbmV0X2dlbmVyaWMobmV0LCBldGhpcGlwNl90bmxfbmV0X2lkKTsKKwlpbnQgZXJyOworCisJaXA2bi0+dG5sc1swXSA9IGlwNm4tPnRubHNfd2M7CisJaXA2bi0+dG5sc1sxXSA9IGlwNm4tPnRubHNfcl9sOworCisJZXJyID0gLUVOT01FTTsKKwlpcDZuLT5mYl90bmxfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3QgaXA2X3RubCksICJldGhpcGlwNnRubDAiLAorCQkJCSAgICAgIGV0aGlwaXA2X3RubF9kZXZfc2V0dXApOworCisJaWYgKCFpcDZuLT5mYl90bmxfZGV2KQorCQlnb3RvIGVycl9hbGxvY19kZXY7CisJZGV2X25ldF9zZXQoaXA2bi0+ZmJfdG5sX2RldiwgbmV0KTsKKworCWV0aGlwaXA2X2ZiX3RubF9kZXZfaW5pdChpcDZuLT5mYl90bmxfZGV2KTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihpcDZuLT5mYl90bmxfZGV2KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisJcmV0dXJuIDA7CisKK2Vycl9yZWdpc3RlcjoKKwlmcmVlX25ldGRldihpcDZuLT5mYl90bmxfZGV2KTsKK2Vycl9hbGxvY19kZXY6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZXRoaXBpcDZfdG5sX2V4aXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgaXA2X3RubF9uZXQgKmlwNm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGV0aGlwaXA2X3RubF9uZXRfaWQpOworCisJcnRubF9sb2NrKCk7CisJZXRoaXBpcDZfdG5sX2Rlc3Ryb3lfdHVubmVscyhpcDZuKTsKKwlydG5sX3VubG9jaygpOworfQorCitzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGV0aGlwaXA2X3RubF9uZXRfb3BzID0geworCS5pbml0ID0gZXRoaXBpcDZfdG5sX2luaXRfbmV0LAorCS5leGl0ID0gZXRoaXBpcDZfdG5sX2V4aXRfbmV0LAorCS5pZCAgID0gJmV0aGlwaXA2X3RubF9uZXRfaWQsCisJLnNpemUgPSBzaXplb2Yoc3RydWN0IGlwNl90bmxfbmV0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgZXRoaXBpcDZfcHJvdG9jb2wgPSB7CisgCS5oYW5kbGVyICAgICAgICA9ICAgICAgIGlwNGV0aGlwaXA2X3JjdiwKKyAgICAgICAgLmVycl9oYW5kbGVyICAgID0gICAgICAgaXA0ZXRoaXBpcDZfZXJyLAorCS5mbGFncwkJPSAJSVBQUk9UT19FVEhFUklQLAorfTsKKworLyoqCisgKiBldGhpcGlwNl90dW5uZWxfaW5pdCAtIHJlZ2lzdGVyIHByb3RvY29sIGFuZCByZXNlcnZlIG5lZWRlZCByZXNvdXJjZXMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcworICoqLworCitzdGF0aWMgaW50IF9faW5pdCBldGhpcGlwNl90dW5uZWxfaW5pdCh2b2lkKQoreworCWludCAgZXJyOworCisJaWYgKHhmcm02X3R1bm5lbF9yZWdpc3RlcigmaXA0ZXRoaXBpcDZfaGFuZGxlciwgQUZfSU5FVCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpcDZfdHVubmVsIGluaXQ6IGNhbid0IHJlZ2lzdGVyIGlwNGV0aGlwaXA2XG4iKTsKKwkJZXJyID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHhmcm02X3R1bm5lbF9yZWdpc3RlcigmaXA2ZXRoaXBpcDZfaGFuZGxlciwgQUZfSU5FVDYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXA2X3R1bm5lbCBpbml0OiBjYW4ndCByZWdpc3RlciBpcDZldGhpcGlwNlxuIik7CisJCWVyciA9IC1FQUdBSU47CisJCWdvdG8gdW5yZWdfaXA0aXA2OworCX0KKworCWVyciA9IHJlZ2lzdGVyX3Blcm5ldF9kZXZpY2UoJmV0aGlwaXA2X3RubF9uZXRfb3BzKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfcGVybmV0OworCisJaWYgKGluZXQ2X2FkZF9wcm90b2NvbCgmZXRoaXBpcDZfcHJvdG9jb2wsIElQUFJPVE9fRVRIRVJJUCkpIHsgCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47CisJfQorCXJldHVybiAwOworCitlcnJfcGVybmV0OgorCXhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDZldGhpcGlwNl9oYW5kbGVyLCBBRl9JTkVUNik7Cit1bnJlZ19pcDRpcDY6CisJeGZybTZfdHVubmVsX2RlcmVnaXN0ZXIoJmlwNGV0aGlwaXA2X2hhbmRsZXIsIEFGX0lORVQpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogZXRoaXBpcDZfdHVubmVsX2NsZWFudXAgLSBmcmVlIHJlc291cmNlcyBhbmQgdW5yZWdpc3RlciBwcm90b2NvbAorICoqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgZXRoaXBpcDZfdHVubmVsX2NsZWFudXAodm9pZCkKK3sKKworCWlmIChpbmV0Nl9kZWxfcHJvdG9jb2woJmV0aGlwaXA2X3Byb3RvY29sLCBJUFBST1RPX0VUSEVSSVApKSB7IAorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiZXRoaXBpcDY6IGNhbid0IGRlbCBwcm90b2NvbCBJUFBST1RPX0VUSEVSSVBcbiIpOworICAgICAgICB9CisKKwlpZiAoeGZybTZfdHVubmVsX2RlcmVnaXN0ZXIoJmlwNGV0aGlwaXA2X2hhbmRsZXIsIEFGX0lORVQpKQorCQlwcmludGsoS0VSTl9JTkZPICJpcDZfdHVubmVsIGNsb3NlOiBjYW4ndCBkZXJlZ2lzdGVyIGlwNGV0aGlwaXA2XG4iKTsKKworCWlmICh4ZnJtNl90dW5uZWxfZGVyZWdpc3RlcigmaXA2ZXRoaXBpcDZfaGFuZGxlciwgQUZfSU5FVDYpKQorCQlwcmludGsoS0VSTl9JTkZPICJpcDZfdHVubmVsIGNsb3NlOiBjYW4ndCBkZXJlZ2lzdGVyIGlwNmV0aGlwaXA2XG4iKTsKKworCXVucmVnaXN0ZXJfcGVybmV0X2RldmljZSgmZXRoaXBpcDZfdG5sX25ldF9vcHMpOworfQorCittb2R1bGVfaW5pdChldGhpcGlwNl90dW5uZWxfaW5pdCk7Cittb2R1bGVfZXhpdChldGhpcGlwNl90dW5uZWxfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKaW5kZXggYWU5OGUwOS4uNWQxZWVjNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X291dHB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwpAQCAtMTUyLDggKzE1MiwxNSBAQAogCiBzdGF0aWMgaW50IGlwNl9maW5pc2hfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCiB7CisKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCWlmICgoc2tiLT5pcHNlY19vZmZsb2FkID09IDApICYmCisJCShza2ItPmxlbiA+IGlwNl9za2JfZHN0X210dShza2IpICYmICFza2JfaXNfZ3NvKHNrYikpIHx8CisJCWRzdF9hbGxmcmFnKHNrYl9kc3Qoc2tiKSkpCisjZWxzZQogCWlmICgoc2tiLT5sZW4gPiBpcDZfc2tiX2RzdF9tdHUoc2tiKSAmJiAhc2tiX2lzX2dzbyhza2IpKSB8fAotCSAgICBkc3RfYWxsZnJhZyhza2JfZHN0KHNrYikpKQorCQlkc3RfYWxsZnJhZyhza2JfZHN0KHNrYikpKQorI2VuZGlmCiAJCXJldHVybiBpcDZfZnJhZ21lbnQoc2tiLCBpcDZfZmluaXNoX291dHB1dDIpOwogCWVsc2UKIAkJcmV0dXJuIGlwNl9maW5pc2hfb3V0cHV0Mihza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3R1bm5lbC5jIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCmluZGV4IGQxOWY0OTkuLmQwY2Y1YjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNzQsNiArNzUsMTAgQEAKIAkJICAgICAoYWRkciktPnM2X2FkZHIzMlsyXSBeIChhZGRyKS0+czZfYWRkcjMyWzNdKSAmIFwKIAkJICAgIChIQVNIX1NJWkUgLSAxKSkKIAorCisjZGVmaW5lIGZvcl9lYWNoX2lwNl90dW5uZWxfcmN1KHN0YXJ0KSBcCisJZm9yICh0ID0gcmN1X2RlcmVmZXJlbmNlKHN0YXJ0KTsgdDsgdCA9IHJjdV9kZXJlZmVyZW5jZSh0LT5uZXh0KSkKKwogc3RhdGljIGludCBpcDZfdG5sX2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgaXA2X3RubF9kZXZfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKQEAgLTExOSw2ICsxMjQsNTUwIEBACiAgKiBMb2NraW5nIDogaGFzaCB0YWJsZXMgYXJlIHByb3RlY3RlZCBieSBSQ1UgYW5kIFJUTkwKICAqLwogCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm1yX2ttZW0gX19yZWFkX21vc3RseTsKK2ludCBtcl9rbWVtX2FsbG9jZWQgPSAwOworCitzdGF0aWMgaW5saW5lIHNpemVfdCAgaXA2XzRyZF9ubG1zZ19zaXplKHZvaWQpCit7CisJcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaXA2XzRyZF9tYXBfbXNnKSk7Cit9CisKK3N0YXRpYyBpbnQgaXA2XzRyZF9maWxsX25vZGUoIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcDZfdG5sXzRyZF9tYXBfcnVsZSAqbXIsCisJCQl1MzIgcGlkLCB1MzIgc2VxLGludCB0eXBlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIGludCByZXNldCwgdW5zaWduZWQgaW50IGlmaW5kZXgpCit7CisJc3RydWN0IGlwNl80cmRfbWFwX21zZyAqbXJfbXNnOworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkICwgc2VxLCB0eXBlLCBzaXplb2YoKm1yX21zZyksIGZsYWdzKTsKKwlpZiAobmxoID09IE5VTEwpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwltcl9tc2cgPSBubG1zZ19kYXRhKG5saCk7CisJaWYocmVzZXQpCisJeworCQltZW1zZXQobXJfbXNnLDAsc2l6ZW9mKCptcl9tc2cpKTsKKwkJbXJfbXNnLT5yZXNldCA9IDE7CisJCW1yX21zZy0+aWZpbmRleCA9IGlmaW5kZXg7CisJCQorCX0KKwllbHNlCisJeworCQkvLwltZW1jcHkobXJfbXNnLG1yLCBzaXplb2YoKm1yX21zZykpOworCQltZW1zZXQobXJfbXNnLDAsc2l6ZW9mKCptcl9tc2cpKTsKKwkJbXJfbXNnLT5wcmVmaXggPSBtci0+cHJlZml4OworCQltcl9tc2ctPnByZWZpeGxlbiA9IG1yLT5wcmVmaXhsZW4gOworCQlpcHY2X2FkZHJfY29weSgmbXJfbXNnLT5yZWxheV9wcmVmaXgsICZtci0+cmVsYXlfcHJlZml4KTsKKwkJaXB2Nl9hZGRyX2NvcHkoJm1yX21zZy0+cmVsYXlfc3VmZml4LCAmbXItPnJlbGF5X3N1ZmZpeCk7CisJCW1yX21zZy0+cmVsYXlfcHJlZml4bGVuID0gbXItPnJlbGF5X3ByZWZpeGxlbiA7CisJCW1yX21zZy0+cmVsYXlfc3VmZml4bGVuID0gbXItPnJlbGF5X3N1ZmZpeGxlbiA7CisJCW1yX21zZy0+cHNpZF9vZmZzZXRsZW4gPSBtci0+cHNpZF9vZmZzZXRsZW4gOworCQltcl9tc2ctPmVhYml0X2xlbiA9IG1yLT5lYWJpdF9sZW4gOworCQltcl9tc2ctPmVudHJ5X251bSA9IG1yLT5lbnRyeV9udW0gOworCQltcl9tc2ctPmlmaW5kZXggPSBpZmluZGV4OworCX0KKwlyZXR1cm4gbmxtc2dfZW5kKHNrYiwgbmxoKTsKKworfQorCisKK3N0YXRpYyBpbnQgaW5ldDZfZHVtcDRyZF9tcnVsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJdW5zaWduZWQgaW50IGgsIHNfaDsKKwlpbnQgc19pZHgsIHNfaXBfaWR4OworCWludCBpZHgsIGlwX2lkeDsKKwlzdHJ1Y3QgaXA2X3RubF80cmRfbWFwX3J1bGUgKm1yIDsKKwlpbnQgZXJyID0gMDsKKworCisJc3RydWN0IGlwNl90bmwgKnQ7CisJc3RydWN0IGlwNl90bmxfbmV0ICppcDZuID0gbmV0X2dlbmVyaWMobmV0LCBpcDZfdG5sX25ldF9pZCk7CisKKwlzX2ggPSBjYi0+YXJnc1swXTsKKwlzX2lkeCA9IGlkeCA9IGNiLT5hcmdzWzFdOworCXNfaXBfaWR4ID0gaXBfaWR4ID0gY2ItPmFyZ3NbMl07CisKKwlmb3IgKGggPSBzX2g7IGggPCBIQVNIX1NJWkUgOyBoKyssIHNfaWR4ID0gMCkgeworCQlpZHggPSAwOworCQlmb3JfZWFjaF9pcDZfdHVubmVsX3JjdShpcDZuLT50bmxzX3JfbFtoXSkKKwkJeworCQkJaWYgKGlkeCA8IHNfaWR4KQorCQkJCWdvdG8gY29udF90dW5uZWw7CisJCQlpZiAoaWR4ID4gc19pZHgpCisJCQkJc19pcF9pZHggPSAwOworCQkJaXBfaWR4ID0gMDsKKwkJCXJlYWRfbG9jaygmdC0+aXA0cmQubWFwX2xvY2spOworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSAobXIsICZ0LT5pcDRyZC5tYXBfbGlzdCwgbXJfbGlzdCl7CisJCQkJaWYgKGlwX2lkeCA8IHNfaXBfaWR4KQorCQkJCQlnb3RvIGNvbnRfbXI7CisJCQkJZXJyID0gaXA2XzRyZF9maWxsX25vZGUoc2tiLCBtcixORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKKwkJCQkJCWNiLT5ubGgtPm5sbXNnX3NlcSxSVE1fTkVXNFJELCBOTE1fRl9NVUxUSSAsIDAsIHQtPmRldi0+aWZpbmRleCk7CisJCQkJaWYgKGVyciA8IDApIHsKKwkJCQkJV0FSTl9PTihlcnIgPT0gLUVNU0dTSVpFKTsKKwkJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJCXJlYWRfdW5sb2NrKCZ0LT5pcDRyZC5tYXBfbG9jayk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KK2NvbnRfbXI6CisJCQkJaXBfaWR4Kys7CisJCQl9CisJCQlyZWFkX3VubG9jaygmdC0+aXA0cmQubWFwX2xvY2spOworY29udF90dW5uZWw6CisJCQlpZHgrKzsJCisJCX0KKwl9CitvdXQ6CisJY2ItPmFyZ3NbMF0gPSBoOworCWNiLT5hcmdzWzFdID0gaWR4OworCWNiLT5hcmdzWzJdID0gaXBfaWR4OworCQorCXJldHVybiBza2ItPmxlbjsKK30KKworCit2b2lkIGlwNl80cmRfbm90aWZ5KGludCBldmVudCwgc3RydWN0IGlwNl90bmxfNHJkX21hcF9ydWxlICptciAsc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJlc2V0KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOworCWludCBlcnI7CisKKwllcnIgPSAtRU5PQlVGUzsKKworCXNrYiA9IG5sbXNnX25ldyhpcDZfNHJkX25sbXNnX3NpemUoKSwgZ2ZwX2FueSgpKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gZXJyb3V0OworCisJZXJyID0gaXA2XzRyZF9maWxsX25vZGUoc2tiLCBtciwwLDAsZXZlbnQsICAwLCByZXNldCwgZGV2LT5pZmluZGV4KTsKKwlpZiAoZXJyIDwgMCkgeworCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gcnQ2X25sbXNnX3NpemUoKSAqLworCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJZ290byBlcnJvdXQ7CisJfQorCXJ0bmxfbm90aWZ5KHNrYiwgbmV0LCAwLCBSVE5MR1JQX0lQVjZfSUZBRERSLAorCQkgICAgTlVMTCwgZ2ZwX2FueSgpKTsKKwlyZXR1cm47CitlcnJvdXQ6CisJaWYgKGVyciA8IDApCisJCXJ0bmxfc2V0X3NrX2VycihuZXQsIFJUTkxHUlBfSVBWNl9JRkFERFIsIGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraXA2X3RubF80cmRfbXJfZGVzdHJveShjaGFyICpmLCBzdHJ1Y3QgaXA2X3RubF80cmRfbWFwX3J1bGUgKm1yKQoreworCWxpc3RfZGVsKCZtci0+bXJfbGlzdCk7CisJa21lbV9jYWNoZV9mcmVlKG1yX2ttZW0sIG1yKTsKKwktLW1yX2ttZW1fYWxsb2NlZDsKK30KKworc3RhdGljIGludAoraXA2X3RubF80cmRfbXJfY3JlYXRlKHN0cnVjdCBpcDZfdG5sXzRyZCAqaXA0cmQsIHN0cnVjdCBpcDZfdG5sXzRyZF9wYXJtICpwYXJtLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcDZfdG5sXzRyZF9tYXBfcnVsZSAqbXIgOworCWludCBlcnIgPSAwOworCisgICAgICAgd3JpdGVfbG9ja19iaCgmcGFybS0+bWFwX2xvY2spOworICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkgKG1yLCAmcGFybS0+bWFwX2xpc3QsIG1yX2xpc3QpeworICAgICAgICAgICAgICAgaWYoIG1yLT5lbnRyeV9udW0gPT0gaXA0cmQtPmVudHJ5X251bSApeworICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiaXA2X3RubF80cmRfbXJfY3JlYXRlOiBtYXAgcnVsZSBmb3VuZCB1cGRhdGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbXItPnByZWZpeCA9IGlwNHJkLT5wcmVmaXggOworICAgICAgICAgICAgICAgICAgICAgICBpcHY2X2FkZHJfY29weSgmbXItPnJlbGF5X3ByZWZpeCwgJmlwNHJkLT5yZWxheV9wcmVmaXgpOworICAgICAgICAgICAgICAgICAgICAgICBpcHY2X2FkZHJfY29weSgmbXItPnJlbGF5X3N1ZmZpeCwgJmlwNHJkLT5yZWxheV9zdWZmaXgpOworICAgICAgICAgICAgICAgICAgICAgICBtci0+cHJlZml4bGVuID0gaXA0cmQtPnByZWZpeGxlbiA7CisgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZWxheV9wcmVmaXhsZW4gPSBpcDRyZC0+cmVsYXlfcHJlZml4bGVuIDsKKyAgICAgICAgICAgICAgICAgICAgICAgbXItPnJlbGF5X3N1ZmZpeGxlbiA9IGlwNHJkLT5yZWxheV9zdWZmaXhsZW4gOworICAgICAgICAgICAgICAgICAgICAgICBtci0+cHNpZF9vZmZzZXRsZW4gPSBpcDRyZC0+cHNpZF9vZmZzZXRsZW4gOworICAgICAgICAgICAgICAgICAgICAgICBtci0+ZWFiaXRfbGVuID0gaXA0cmQtPmVhYml0X2xlbiA7CisgICAgICAgICAgICAgICAgICAgICAgIG1yLT5lbnRyeV9udW0gPSBpcDRyZC0+ZW50cnlfbnVtIDsKKyAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgbXIgPSBrbWVtX2NhY2hlX2FsbG9jKG1yX2ttZW0sIEdGUF9LRVJORUwpOworCisgICAgICAgaWYgKCFtcikgeworICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiaXA2X3RubF80cmRfbXJfY3JlYXRlOiBrbWVtX2NhY2hlX2FsbG9jIGZhaWwiKTsKKyAgICAgICAgICAgICAgIGVyciA9IC0xIDsKKyAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgIH0KKworICAgICAgIG1yLT5wcmVmaXggPSBpcDRyZC0+cHJlZml4IDsKKyAgICAgICBpcHY2X2FkZHJfY29weSgmbXItPnJlbGF5X3ByZWZpeCwgJmlwNHJkLT5yZWxheV9wcmVmaXgpOworICAgICAgIGlwdjZfYWRkcl9jb3B5KCZtci0+cmVsYXlfc3VmZml4LCAmaXA0cmQtPnJlbGF5X3N1ZmZpeCk7CisgICAgICAgbXItPnByZWZpeGxlbiA9IGlwNHJkLT5wcmVmaXhsZW4gOworICAgICAgIG1yLT5yZWxheV9wcmVmaXhsZW4gPSBpcDRyZC0+cmVsYXlfcHJlZml4bGVuIDsKKyAgICAgICBtci0+cmVsYXlfc3VmZml4bGVuID0gaXA0cmQtPnJlbGF5X3N1ZmZpeGxlbiA7CisgICAgICAgbXItPnBzaWRfb2Zmc2V0bGVuID0gaXA0cmQtPnBzaWRfb2Zmc2V0bGVuIDsKKyAgICAgICBtci0+ZWFiaXRfbGVuID0gaXA0cmQtPmVhYml0X2xlbiA7CisgICAgICAgbXItPmVudHJ5X251bSA9IGlwNHJkLT5lbnRyeV9udW0gOworCisgICAgICAgKyttcl9rbWVtX2FsbG9jZWQ7CisgICAgICAgbGlzdF9hZGRfdGFpbCgmbXItPm1yX2xpc3QsICZwYXJtLT5tYXBfbGlzdCk7CisKK291dDoKKwlpcDZfNHJkX25vdGlmeShSVE1fTkVXNFJELG1yLCBkZXYsMCk7IC8qIG1vZGlmaWVkIGJ5IE1TUEQgKi8KKwl3cml0ZV91bmxvY2tfYmgoJnBhcm0tPm1hcF9sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAoraXA2X3RubF80cmRfbXJfZGVsZXRlX2FsbChzdHJ1Y3QgaXA2X3RubF80cmRfcGFybSAqcGFybSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXA2X3RubF80cmRfbWFwX3J1bGUgKm1yLCAqbXJfcnVsZTsKKworCXdyaXRlX2xvY2tfYmgoJnBhcm0tPm1hcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgKG1yLCBtcl9ydWxlLCAmcGFybS0+bWFwX2xpc3QsIG1yX2xpc3QpeworCQlpcDZfdG5sXzRyZF9tcl9kZXN0cm95KCJhbGwiLCBtcik7CisJfQorCWlwNl80cmRfbm90aWZ5KFJUTV9ERUw0UkQsbXIsIGRldiAsMSk7CisJd3JpdGVfdW5sb2NrX2JoKCZwYXJtLT5tYXBfbG9jayk7CisKK30KKworc3RhdGljIGludAoraXA2X3RubF80cmRfbXJfZGVsZXRlKF9fdTE2IGVudHJ5X251bSAsIHN0cnVjdCBpcDZfdG5sXzRyZF9wYXJtICpwYXJtLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcDZfdG5sXzRyZF9tYXBfcnVsZSAqbXIsICptcl9ydWxlOworCWludCBlcnIgPSAtMSA7CisKKwl3cml0ZV9sb2NrX2JoKCZwYXJtLT5tYXBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIChtciwgbXJfcnVsZSwgJnBhcm0tPm1hcF9saXN0LCBtcl9saXN0KXsKKwkJaWYoIG1yLT5lbnRyeV9udW0gPT0gZW50cnlfbnVtICl7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiaXA2X3RubF80cmRfbXJfZGVsZXRlOiBtYXAgcnVsZSBmb3VuZCBkZWxldGUiKTsKKwkJCWlwNl90bmxfNHJkX21yX2Rlc3Ryb3koIm9uZSIsIG1yKTsKKwkJCWVyciA9IDAgOworCQkJYnJlYWs7CisJCX0KKwl9CisJaXA2XzRyZF9ub3RpZnkoUlRNX0RFTDRSRCxtcixkZXYsMCk7CisJd3JpdGVfdW5sb2NrX2JoKCZwYXJtLT5tYXBfbG9jayk7CisJcmV0dXJuIGVyciA7Cit9CisKK3N0YXRpYyB2b2lkCitpcDZfdG5sXzRyZF9tcl9zaG93KHN0cnVjdCBpcDZfdG5sXzRyZF9wYXJtICpwYXJtKQoreworCXN0cnVjdCBpcDZfdG5sXzRyZF9tYXBfcnVsZSAqbXI7CisKKyAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiLS0gNHJkIG1hcHBpbmcgcnVsZSBsaXN0XG4iKTsKKyAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiLS0gZW50cnkgbnVtID0gJWQgXG4iLG1yX2ttZW1fYWxsb2NlZCk7CisKKwlyZWFkX2xvY2soJnBhcm0tPm1hcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1yLCAmcGFybS0+bWFwX2xpc3QsIG1yX2xpc3QpeworCQlwcmludGsoS0VSTl9ERUJVRyAiJTAzZCA6ICUwM2QuJTAzZC4lMDNkLiUwM2QvJTAyZCAlMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeDolMDJ4JTAyeC8lMDNkICUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4OiUwMnglMDJ4LyUwM2QgZWFiaXQ6JTAzZCBvZmZzZXQ6JTAzZCBcbiIsCisJCQltci0+ZW50cnlfbnVtLAorCQkJKG50b2hsKG1yLT5wcmVmaXgpID4+IDI0KSAmIDB4ZmYsCisJCQkobnRvaGwobXItPnByZWZpeCkgPj4gMTYpICYgMHhmZiwKKwkJCShudG9obChtci0+cHJlZml4KSA+PiAgOCkgJiAweGZmLAorCQkJbnRvaGwobXItPnByZWZpeCkgJiAweGZmLAorCQkJbXItPnByZWZpeGxlbiwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkclswXSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkclsxXSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkclsyXSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkclszXSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkcls0XSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkcls1XSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkcls2XSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkcls3XSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkcls4XSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkcls5XSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkclsxMF0sCisJCQltci0+cmVsYXlfcHJlZml4LnM2X2FkZHJbMTFdLAorCQkJbXItPnJlbGF5X3ByZWZpeC5zNl9hZGRyWzEyXSwKKwkJCW1yLT5yZWxheV9wcmVmaXguczZfYWRkclsxM10sCisJCQltci0+cmVsYXlfcHJlZml4LnM2X2FkZHJbMTRdLAorCQkJbXItPnJlbGF5X3ByZWZpeC5zNl9hZGRyWzE1XSwKKwkJCW1yLT5yZWxheV9wcmVmaXhsZW4sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbMF0sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbMV0sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbMl0sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbM10sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbNF0sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbNV0sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbNl0sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbN10sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbOF0sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbOV0sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbMTBdLAorCQkJbXItPnJlbGF5X3N1ZmZpeC5zNl9hZGRyWzExXSwKKwkJCW1yLT5yZWxheV9zdWZmaXguczZfYWRkclsxMl0sCisJCQltci0+cmVsYXlfc3VmZml4LnM2X2FkZHJbMTNdLAorCQkJbXItPnJlbGF5X3N1ZmZpeC5zNl9hZGRyWzE0XSwKKwkJCW1yLT5yZWxheV9zdWZmaXguczZfYWRkclsxNV0sCisJCQltci0+cmVsYXlfc3VmZml4bGVuLAorCQkJbXItPmVhYml0X2xlbiwKKwkJCW1yLT5wc2lkX29mZnNldGxlbiApOworCX0KKwlyZWFkX3VubG9jaygmcGFybS0+bWFwX2xvY2spOworfQorCitzdGF0aWMgaW50CitpcDZfdG5sXzRyZF9tb2RpZnlfZGFkZHIoc3RydWN0IGluNl9hZGRyICpkYWRkcjYsIF9fYmUzMiBkYWRkcjQsIF9fYmUxNiBkcG9ydDQsCisJCXN0cnVjdCBpcDZfdG5sXzRyZF9tYXBfcnVsZSAqbXIpCit7CisgICAgICAgaW50IGksIHBidzAsIHBiaTAsIHBiaTE7CisgICAgICAgX191MzIgZGFkZHJbNF07CisgICAgICAgX191MzIgcG9ydF9zZXRfaWQgPSAwOworICAgICAgIF9fdTMyIG1hc2s7CisgICAgICAgX191MzIgZGEgPSBudG9obChkYWRkcjQpOworICAgICAgIF9fdTE2IGRwID0gbnRvaHMoZHBvcnQ0KTsKKyAgICAgICBfX3UzMiBkaWFkZHJbNF07CisgICAgICAgaW50IHBvcnRfc2V0X2lkX2xlbiA9ICggbXItPmVhYml0X2xlbiApIC0gKCAzMiAtIG1yLT5wcmVmaXhsZW4gKSA7CisKKyAgICAgICBpZiAoIHBvcnRfc2V0X2lkX2xlbiA8IDApIHsKKyAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJpcDZfdG5sXzRyZF9tb2RpZnlfZGFkZHI6IFBTSUQgbGVuZ3RoIEVSUk9SICVkXG4iLCBwb3J0X3NldF9pZF9sZW4pOworICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgIH0KKworICAgICAgIGlmICggcG9ydF9zZXRfaWRfbGVuID4gMCkgeworICAgICAgICAgICAgICAgbWFzayA9IDB4ZmZmZmZmZmYgPj4gKDMyIC0gcG9ydF9zZXRfaWRfbGVuKTsKKyAgICAgICAgICAgICAgIHBvcnRfc2V0X2lkID0gKCBkcCA+PiAoMTYgLSBtci0+cHNpZF9vZmZzZXRsZW4gLSBwb3J0X3NldF9pZF9sZW4gKSAmIG1hc2sgKSA7CisgICAgICAgfQorCisgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkKKyAgICAgICAgICAgICAgIGRhZGRyW2ldID0gbnRvaGwobXItPnJlbGF5X3ByZWZpeC5zNl9hZGRyMzJbaV0pCisgICAgICAgICAgICAgICAgICAgICAgIHwgbnRvaGwobXItPnJlbGF5X3N1ZmZpeC5zNl9hZGRyMzJbaV0pOworCisgICAgICAgaWYoIG1yLT5wcmVmaXhsZW4gPCAzMiApIHsKKyAgICAgICAgICAgICAgIHBidzAgPSBtci0+cmVsYXlfcHJlZml4bGVuID4+IDU7CisgICAgICAgICAgICAgICBwYmkwID0gbXItPnJlbGF5X3ByZWZpeGxlbiAmIDB4MWY7CisgICAgICAgICAgICAgICBkYWRkcltwYncwXSB8PSAoZGEgPDwgbXItPnByZWZpeGxlbikgPj4gcGJpMDsKKyAgICAgICAgICAgICAgIHBiaTEgPSBwYmkwIC0gbXItPnByZWZpeGxlbjsKKyAgICAgICAgICAgICAgIGlmIChwYmkxID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgZGFkZHJbcGJ3MCsxXSB8PSBkYSA8PCAoMzIgLSBwYmkxKTsKKwl9CisgICAgICAgaWYgKCBwb3J0X3NldF9pZF9sZW4gPiAwKSB7CisJICAgICAgIHBidzAgPSAobXItPnJlbGF5X3ByZWZpeGxlbiArIDMyIC0gbXItPnByZWZpeGxlbikgPj4gNTsKKwkgICAgICAgcGJpMCA9IChtci0+cmVsYXlfcHJlZml4bGVuICsgMzIgLSBtci0+cHJlZml4bGVuKSAmIDB4MWY7CisJICAgICAgIGRhZGRyW3BidzBdIHw9IChwb3J0X3NldF9pZCA8PCAoMzIgLSBwb3J0X3NldF9pZF9sZW4pKSA+PiBwYmkwOworCSAgICAgICBwYmkxID0gcGJpMCAtICgzMiAtIHBvcnRfc2V0X2lkX2xlbik7CisJICAgICAgIGlmIChwYmkxID4gMCkKKwkJICAgICAgIGRhZGRyW3BidzArMV0gfD0gcG9ydF9zZXRfaWQgPDwgKDMyIC0gcGJpMSk7CisgICAgICAgfQorCisgICAgICAgbWVtc2V0KGRpYWRkciwgMCwgc2l6ZW9mKGRpYWRkcikpOworCisgICAgICAgZGlhZGRyWzJdID0gKCBkYSA+PiA4ICkgOworICAgICAgIGRpYWRkclszXSA9ICggZGEgPDwgMjQgKSA7CisgICAgICAgZGlhZGRyWzNdIHw9ICggcG9ydF9zZXRfaWQgPDwgOCApIDsKKworICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICBkYWRkcltpXSA9IGRhZGRyW2ldIHwgZGlhZGRyW2ldIDsKKworICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICBkYWRkcjYtPnM2X2FkZHIzMltpXSA9IGh0b25sKGRhZGRyW2ldKTsKKworICAgICAgIC8qIERCRyAqLworICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJpcDZfdG5sXzRyZF9tb2RpZnlfZGFkZHI6ICUwOHggJTA4eCAlMDh4ICUwOHggIFBTSUQ6JTA0eFxuIiwKKyAgICAgICAgICAgICAgIGRhZGRyWzBdLCBkYWRkclsxXSwgZGFkZHJbMl0sIGRhZGRyWzNdLCBwb3J0X3NldF9pZCk7CisKKyAgICAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBpcDZfdG5sXzRyZF9yY3ZfaGVscGVyIC0gCisgKiAgIEBza2I6IHJlY2VpdmVkIHNvY2tldCBidWZmZXIKKyAqICAgQHQ6IHR1bm5lbCBkZXZpY2UKKyAqKi8KKworc3RhdGljIGludAoraXA2X3RubF80cmRfcmN2X2hlbHBlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXA2X3RubCAqdCkKK3sKKyAgICAgICBpbnQgZXJyID0gMDsKKyAgICAgICBzdHJ1Y3QgaXBoZHIgKmlwaDsKKworICAgICAgIGlwaCA9IGlwX2hkcihza2IpOworCisgICAgICAgc3dpdGNoIChpcGgtPnByb3RvY29sKSB7CisgICAgICAgY2FzZSBJUFBST1RPX1RDUDoKKyAgICAgICBjYXNlIElQUFJPVE9fVURQOgorICAgICAgIGNhc2UgSVBQUk9UT19JQ01QOgorICAgICAgIGNhc2UgSVBQUk9UT19HUkU6CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKyAgICAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitpcDZfdG5sXzRyZF94bWl0X2hlbHBlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZmxvd2k2ICpmbDYsCisJCXN0cnVjdCBpcDZfdG5sICp0KQoreworICAgICAgIGludCBlcnIgPSAwOworICAgICAgIHN0cnVjdCBpcGhkciAqaXBoLCAqaWNtcGlwaDsKKyAgICAgICBfX2JlMTYgICppZHA7CisgICAgICAgc3RydWN0IHRjcGhkciAqdGNwaCwgKmljbXB0Y3BoOworICAgICAgIHN0cnVjdCB1ZHBoZHIgKnVkcGgsICppY21wdWRwaDsKKyAgICAgICBzdHJ1Y3QgaWNtcGhkciAqaWNtcGg7CisgICAgICAgc3RydWN0IGdyZV9oZHIgKmdyZWg7CisgICAgICAgX191MzIgbWFzazsKKyAgICAgICBfX2JlMTYgKnNwb3J0cCA9IE5VTEw7CisgICAgICAgX19iZTMyIGRhZGRyOworICAgICAgIF9fYmUxNiBkcG9ydDsKKyAgICAgICB1OCAqcHRyOworICAgICAgIGludCBub19kc3RfY2hnID0gMDsKKyAgICAgICBzdHJ1Y3QgaXA2X3RubF80cmRfbWFwX3J1bGUgKm1yLCptcl90bXA7CisgICAgICAgaW50IG1yX3ByZWZpeGxlbiA7CisgICAgICAgaW50IGNvdW50IDsKKworICAgICAgIGlwaCA9IGlwX2hkcihza2IpOworCisgICAgICAgZGFkZHIgPSBpcGgtPmRhZGRyOworICAgICAgIGlkcCA9ICZpcGgtPmlkOworCisgICAgICAgcHRyID0gKHU4ICopaXBoOworICAgICAgIHB0ciArPSBpcGgtPmlobCAqIDQ7CisgICAgICAgc3dpdGNoIChpcGgtPnByb3RvY29sKSB7CisgICAgICAgY2FzZSBJUFBST1RPX1RDUDoKKyAgICAgICAgICAgICAgIHRjcGggPSAoc3RydWN0IHRjcGhkciAqKXB0cjsKKyAgICAgICAgICAgICAgIHNwb3J0cCA9ICZ0Y3BoLT5zb3VyY2U7CisgICAgICAgICAgICAgICBkcG9ydCA9IHRjcGgtPmRlc3Q7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIElQUFJPVE9fVURQOgorICAgICAgICAgICAgICAgdWRwaCA9IChzdHJ1Y3QgdWRwaGRyICopcHRyOworICAgICAgICAgICAgICAgc3BvcnRwID0gJnVkcGgtPnNvdXJjZTsKKyAgICAgICAgICAgICAgIGRwb3J0ID0gdWRwaC0+ZGVzdDsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgIGNhc2UgSVBQUk9UT19JQ01QOgorICAgICAgICAgICAgICAgaWNtcGggPSAoc3RydWN0IGljbXBoZHIgKilwdHI7CisgICAgICAgICAgICAgICBzd2l0Y2ggKGljbXBoLT50eXBlKSB7CisgICAgICAgICAgICAgICBjYXNlIElDTVBfREVTVF9VTlJFQUNIOgorICAgICAgICAgICAgICAgY2FzZSBJQ01QX1NPVVJDRV9RVUVOQ0g6CisgICAgICAgICAgICAgICBjYXNlIElDTVBfUkVESVJFQ1Q6CisgICAgICAgICAgICAgICBjYXNlIElDTVBfVElNRV9FWENFRURFRDoKKyAgICAgICAgICAgICAgIGNhc2UgSUNNUF9QQVJBTUVURVJQUk9COgorICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAodTggKilpY21waDsKKyAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHNpemVvZihzdHJ1Y3QgaWNtcGhkcik7CisgICAgICAgICAgICAgICAgICAgICAgIGljbXBpcGggPSAoc3RydWN0IGlwaGRyKilwdHI7CisgICAgICAgICAgICAgICAgICAgICAgIGlmIChudG9ocyhpcGgtPnRvdF9sZW4pIDwgaWNtcGlwaC0+aWhsICogNCArIDEyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgZGFkZHIgPSBpY21waXBoLT5zYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IGljbXBpcGgtPmlobCAqIDQ7CisgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaWNtcGlwaC0+cHJvdG9jb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJUFBST1RPX1RDUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY21wdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb3J0cCA9ICZpY21wdGNwaC0+ZGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcG9ydCA9IGljbXB0Y3BoLT5zb3VyY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSVBQUk9UT19VRFA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNtcHVkcGggPSAoc3RydWN0IHVkcGhkciAqKXB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG9ydHAgPSAmaWNtcHVkcGgtPmRlc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHBvcnQgPSBpY21wdWRwaC0+c291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgbm9fZHN0X2NoZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgY2FzZSBJUFBST1RPX0dSRToKKyAgICAgICAgICAgICAgIGdyZWggPSAoc3RydWN0IGdyZV9oZHIgKilwdHI7CisgICAgICAgICAgICAgICBpZihncmVoLT5wcm90b2NvbCAhPSBHUkVfUFJPVE9DT0xfUFBUUCl7CisgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIG5vX2RzdF9jaGcgPSAxOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIGVyciA9IC0xOworICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgfQorCisgICAgICAgaWYgKCBub19kc3RfY2hnID09IDAgKXsKKworICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgICAgbXJfcHJlZml4bGVuID0gMDsKKworICAgICAgICAgICAgICAgcmVhZF9sb2NrKCZ0LT5pcDRyZC5tYXBfbG9jayk7CisgICAgICAgICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5IChtciwgJnQtPmlwNHJkLm1hcF9saXN0LCBtcl9saXN0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IDB4ZmZmZmZmZmYgPDwgKDMyIC0gbXItPnByZWZpeGxlbikgOworICAgICAgICAgICAgICAgICAgICAgICBpZiggKGh0b25sKGRhZGRyKSAmIG1hc2sgKSA9PSBodG9ubCggbXItPnByZWZpeCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtci0+cHJlZml4bGVuID49IG1yX3ByZWZpeGxlbiApeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJfcHJlZml4bGVuID0gbXItPnByZWZpeGxlbiA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcl90bXAgPSBtcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIGlmIChjb3VudCl7CisgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGlwNl90bmxfNHJkX21vZGlmeV9kYWRkcigmZmw2LT5kYWRkciwgZGFkZHIsIGRwb3J0LCBtcl90bXAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycil7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3VubG9jaygmdC0+aXA0cmQubWFwX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHJlYWRfdW5sb2NrKCZ0LT5pcDRyZC5tYXBfbG9jayk7CisKKyAgICAgICAgICAgICAgIGlmKHNwb3J0cCAmJiBpZHApeworICAgICAgICAgICAgICAgICAgICAgICAqaWRwPSpzcG9ydHA7CisgICAgICAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgaXBoLT5jaGVjayA9IDA7CisgICAgICAgaXBoLT5jaGVjayA9IGlwX2Zhc3RfY3N1bSgodW5zaWduZWQgY2hhciAqKWlwaCwgaXBoLT5paGwpOworCisgICAgICAgLyogWFhYOiAqLworICAgICAgIHNrYi0+bG9jYWxfZGYgPSAxOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBpcDZfdG5sXzRyZF91cGRhdGVfcGFybXMgLSB1cGRhdGUgNHJkIHBhcmFtZXRlcnMKKyAqICAgQHQ6IHR1bm5lbCB0byBiZSB1cGRhdGVkCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIGlwNl90bmxfNHJkX3VwZGF0ZV9wYXJtcygpIHVwZGF0ZXMgNHJkIHBhcmFtZXRlcnMKKyAqKi8KK3N0YXRpYyB2b2lkCitpcDZfdG5sXzRyZF91cGRhdGVfcGFybXMoc3RydWN0IGlwNl90bmwgKnQpCit7CisJaW50IHBidzAsIHBiaTAsIHBiaTE7CisJX191MzIgZDsKKworCXQtPmlwNHJkLnBvcnRfc2V0X2lkX2xlbiA9IHQtPmlwNHJkLnJlbGF5X3N1ZmZpeGxlbgorCQkJCS0gdC0+aXA0cmQucmVsYXlfcHJlZml4bGVuCisJCQkJLSAoMzIgLSB0LT5pcDRyZC5wcmVmaXhsZW4pOworCXBidzAgPSAodC0+aXA0cmQucmVsYXlfc3VmZml4bGVuIC0gdC0+aXA0cmQucG9ydF9zZXRfaWRfbGVuKSA+PiA1OworCXBiaTAgPSAodC0+aXA0cmQucmVsYXlfc3VmZml4bGVuIC0gdC0+aXA0cmQucG9ydF9zZXRfaWRfbGVuKSAmIDB4MWY7CisJZCA9IChudG9obCh0LT5wYXJtcy5sYWRkci5zNl9hZGRyMzJbcGJ3MF0pIDw8IHBiaTApCisJCT4+ICgzMiAtIHQtPmlwNHJkLnBvcnRfc2V0X2lkX2xlbik7CisJcGJpMSA9IHBiaTAgLSAoMzIgLSB0LT5pcDRyZC5wb3J0X3NldF9pZF9sZW4pOworCisJaWYgKHBiaTEgPiAwKQorCQlkIHw9IG50b2hsKHQtPnBhcm1zLmxhZGRyLnM2X2FkZHIzMltwYncwKzFdKSA+PiAoMzIgLSBwYmkxKTsKKwl0LT5pcDRyZC5wb3J0X3NldF9pZCA9IGQ7CisKKwkvKiBsb2NhbCB2NCBhZGRyZXNzICovCisJdC0+aXA0cmQubGFkZHI0ID0gdC0+aXA0cmQucHJlZml4OworCXBidzAgPSB0LT5pcDRyZC5yZWxheV9wcmVmaXhsZW4gPj4gNTsKKwlwYmkwID0gdC0+aXA0cmQucmVsYXlfcHJlZml4bGVuICYgMHgxZjsKKwlkID0gKG50b2hsKHQtPnBhcm1zLmxhZGRyLnM2X2FkZHIzMltwYncwXSkgPDwgcGJpMCkKKwkJPj4gdC0+aXA0cmQucHJlZml4bGVuOworCXBiaTEgPSBwYmkwIC0gdC0+aXA0cmQucHJlZml4bGVuOworCWlmIChwYmkxID4gMCkKKwkJZCB8PSBudG9obCh0LT5wYXJtcy5sYWRkci5zNl9hZGRyMzJbcGJ3MCsxXSkgPj4gKDMyIC0gcGJpMSk7CisJdC0+aXA0cmQubGFkZHI0IHw9IGh0b25sKGQpOworCWlmICh0LT5pcDRyZC5wb3J0X3NldF9pZF9sZW4gPCAwKSB7CisJCWQgPSBudG9obCh0LT5pcDRyZC5sYWRkcjQpOworCQlkICY9IDB4ZmZmZmZmZmYgPDwgLXQtPmlwNHJkLnBvcnRfc2V0X2lkX2xlbjsKKwkJdC0+aXA0cmQubGFkZHI0ID0gaHRvbmwoZCk7CisJfQorCit9CisKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfdG5sX2RzdF9jaGVjayhzdHJ1Y3QgaXA2X3RubCAqdCkKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSB0LT5kc3RfY2FjaGU7CkBAIC0xNTgsMjIgKzcwNywyNiBAQAogICogICBlbHNlICVOVUxMCiAgKiovCiAKLSNkZWZpbmUgZm9yX2VhY2hfaXA2X3R1bm5lbF9yY3Uoc3RhcnQpIFwKLQlmb3IgKHQgPSByY3VfZGVyZWZlcmVuY2Uoc3RhcnQpOyB0OyB0ID0gcmN1X2RlcmVmZXJlbmNlKHQtPm5leHQpKQogCiBzdGF0aWMgc3RydWN0IGlwNl90bmwgKgogaXA2X3RubF9sb29rdXAoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnJlbW90ZSwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpsb2NhbCkKIHsKLQl1bnNpZ25lZCBpbnQgaDAgPSBIQVNIKHJlbW90ZSk7Ci0JdW5zaWduZWQgaW50IGgxID0gSEFTSChsb2NhbCk7CisvLwl1bnNpZ25lZCBpbnQgaDAgPSBIQVNIKHJlbW90ZSk7IC8qIDRyZCBzdXBwb3J0LCByZW1vdGUgY291bGQgYmUgYW55LCBzbyBoYXNoaW5nIHRvIGJlIGRvbmUgb25seSBiYXNlZCBvbiBsb2NhbCBhZGRyZXNzICovCisJdW5zaWduZWQgaW50IGgxID0gSEFTSChsb2NhbCk7IAogCXN0cnVjdCBpcDZfdG5sICp0OwogCXN0cnVjdCBpcDZfdG5sX25ldCAqaXA2biA9IG5ldF9nZW5lcmljKG5ldCwgaXA2X3RubF9uZXRfaWQpOwogCi0JZm9yX2VhY2hfaXA2X3R1bm5lbF9yY3UoaXA2bi0+dG5sc19yX2xbaDAgXiBoMV0pIHsKKwlmb3JfZWFjaF9pcDZfdHVubmVsX3JjdShpcDZuLT50bmxzX3JfbFtoMV0pIHsKIAkJaWYgKGlwdjZfYWRkcl9lcXVhbChsb2NhbCwgJnQtPnBhcm1zLmxhZGRyKSAmJgogCQkgICAgaXB2Nl9hZGRyX2VxdWFsKHJlbW90ZSwgJnQtPnBhcm1zLnJhZGRyKSAmJgogCQkgICAgKHQtPmRldi0+ZmxhZ3MgJiBJRkZfVVApKQogCQkJcmV0dXJuIHQ7CisgICAgICAgICAgICAgICAgaWYgKHQtPmlwNHJkLnByZWZpeCAmJgorICAgICAgICAgICAgICAgICAgIGlwdjZfYWRkcl9lcXVhbChsb2NhbCwgJnQtPnBhcm1zLmxhZGRyKSAmJgorICAgICAgICAgICAgICAgIC8qIGlwdjZfcHJlZml4X2VxdWFsKHJlbW90ZSwgJnQtPmlwNHJkLnJlbGF5X3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgdC0+aXA0cmQucmVsYXlfcHJlZml4bGVuKSAmJiA0UkQgRCAgKi8KKyAgICAgICAgICAgICAgICAgICAodC0+ZGV2LT5mbGFncyAmIElGRl9VUCkpCisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0OwogCX0KIAl0ID0gcmN1X2RlcmVmZXJlbmNlKGlwNm4tPnRubHNfd2NbMF0pOwogCWlmICh0ICYmICh0LT5kZXYtPmZsYWdzICYgSUZGX1VQKSkKQEAgLTE5NiwxNCArNzQ5LDE0IEBACiBzdGF0aWMgc3RydWN0IGlwNl90bmwgX19yY3UgKioKIGlwNl90bmxfYnVja2V0KHN0cnVjdCBpcDZfdG5sX25ldCAqaXA2biwgY29uc3Qgc3RydWN0IGlwNl90bmxfcGFybSAqcCkKIHsKLQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnJlbW90ZSA9ICZwLT5yYWRkcjsKKy8vCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqcmVtb3RlID0gJnAtPnJhZGRyOwogCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbG9jYWwgPSAmcC0+bGFkZHI7CiAJdW5zaWduZWQgaCA9IDA7CiAJaW50IHByaW8gPSAwOwogCi0JaWYgKCFpcHY2X2FkZHJfYW55KHJlbW90ZSkgfHwgIWlwdjZfYWRkcl9hbnkobG9jYWwpKSB7CisJaWYgKCFpcHY2X2FkZHJfYW55KGxvY2FsKSkgeyAgICAgIC8qIDRyZCBzdXBwb3J0LCBzaW5jZSByZW1vdGUgYWRkcmVzcyBjb3VsZCBiZSBhbnkgYWRkcmVzcywgcmVmcmFpbiBmcm9tIGNoZWNraW5nIGJhc2VkIG9uIHJlbW90ZSAqLyAKIAkJcHJpbyA9IDE7Ci0JCWggPSBIQVNIKHJlbW90ZSkgXiBIQVNIKGxvY2FsKTsKKwkJaCA9IEhBU0gobG9jYWwpOwkKIAl9CiAJcmV0dXJuICZpcDZuLT50bmxzW3ByaW9dW2hdOwogfQpAQCAtMjkxLDYgKzg0NCw5IEBACiAKIAlzdHJjcHkodC0+cGFybXMubmFtZSwgZGV2LT5uYW1lKTsKIAorCXJ3bG9ja19pbml0KCZ0LT5pcDRyZC5tYXBfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnQtPmlwNHJkLm1hcF9saXN0KTsgCisKIAlkZXZfaG9sZChkZXYpOwogCWlwNl90bmxfbGluayhpcDZuLCB0KTsKIAlyZXR1cm4gdDsKQEAgLTc2Niw2ICsxMzIyLDEwIEBACiAJCV9fc2tiX3R1bm5lbF9yeChza2IsIHQtPmRldik7CiAKIAkJZHNjcF9lY25fZGVjYXBzdWxhdGUodCwgaXB2NmgsIHNrYik7CisgICAgICAgICAgICAgICAgaWYgKGlwNl90bmxfNHJkX3Jjdl9oZWxwZXIoc2tiLCB0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmN1X3JlYWRfdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRpc2NhcmQ7CisgICAgICAgICAgICAgICAgfQogCiAJCW5ldGlmX3J4KHNrYik7CiAKQEAgLTg5OCw2ICsxNDU4LDcgQEAKIAl1OCBwcm90bzsKIAlpbnQgZXJyID0gLTE7CiAJaW50IHBrdF9sZW47CisJX191OCBob3BfbGltaXQ7ICAgIAogCiAJaWYgKCFmbDYtPmZsb3dpNl9tYXJrKQogCQlkc3QgPSBpcDZfdG5sX2RzdF9jaGVjayh0KTsKQEAgLTkzNCwxMCArMTQ5NSwyMSBAQAogCQltdHUgPSBJUFY2X01JTl9NVFU7CiAJaWYgKHNrYl9kc3Qoc2tiKSkKIAkJc2tiX2RzdChza2IpLT5vcHMtPnVwZGF0ZV9wbXR1KHNrYl9kc3Qoc2tiKSwgbXR1KTsKLQlpZiAoc2tiLT5sZW4gPiBtdHUpIHsKLQkJKnBtdHUgPSBtdHU7Ci0JCWVyciA9IC1FTVNHU0laRTsKLQkJZ290byB0eF9lcnJfZHN0X3JlbGVhc2U7CisgICAgICAgIGlmICghdC0+aXA0cmQucHJlZml4KSB7ICAgLyogNHJkIHN1cHBvcnQgcmVxdWlyZXMgUG9zdCBGcmFnbWVudGF0aW9uLCBzbyBza2ItPmxlbiBjb3VsZCBiZSBncmVhdGVyIHRoYW4gTVRVICovIAorICAgICAgICAgICAgICAgIGlmIChza2ItPmxlbiA+IG10dSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBtdHUgPSBtdHU7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSAtRU1TR1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHR4X2Vycl9kc3RfcmVsZWFzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCisKKwlpZiAodC0+aXA0cmQucHJlZml4KSB7CisJCXN0cnVjdCBpcGhkciAqaXBoOworCQlpcGggPSBpcF9oZHIoc2tiKTsKKwkJaG9wX2xpbWl0ID0gaXBoLT50dGw7CisJfQorCWVsc2UgeworCQlob3BfbGltaXQgPSB0LT5wYXJtcy5ob3BfbGltaXQ7CiAJfQogCiAJLyoKQEAgLTk3Nyw3ICsxNTQ5LDcgQEAKIAkqKF9fYmUzMiopaXB2NmggPSBmbDYtPmZsb3dsYWJlbCB8IGh0b25sKDB4NjAwMDAwMDApOwogCWRzZmllbGQgPSBJTkVUX0VDTl9lbmNhcHN1bGF0ZSgwLCBkc2ZpZWxkKTsKIAlpcHY2X2NoYW5nZV9kc2ZpZWxkKGlwdjZoLCB+SU5FVF9FQ05fTUFTSywgZHNmaWVsZCk7Ci0JaXB2NmgtPmhvcF9saW1pdCA9IHQtPnBhcm1zLmhvcF9saW1pdDsKKwlpcHY2aC0+aG9wX2xpbWl0ID0gaG9wX2xpbWl0OyAgICAKIAlpcHY2aC0+bmV4dGhkciA9IHByb3RvOwogCWlwdjZfYWRkcl9jb3B5KCZpcHY2aC0+c2FkZHIsICZmbDYtPnNhZGRyKTsKIAlpcHY2X2FkZHJfY29weSgmaXB2NmgtPmRhZGRyLCAmZmw2LT5kYWRkcik7CkBAIC0xMDM0LDYgKzE2MDYsMTAgQEAKIAlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfRldNQVJLKQogCQlmbDYuZmxvd2k2X21hcmsgPSBza2ItPm1hcms7CiAKKworICAgICAgICBpZiAodC0+aXA0cmQucHJlZml4ICYmIGlwNl90bmxfNHJkX3htaXRfaGVscGVyKHNrYiwgJmZsNiwgdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCiAJZXJyID0gaXA2X3RubF94bWl0Mihza2IsIGRldiwgZHNmaWVsZCwgJmZsNiwgZW5jYXBfbGltaXQsICZtdHUpOwogCWlmIChlcnIgIT0gMCkgewogCQkvKiBYWFg6IHNlbmQgSUNNUCBlcnJvciBldmVuIGlmIERGIGlzIG5vdCBzZXQuICovCkBAIC0xMTA1LDYgKzE2ODEsOCBAQAogCiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CiAJY2FzZSBodG9ucyhFVEhfUF9JUCk6CisgICAgICAgICAgICAgICAgaWYgKHQtPmlwNHJkLnByZWZpeCAmJiBpcF9kZWZyYWcoc2tiLCBJUF9ERUZSQUdfSVA2X1ROTF80UkQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5FVERFVl9UWF9PSzsKIAkJcmV0ID0gaXA0aXA2X3RubF94bWl0KHNrYiwgZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKQEAgLTExNDMsNiArMTcyMSwxMSBAQAogCQlpZiAocnR5cGUmSVBWNl9BRERSX1VOSUNBU1QpCiAJCQlwLT5mbGFncyB8PSBJUDZfVE5MX0ZfQ0FQX1JDVjsKIAl9CisKKyAgICAgICAgaWYgKHQtPmlwNHJkLnByZWZpeCkgeworICAgICAgICAgICAgICAgIHAtPmZsYWdzIHw9IElQNl9UTkxfRl9DQVBfWE1JVDsKKyAgICAgICAgICAgICAgICBwLT5mbGFncyB8PSBJUDZfVE5MX0ZfQ0FQX1JDVjsKKyAgICAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBpcDZfdG5sX2xpbmtfY29uZmlnKHN0cnVjdCBpcDZfdG5sICp0KQpAQCAtMTIyMCw2ICsxODAzLDcgQEAKIAl0LT5wYXJtcy5mbG93aW5mbyA9IHAtPmZsb3dpbmZvOwogCXQtPnBhcm1zLmxpbmsgPSBwLT5saW5rOwogCXQtPnBhcm1zLnByb3RvID0gcC0+cHJvdG87CisgICAgICAgIGlwNl90bmxfNHJkX3VwZGF0ZV9wYXJtcyh0KTsgICAgICAgIAogCWlwNl90bmxfZHN0X3Jlc2V0KHQpOwogCWlwNl90bmxfbGlua19jb25maWcodCk7CiAJcmV0dXJuIDA7CkBAIC0xMjYxLDYgKzE4NDUsOCBAQAogCXN0cnVjdCBpcDZfdG5sICp0ID0gTlVMTDsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CiAJc3RydWN0IGlwNl90bmxfbmV0ICppcDZuID0gbmV0X2dlbmVyaWMobmV0LCBpcDZfdG5sX25ldF9pZCk7CisgICAgICAgIHN0cnVjdCBpcDZfdG5sXzRyZCBpcDRyZCwgKmlwNHJkcDsgIAorICAgICAgICBzdHJ1Y3QgaXA2X3RubF80cmRfbWFwX3J1bGUgKm1yOyAgIAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHRVRUVU5ORUw6CkBAIC0xMzM0LDkgKzE5MjAsMTE1IEBACiAJCWVyciA9IDA7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKGRldik7CiAJCWJyZWFrOworCWNhc2UgU0lPQ0FERDRSRDoKKwljYXNlIFNJT0NERUw0UkQ6CisJCWVyciA9IC1FUEVSTTsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJZ290byBkb25lOworCisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaXA0cmQsIGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCBzaXplb2YoaXA0cmQpKSkKKwkJCWdvdG8gZG9uZTsKKworCQl0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCQlpZiAoY21kID09IFNJT0NBREQ0UkQpIHsKKworCQkJX19iZTMyIHByZWZpeDsKKwkJCXN0cnVjdCBpbjZfYWRkciByZWxheV9wcmVmaXgsIHJlbGF5X3N1ZmZpeDsKKworCQkJZXJyID0gLUVJTlZBTDsKKworCQkJaWYgKGlwNHJkLnJlbGF5X3N1ZmZpeGxlbiA+IDY0KQorCQkJCWdvdG8gZG9uZTsKKworCQkJaWYgKGlwNHJkLnJlbGF5X3N1ZmZpeGxlbiA8PSBpcDRyZC5yZWxheV9wcmVmaXhsZW4pCisJCQkJZ290byBkb25lOworCisJCQlwcmVmaXggPSBpcDRyZC5wcmVmaXggJiBodG9ubCgweGZmZmZmZmZmVUwgPDwgKDMyIC0gaXA0cmQucHJlZml4bGVuKSk7CisJCQlpZiAocHJlZml4ICE9IGlwNHJkLnByZWZpeCkKKwkJCQlnb3RvIGRvbmU7CisKKwkJCWlwdjZfYWRkcl9wcmVmaXgoJnJlbGF5X3ByZWZpeCwgJmlwNHJkLnJlbGF5X3ByZWZpeCwgaXA0cmQucmVsYXlfcHJlZml4bGVuKTsKKwkJCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZyZWxheV9wcmVmaXgsICZpcDRyZC5yZWxheV9wcmVmaXgpKQorCQkJCWdvdG8gZG9uZTsKKworCQkJaXB2Nl9hZGRyX3ByZWZpeCgmcmVsYXlfc3VmZml4LCAmaXA0cmQucmVsYXlfc3VmZml4LCBpcDRyZC5yZWxheV9zdWZmaXhsZW4pOworCQkJaWYgKCFpcHY2X2FkZHJfZXF1YWwoJnJlbGF5X3N1ZmZpeCwgJmlwNHJkLnJlbGF5X3N1ZmZpeCkpCisJCQkJZ290byBkb25lOworCisKKwkJCWVyciA9IGlwNl90bmxfNHJkX21yX2NyZWF0ZSgmaXA0cmQsICZ0LT5pcDRyZCwgdC0+ZGV2KTsgLyogbW9kaWZpZWQgYnkgTVNQRCAqLworCisJCQlpZiAoIGlwNHJkLmVudHJ5X251bSA9PSAwICl7CisKKwkJCQl0LT5pcDRyZC5wcmVmaXggPSBwcmVmaXg7CisJCQkJaXB2Nl9hZGRyX2NvcHkoJnQtPmlwNHJkLnJlbGF5X3ByZWZpeCwgJnJlbGF5X3ByZWZpeCk7CisJCQkJaXB2Nl9hZGRyX2NvcHkoJnQtPmlwNHJkLnJlbGF5X3N1ZmZpeCwgJnJlbGF5X3N1ZmZpeCk7CisJCQkJdC0+aXA0cmQucHJlZml4bGVuID0gaXA0cmQucHJlZml4bGVuOworCQkJCXQtPmlwNHJkLnJlbGF5X3ByZWZpeGxlbiA9IGlwNHJkLnJlbGF5X3ByZWZpeGxlbjsKKwkJCQl0LT5pcDRyZC5yZWxheV9zdWZmaXhsZW4gPSBpcDRyZC5yZWxheV9zdWZmaXhsZW47CisJCQkJdC0+aXA0cmQucHNpZF9vZmZzZXRsZW4gPSBpcDRyZC5wc2lkX29mZnNldGxlbjsKKworCQkJCWlwNl90bmxfNHJkX3VwZGF0ZV9wYXJtcyh0KTsKKwkJCQlpcDZfdG5sX2RzdF9yZXNldCh0KTsKKwkJCQlpcDZfdG5sX2xpbmtfY29uZmlnKHQpOworCQkJfQorCQkJLyogREJHICovCisJCQlpcDZfdG5sXzRyZF9tcl9zaG93KCZ0LT5pcDRyZCk7CisJCX1lbHNlIGlmKGNtZCA9PSBTSU9DREVMNFJEKXsKKwkJCWlmICggaXA0cmQuZW50cnlfbnVtID09IDAgKXsKKwkJCQlpcDZfdG5sXzRyZF9tcl9kZWxldGVfYWxsKCZ0LT5pcDRyZCwgdC0+ZGV2KTsKKwkJCQl0LT5pcDRyZC5wcmVmaXggPSAwOworCQkJCW1lbXNldCgmdC0+aXA0cmQucmVsYXlfcHJlZml4LCAwLCBzaXplb2YodC0+aXA0cmQucmVsYXlfcHJlZml4KSk7CisJCQkJbWVtc2V0KCZ0LT5pcDRyZC5yZWxheV9zdWZmaXgsIDAsIHNpemVvZih0LT5pcDRyZC5yZWxheV9zdWZmaXgpKTsKKwkJCQl0LT5pcDRyZC5wcmVmaXhsZW4gPSAwOworCQkJCXQtPmlwNHJkLnJlbGF5X3ByZWZpeGxlbiA9IDA7CisJCQkJdC0+aXA0cmQucmVsYXlfc3VmZml4bGVuID0gMDsKKwkJCQl0LT5pcDRyZC5wc2lkX29mZnNldGxlbiA9IDA7CisJCQkJdC0+aXA0cmQubGFkZHI0ID0gMDsKKwkJCQl0LT5pcDRyZC5wb3J0X3NldF9pZCA9IHQtPmlwNHJkLnBvcnRfc2V0X2lkX2xlbiA9IDA7CisKKwkJCQlpcDZfdG5sX2RzdF9yZXNldCh0KTsKKwkJCQlpcDZfdG5sX2xpbmtfY29uZmlnKHQpOworCQkJfWVsc2V7CisJCQkJZXJyID0gaXA2X3RubF80cmRfbXJfZGVsZXRlKCBpcDRyZC5lbnRyeV9udW0gLCAmdC0+aXA0cmQsIHQtPmRldik7ICAvKiBtb2RpZmllZCBieSBNU1BEICovCisJCQl9CisJCQkvKiBEQkcgKi8KKwkJCWlwNl90bmxfNHJkX21yX3Nob3coJnQtPmlwNHJkKTsKKwkJfWVsc2V7CisJCQlwcmludGsoS0VSTl9FUlIgIj09PSBpb2N0bF9jbWQgMHgleCBcbiIsY21kICk7CisJCX0KKwkJZXJyID0gMDsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0lPQ0dFVDRSRDoKKyAgICAgICAgICAgICAgICB0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKyAgICAgICAgICAgICAgICBpcDRyZHAgPSAoc3RydWN0IGlwNl90bmxfNHIgKilpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YTsKKyAKKyAgICAgICAgICAgICAgICByZWFkX2xvY2soJnQtPmlwNHJkLm1hcF9sb2NrKTsKKyAgICAgICAgICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5IChtciwgJnQtPmlwNHJkLm1hcF9saXN0LCBtcl9saXN0KXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwdjZfYWRkcl9jb3B5KCZpcDRyZC5yZWxheV9wcmVmaXgsICZtci0+cmVsYXlfcHJlZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwdjZfYWRkcl9jb3B5KCZpcDRyZC5yZWxheV9zdWZmaXgsICZtci0+cmVsYXlfc3VmZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwNHJkLnByZWZpeCA9IG1yLT5wcmVmaXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpcDRyZC5yZWxheV9wcmVmaXhsZW4gPSBtci0+cmVsYXlfcHJlZml4bGVuOworICAgICAgICAgICAgICAgICAgICAgICAgaXA0cmQucmVsYXlfc3VmZml4bGVuID0gbXItPnJlbGF5X3N1ZmZpeGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwNHJkLnByZWZpeGxlbiA9IG1yLT5wcmVmaXhsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBpcDRyZC5lYWJpdF9sZW4gPSBtci0+ZWFiaXRfbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgaXA0cmQucHNpZF9vZmZzZXRsZW4gPSBtci0+cHNpZF9vZmZzZXRsZW47CisgICAgICAgICAgICAgICAgICAgICAgICBpcDRyZC5lbnRyeV9udW0gPSBtci0+ZW50cnlfbnVtOworIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihpcDRyZHAsICZpcDRyZCwgc2l6ZW9mKGlwNHJkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF91bmxvY2soJnQtPmlwNHJkLm1hcF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlwNHJkcCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWFkX3VubG9jaygmdC0+aXA0cmQubWFwX2xvY2spOworICAgICAgICAgICAgICAgIGJyZWFrOwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FSU5WQUw7CiAJfQorZG9uZToKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNTQ1LDEyICsyMjM3LDIyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGlwNl90dW5uZWxfaW5pdCh2b2lkKQogewotCWludCAgZXJyOworICAgICAgICBpbnQgZXJyID0gMDsgICAgICAgICAgICAgICAgCisgCisgICAgICAgIG1yX2ttZW0gPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXA2X3RubF80cmRfbWFwX3J1bGUiLAorICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaXA2X3RubF80cmRfbWFwX3J1bGUpLCAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGlmICghbXJfa21lbSkKKwl7CisJCWVycj0gLUVOT01FTTsgCisgICAgICAgICAgICAgICAgZ290byBvdXRfcGVybmV0OworCX0KIAogCWVyciA9IHJlZ2lzdGVyX3Blcm5ldF9kZXZpY2UoJmlwNl90bmxfbmV0X29wcyk7CiAJaWYgKGVyciA8IDApCi0JCWdvdG8gb3V0X3Blcm5ldDsKKwkJZ290byBvdXRfa21lbTsKIAorCQogCWVyciA9IHhmcm02X3R1bm5lbF9yZWdpc3RlcigmaXA0aXA2X2hhbmRsZXIsIEFGX0lORVQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiaXA2X3R1bm5lbCBpbml0OiBjYW4ndCByZWdpc3RlciBpcDRpcDZcbiIpOwpAQCAtMTU2MywxMiArMjI2NSwxOCBAQAogCQlnb3RvIG91dF9pcDZpcDY7CiAJfQogCisgICAgICAgIGVyciA9X19ydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVDRSRCwgTlVMTCAsIGluZXQ2X2R1bXA0cmRfbXJ1bGUsIE5VTEwpOworICAgICAgICBpZihlcnIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0X2lwNmlwNjsKKwogCXJldHVybiAwOwogCiBvdXRfaXA2aXA2OgogCXhmcm02X3R1bm5lbF9kZXJlZ2lzdGVyKCZpcDRpcDZfaGFuZGxlciwgQUZfSU5FVCk7CiBvdXRfaXA0aXA2OgogCXVucmVnaXN0ZXJfcGVybmV0X2RldmljZSgmaXA2X3RubF9uZXRfb3BzKTsKK291dF9rbWVtOgorCWttZW1fY2FjaGVfZGVzdHJveShtcl9rbWVtKTsKIG91dF9wZXJuZXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE1ODUsNyArMjI5MywxMiBAQAogCWlmICh4ZnJtNl90dW5uZWxfZGVyZWdpc3RlcigmaXA2aXA2X2hhbmRsZXIsIEFGX0lORVQ2KSkKIAkJcHJpbnRrKEtFUk5fSU5GTyAiaXA2X3R1bm5lbCBjbG9zZTogY2FuJ3QgZGVyZWdpc3RlciBpcDZpcDZcbiIpOwogCisgICAgICAgIGttZW1fY2FjaGVfZGVzdHJveShtcl9rbWVtKTsgICAgIAorIAogCXVucmVnaXN0ZXJfcGVybmV0X2RldmljZSgmaXA2X3RubF9uZXRfb3BzKTsKKworICAgICAgICBydG5sX3VucmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fR0VUNFJEKTsKKyAKIH0KIAogbW9kdWxlX2luaXQoaXA2X3R1bm5lbF9pbml0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggZjc5MmIzNC4uOTVkNjUxYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTIwNSw2ICsyMDUsMTQgQEAKICAgICAgICAgCiAgICAgICAgICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgSVA2X05GX1RBUkdFVF9OUFQKKwl0cmlzdGF0ZSAiTlBUIChOZXR3b3JrIFByZWZpeCB0cmFuc2xhdGlvbikgdGFyZ2V0IHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgYFNOUFQnIGFuZCBgRE5QVCcgdGFyZ2V0LCB3aGljaCBwZXJmb3JtCisJICBzdGF0ZWxlc3MgSVB2Ni10by1JUHY2IE5ldHdvcmsgUHJlZml4IFRyYW5zbGF0aW9uIHBlciBSRkMgNjI5Ni4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGVuZGlmICMgSVA2X05GX0lQVEFCTEVTCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCBhYmZlZTkxLi45MWIwODA2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlCkBAIC0zMSw0ICszMSw1IEBACiAKICMgdGFyZ2V0cwogb2JqLSQoQ09ORklHX0lQNl9ORl9UQVJHRVRfTE9HKSArPSBpcDZ0X0xPRy5vCitvYmotJChDT05GSUdfSVA2X05GX1RBUkdFVF9OUFQpICs9IGlwNnRfTlBULm8KIG9iai0kKENPTkZJR19JUDZfTkZfVEFSR0VUX1JFSkVDVCkgKz0gaXA2dF9SRUpFQ1QubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTlBULmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9OUFQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjk4MTUwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfTlBULmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZ0X05QVC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CisKK3N0YXRpYyBpbnQgaXA2dF9ucHRfY2hlY2tlbnRyeShjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKK3sKKwlzdHJ1Y3QgaXA2dF9ucHRfdGdpbmZvICpucHQgPSBwYXItPnRhcmdpbmZvOworCV9fd3N1bSBzcmNfc3VtID0gMCwgZHN0X3N1bSA9IDA7CisJc3RydWN0IGluNl9hZGRyIHBmeDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChucHQtPnNyY19wZnhfbGVuID4gNjQgfHwgbnB0LT5kc3RfcGZ4X2xlbiA+IDY0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEVuc3VyZSB0aGF0IExTQiBvZiBwcmVmaXggaXMgemVybyAqLworCWlwdjZfYWRkcl9wcmVmaXgoJnBmeCwgJm5wdC0+c3JjX3BmeC5pbjYsIG5wdC0+c3JjX3BmeF9sZW4pOworCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZwZngsICZucHQtPnNyY19wZnguaW42KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaXB2Nl9hZGRyX3ByZWZpeCgmcGZ4LCAmbnB0LT5kc3RfcGZ4LmluNiwgbnB0LT5kc3RfcGZ4X2xlbik7CisJaWYgKCFpcHY2X2FkZHJfZXF1YWwoJnBmeCwgJm5wdC0+ZHN0X3BmeC5pbjYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5wdC0+c3JjX3BmeC5pbjYuczZfYWRkcjE2KTsgaSsrKSB7CisJCXNyY19zdW0gPSBjc3VtX2FkZChzcmNfc3VtLAorCQkJCShfX2ZvcmNlIF9fd3N1bSlucHQtPnNyY19wZnguaW42LnM2X2FkZHIxNltpXSk7CisJCWRzdF9zdW0gPSBjc3VtX2FkZChkc3Rfc3VtLAorCQkJCShfX2ZvcmNlIF9fd3N1bSlucHQtPmRzdF9wZnguaW42LnM2X2FkZHIxNltpXSk7CisJfQorCisJbnB0LT5hZGp1c3RtZW50ID0gfmNzdW1fZm9sZChjc3VtX3N1YihzcmNfc3VtLCBkc3Rfc3VtKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGlwNnRfbnB0X21hcF9wZngoY29uc3Qgc3RydWN0IGlwNnRfbnB0X3RnaW5mbyAqbnB0LAorCQkJICAgICBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCit7CisJdW5zaWduZWQgaW50IHBmeF9sZW47CisJdW5zaWduZWQgaW50IGksIGlkeDsKKwlfX2JlMzIgbWFzazsKKwlfX3N1bTE2IHN1bTsKKworCXBmeF9sZW4gPSBtYXgobnB0LT5zcmNfcGZ4X2xlbiwgbnB0LT5kc3RfcGZ4X2xlbik7CisJZm9yIChpID0gMDsgaSA8IHBmeF9sZW47IGkgKz0gMzIpIHsKKwkJaWYgKHBmeF9sZW4gLSBpID49IDMyKQorCQkJbWFzayA9IDA7CisJCWVsc2UKKwkJCW1hc2sgPSBodG9ubCgoMSA8PCAoaSAtIHBmeF9sZW4gKyAzMikpIC0gMSk7CisKKwkJaWR4ID0gaSAvIDMyOworCQlhZGRyLT5zNl9hZGRyMzJbaWR4XSAmPSBtYXNrOworCQlhZGRyLT5zNl9hZGRyMzJbaWR4XSB8PSB+bWFzayAmIG5wdC0+ZHN0X3BmeC5pbjYuczZfYWRkcjMyW2lkeF07CisJfQorCisJaWYgKHBmeF9sZW4gPD0gNDgpCisJCWlkeCA9IDM7CisJZWxzZSB7CisJCWZvciAoaWR4ID0gNDsgaWR4IDwgQVJSQVlfU0laRShhZGRyLT5zNl9hZGRyMTYpOyBpZHgrKykgeworCQkJaWYgKChfX2ZvcmNlIF9fc3VtMTYpYWRkci0+czZfYWRkcjE2W2lkeF0gIT0KKwkJCSAgICBDU1VNX01BTkdMRURfMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaWR4ID09IEFSUkFZX1NJWkUoYWRkci0+czZfYWRkcjE2KSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzdW0gPSB+Y3N1bV9mb2xkKGNzdW1fYWRkKGNzdW1fdW5mb2xkKChfX2ZvcmNlIF9fc3VtMTYpYWRkci0+czZfYWRkcjE2W2lkeF0pLAorCQkJCSAgY3N1bV91bmZvbGQobnB0LT5hZGp1c3RtZW50KSkpOworCWlmIChzdW0gPT0gQ1NVTV9NQU5HTEVEXzApCisJCXN1bSA9IDA7CisJKihfX2ZvcmNlIF9fc3VtMTYgKikmYWRkci0+czZfYWRkcjE2W2lkeF0gPSBzdW07CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraXA2dF9zbnB0X3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK3sKKwljb25zdCBzdHJ1Y3QgaXA2dF9ucHRfdGdpbmZvICpucHQgPSBwYXItPnRhcmdpbmZvOworCXN0cnVjdCBuZl9jb25uICpjdDsKKwllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKKworCWlmICghaXA2dF9ucHRfbWFwX3BmeChucHQsICZpcHY2X2hkcihza2IpLT5zYWRkcikpIHsKKwkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEFSQU1QUk9CLCBJQ01QVjZfSERSX0ZJRUxELAorCQkJICAgIG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLCBzYWRkcikpOworCQlyZXR1cm4gTkZfRFJPUDsKKwl9CisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX0ZQCisJY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKKwlpZiAoY3QgJiYgKChjdGluZm8gPT0gSVBfQ1RfTkVXKSB8fCAoY3RpbmZvID09IElQX0NUX1JFTEFURUQpKSkgeworCQlyY3VfcmVhZF9sb2NrKCk7CisJCW1lbWNweSgmY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfUkVQTFldLnR1cGxlLmRzdC51My5pbjYsICZpcHY2X2hkcihza2IpLT5zYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gWFRfQ09OVElOVUU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2lwNnRfZG5wdF90ZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCit7CisJY29uc3Qgc3RydWN0IGlwNnRfbnB0X3RnaW5mbyAqbnB0ID0gcGFyLT50YXJnaW5mbzsKKwlzdHJ1Y3QgbmZfY29ubiAqY3Q7CisJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CisKKwlpZiAoIWlwNnRfbnB0X21hcF9wZngobnB0LCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpKSB7CisJCWljbXB2Nl9zZW5kKHNrYiwgSUNNUFY2X1BBUkFNUFJPQiwgSUNNUFY2X0hEUl9GSUVMRCwKKwkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgZGFkZHIpKTsKKwkJcmV0dXJuIE5GX0RST1A7CisJfQorI2lmZGVmIENPTkZJR19DT01DRVJUT19GUAorCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CisJaWYgKGN0ICYmICgoY3RpbmZvID09IElQX0NUX05FVykgfHwgKGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEKSkpIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQltZW1jcHkoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS50dXBsZS5zcmMudTMuaW42LCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfQorI2VuZGlmCisJcmV0dXJuIFhUX0NPTlRJTlVFOworfQorCitzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcDZ0X25wdF90YXJnZXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKKwl7CisJCS5uYW1lCQk9ICJTTlBUIiwKKwkJLnRhcmdldAkJPSBpcDZ0X3NucHRfdGcsCisJCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X25wdF90Z2luZm8pLAorCQkuY2hlY2tlbnRyeQk9IGlwNnRfbnB0X2NoZWNrZW50cnksCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAorCQkuaG9va3MJCT0gKDEgPDwgTkZfSU5FVF9MT0NBTF9JTikgfAorCQkJCSAgKDEgPDwgTkZfSU5FVF9QT1NUX1JPVVRJTkcpLAorCQkubWUJCT0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJETlBUIiwKKwkJLnRhcmdldAkJPSBpcDZ0X2RucHRfdGcsCisJCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBpcDZ0X25wdF90Z2luZm8pLAorCQkuY2hlY2tlbnRyeQk9IGlwNnRfbnB0X2NoZWNrZW50cnksCisJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAorCQkuaG9va3MJCT0gKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORykgfAorCQkJCSAgKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpLAorCQkubWUJCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGlwNnRfbnB0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4geHRfcmVnaXN0ZXJfdGFyZ2V0cyhpcDZ0X25wdF90YXJnZXRfcmVnLAorCQkJCSAgIEFSUkFZX1NJWkUoaXA2dF9ucHRfdGFyZ2V0X3JlZykpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXA2dF9ucHRfZXhpdCh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfdGFyZ2V0cyhpcDZ0X25wdF90YXJnZXRfcmVnLAorCQkJICAgICAgQVJSQVlfU0laRShpcDZ0X25wdF90YXJnZXRfcmVnKSk7Cit9CisKK21vZHVsZV9pbml0KGlwNnRfbnB0X2luaXQpOworbW9kdWxlX2V4aXQoaXA2dF9ucHRfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSVB2Ni10by1JUHY2IE5ldHdvcmsgUHJlZml4IFRyYW5zbGF0aW9uIChSRkMgNjI5NikiKTsKK01PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X1NOUFQiKTsKK01PRFVMRV9BTElBUygiaXA2dF9ETlBUIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCAyZTIxNzUxLi5lYjYwOGVmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTI0NDAsOCArMjQ0MCwxMSBAQAogCQlpcHY2X2FkZHJfY29weSgmc2FkZHJfYnVmLCAmcnQtPnJ0NmlfcHJlZnNyYy5hZGRyKTsKIAkJTkxBX1BVVChza2IsIFJUQV9QUkVGU1JDLCAxNiwgJnNhZGRyX2J1Zik7CiAJfQotCisjaWZkZWYgQ09ORklHX0FSQ0hfQ09NQ0VSVE8KKwlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzXzIoc2tiLCBkc3RfbWV0cmljc19wdHIoJnJ0LT5kc3QpLCAmcnQtPmRzdCkgPCAwKQorI2Vsc2UKIAlpZiAocnRuZXRsaW5rX3B1dF9tZXRyaWNzKHNrYiwgZHN0X21ldHJpY3NfcHRyKCZydC0+ZHN0KSkgPCAwKQorI2VuZGlmCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMjUwMyw2ICsyNTA2LDcgQEAKIAlzdHJ1Y3QgcnRtc2cgKnJ0bTsKIAlzdHJ1Y3QgZmxvd2k2IGZsNjsKIAlpbnQgZXJyLCBpaWYgPSAwOworCWludCBmbGFncyA9IDA7CiAKIAllcnIgPSBubG1zZ19wYXJzZShubGgsIHNpemVvZigqcnRtKSwgdGIsIFJUQV9NQVgsIHJ0bV9pcHY2X3BvbGljeSk7CiAJaWYgKGVyciA8IDApCkBAIC0yNTMxLDYgKzI1MzUsOSBAQAogCWlmICh0YltSVEFfT0lGXSkKIAkJZmw2LmZsb3dpNl9vaWYgPSBubGFfZ2V0X3UzMih0YltSVEFfT0lGXSk7CiAKKwlpZiAodGJbUlRBX01BUktdKQorCQlmbDYuZmxvd2k2X21hcmsgPSBubGFfZ2V0X3UzMih0YltSVEFfTUFSS10pOworCiAJaWYgKGlpZikgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCQlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmV0LCBpaWYpOwpAQCAtMjUzOCw2ICsyNTQ1LDE0IEBACiAJCQllcnIgPSAtRU5PREVWOwogCQkJZ290byBlcnJvdXQ7CiAJCX0KKworCQlmbDYuZmxvd2k2X2lpZiA9IGlpZjsKKworCQlpZiAoIWlwdjZfYWRkcl9hbnkoJmZsNi5zYWRkcikpCisJCQlmbGFncyB8PSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOworCisJCWlmIChydDZfbmVlZF9zdHJpY3QoJmZsNi5kYWRkcikgJiYgZGV2LT50eXBlICE9IEFSUEhSRF9QSU1SRUcpCisJCQlmbGFncyB8PSBSVDZfTE9PS1VQX0ZfSUZBQ0U7CiAJfQogCiAJc2tiID0gYWxsb2Nfc2tiKE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKQEAgLTI1NTIsNyArMjU2NywxMSBAQAogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3Jlc2VydmUoc2tiLCBNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSk7CiAKLQlydCA9IChzdHJ1Y3QgcnQ2X2luZm8qKSBpcDZfcm91dGVfb3V0cHV0KG5ldCwgTlVMTCwgJmZsNik7CisJaWYgKGlpZikKKwkJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvKikgZmliNl9ydWxlX2xvb2t1cChuZXQsICZmbDYsIGZsYWdzLCBpcDZfcG9sX3JvdXRlX2lucHV0KTsKKwllbHNlCisJCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyopIGlwNl9yb3V0ZV9vdXRwdXQobmV0LCBOVUxMLCAmZmw2KTsKKwogCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCiAJZXJyID0gcnQ2X2ZpbGxfbm9kZShuZXQsIHNrYiwgcnQsICZmbDYuZGFkZHIsICZmbDYuc2FkZHIsIGlpZiwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggOGMyNTQxOS4uMmJlMWRlZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTUxNSw2ICs1MTUsMzYgQEAKIAlpZiAoIXhmcm02X3BvbGljeV9jaGVjayhzaywgWEZSTV9QT0xJQ1lfSU4sIHNrYikpCiAJCWdvdG8gZHJvcDsKIAorCisJLyogTkFULVQgY2hhbmdlcyBTdGFydCAqLworCWlmICggdXAtPmVuY2FwX3R5cGUgKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYW4gZW5jYXBzdWxhdGlvbiBzb2NrZXQsIHNvIHBhc3MgdGhlIHNrYiB0bworCQkgKiB0aGUgc29ja2V0J3MgdWRwNl9lbmNhcF9yY3YoKSBob29rLk90aGVyd2lzZSwganVzdAorCQkgKiBmYWxsIHRocm91Z2ggYW5kIHBhc3MgdGhpcyB1cCB0aGUgVURQIHNvY2tldC4KKwkJICogdXAtPmVuY2FwX3JjdigpIHJldHVybnMgdGhlIGZvbGxvd2luZyB2YWx1ZToKKwkJICogPTAgaWYgc2tiIHdhcyBzdWNjZXNzZnVsbHkgcGFzc2VkIHRvIHRoZSBlbmNhcAorCQkgKiBoYW5kbGVyIG9yIHdhcyBkaXNjYXJkZWQgYnkgaXQuCisJCSAqID4wIGlmIHNrYiBzaG91bGQgYmUgcGFzc2VkIG9uIHRvIFVEUC4KKwkJICogPDAgaWYgc2tiIHNob3VsZCBiZSByZXN1Ym1pdHRlZCBhcyBwcm90byAtTgorCQkgKi8KKworCQkvKiBpZiB3ZSdyZSBvdmVybHkgc2hvcnQsIGxldCBVRFAgaGFuZGxlIGl0ICovCisJCWlmIChza2ItPmxlbiA+IHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAmJgorCQkgICAgdXAtPmVuY2FwX3JjdiAhPSBOVUxMKSB7CisJCQlpbnQgcmV0OworCisJCQlyZXQgPSAoKnVwLT5lbmNhcF9yY3YpKHNrLCBza2IpOworCQkJaWYgKHJldCA8PSAwKSB7CisJCQkJVURQX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksCisJCQkJCQlVRFBfTUlCX0lOREFUQUdSQU1TLAorCQkJCQkJaXNfdWRwbGl0ZSk7CisJCQkJcmV0dXJuIC1yZXQ7CisJCQl9CisJCQkgLyogRkFMTFRIUk9VR0ggLS0gaXQncyBhIFVEUCBQYWNrZXQgKi8KKwkJfQorCX0KKwogCS8qCiAJICogVURQLUxpdGUgc3BlY2lmaWMgdGVzdHMsIGlnbm9yZWQgb24gVURQIHNvY2tldHMgKHNlZSBuZXQvaXB2NC91ZHAuYykuCiAJICovCkBAIC0xMjQwLDI0ICsxMjcwLDExMSBAQAogfQogCiAvKgorKglTb2NrZXQgb3B0aW9uIGNvZGUgZm9yIFVEUCBmb3IgSVBWNgorKi8KK2ludCB1ZHA2X2xpYl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKKwkJICAgICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4sCisJCSAgICAgICBpbnQgKCpwdXNoX3BlbmRpbmdfZnJhbWVzKShzdHJ1Y3Qgc29jayAqKSkKK3sKKwlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKKwlpbnQgdmFsOworCWludCBlcnIgPSAwOworCWludCBpc191ZHBsaXRlID0gSVNfVURQTElURShzayk7CisKKwlpZiAob3B0bGVuIDwgc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCQljYXNlIFVEUF9DT1JLOgorCQkJaWYgKHZhbCAhPSAwKSB7CisJCQkJdXAtPmNvcmtmbGFnID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJdXAtPmNvcmtmbGFnID0gMDsKKwkJCQlsb2NrX3NvY2soc2spOworCQkJCSgqcHVzaF9wZW5kaW5nX2ZyYW1lcykoc2spOworCQkJCXJlbGVhc2Vfc29jayhzayk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFVEUF9FTkNBUDoKKwkJCXN3aXRjaCAodmFsKSB7CisJCQkJY2FzZSAwOgorCQkJCWNhc2UgVURQX0VOQ0FQX0VTUElOVURQOgorCQkJCWNhc2UgVURQX0VOQ0FQX0VTUElOVURQX05PTl9JS0U6CisJCQkJCXVwLT5lbmNhcF9yY3YgPSB4ZnJtNl91ZHBfZW5jYXBfcmN2OworCQkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJCWNhc2UgVURQX0VOQ0FQX0wyVFBJTlVEUDoKKwkJCQkJdXAtPmVuY2FwX3R5cGUgPSB2YWw7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWVyciA9IC1FTk9QUk9UT09QVDsKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIAlVRFAtTGl0ZSdzIHBhcnRpYWwgY2hlY2tzdW0gY292ZXJhZ2UgKFJGQyAzODI4KS4KKwkJCSAqLworCQkJLyogVGhlIHNlbmRlciBzZXRzIGFjdHVhbCBjaGVja3N1bSBjb3ZlcmFnZSBsZW5ndGggdmlhIHRoaXMgb3B0aW9uLgorCQkJICogVGhlIGNhc2UgY292ZXJhZ2UgPiBwYWNrZXQgbGVuZ3RoIGlzIGhhbmRsZWQgYnkgc2VuZCBtb2R1bGUuICovCisJCWNhc2UgVURQTElURV9TRU5EX0NTQ09WOgorCQkJaWYgKCFpc191ZHBsaXRlKSAgICAgICAgIC8qIERpc2FibGUgdGhlIG9wdGlvbiBvbiBVRFAgc29ja2V0cyAqLworCQkJCXJldHVybiAtRU5PUFJPVE9PUFQ7CisJCQlpZiAodmFsICE9IDAgJiYgdmFsIDwgOCkgLyogSWxsZWdhbCBjb3ZlcmFnZTogdXNlIGRlZmF1bHQgKDgpICovCisJCQkJdmFsID0gODsKKwkJCWVsc2UgaWYgKHZhbCA+IFVTSFJUX01BWCkKKwkJCQl2YWwgPSBVU0hSVF9NQVg7CisJCQl1cC0+cGNzbGVuID0gdmFsOworCQkJdXAtPnBjZmxhZyB8PSBVRFBMSVRFX1NFTkRfQ0M7CisJCQlicmVhazsKKworCQkJLyogVGhlIHJlY2VpdmVyIHNwZWNpZmllcyBhIG1pbmltdW0gY2hlY2tzdW0gY292ZXJhZ2UgdmFsdWUuIFRvIG1ha2UKKwkJCSAqIHNlbnNlLCB0aGlzIHNob3VsZCBiZSBzZXQgdG8gYXQgbGVhc3QgOCAoYXMgZG9uZSBiZWxvdykuIElmIHplcm8gaXMKKwkJCSAqIHVzZWQsIHRoaXMgYWdhaW4gbWVhbnMgZnVsbCBjaGVja3N1bSBjb3ZlcmFnZS4gICAgICAgICAgICAgICAgICAgICAqLworCQljYXNlIFVEUExJVEVfUkVDVl9DU0NPVjoKKwkJCWlmICghaXNfdWRwbGl0ZSkgICAgICAgICAvKiBEaXNhYmxlIHRoZSBvcHRpb24gb24gVURQIHNvY2tldHMgKi8KKwkJCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCQkJaWYgKHZhbCAhPSAwICYmIHZhbCA8IDgpIC8qIEF2b2lkIHNpbGx5IG1pbmltYWwgdmFsdWVzLiAgICAgICAqLworCQkJCXZhbCA9IDg7CisJCQllbHNlIGlmICh2YWwgPiBVU0hSVF9NQVgpCisJCQkJdmFsID0gVVNIUlRfTUFYOworCQkJdXAtPnBjcmxlbiA9IHZhbDsKKwkJCXVwLT5wY2ZsYWcgfD0gVURQTElURV9SRUNWX0NDOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FTk9QUk9UT09QVDsKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK0VYUE9SVF9TWU1CT0wodWRwNl9saWJfc2V0c29ja29wdCk7CisKKworLyoKICAqCVNvY2tldCBvcHRpb24gY29kZSBmb3IgVURQCiAgKi8KIGludCB1ZHB2Nl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKLQkJICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQorCQljaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQogewogCWlmIChsZXZlbCA9PSBTT0xfVURQICB8fCAgbGV2ZWwgPT0gU09MX1VEUExJVEUpCi0JCXJldHVybiB1ZHBfbGliX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwKLQkJCQkJICB1ZHBfdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyk7CisJCXJldHVybiB1ZHA2X2xpYl9zZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4sCisJCQkJdWRwX3Y2X3B1c2hfcGVuZGluZ19mcmFtZXMpOwogCXJldHVybiBpcHY2X3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBpbnQgY29tcGF0X3VkcHY2X3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAotCQkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCisJCWNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CiAJaWYgKGxldmVsID09IFNPTF9VRFAgIHx8ICBsZXZlbCA9PSBTT0xfVURQTElURSkKLQkJcmV0dXJuIHVkcF9saWJfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuLAotCQkJCQkgIHVkcF92Nl9wdXNoX3BlbmRpbmdfZnJhbWVzKTsKKwkJcmV0dXJuIHVkcDZfbGliX3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbiwKKwkJCQl1ZHBfdjZfcHVzaF9wZW5kaW5nX2ZyYW1lcyk7CiAJcmV0dXJuIGNvbXBhdF9pcHY2X3NldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X2lucHV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCmluZGV4IGY4YzNjZjguLmUyM2I3ZWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X2lucHV0LmMKKysrIGIvbmV0L2lwdjYveGZybTZfaW5wdXQuYwpAQCAtMjEsNiArMjEsMTUgQEAKIAlyZXR1cm4geGZybTZfZXh0cmFjdF9oZWFkZXIoc2tiKTsKIH0KIAoraW50IHhmcm02X3Jjdl9lbmNhcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmV4dGhkciwgX19iZTMyIHNwaSwKKwkJICAgIGludCBlbmNhcF90eXBlKQoreworCVhGUk1fU1BJX1NLQl9DQihza2IpLT5mYW1pbHkgPSBBRl9JTkVUNjsKKwlYRlJNX1NQSV9TS0JfQ0Ioc2tiKS0+ZGFkZHJvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgZGFkZHIpOworCXJldHVybiB4ZnJtX2lucHV0KHNrYiwgbmV4dGhkciwgc3BpLCBlbmNhcF90eXBlKTsKK30KK0VYUE9SVF9TWU1CT0woeGZybTZfcmN2X2VuY2FwKTsKKwogaW50IHhmcm02X3Jjdl9zcGkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5leHRoZHIsIF9fYmUzMiBzcGkpCiB7CiAJWEZSTV9TUElfU0tCX0NCKHNrYiktPmZhbWlseSA9IEFGX0lORVQ2OwpAQCAtNDYsNiArNTUsMTA2IEBACiAJCWlwNl9yY3ZfZmluaXNoKTsKIAlyZXR1cm4gLTE7CiB9CisvKiBJZiBpdCdzIGEga2VlcGFsaXZlIHBhY2tldCwgdGhlbiBqdXN0IGVhdCBpdC4KKyAqIElmIGl0J3MgYW4gZW5jYXBzdWxhdGVkIHBhY2tldCwgdGhlbiBwYXNzIGl0IHRvIHRoZQorICogSVBzZWMgeGZybSBpbnB1dC4KKyAqIFJldHVybnMgMCBpZiBza2IgcGFzc2VkIHRvIHhmcm0gb3Igd2FzIGRyb3BwZWQuCisgKiBSZXR1cm5zID4wIGlmIHNrYiBzaG91bGQgYmUgcGFzc2VkIHRvIFVEUC4KKyAqIFJldHVybnMgPDAgaWYgc2tiIHNob3VsZCBiZSByZXN1Ym1pdHRlZCAoLXJldCBpcyBwcm90b2NvbCkKKyAqLworaW50IHhmcm02X3VkcF9lbmNhcF9yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCisjaWZuZGVmIENPTkZJR19YRlJNCisJcmV0dXJuIDE7CisjZWxzZQorCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOworCXN0cnVjdCB1ZHBoZHIgKnVoOworCXN0cnVjdCBpcHY2aGRyICppcGg7CisJaW50IGlwaGxlbiwgbGVuOworCisJX191OCAqdWRwZGF0YTsKKwlfX2JlMzIgKnVkcGRhdGEzMjsKKwlfX3UxNiBlbmNhcF90eXBlID0gdXAtPmVuY2FwX3R5cGU7CisKKworCisJLyogaWYgdGhpcyBpcyBub3QgZW5jYXBzdWxhdGVkIHNvY2tldCwgdGhlbiBqdXN0IHJldHVybiBub3cgKi8KKwlpZiAoIWVuY2FwX3R5cGUpCisJCXJldHVybiAxOworCisJLyogSWYgdGhpcyBpcyBhIHBhZ2VkIHNrYiwgbWFrZSBzdXJlIHdlIHB1bGwgdXAKKwkgKiB3aGF0ZXZlciBkYXRhIHdlIG5lZWQgdG8gbG9vayBhdC4gKi8KKwlsZW4gPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBtaW4obGVuLCA4KSkpCisJCXJldHVybiAxOworCisJLyogTm93IHdlIGNhbiBnZXQgdGhlIHBvaW50ZXJzICovCisJdWggPSB1ZHBfaGRyKHNrYik7CisJdWRwZGF0YSA9IChfX3U4ICopdWggKyBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisJdWRwZGF0YTMyID0gKF9fYmUzMiAqKXVkcGRhdGE7CisKKwlzd2l0Y2ggKGVuY2FwX3R5cGUpIHsKKwlkZWZhdWx0OgorCWNhc2UgVURQX0VOQ0FQX0VTUElOVURQOgorCQkvKiBDaGVjayBpZiB0aGlzIGlzIGEga2VlcGFsaXZlIHBhY2tldC4gIElmIHNvLCBlYXQgaXQuICovCisJCWlmIChsZW4gPT0gMSAmJiB1ZHBkYXRhWzBdID09IDB4ZmYpIHsKKwkJCWdvdG8gZHJvcDsKKwkJfSBlbHNlIGlmIChsZW4gPiBzaXplb2Yoc3RydWN0IGlwX2VzcF9oZHIpICYmIHVkcGRhdGEzMlswXSAhPSAwKSB7CisJCQkvKiBFU1AgUGFja2V0IHdpdGhvdXQgTm9uLUVTUCBoZWFkZXIgKi8KKwkJCWxlbiA9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJfSBlbHNlCisJCQkvKiBNdXN0IGJlIGFuIElLRSBwYWNrZXQuLiBwYXNzIGl0IHRocm91Z2ggKi8KKwkJCXJldHVybiAxOworCQlicmVhazsKKwljYXNlIFVEUF9FTkNBUF9FU1BJTlVEUF9OT05fSUtFOgorCQkvKiBDaGVjayBpZiB0aGlzIGlzIGEga2VlcGFsaXZlIHBhY2tldC4gIElmIHNvLCBlYXQgaXQuICovCisJCWlmIChsZW4gPT0gMSAmJiB1ZHBkYXRhWzBdID09IDB4ZmYpIHsKKwkJCWdvdG8gZHJvcDsKKwkJfSBlbHNlIGlmIChsZW4gPiAyICogc2l6ZW9mKHUzMikgKyBzaXplb2Yoc3RydWN0IGlwX2VzcF9oZHIpICYmCisJCQkgICB1ZHBkYXRhMzJbMF0gPT0gMCAmJiB1ZHBkYXRhMzJbMV0gPT0gMCkgeworCisJCQkvKiBFU1AgUGFja2V0IHdpdGggTm9uLUlLRSBtYXJrZXIgKi8KKwkJCWxlbiA9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKSArIDIgKiAoc2l6ZW9mKHUzMikgKiA0KTsKKwkJfSBlbHNlCisJCQkvKiBNdXN0IGJlIGFuIElLRSBwYWNrZXQuLiBwYXNzIGl0IHRocm91Z2ggKi8KKwkJCXJldHVybiAxOworCQlicmVhazsKKwl9CisKKwkvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgdGhpcyBpcyBhbiBFU1BpblVEUCBwYWNrZXQsCisJICogc28gd2UgbmVlZCB0byByZW1vdmUgJ2xlbicgYnl0ZXMgZnJvbSB0aGUgcGFja2V0ICh0aGUgVURQCisJICogaGVhZGVyIGFuZCBvcHRpb25hbCBFU1AgbWFya2VyIGJ5dGVzKSBhbmQgdGhlbiBtb2RpZnkgdGhlCisJICogcHJvdG9jb2wgdG8gRVNQLCBhbmQgdGhlbiBjYWxsIGludG8gdGhlIHRyYW5zZm9ybSByZWNlaXZlci4KKwkgKi8KKwlpZiAoc2tiX2Nsb25lZChza2IpICYmIHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKSl7CisJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiBOb3cgd2UgY2FuIHVwZGF0ZSBhbmQgdmVyaWZ5IHRoZSBwYWNrZXQgbGVuZ3RoLi4uICovCisJaXBoID0gaXB2Nl9oZHIoc2tiKTsKKwlpcGhsZW4gPSBudG9ocyhpcGgtPnBheWxvYWRfbGVuKTsKKwlpZiAoc2tiLT5sZW4gPCBpcGhsZW4pIHsKKwkJLyogcGFja2V0IGlzIHRvbyBzbWFsbCE/ISAqLworCQlnb3RvIGRyb3A7CisJfQorCisJLyogcHVsbCB0aGUgZGF0YSBidWZmZXIgdXAgdG8gdGhlIEVTUCBoZWFkZXIgYW5kIHNldCB0aGUKKwkgKiB0cmFuc3BvcnQgaGVhZGVyIHRvIHBvaW50IHRvIEVTUC4gIEtlZXAgVURQIG9uIHRoZSBzdGFjaworCSAqIGZvciBsYXRlci4KKwkgKi8KKwlfX3NrYl9wdWxsKHNrYiwgbGVuKTsKKwlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOworCisJLyogcHJvY2VzcyBFU1AgKi8KKwlyZXR1cm4geGZybTZfcmN2X2VuY2FwKHNrYiwgSVBQUk9UT19FU1AsIDAsIGVuY2FwX3R5cGUpOworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworI2VuZGlmCit9CisKIAogaW50IHhmcm02X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfcG9saWN5LmMgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwppbmRleCBkODc5ZjdlLi5hYTgzZTQ4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYwpAQCAtMTIzLDExICsxMjMsMTcgQEAKIHsKIAlzdHJ1Y3QgZmxvd2k2ICpmbDYgPSAmZmwtPnUuaXA2OwogCWludCBvbmx5cHJvdG8gPSAwOwotCXUxNiBvZmZzZXQgPSBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYik7Ci0JY29uc3Qgc3RydWN0IGlwdjZoZHIgKmhkciA9IGlwdjZfaGRyKHNrYik7CisJLyogdXNlIHRoZSByZWFzc2VtYmxlZCBwYWNrZXQgaWYgY29ubnRyYWNrIGhhcyBkb25lIHRoZSByZWFzc2VtYmx5ICovCisjaWZkZWYgTkVUX1NLQlVGRl9ORl9ERUZSQUdfTkVFREVECisJc3RydWN0IHNrX2J1ZmYgKndob2xlX3NrYiA9IChza2ItPm5mY3RfcmVhc20pID8gc2tiLT5uZmN0X3JlYXNtIDogc2tiOworI2Vsc2UKKwlzdHJ1Y3Qgc2tfYnVmZiAqd2hvbGVfc2tiID0gc2tiOworI2VuZGlmCisJdTE2IG9mZnNldCA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4od2hvbGVfc2tiKTsKKwljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaGRyID0gaXB2Nl9oZHIod2hvbGVfc2tiKTsKIAlzdHJ1Y3QgaXB2Nl9vcHRfaGRyICpleHRoZHI7Ci0JY29uc3QgdW5zaWduZWQgY2hhciAqbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKLQl1OCBuZXh0aGRyID0gbmhbSVA2Q0Ioc2tiKS0+bmhvZmZdOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHdob2xlX3NrYik7CisJdTggbmV4dGhkciA9IG5oW0lQNkNCKHdob2xlX3NrYiktPm5ob2ZmXTsKIAogCW1lbXNldChmbDYsIDAsIHNpemVvZihzdHJ1Y3QgZmxvd2k2KSk7CiAJZmw2LT5mbG93aTZfbWFyayA9IHNrYi0+bWFyazsKQEAgLTEzNSw5ICsxNDEsOSBAQAogCWlwdjZfYWRkcl9jb3B5KCZmbDYtPmRhZGRyLCByZXZlcnNlID8gJmhkci0+c2FkZHIgOiAmaGRyLT5kYWRkcik7CiAJaXB2Nl9hZGRyX2NvcHkoJmZsNi0+c2FkZHIsIHJldmVyc2UgPyAmaGRyLT5kYWRkciA6ICZoZHItPnNhZGRyKTsKIAotCXdoaWxlIChuaCArIG9mZnNldCArIDEgPCBza2ItPmRhdGEgfHwKLQkgICAgICAgcHNrYl9tYXlfcHVsbChza2IsIG5oICsgb2Zmc2V0ICsgMSAtIHNrYi0+ZGF0YSkpIHsKLQkJbmggPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKKwl3aGlsZSAobmggKyBvZmZzZXQgKyAxIDwgd2hvbGVfc2tiLT5kYXRhIHx8CisJCXBza2JfbWF5X3B1bGwod2hvbGVfc2tiLCBuaCArIG9mZnNldCArIDEgLSB3aG9sZV9za2ItPmRhdGEpKSB7CisJCW5oID0gc2tiX25ldHdvcmtfaGVhZGVyKHdob2xlX3NrYik7CiAJCWV4dGhkciA9IChzdHJ1Y3QgaXB2Nl9vcHRfaGRyICopKG5oICsgb2Zmc2V0KTsKIAogCQlzd2l0Y2ggKG5leHRoZHIpIHsKQEAgLTE1Niw4ICsxNjIsOCBAQAogCQljYXNlIElQUFJPVE9fVENQOgogCQljYXNlIElQUFJPVE9fU0NUUDoKIAkJY2FzZSBJUFBST1RPX0RDQ1A6Ci0JCQlpZiAoIW9ubHlwcm90byAmJiAobmggKyBvZmZzZXQgKyA0IDwgc2tiLT5kYXRhIHx8Ci0JCQkgICAgIHBza2JfbWF5X3B1bGwoc2tiLCBuaCArIG9mZnNldCArIDQgLSBza2ItPmRhdGEpKSkgeworCQkJaWYgKCFvbmx5cHJvdG8gJiYgKG5oICsgb2Zmc2V0ICsgNCA8IHdob2xlX3NrYi0+ZGF0YSB8fAorCQkJcHNrYl9tYXlfcHVsbCh3aG9sZV9za2IsIG5oICsgb2Zmc2V0ICsgNCAtIHdob2xlX3NrYi0+ZGF0YSkpKSB7CiAJCQkJX19iZTE2ICpwb3J0cyA9IChfX2JlMTYgKilleHRoZHI7CiAKIAkJCQlmbDYtPmZsNl9zcG9ydCA9IHBvcnRzWyEhcmV2ZXJzZV07CmRpZmYgLS1naXQgYS9uZXQva2V5L2FmX2tleS5jIGIvbmV0L2tleS9hZl9rZXkuYwppbmRleCAxZTczM2U5Li4xYTcyZWIyIDEwMDY0NAotLS0gYS9uZXQva2V5L2FmX2tleS5jCisrKyBiL25ldC9rZXkvYWZfa2V5LmMKQEAgLTMwLDggKzMwLDE4NCBAQAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKICNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCl8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorI2RlZmluZSBOTEtFWV9TVVBQT1JUIDEKKyNlbHNlIAorI3VuZGVmIE5MS0VZX1NVUFBPUlQKKyNlbmRpZiAKKworI2lmZGVmIE5MS0VZX1NVUFBPUlQKKyNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgorI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CisKKworZXh0ZXJuIHN0cnVjdCBkc3RfZW50cnkgKnhmcm1fZHN0X2xvb2t1cChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IHRvcywKKwkJCQkJCXhmcm1fYWRkcmVzc190ICpwcmV2X3NhZGRyLAorCQkJCQkJeGZybV9hZGRyZXNzX3QgKnByZXZfZGFkZHIsCisJCQkJCQlpbnQgZmFtaWx5KTsKK2V4dGVybiBpbnQgeGZybV9nZXRfdG9zKHN0cnVjdCBmbG93aSAqZmwsIGludCBmYW1pbHkpOworZXh0ZXJuIGludCBpcHNlY19ubGtleV9mbG93KHUxNiB4ZnJtX25yLCB1MTYgKnhmcm1faGFuZGxlLCAKKwkJY29uc3Qgc3RydWN0IGZsb3dpICpmbCwgdTE2IGZhbWlseSwgdTE2IGRpcik7CisKKworI2RlZmluZQlOTEtFWV9TQV9DUkVBVEUJCTB4MEEwMQorI2RlZmluZSBOTEtFWV9TQV9ERUxFVEUJCTB4MEEwMgorI2RlZmluZSBOTEtFWV9TQV9GTFVTSCAJCTB4MEEwMworI2RlZmluZSBOTEtFWV9TQV9TRVRfS0VZUwkweDBBMDQKKyNkZWZpbmUgTkxLRVlfU0FfU0VUX1RVTk5FTAkweDBBMDUKKyNkZWZpbmUgTkxLRVlfU0FfU0VUX05BVFQJMHgwQTA2CisjZGVmaW5lCU5MS0VZX1NBX1NFVF9TVEFURQkweDBBMDcKKyNkZWZpbmUJTkxLRVlfU0FfU0VUX0xJRkVUSU1FCTB4MEEwOAorI2RlZmluZQlOTEtFWV9TQV9OT1RJRlkJCTB4MEEwOQorI2RlZmluZSBOTEtFWV9TQV9JTkZPX1VQREFURQkweDBBMEMKKyNkZWZpbmUJTkxLRVlfRkxPV19BREQJCTB4MEExMQorI2RlZmluZSBOTEtFWV9GTE9XX1JFTU9WRQkweDBBMTIKKyNkZWZpbmUgTkxLRVlfRkxPV19OT1RJRlkJMHgwQTEzCisjZGVmaW5lIE5MS0VZX05VTExfTVNHCQkweDAwMDAKKworI2RlZmluZSBOTEtFWV9IRFJfTEVOCQk0CisjZGVmaW5lIE5MS0VZX01TR19MRU4gCQkyNTYKKworI2RlZmluZSBOTEtFWV9NQVhfTlVNX0tFWVMJMgorI2RlZmluZSBOTEtFWV9NQVhfS0VZX0xFTgkoMjU2IC8gOCkKKworc3RydWN0IG5sa2V5X21zZyB7CisJLyogbWVzc2FnZSBkYXRhICovCisJdW5zaWduZWQgc2hvcnQgZmNvZGU7CisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworCXVuc2lnbmVkIHNob3J0IHBheWxvYWRbKE5MS0VZX01TR19MRU4gL3NpemVvZih1bnNpZ25lZCBzaG9ydCkpXTsKK307CisvKiBzaXplb2YobmxrZXlfbXNnKSA9IDQgKyAyNTYgKi8KKworc3RydWN0IG5sa2V5X3NhX2lkIHsKKwl1bnNpZ25lZCBpbnQgc3BpOworCXVuc2lnbmVkIGNoYXIgc2FfdHlwZTsKKwl1bnNpZ25lZCBjaGFyIHByb3RvX2ZhbWlseTsKKwl1bnNpZ25lZCBjaGFyIHJlcGxheV93aW5kb3c7CisjZGVmaW5lIE5MS0VZX1NBRkxBR1NfRVNOCTB4MQorCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJdW5zaWduZWQgaW50IGRzdF9pcFs0XTsKKwl1bnNpZ25lZCBpbnQgc3JjX2lwWzRdOworCXVuc2lnbmVkIHNob3J0IG10dTsKKwl1bnNpZ25lZCBzaG9ydCBkZXZfbXR1OworCit9OworLyogc2l6ZW9mKG5sa2V5X3NhX2lkKSA9IDI0ICovCisKK3N0cnVjdCBubGtleV9zYV9jcmVhdGUgeworCXVuc2lnbmVkIHNob3J0IHNhZ2Q7CisJdW5zaWduZWQgc2hvcnQgcnN2ZDsKKwlzdHJ1Y3QgbmxrZXlfc2FfaWQgc2FpZDsKK307CisvKiBzaXplb2YobmxrZXlfc2FfZGVsZXRlKSA9IDI4ICovCisKK3N0cnVjdCBubGtleV9zYV9kZWxldGUgeworCXVuc2lnbmVkIHNob3J0IHNhZ2Q7CisJdW5zaWduZWQgc2hvcnQgcnN2ZDsKK307CisvKiBzaXplb2YobmxrZXlfc2FfZGVsZXRlKSA9IDQgKi8KKworc3RydWN0IG5sa2V5X3NhX3NldF90dW5uZWwgeworCXVuc2lnbmVkIHNob3J0IHNhZ2Q7CisJdW5zaWduZWQgY2hhciByc3ZkOworCXVuc2lnbmVkIGNoYXIgcHJvdG9fZmFtaWx5OworCXVuaW9uIHsKKwkJc3RydWN0IGlwaGRyIAkgaXB2NGg7CisJCXN0cnVjdCBpcHY2aGRyIGlwdjZoOworCX0gaDsKK307CisvKiBzaXplb2YobmxrZXlfc2Ffc2V0X3R1bm5lbCkgPSAzNiAqLworCitzdHJ1Y3QgbmxrZXlfc2Ffc2V0X25hdHQgeworCXVuc2lnbmVkIHNob3J0IHNhZ2Q7CisJdW5zaWduZWQgc2hvcnQgc3BvcnQ7CisJdW5zaWduZWQgc2hvcnQgZHBvcnQ7CisJdW5zaWduZWQgc2hvcnQgcnN2ZDsKK307CisvKiBzaXplb2YobmxrZXlfc2Ffc2V0X25hdHQpID0gNCAqLworCitzdHJ1Y3QgbmxrZXlfc2Ffc2V0X3N0YXRlIHsKKwl1bnNpZ25lZCBzaG9ydCBzYWdkOworCXVuc2lnbmVkIHNob3J0IHJzdmQ7CisJdW5zaWduZWQgc2hvcnQgc3RhdGU7CisJdW5zaWduZWQgc2hvcnQgcnN2ZDI7Cit9OworLyogc2l6ZW9mKG5sa2V5X3NhX3NldF9uYXR0KSA9IDggKi8KKworc3RydWN0IG5sa2V5X2tleV9kZXNjIHsKKwl1bnNpZ25lZCBzaG9ydCBrZXlfYml0czsKKwl1bnNpZ25lZCBjaGFyIGtleV9hbGc7CisJdW5zaWduZWQgY2hhciAga2V5X3R5cGU7CisJdW5zaWduZWQgY2hhciBrZXlbTkxLRVlfTUFYX0tFWV9MRU5dOyAKK307CisvKiBzaXplb2YobmxrZXlfa2V5X2Rlc2MpID0gIDM2ICovCisKK3N0cnVjdCBubGtleV9zYV9zZXRfa2V5cyB7CisJdW5zaWduZWQgc2hvcnQgc2FnZDsKKwl1bnNpZ25lZCBzaG9ydCByc3ZkOwkKKwl1bnNpZ25lZCBzaG9ydCBudW1fa2V5czsKKwl1bnNpZ25lZCBzaG9ydCByc3ZkMjsKKwlzdHJ1Y3QgbmxrZXlfa2V5X2Rlc2Mga2V5c1tOTEtFWV9NQVhfTlVNX0tFWVNdOworfTsKKy8qIHNpemVvZihubGtleV9zYV9zZXRfa2V5cykgPSAgODAgKi8KKworc3RydWN0IG5sa2V5X2xpZmV0aW1lX2Rlc2MgeworCXVuc2lnbmVkIGludCBhbGxvY2F0aW9uczsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNbMl07Cit9OworLyogc2l6ZW9mKG5sa2V5X3NhX3NldF9saWZldGltZSkgPSAgMTIgKi8KKworc3RydWN0IG5sa2V5X3NhX3NldF9saWZldGltZSB7CisJdW5zaWduZWQgc2hvcnQgc2FnZDsKKwl1bnNpZ25lZCBzaG9ydCByc3ZkOworCXN0cnVjdCBubGtleV9saWZldGltZV9kZXNjIGhhcmRfdGltZTsKKwlzdHJ1Y3QgbmxrZXlfbGlmZXRpbWVfZGVzYyBzb2Z0X3RpbWU7CisJc3RydWN0IG5sa2V5X2xpZmV0aW1lX2Rlc2MgY3VycmVudF90aW1lOworfTsKKy8qIHNpemVvZihubGtleV9zYV9zZXRfbGlmZXRpbWUpID0gIDQwICovCisKKy8qIFNBIG5vdGlmaWNhdGlvbnMgKi8KKyNkZWZpbmUgSVBTRUNfU09GVF9FWFBJUkUgMAorI2RlZmluZSBJUFNFQ19IQVJEX0VYUElSRSAxCisKK3N0cnVjdCBubGtleV9zYV9ub3RpZnkgeworCXVuc2lnbmVkIHNob3J0IHNhZ2Q7CisJdW5zaWduZWQgc2hvcnQgcnN2ZDsKKwl1bnNpZ25lZCBpbnQgIGFjdGlvbjsKK307CisvKiBzaXplb2YobmxrZXlfc2Ffbm90aWZ5KSA9IDggKi8KKworLyogU0EgSW5mbyB1cGRhdGUgKi8KKworc3RydWN0IG5sa2V5X3NhX2luZm8geworICAgICAgICB1bnNpZ25lZCBzaG9ydCBzYWdkOworICAgICAgICB1bnNpZ25lZCBzaG9ydCByc3ZkOworICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXM7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBwYWNrZXRzOworfTsKKy8qIHNpemVvZihubGtleV9zYV9pbmZvKSA9ICAqLworCisKK3N0YXRpYyBpbnQgaXBzZWNfbmxrZXlfc2VuZChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBjb25zdCBzdHJ1Y3Qga21fZXZlbnQgKmMpOworc3RhdGljIHZvaWQgaXBzZWNfbmxrZXlfcmN2KHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIHZvaWQgaXBzZWNfbmxrZXlfaW5pdCh2b2lkKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpcHNlY19zYWNvZGVfdG9fbmxrZXljb2RlKHVuc2lnbmVkIHNob3J0IHNhX2NvZGUpOworc3RhdGljIHN0cnVjdCBza19idWZmICogaXBzZWNfeGZybTJubGtleSAoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgCisJCQkJCWNvbnN0IHN0cnVjdCBrbV9ldmVudCAqYywgdW5zaWduZWQgc2hvcnQgKm1zZ19pZCk7CitzdGF0aWMgaW50IGlwc2VjX25sa2V5X3NldF9zYWlkKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHhmcm1fc3RhdGUgKngsIGNvbnN0IHN0cnVjdCBrbV9ldmVudCAqYywgc3RydWN0IG5sa2V5X3NhX2lkICpzYWlkKTsKKworLyogbmV0bGluayBORVRMSU5LX0tFWSBzb2NrZXQgKi8KK3N0cnVjdCBzb2NrICpubGtleV9zb2NrZXQgPSBOVUxMOworCisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIAogI2RlZmluZSBfWDJLRVkoeCkgKCh4KSA9PSBYRlJNX0lORiA/IDAgOiAoeCkpCiAjZGVmaW5lIF9LRVkyWCh4KSAoKHgpID09IDAgPyBYRlJNX0lORiA6ICh4KSkKQEAgLTgzNyw2ICsxMDEzLDggQEAKIAkJc2EtPnNhZGJfc2FfZmxhZ3MgfD0gU0FEQl9TQUZMQUdTX0RFQ0FQX0RTQ1A7CiAJaWYgKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9OT1BNVFVESVNDKQogCQlzYS0+c2FkYl9zYV9mbGFncyB8PSBTQURCX1NBRkxBR1NfTk9QTVRVRElTQzsKKwlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX0VTTikKKwkJc2EtPnNhZGJfc2FfZmxhZ3MgfD0gU0FEQl9TQUZMQUdTX0VTTjsKIAogCS8qIGhhcmQgdGltZSAqLwogCWlmIChoc2MgJiAyKSB7CkBAIC0xMTA0LDYgKzEyODIsOCBAQAogCQl4LT5wcm9wcy5mbGFncyB8PSBYRlJNX1NUQVRFX0RFQ0FQX0RTQ1A7CiAJaWYgKHNhLT5zYWRiX3NhX2ZsYWdzICYgU0FEQl9TQUZMQUdTX05PUE1UVURJU0MpCiAJCXgtPnByb3BzLmZsYWdzIHw9IFhGUk1fU1RBVEVfTk9QTVRVRElTQzsKKwlpZiAoc2EtPnNhZGJfc2FfZmxhZ3MgJiBTQURCX1NBRkxBR1NfRVNOKQorCQl4LT5wcm9wcy5mbGFncyB8PSBYRlJNX1NUQVRFX0VTTjsKIAogCWxpZmV0aW1lID0gZXh0X2hkcnNbU0FEQl9FWFRfTElGRVRJTUVfSEFSRCAtIDFdOwogCWlmIChsaWZldGltZSAhPSBOVUxMKSB7CkBAIC0yOTU5LDYgKzMxMzksNyBAQAogCW91dF9oZHItPnNhZGJfbXNnX3BpZCA9IDA7CiAKIAlwZmtleV9icm9hZGNhc3Qob3V0X3NrYiwgR0ZQX0FUT01JQywgQlJPQURDQVNUX1JFR0lTVEVSRUQsIE5VTEwsIHhzX25ldCh4KSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjk2Nyw2ICszMTQ4LDEyIEBACiAJc3RydWN0IG5ldCAqbmV0ID0geCA/IHhzX25ldCh4KSA6IGMtPm5ldDsKIAlzdHJ1Y3QgbmV0bnNfcGZrZXkgKm5ldF9wZmtleSA9IG5ldF9nZW5lcmljKG5ldCwgcGZrZXlfbmV0X2lkKTsKIAorCisjaWZkZWYgTkxLRVlfU1VQUE9SVAorCS8qIHNlbmQgbWVzc2FnZSB0byB0aGUgdXNlciBzcGFjZSB0aHJvdWdoIE5FVExJTktfS0VZIHNvY2tldCovCisJaXBzZWNfbmxrZXlfc2VuZChuZXQsIHgsIGMpOworI2VuZGlmCisKIAlpZiAoYXRvbWljX3JlYWQoJm5ldF9wZmtleS0+c29ja3NfbnIpID09IDApCiAJCXJldHVybiAwOwogCkBAIC0zNzQ4LDYgKzM5MzUsNTkzIEBACiAJLm1pZ3JhdGUJPSBwZmtleV9zZW5kX21pZ3JhdGUsCiB9OwogCisKKyNpZmRlZiBOTEtFWV9TVVBQT1JUCitleHRlcm4gc3RydWN0IHhmcm1fc3RhdGUgKnhmcm1fc3RhdGVfbG9va3VwX2J5aGFuZGxlKHN0cnVjdCBuZXQgKm5ldCwgdTE2IGhhbmRsZSk7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpcHNlY19zYWNvZGVfdG9fbmxrZXljb2RlKHVuc2lnbmVkIHNob3J0IHNhX2NvZGUpCit7CisJdW5zaWduZWQgbmxrZXlfY29kZTsKKworCXN3aXRjaCAoc2FfY29kZSkgCisJeworCQljYXNlIFhGUk1fTVNHX0RFTFNBOgorCQkJbmxrZXlfY29kZSA9IE5MS0VZX1NBX0RFTEVURTsKKwkJCWJyZWFrOworCQljYXNlIFhGUk1fTVNHX05FV1NBOgorCQljYXNlIFhGUk1fTVNHX1VQRFNBOgorCQkJbmxrZXlfY29kZSA9IE5MS0VZX1NBX0NSRUFURTsKKwkJCWJyZWFrOworCQljYXNlIFhGUk1fTVNHX0ZMVVNIU0E6CisJCQlubGtleV9jb2RlID0gTkxLRVlfU0FfRkxVU0g7CisJCQlicmVhazsKKwkJY2FzZSBYRlJNX01TR19FWFBJUkU6CisJCQlubGtleV9jb2RlID0gTkxLRVlfU0FfU0VUX1NUQVRFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlubGtleV9jb2RlID0gTkxLRVlfTlVMTF9NU0c7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbmxrZXlfY29kZTsKK30KKworc3RhdGljIHZvaWQgaXBzZWNfbmxrZXlfcmN2KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBOVUxMOworCXN0cnVjdCBubGtleV9tc2cgKm1zZyA9IE5VTEw7CisJc3RydWN0IGZsb3dpIGZsb3c7CisJdW5zaWduZWQgc2hvcnQgKnA7CisJdW5zaWduZWQgc2hvcnQgZmFtaWx5LCBkaXI7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJc3RydWN0IG5sa2V5X3NhX25vdGlmeSBzYV9ub3RpZnlfbXNnOworCXN0cnVjdCBubGtleV9zYV9pbmZvIHNhX2luZm9fbXNnOworCisJLyogZXh0cmFjdCBtZXNzYWdlIGZyb20gc2tiICovCisJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYi0+ZGF0YTsKKworCW1zZyA9IChzdHJ1Y3QgbmxrZXlfbXNnICopTkxNU0dfREFUQShubGgpOworCisJLy9wcmludGsoS0VSTl9JTkZPICJpcHNlY19ubGtleV9yY3YgZmNvZGU6IDB4JXggbGVuZ3RoOiAlZCBieXRlc1xuIixtc2ctPmZjb2RlLG1zZy0+bGVuZ3RoKTsKKworCS8qIHByb2Nlc3MgY29tbWFuZCByZWNlaXZlZCBmcm9tIHVzZXIgc3BhY2UgKi8KKwlzd2l0Y2gobXNnLT5mY29kZSkKKwl7CisJCWNhc2UgTkxLRVlfRkxPV19SRU1PVkU6CisJCQkvL3ByaW50ayhLRVJOX0lORk8gImlwc2VjX25sa2V5X3JjdiBOTEtFWV9GTE9XX1JFTU9WRVxuIik7CisJCQlwID0gbXNnLT5wYXlsb2FkOworCQkJbWVtY3B5KCZmbG93LCBwLCBzaXplb2Yoc3RydWN0IGZsb3dpKSk7IHAgKz0gc2l6ZW9mKHN0cnVjdCBmbG93aSkvMjsKKwkJCWZhbWlseSA9ICpwOyBwKys7CisJCQlkaXIgPSAqcDsgcCsrOworCQkJZmxvd19jYWNoZV9yZW1vdmUoJmZsb3csIGZhbWlseSwgZGlyKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTkxLRVlfU0FfTk9USUZZOgorCQkJLy9wcmludGsoS0VSTl9JTkZPICJpcHNlY19ubGtleV9yY3YgTkxLRVlfU0FfTk9USUZZXG4iKTsKKwkJCW1lbWNweSgmc2Ffbm90aWZ5X21zZywgbXNnLT5wYXlsb2FkLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX25vdGlmeSkpOworCQkJeCA9IHhmcm1fc3RhdGVfbG9va3VwX2J5aGFuZGxlKCZpbml0X25ldCwgc2Ffbm90aWZ5X21zZy5zYWdkKTsKKwkJCWlmICh4KSB7CisJCQkJc3Bpbl9sb2NrKCZ4LT5sb2NrKTsKKworCQkJCWlmIChzYV9ub3RpZnlfbXNnLmFjdGlvbikgeyAKKwkJCQkJLy8gaGFyZCBleHBpcmVkCisJCQkJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9FWFBJUkVEOworCQkJCQl0YXNrbGV0X2hydGltZXJfc3RhcnQoJngtPm10aW1lciwga3RpbWVfc2V0KDAsMCksIEhSVElNRVJfTU9ERV9SRUwpOworCQkJCX0KKwkJCQllbHNlIGlmICgheC0+a20uZHlpbmcpIHsKKwkJCQkJIHgtPmttLmR5aW5nID0gMTsKKwkJCQkJIGttX3N0YXRlX2V4cGlyZWQoeCwgMCwgMCk7CisJCQkJfQorCisJCQkJc3Bpbl91bmxvY2soJngtPmxvY2spOworCQkJCXhmcm1fc3RhdGVfcHV0KHgpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBOTEtFWV9TQV9JTkZPX1VQREFURToKKwkJCW1lbWNweSgmc2FfaW5mb19tc2csIG1zZy0+cGF5bG9hZCwgc2l6ZW9mKHN0cnVjdCBubGtleV9zYV9pbmZvKSk7CisKKwkJCXggPSB4ZnJtX3N0YXRlX2xvb2t1cF9ieWhhbmRsZSgmaW5pdF9uZXQsc2FfaW5mb19tc2cuc2FnZCk7CisJCQlpZiAoeCkgeworCQkJCXNwaW5fbG9jaygmeC0+bG9jayk7CisKKwkJCQl4LT5jdXJsZnQuYnl0ZXMgPSBzYV9pbmZvX21zZy5ieXRlczsKKwkJCQl4LT5jdXJsZnQucGFja2V0cyA9IHNhX2luZm9fbXNnLnBhY2tldHM7CisKKwkJCQlzcGluX3VubG9jaygmeC0+bG9jayk7CisJCQkJeGZybV9zdGF0ZV9wdXQoeCk7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiaXBzZWNfbmxrZXlfcmN2IGZjb2RlIDB4JXggbm90IHN1cHBvcnRlZFxuIiwgbXNnLT5mY29kZSk7CisJCQlicmVhazsKKwl9CisKK30KKworZXh0ZXJuIHN0cnVjdCBkc3RfZW50cnkgKl9feGZybV9kc3RfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgaW50IHRvcywKKwkJCQkJCSAgeGZybV9hZGRyZXNzX3QgKnNhZGRyLAorCQkJCQkJICB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsCisJCQkJCQkgIGludCBmYW1pbHkpOworc3RhdGljIGludCBpcHNlY19ubGtleV9zZXRfc2FpZChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB4ZnJtX3N0YXRlICp4LCAKKwkJCQljb25zdCBzdHJ1Y3Qga21fZXZlbnQgKmMsIHN0cnVjdCBubGtleV9zYV9pZCAqc2FpZCkKK3sKKworCXN0cnVjdCBmbG93aSBmbDsKKwlpbnQgdG9zOworCXhmcm1fYWRkcmVzc190IHNhZGRyLCBkYWRkcjsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CisJaW50IHJjID0gMDsKKworCW1lbXNldCgmZmwsIDAsIHNpemVvZihzdHJ1Y3QgZmxvd2kpKTsKKworCS8qIFNQSSAqLworCXNhaWQtPnNwaSA9IHgtPmlkLnNwaTsKKwkvKiBTQSBUeXBlIChBSCBvciBFU1ApICovCisJc2FpZC0+c2FfdHlwZSA9IHgtPmlkLnByb3RvOworCS8qIFByb3RvY29sIEZhbWlseSAoSVB2NCBvciBJUHY2KSAqLworCXNhaWQtPnByb3RvX2ZhbWlseSA9IHgtPnByb3BzLmZhbWlseTsKKwkvKiBSZXBsYXkgd2luZG93ICovCisJc2FpZC0+cmVwbGF5X3dpbmRvdyA9IHgtPnByb3BzLnJlcGxheV93aW5kb3c7CisJLyogRGVzdGluYXRpb24gSVAgQWRkcmVzcyAqLworCWlmKHgtPnByb3BzLmZhbWlseSA9PSBBRl9JTkVUNikgeworCQltZW1jcHkoJnNhaWQtPmRzdF9pcCwgeC0+aWQuZGFkZHIuYTYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJaXB2Nl9hZGRyX2NvcHkoJmZsLnUuaXA2LmRhZGRyLCAoc3RydWN0IGluNl9hZGRyICopeC0+aWQuZGFkZHIuYTYpOworCQltZW1jcHkoJnNhaWQtPnNyY19pcCwgeC0+cHJvcHMuc2FkZHIuYTYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwl9CisJZWxzZSB7CisJCXNhaWQtPmRzdF9pcFswXSA9IHgtPmlkLmRhZGRyLmE0OworCQlmbC51LmlwNC5kYWRkciA9IHgtPmlkLmRhZGRyLmE0OworCQlzYWlkLT5zcmNfaXBbMF0gPSB4LT5wcm9wcy5zYWRkci5hNDsKKwl9CisJc2FpZC0+bXR1ID0gMDsKKworCWlmKHgtPnByb3BzLmZsYWdzICYgWEZSTV9TVEFURV9FU04pCisJCXNhaWQtPmZsYWdzID0gTkxLRVlfU0FGTEFHU19FU047CisJeGZybV9mbG93aV9hZGRyX2dldCgmZmwsICZzYWRkciwgJmRhZGRyLCB4LT5wcm9wcy5mYW1pbHkpOworCisJdG9zID0geGZybV9nZXRfdG9zKCZmbCwgeC0+cHJvcHMuZmFtaWx5KTsKKwlpZiAodG9zIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiVkOiBGSVhNRVxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pOwkKKwkJcmMgPSAtMTsKKwkJZ290byBlcnJvcjsKKwl9CisJCisJZHN0ID0gX194ZnJtX2RzdF9sb29rdXAobmV0LCB0b3MsIE5VTEwsICZkYWRkciwgeC0+cHJvcHMuZmFtaWx5KTsKKwlpZiAoSVNfRVJSKGRzdCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczolZDogRklYTUVcbiIsX19GVU5DVElPTl9fLF9fTElORV9fKTsKKwkJcmMgPSAtMTsKKwkJZ290byBlcnJvcjsKKwl9CisJc2FpZC0+ZGV2X210dSA9IGRzdF9tdHUoZHN0KTsKKwlzYWlkLT5tdHUgPSB4ZnJtX3N0YXRlX210dSh4LGRzdF9tdHUoZHN0KSk7CQorCisJZHN0X3JlbGVhc2UoZHN0KTsKK2Vycm9yOgorCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICogaXBzZWNfeGZybTJubGtleSAoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgCisJCQkJCWNvbnN0IHN0cnVjdCBrbV9ldmVudCAqYywgdW5zaWduZWQgc2hvcnQgKm1zZ19pZCkKK3sKKwlzdHJ1Y3QgbmxrZXlfc2FfaWQgc2FfaWRfbXNnOworCXN0cnVjdCBubGtleV9zYV9jcmVhdGUgc2FfY3JlYXRlX21zZzsKKwlzdHJ1Y3QgbmxrZXlfc2FfZGVsZXRlIHNhX2RlbGV0ZV9tc2c7CisJc3RydWN0IG5sa2V5X3NhX3NldF9rZXlzIHNhX3NldF9rZXlzX21zZzsKKwlzdHJ1Y3QgbmxrZXlfc2Ffc2V0X3R1bm5lbCBzYV9zZXRfdHVubmVsX21zZzsKKwlzdHJ1Y3QgbmxrZXlfc2Ffc2V0X25hdHQgc2Ffc2V0X25hdHRfbXNnOworCXN0cnVjdCBubGtleV9zYV9zZXRfc3RhdGUgc2Ffc2V0X3N0YXRlX21zZzsKKwlzdHJ1Y3QgbmxrZXlfc2Ffc2V0X2xpZmV0aW1lIHNhX3NldF9saWZldGltZV9tc2c7CisJc3RydWN0IG5sa2V5X21zZyBtc2c7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBOVUxMOworCWdmcF90IGFsbG9jYXRpb24gPSBpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMOworCXVuc2lnbmVkIGNoYXIgdHVubmVsLCBrZXlzLCBuYXR0LCBzdGF0ZSwgbGlmZXRpbWU7CisKKwkvKiBzdXBwb3J0ZWQgU0EgaW5mb3JtYXRpb25zICovCisJa2V5cyA9IDE7IHN0YXRlID0gMTsgdHVubmVsID0gMTsgbGlmZXRpbWUgPSAxOyBuYXR0ID0gMTsgCisKKwkvKiBuZXh0IG1lc3NhZ2UgdG8gYnVpbGQgKi8KKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKHN0cnVjdCBubGtleV9tc2cpKTsKKwltc2cuZmNvZGUgPSAqbXNnX2lkOworCQorCS8vcHJpbnRrKEtFUk5fSU5GTyAiXG5cbmlwc2VjX3hmcm0ybmxrZXk6IHByb2Nlc3NpbmcgZXZlbnQgMHgleFxuIiwgbXNnLmZjb2RlKTsKKworCXN3aXRjaCAobXNnLmZjb2RlKQorCXsKKwkJY2FzZSBOTEtFWV9TQV9DUkVBVEU6CisJCQkvL3ByaW50ayhLRVJOX0lORk8gImlwc2VjX3hmcm0ybmxrZXk6IE5MS0VZX1NBX0NSRUFURVxuIik7CisJCQlpZih4KSB7CisJCQkJLyogc29tZSBjaGVjayBiZWZvcmUgYnVpbGluZyBtZXNzYWdlICovCisJCQkJaWYoKHgtPmlkLnByb3RvICE9IElQUFJPVE9fRVNQKSAmJiAoeC0+aWQucHJvdG8gIT0gSVBQUk9UT19BSCkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJpcHNlY194ZnJtMm5sa2V5OiBwcm90b2NvbCAlZCBub3Qgc3VwcG9ydGVkXG4iLCB4LT5pZC5wcm90byk7CisJCQkJCSptc2dfaWQgPSBOTEtFWV9OVUxMX01TRzsKKwkJCQkJZ290byBleGl0OworCQkJCX0JCisJCQkJbWVtc2V0KCZzYV9jcmVhdGVfbXNnLCAwLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX2NyZWF0ZSkpOwkKKworCQkJCS8qIFNBIGdsb2JhbCBoYW5kbGVyICovCisJCQkJc2FfY3JlYXRlX21zZy5zYWdkID0geC0+aGFuZGxlOworCisJCQkJLyogU0EgaWRlbnRpZmllciAqLworCQkJCWlmKGlwc2VjX25sa2V5X3NldF9zYWlkKG5ldCwgeCwgYywgJnNhX2NyZWF0ZV9tc2cuc2FpZCkgPCAwKQorCQkJCXsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogc2V0IHNhIElEIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJCQkqbXNnX2lkID0gTkxLRVlfTlVMTF9NU0c7IC8qIG5leHQgbWVzc2FnZSAqLworCQkJCQlnb3RvIGV4aXQ7CisJCQkJfQorCQkJCW1lbWNweShtc2cucGF5bG9hZCwgJnNhX2NyZWF0ZV9tc2csIHNpemVvZihzdHJ1Y3QgbmxrZXlfc2FfY3JlYXRlKSk7CisJCQkJbXNnLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgbmxrZXlfc2FfY3JlYXRlKTsKKwkJCQkqbXNnX2lkID0gTkxLRVlfU0FfU0VUX0tFWVM7IC8qIG5leHQgbWVzc2FnZSAqLworCQkJfSBlbHNlIHsKKwkJCQkqbXNnX2lkID0gTkxLRVlfTlVMTF9NU0c7IC8qIG5leHQgbWVzc2FnZSAqLworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCQorCQkJYnJlYWs7CisKKwkJY2FzZSBOTEtFWV9TQV9TRVRfS0VZUzoKKwkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiaXBzZWNfeGZybTJubGtleTogTkxLRVlfU0FfU0VUX0tFWVNcbiIpOworCQkJaWYoa2V5cykgeworCQkJCW1lbXNldCgmc2Ffc2V0X2tleXNfbXNnLCAwLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX3NldF9rZXlzKSk7CisKKwkJCQkvKiBTQSBnbG9iYWwgaGFuZGxlciAqLworCQkJCXNhX3NldF9rZXlzX21zZy5zYWdkID0geC0+aGFuZGxlOyAKKwkJCQkKKwkJCQkvKiBhdXRoIGtleSAqLworCQkJCWlmKHgtPmFhbGcpIHsKKwkJCQkJaWYgKHgtPmFhbGctPmFsZ19rZXlfbGVuKSB7CisJCQkJCQlzYV9zZXRfa2V5c19tc2cua2V5c1tzYV9zZXRfa2V5c19tc2cubnVtX2tleXNdLmtleV9iaXRzID0geC0+YWFsZy0+YWxnX2tleV9sZW47CisJCQkJCQlzYV9zZXRfa2V5c19tc2cua2V5c1tzYV9zZXRfa2V5c19tc2cubnVtX2tleXNdLmtleV9hbGcgPSB4LT5wcm9wcy5hYWxnbzsKKwkJCQkJCXNhX3NldF9rZXlzX21zZy5rZXlzW3NhX3NldF9rZXlzX21zZy5udW1fa2V5c10ua2V5X3R5cGUgPSAwOworCQkJCQkJbWVtY3B5KHNhX3NldF9rZXlzX21zZy5rZXlzW3NhX3NldF9rZXlzX21zZy5udW1fa2V5c10ua2V5LCB4LT5hYWxnLT5hbGdfa2V5LChzYV9zZXRfa2V5c19tc2cua2V5c1tzYV9zZXRfa2V5c19tc2cubnVtX2tleXNdLmtleV9iaXRzIC8gOCkpOworCQkJCQkJLy9wcmludGsoS0VSTl9JTkZPICJpcHNlY194ZnJtMm5sa2V5OiBBVVRIIC0gYWxnbyAlZCBrZXkgJWQgYml0c1xuIiwgc2Ffc2V0X2tleXNfbXNnLmtleXNbc2Ffc2V0X2tleXNfbXNnLm51bV9rZXlzXS5rZXlfYWxnLCBzYV9zZXRfa2V5c19tc2cua2V5c1tzYV9zZXRfa2V5c19tc2cubnVtX2tleXNdLmtleV9iaXRzKTsKKwkJCQkJCXNhX3NldF9rZXlzX21zZy5udW1fa2V5cysrOworCQkJCQl9CisJCQkJfQorCQkJCS8qIGVuY3J5cHQga2V5ICovCisJCQkJaWYoeC0+ZWFsZykgeworCQkJCQlpZiAoeC0+ZWFsZy0+YWxnX2tleV9sZW4pIHsKKworCQkJCQkJc2Ffc2V0X2tleXNfbXNnLmtleXNbc2Ffc2V0X2tleXNfbXNnLm51bV9rZXlzXS5rZXlfYml0cyA9IHgtPmVhbGctPmFsZ19rZXlfbGVuOworCQkJCQkJc2Ffc2V0X2tleXNfbXNnLmtleXNbc2Ffc2V0X2tleXNfbXNnLm51bV9rZXlzXS5rZXlfYWxnID0geC0+cHJvcHMuZWFsZ287CisJCQkJCQlzYV9zZXRfa2V5c19tc2cua2V5c1tzYV9zZXRfa2V5c19tc2cubnVtX2tleXNdLmtleV90eXBlID0gMTsKKwkJCQkJCW1lbWNweShzYV9zZXRfa2V5c19tc2cua2V5c1tzYV9zZXRfa2V5c19tc2cubnVtX2tleXNdLmtleSwgeC0+ZWFsZy0+YWxnX2tleSwoc2Ffc2V0X2tleXNfbXNnLmtleXNbc2Ffc2V0X2tleXNfbXNnLm51bV9rZXlzXS5rZXlfYml0cyAvIDgpKTsKKwkJCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiaXBzZWNfeGZybTJubGtleTogRU5DUllQVCAtIGFsZ28gJWQga2V5ICVkIGJpdHNcbiIsIHNhX3NldF9rZXlzX21zZy5rZXlzW3NhX3NldF9rZXlzX21zZy5udW1fa2V5c10ua2V5X2FsZywgc2Ffc2V0X2tleXNfbXNnLmtleXNbc2Ffc2V0X2tleXNfbXNnLm51bV9rZXlzXS5rZXlfYml0cyk7CisJCQkJCQlzYV9zZXRfa2V5c19tc2cubnVtX2tleXMrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQltZW1jcHkobXNnLnBheWxvYWQsICZzYV9zZXRfa2V5c19tc2csIHNpemVvZihzdHJ1Y3QgbmxrZXlfc2Ffc2V0X2tleXMpKTsKKwkJCQltc2cubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBubGtleV9zYV9zZXRfa2V5cyk7CisJCQkJKm1zZ19pZCA9IE5MS0VZX1NBX1NFVF9UVU5ORUw7IC8qIG5leHQgbWVzc2FnZSAqLworCQkJfSBlbHNlIHsKKwkJCQkqbXNnX2lkID0gTkxLRVlfU0FfU0VUX1RVTk5FTDsgLyogbmV4dCBtZXNzYWdlICovCisJCQkJZ290byBleGl0OworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBOTEtFWV9TQV9TRVRfVFVOTkVMOgorCQkJLy9wcmludGsoS0VSTl9JTkZPICJpcHNlY194ZnJtMm5sa2V5OiBOTEtFWV9TQV9TRVRfVFVOTkVMXG4iKTsKKwkJCWlmKHR1bm5lbCAmJiAoeC0+cHJvcHMubW9kZSA9PSBYRlJNX01PREVfVFVOTkVMKSkgeworCQkJCW1lbXNldCgmc2Ffc2V0X3R1bm5lbF9tc2csIDAsIHNpemVvZihzdHJ1Y3QgbmxrZXlfc2Ffc2V0X3R1bm5lbCkpOworCisJCQkJLyogU0EgZ2xvYmFsIGhhbmRsZXIgKi8KKwkJCQlzYV9zZXRfdHVubmVsX21zZy5zYWdkID0geC0+aGFuZGxlOyAKKworCQkJCS8qIFR1bm5lbCAqLworCQkJCXNhX3NldF90dW5uZWxfbXNnLnByb3RvX2ZhbWlseSA9IHgtPnByb3BzLmZhbWlseTsKKwkJCQlpZih4LT5wcm9wcy5mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJCQkJc3RydWN0IGlwdjZoZHIgKnRvcF9pcGggPSAmc2Ffc2V0X3R1bm5lbF9tc2cuaC5pcHY2aDsKKwkJCQkJaW50IGRzZmllbGQ7CisJCQkJCXRvcF9pcGgtPnZlcnNpb24gPSA2OworCQkJCQl0b3BfaXBoLT5wcmlvcml0eSA9IDA7CisJCQkJCXRvcF9pcGgtPmZsb3dfbGJsWzBdID0gMDsKKwkJCQkJdG9wX2lwaC0+Zmxvd19sYmxbMV0gPSAwOworCQkJCQl0b3BfaXBoLT5mbG93X2xibFsyXSA9IDA7CisJCQkJCXRvcF9pcGgtPm5leHRoZHIgPSBJUFBST1RPX0lQSVA7CQorCQkJCQlkc2ZpZWxkID0gaXB2Nl9nZXRfZHNmaWVsZCh0b3BfaXBoKTsKKwkJCQkJZHNmaWVsZCA9IElORVRfRUNOX2VuY2Fwc3VsYXRlKGRzZmllbGQsIGRzZmllbGQpOworCQkJCQlpZiAoeC0+cHJvcHMuZmxhZ3MgJiBYRlJNX1NUQVRFX05PRUNOKQorCQkJCQkJZHNmaWVsZCAmPSB+SU5FVF9FQ05fTUFTSzsKKwkJCQkJaXB2Nl9jaGFuZ2VfZHNmaWVsZCh0b3BfaXBoLCAwLCBkc2ZpZWxkKTsKKwkJCQkJdG9wX2lwaC0+aG9wX2xpbWl0ID0gNjQ7CisJCQkJCW1lbWNweSgmdG9wX2lwaC0+ZGFkZHIsIHgtPmlkLmRhZGRyLmE2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCQkJCW1lbWNweSgmdG9wX2lwaC0+c2FkZHIsIHgtPnByb3BzLnNhZGRyLmE2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiaXBzZWNfeGZybTJubGtleTogSVB2NiB0dW5uZWxcbiIpOworCQkJCQkvL3ByaW50ayhLRVJOX0lORk8gImRzdDogJXggJXggJXggJXhcbiIsIHgtPmlkLmRhZGRyLmE2WzBdLCB4LT5pZC5kYWRkci5hNlsxXSwgeC0+aWQuZGFkZHIuYTZbMl0sIHgtPmlkLmRhZGRyLmE2WzNdKTsKKwkJCQkJLy8oS0VSTl9JTkZPICJzcmM6ICV4ICV4ICV4ICV4XG4iLCB4LT5wcm9wcy5zYWRkci5hNlswXSwgeC0+cHJvcHMuc2FkZHIuYTZbMV0sIHgtPnByb3BzLnNhZGRyLmE2WzJdLCB4LT5wcm9wcy5zYWRkci5hNlszXSk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlzdHJ1Y3QgaXBoZHIgKnRvcF9pcGggPSAmc2Ffc2V0X3R1bm5lbF9tc2cuaC5pcHY0aDsKKwkJCQkJdG9wX2lwaC0+aWhsID0gNTsKKwkJCQkJdG9wX2lwaC0+dmVyc2lvbiA9IDQ7CisJCQkJCXRvcF9pcGgtPnRvcyA9IDA7CisJCQkJCXRvcF9pcGgtPmZyYWdfb2ZmID0gMDsgCisJCQkJCXRvcF9pcGgtPnR0bCA9IDY0OworCQkJCQl0b3BfaXBoLT5zYWRkciA9IHgtPnByb3BzLnNhZGRyLmE0OworCQkJCQl0b3BfaXBoLT5kYWRkciA9IHgtPmlkLmRhZGRyLmE0OworCQkJCQkvL3ByaW50ayhLRVJOX0lORk8gImlwc2VjX3hmcm0ybmxrZXk6IElQdjQgdHVubmVsIGRzdDoleCAtIHNyYzoleCBcbiIsIHgtPmlkLmRhZGRyLmE0LCB4LT5wcm9wcy5zYWRkci5hNCk7CisJCQkJfQorCQkJCW1lbWNweShtc2cucGF5bG9hZCwgJnNhX3NldF90dW5uZWxfbXNnLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX3NldF90dW5uZWwpKTsKKwkJCQltc2cubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBubGtleV9zYV9zZXRfdHVubmVsKTsKKwkJCQkqbXNnX2lkID0gTkxLRVlfU0FfU0VUX05BVFQ7IC8qIG5leHQgbWVzc2FnZSAqLworCQkJfSBlbHNlIHsKKwkJCQkqbXNnX2lkID0gTkxLRVlfU0FfU0VUX05BVFQ7IC8qIG5leHQgbWVzc2FnZSAqLworCQkJCWdvdG8gZXhpdDsJCisJCQl9IAorCQkJYnJlYWs7CisKKwkJY2FzZSBOTEtFWV9TQV9TRVRfTkFUVDoKKwkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiaXBzZWNfeGZybTJubGtleTogTkxLRVlfU0FfU0VUX05BVFRcbiIpOworCQkJaWYoKG5hdHQpICYmICh4LT5lbmNhcCkpeworCQkJCW1lbXNldCgmc2Ffc2V0X25hdHRfbXNnLCAwLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX3NldF9uYXR0KSk7CisKKwkJCQkvKiBTQSBnbG9iYWwgaGFuZGxlciAqLworCQkJCXNhX3NldF9uYXR0X21zZy5zYWdkID0geC0+aGFuZGxlOyAKKwkJCQlzYV9zZXRfbmF0dF9tc2cuc3BvcnQgPSB4LT5lbmNhcC0+ZW5jYXBfc3BvcnQ7CisJCQkJc2Ffc2V0X25hdHRfbXNnLmRwb3J0ID0geC0+ZW5jYXAtPmVuY2FwX2Rwb3J0OworCQkJCS8vcHJpbnRrKEtFUk5fSU5GTyAic3JjIHBvcnQ6ICVkICBkc3QgcG9ydDogJWQgXG4iLCBudG9ocyhzYV9zZXRfbmF0dF9tc2cuc3BvcnQpLCBudG9ocyggc2Ffc2V0X25hdHRfbXNnLmRwb3J0KSk7CisJCQkJbWVtY3B5KG1zZy5wYXlsb2FkLCAmc2Ffc2V0X25hdHRfbXNnLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX3NldF9uYXR0KSk7CisJCQkJbXNnLmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgbmxrZXlfc2Ffc2V0X25hdHQpOworCQkJCSptc2dfaWQgPSBOTEtFWV9TQV9TRVRfTElGRVRJTUU7IC8qIG5leHQgbWVzc2FnZSAqLworCQkJfSBlbHNlIHsKKwkJCQkqbXNnX2lkID0gTkxLRVlfU0FfU0VUX0xJRkVUSU1FOyAvKiBuZXh0IG1lc3NhZ2UgKi8KKwkJCQlnb3RvIGV4aXQ7CQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBOTEtFWV9TQV9TRVRfTElGRVRJTUU6CisJCQkvL3ByaW50ayhLRVJOX0lORk8gImlwc2VjX3hmcm0ybmxrZXk6IE5MS0VZX1NBX1NFVF9MSUZFVElNRVxuIik7CisJCQlpZihsaWZldGltZSkgeworCQkJCW1lbXNldCgmc2Ffc2V0X2xpZmV0aW1lX21zZywgMCwgc2l6ZW9mKHN0cnVjdCBubGtleV9zYV9zZXRfbGlmZXRpbWUpKTsKKworCQkJCS8qIFNBIGdsb2JhbCBoYW5kbGVyICovCisJCQkJc2Ffc2V0X2xpZmV0aW1lX21zZy5zYWdkID0geC0+aGFuZGxlOworCisJCQkJLyogaGFyZCB0aW1lICovCisJCQkJc2Ffc2V0X2xpZmV0aW1lX21zZy5oYXJkX3RpbWUuYWxsb2NhdGlvbnMgPSAgX1gyS0VZKHgtPmxmdC5oYXJkX3BhY2tldF9saW1pdCk7CisJCQkJaWYoX1gyS0VZKHgtPmxmdC5oYXJkX2J5dGVfbGltaXQpKQorCQkJCQltZW1jcHkoc2Ffc2V0X2xpZmV0aW1lX21zZy5oYXJkX3RpbWUuYnl0ZXMsICZ4LT5sZnQuaGFyZF9ieXRlX2xpbWl0LCBzaXplb2YodWludDY0X3QpKTsKKworCQkJCS8qIHNvZnQgdGltZSAqLworCQkJCXNhX3NldF9saWZldGltZV9tc2cuc29mdF90aW1lLmFsbG9jYXRpb25zID0gIF9YMktFWSh4LT5sZnQuc29mdF9wYWNrZXRfbGltaXQpOworCQkJCWlmKF9YMktFWSh4LT5sZnQuc29mdF9ieXRlX2xpbWl0KSkKKwkJCQkJbWVtY3B5KHNhX3NldF9saWZldGltZV9tc2cuc29mdF90aW1lLmJ5dGVzLCAmeC0+bGZ0LnNvZnRfYnl0ZV9saW1pdCwgc2l6ZW9mKHVpbnQ2NF90KSk7CisKKwkJCQkvKiBjdXJyZW50IHRpbWUgKi8KKwkJCQlzYV9zZXRfbGlmZXRpbWVfbXNnLmN1cnJlbnRfdGltZS5hbGxvY2F0aW9ucyA9IHgtPmN1cmxmdC5wYWNrZXRzOworCQkJCW1lbWNweShzYV9zZXRfbGlmZXRpbWVfbXNnLmN1cnJlbnRfdGltZS5ieXRlcywgJngtPmN1cmxmdC5ieXRlcywgc2l6ZW9mKHVpbnQ2NF90KSk7CisKKwkJCQltZW1jcHkobXNnLnBheWxvYWQsICZzYV9zZXRfbGlmZXRpbWVfbXNnLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX3NldF9saWZldGltZSkpOworCQkJCW1zZy5sZW5ndGggPSBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX3NldF9saWZldGltZSk7CisJCQkJKm1zZ19pZCA9IE5MS0VZX1NBX1NFVF9TVEFURTsgLyogbmV4dCBtZXNzYWdlICovCisJCQl9IGVsc2UgeworCQkJCSptc2dfaWQgPSBOTEtFWV9TQV9TRVRfU1RBVEU7IC8qIG5leHQgbWVzc2FnZSAqLworCQkJCWdvdG8gZXhpdDsJCisJCQl9CisJCQlicmVhazsKKworCQljYXNlIE5MS0VZX1NBX1NFVF9TVEFURToKKwkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiaXBzZWNfeGZybTJubGtleTogTkxLRVlfU0VUX1NUQVRFXG4iKTsKKwkJCWlmKHN0YXRlKSB7CisJCQkJbWVtc2V0KCZzYV9zZXRfc3RhdGVfbXNnLCAwLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX3NldF9zdGF0ZSkpOworCQkJCW1lbXNldCgmc2FfaWRfbXNnLCAwLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX2lkKSk7CisKKwkJCQkvKiBTQSBnbG9iYWwgaGFuZGxlciAqLworCQkJCXNhX3NldF9zdGF0ZV9tc2cuc2FnZCA9IHgtPmhhbmRsZTsgCisJCQkJLyogU3RhdGUgKi8KKwkJCQlzYV9zZXRfc3RhdGVfbXNnLnN0YXRlID0geC0+a20uc3RhdGU7CisJCQkJLy8gVE9ETzogc2V0IHRoZSBvZmZsb2FkZWQgc3RhdGUgb25jZSBhY2sgcmVjZWl2ZWQgIQorCQkJCXgtPm9mZmxvYWRlZCA9IDE7CisJCQkJYXRvbWljX2luYygmZmxvd19jYWNoZV9nZW5pZCk7CisKKwkJCQltZW1jcHkobXNnLnBheWxvYWQsICZzYV9zZXRfc3RhdGVfbXNnLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX3NldF9zdGF0ZSkpOworCQkJCW1zZy5sZW5ndGggPSBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX3NldF9zdGF0ZSk7CisJCQkJKm1zZ19pZCA9IE5MS0VZX05VTExfTVNHOyAvKiBuZXh0IG1lc3NhZ2UgKi8KKwkJCX0gZWxzZSB7CisJCQkJKm1zZ19pZCA9IE5MS0VZX05VTExfTVNHOyAvKiBuZXh0IG1lc3NhZ2UgKi8KKwkJCQlnb3RvIGV4aXQ7CisJCQl9CisJCQlicmVhazsKKwkJCisJCWNhc2UgTkxLRVlfU0FfREVMRVRFOgorCQkJLy9wcmludGsoS0VSTl9JTkZPICJpcHNlY194ZnJtMm5sa2V5OiBOTEtFWV9TQV9ERUxFVEVcbiIpOworCQkJbWVtc2V0KCZzYV9kZWxldGVfbXNnLCAwLCBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX2RlbGV0ZSkpOworCQkJCisJCQkvKiBTQSBnbG9iYWwgaGFuZGxlciAqLworCQkJc2FfZGVsZXRlX21zZy5zYWdkID0geC0+aGFuZGxlOworCQkJbWVtY3B5KG1zZy5wYXlsb2FkLCAmc2FfZGVsZXRlX21zZywgc2l6ZW9mKHN0cnVjdCBubGtleV9zYV9kZWxldGUpKTsKKwkJCW1zZy5sZW5ndGggPSBzaXplb2Yoc3RydWN0IG5sa2V5X3NhX2RlbGV0ZSk7CisJCQlhdG9taWNfaW5jKCZmbG93X2NhY2hlX2dlbmlkKTsKKworCisJCQkqbXNnX2lkID0gTkxLRVlfTlVMTF9NU0c7IC8qIG5leHQgbWVzc2FnZSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBOTEtFWV9TQV9GTFVTSDoKKwkJCS8vcHJpbnRrKEtFUk5fSU5GTyAiaXBzZWNfeGZybTJubGtleTogTkxLRVlfU0FfRkxVU0hcbiIpOworCQkJLyogTm8gZGF0YSByZXF1aXJlZCBmb3IgZmx1c2ggU0EgY29tbWFuZCAqLworCQkJYXRvbWljX2luYygmZmxvd19jYWNoZV9nZW5pZCk7CisKKwkJCSptc2dfaWQgPSBOTEtFWV9OVUxMX01TRzsgLyogbmV4dCBtZXNzYWdlICovCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJpcHNlY194ZnJtMm5sa2V5OiBldmVudCAweCV4IG5vdCBzdXBwb3J0ZWRcbiIsIGMtPmV2ZW50KTsKKwkJCSptc2dfaWQgPSBOTEtFWV9OVUxMX01TRzsgLyogbmV4dCBtZXNzYWdlICovCisJCQlicmVhazsKKwl9CisKKwkvKiBwcmVwYXJlIG5ldGxpbmsgbWVzc2FnZSBmb3Iga2VybmVsIHRvIHVzZXIgc3BhY2UgZGlyZWN0aW9uICovCisJaWYobXNnLmxlbmd0aCA+IE5MS0VZX01TR19MRU4pCisJeworCQlwcmludGsoS0VSTl9FUlIgImlwc2VjX3hmcm0ybmxrZXk6IG1heGltdW0gbWVzc2FnZSBzaXplIHJlYWNoZWQgKCVkIGJ5dGVzKVxuIiwgbXNnLmxlbmd0aCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlza2IgPSBhbGxvY19za2IoTkxNU0dfU1BBQ0UoTkxLRVlfTVNHX0xFTiArIE5MS0VZX0hEUl9MRU4pLCBhbGxvY2F0aW9uKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCWdvdG8gZXhpdDsKKwkJCisJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKXNrYl9wdXQoc2tiLCBOTE1TR19TUEFDRShOTEtFWV9IRFJfTEVOICsgbXNnLmxlbmd0aCkpOworCW1lbWNweShOTE1TR19EQVRBKG5saCksICh1bnNpZ25lZCBjaGFyICopJm1zZywgKE5MS0VZX0hEUl9MRU4gKyBtc2cubGVuZ3RoKSk7CisJCisJLyogd2hvbGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGkuZS4gaGVhZGVyICsgcGF5bG9hZCAqLworCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfU1BBQ0UoTkxLRVlfSERSX0xFTiArIG1zZy5sZW5ndGgpOworCisJLyogZnJvbSBrZXJuZWwgKi8KKwlubGgtPm5sbXNnX3BpZCA9IDA7CisJbmxoLT5ubG1zZ19mbGFncyA9IDA7CisgICAgICAgIG5saC0+bmxtc2dfdHlwZSA9IDA7CisJTkVUTElOS19DQihza2IpLnBpZCA9IDA7CisJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IDE7CitleGl0OgorCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgaXBzZWNfbmxrZXlfc2VuZChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBjb25zdCBzdHJ1Y3Qga21fZXZlbnQgKmMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBzaG9ydCBtc2dfdHlwZTsKKwlpbnQgcmMgPSAwOworCisJLyogV2UgbWF5IGdlbmVyYXRlIG1vcmUgdGhhbiBvbmUgbWVzc2FnZSB3aGVuIGFkZGluZyBuZXcgU0EgKHNhX2NyZWF0ZSArIHNhX3NldF9zdGF0ZSArIHNhX3NldF90dW5uZWwuLi4pICovCisJbXNnX3R5cGUgPSBpcHNlY19zYWNvZGVfdG9fbmxrZXljb2RlKCh1bnNpZ25lZCBzaG9ydCljLT5ldmVudCk7CisKKwl3aGlsZShtc2dfdHlwZSAhPSBOTEtFWV9OVUxMX01TRykKKwl7CisJCS8qIGJ1aWxkIG5sa2V5IG1lc3NhZ2UgKi8KKwkJc2tiID0gaXBzZWNfeGZybTJubGtleShuZXQsIHgsIGMsICZtc2dfdHlwZSk7CisKKwkJaWYoc2tiICE9IE5VTEwpCisJCQlpZigocmMgPSBuZXRsaW5rX2Jyb2FkY2FzdChubGtleV9zb2NrZXQsIHNrYiwgMCwgMSwgR0ZQX0FUT01JQykpIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHJjOworfQorCisKK2ludCBpcHNlY19ubGtleV9mbG93KHUxNiB4ZnJtX25yLCB1MTYgKnhmcm1faGFuZGxlLCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZsLCB1MTYgZmFtaWx5LCB1MTYgZGlyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sa2V5X21zZyBtc2c7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBOVUxMOworCXVuc2lnbmVkIHNob3J0ICpwOworCWdmcF90IGFsbG9jYXRpb24gPSBpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMOworCisJLy9wcmludGsoS0VSTl9JTkZPICJpcHNlY19ubGtleV9mbG93IFxuIik7CisKKwkvKiBuZXh0IG1lc3NhZ2UgdG8gYnVpbGQgKi8KKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKHN0cnVjdCBubGtleV9tc2cpKTsKKwltc2cuZmNvZGUgPSBOTEtFWV9GTE9XX0FERDsKKworCS8vIE51bWJlciBvZiBTQSBmb3IgdGhpcyBmbG93CisJcCA9IG1zZy5wYXlsb2FkOworCSpwKysgPSB4ZnJtX25yOworCW1zZy5sZW5ndGggKz0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwkvLyBTQSBoYW5kbGVzIGxpc3QKKwltZW1jcHkocCwgeGZybV9oYW5kbGUsIHhmcm1fbnIqc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisJbXNnLmxlbmd0aCArPSB4ZnJtX25yKnNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJcCs9eGZybV9ucjsKKwkvLyBmbG93IGZhbWlseQorCSpwKysgPSBmYW1pbHk7CisJbXNnLmxlbmd0aCArPSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCS8vIGZsb3cgZmFtaWx5CisJKnArKyA9IGRpcjsKKwltc2cubGVuZ3RoICs9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJLy8gZmxvdyBkZXNjcmlwdG9yCisJbWVtY3B5KHAsIGZsLCBzaXplb2Yoc3RydWN0IGZsb3dpKSk7CisJbXNnLmxlbmd0aCArPXNpemVvZihzdHJ1Y3QgZmxvd2kpOworCXArPXNpemVvZihzdHJ1Y3QgZmxvd2kpIC8gc2l6ZW9mKHUxNik7CisKKwlza2IgPSBhbGxvY19za2IoTkxNU0dfU1BBQ0UoTkxLRVlfTVNHX0xFTiArIE5MS0VZX0hEUl9MRU4pLCBhbGxvY2F0aW9uKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogcHJlcGFyZSBuZXRsaW5rIG1lc3NhZ2UgZm9yIGtlcm5lbCB0byB1c2VyIHNwYWNlIGRpcmVjdGlvbiAqLworCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2JfcHV0KHNrYiwgTkxNU0dfU1BBQ0UoTkxLRVlfSERSX0xFTiArIG1zZy5sZW5ndGgpKTsKKwltZW1jcHkoTkxNU0dfREFUQShubGgpLCAodW5zaWduZWQgY2hhciAqKSZtc2csIChOTEtFWV9IRFJfTEVOICsgbXNnLmxlbmd0aCkpOworCisJLyogd2hvbGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIGkuZS4gaGVhZGVyICsgcGF5bG9hZCAqLworCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfU1BBQ0UoTkxLRVlfSERSX0xFTiArIG1zZy5sZW5ndGgpOworCisJLyogZnJvbSBrZXJuZWwgKi8KKwlubGgtPm5sbXNnX3BpZCA9IDA7IAorCW5saC0+bmxtc2dfZmxhZ3MgPSAwOworICAgICAgICBubGgtPm5sbXNnX3R5cGUgPSAwOworCU5FVExJTktfQ0Ioc2tiKS5waWQgPSAwOworCU5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXAgPSAxOworCisJcmV0dXJuKG5ldGxpbmtfYnJvYWRjYXN0KG5sa2V5X3NvY2tldCwgc2tiLCAwLCAxLCBhbGxvY2F0aW9uKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlwc2VjX25sa2V5X2Zsb3cpOworCisKK2ludCBpcHNlY19ubGtleV9mbG93X3JlbW92ZShzdHJ1Y3QgZmxvd2kgKmZsLCB1MTYgZmFtaWx5LCB1MTYgZGlyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sa2V5X21zZyBtc2c7CisJc3RydWN0IG5sbXNnaGRyICpubGggPSBOVUxMOworCXVuc2lnbmVkIHNob3J0ICpwOworCWdmcF90IGFsbG9jYXRpb24gPSBpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMOworCisJCisJLy9wcmludGsoS0VSTl9JTkZPICJpcHNlY19ubGtleV9mbG93X3JlbW92ZVxuIik7CisKKwkvKiBuZXh0IG1lc3NhZ2UgdG8gYnVpbGQgKi8KKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKHN0cnVjdCBubGtleV9tc2cpKTsKKwltc2cuZmNvZGUgPSBOTEtFWV9GTE9XX1JFTU9WRTsKKworCXAgPSBtc2cucGF5bG9hZDsKKwkvLyBmbG93IGZhbWlseQorCSpwKysgPSBmYW1pbHk7CisJbXNnLmxlbmd0aCArPSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCS8vIGZsb3cgZmFtaWx5CisJKnArKyA9IGRpcjsKKwltc2cubGVuZ3RoICs9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJLy8gZmxvdyBkZXNjcmlwdG9yCisJbWVtY3B5KHAsIGZsLCBzaXplb2Yoc3RydWN0IGZsb3dpKSk7CisJbXNnLmxlbmd0aCArPXNpemVvZihzdHJ1Y3QgZmxvd2kpOworCXArPXNpemVvZihzdHJ1Y3QgZmxvd2kpIC8gc2l6ZW9mKHUxNik7CisKKwlza2IgPSBhbGxvY19za2IoTkxNU0dfU1BBQ0UoTkxLRVlfTVNHX0xFTiArIE5MS0VZX0hEUl9MRU4pLCBhbGxvY2F0aW9uKTsKKwlpZiAoc2tiID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogcHJlcGFyZSBuZXRsaW5rIG1lc3NhZ2UgZm9yIGtlcm5lbCB0byB1c2VyIHNwYWNlIGRpcmVjdGlvbiAqLworCW5saCA9IChzdHJ1Y3Qgbmxtc2doZHIgKilza2JfcHV0KHNrYiwgTkxNU0dfU1BBQ0UoTkxLRVlfSERSX0xFTiArIG1zZy5sZW5ndGgpKTsKKwltZW1jcHkoTkxNU0dfREFUQShubGgpLCAodW5zaWduZWQgY2hhciAqKSZtc2csIChOTEtFWV9IRFJfTEVOICsgbXNnLmxlbmd0aCkpOworCQorCS8qIHdob2xlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBpLmUuIGhlYWRlciArIHBheWxvYWQgKi8KKwlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX1NQQUNFKE5MS0VZX0hEUl9MRU4gKyBtc2cubGVuZ3RoKTsKKworCS8qIGZyb20ga2VybmVsICovCisJbmxoLT5ubG1zZ19waWQgPSAwOyAKKwlubGgtPm5sbXNnX2ZsYWdzID0gMDsKKyAgICAgICAgbmxoLT5ubG1zZ190eXBlID0gMDsKKwlORVRMSU5LX0NCKHNrYikucGlkID0gMDsKKwlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gMTsJCisKKwkJCisgICAgICAgIHJldHVybihuZXRsaW5rX2Jyb2FkY2FzdChubGtleV9zb2NrZXQsIHNrYiwgMCwgMSwgYWxsb2NhdGlvbikpOworCisJCit9CitFWFBPUlRfU1lNQk9MKGlwc2VjX25sa2V5X2Zsb3dfcmVtb3ZlKTsKKworCisKK3N0YXRpYyB2b2lkIGlwc2VjX25sa2V5X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJJbml0aWFsaXppbmcgTkVUTElOS19LRVkgc29ja2V0XG4iKTsKKworCW5sa2V5X3NvY2tldCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZSgmaW5pdF9uZXQsIE5FVExJTktfS0VZLCAxLAorCQkJCSAgICAgaXBzZWNfbmxrZXlfcmN2LCBOVUxMLCBUSElTX01PRFVMRSk7Cit9CisjZW5kaWYKKworCiBzdGF0aWMgaW50IF9fbmV0X2luaXQgcGZrZXlfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBuZXRuc19wZmtleSAqbmV0X3Bma2V5ID0gbmV0X2dlbmVyaWMobmV0LCBwZmtleV9uZXRfaWQpOwpAQCAtMzc4Miw2ICs0NTU2LDExIEBACiAJc29ja191bnJlZ2lzdGVyKFBGX0tFWSk7CiAJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZwZmtleV9uZXRfb3BzKTsKIAlwcm90b191bnJlZ2lzdGVyKCZrZXlfcHJvdG8pOworCisjaWZkZWYgTkxLRVlfU1VQUE9SVAorCS8qIHJlbGVhc2UgTkVUTElOS19LRVkgc29ja2V0ICovCisJc29ja19yZWxlYXNlKG5sa2V5X3NvY2tldC0+c2tfc29ja2V0KTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpcHNlY19wZmtleV9pbml0KHZvaWQpCkBAIC0zODAwLDYgKzQ1NzksMTIgQEAKIAllcnIgPSB4ZnJtX3JlZ2lzdGVyX2ttKCZwZmtleXYyX21ncik7CiAJaWYgKGVyciAhPSAwKQogCQlnb3RvIG91dF9zb2NrX3VucmVnaXN0ZXI7CisKKyNpZmRlZiBOTEtFWV9TVVBQT1JUCisJLyogY3JlYXRlIE5FVExJTktfS0VZIHNvY2tldCBmb3IgSVBTZWMgb2ZmbG9hZCBvbiBDb21jZXJ0byAqLworCWlwc2VjX25sa2V5X2luaXQoKTsKKyNlbmRpZgorCiBvdXQ6CiAJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9jb3JlLmMgYi9uZXQvbDJ0cC9sMnRwX2NvcmUuYwppbmRleCA4OWZmOGM2Li43NTAxYjIyIDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX2NvcmUuYworKysgYi9uZXQvbDJ0cC9sMnRwX2NvcmUuYwpAQCAtMTI1MywxMSArMTI1MywxMCBAQAogCS8qIFJlbW92ZSBmcm9tIHR1bm5lbCBsaXN0ICovCiAJc3Bpbl9sb2NrX2JoKCZwbi0+bDJ0cF90dW5uZWxfbGlzdF9sb2NrKTsKIAlsaXN0X2RlbF9yY3UoJnR1bm5lbC0+bGlzdCk7CisJa2ZyZWVfcmN1KHR1bm5lbCwgcmN1KTsKIAlzcGluX3VubG9ja19iaCgmcG4tPmwydHBfdHVubmVsX2xpc3RfbG9jayk7Ci0Jc3luY2hyb25pemVfcmN1KCk7CiAKIAlhdG9taWNfZGVjKCZsMnRwX3R1bm5lbF9jb3VudCk7Ci0Ja2ZyZWUodHVubmVsKTsKIH0KIAogLyogQ3JlYXRlIGEgc29ja2V0IGZvciB0aGUgdHVubmVsLCBpZiBvbmUgaXNuJ3Qgc2V0IHVwIGJ5CmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2NvcmUuaCBiL25ldC9sMnRwL2wydHBfY29yZS5oCmluZGV4IGExNmE0OGUuLjQzOTM3OTQgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfY29yZS5oCisrKyBiL25ldC9sMnRwL2wydHBfY29yZS5oCkBAIC0xNTcsNiArMTU3LDcgQEAKIAogc3RydWN0IGwydHBfdHVubmVsIHsKIAlpbnQJCQltYWdpYzsJCS8qIFNob3VsZCBiZSBMMlRQX1RVTk5FTF9NQUdJQyAqLworCXN0cnVjdCByY3VfaGVhZCByY3U7CiAJcndsb2NrX3QJCWhsaXN0X2xvY2s7CS8qIHByb3RlY3Qgc2Vzc2lvbl9obGlzdCAqLwogCXN0cnVjdCBobGlzdF9oZWFkCXNlc3Npb25faGxpc3RbTDJUUF9IQVNIX1NJWkVdOwogCQkJCQkJLyogaGFzaGVkIGxpc3Qgb2Ygc2Vzc2lvbnMsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCAwNDI3Y2JkLi5lMWUxY2VkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTYsNiArNiw4IEBACiAKIG9iai0kKENPTkZJR19ORVRGSUxURVIpID0gbmV0ZmlsdGVyLm8KIAorb2JqLSQoQ09ORklHX0NPTUNFUlRPX0ZQKSArPSBjb21jZXJ0b19mcF9uZXRmaWx0ZXIubworCiBvYmotJChDT05GSUdfTkVURklMVEVSX05FVExJTkspICs9IG5mbmV0bGluay5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUUpICs9IG5mbmV0bGlua19xdWV1ZS5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX05FVExJTktfTE9HKSArPSBuZm5ldGxpbmtfbG9nLm8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvY29tY2VydG9fZnBfbmV0ZmlsdGVyLmMgYi9uZXQvbmV0ZmlsdGVyL2NvbWNlcnRvX2ZwX25ldGZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNmVmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL2NvbWNlcnRvX2ZwX25ldGZpbHRlci5jCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvbmV0L2NvbWNlcnRvL2ZwX25ldGZpbHRlci5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBNaW5kc3BlZWQgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KKworc3RhdGljIHVuc2lnbmVkIGludCBmcF9uZXRmaWx0ZXJfcHJlX3JvdXRpbmcoaW50IGZhbWlseSwgdW5zaWduZWQgaW50IGhvb2tudW0sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5mX2Nvbm4gKmN0OworCXVfaW50OF90IHByb3RvbnVtOworCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCXN0cnVjdCBjb21jZXJ0b19mcF9pbmZvICpmcF9pbmZvOworCWludCBkaXI7CisKKwljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOworCWlmICghY3QpCisJCWdvdG8gZG9uZTsKKworCXByb3RvbnVtID0gbmZfY3RfcHJvdG9udW0oY3QpOworCWlmICgocHJvdG9udW0gIT0gSVBQUk9UT19UQ1ApICYmIChwcm90b251bSAhPSBJUFBST1RPX1VEUCkgJiYgKHByb3RvbnVtICE9IElQUFJPVE9fSVBJUCkpCisJCWdvdG8gZG9uZTsKKworCWRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKKworLy8JaWYgKHByaW50a19yYXRlbGltaXQoKSkKKy8vCQlwcmludGsoS0VSTl9JTkZPICJjdDogJWx4LCBkaXI6ICV4LCBtYXJrOiAleCwgaWZpbmRleDogJWQgaWlmOiAlZFxuIiwgKHVuc2lnbmVkIGxvbmcpY3QsIGRpciwgc2tiLT5tYXJrLCBza2ItPmRldi0+aWZpbmRleCwgc2tiLT5za2JfaWlmKTsKKworCS8qIFdlIGNvdWxkIGFsc28gY2hlY2sgZm9yIGNoYW5nZXMgYW5kIG5vdGlmeSB1c2Vyc3BhY2UgKG9yIHByaW50IG1lc3NhZ2UpICovCisJaWYgKGRpciA9PSBJUF9DVF9ESVJfT1JJR0lOQUwpIHsKKwkJZnBfaW5mbyA9ICZjdC0+ZnBfaW5mb1tJUF9DVF9ESVJfT1JJR0lOQUxdOworCX0gZWxzZSB7CisJCWZwX2luZm8gPSAmY3QtPmZwX2luZm9bSVBfQ1RfRElSX1JFUExZXTsKKwl9CisKKwlpZiAoZnBfaW5mby0+bWFyayAmJiAoZnBfaW5mby0+bWFyayAhPSBza2ItPm1hcmspKQorCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3Q6IG1hcmsgY2hhbmdlZCAleCwgJXhcbiIsIGZwX2luZm8tPm1hcmssIHNrYi0+bWFyayk7CisKKwlpZiAoZnBfaW5mby0+aWZpbmRleCAmJiAoZnBfaW5mby0+aWZpbmRleCAhPSBza2ItPmRldi0+aWZpbmRleCkpCisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9JTkZPICJjdDogaWZpbmRleCBjaGFuZ2VkICVkLCAlZFxuIiwgZnBfaW5mby0+aWZpbmRleCwgc2tiLT5kZXYtPmlmaW5kZXgpOworCisJaWYgKGZwX2luZm8tPmlpZiAmJiAoZnBfaW5mby0+aWlmICE9IHNrYi0+c2tiX2lpZikpCisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9JTkZPICJjdDogaWlmIGNoYW5nZWQgJWQsICVkXG4iLCBmcF9pbmZvLT5paWYsIHNrYi0+c2tiX2lpZik7CisKKwlmcF9pbmZvLT5tYXJrID0gc2tiLT5tYXJrOworCWZwX2luZm8tPmlmaW5kZXggPSBza2ItPmRldi0+aWZpbmRleDsKKwlmcF9pbmZvLT5paWYgPSBza2ItPnNrYl9paWY7CisKK2RvbmU6CisJcmV0dXJuIE5GX0FDQ0VQVDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBmcF9pcHY0X25ldGZpbHRlcl9wcmVfcm91dGluZyh1bnNpZ25lZCBpbnQgaG9va251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKworCXJldHVybiBmcF9uZXRmaWx0ZXJfcHJlX3JvdXRpbmcoUEZfSU5FVCwgaG9va251bSwgc2tiKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBmcF9pcHY2X25ldGZpbHRlcl9wcmVfcm91dGluZyh1bnNpZ25lZCBpbnQgaG9va251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKworCXJldHVybiBmcF9uZXRmaWx0ZXJfcHJlX3JvdXRpbmcoUEZfSU5FVDYsIGhvb2tudW0sIHNrYik7Cit9CisKKworc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBmcF9uZXRmaWx0ZXJfb3BzW10gX19yZWFkX21vc3RseSA9IHsKKwl7CisJCS5ob29rCQk9IGZwX2lwdjRfbmV0ZmlsdGVyX3ByZV9yb3V0aW5nLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBORlBST1RPX0lQVjQsCisJCS5ob29rbnVtCT0gTkZfSU5FVF9QUkVfUk9VVElORywKKwkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0xBU1QsCisJfSwKKwl7CisJCS5ob29rCQk9IGZwX2lwdjZfbmV0ZmlsdGVyX3ByZV9yb3V0aW5nLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5wZgkJPSBORlBST1RPX0lQVjYsCisJCS5ob29rbnVtCT0gTkZfSU5FVF9QUkVfUk9VVElORywKKwkJLnByaW9yaXR5CT0gTkZfSVBfUFJJX0xBU1QsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGZwX25ldGZpbHRlcl9pbml0KHZvaWQpCit7CisJaW50IHJjOworCisJcmMgPSBuZl9yZWdpc3Rlcl9ob29rcyhmcF9uZXRmaWx0ZXJfb3BzLCBBUlJBWV9TSVpFKGZwX25ldGZpbHRlcl9vcHMpKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZnBfbmV0ZmlsdGVyX29wczogY2FuJ3QgcmVnaXN0ZXIgaG9va3MuXG4iKTsKKwkJZ290byBlcnIwOworCX0KKworCXJldHVybiAwOworCitlcnIwOgorCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgZnBfbmV0ZmlsdGVyX2V4aXQodm9pZCkKK3sKKwluZl91bnJlZ2lzdGVyX2hvb2tzKGZwX25ldGZpbHRlcl9vcHMsIEFSUkFZX1NJWkUoZnBfbmV0ZmlsdGVyX29wcykpOworfQorCittb2R1bGVfaW5pdChmcF9uZXRmaWx0ZXJfaW5pdCk7Cittb2R1bGVfZXhpdChmcF9uZXRmaWx0ZXJfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKaW5kZXggODg0ZTIyNy4uM2QzNjIyYWMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKQEAgLTI1NSwxMiArMjU1LDE1IEBACiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0ID0gKHZvaWQgKil1bF9jb25udHJhY2s7CiAJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlID0gbmZfY3RfZWNhY2hlX2ZpbmQoY3QpOworCisJQlVHX09OKGVjYWNoZSA9PSBOVUxMKTsKIAogCWlmIChuZl9jb25udHJhY2tfZXZlbnQoSVBDVF9ERVNUUk9ZLCBjdCkgPCAwKSB7CiAJCS8qIGJhZCBsdWNrLCBsZXQncyByZXRyeSBhZ2FpbiAqLwotCQljdC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArCisJCWVjYWNoZS0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArCiAJCQkocmFuZG9tMzIoKSAlIG5ldC0+Y3Quc3lzY3RsX2V2ZW50c19yZXRyeV90aW1lb3V0KTsKLQkJYWRkX3RpbWVyKCZjdC0+dGltZW91dCk7CisJCWFkZF90aW1lcigmZWNhY2hlLT50aW1lb3V0KTsKIAkJcmV0dXJuOwogCX0KIAkvKiB3ZSd2ZSBnb3QgdGhlIGV2ZW50IGRlbGl2ZXJlZCwgbm93IGl0J3MgZHlpbmcgKi8KQEAgLTI3NCw2ICsyNzcsOSBAQAogdm9pZCBuZl9jdF9pbnNlcnRfZHlpbmdfbGlzdChzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZWNhY2hlID0gbmZfY3RfZWNhY2hlX2ZpbmQoY3QpOworCisJQlVHX09OKGVjYWNoZSA9PSBOVUxMKTsKIAogCS8qIGFkZCB0aGlzIGNvbm50cmFjayB0byB0aGUgZHlpbmcgbGlzdCAqLwogCXNwaW5fbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwpAQCAtMjgxLDEwICsyODcsMTAgQEAKIAkJCSAgICAgJm5ldC0+Y3QuZHlpbmcpOwogCXNwaW5fdW5sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJLyogc2V0IGEgbmV3IHRpbWVyIHRvIHJldHJ5IGV2ZW50IGRlbGl2ZXJ5ICovCi0Jc2V0dXBfdGltZXIoJmN0LT50aW1lb3V0LCBkZWF0aF9ieV9ldmVudCwgKHVuc2lnbmVkIGxvbmcpY3QpOwotCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsKKwlzZXR1cF90aW1lcigmZWNhY2hlLT50aW1lb3V0LCBkZWF0aF9ieV9ldmVudCwgKHVuc2lnbmVkIGxvbmcpY3QpOworCWVjYWNoZS0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArCiAJCShyYW5kb20zMigpICUgbmV0LT5jdC5zeXNjdGxfZXZlbnRzX3JldHJ5X3RpbWVvdXQpOwotCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOworCWFkZF90aW1lcigmZWNhY2hlLT50aW1lb3V0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2luc2VydF9keWluZ19saXN0KTsKIApAQCAtMjkyLDExICsyOTgsMzYgQEAKIHsKIAlzdHJ1Y3QgbmZfY29ubiAqY3QgPSAodm9pZCAqKXVsX2Nvbm50cmFjazsKIAlzdHJ1Y3QgbmZfY29ubl90c3RhbXAgKnRzdGFtcDsKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fRlAKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CisjZW5kaWYKIAogCXRzdGFtcCA9IG5mX2Nvbm5fdHN0YW1wX2ZpbmQoY3QpOwogCWlmICh0c3RhbXAgJiYgdHN0YW1wLT5zdG9wID09IDApCiAJCXRzdGFtcC0+c3RvcCA9IGt0aW1lX3RvX25zKGt0aW1lX2dldF9yZWFsKCkpOwogCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX0ZQCisJbDRwcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKG5mX2N0X2wzbnVtKGN0KSwgbmZfY3RfcHJvdG9udW0oY3QpKTsKKworCWlmICh0ZXN0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cykgfHwKKwkgICAoIXRlc3RfYml0KElQU19QRVJNQU5FTlRfQklULCAmY3QtPnN0YXR1cykpIHx8CisJICAgKChsNHByb3RvLT5sNHByb3RvID09IElQUFJPVE9fVENQKSAmJiAoY3QtPnByb3RvLnRjcC5zdGF0ZSAhPSBUQ1BfQ09OTlRSQUNLX0VTVEFCTElTSEVEKSkpIHsKKwkJaWYgKCF0ZXN0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cykgJiYKKwkJICAgIHVubGlrZWx5KG5mX2Nvbm50cmFja19ldmVudChJUENUX0RFU1RST1ksIGN0KSA8IDApKSB7CisJCQkvKiBkZXN0cm95IGV2ZW50IHdhcyBub3QgZGVsaXZlcmVkICovCisJCQluZl9jdF9kZWxldGVfZnJvbV9saXN0cyhjdCk7CisJCQluZl9jdF9pbnNlcnRfZHlpbmdfbGlzdChjdCk7CisJCQlyZXR1cm47CisJCX0KKwkJc2V0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cyk7CisJCW5mX2N0X2RlbGV0ZV9mcm9tX2xpc3RzKGN0KTsKKwkJbmZfY3RfcHV0KGN0KTsKKwl9IGVsc2UgeworCQljdC0+dGltZW91dC5leHBpcmVzID0gamlmZmllcyArIENPTUNFUlRPX1BFUk1BTkVOVF9USU1FT1VUICogSFo7CisJCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOworCX0KKyNlbHNlCisKIAlpZiAoIXRlc3RfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKSAmJgogCSAgICB1bmxpa2VseShuZl9jb25udHJhY2tfZXZlbnQoSVBDVF9ERVNUUk9ZLCBjdCkgPCAwKSkgewogCQkvKiBkZXN0cm95IGV2ZW50IHdhcyBub3QgZGVsaXZlcmVkICovCkBAIC0zMDcsNiArMzM4LDcgQEAKIAlzZXRfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKTsKIAluZl9jdF9kZWxldGVfZnJvbV9saXN0cyhjdCk7CiAJbmZfY3RfcHV0KGN0KTsKKyNlbmRpZgogfQogCiAvKgpAQCAtNjEwLDEwICs2NDIsMjAgQEAKIAlpZiAoIWN0KQogCQlyZXR1cm4gZHJvcHBlZDsKIAorI2lmZGVmIENPTkZJR19DT01DRVJUT19GUAorCWNsZWFyX2JpdChJUFNfUEVSTUFORU5UX0JJVCwgJmN0LT5zdGF0dXMpOworCS8qIEF2b2lkIHJhY2Ugd2l0aCB0aW1lciBleHBpcmF0aW9uICovCisJaWYgKGRlbF90aW1lcl9zeW5jKCZjdC0+dGltZW91dCkpIHsKKyNlbHNlCiAJaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKSB7CisjZW5kaWYKIAkJZGVhdGhfYnlfdGltZW91dCgodW5zaWduZWQgbG9uZyljdCk7Ci0JCWRyb3BwZWQgPSAxOwotCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBlYXJseV9kcm9wKTsKKwkJLyogQ2hlY2sgaWYgd2UgaW5kZWVkIGtpbGxlZCB0aGlzIGVudHJ5LiBSZWxpYWJsZSBldmVudAorCQkgICBkZWxpdmVyeSBtYXkgaGF2ZSBpbnNlcnRlZCBpdCBpbnRvIHRoZSBkeWluZyBsaXN0LiAqLworCQlpZiAodGVzdF9iaXQoSVBTX0RZSU5HX0JJVCwgJmN0LT5zdGF0dXMpKSB7CisJCQlkcm9wcGVkID0gMTsKKwkJCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhuZXQsIGVhcmx5X2Ryb3ApOworCQl9CiAJfQogCW5mX2N0X3B1dChjdCk7CiAJcmV0dXJuIGRyb3BwZWQ7CkBAIC0xMDc5LDcgKzExMjEsMTMgQEAKIAkJfQogCX0KIAorI2lmZGVmIENPTkZJR19DT01DRVJUT19GUAorCWNsZWFyX2JpdChJUFNfUEVSTUFORU5UX0JJVCwgJmN0LT5zdGF0dXMpOworCS8qIEF2b2lkIHJhY2Ugd2l0aCB0aW1lciBleHBpcmF0aW9uICovCisJaWYgKGRlbF90aW1lcl9zeW5jKCZjdC0+dGltZW91dCkpIHsKKyNlbHNlCiAJaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKSB7CisjZW5kaWYKIAkJY3QtPnRpbWVvdXQuZnVuY3Rpb24oKHVuc2lnbmVkIGxvbmcpY3QpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9CkBAIC0xMjAwLDcgKzEyNDgsMTQgQEAKIAogCXdoaWxlICgoY3QgPSBnZXRfbmV4dF9jb3Jwc2UobmV0LCBpdGVyLCBkYXRhLCAmYnVja2V0KSkgIT0gTlVMTCkgewogCQkvKiBUaW1lIHRvIHB1c2ggdXAgZGFpc2VzLi4uICovCisKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fRlAKKwkJY2xlYXJfYml0KElQU19QRVJNQU5FTlRfQklULCAmY3QtPnN0YXR1cyk7CisJCS8qIEF2b2lkIHJhY2Ugd2l0aCB0aW1lciBleHBpcmF0aW9uICovCisJCWlmIChkZWxfdGltZXJfc3luYygmY3QtPnRpbWVvdXQpKQorI2Vsc2UKIAkJaWYgKGRlbF90aW1lcigmY3QtPnRpbWVvdXQpKQorI2VuZGlmCiAJCQlkZWF0aF9ieV90aW1lb3V0KCh1bnNpZ25lZCBsb25nKWN0KTsKIAkJLyogLi4uIGVsc2UgdGhlIHRpbWVyIHdpbGwgZ2V0IGhpbSBzb29uLiAqLwogCkBAIC0xMzYyLDYgKzE0MTcsNDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2FsbG9jX2hhc2h0YWJsZSk7CiAKKyNpZmRlZiBDT05GSUdfQ09NQ0VSVE9fRlAKK2ludCBuZl9jb25udHJhY2tfc2V0X2RwaV9hbGxvd19yZXBvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgbmZfY29ubiAqY3QgPSAoc3RydWN0IG5mX2Nvbm4gKilza2ItPm5mY3Q7CisKKwluZl9jb25udHJhY2tfZ2V0KHNrYi0+bmZjdCk7CisKKwlzZXRfYml0KElQU19EUElfQUxMT1dFRF9CSVQsICZjdC0+c3RhdHVzKTsKKworCW5mX2Nvbm50cmFja19ldmVudF9jYWNoZShJUENUX1BST1RPSU5GTywgY3QpOworCisJbmZfY29ubnRyYWNrX3B1dChza2ItPm5mY3QpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobmZfY29ubnRyYWNrX3NldF9kcGlfYWxsb3dfcmVwb3J0KTsKKworaW50IG5mX2Nvbm50cmFja19zZXRfZHBpX2FsbG93X2FuZF9tYXJrKHN0cnVjdCBza19idWZmICpza2IsIGludCBtYXJrKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBuZl9jb25uICpjdCA9IChzdHJ1Y3QgbmZfY29ubiAqKXNrYi0+bmZjdDsKKworCW5mX2Nvbm50cmFja19nZXQoc2tiLT5uZmN0KTsKKworCXNldF9iaXQoSVBTX0RQSV9BTExPV0VEX0JJVCwgJmN0LT5zdGF0dXMpOworCisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLCisJY3QtPm1hcmsgPSBtYXJrOworI2VuZGlmCisKKwluZl9jb25udHJhY2tfZXZlbnRfY2FjaGUoSVBDVF9QUk9UT0lORk8sIGN0KTsKKworCW5mX2Nvbm50cmFja19wdXQoc2tiLT5uZmN0KTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKG5mX2Nvbm50cmFja19zZXRfZHBpX2FsbG93X2FuZF9tYXJrKTsKKyNlbmRpZgorCiBpbnQgbmZfY29ubnRyYWNrX3NldF9oYXNoc2l6ZShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewogCWludCBpLCBidWNrZXQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKaW5kZXggNzgyY2RjZC4uMDY4MzIxMyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwpAQCAtMzAxLDYgKzMwMSw0MSBAQAogI2RlZmluZSBjdG5ldGxpbmtfZHVtcF9zZWNjdHgoYSwgYikgKDApCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0NPTUNFUlRPX0ZQKQorc3RhdGljIGludAorY3RuZXRsaW5rX2R1bXBfY29tY2VydG9fZnAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQoreworCXN0cnVjdCBubGF0dHIgKm5lc3RfY291bnQ7CisKKwluZXN0X2NvdW50ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBDVEFfQ09NQ0VSVE9fRlBfT1JJRyB8IE5MQV9GX05FU1RFRCk7CisJaWYgKCFuZXN0X2NvdW50KQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCU5MQV9QVVRfVTMyKHNrYiwgQ1RBX0NPTUNFUlRPX0ZQX01BUkssIGN0LT5mcF9pbmZvW0lQX0NUX0RJUl9PUklHSU5BTF0ubWFyayk7CisJTkxBX1BVVF9VMzIoc2tiLCBDVEFfQ09NQ0VSVE9fRlBfSUZJTkRFWCwgY3QtPmZwX2luZm9bSVBfQ1RfRElSX09SSUdJTkFMXS5pZmluZGV4KTsKKwlOTEFfUFVUX1UzMihza2IsIENUQV9DT01DRVJUT19GUF9JSUYsIGN0LT5mcF9pbmZvW0lQX0NUX0RJUl9PUklHSU5BTF0uaWlmKTsKKworCW5sYV9uZXN0X2VuZChza2IsIG5lc3RfY291bnQpOworCisJbmVzdF9jb3VudCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgQ1RBX0NPTUNFUlRPX0ZQX1JFUExZIHwgTkxBX0ZfTkVTVEVEKTsKKwlpZiAoIW5lc3RfY291bnQpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJTkxBX1BVVF9VMzIoc2tiLCBDVEFfQ09NQ0VSVE9fRlBfTUFSSywgY3QtPmZwX2luZm9bSVBfQ1RfRElSX1JFUExZXS5tYXJrKTsKKwlOTEFfUFVUX1UzMihza2IsIENUQV9DT01DRVJUT19GUF9JRklOREVYLCBjdC0+ZnBfaW5mb1tJUF9DVF9ESVJfUkVQTFldLmlmaW5kZXgpOworCU5MQV9QVVRfVTMyKHNrYiwgQ1RBX0NPTUNFUlRPX0ZQX0lJRiwgY3QtPmZwX2luZm9bSVBfQ1RfRElSX1JFUExZXS5paWYpOworCisJbmxhX25lc3RfZW5kKHNrYiwgbmVzdF9jb3VudCk7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKyNlbHNlCisjZGVmaW5lIGN0bmV0bGlua19kdW1wX2NvbWNlcnRvX2ZwKGEsIGIpICgwKQorI2VuZGlmCisKICNkZWZpbmUgbWFzdGVyX3R1cGxlKGN0KSAmKGN0LT5tYXN0ZXItPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlKQogCiBzdGF0aWMgaW5saW5lIGludApAQCAtNDM3LDYgKzQ3Miw3IEBACiAJICAgIGN0bmV0bGlua19kdW1wX2hlbHBpbmZvKHNrYiwgY3QpIDwgMCB8fAogCSAgICBjdG5ldGxpbmtfZHVtcF9tYXJrKHNrYiwgY3QpIDwgMCB8fAogCSAgICBjdG5ldGxpbmtfZHVtcF9zZWNjdHgoc2tiLCBjdCkgPCAwIHx8CisJICAgIGN0bmV0bGlua19kdW1wX2NvbWNlcnRvX2ZwKHNrYiwgY3QpIDwgMCB8fAogCSAgICBjdG5ldGxpbmtfZHVtcF9pZChza2IsIGN0KSA8IDAgfHwKIAkgICAgY3RuZXRsaW5rX2R1bXBfdXNlKHNrYiwgY3QpIDwgMCB8fAogCSAgICBjdG5ldGxpbmtfZHVtcF9tYXN0ZXIoc2tiLCBjdCkgPCAwIHx8CkBAIC01MjgsNiArNTY0LDEyIEBACiAJICAgICAgICsgbmxhX3RvdGFsX3NpemUoMCkgLyogQ1RBX0hFTFAgKi8KIAkgICAgICAgKyBubGFfdG90YWxfc2l6ZShORl9DVF9IRUxQRVJfTkFNRV9MRU4pIC8qIENUQV9IRUxQX05BTUUgKi8KIAkgICAgICAgKyBjdG5ldGxpbmtfc2VjY3R4X3NpemUoY3QpCisjaWZkZWYgQ09ORklHX0NPTUNFUlRPX0ZQCisJICAgICAgICsgMiAqIG5sYV90b3RhbF9zaXplKDApIC8qIENUQV9DT01DRVJUT19GUF9PUklHfFJFUEwgKi8KKwkgICAgICAgKyAyICogbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHVpbnQzMl90KSkgLyogQ1RBX0NPTUNFUlRPX0ZQX01BUksgKi8KKwkgICAgICAgKyAyICogbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHVpbnQzMl90KSkgLyogQ1RBX0NPTUNFUlRPX0ZQX0lGSU5ERVggKi8KKwkgICAgICAgKyAyICogbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHVpbnQzMl90KSkgLyogQ1RBX0NPTUNFUlRPX0ZQX0lJRiAqLworI2VuZGlmCiAjaWZkZWYgQ09ORklHX05GX05BVF9ORUVERUQKIAkgICAgICAgKyAyICogbmxhX3RvdGFsX3NpemUoMCkgLyogQ1RBX05BVF9TRVFfQURKX09SSUd8UkVQTCAqLwogCSAgICAgICArIDYgKiBubGFfdG90YWxfc2l6ZShzaXplb2YodV9pbnQzMl90KSkgLyogQ1RBX05BVF9TRVFfT0ZGU0VUICovCkBAIC02MDUsNiArNjQ3LDkgQEAKIAlpZiAobmZfY3Rfem9uZShjdCkpCiAJCU5MQV9QVVRfQkUxNihza2IsIENUQV9aT05FLCBodG9ucyhuZl9jdF96b25lKGN0KSkpOwogCisJaWYgKGN0bmV0bGlua19kdW1wX2NvbWNlcnRvX2ZwKHNrYiwgY3QpIDwgMCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKIAlpZiAoY3RuZXRsaW5rX2R1bXBfaWQoc2tiLCBjdCkgPCAwKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIApAQCAtMTA3OCw3ICsxMTIzLDM2IEBACiAJY3QtPnN0YXR1cyB8PSBzdGF0dXMgJiB+KElQU19OQVRfRE9ORV9NQVNLIHwgSVBTX05BVF9NQVNLKTsKIAlyZXR1cm4gMDsKIH0KKyNpZiBkZWZpbmVkKENPTkZJR19DT01DRVJUT19GUCkKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGRldGVjdHMgY3RuZXRsaW5rIG1lc3NhZ2VzIHRoYXQgcmVxdWlyZQorICogdG8gc2V0IHRoZSBjb25udHJhY2sgc3RhdHVzIHRvIElQU19QRVJNQU5FTlQuCisgKiBJdCB1cGRhdGVzIG9ubHkgdGhpcyBiaXQgcmVnYXJkbGVzcyBvZiBvdGhlciBwb3NzaWJsZQorICogY2hhbmdlcy4KKyAqIFJldHVybiAwIGlmIHN1Y2Nlc2Z1bGwKKyAqLworc3RhdGljIGludAorY3RuZXRsaW5rX2NoYW5nZV9wZXJtYW5lbnQoc3RydWN0IG5mX2Nvbm4gKmN0LCBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgY2RhW10pCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1X2ludDMyX3QgaWQ7CiAKKwlpZiAoY2RhW0NUQV9TVEFUVVNdICYmIGNkYVtDVEFfSURdKSB7CisJCXN0YXR1cyA9IG50b2hsKG5sYV9nZXRfYmUzMihjZGFbQ1RBX1NUQVRVU10pKTsKKwkJaWQgPSBudG9obChubGFfZ2V0X2JlMzIoY2RhW0NUQV9JRF0pKTsKKworCQlpZiAoc3RhdHVzICYgSVBTX1BFUk1BTkVOVCkgeworCQkJaWYgKCh1MzIpKHVuc2lnbmVkIGxvbmcpY3QgPT0gaWQpIHsKKwkJCQljdC0+c3RhdHVzIHw9IElQU19QRVJNQU5FTlQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQllbHNlCisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorI2VuZGlmCiBzdGF0aWMgaW50CiBjdG5ldGxpbmtfY2hhbmdlX25hdChzdHJ1Y3QgbmZfY29ubiAqY3QsIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBjZGFbXSkKIHsKQEAgLTE1NDksNiArMTYyMywxMyBAQAogCWlmICghKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKSkgewogCQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCisjaWYgZGVmaW5lZChDT05GSUdfQ09NQ0VSVE9fRlApCisJCS8qIElmIHRoZSBwZXJtYW5lbnQgc3RhdHVzIGhhcyBiZWVuIHNldCwgdGhpcyBpcyBhIHNwZWNpZmljCisJCSAqIG1lc3NhZ2UuIERvbid0IGJyb2FkY2FzdCB0aGUgZXZlbnQgYW5kIGRvbid0IHVwZGF0ZSB0aGUgY3QgKi8KKwkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9wZXJtYW5lbnQoY3QsIGNkYSk7CisJCWlmICgoZXJyID09IDApIHx8IChlcnIgPT0gLUVOT0VOVCkpCisJCQlnb3RvIG91dF91bmxvY2s7CisjZW5kaWYKIAkJZXJyID0gY3RuZXRsaW5rX2NoYW5nZV9jb25udHJhY2soY3QsIGNkYSk7CiAJCWlmIChlcnIgPT0gMCkgewogCQkJbmZfY29ubnRyYWNrX2dldCgmY3QtPmN0X2dlbmVyYWwpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCmluZGV4IDYyMWUyZGEuLjA3NThiODggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTIyMyw2ICsyMjMsMTIgQEAKIAkJaWYgKHNlcV9wcmludGYocywgIltBU1NVUkVEXSAiKSkKIAkJCWdvdG8gcmVsZWFzZTsKIAorI2lmZGVmIENPTkZJR19DT01DRVJUT19GUAorCWlmICh0ZXN0X2JpdChJUFNfUEVSTUFORU5UX0JJVCwgJmN0LT5zdGF0dXMpKQorCQlpZiAoc2VxX3ByaW50ZihzLCAiW1BFUk1BTkVOVF0gIikpCisJCQlnb3RvIHJlbGVhc2U7CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NQVJLKQogCWlmIChzZXFfcHJpbnRmKHMsICJtYXJrPSV1ICIsIGN0LT5tYXJrKSkKIAkJZ290byByZWxlYXNlOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9vdXRwdXQuYyBiL25ldC94ZnJtL3hmcm1fb3V0cHV0LmMKaW5kZXggNDdiYWNkOC4uYmQxYzYyOCAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9vdXRwdXQuYworKysgYi9uZXQveGZybS94ZnJtX291dHB1dC5jCkBAIC00MywxMSArNDMsMzIgQEAKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7CiAJc3RydWN0IHhmcm1fc3RhdGUgKnggPSBkc3QtPnhmcm07CiAJc3RydWN0IG5ldCAqbmV0ID0geHNfbmV0KHgpOworI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeGZybV92ZWNbWEZSTV9NQVhfREVQVEhdOworCWludCB4ZnJtX25yID0gMDsKKwlpbnQgaTsKKyNlbmRpZgogCiAJaWYgKGVyciA8PSAwKQogCQlnb3RvIHJlc3VtZTsKIAogCWRvIHsKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJCWlmICh4LT5vZmZsb2FkZWQpICB7CisKKwkJCWlmICh4ZnJtX25yID09IFhGUk1fTUFYX0RFUFRIKSB7CisJCQkJZXJyID0gLUVOT0JVRlM7CisJCQkJZ290byBvdXRfZXhpdDsKKwkJCX0KKworCQkJaWYgKCF4LT5jdXJsZnQudXNlX3RpbWUpIAorCQkJCXgtPmN1cmxmdC51c2VfdGltZSA9IGdldF9zZWNvbmRzKCk7CisKKwkJCXhmcm1fdmVjW3hmcm1fbnIrK10gPSB4OworCQkJc2tiLT5pcHNlY19vZmZsb2FkID0gMTsKKwkJCWdvdG8gbmV4dF9kc3Q7CisJCX0KKyNlbmRpZgogCQllcnIgPSB4ZnJtX3N0YXRlX2NoZWNrX3NwYWNlKHgsIHNrYik7CiAJCWlmIChlcnIpIHsKIAkJCVhGUk1fSU5DX1NUQVRTKG5ldCwgTElOVVhfTUlCX1hGUk1PVVRFUlJPUik7CkBAIC05MCw2ICsxMTEsOSBAQAogCQkJZ290byBlcnJvcl9ub2xvY2s7CiAJCX0KIAorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKK25leHRfZHN0OgorI2VuZGlmCiAJCWRzdCA9IHNrYl9kc3RfcG9wKHNrYik7CiAJCWlmICghZHN0KSB7CiAJCQlYRlJNX0lOQ19TVEFUUyhuZXQsIExJTlVYX01JQl9YRlJNT1VURVJST1IpOwpAQCAtMTAxLDYgKzEyNSwyNiBAQAogCX0gd2hpbGUgKHggJiYgISh4LT5vdXRlcl9tb2RlLT5mbGFncyAmIFhGUk1fTU9ERV9GTEFHX1RVTk5FTCkpOwogCiAJZXJyID0gMDsKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJaWYgKCFza2ItPnNwIHx8IGF0b21pY19yZWFkKCZza2ItPnNwLT5yZWZjbnQpICE9IDEpIHsKKwkJc3RydWN0IHNlY19wYXRoICpzcDsKKworCQlzcCA9IHNlY3BhdGhfZHVwKHNrYi0+c3ApOworCQlpZiAoIXNwKQorCQkJZ290byBlcnJvcl9ub2xvY2s7CisJCWlmIChza2ItPnNwKQorCQkJc2VjcGF0aF9wdXQoc2tiLT5zcCk7CisJCXNrYi0+c3AgPSBzcDsKKwl9CisJaWYgKHhmcm1fbnIgKyBza2ItPnNwLT5sZW4gPiBYRlJNX01BWF9ERVBUSCkKKwkJZ290byBlcnJvcl9ub2xvY2s7CisKKwltZW1jcHkoc2tiLT5zcC0+eHZlYyArIHNrYi0+c3AtPmxlbiwgeGZybV92ZWMsCisJICAgICAgIHhmcm1fbnIgKiBzaXplb2YoeGZybV92ZWNbMF0pKTsKKwlza2ItPnNwLT5sZW4gKz0geGZybV9ucjsKKwlmb3IgKGkgPSAwOyBpIDwgc2tiLT5zcC0+bGVuOyBpKyspCisJCXhmcm1fc3RhdGVfaG9sZChza2ItPnNwLT54dmVjW2ldKTsKKyNlbmRpZgogCiBvdXRfZXhpdDoKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggMDE3NDAzNC4uMTJiMWNmNSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC00Niw3ICs0NiwxNSBAQAogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnhmcm1fZHN0X2NhY2hlIF9fcmVhZF9tb3N0bHk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCitleHRlcm4gaW50IGlwc2VjX25sa2V5X2Zsb3codTE2IHhmcm1fbnIsIHUxNiAqeGZybV9oYW5kbGUsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGZsb3dpICpmbCwgdTE2IGZhbWlseSwgdTE2IGRpcik7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpICYmICFkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQogc3RhdGljIHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKnhmcm1fcG9saWN5X2dldF9hZmluZm8odW5zaWduZWQgc2hvcnQgZmFtaWx5KTsKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCB4ZnJtX3BvbGljeV9wdXRfYWZpbmZvKHN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbyk7CiBzdGF0aWMgdm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogc3RhdGljIGludCBzdGFsZV9idW5kbGUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKQEAgLTk0LDcgKzEwMiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkc3RfZW50cnkgKl9feGZybV9kc3RfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgaW50IHRvcywKKyNpZiAhZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSAmJiAhZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkgCitzdGF0aWMgaW5saW5lIAorI2VuZGlmCitzdHJ1Y3QgZHN0X2VudHJ5ICpfX3hmcm1fZHN0X2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIGludCB0b3MsCiAJCQkJCQkgIGNvbnN0IHhmcm1fYWRkcmVzc190ICpzYWRkciwKIAkJCQkJCSAgY29uc3QgeGZybV9hZGRyZXNzX3QgKmRhZGRyLAogCQkJCQkJICBpbnQgZmFtaWx5KQpAQCAtMTEyLDggKzEyMywxNCBAQAogCiAJcmV0dXJuIGRzdDsKIH0KKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCitFWFBPUlRfU1lNQk9MKF9feGZybV9kc3RfbG9va3VwKTsKKyNlbmRpZgogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkc3RfZW50cnkgKnhmcm1fZHN0X2xvb2t1cChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgaW50IHRvcywKKyNpZiAhZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSAmJiAhZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkgCitzdGF0aWMgaW5saW5lIAorI2VuZGlmCitzdHJ1Y3QgZHN0X2VudHJ5ICp4ZnJtX2RzdF9sb29rdXAoc3RydWN0IHhmcm1fc3RhdGUgKngsIGludCB0b3MsCiAJCQkJCQl4ZnJtX2FkZHJlc3NfdCAqcHJldl9zYWRkciwKIAkJCQkJCXhmcm1fYWRkcmVzc190ICpwcmV2X2RhZGRyLAogCQkJCQkJaW50IGZhbWlseSkKQEAgLTE0Myw2ICsxNjAsOSBAQAogCiAJcmV0dXJuIGRzdDsKIH0KKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCitFWFBPUlRfU1lNQk9MKHhmcm1fZHN0X2xvb2t1cCk7CisjZW5kaWYKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1ha2VfamlmZmllcyhsb25nIHNlY3MpCiB7CkBAIC0xMjY0LDcgKzEyODQsMTAgQEAKICAqIHN0aWxsIHZhbGlkLgogICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHhmcm1fZ2V0X3Rvcyhjb25zdCBzdHJ1Y3QgZmxvd2kgKmZsLCBpbnQgZmFtaWx5KQorI2lmICFkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpICYmICFkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorc3RhdGljIGlubGluZSAKKyNlbmRpZgoraW50IHhmcm1fZ2V0X3Rvcyhjb25zdCBzdHJ1Y3QgZmxvd2kgKmZsLCBpbnQgZmFtaWx5KQogewogCXN0cnVjdCB4ZnJtX3BvbGljeV9hZmluZm8gKmFmaW5mbyA9IHhmcm1fcG9saWN5X2dldF9hZmluZm8oZmFtaWx5KTsKIAlpbnQgdG9zOwpAQCAtMTI3OCw2ICsxMzAxLDkgQEAKIAogCXJldHVybiB0b3M7CiB9CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorRVhQT1JUX1NZTUJPTCh4ZnJtX2dldF90b3MpOworI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgZmxvd19jYWNoZV9vYmplY3QgKnhmcm1fYnVuZGxlX2Zsb19nZXQoc3RydWN0IGZsb3dfY2FjaGVfb2JqZWN0ICpmbG8pCiB7CkBAIC0xNDYxLDcgKzE0ODcsMTIgQEAKIAkJeGRzdC0+cm91dGUgPSBkc3Q7CiAJCWRzdF9jb3B5X21ldHJpY3MoZHN0MSwgZHN0KTsKIAorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwkJaWYgKCh4ZnJtW2ldLT5wcm9wcy5tb2RlICE9IFhGUk1fTU9ERV9UUkFOU1BPUlQpICYmCisJCQkoIXhmcm1baV0tPm9mZmxvYWRlZCkpIHsKKyNlbHNlCiAJCWlmICh4ZnJtW2ldLT5wcm9wcy5tb2RlICE9IFhGUk1fTU9ERV9UUkFOU1BPUlQpIHsKKyNlbmRpZgogCQkJZmFtaWx5ID0geGZybVtpXS0+cHJvcHMuZmFtaWx5OwogCQkJZHN0ID0geGZybV9kc3RfbG9va3VwKHhmcm1baV0sIHRvcywgJnNhZGRyLCAmZGFkZHIsCiAJCQkJCSAgICAgIGZhbWlseSk7CkBAIC0xNzg2LDYgKzE4MTcsOSBAQAogCXUxNiBmYW1pbHkgPSBkc3Rfb3JpZy0+b3BzLT5mYW1pbHk7CiAJdTggZGlyID0gcG9saWN5X3RvX2Zsb3dfZGlyKFhGUk1fUE9MSUNZX09VVCk7CiAJaW50IGksIGVyciwgbnVtX3BvbHMsIG51bV94ZnJtcyA9IDAsIGRyb3BfcG9scyA9IDA7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCXU4IG5ld19mbG93ID0gMDsKKyNlbmRpZgogCiByZXN0YXJ0OgogCWRzdCA9IE5VTEw7CkBAIC0xODM2LDggKzE4NzAsMTMgQEAKIAkJICAgICFuZXQtPnhmcm0ucG9saWN5X2NvdW50W1hGUk1fUE9MSUNZX09VVF0pCiAJCQlnb3RvIG5vcG9sOwogCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCQlmbG8gPSBmbG93X2NhY2hlX2xvb2t1cChuZXQsIGZsLCBmYW1pbHksIGRpciwgJm5ld19mbG93LAorCQkJCQl4ZnJtX2J1bmRsZV9sb29rdXAsIGRzdF9vcmlnKTsKKyNlbHNlCiAJCWZsbyA9IGZsb3dfY2FjaGVfbG9va3VwKG5ldCwgZmwsIGZhbWlseSwgZGlyLAogCQkJCQl4ZnJtX2J1bmRsZV9sb29rdXAsIGRzdF9vcmlnKTsKKyNlbmRpZgogCQlpZiAoZmxvID09IE5VTEwpCiAJCQlnb3RvIG5vcG9sOwogCQlpZiAoSVNfRVJSKGZsbykpIHsKQEAgLTE5MTcsNiArMTk1NiwzMCBAQAogCQlkc3RfcmVsZWFzZShkc3QpOwogCQlkc3QgPSBkc3Rfb3JpZzsKIAl9CisKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJaWYgKG5ld19mbG93KSB7CisJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDEgPSBkc3Q7CisJCXN0cnVjdCB4ZnJtX3N0YXRlICp4OyAKKwkJdTE2CXhmcm1faGFuZGxlW1hGUk1fUE9MSUNZX1RZUEVfTUFYXTsKKworCQludW1feGZybXMgPSAwOworCQltZW1zZXQoeGZybV9oYW5kbGUsIDAsIFhGUk1fUE9MSUNZX1RZUEVfTUFYKnNpemVvZih1MTYpKTsKKwkJd2hpbGUoKHggPSBkc3QxLT54ZnJtKSAhPSBOVUxMKSB7CisJCQlpZiAoIXgtPm9mZmxvYWRlZCkKKwkJCQlnb3RvIG9rOworCQkJeGZybV9oYW5kbGVbbnVtX3hmcm1zKytdID0geC0+aGFuZGxlOworCQkJZHN0MSA9IGRzdDEtPmNoaWxkOworCQkJaWYgKGRzdDEgPT0gTlVMTCkgeworCQkJCWVyciA9IC1FSE9TVFVOUkVBQ0g7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCQkvLyBzZW50IGZsb3cgbm90aWZpY2F0aW9uIHRvIGNtbSB3aXRoIHNhX2hhbmRsZQorCQlpcHNlY19ubGtleV9mbG93KG51bV94ZnJtcywgeGZybV9oYW5kbGUsIGZsLCBmYW1pbHksICh1bnNpZ25lZCBzaG9ydClkaXIpOworCX0KKyNlbmRpZgorCiBvazoKIAl4ZnJtX3BvbHNfcHV0KHBvbHMsIGRyb3BfcG9scyk7CiAJaWYgKGRzdCAmJiBkc3QtPnhmcm0gJiYKQEAgLTIwNDIsOSArMjEwNSwxNCBAQAogCWludCB4ZnJtX25yOwogCWludCBwaTsKIAlpbnQgcmV2ZXJzZTsKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJdTggbmV3X2Zsb3cgPSAwOworI2VuZGlmCiAJc3RydWN0IGZsb3dpIGZsOwogCXU4IGZsX2RpcjsKIAlpbnQgeGVycl9pZHggPSAtMTsKKwkKKwkvL3ByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlyZXZlcnNlID0gZGlyICYgflhGUk1fUE9MSUNZX01BU0s7CiAJZGlyICY9IFhGUk1fUE9MSUNZX01BU0s7CkBAIC0yMDgxLDkgKzIxNDksMTMgQEAKIAogCWlmICghcG9sKSB7CiAJCXN0cnVjdCBmbG93X2NhY2hlX29iamVjdCAqZmxvOwotCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCQlmbG8gPSBmbG93X2NhY2hlX2xvb2t1cChuZXQsICZmbCwgZmFtaWx5LCBmbF9kaXIsICZuZXdfZmxvdywKKwkJCQkJeGZybV9wb2xpY3lfbG9va3VwLCBOVUxMKTsKKyNlbHNlCiAJCWZsbyA9IGZsb3dfY2FjaGVfbG9va3VwKG5ldCwgJmZsLCBmYW1pbHksIGZsX2RpciwKIAkJCQkJeGZybV9wb2xpY3lfbG9va3VwLCBOVUxMKTsKKyNlbmRpZgogCQlpZiAoSVNfRVJSX09SX05VTEwoZmxvKSkKIAkJCXBvbCA9IEVSUl9DQVNUKGZsbyk7CiAJCWVsc2UKQEAgLTIxNzcsNiArMjI0OSwyOCBAQAogCQkJZ290byByZWplY3Q7CiAJCX0KIAorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwkJaWYgKG5ld19mbG93KSB7CisJCQlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKwkJCXUxNgl4ZnJtX2hhbmRsZVtYRlJNX1BPTElDWV9UWVBFX01BWF07CisKKwkJCXhmcm1fbnIgPSAwOworCQkJbWVtc2V0KHhmcm1faGFuZGxlLCAwLCBYRlJNX1BPTElDWV9UWVBFX01BWCpzaXplb2YodTE2KSk7CisJCQlmb3IgKGk9c2tiLT5zcC0+bGVuLTE7IGk+PTA7IGktLSkgCisJCQl7CisJCQkJeCA9IHNrYi0+c3AtPnh2ZWNbaV07CisJCQkJCisJCQkJaWYgKCF4LT5vZmZsb2FkZWQpCisJCQkJCWdvdG8gc3RkX3BhdGg7CisJCQkJCisJCQkJeGZybV9oYW5kbGVbeGZybV9ucisrXSA9IHgtPmhhbmRsZTsKKwkJCX0KKwkJCS8vIHNlbnQgZmxvdyBub3RpZmljYXRpb24gdG8gY21tIHdpdGggc2FfaGFuZGxlCisJCQlpcHNlY19ubGtleV9mbG93KHhmcm1fbnIsIHhmcm1faGFuZGxlLCAoY29uc3Qgc3RydWN0IGZsb3dpICopJmZsLCBmYW1pbHksIGZsX2Rpcik7CisJCX0KKworc3RkX3BhdGg6CisjZW5kaWYKIAkJeGZybV9wb2xzX3B1dChwb2xzLCBucG9scyk7CiAJCXJldHVybiAxOwogCX0KQEAgLTI1MDYsNyArMjYwMCwxMCBAQAogCXJlYWRfdW5sb2NrX2JoKCZ4ZnJtX3BvbGljeV9hZmluZm9fbG9jayk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgeGZybV9wb2xpY3lfYWZpbmZvICp4ZnJtX3BvbGljeV9nZXRfYWZpbmZvKHVuc2lnbmVkIHNob3J0IGZhbWlseSkKKyNpZiAhZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSAmJiAhZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKK3N0YXRpYyAKKyNlbmRpZgorc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqeGZybV9wb2xpY3lfZ2V0X2FmaW5mbyh1bnNpZ25lZCBzaG9ydCBmYW1pbHkpCiB7CiAJc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqYWZpbmZvOwogCWlmICh1bmxpa2VseShmYW1pbHkgPj0gTlBST1RPKSkKQEAgLTI1MTcsNiArMjYxNCw5IEBACiAJCXJlYWRfdW5sb2NrKCZ4ZnJtX3BvbGljeV9hZmluZm9fbG9jayk7CiAJcmV0dXJuIGFmaW5mbzsKIH0KKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCitFWFBPUlRfU1lNQk9MKHhmcm1fcG9saWN5X2dldF9hZmluZm8pOworI2VuZGlmCiAKIHN0YXRpYyB2b2lkIHhmcm1fcG9saWN5X3B1dF9hZmluZm8oc3RydWN0IHhmcm1fcG9saWN5X2FmaW5mbyAqYWZpbmZvKQogewpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCmluZGV4IDk0MTRiOWMuLjUyMDAzNWEgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYworKysgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKQEAgLTM5LDYgKzM5LDEwIEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgeGZybV9zdGF0ZV9oYXNobWF4IF9fcmVhZF9tb3N0bHkgPSAxICogMTAyNCAqIDEwMjQ7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgeGZybV9zdGF0ZV9oYW5kbGU7CisjZW5kaWYKKwogc3RhdGljIHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqeGZybV9zdGF0ZV9nZXRfYWZpbmZvKHVuc2lnbmVkIGludCBmYW1pbHkpOwogc3RhdGljIHZvaWQgeGZybV9zdGF0ZV9wdXRfYWZpbmZvKHN0cnVjdCB4ZnJtX3N0YXRlX2FmaW5mbyAqYWZpbmZvKTsKIApAQCAtNjYsMTEgKzcwLDIwIEBACiAJcmV0dXJuIF9feGZybV9zcGlfaGFzaChkYWRkciwgc3BpLCBwcm90bywgZmFtaWx5LCBuZXQtPnhmcm0uc3RhdGVfaG1hc2spOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorc3RhdGljIHZvaWQgeGZybV9oYXNoX3RyYW5zZmVyKHN0cnVjdCBobGlzdF9oZWFkICpsaXN0LAorCQkJICAgICAgIHN0cnVjdCBobGlzdF9oZWFkICpuZHN0dGFibGUsCisJCQkgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKm5zcmN0YWJsZSwKKwkJCSAgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqbnNwaXRhYmxlLAorCQkJICAgICAgIHN0cnVjdCBobGlzdF9oZWFkICpuaHRhYmxlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBuaGFzaG1hc2spCisjZWxzZQogc3RhdGljIHZvaWQgeGZybV9oYXNoX3RyYW5zZmVyKHN0cnVjdCBobGlzdF9oZWFkICpsaXN0LAogCQkJICAgICAgIHN0cnVjdCBobGlzdF9oZWFkICpuZHN0dGFibGUsCiAJCQkgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKm5zcmN0YWJsZSwKIAkJCSAgICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqbnNwaXRhYmxlLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBuaGFzaG1hc2spCisjZW5kaWYKIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqZW50cnksICp0bXA7CiAJc3RydWN0IHhmcm1fc3RhdGUgKng7CkBAIC05NCw2ICsxMDcsMTEgQEAKIAkJCQkJICAgIG5oYXNobWFzayk7CiAJCQlobGlzdF9hZGRfaGVhZCgmeC0+YnlzcGksIG5zcGl0YWJsZStoKTsKIAkJfQorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwkJaWYgKHgtPmhhbmRsZSkgeworCQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5aCwgbmh0YWJsZSsoeC0+aGFuZGxlICYgbmhhc2htYXNrKSk7CisJCX0KKyNlbmRpZgogCX0KIH0KIApAQCAtMTA4LDYgKzEyNiw5IEBACiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuZXQsIHhmcm0uc3RhdGVfaGFzaF93b3JrKTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqbmRzdCwgKm5zcmMsICpuc3BpLCAqb2RzdCwgKm9zcmMsICpvc3BpOworI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqbmgsICpvaDsKKyNlbmRpZgogCXVuc2lnbmVkIGxvbmcgbnNpemUsIG9zaXplOwogCXVuc2lnbmVkIGludCBuaGFzaG1hc2ssIG9oYXNobWFzazsKIAlpbnQgaTsKQEAgLTEyOSwyMiArMTUwLDQxIEBACiAJCXhmcm1faGFzaF9mcmVlKG5zcmMsIG5zaXplKTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwluaCA9IHhmcm1faGFzaF9hbGxvYyhuc2l6ZSk7CisJaWYgKCFuaCkgeworCQl4ZnJtX2hhc2hfZnJlZShuZHN0LCBuc2l6ZSk7CisJCXhmcm1faGFzaF9mcmVlKG5zcmMsIG5zaXplKTsKKwkJeGZybV9oYXNoX2ZyZWUobnNwaSwgbnNpemUpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorI2VuZGlmCiAJc3Bpbl9sb2NrX2JoKCZ4ZnJtX3N0YXRlX2xvY2spOwogCiAJbmhhc2htYXNrID0gKG5zaXplIC8gc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSkgLSAxVTsKIAlmb3IgKGkgPSBuZXQtPnhmcm0uc3RhdGVfaG1hc2s7IGkgPj0gMDsgaS0tKQotCQl4ZnJtX2hhc2hfdHJhbnNmZXIobmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2ksIG5kc3QsIG5zcmMsIG5zcGksCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQkJCisJCXhmcm1faGFzaF90cmFuc2ZlcihuZXQtPnhmcm0uc3RhdGVfYnlkc3QraSwgbmRzdCwgbnNyYywgbnNwaSwgbmgsCiAJCQkJICAgbmhhc2htYXNrKTsKKyNlbHNlCisJCXhmcm1faGFzaF90cmFuc2ZlcihuZXQtPnhmcm0uc3RhdGVfYnlkc3QraSwgbmRzdCwgbnNyYywgbnNwaSwKKwkJCQkgICBuaGFzaG1hc2spOwkKKyNlbmRpZgogCiAJb2RzdCA9IG5ldC0+eGZybS5zdGF0ZV9ieWRzdDsKIAlvc3JjID0gbmV0LT54ZnJtLnN0YXRlX2J5c3JjOwogCW9zcGkgPSBuZXQtPnhmcm0uc3RhdGVfYnlzcGk7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCW9oICAgPSBuZXQtPnhmcm0uc3RhdGVfYnloOworI2VuZGlmCiAJb2hhc2htYXNrID0gbmV0LT54ZnJtLnN0YXRlX2htYXNrOwogCiAJbmV0LT54ZnJtLnN0YXRlX2J5ZHN0ID0gbmRzdDsKIAluZXQtPnhmcm0uc3RhdGVfYnlzcmMgPSBuc3JjOwogCW5ldC0+eGZybS5zdGF0ZV9ieXNwaSA9IG5zcGk7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCW5ldC0+eGZybS5zdGF0ZV9ieWggICA9IG5oOworI2VuZGlmCiAJbmV0LT54ZnJtLnN0YXRlX2htYXNrID0gbmhhc2htYXNrOwogCiAJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7CkBAIC0xNTMsNiArMTkzLDkgQEAKIAl4ZnJtX2hhc2hfZnJlZShvZHN0LCBvc2l6ZSk7CiAJeGZybV9oYXNoX2ZyZWUob3NyYywgb3NpemUpOwogCXhmcm1faGFzaF9mcmVlKG9zcGksIG9zaXplKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJeGZybV9oYXNoX2ZyZWUob2gsICAgb3NpemUpOworI2VuZGlmCiAKIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZoYXNoX3Jlc2l6ZV9tdXRleCk7CkBAIC00OTQsNiArNTM3LDkgQEAKIAkJSU5JVF9ITElTVF9OT0RFKCZ4LT5ieWRzdCk7CiAJCUlOSVRfSExJU1RfTk9ERSgmeC0+YnlzcmMpOwogCQlJTklUX0hMSVNUX05PREUoJngtPmJ5c3BpKTsKKyNpZiBkZWZpbmVkKENPTkZJR19JTkVUX0lQU0VDX09GRkxPQUQpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0lQU0VDX09GRkxPQUQpCisJCUlOSVRfSExJU1RfTk9ERSgmeC0+YnloKTsKKyNlbmRpZgogCQl0YXNrbGV0X2hydGltZXJfaW5pdCgmeC0+bXRpbWVyLCB4ZnJtX3RpbWVyX2hhbmRsZXIsIENMT0NLX1JFQUxUSU1FLCBIUlRJTUVSX01PREVfQUJTKTsKIAkJc2V0dXBfdGltZXIoJngtPnJ0aW1lciwgeGZybV9yZXBsYXlfdGltZXJfaGFuZGxlciwKIAkJCQkodW5zaWduZWQgbG9uZyl4KTsKQEAgLTUwNCw2ICs1NTAsMTIgQEAKIAkJeC0+bGZ0LmhhcmRfcGFja2V0X2xpbWl0ID0gWEZSTV9JTkY7CiAJCXgtPnJlcGxheV9tYXhhZ2UgPSAwOwogCQl4LT5yZXBsYXlfbWF4ZGlmZiA9IDA7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCQl4LT5oYW5kbGUgPSB4ZnJtX3N0YXRlX2hhbmRsZSsrOworCQlpZiAoeC0+aGFuZGxlID09IDApCisJCQl4LT5oYW5kbGUgPSB4ZnJtX3N0YXRlX2hhbmRsZSsrOworCQlobGlzdF9hZGRfaGVhZCgmeC0+YnloLCBuZXQtPnhmcm0uc3RhdGVfYnloKyh4LT5oYW5kbGUgJiBuZXQtPnhmcm0uc3RhdGVfaG1hc2spKTsKKyNlbmRpZgogCQl4LT5pbm5lcl9tb2RlID0gTlVMTDsKIAkJeC0+aW5uZXJfbW9kZV9pYWYgPSBOVUxMOwogCQlzcGluX2xvY2tfaW5pdCgmeC0+bG9jayk7CkBAIC01MzgsNiArNTkwLDEwIEBACiAJCWhsaXN0X2RlbCgmeC0+YnlzcmMpOwogCQlpZiAoeC0+aWQuc3BpKQogCQkJaGxpc3RfZGVsKCZ4LT5ieXNwaSk7CisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorCQlpZiAoeC0+aGFuZGxlKQorCQkJaGxpc3RfZGVsKCZ4LT5ieWgpOworI2VuZGlmCiAJCW5ldC0+eGZybS5zdGF0ZV9udW0tLTsKIAkJc3Bpbl91bmxvY2soJnhmcm1fc3RhdGVfbG9jayk7CiAKQEAgLTE0MDgsNiArMTQ2NCwzNyBAQAogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3N0YXRlX2xvb2t1cF9ieWFkZHIpOwogCisjaWYgZGVmaW5lZChDT05GSUdfSU5FVF9JUFNFQ19PRkZMT0FEKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUNl9JUFNFQ19PRkZMT0FEKQorc3RydWN0IHhmcm1fc3RhdGUgKl9feGZybV9zdGF0ZV9sb29rdXBfYnloYW5kbGUoc3RydWN0IG5ldCAqbmV0LCB1MTYgaGFuZGxlKQoreworCXVuc2lnbmVkIGludCBoID0gKGhhbmRsZSAmIG5ldC0+eGZybS5zdGF0ZV9obWFzayk7CisJc3RydWN0IHhmcm1fc3RhdGUgKng7CisJc3RydWN0IGhsaXN0X25vZGUgKmVudHJ5OworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoeCwgZW50cnksIG5ldC0+eGZybS5zdGF0ZV9ieWgraCwgYnloKSB7CisJCWlmICh4LT5oYW5kbGUgIT0gaGFuZGxlKQorCQkJY29udGludWU7CisJCisJCXhmcm1fc3RhdGVfaG9sZCh4KTsKKwkJcmV0dXJuIHg7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCB4ZnJtX3N0YXRlICoKK3hmcm1fc3RhdGVfbG9va3VwX2J5aGFuZGxlKHN0cnVjdCBuZXQgKm5ldCwgdTE2IGhhbmRsZSkKK3sKKwlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKKworCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9sb2NrKTsKKwl4ID0gX194ZnJtX3N0YXRlX2xvb2t1cF9ieWhhbmRsZShuZXQsIGhhbmRsZSk7CisJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfbG9jayk7CisJcmV0dXJuIHg7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm1fc3RhdGVfbG9va3VwX2J5aGFuZGxlKTsKKyNlbmRpZgorCiBzdHJ1Y3QgeGZybV9zdGF0ZSAqCiB4ZnJtX2ZpbmRfYWNxKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHhmcm1fbWFyayAqbWFyaywgdTggbW9kZSwgdTMyIHJlcWlkLCB1OCBwcm90bywKIAkgICAgICBjb25zdCB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsIGNvbnN0IHhmcm1fYWRkcmVzc190ICpzYWRkciwKQEAgLTIwMjYsNiArMjExMywxMiBAQAogCW5ldC0+eGZybS5zdGF0ZV9ieXNwaSA9IHhmcm1faGFzaF9hbGxvYyhzeik7CiAJaWYgKCFuZXQtPnhmcm0uc3RhdGVfYnlzcGkpCiAJCWdvdG8gb3V0X2J5c3BpOworI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKKwluZXQtPnhmcm0uc3RhdGVfYnloID0geGZybV9oYXNoX2FsbG9jKHN6KTsKKwlpZiAoIW5ldC0+eGZybS5zdGF0ZV9ieWgpCisJCWdvdG8gb3V0X2J5aDsKKwlnZXRfcmFuZG9tX2J5dGVzKCZ4ZnJtX3N0YXRlX2hhbmRsZSwgc2l6ZW9mKHhmcm1fc3RhdGVfaGFuZGxlKSk7CisjZW5kaWYKIAluZXQtPnhmcm0uc3RhdGVfaG1hc2sgPSAoKHN6IC8gc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSkgLSAxKTsKIAogCW5ldC0+eGZybS5zdGF0ZV9udW0gPSAwOwpAQCAtMjAzNSw2ICsyMTI4LDEwIEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmbmV0LT54ZnJtLmttX3dhaXRxKTsKIAlyZXR1cm4gMDsKIAorI2lmIGRlZmluZWQoQ09ORklHX0lORVRfSVBTRUNfT0ZGTE9BRCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfSVBTRUNfT0ZGTE9BRCkKK291dF9ieWg6CisJeGZybV9oYXNoX2ZyZWUobmV0LT54ZnJtLnN0YXRlX2J5c3BpLCBzeik7CisjZW5kaWYKIG91dF9ieXNwaToKIAl4ZnJtX2hhc2hfZnJlZShuZXQtPnhmcm0uc3RhdGVfYnlzcmMsIHN6KTsKIG91dF9ieXNyYzoK